| module InstrDecoder ( |
| clk, |
| rst, |
| en, |
| IN_invalidate, |
| IN_instrs, |
| IN_indirBranchTarget, |
| IN_enCustom, |
| OUT_decBranch, |
| OUT_decBranchDst, |
| OUT_decBranchFetchID, |
| OUT_uop |
| ); |
| parameter NUM_UOPS = 4; |
| parameter DO_FUSE = 0; |
| parameter FUSE_LUI = 0; |
| parameter FUSE_STORE_DATA = 0; |
| input wire clk; |
| input wire rst; |
| input wire en; |
| input wire IN_invalidate; |
| input wire [(NUM_UOPS * 70) - 1:0] IN_instrs; |
| input wire [30:0] IN_indirBranchTarget; |
| input wire IN_enCustom; |
| output reg OUT_decBranch; |
| output reg [30:0] OUT_decBranchDst; |
| output reg [4:0] OUT_decBranchFetchID; |
| output reg [(NUM_UOPS * 68) - 1:0] OUT_uop; |
| reg RS_inValid; |
| reg [30:0] RS_inData; |
| reg RS_outValid; |
| reg RS_inPop; |
| reg [30:0] RS_outData; |
| wire [1:1] sv2v_tmp_returnStack_OUT_valid; |
| always @(*) RS_outValid = sv2v_tmp_returnStack_OUT_valid; |
| wire [31:1] sv2v_tmp_returnStack_OUT_data; |
| always @(*) RS_outData = sv2v_tmp_returnStack_OUT_data; |
| ReturnStack returnStack( |
| .clk(clk), |
| .rst(rst), |
| .IN_valid(RS_inValid), |
| .IN_data(RS_inData), |
| .OUT_valid(sv2v_tmp_returnStack_OUT_valid), |
| .IN_pop(RS_inPop), |
| .OUT_data(sv2v_tmp_returnStack_OUT_data) |
| ); |
| integer i; |
| reg [67:0] uop; |
| reg invalidEnc; |
| reg [31:0] instr; |
| reg [15:0] i16; |
| reg [31:0] i32; |
| reg [67:0] uopsComb [NUM_UOPS - 1:0]; |
| reg [3:0] validMask; |
| always @(*) begin |
| RS_inValid = 0; |
| RS_inData = 31'bxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx; |
| RS_inPop = 0; |
| OUT_decBranch = 0; |
| OUT_decBranchDst = 31'bxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx; |
| validMask = 4'b1111; |
| OUT_decBranchFetchID = 0; |
| for (i = 0; i < NUM_UOPS; i = i + 1) |
| begin |
| instr = IN_instrs[(i * 70) + 69-:32]; |
| i32 = IN_instrs[(i * 70) + 69-:32]; |
| i16 = IN_instrs[(i * 70) + 53-:16]; |
| uop = 0; |
| invalidEnc = 1; |
| uop[0] = (IN_instrs[i * 70] && en) && !OUT_decBranch; |
| uop[9-:5] = IN_instrs[(i * 70) + 6-:5]; |
| uop[4-:3] = IN_instrs[(i * 70) + 9-:3] + (instr[1:0] == 2'b11 ? 1 : 0); |
| case (instr[6-:7]) |
| 7'b0110111, 7'b0010111: uop[67-:32] = {instr[31:12], 12'b000000000000}; |
| 7'b1101111: uop[67-:32] = $signed({{12 {instr[31]}}, instr[19:12], instr[20], instr[30:21], 1'b0}); |
| 7'b1110011, 7'b1100111, 7'b0000011, 7'b0010011: uop[67-:32] = $signed({{20 {instr[31]}}, instr[31:20]}); |
| 7'b1100011: uop[67-:32] = $signed({{20 {instr[31]}}, instr[7], instr[30:25], instr[11:8], 1'b0}); |
| 7'b0100011: uop[67-:32] = $signed({{20 {instr[31]}}, instr[31:25], instr[11:7]}); |
| default: uop[67-:32] = 0; |
| endcase |
| if ((IN_instrs[i * 70] && en) && !OUT_decBranch) |
| if (instr[1:0] == 2'b11) |
| case (instr[6-:7]) |
| 7'b1110011: |
| if ((uop[67-:32] == 0) || (uop[67-:32] == 1)) begin |
| case (uop[67-:32]) |
| 0: uop[38:36] = 3'd5; |
| 1: uop[38:36] = 3'd4; |
| endcase |
| uop[13-:4] = 4'd0; |
| uop[35-:5] = 0; |
| uop[30-:5] = 0; |
| uop[24-:5] = 0; |
| uop[19-:6] = 6'd20; |
| uop[25] = 1; |
| invalidEnc = 0; |
| end |
| 7'b0110111: begin |
| uop[13-:4] = 4'd0; |
| uop[35-:5] = 0; |
| uop[30-:5] = 0; |
| uop[25] = 1; |
| uop[24-:5] = instr[11-:5]; |
| uop[19-:6] = 6'd16; |
| invalidEnc = 0; |
| end |
| 7'b0010111: begin |
| uop[13-:4] = 4'd0; |
| uop[35-:5] = 0; |
| uop[30-:5] = 0; |
| uop[24-:5] = instr[11-:5]; |
| uop[19-:6] = 6'd17; |
| invalidEnc = 0; |
| end |
| 7'b1101111: begin |
| uop[13-:4] = 4'd0; |
| uop[35-:5] = 0; |
| uop[30-:5] = 0; |
| uop[25] = 1; |
| uop[24-:5] = instr[11-:5]; |
| uop[19-:6] = 6'd18; |
| invalidEnc = 0; |
| if (uop[24-:5] == 1) begin |
| RS_inValid = 1; |
| RS_inData = IN_instrs[(i * 70) + 37-:31] + 2; |
| end |
| if (!IN_instrs[(i * 70) + 1]) begin |
| OUT_decBranchDst = IN_instrs[(i * 70) + 37-:31] + uop[67:37]; |
| OUT_decBranch = 1; |
| OUT_decBranchFetchID = IN_instrs[(i * 70) + 6-:5]; |
| end |
| else if ((uop[24-:5] == 0) && IN_instrs[(i * 70) + 1]) |
| uop[0] = 0; |
| end |
| 7'b1100111: begin |
| uop[13-:4] = 4'd0; |
| uop[35-:5] = instr[19-:5]; |
| uop[25] = 1; |
| uop[24-:5] = instr[11-:5]; |
| uop[19-:6] = 6'd19; |
| invalidEnc = 0; |
| end |
| 7'b0000011: begin |
| uop[35-:5] = instr[19-:5]; |
| uop[30-:5] = 0; |
| uop[25] = 1; |
| uop[24-:5] = instr[11-:5]; |
| uop[13-:4] = 4'd1; |
| case (instr[14-:3]) |
| 0: uop[19-:6] = 6'd0; |
| 1: uop[19-:6] = 6'd1; |
| 2: uop[19-:6] = 6'd2; |
| 4: uop[19-:6] = 6'd3; |
| 5: uop[19-:6] = 6'd4; |
| endcase |
| invalidEnc = ((((instr[14-:3] != 0) && (instr[14-:3] != 1)) && (instr[14-:3] != 2)) && (instr[14-:3] != 4)) && (instr[14-:3] != 5); |
| end |
| 7'b0100011: begin |
| uop[35-:5] = instr[19-:5]; |
| uop[30-:5] = instr[24-:5]; |
| uop[25] = 0; |
| uop[24-:5] = 0; |
| uop[13-:4] = 4'd2; |
| if (IN_enCustom && 0) begin |
| invalidEnc = 0; |
| case (instr[14-:3]) |
| 0: uop[19-:6] = 6'd0; |
| 1: uop[19-:6] = 6'd1; |
| 2: uop[19-:6] = 6'd2; |
| 3: invalidEnc = 1; |
| 4: uop[19-:6] = 6'd7; |
| 5: uop[19-:6] = 6'd8; |
| 6: uop[19-:6] = 6'd9; |
| 7: invalidEnc = 1; |
| endcase |
| if (instr[14]) |
| uop[24-:5] = uop[35-:5]; |
| end |
| else begin |
| case (instr[14-:3]) |
| 0: uop[19-:6] = 6'd0; |
| 1: uop[19-:6] = 6'd1; |
| 2: uop[19-:6] = 6'd2; |
| endcase |
| invalidEnc = ((instr[14-:3] != 0) && (instr[14-:3] != 1)) && (instr[14-:3] != 2); |
| end |
| end |
| 7'b1100011: begin |
| uop[35-:5] = instr[19-:5]; |
| uop[30-:5] = instr[24-:5]; |
| uop[25] = 0; |
| uop[24-:5] = 0; |
| uop[13-:4] = 4'd0; |
| invalidEnc = (uop[19-:6] == 2) || (uop[19-:6] == 3); |
| if (((((((((!invalidEnc && DO_FUSE) && (i != 0)) && uopsComb[i - 1][0]) && (uopsComb[i - 1][13-:4] == 4'd0)) && (uopsComb[i - 1][19-:6] == 6'd0)) && uopsComb[i - 1][25]) && (uopsComb[i - 1][35-:5] == uop[35-:5])) && (uop[35-:5] != 0)) && (uopsComb[i - 1][67-:32] != 0)) begin |
| uop[24-:5] = uopsComb[i - 1][24-:5]; |
| uop[67:56] = uopsComb[i - 1][47:36]; |
| validMask[i - 1] = 0; |
| $display("fused at %x", IN_instrs[(i * 70) + 37-:31]); |
| case (instr[14-:3]) |
| 0: uop[19-:6] = 6'd46; |
| 1: uop[19-:6] = 6'd47; |
| 4: uop[19-:6] = 6'd48; |
| 5: uop[19-:6] = 6'd49; |
| 6: uop[19-:6] = 6'd50; |
| 7: uop[19-:6] = 6'd51; |
| endcase |
| end |
| else |
| case (instr[14-:3]) |
| 0: uop[19-:6] = 6'd10; |
| 1: uop[19-:6] = 6'd11; |
| 4: uop[19-:6] = 6'd12; |
| 5: uop[19-:6] = 6'd13; |
| 6: uop[19-:6] = 6'd14; |
| 7: uop[19-:6] = 6'd15; |
| endcase |
| end |
| 7'b0001111: |
| if (instr[14-:3] == 0) begin |
| uop[13-:4] = 4'd0; |
| uop[19-:6] = 6'd20; |
| uop[67-:32] = 32'bxxxxxxxxxxxxxxxxxxxxxxxxxxxxx110; |
| invalidEnc = 0; |
| end |
| else if (instr[14-:3] == 1) begin |
| uop[13-:4] = 4'd0; |
| uop[19-:6] = 6'd20; |
| uop[67-:32] = 32'bxxxxxxxxxxxxxxxxxxxxxxxxxxxxx110; |
| invalidEnc = 0; |
| end |
| else if (((instr[14-:3] == 3'b010) && (instr[11-:5] == 0)) && (instr[31:20] == 0)) begin |
| invalidEnc = 0; |
| uop[19-:6] = 6'd4; |
| uop[13-:4] = 4'd2; |
| uop[35-:5] = instr[19-:5]; |
| end |
| else if (((instr[14-:3] == 3'b010) && (instr[11-:5] == 0)) && (instr[31:20] == 1)) begin |
| invalidEnc = 0; |
| uop[19-:6] = 6'd3; |
| uop[13-:4] = 4'd2; |
| uop[35-:5] = instr[19-:5]; |
| end |
| else if (((instr[14-:3] == 3'b010) && (instr[11-:5] == 0)) && (instr[31:20] == 2)) begin |
| invalidEnc = 0; |
| uop[19-:6] = 6'd5; |
| uop[13-:4] = 4'd2; |
| uop[35-:5] = instr[19-:5]; |
| end |
| 7'b0010011: begin |
| uop[35-:5] = instr[19-:5]; |
| uop[30-:5] = 0; |
| uop[25] = 1; |
| uop[24-:5] = instr[11-:5]; |
| uop[13-:4] = 4'd0; |
| if (!(((instr[14-:3] == 1) && (instr[31-:7] != 0)) || ((instr[14-:3] == 5) && ((instr[31-:7] != 7'h20) && (instr[31-:7] != 0))))) begin |
| case (instr[14-:3]) |
| 0: uop[19-:6] = 6'd0; |
| 1: uop[19-:6] = 6'd4; |
| 2: uop[19-:6] = 6'd6; |
| 3: uop[19-:6] = 6'd7; |
| 4: uop[19-:6] = 6'd1; |
| 5: uop[19-:6] = (instr[31-:7] == 7'h20 ? 6'd9 : 6'd5); |
| 6: uop[19-:6] = 6'd2; |
| 7: uop[19-:6] = 6'd3; |
| endcase |
| if (((((((FUSE_LUI && (i != 0)) && (uop[19-:6] == 6'd0)) && uopsComb[i - 1][0]) && (uopsComb[i - 1][13-:4] == 4'd0)) && (uopsComb[i - 1][19-:6] == 6'd16)) && (uopsComb[i - 1][24-:5] == uop[24-:5])) && (uop[24-:5] == uop[35-:5])) begin |
| uopsComb[i - 1][47:36] = uop[47:36]; |
| if (uop[47]) |
| uopsComb[i - 1][67:48] = uopsComb[i - 1][67:48] - 1; |
| uop[0] = 0; |
| end |
| invalidEnc = 0; |
| end |
| else if (instr[31-:7] == 7'b0110000) begin |
| if (instr[14-:3] == 3'b001) begin |
| if (instr[24-:5] == 5'b00000) begin |
| invalidEnc = 0; |
| uop[19-:6] = 6'd28; |
| end |
| else if (instr[24-:5] == 5'b00001) begin |
| invalidEnc = 0; |
| uop[19-:6] = 6'd29; |
| end |
| else if (instr[24-:5] == 5'b00010) begin |
| invalidEnc = 0; |
| uop[19-:6] = 6'd30; |
| end |
| else if (instr[24-:5] == 5'b00100) begin |
| invalidEnc = 0; |
| uop[19-:6] = 6'd35; |
| end |
| else if (instr[24-:5] == 5'b00101) begin |
| invalidEnc = 0; |
| uop[19-:6] = 6'd36; |
| end |
| else if (instr[24-:5] == 5'b00101) begin |
| invalidEnc = 0; |
| uop[19-:6] = 6'd37; |
| end |
| end |
| else if (instr[14-:3] == 3'b101) begin |
| invalidEnc = 0; |
| uop[19-:6] = 6'd39; |
| uop[67-:32] = {27'b000000000000000000000000000, instr[24-:5]}; |
| end |
| end |
| else if ((instr[31:20] == 12'b001010000111) && (instr[14-:3] == 3'b101)) begin |
| invalidEnc = 0; |
| uop[19-:6] = 6'd40; |
| end |
| else if ((instr[31:20] == 12'b011010011000) && (instr[14-:3] == 3'b101)) begin |
| invalidEnc = 0; |
| uop[19-:6] = 6'd41; |
| end |
| if (instr[31-:7] == 7'b0100100) begin |
| if (instr[14-:3] == 3'b001) begin |
| uop[19-:6] = 6'd42; |
| uop[67-:32] = {27'b000000000000000000000000000, instr[24-:5]}; |
| end |
| else if (instr[14-:3] == 3'b101) begin |
| uop[19-:6] = 6'd43; |
| uop[67-:32] = {27'b000000000000000000000000000, instr[24-:5]}; |
| end |
| end |
| else if (instr[31-:7] == 7'b0110100) begin |
| if (instr[14-:3] == 3'b001) begin |
| uop[19-:6] = 6'd44; |
| uop[67-:32] = {27'b000000000000000000000000000, instr[24-:5]}; |
| end |
| end |
| else if (instr[31-:7] == 7'b0010100) |
| if (instr[14-:3] == 3'b001) begin |
| uop[19-:6] = 6'd45; |
| uop[67-:32] = {27'b000000000000000000000000000, instr[24-:5]}; |
| end |
| if (((((((((uop[13-:4] == 4'd0) && (uop[19-:6] == 6'd0)) && (uop[35-:5] == 0)) && (uop[47] == uop[46])) && (uop[47] == uop[45])) && (uop[47] == uop[44])) && (uop[47] == uop[43])) && (uop[47] == uop[42])) && (uop[47] == uop[41])) |
| if (uop[24-:5] == 0) |
| uop[0] = 0; |
| else |
| uop[13-:4] = 4'd8; |
| end |
| 7'b0110011: begin |
| uop[35-:5] = instr[19-:5]; |
| uop[30-:5] = instr[24-:5]; |
| uop[25] = 0; |
| uop[24-:5] = instr[11-:5]; |
| uop[13-:4] = 4'd0; |
| if (instr[31-:7] == 0) begin |
| invalidEnc = 0; |
| case (instr[14-:3]) |
| 0: uop[19-:6] = 6'd0; |
| 1: uop[19-:6] = 6'd4; |
| 2: uop[19-:6] = 6'd6; |
| 3: uop[19-:6] = 6'd7; |
| 4: uop[19-:6] = 6'd1; |
| 5: uop[19-:6] = 6'd5; |
| 6: uop[19-:6] = 6'd2; |
| 7: uop[19-:6] = 6'd3; |
| endcase |
| end |
| else if (instr[31-:7] == 7'h01) begin |
| invalidEnc = 0; |
| if (instr[14-:3] < 4) |
| uop[13-:4] = 4'd3; |
| else |
| uop[13-:4] = 4'd4; |
| case (instr[14-:3]) |
| 0: uop[19-:6] = 6'd0; |
| 1: uop[19-:6] = 6'd1; |
| 2: uop[19-:6] = 6'd2; |
| 3: uop[19-:6] = 6'd3; |
| 4: uop[19-:6] = 6'd0; |
| 5: uop[19-:6] = 6'd1; |
| 6: uop[19-:6] = 6'd2; |
| 7: uop[19-:6] = 6'd3; |
| endcase |
| end |
| else if (instr[31-:7] == 7'h20) begin |
| invalidEnc = (instr[14-:3] != 0) && (instr[14-:3] != 5); |
| uop[13-:4] = 4'd0; |
| case (instr[14-:3]) |
| 0: uop[19-:6] = 6'd8; |
| 5: uop[19-:6] = 6'd9; |
| endcase |
| end |
| if (instr[31-:7] == 7'b0010000) begin |
| if (instr[14-:3] == 3'b010) begin |
| invalidEnc = 0; |
| uop[19-:6] = 6'd22; |
| uop[13-:4] = 4'd0; |
| end |
| else if (instr[14-:3] == 3'b100) begin |
| invalidEnc = 0; |
| uop[19-:6] = 6'd23; |
| uop[13-:4] = 4'd0; |
| end |
| else if (instr[14-:3] == 3'b110) begin |
| invalidEnc = 0; |
| uop[19-:6] = 6'd24; |
| uop[13-:4] = 4'd0; |
| end |
| end |
| else if (instr[31-:7] == 7'b0100000) begin |
| if (instr[14-:3] == 3'b111) begin |
| invalidEnc = 0; |
| uop[19-:6] = 6'd26; |
| uop[13-:4] = 4'd0; |
| end |
| else if (instr[14-:3] == 3'b110) begin |
| invalidEnc = 0; |
| uop[19-:6] = 6'd27; |
| uop[13-:4] = 4'd0; |
| end |
| else if (instr[14-:3] == 3'b100) begin |
| invalidEnc = 0; |
| uop[19-:6] = 6'd25; |
| uop[13-:4] = 4'd0; |
| end |
| end |
| else if (instr[31-:7] == 7'b0000101) begin |
| if (instr[14-:3] == 3'b110) begin |
| invalidEnc = 0; |
| uop[19-:6] = 6'd31; |
| uop[13-:4] = 4'd0; |
| end |
| else if (instr[14-:3] == 3'b111) begin |
| invalidEnc = 0; |
| uop[19-:6] = 6'd32; |
| uop[13-:4] = 4'd0; |
| end |
| else if (instr[14-:3] == 3'b100) begin |
| invalidEnc = 0; |
| uop[19-:6] = 6'd33; |
| uop[13-:4] = 4'd0; |
| end |
| else if (instr[14-:3] == 3'b101) begin |
| invalidEnc = 0; |
| uop[19-:6] = 6'd34; |
| uop[13-:4] = 4'd0; |
| end |
| end |
| else if (((instr[31-:7] == 7'b0000100) && (instr[24-:5] == 0)) && (instr[14-:3] == 3'b100)) begin |
| invalidEnc = 0; |
| uop[30-:5] = 0; |
| uop[19-:6] = 6'd37; |
| end |
| else if (instr[31-:7] == 7'b0110000) begin |
| if (instr[14-:3] == 3'b001) begin |
| uop[19-:6] = 6'd38; |
| uop[13-:4] = 4'd0; |
| end |
| else if (instr[14-:3] == 3'b101) begin |
| uop[19-:6] = 6'd39; |
| uop[13-:4] = 4'd0; |
| end |
| end |
| else if (instr[31-:7] == 7'b0100100) begin |
| if (instr[14-:3] == 3'b001) begin |
| uop[19-:6] = 6'd42; |
| uop[13-:4] = 4'd0; |
| end |
| else if (instr[14-:3] == 3'b101) begin |
| uop[19-:6] = 6'd43; |
| uop[13-:4] = 4'd0; |
| end |
| end |
| else if (instr[31-:7] == 7'b0110100) begin |
| if (instr[14-:3] == 3'b001) begin |
| uop[19-:6] = 6'd44; |
| uop[13-:4] = 4'd0; |
| end |
| end |
| else if (instr[31-:7] == 7'b0010100) begin |
| if (instr[14-:3] == 3'b001) begin |
| uop[19-:6] = 6'd45; |
| uop[13-:4] = 4'd0; |
| end |
| end |
| else if (IN_enCustom && (instr[31-:7] == 7'b1000000)) begin |
| invalidEnc = 0; |
| uop[13-:4] = 4'd1; |
| case (instr[14-:3]) |
| 0: uop[19-:6] = 6'd5; |
| 1: uop[19-:6] = 6'd6; |
| 2: uop[19-:6] = 6'd7; |
| 4: uop[19-:6] = 6'd8; |
| 5: uop[19-:6] = 6'd9; |
| 6: invalidEnc = 1; |
| 7: invalidEnc = 1; |
| endcase |
| end |
| end |
| 7'b1010011: |
| if (i32[26-:2] == 2'b00) begin |
| uop[13-:4] = 4'd5; |
| uop[35-:5] = i32[19-:5]; |
| uop[30-:5] = i32[24-:5]; |
| uop[24-:5] = i32[11-:5]; |
| invalidEnc = 0; |
| case (i32[31-:5]) |
| 5'b00000: uop[19-:6] = 6'd4; |
| 5'b00001: uop[19-:6] = 6'd5; |
| 5'b00010: begin |
| uop[19-:6] = 6'd6; |
| uop[13-:4] = 4'd7; |
| end |
| 5'b00011: begin |
| uop[19-:6] = 6'd0; |
| uop[13-:4] = 4'd6; |
| end |
| 5'b01011: begin |
| uop[19-:6] = 6'd1; |
| uop[30-:5] = 0; |
| uop[13-:4] = 4'd6; |
| if (i32[24-:5] != 0) |
| invalidEnc = 1; |
| end |
| 5'b00100: |
| if (i32[14-:3] == 3'b000) |
| uop[19-:6] = 6'd7; |
| else if (i32[14-:3] == 3'b001) |
| uop[19-:6] = 6'd8; |
| else if (i32[14-:3] == 3'b010) |
| uop[19-:6] = 6'd9; |
| else |
| invalidEnc = 1; |
| 5'b00101: |
| if (i32[14-:3] == 3'b000) |
| uop[19-:6] = 6'd10; |
| else if (i32[14-:3] == 3'b001) |
| uop[19-:6] = 6'd11; |
| else |
| invalidEnc = 1; |
| 5'b11000: begin |
| uop[30-:5] = 0; |
| if (i32[24-:5] == 5'b00000) |
| uop[19-:6] = 6'd12; |
| else if (i32[24-:5] == 5'b00001) |
| uop[19-:6] = 6'd13; |
| else |
| invalidEnc = 1; |
| end |
| 5'b11100: |
| if ((i32[24-:5] == 5'b00000) && (i32[14-:3] == 3'b000)) |
| uop[19-:6] = 6'd14; |
| else if ((i32[24-:5] == 5'b00000) && (i32[14-:3] == 3'b001)) |
| uop[19-:6] = 6'd18; |
| else |
| invalidEnc = 1; |
| 5'b10100: |
| if (i32[14-:3] == 3'b010) |
| uop[19-:6] = 6'd15; |
| else if (i32[14-:3] == 3'b001) |
| uop[19-:6] = 6'd17; |
| else if (i32[14-:3] == 3'b000) |
| uop[19-:6] = 6'd16; |
| else |
| invalidEnc = 1; |
| 5'b11010: |
| if (i32[24-:5] == 5'b00000) |
| uop[19-:6] = 6'd19; |
| else if (i32[24-:5] == 5'b00001) |
| uop[19-:6] = 6'd20; |
| else |
| invalidEnc = 1; |
| 5'b11110: |
| if ((i32[24-:5] == 0) && (i32[14-:3] == 0)) |
| uop[19-:6] = 6'd21; |
| else |
| invalidEnc = 1; |
| default: invalidEnc = 1; |
| endcase |
| end |
| default: invalidEnc = 1; |
| endcase |
| else begin |
| uop[1] = 1; |
| if (i16[1:0] == 2'b00) begin |
| if (i16[15-:3] == 3'b010) begin |
| uop[19-:6] = 6'd2; |
| uop[13-:4] = 4'd1; |
| uop[67-:32] = {25'b0000000000000000000000000, i16[5], i16[12-:3], i16[6], 2'b00}; |
| uop[35-:5] = {2'b01, i16[9-:3]}; |
| uop[24-:5] = {2'b01, i16[4-:3]}; |
| invalidEnc = 0; |
| end |
| else if (i16[15-:3] == 3'b110) begin |
| uop[19-:6] = 6'd2; |
| uop[13-:4] = 4'd2; |
| uop[67-:32] = {25'b0000000000000000000000000, i16[5], i16[12-:3], i16[6], 2'b00}; |
| uop[35-:5] = {2'b01, i16[9-:3]}; |
| uop[30-:5] = {2'b01, i16[4-:3]}; |
| invalidEnc = 0; |
| end |
| else if ((i16[15-:3] == 3'b000) && (i16[12-:8] != 0)) begin |
| uop[19-:6] = 6'd0; |
| uop[13-:4] = 4'd0; |
| uop[67-:32] = {22'b0000000000000000000000, i16[10:7], i16[12:11], i16[5], i16[6], 2'b00}; |
| uop[35-:5] = 2; |
| uop[25] = 1; |
| uop[24-:5] = {2'b01, i16[4-:3]}; |
| invalidEnc = 0; |
| end |
| end |
| else if (i16[1:0] == 2'b01) begin |
| if (i16[15-:3] == 3'b101) begin |
| uop[19-:6] = 6'd18; |
| uop[13-:4] = 4'd0; |
| uop[67-:32] = {{20 {i16[12]}}, i16[12], i16[8], i16[10:9], i16[6], i16[7], i16[2], i16[11], i16[5:3], 1'b0}; |
| if (!IN_instrs[(i * 70) + 1]) begin |
| OUT_decBranchDst = IN_instrs[(i * 70) + 37-:31] + uop[67:37]; |
| OUT_decBranch = 1; |
| OUT_decBranchFetchID = IN_instrs[(i * 70) + 6-:5]; |
| end |
| else |
| uop[0] = 0; |
| uop[25] = 1; |
| invalidEnc = 0; |
| end |
| else if (i16[15-:3] == 3'b001) begin |
| uop[19-:6] = 6'd18; |
| uop[13-:4] = 4'd0; |
| uop[67-:32] = {{20 {i16[12]}}, i16[12], i16[8], i16[10:9], i16[6], i16[7], i16[2], i16[11], i16[5:3], 1'b0}; |
| uop[25] = 1; |
| uop[24-:5] = 1; |
| RS_inValid = 1; |
| RS_inData = IN_instrs[(i * 70) + 37-:31] + 1; |
| if (!IN_instrs[(i * 70) + 1]) begin |
| OUT_decBranchDst = IN_instrs[(i * 70) + 37-:31] + uop[67:37]; |
| OUT_decBranch = 1; |
| OUT_decBranchFetchID = IN_instrs[(i * 70) + 6-:5]; |
| end |
| invalidEnc = 0; |
| end |
| else if (i16[15-:3] == 3'b110) begin |
| uop[19-:6] = 6'd10; |
| uop[13-:4] = 4'd0; |
| uop[67-:32] = {{23 {i16[12]}}, i16[12], i16[6:5], i16[2], i16[11:10], i16[4:3], 1'b0}; |
| uop[35-:5] = {2'b01, i16[9-:3]}; |
| if (((((((DO_FUSE && (i != 0)) && uopsComb[i - 1][0]) && (uopsComb[i - 1][13-:4] == 4'd0)) && (uopsComb[i - 1][19-:6] == 6'd0)) && uopsComb[i - 1][25]) && (uopsComb[i - 1][35-:5] == uop[35-:5])) && (uop[35-:5] != 0)) begin |
| uop[24-:5] = uopsComb[i - 1][24-:5]; |
| uop[67:56] = uopsComb[i - 1][47:36]; |
| validMask[i - 1] = 0; |
| uop[19-:6] = 6'd46; |
| end |
| invalidEnc = 0; |
| end |
| else if (i16[15-:3] == 3'b111) begin |
| uop[19-:6] = 6'd11; |
| uop[13-:4] = 4'd0; |
| uop[67-:32] = {{23 {i16[12]}}, i16[12], i16[6:5], i16[2], i16[11:10], i16[4:3], 1'b0}; |
| uop[35-:5] = {2'b01, i16[9-:3]}; |
| if (((((((DO_FUSE && (i != 0)) && uopsComb[i - 1][0]) && (uopsComb[i - 1][13-:4] == 4'd0)) && (uopsComb[i - 1][19-:6] == 6'd0)) && uopsComb[i - 1][25]) && (uopsComb[i - 1][35-:5] == uop[35-:5])) && (uop[35-:5] != 0)) begin |
| uop[24-:5] = uopsComb[i - 1][24-:5]; |
| uop[67:56] = uopsComb[i - 1][47:36]; |
| validMask[i - 1] = 0; |
| uop[19-:6] = 6'd47; |
| end |
| invalidEnc = 0; |
| end |
| else if ((i16[15-:3] == 3'b010) && (i16[11-:5] != 0)) begin |
| uop[13-:4] = 4'd8; |
| uop[67-:32] = {{26 {i16[12]}}, i16[12], i16[6-:5]}; |
| uop[25] = 1; |
| uop[24-:5] = i16[11-:5]; |
| invalidEnc = 0; |
| end |
| else if (((i16[15-:3] == 3'b011) && (i16[11-:5] != 0)) && ({i16[12], i16[6-:5]} != 0)) begin |
| uop[13-:4] = 4'd0; |
| if (i16[11-:5] == 2) begin |
| uop[19-:6] = 6'd0; |
| uop[35-:5] = 2; |
| uop[67-:32] = {{22 {i16[12]}}, i16[12], i16[4:3], i16[5], i16[2], i16[6], 4'b0000}; |
| end |
| else begin |
| uop[19-:6] = 6'd16; |
| uop[67-:32] = {{14 {i16[12]}}, i16[12], i16[6-:5], 12'b000000000000}; |
| end |
| uop[25] = 1; |
| uop[24-:5] = i16[11-:5]; |
| invalidEnc = 0; |
| end |
| else if ((i16[15-:3] == 3'b000) && (i16[11-:5] != 0)) begin |
| uop[19-:6] = 6'd0; |
| uop[13-:4] = 4'd0; |
| uop[67-:32] = {{26 {i16[12]}}, i16[12], i16[6-:5]}; |
| uop[25] = 1; |
| uop[35-:5] = i16[11-:5]; |
| uop[24-:5] = i16[11-:5]; |
| if (((((((FUSE_LUI && (i != 0)) && (uop[19-:6] == 6'd0)) && uopsComb[i - 1][0]) && (uopsComb[i - 1][13-:4] == 4'd0)) && (uopsComb[i - 1][19-:6] == 6'd16)) && (uopsComb[i - 1][24-:5] == uop[24-:5])) && (uop[24-:5] == uop[35-:5])) begin |
| uopsComb[i - 1][47:36] = uop[47:36]; |
| if (uop[47]) |
| uopsComb[i - 1][67:48] = uopsComb[i - 1][67:48] - 1; |
| uop[0] = 0; |
| end |
| invalidEnc = 0; |
| end |
| else if ((((i16[15-:3] == 3'b100) && (i16[11-:2] == 2'b00)) && !i16[12]) && (i16[6:2] != 0)) begin |
| uop[19-:6] = 6'd5; |
| uop[13-:4] = 4'd0; |
| uop[67-:32] = {27'b000000000000000000000000000, i16[6:2]}; |
| uop[25] = 1; |
| uop[35-:5] = {2'b01, i16[9-:3]}; |
| uop[24-:5] = {2'b01, i16[9-:3]}; |
| invalidEnc = 0; |
| end |
| else if ((((i16[15-:3] == 3'b100) && (i16[11-:2] == 2'b01)) && !i16[12]) && (i16[6:2] != 0)) begin |
| uop[19-:6] = 6'd9; |
| uop[13-:4] = 4'd0; |
| uop[67-:32] = {27'b000000000000000000000000000, i16[6:2]}; |
| uop[25] = 1; |
| uop[35-:5] = {2'b01, i16[9-:3]}; |
| uop[24-:5] = {2'b01, i16[9-:3]}; |
| invalidEnc = 0; |
| end |
| else if ((i16[15-:3] == 3'b100) && (i16[11-:2] == 2'b10)) begin |
| uop[19-:6] = 6'd3; |
| uop[13-:4] = 4'd0; |
| uop[67-:32] = {{26 {i16[12]}}, i16[12], i16[6:2]}; |
| uop[25] = 1; |
| uop[35-:5] = {2'b01, i16[9-:3]}; |
| uop[24-:5] = {2'b01, i16[9-:3]}; |
| invalidEnc = 0; |
| end |
| else if (i16[15-:6] == 6'b100011) begin |
| case (i16[6-:2]) |
| 2'b11: uop[19-:6] = 6'd3; |
| 2'b10: uop[19-:6] = 6'd2; |
| 2'b01: uop[19-:6] = 6'd1; |
| 2'b00: uop[19-:6] = 6'd8; |
| endcase |
| uop[13-:4] = 4'd0; |
| uop[35-:5] = {2'b01, i16[9-:3]}; |
| uop[30-:5] = {2'b01, i16[4-:3]}; |
| uop[24-:5] = {2'b01, i16[9-:3]}; |
| invalidEnc = 0; |
| end |
| else if ((((i16[15-:3] == 3'b000) && (i16[12] == 1'b0)) && (i16[11-:5] == 5'b00000)) && (i16[6-:5] == 5'b00000)) begin |
| uop[0] = 0; |
| uop[19-:6] = 6'd0; |
| uop[13-:4] = 4'd0; |
| invalidEnc = 0; |
| end |
| end |
| else if (i16[1:0] == 2'b10) |
| if ((i16[15-:3] == 3'b010) && (i16[11-:5] != 0)) begin |
| uop[19-:6] = 6'd2; |
| uop[13-:4] = 4'd1; |
| uop[67-:32] = {24'b000000000000000000000000, i16[3:2], i16[12], i16[6:4], 2'b00}; |
| uop[35-:5] = 2; |
| uop[24-:5] = i16[11-:5]; |
| invalidEnc = 0; |
| end |
| else if (i16[15-:3] == 3'b110) begin |
| uop[19-:6] = 6'd2; |
| uop[13-:4] = 4'd2; |
| uop[67-:32] = {24'b000000000000000000000000, i16[8:7], i16[12:9], 2'b00}; |
| uop[35-:5] = 2; |
| uop[30-:5] = i16[6-:5]; |
| invalidEnc = 0; |
| end |
| else if ((i16[15-:4] == 4'b1000) && !((i16[11-:5] == 0) || (i16[6-:5] != 0))) begin |
| uop[13-:4] = 4'd0; |
| uop[35-:5] = i16[11-:5]; |
| if ((i16[11-:5] == 1) && RS_outValid) begin |
| RS_inPop = 1; |
| uop[19-:6] = 6'd52; |
| uop[67-:32] = {RS_outData, 1'b0}; |
| uop[25] = 1; |
| OUT_decBranch = 1; |
| OUT_decBranchDst = RS_outData; |
| OUT_decBranchFetchID = uop[9-:5]; |
| end |
| else begin |
| uop[19-:6] = 6'd53; |
| uop[67-:32] = {IN_indirBranchTarget, 1'b0}; |
| uop[25] = 1; |
| OUT_decBranch = 1; |
| OUT_decBranchDst = IN_indirBranchTarget; |
| OUT_decBranchFetchID = uop[9-:5]; |
| end |
| invalidEnc = 0; |
| end |
| else if ((i16[15-:4] == 4'b1001) && !((i16[11-:5] == 0) || (i16[6-:5] != 0))) begin |
| uop[19-:6] = 6'd19; |
| uop[13-:4] = 4'd0; |
| uop[35-:5] = i16[11-:5]; |
| uop[24-:5] = 1; |
| invalidEnc = 0; |
| end |
| else if ((((i16[15-:3] == 3'b000) && (i16[11-:5] != 0)) && !i16[12]) && (i16[6:2] != 0)) begin |
| uop[19-:6] = 6'd4; |
| uop[13-:4] = 4'd0; |
| uop[67-:32] = {27'b000000000000000000000000000, i16[6:2]}; |
| uop[25] = 1; |
| uop[35-:5] = i16[11-:5]; |
| uop[24-:5] = i16[11-:5]; |
| invalidEnc = 0; |
| end |
| else if (((i16[15-:4] == 4'b1000) && (i16[11-:5] != 0)) && (i16[6-:5] != 0)) begin |
| uop[19-:6] = 6'd0; |
| uop[13-:4] = 4'd0; |
| uop[30-:5] = i16[6-:5]; |
| uop[24-:5] = i16[11-:5]; |
| invalidEnc = 0; |
| end |
| else if (((i16[15-:4] == 4'b1001) && (i16[11-:5] != 0)) && (i16[6-:5] != 0)) begin |
| uop[19-:6] = 6'd0; |
| uop[13-:4] = 4'd0; |
| uop[35-:5] = i16[11-:5]; |
| uop[30-:5] = i16[6-:5]; |
| uop[24-:5] = i16[11-:5]; |
| invalidEnc = 0; |
| end |
| else if (((i16[15-:4] == 4'b1001) && (i16[11-:5] == 0)) && (i16[6-:5] == 0)) begin |
| uop[19-:6] = 6'd20; |
| uop[13-:4] = 4'd0; |
| uop[25] = 1; |
| uop[38:36] = 3'd4; |
| invalidEnc = 0; |
| end |
| end |
| if (invalidEnc) begin |
| uop[19-:6] = 6'd21; |
| uop[13-:4] = 4'd0; |
| end |
| uopsComb[i] = uop; |
| end |
| end |
| always @(posedge clk) |
| if (rst || IN_invalidate) begin |
| for (i = 0; i < NUM_UOPS; i = i + 1) |
| OUT_uop[i * 68] <= 0; |
| end |
| else if (en) |
| for (i = 0; i < NUM_UOPS; i = i + 1) |
| begin |
| OUT_uop[i * 68+:68] <= uopsComb[i]; |
| if (!validMask[i]) |
| OUT_uop[i * 68] <= 0; |
| end |
| endmodule |