blob: bb85ae6c59b49b78fc7d55cbe921505cc1daa45b [file] [log] [blame]
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