blob: 83a6e87d84b47693020ba7e1c8dda85d90dc5385 [file]
// Copyright 2025 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#once
// This file defines the 32 bit instruction formats for the RISC-V encodings.
format Inst32Format[32] {
fields:
unsigned bits[25];
unsigned opcode[7];
};
format RType[32] : Inst32Format {
fields:
unsigned func7[7];
unsigned rs2[5];
unsigned rs1[5];
unsigned func3[3];
unsigned rd[5];
unsigned opcode[7];
overlays:
unsigned r_uimm5[5] = rs2;
};
// Format for shift immediate for RV64, note 6 bit immediate.
format RSType[32] : Inst32Format {
fields:
unsigned func6[6];
unsigned r_uimm6[6];
unsigned rs1[5];
unsigned func3[3];
unsigned rd[5];
unsigned opcode[7];
};
format R4Type[32] : Inst32Format {
fields:
unsigned rs3[5];
unsigned func2[2];
unsigned rs2[5];
unsigned rs1[5];
unsigned func3[3];
unsigned rd[5];
unsigned opcode[7];
};
format IType[32] : Inst32Format {
fields:
signed imm12[12];
unsigned rs1[5];
unsigned func3[3];
unsigned rd[5];
unsigned opcode[7];
overlays:
unsigned u_imm12[12] = imm12;
unsigned i_uimm5[5] = rs1;
};
format SType[32] : Inst32Format {
fields:
unsigned imm7[7];
unsigned rs2[5];
unsigned rs1[5];
unsigned func3[3];
unsigned imm5[5];
unsigned opcode[7];
overlays:
signed s_imm[12] = imm7, imm5;
};
format BType[32] : Inst32Format {
fields:
unsigned imm7[7];
unsigned rs2[5];
unsigned rs1[5];
unsigned func3[3];
unsigned imm5[5];
unsigned opcode[7];
overlays:
signed b_imm[13] = imm7[6], imm5[0], imm7[5..0], imm5[4..1], 0b0;
};
format UType[32] : Inst32Format {
fields:
unsigned imm20[20];
unsigned rd[5];
unsigned opcode[7];
overlays:
unsigned u_imm[32] = imm20, 0b0000'0000'0000;
};
format JType[32] : Inst32Format {
fields:
unsigned imm20[20];
unsigned rd[5];
unsigned opcode[7];
overlays:
signed j_imm[21] = imm20[19, 7..0, 8, 18..9], 0b0;
};
format Fence[32] : Inst32Format {
fields:
unsigned fm[4];
unsigned pred[4];
unsigned succ[4];
unsigned rs1[5];
unsigned func3[3];
unsigned rd[5];
unsigned opcode[7];
};
format AType[32] : Inst32Format {
fields:
unsigned func5[5];
unsigned aq[1];
unsigned rl[1];
unsigned rs2[5];
unsigned rs1[5];
unsigned func3[3];
unsigned rd[5];
unsigned opcode[7];
};
format F12Type[32] : Inst32Format {
fields:
unsigned func12[12];
unsigned rs1[5];
unsigned func3[3];
unsigned rd[5];
unsigned opcode[7];
};
format ZICBOP[32] : Inst32Format {
fields:
unsigned offset[7];
unsigned func5[5];
unsigned rs1[5];
unsigned func3[3];
unsigned imm5[5];
unsigned op[7];
overlays:
unsigned bop_uimm12[12] = offset, 0b00000;
}
format MopRType[32] : Inst32Format {
fields:
unsigned func1[1];
unsigned n_hi[1];
unsigned func2[2];
unsigned n_mid[2];
unsigned func4[4];
unsigned n_lo[2];
unsigned rs1[5];
unsigned func3[3];
unsigned rd[5];
unsigned opcode[7];
overlays:
unsigned mop_no[5] = n_hi, n_mid, n_lo;
};
format MopRRType[32] : Inst32Format {
fields:
unsigned func1h[1];
unsigned n_hi[1];
unsigned func2[2];
unsigned n_lo[2];
unsigned func1l[1];
unsigned rs2[5];
unsigned rs1[5];
unsigned func3[3];
unsigned rd[5];
unsigned opcode[7];
overlays:
unsigned mop_no[3] = n_hi, n_lo;
};
// Vector instruction formats.
format VMem[32] : Inst32Format {
fields:
unsigned nf[3];
unsigned mew[1];
unsigned mop[2];
unsigned vm[1];
unsigned rs2[5];
unsigned rs1[5];
unsigned width[3];
unsigned vd[5];
unsigned opcode[7];
overlays:
unsigned lumop[5] = rs2;
unsigned sumop[5] = rs2;
unsigned vs2[5] = rs2;
unsigned vs3[5] = vd;
};
format VArith[32] : Inst32Format {
fields:
unsigned func6[6];
unsigned vm[1];
unsigned vs2[5];
unsigned vs1[5];
unsigned func3[3];
unsigned vd[5];
unsigned opcode[7];
overlays:
unsigned uimm5[5] = vs1;
unsigned uimm6[6] = func6[0], vs1;
unsigned func5[5] = func6[5..1];
signed simm5[5] = vs1;
unsigned rd[5] = vd;
unsigned rs1[5] = vs1;
unsigned vd_mask[5] = vd;
};
format VConfig[32] : Inst32Format {
fields:
unsigned top12[12];
unsigned rs1[5];
unsigned func3[3];
unsigned rd[5];
unsigned opcode[7];
overlays:
signed zimm11[11] = top12[10..0];
unsigned func1[1] = top12[11];
unsigned func2[2] = top12[11..10];
unsigned func7[7] = top12[11..5];
signed zimm10[10] = top12[9..0];
unsigned uimm5[5] = rs1;
unsigned rs2[5] = top12[4..0];
};