blob: 6b7880278536d9b985e618026b9bb3a24bb69a19 [file] [log] [blame]
/*===- TableGen'erated file -------------------------------------*- C++ -*-===*\
|* *|
|* Machine Code Emitter *|
|* *|
|* Automatically generated file, do not edit! *|
|* *|
\*===----------------------------------------------------------------------===*/
uint64_t RISCVMCCodeEmitter::getBinaryCodeForInstr(const MCInst &MI,
SmallVectorImpl<MCFixup> &Fixups,
const MCSubtargetInfo &STI) const {
static const uint64_t InstBits[] = {
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(0),
UINT64_C(51), // ADD
UINT64_C(19), // ADDI
UINT64_C(27), // ADDIW
UINT64_C(59), // ADDW
UINT64_C(12335), // AMOADD_D
UINT64_C(67121199), // AMOADD_D_AQ
UINT64_C(100675631), // AMOADD_D_AQ_RL
UINT64_C(33566767), // AMOADD_D_RL
UINT64_C(8239), // AMOADD_W
UINT64_C(67117103), // AMOADD_W_AQ
UINT64_C(100671535), // AMOADD_W_AQ_RL
UINT64_C(33562671), // AMOADD_W_RL
UINT64_C(1610625071), // AMOAND_D
UINT64_C(1677733935), // AMOAND_D_AQ
UINT64_C(1711288367), // AMOAND_D_AQ_RL
UINT64_C(1644179503), // AMOAND_D_RL
UINT64_C(1610620975), // AMOAND_W
UINT64_C(1677729839), // AMOAND_W_AQ
UINT64_C(1711284271), // AMOAND_W_AQ_RL
UINT64_C(1644175407), // AMOAND_W_RL
UINT64_C(3758108719), // AMOMAXU_D
UINT64_C(3825217583), // AMOMAXU_D_AQ
UINT64_C(3858772015), // AMOMAXU_D_AQ_RL
UINT64_C(3791663151), // AMOMAXU_D_RL
UINT64_C(3758104623), // AMOMAXU_W
UINT64_C(3825213487), // AMOMAXU_W_AQ
UINT64_C(3858767919), // AMOMAXU_W_AQ_RL
UINT64_C(3791659055), // AMOMAXU_W_RL
UINT64_C(2684366895), // AMOMAX_D
UINT64_C(2751475759), // AMOMAX_D_AQ
UINT64_C(2785030191), // AMOMAX_D_AQ_RL
UINT64_C(2717921327), // AMOMAX_D_RL
UINT64_C(2684362799), // AMOMAX_W
UINT64_C(2751471663), // AMOMAX_W_AQ
UINT64_C(2785026095), // AMOMAX_W_AQ_RL
UINT64_C(2717917231), // AMOMAX_W_RL
UINT64_C(3221237807), // AMOMINU_D
UINT64_C(3288346671), // AMOMINU_D_AQ
UINT64_C(3321901103), // AMOMINU_D_AQ_RL
UINT64_C(3254792239), // AMOMINU_D_RL
UINT64_C(3221233711), // AMOMINU_W
UINT64_C(3288342575), // AMOMINU_W_AQ
UINT64_C(3321897007), // AMOMINU_W_AQ_RL
UINT64_C(3254788143), // AMOMINU_W_RL
UINT64_C(2147495983), // AMOMIN_D
UINT64_C(2214604847), // AMOMIN_D_AQ
UINT64_C(2248159279), // AMOMIN_D_AQ_RL
UINT64_C(2181050415), // AMOMIN_D_RL
UINT64_C(2147491887), // AMOMIN_W
UINT64_C(2214600751), // AMOMIN_W_AQ
UINT64_C(2248155183), // AMOMIN_W_AQ_RL
UINT64_C(2181046319), // AMOMIN_W_RL
UINT64_C(1073754159), // AMOOR_D
UINT64_C(1140863023), // AMOOR_D_AQ
UINT64_C(1174417455), // AMOOR_D_AQ_RL
UINT64_C(1107308591), // AMOOR_D_RL
UINT64_C(1073750063), // AMOOR_W
UINT64_C(1140858927), // AMOOR_W_AQ
UINT64_C(1174413359), // AMOOR_W_AQ_RL
UINT64_C(1107304495), // AMOOR_W_RL
UINT64_C(134230063), // AMOSWAP_D
UINT64_C(201338927), // AMOSWAP_D_AQ
UINT64_C(234893359), // AMOSWAP_D_AQ_RL
UINT64_C(167784495), // AMOSWAP_D_RL
UINT64_C(134225967), // AMOSWAP_W
UINT64_C(201334831), // AMOSWAP_W_AQ
UINT64_C(234889263), // AMOSWAP_W_AQ_RL
UINT64_C(167780399), // AMOSWAP_W_RL
UINT64_C(536883247), // AMOXOR_D
UINT64_C(603992111), // AMOXOR_D_AQ
UINT64_C(637546543), // AMOXOR_D_AQ_RL
UINT64_C(570437679), // AMOXOR_D_RL
UINT64_C(536879151), // AMOXOR_W
UINT64_C(603988015), // AMOXOR_W_AQ
UINT64_C(637542447), // AMOXOR_W_AQ_RL
UINT64_C(570433583), // AMOXOR_W_RL
UINT64_C(28723), // AND
UINT64_C(28691), // ANDI
UINT64_C(23), // AUIPC
UINT64_C(99), // BEQ
UINT64_C(20579), // BGE
UINT64_C(28771), // BGEU
UINT64_C(16483), // BLT
UINT64_C(24675), // BLTU
UINT64_C(4195), // BNE
UINT64_C(12403), // CSRRC
UINT64_C(28787), // CSRRCI
UINT64_C(8307), // CSRRS
UINT64_C(24691), // CSRRSI
UINT64_C(4211), // CSRRW
UINT64_C(20595), // CSRRWI
UINT64_C(36866), // C_ADD
UINT64_C(1), // C_ADDI
UINT64_C(24833), // C_ADDI16SP
UINT64_C(0), // C_ADDI4SPN
UINT64_C(8193), // C_ADDIW
UINT64_C(1), // C_ADDI_HINT_IMM_ZERO
UINT64_C(1), // C_ADDI_HINT_X0
UINT64_C(1), // C_ADDI_NOP
UINT64_C(39969), // C_ADDW
UINT64_C(36866), // C_ADD_HINT
UINT64_C(35937), // C_AND
UINT64_C(34817), // C_ANDI
UINT64_C(49153), // C_BEQZ
UINT64_C(57345), // C_BNEZ
UINT64_C(36866), // C_EBREAK
UINT64_C(8192), // C_FLD
UINT64_C(8194), // C_FLDSP
UINT64_C(24576), // C_FLW
UINT64_C(24578), // C_FLWSP
UINT64_C(40960), // C_FSD
UINT64_C(40962), // C_FSDSP
UINT64_C(57344), // C_FSW
UINT64_C(57346), // C_FSWSP
UINT64_C(40961), // C_J
UINT64_C(8193), // C_JAL
UINT64_C(36866), // C_JALR
UINT64_C(32770), // C_JR
UINT64_C(24576), // C_LD
UINT64_C(24578), // C_LDSP
UINT64_C(16385), // C_LI
UINT64_C(16385), // C_LI_HINT
UINT64_C(24577), // C_LUI
UINT64_C(24577), // C_LUI_HINT
UINT64_C(16384), // C_LW
UINT64_C(16386), // C_LWSP
UINT64_C(32770), // C_MV
UINT64_C(32770), // C_MV_HINT
UINT64_C(1), // C_NOP
UINT64_C(1), // C_NOP_HINT
UINT64_C(35905), // C_OR
UINT64_C(57344), // C_SD
UINT64_C(57346), // C_SDSP
UINT64_C(2), // C_SLLI
UINT64_C(2), // C_SLLI64_HINT
UINT64_C(2), // C_SLLI_HINT
UINT64_C(33793), // C_SRAI
UINT64_C(33793), // C_SRAI64_HINT
UINT64_C(32769), // C_SRLI
UINT64_C(32769), // C_SRLI64_HINT
UINT64_C(35841), // C_SUB
UINT64_C(39937), // C_SUBW
UINT64_C(49152), // C_SW
UINT64_C(49154), // C_SWSP
UINT64_C(0), // C_UNIMP
UINT64_C(35873), // C_XOR
UINT64_C(33570867), // DIV
UINT64_C(33574963), // DIVU
UINT64_C(33574971), // DIVUW
UINT64_C(33570875), // DIVW
UINT64_C(1048691), // EBREAK
UINT64_C(115), // ECALL
UINT64_C(33554515), // FADD_D
UINT64_C(83), // FADD_S
UINT64_C(3791654995), // FCLASS_D
UINT64_C(3758100563), // FCLASS_S
UINT64_C(3525312595), // FCVT_D_L
UINT64_C(3526361171), // FCVT_D_LU
UINT64_C(1107296339), // FCVT_D_S
UINT64_C(3523215443), // FCVT_D_W
UINT64_C(3524264019), // FCVT_D_WU
UINT64_C(3257925715), // FCVT_LU_D
UINT64_C(3224371283), // FCVT_LU_S
UINT64_C(3256877139), // FCVT_L_D
UINT64_C(3223322707), // FCVT_L_S
UINT64_C(1074790483), // FCVT_S_D
UINT64_C(3491758163), // FCVT_S_L
UINT64_C(3492806739), // FCVT_S_LU
UINT64_C(3489661011), // FCVT_S_W
UINT64_C(3490709587), // FCVT_S_WU
UINT64_C(3255828563), // FCVT_WU_D
UINT64_C(3222274131), // FCVT_WU_S
UINT64_C(3254779987), // FCVT_W_D
UINT64_C(3221225555), // FCVT_W_S
UINT64_C(436207699), // FDIV_D
UINT64_C(402653267), // FDIV_S
UINT64_C(15), // FENCE
UINT64_C(4111), // FENCE_I
UINT64_C(2200961039), // FENCE_TSO
UINT64_C(2717917267), // FEQ_D
UINT64_C(2684362835), // FEQ_S
UINT64_C(12295), // FLD
UINT64_C(2717909075), // FLE_D
UINT64_C(2684354643), // FLE_S
UINT64_C(2717913171), // FLT_D
UINT64_C(2684358739), // FLT_S
UINT64_C(8199), // FLW
UINT64_C(33554499), // FMADD_D
UINT64_C(67), // FMADD_S
UINT64_C(704647251), // FMAX_D
UINT64_C(671092819), // FMAX_S
UINT64_C(704643155), // FMIN_D
UINT64_C(671088723), // FMIN_S
UINT64_C(33554503), // FMSUB_D
UINT64_C(71), // FMSUB_S
UINT64_C(301989971), // FMUL_D
UINT64_C(268435539), // FMUL_S
UINT64_C(4060086355), // FMV_D_X
UINT64_C(4026531923), // FMV_W_X
UINT64_C(3791650899), // FMV_X_D
UINT64_C(3758096467), // FMV_X_W
UINT64_C(33554511), // FNMADD_D
UINT64_C(79), // FNMADD_S
UINT64_C(33554507), // FNMSUB_D
UINT64_C(75), // FNMSUB_S
UINT64_C(12327), // FSD
UINT64_C(570429523), // FSGNJN_D
UINT64_C(536875091), // FSGNJN_S
UINT64_C(570433619), // FSGNJX_D
UINT64_C(536879187), // FSGNJX_S
UINT64_C(570425427), // FSGNJ_D
UINT64_C(536870995), // FSGNJ_S
UINT64_C(1509949523), // FSQRT_D
UINT64_C(1476395091), // FSQRT_S
UINT64_C(167772243), // FSUB_D
UINT64_C(134217811), // FSUB_S
UINT64_C(8231), // FSW
UINT64_C(111), // JAL
UINT64_C(103), // JALR
UINT64_C(3), // LB
UINT64_C(16387), // LBU
UINT64_C(12291), // LD
UINT64_C(4099), // LH
UINT64_C(20483), // LHU
UINT64_C(268447791), // LR_D
UINT64_C(335556655), // LR_D_AQ
UINT64_C(369111087), // LR_D_AQ_RL
UINT64_C(302002223), // LR_D_RL
UINT64_C(268443695), // LR_W
UINT64_C(335552559), // LR_W_AQ
UINT64_C(369106991), // LR_W_AQ_RL
UINT64_C(301998127), // LR_W_RL
UINT64_C(55), // LUI
UINT64_C(8195), // LW
UINT64_C(24579), // LWU
UINT64_C(807403635), // MRET
UINT64_C(33554483), // MUL
UINT64_C(33558579), // MULH
UINT64_C(33562675), // MULHSU
UINT64_C(33566771), // MULHU
UINT64_C(33554491), // MULW
UINT64_C(24627), // OR
UINT64_C(24595), // ORI
UINT64_C(33579059), // REM
UINT64_C(33583155), // REMU
UINT64_C(33583163), // REMUW
UINT64_C(33579067), // REMW
UINT64_C(35), // SB
UINT64_C(402665519), // SC_D
UINT64_C(469774383), // SC_D_AQ
UINT64_C(503328815), // SC_D_AQ_RL
UINT64_C(436219951), // SC_D_RL
UINT64_C(402661423), // SC_W
UINT64_C(469770287), // SC_W_AQ
UINT64_C(503324719), // SC_W_AQ_RL
UINT64_C(436215855), // SC_W_RL
UINT64_C(12323), // SD
UINT64_C(301990003), // SFENCE_VMA
UINT64_C(4131), // SH
UINT64_C(4147), // SLL
UINT64_C(4115), // SLLI
UINT64_C(4123), // SLLIW
UINT64_C(4155), // SLLW
UINT64_C(8243), // SLT
UINT64_C(8211), // SLTI
UINT64_C(12307), // SLTIU
UINT64_C(12339), // SLTU
UINT64_C(1073762355), // SRA
UINT64_C(1073762323), // SRAI
UINT64_C(1073762331), // SRAIW
UINT64_C(1073762363), // SRAW
UINT64_C(270532723), // SRET
UINT64_C(20531), // SRL
UINT64_C(20499), // SRLI
UINT64_C(20507), // SRLIW
UINT64_C(20539), // SRLW
UINT64_C(1073741875), // SUB
UINT64_C(1073741883), // SUBW
UINT64_C(8227), // SW
UINT64_C(3221229683), // UNIMP
UINT64_C(2097267), // URET
UINT64_C(273678451), // WFI
UINT64_C(16435), // XOR
UINT64_C(16403), // XORI
UINT64_C(0)
};
const unsigned opcode = MI.getOpcode();
uint64_t Value = InstBits[opcode];
uint64_t op = 0;
(void)op; // suppress warning
switch (opcode) {
case RISCV::C_EBREAK:
case RISCV::C_NOP:
case RISCV::C_UNIMP:
case RISCV::EBREAK:
case RISCV::ECALL:
case RISCV::FENCE_I:
case RISCV::FENCE_TSO:
case RISCV::MRET:
case RISCV::SRET:
case RISCV::UNIMP:
case RISCV::URET:
case RISCV::WFI: {
break;
}
case RISCV::C_NOP_HINT: {
// op: imm
op = getImmOpValue(MI, 0, Fixups, STI);
Value |= (op & UINT64_C(32)) << 7;
Value |= (op & UINT64_C(31)) << 2;
break;
}
case RISCV::C_LI_HINT:
case RISCV::C_LUI_HINT: {
// op: imm
op = getImmOpValue(MI, 1, Fixups, STI);
Value |= (op & UINT64_C(32)) << 7;
Value |= (op & UINT64_C(31)) << 2;
break;
}
case RISCV::C_LI:
case RISCV::C_LUI: {
// op: imm
op = getImmOpValue(MI, 1, Fixups, STI);
Value |= (op & UINT64_C(32)) << 7;
Value |= (op & UINT64_C(31)) << 2;
// op: rd
op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
op &= UINT64_C(31);
op <<= 7;
Value |= op;
break;
}
case RISCV::C_FLDSP:
case RISCV::C_LDSP: {
// op: imm
op = getImmOpValue(MI, 2, Fixups, STI);
Value |= (op & UINT64_C(32)) << 7;
Value |= (op & UINT64_C(24)) << 2;
Value |= (op & UINT64_C(448)) >> 4;
// op: rd
op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
op &= UINT64_C(31);
op <<= 7;
Value |= op;
break;
}
case RISCV::C_FLWSP:
case RISCV::C_LWSP: {
// op: imm
op = getImmOpValue(MI, 2, Fixups, STI);
Value |= (op & UINT64_C(32)) << 7;
Value |= (op & UINT64_C(28)) << 2;
Value |= (op & UINT64_C(192)) >> 4;
// op: rd
op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
op &= UINT64_C(31);
op <<= 7;
Value |= op;
break;
}
case RISCV::C_ADDI:
case RISCV::C_ADDIW:
case RISCV::C_ADDI_HINT_X0: {
// op: imm
op = getImmOpValue(MI, 2, Fixups, STI);
Value |= (op & UINT64_C(32)) << 7;
Value |= (op & UINT64_C(31)) << 2;
// op: rd
op = getMachineOpValue(MI, MI.getOperand(1), Fixups, STI);
op &= UINT64_C(31);
op <<= 7;
Value |= op;
break;
}
case RISCV::C_ANDI: {
// op: imm
op = getImmOpValue(MI, 2, Fixups, STI);
Value |= (op & UINT64_C(32)) << 7;
Value |= (op & UINT64_C(31)) << 2;
// op: rs1
op = getMachineOpValue(MI, MI.getOperand(1), Fixups, STI);
op &= UINT64_C(7);
op <<= 7;
Value |= op;
break;
}
case RISCV::C_ADDI4SPN: {
// op: imm
op = getImmOpValue(MI, 2, Fixups, STI);
Value |= (op & UINT64_C(48)) << 7;
Value |= (op & UINT64_C(960)) << 1;
Value |= (op & UINT64_C(4)) << 4;
Value |= (op & UINT64_C(8)) << 2;
// op: rd
op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
op &= UINT64_C(7);
op <<= 2;
Value |= op;
break;
}
case RISCV::C_ADDI16SP: {
// op: imm
op = getImmOpValue(MI, 2, Fixups, STI);
Value |= (op & UINT64_C(512)) << 3;
Value |= (op & UINT64_C(16)) << 2;
Value |= (op & UINT64_C(64)) >> 1;
Value |= (op & UINT64_C(384)) >> 4;
Value |= (op & UINT64_C(32)) >> 3;
break;
}
case RISCV::C_FSDSP:
case RISCV::C_SDSP: {
// op: imm
op = getImmOpValue(MI, 2, Fixups, STI);
Value |= (op & UINT64_C(56)) << 7;
Value |= (op & UINT64_C(448)) << 1;
// op: rs2
op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
op &= UINT64_C(31);
op <<= 2;
Value |= op;
break;
}
case RISCV::C_FSWSP:
case RISCV::C_SWSP: {
// op: imm
op = getImmOpValue(MI, 2, Fixups, STI);
Value |= (op & UINT64_C(60)) << 7;
Value |= (op & UINT64_C(192)) << 1;
// op: rs2
op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
op &= UINT64_C(31);
op <<= 2;
Value |= op;
break;
}
case RISCV::C_BEQZ:
case RISCV::C_BNEZ: {
// op: imm
op = getImmOpValueAsr1(MI, 1, Fixups, STI);
Value |= (op & UINT64_C(128)) << 5;
Value |= (op & UINT64_C(12)) << 8;
Value |= (op & UINT64_C(96));
Value |= (op & UINT64_C(3)) << 3;
Value |= (op & UINT64_C(16)) >> 2;
// op: rs1
op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
op &= UINT64_C(7);
op <<= 7;
Value |= op;
break;
}
case RISCV::C_SLLI_HINT: {
// op: imm
op = getMachineOpValue(MI, MI.getOperand(2), Fixups, STI);
Value |= (op & UINT64_C(32)) << 7;
Value |= (op & UINT64_C(31)) << 2;
break;
}
case RISCV::C_SLLI: {
// op: imm
op = getMachineOpValue(MI, MI.getOperand(2), Fixups, STI);
Value |= (op & UINT64_C(32)) << 7;
Value |= (op & UINT64_C(31)) << 2;
// op: rd
op = getMachineOpValue(MI, MI.getOperand(1), Fixups, STI);
op &= UINT64_C(31);
op <<= 7;
Value |= op;
break;
}
case RISCV::C_SRAI:
case RISCV::C_SRLI: {
// op: imm
op = getMachineOpValue(MI, MI.getOperand(2), Fixups, STI);
Value |= (op & UINT64_C(32)) << 7;
Value |= (op & UINT64_C(31)) << 2;
// op: rs1
op = getMachineOpValue(MI, MI.getOperand(1), Fixups, STI);
op &= UINT64_C(7);
op <<= 7;
Value |= op;
break;
}
case RISCV::C_ADDI_HINT_IMM_ZERO:
case RISCV::C_ADDI_NOP: {
// op: imm
op = getMachineOpValue(MI, MI.getOperand(2), Fixups, STI);
op &= UINT64_C(32);
op <<= 7;
Value |= op;
// op: rd
op = getMachineOpValue(MI, MI.getOperand(1), Fixups, STI);
op &= UINT64_C(31);
op <<= 7;
Value |= op;
break;
}
case RISCV::FSD:
case RISCV::FSW:
case RISCV::SB:
case RISCV::SD:
case RISCV::SH:
case RISCV::SW: {
// op: imm12
op = getImmOpValue(MI, 2, Fixups, STI);
Value |= (op & UINT64_C(4064)) << 20;
Value |= (op & UINT64_C(31)) << 7;
// op: rs2
op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
op &= UINT64_C(31);
op <<= 20;
Value |= op;
// op: rs1
op = getMachineOpValue(MI, MI.getOperand(1), Fixups, STI);
op &= UINT64_C(31);
op <<= 15;
Value |= op;
break;
}
case RISCV::ADDI:
case RISCV::ADDIW:
case RISCV::ANDI:
case RISCV::FLD:
case RISCV::FLW:
case RISCV::JALR:
case RISCV::LB:
case RISCV::LBU:
case RISCV::LD:
case RISCV::LH:
case RISCV::LHU:
case RISCV::LW:
case RISCV::LWU:
case RISCV::ORI:
case RISCV::SLTI:
case RISCV::SLTIU:
case RISCV::XORI: {
// op: imm12
op = getImmOpValue(MI, 2, Fixups, STI);
op &= UINT64_C(4095);
op <<= 20;
Value |= op;
// op: rs1
op = getMachineOpValue(MI, MI.getOperand(1), Fixups, STI);
op &= UINT64_C(31);
op <<= 15;
Value |= op;
// op: rd
op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
op &= UINT64_C(31);
op <<= 7;
Value |= op;
break;
}
case RISCV::BEQ:
case RISCV::BGE:
case RISCV::BGEU:
case RISCV::BLT:
case RISCV::BLTU:
case RISCV::BNE: {
// op: imm12
op = getImmOpValueAsr1(MI, 2, Fixups, STI);
Value |= (op & UINT64_C(2048)) << 20;
Value |= (op & UINT64_C(1008)) << 21;
Value |= (op & UINT64_C(15)) << 8;
Value |= (op & UINT64_C(1024)) >> 3;
// op: rs2
op = getMachineOpValue(MI, MI.getOperand(1), Fixups, STI);
op &= UINT64_C(31);
op <<= 20;
Value |= op;
// op: rs1
op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
op &= UINT64_C(31);
op <<= 15;
Value |= op;
break;
}
case RISCV::CSRRC:
case RISCV::CSRRCI:
case RISCV::CSRRS:
case RISCV::CSRRSI:
case RISCV::CSRRW:
case RISCV::CSRRWI: {
// op: imm12
op = getMachineOpValue(MI, MI.getOperand(1), Fixups, STI);
op &= UINT64_C(4095);
op <<= 20;
Value |= op;
// op: rs1
op = getMachineOpValue(MI, MI.getOperand(2), Fixups, STI);
op &= UINT64_C(31);
op <<= 15;
Value |= op;
// op: rd
op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
op &= UINT64_C(31);
op <<= 7;
Value |= op;
break;
}
case RISCV::AUIPC:
case RISCV::LUI: {
// op: imm20
op = getImmOpValue(MI, 1, Fixups, STI);
op &= UINT64_C(1048575);
op <<= 12;
Value |= op;
// op: rd
op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
op &= UINT64_C(31);
op <<= 7;
Value |= op;
break;
}
case RISCV::JAL: {
// op: imm20
op = getImmOpValueAsr1(MI, 1, Fixups, STI);
Value |= (op & UINT64_C(524288)) << 12;
Value |= (op & UINT64_C(1023)) << 21;
Value |= (op & UINT64_C(1024)) << 10;
Value |= (op & UINT64_C(522240)) << 1;
// op: rd
op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
op &= UINT64_C(31);
op <<= 7;
Value |= op;
break;
}
case RISCV::C_J:
case RISCV::C_JAL: {
// op: offset
op = getImmOpValueAsr1(MI, 0, Fixups, STI);
Value |= (op & UINT64_C(1024)) << 2;
Value |= (op & UINT64_C(8)) << 8;
Value |= (op & UINT64_C(384)) << 2;
Value |= (op & UINT64_C(512)) >> 1;
Value |= (op & UINT64_C(32)) << 2;
Value |= (op & UINT64_C(64));
Value |= (op & UINT64_C(7)) << 3;
Value |= (op & UINT64_C(16)) >> 2;
break;
}
case RISCV::FENCE: {
// op: pred
op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
op &= UINT64_C(15);
op <<= 24;
Value |= op;
// op: succ
op = getMachineOpValue(MI, MI.getOperand(1), Fixups, STI);
op &= UINT64_C(15);
op <<= 20;
Value |= op;
break;
}
case RISCV::C_FLD:
case RISCV::C_LD: {
// op: rd
op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
op &= UINT64_C(7);
op <<= 2;
Value |= op;
// op: rs1
op = getMachineOpValue(MI, MI.getOperand(1), Fixups, STI);
op &= UINT64_C(7);
op <<= 7;
Value |= op;
// op: imm
op = getImmOpValue(MI, 2, Fixups, STI);
Value |= (op & UINT64_C(56)) << 7;
Value |= (op & UINT64_C(192)) >> 1;
break;
}
case RISCV::C_FLW:
case RISCV::C_LW: {
// op: rd
op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
op &= UINT64_C(7);
op <<= 2;
Value |= op;
// op: rs1
op = getMachineOpValue(MI, MI.getOperand(1), Fixups, STI);
op &= UINT64_C(7);
op <<= 7;
Value |= op;
// op: imm
op = getImmOpValue(MI, 2, Fixups, STI);
Value |= (op & UINT64_C(56)) << 7;
Value |= (op & UINT64_C(4)) << 4;
Value |= (op & UINT64_C(64)) >> 1;
break;
}
case RISCV::C_SLLI64_HINT: {
// op: rd
op = getMachineOpValue(MI, MI.getOperand(1), Fixups, STI);
op &= UINT64_C(31);
op <<= 7;
Value |= op;
break;
}
case RISCV::C_SRAI64_HINT:
case RISCV::C_SRLI64_HINT: {
// op: rd
op = getMachineOpValue(MI, MI.getOperand(1), Fixups, STI);
op &= UINT64_C(7);
op <<= 7;
Value |= op;
break;
}
case RISCV::C_JALR:
case RISCV::C_JR: {
// op: rs1
op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
op &= UINT64_C(31);
op <<= 7;
Value |= op;
break;
}
case RISCV::C_MV: {
// op: rs1
op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
op &= UINT64_C(31);
op <<= 7;
Value |= op;
// op: rs2
op = getMachineOpValue(MI, MI.getOperand(1), Fixups, STI);
op &= UINT64_C(31);
op <<= 2;
Value |= op;
break;
}
case RISCV::FCVT_D_L:
case RISCV::FCVT_D_LU:
case RISCV::FCVT_LU_D:
case RISCV::FCVT_LU_S:
case RISCV::FCVT_L_D:
case RISCV::FCVT_L_S:
case RISCV::FCVT_S_D:
case RISCV::FCVT_S_L:
case RISCV::FCVT_S_LU:
case RISCV::FCVT_S_W:
case RISCV::FCVT_S_WU:
case RISCV::FCVT_WU_D:
case RISCV::FCVT_WU_S:
case RISCV::FCVT_W_D:
case RISCV::FCVT_W_S:
case RISCV::FSQRT_D:
case RISCV::FSQRT_S: {
// op: rs1
op = getMachineOpValue(MI, MI.getOperand(1), Fixups, STI);
op &= UINT64_C(31);
op <<= 15;
Value |= op;
// op: funct3
op = getMachineOpValue(MI, MI.getOperand(2), Fixups, STI);
op &= UINT64_C(7);
op <<= 12;
Value |= op;
// op: rd
op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
op &= UINT64_C(31);
op <<= 7;
Value |= op;
break;
}
case RISCV::FCLASS_D:
case RISCV::FCLASS_S:
case RISCV::FCVT_D_S:
case RISCV::FCVT_D_W:
case RISCV::FCVT_D_WU:
case RISCV::FMV_D_X:
case RISCV::FMV_W_X:
case RISCV::FMV_X_D:
case RISCV::FMV_X_W:
case RISCV::LR_D:
case RISCV::LR_D_AQ:
case RISCV::LR_D_AQ_RL:
case RISCV::LR_D_RL:
case RISCV::LR_W:
case RISCV::LR_W_AQ:
case RISCV::LR_W_AQ_RL:
case RISCV::LR_W_RL: {
// op: rs1
op = getMachineOpValue(MI, MI.getOperand(1), Fixups, STI);
op &= UINT64_C(31);
op <<= 15;
Value |= op;
// op: rd
op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
op &= UINT64_C(31);
op <<= 7;
Value |= op;
break;
}
case RISCV::C_ADD: {
// op: rs1
op = getMachineOpValue(MI, MI.getOperand(1), Fixups, STI);
op &= UINT64_C(31);
op <<= 7;
Value |= op;
// op: rs2
op = getMachineOpValue(MI, MI.getOperand(2), Fixups, STI);
op &= UINT64_C(31);
op <<= 2;
Value |= op;
break;
}
case RISCV::C_FSD:
case RISCV::C_SD: {
// op: rs2
op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
op &= UINT64_C(7);
op <<= 2;
Value |= op;
// op: rs1
op = getMachineOpValue(MI, MI.getOperand(1), Fixups, STI);
op &= UINT64_C(7);
op <<= 7;
Value |= op;
// op: imm
op = getImmOpValue(MI, 2, Fixups, STI);
Value |= (op & UINT64_C(56)) << 7;
Value |= (op & UINT64_C(192)) >> 1;
break;
}
case RISCV::C_FSW:
case RISCV::C_SW: {
// op: rs2
op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
op &= UINT64_C(7);
op <<= 2;
Value |= op;
// op: rs1
op = getMachineOpValue(MI, MI.getOperand(1), Fixups, STI);
op &= UINT64_C(7);
op <<= 7;
Value |= op;
// op: imm
op = getImmOpValue(MI, 2, Fixups, STI);
Value |= (op & UINT64_C(56)) << 7;
Value |= (op & UINT64_C(4)) << 4;
Value |= (op & UINT64_C(64)) >> 1;
break;
}
case RISCV::SFENCE_VMA: {
// op: rs2
op = getMachineOpValue(MI, MI.getOperand(1), Fixups, STI);
op &= UINT64_C(31);
op <<= 20;
Value |= op;
// op: rs1
op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
op &= UINT64_C(31);
op <<= 15;
Value |= op;
break;
}
case RISCV::C_MV_HINT: {
// op: rs2
op = getMachineOpValue(MI, MI.getOperand(1), Fixups, STI);
op &= UINT64_C(31);
op <<= 2;
Value |= op;
break;
}
case RISCV::FADD_D:
case RISCV::FADD_S:
case RISCV::FDIV_D:
case RISCV::FDIV_S:
case RISCV::FMUL_D:
case RISCV::FMUL_S:
case RISCV::FSUB_D:
case RISCV::FSUB_S: {
// op: rs2
op = getMachineOpValue(MI, MI.getOperand(2), Fixups, STI);
op &= UINT64_C(31);
op <<= 20;
Value |= op;
// op: rs1
op = getMachineOpValue(MI, MI.getOperand(1), Fixups, STI);
op &= UINT64_C(31);
op <<= 15;
Value |= op;
// op: funct3
op = getMachineOpValue(MI, MI.getOperand(3), Fixups, STI);
op &= UINT64_C(7);
op <<= 12;
Value |= op;
// op: rd
op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
op &= UINT64_C(31);
op <<= 7;
Value |= op;
break;
}
case RISCV::ADD:
case RISCV::ADDW:
case RISCV::AMOADD_D:
case RISCV::AMOADD_D_AQ:
case RISCV::AMOADD_D_AQ_RL:
case RISCV::AMOADD_D_RL:
case RISCV::AMOADD_W:
case RISCV::AMOADD_W_AQ:
case RISCV::AMOADD_W_AQ_RL:
case RISCV::AMOADD_W_RL:
case RISCV::AMOAND_D:
case RISCV::AMOAND_D_AQ:
case RISCV::AMOAND_D_AQ_RL:
case RISCV::AMOAND_D_RL:
case RISCV::AMOAND_W:
case RISCV::AMOAND_W_AQ:
case RISCV::AMOAND_W_AQ_RL:
case RISCV::AMOAND_W_RL:
case RISCV::AMOMAXU_D:
case RISCV::AMOMAXU_D_AQ:
case RISCV::AMOMAXU_D_AQ_RL:
case RISCV::AMOMAXU_D_RL:
case RISCV::AMOMAXU_W:
case RISCV::AMOMAXU_W_AQ:
case RISCV::AMOMAXU_W_AQ_RL:
case RISCV::AMOMAXU_W_RL:
case RISCV::AMOMAX_D:
case RISCV::AMOMAX_D_AQ:
case RISCV::AMOMAX_D_AQ_RL:
case RISCV::AMOMAX_D_RL:
case RISCV::AMOMAX_W:
case RISCV::AMOMAX_W_AQ:
case RISCV::AMOMAX_W_AQ_RL:
case RISCV::AMOMAX_W_RL:
case RISCV::AMOMINU_D:
case RISCV::AMOMINU_D_AQ:
case RISCV::AMOMINU_D_AQ_RL:
case RISCV::AMOMINU_D_RL:
case RISCV::AMOMINU_W:
case RISCV::AMOMINU_W_AQ:
case RISCV::AMOMINU_W_AQ_RL:
case RISCV::AMOMINU_W_RL:
case RISCV::AMOMIN_D:
case RISCV::AMOMIN_D_AQ:
case RISCV::AMOMIN_D_AQ_RL:
case RISCV::AMOMIN_D_RL:
case RISCV::AMOMIN_W:
case RISCV::AMOMIN_W_AQ:
case RISCV::AMOMIN_W_AQ_RL:
case RISCV::AMOMIN_W_RL:
case RISCV::AMOOR_D:
case RISCV::AMOOR_D_AQ:
case RISCV::AMOOR_D_AQ_RL:
case RISCV::AMOOR_D_RL:
case RISCV::AMOOR_W:
case RISCV::AMOOR_W_AQ:
case RISCV::AMOOR_W_AQ_RL:
case RISCV::AMOOR_W_RL:
case RISCV::AMOSWAP_D:
case RISCV::AMOSWAP_D_AQ:
case RISCV::AMOSWAP_D_AQ_RL:
case RISCV::AMOSWAP_D_RL:
case RISCV::AMOSWAP_W:
case RISCV::AMOSWAP_W_AQ:
case RISCV::AMOSWAP_W_AQ_RL:
case RISCV::AMOSWAP_W_RL:
case RISCV::AMOXOR_D:
case RISCV::AMOXOR_D_AQ:
case RISCV::AMOXOR_D_AQ_RL:
case RISCV::AMOXOR_D_RL:
case RISCV::AMOXOR_W:
case RISCV::AMOXOR_W_AQ:
case RISCV::AMOXOR_W_AQ_RL:
case RISCV::AMOXOR_W_RL:
case RISCV::AND:
case RISCV::DIV:
case RISCV::DIVU:
case RISCV::DIVUW:
case RISCV::DIVW:
case RISCV::FEQ_D:
case RISCV::FEQ_S:
case RISCV::FLE_D:
case RISCV::FLE_S:
case RISCV::FLT_D:
case RISCV::FLT_S:
case RISCV::FMAX_D:
case RISCV::FMAX_S:
case RISCV::FMIN_D:
case RISCV::FMIN_S:
case RISCV::FSGNJN_D:
case RISCV::FSGNJN_S:
case RISCV::FSGNJX_D:
case RISCV::FSGNJX_S:
case RISCV::FSGNJ_D:
case RISCV::FSGNJ_S:
case RISCV::MUL:
case RISCV::MULH:
case RISCV::MULHSU:
case RISCV::MULHU:
case RISCV::MULW:
case RISCV::OR:
case RISCV::REM:
case RISCV::REMU:
case RISCV::REMUW:
case RISCV::REMW:
case RISCV::SC_D:
case RISCV::SC_D_AQ:
case RISCV::SC_D_AQ_RL:
case RISCV::SC_D_RL:
case RISCV::SC_W:
case RISCV::SC_W_AQ:
case RISCV::SC_W_AQ_RL:
case RISCV::SC_W_RL:
case RISCV::SLL:
case RISCV::SLLW:
case RISCV::SLT:
case RISCV::SLTU:
case RISCV::SRA:
case RISCV::SRAW:
case RISCV::SRL:
case RISCV::SRLW:
case RISCV::SUB:
case RISCV::SUBW:
case RISCV::XOR: {
// op: rs2
op = getMachineOpValue(MI, MI.getOperand(2), Fixups, STI);
op &= UINT64_C(31);
op <<= 20;
Value |= op;
// op: rs1
op = getMachineOpValue(MI, MI.getOperand(1), Fixups, STI);
op &= UINT64_C(31);
op <<= 15;
Value |= op;
// op: rd
op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
op &= UINT64_C(31);
op <<= 7;
Value |= op;
break;
}
case RISCV::C_ADD_HINT: {
// op: rs2
op = getMachineOpValue(MI, MI.getOperand(2), Fixups, STI);
op &= UINT64_C(31);
op <<= 2;
Value |= op;
break;
}
case RISCV::C_ADDW:
case RISCV::C_AND:
case RISCV::C_OR:
case RISCV::C_SUB:
case RISCV::C_SUBW:
case RISCV::C_XOR: {
// op: rs2
op = getMachineOpValue(MI, MI.getOperand(2), Fixups, STI);
op &= UINT64_C(7);
op <<= 2;
Value |= op;
// op: rd
op = getMachineOpValue(MI, MI.getOperand(1), Fixups, STI);
op &= UINT64_C(7);
op <<= 7;
Value |= op;
break;
}
case RISCV::FMADD_D:
case RISCV::FMADD_S:
case RISCV::FMSUB_D:
case RISCV::FMSUB_S:
case RISCV::FNMADD_D:
case RISCV::FNMADD_S:
case RISCV::FNMSUB_D:
case RISCV::FNMSUB_S: {
// op: rs3
op = getMachineOpValue(MI, MI.getOperand(3), Fixups, STI);
op &= UINT64_C(31);
op <<= 27;
Value |= op;
// op: rs2
op = getMachineOpValue(MI, MI.getOperand(2), Fixups, STI);
op &= UINT64_C(31);
op <<= 20;
Value |= op;
// op: rs1
op = getMachineOpValue(MI, MI.getOperand(1), Fixups, STI);
op &= UINT64_C(31);
op <<= 15;
Value |= op;
// op: funct3
op = getMachineOpValue(MI, MI.getOperand(4), Fixups, STI);
op &= UINT64_C(7);
op <<= 12;
Value |= op;
// op: rd
op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
op &= UINT64_C(31);
op <<= 7;
Value |= op;
break;
}
case RISCV::SLLIW:
case RISCV::SRAIW:
case RISCV::SRLIW: {
// op: shamt
op = getMachineOpValue(MI, MI.getOperand(2), Fixups, STI);
op &= UINT64_C(31);
op <<= 20;
Value |= op;
// op: rs1
op = getMachineOpValue(MI, MI.getOperand(1), Fixups, STI);
op &= UINT64_C(31);
op <<= 15;
Value |= op;
// op: rd
op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
op &= UINT64_C(31);
op <<= 7;
Value |= op;
break;
}
case RISCV::SLLI:
case RISCV::SRAI:
case RISCV::SRLI: {
// op: shamt
op = getMachineOpValue(MI, MI.getOperand(2), Fixups, STI);
op &= UINT64_C(63);
op <<= 20;
Value |= op;
// op: rs1
op = getMachineOpValue(MI, MI.getOperand(1), Fixups, STI);
op &= UINT64_C(31);
op <<= 15;
Value |= op;
// op: rd
op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
op &= UINT64_C(31);
op <<= 7;
Value |= op;
break;
}
default:
std::string msg;
raw_string_ostream Msg(msg);
Msg << "Not supported instr: " << MI;
report_fatal_error(Msg.str());
}
return Value;
}
#ifdef ENABLE_INSTR_PREDICATE_VERIFIER
#undef ENABLE_INSTR_PREDICATE_VERIFIER
#include <sstream>
// Bits for subtarget features that participate in instruction matching.
enum SubtargetFeatureBits : uint8_t {
Feature_HasStdExtMBit = 5,
Feature_HasStdExtABit = 1,
Feature_HasStdExtFBit = 4,
Feature_HasStdExtDBit = 3,
Feature_HasStdExtCBit = 2,
Feature_HasRVCHintsBit = 0,
Feature_IsRV64Bit = 8,
Feature_IsRV32Bit = 6,
Feature_IsRV32EBit = 7,
};
#ifndef NDEBUG
static const char *SubtargetFeatureNames[] = {
"Feature_HasRVCHints",
"Feature_HasStdExtA",
"Feature_HasStdExtC",
"Feature_HasStdExtD",
"Feature_HasStdExtF",
"Feature_HasStdExtM",
"Feature_IsRV32",
"Feature_IsRV32E",
"Feature_IsRV64",
nullptr
};
#endif // NDEBUG
FeatureBitset RISCVMCCodeEmitter::
computeAvailableFeatures(const FeatureBitset& FB) const {
FeatureBitset Features;
if ((FB[RISCV::FeatureStdExtM]))
Features.set(Feature_HasStdExtMBit);
if ((FB[RISCV::FeatureStdExtA]))
Features.set(Feature_HasStdExtABit);
if ((FB[RISCV::FeatureStdExtF]))
Features.set(Feature_HasStdExtFBit);
if ((FB[RISCV::FeatureStdExtD]))
Features.set(Feature_HasStdExtDBit);
if ((FB[RISCV::FeatureStdExtC]))
Features.set(Feature_HasStdExtCBit);
if ((FB[RISCV::FeatureRVCHints]))
Features.set(Feature_HasRVCHintsBit);
if ((FB[RISCV::Feature64Bit]))
Features.set(Feature_IsRV64Bit);
if ((!FB[RISCV::Feature64Bit]))
Features.set(Feature_IsRV32Bit);
if ((FB[RISCV::FeatureRV32E]))
Features.set(Feature_IsRV32EBit);
return Features;
}
#ifndef NDEBUG
// Feature bitsets.
enum : uint8_t {
CEFBS_None,
CEFBS_HasStdExtA,
CEFBS_HasStdExtC,
CEFBS_HasStdExtD,
CEFBS_HasStdExtF,
CEFBS_HasStdExtM,
CEFBS_IsRV32,
CEFBS_IsRV64,
CEFBS_HasStdExtA_IsRV64,
CEFBS_HasStdExtC_HasRVCHints,
CEFBS_HasStdExtC_HasStdExtD,
CEFBS_HasStdExtC_IsRV32,
CEFBS_HasStdExtC_IsRV64,
CEFBS_HasStdExtD_IsRV64,
CEFBS_HasStdExtF_IsRV64,
CEFBS_HasStdExtM_IsRV64,
CEFBS_HasStdExtC_HasStdExtF_IsRV32,
};
static constexpr FeatureBitset FeatureBitsets[] = {
{}, // CEFBS_None
{Feature_HasStdExtABit, },
{Feature_HasStdExtCBit, },
{Feature_HasStdExtDBit, },
{Feature_HasStdExtFBit, },
{Feature_HasStdExtMBit, },
{Feature_IsRV32Bit, },
{Feature_IsRV64Bit, },
{Feature_HasStdExtABit, Feature_IsRV64Bit, },
{Feature_HasStdExtCBit, Feature_HasRVCHintsBit, },
{Feature_HasStdExtCBit, Feature_HasStdExtDBit, },
{Feature_HasStdExtCBit, Feature_IsRV32Bit, },
{Feature_HasStdExtCBit, Feature_IsRV64Bit, },
{Feature_HasStdExtDBit, Feature_IsRV64Bit, },
{Feature_HasStdExtFBit, Feature_IsRV64Bit, },
{Feature_HasStdExtMBit, Feature_IsRV64Bit, },
{Feature_HasStdExtCBit, Feature_HasStdExtFBit, Feature_IsRV32Bit, },
};
#endif // NDEBUG
void RISCVMCCodeEmitter::verifyInstructionPredicates(
const MCInst &Inst, const FeatureBitset &AvailableFeatures) const {
#ifndef NDEBUG
static uint8_t RequiredFeaturesRefs[] = {
CEFBS_None, // PHI = 0
CEFBS_None, // INLINEASM = 1
CEFBS_None, // INLINEASM_BR = 2
CEFBS_None, // CFI_INSTRUCTION = 3
CEFBS_None, // EH_LABEL = 4
CEFBS_None, // GC_LABEL = 5
CEFBS_None, // ANNOTATION_LABEL = 6
CEFBS_None, // KILL = 7
CEFBS_None, // EXTRACT_SUBREG = 8
CEFBS_None, // INSERT_SUBREG = 9
CEFBS_None, // IMPLICIT_DEF = 10
CEFBS_None, // SUBREG_TO_REG = 11
CEFBS_None, // COPY_TO_REGCLASS = 12
CEFBS_None, // DBG_VALUE = 13
CEFBS_None, // DBG_LABEL = 14
CEFBS_None, // REG_SEQUENCE = 15
CEFBS_None, // COPY = 16
CEFBS_None, // BUNDLE = 17
CEFBS_None, // LIFETIME_START = 18
CEFBS_None, // LIFETIME_END = 19
CEFBS_None, // STACKMAP = 20
CEFBS_None, // FENTRY_CALL = 21
CEFBS_None, // PATCHPOINT = 22
CEFBS_None, // LOAD_STACK_GUARD = 23
CEFBS_None, // STATEPOINT = 24
CEFBS_None, // LOCAL_ESCAPE = 25
CEFBS_None, // FAULTING_OP = 26
CEFBS_None, // PATCHABLE_OP = 27
CEFBS_None, // PATCHABLE_FUNCTION_ENTER = 28
CEFBS_None, // PATCHABLE_RET = 29
CEFBS_None, // PATCHABLE_FUNCTION_EXIT = 30
CEFBS_None, // PATCHABLE_TAIL_CALL = 31
CEFBS_None, // PATCHABLE_EVENT_CALL = 32
CEFBS_None, // PATCHABLE_TYPED_EVENT_CALL = 33
CEFBS_None, // ICALL_BRANCH_FUNNEL = 34
CEFBS_None, // G_ADD = 35
CEFBS_None, // G_SUB = 36
CEFBS_None, // G_MUL = 37
CEFBS_None, // G_SDIV = 38
CEFBS_None, // G_UDIV = 39
CEFBS_None, // G_SREM = 40
CEFBS_None, // G_UREM = 41
CEFBS_None, // G_AND = 42
CEFBS_None, // G_OR = 43
CEFBS_None, // G_XOR = 44
CEFBS_None, // G_IMPLICIT_DEF = 45
CEFBS_None, // G_PHI = 46
CEFBS_None, // G_FRAME_INDEX = 47
CEFBS_None, // G_GLOBAL_VALUE = 48
CEFBS_None, // G_EXTRACT = 49
CEFBS_None, // G_UNMERGE_VALUES = 50
CEFBS_None, // G_INSERT = 51
CEFBS_None, // G_MERGE_VALUES = 52
CEFBS_None, // G_BUILD_VECTOR = 53
CEFBS_None, // G_BUILD_VECTOR_TRUNC = 54
CEFBS_None, // G_CONCAT_VECTORS = 55
CEFBS_None, // G_PTRTOINT = 56
CEFBS_None, // G_INTTOPTR = 57
CEFBS_None, // G_BITCAST = 58
CEFBS_None, // G_INTRINSIC_TRUNC = 59
CEFBS_None, // G_INTRINSIC_ROUND = 60
CEFBS_None, // G_READCYCLECOUNTER = 61
CEFBS_None, // G_LOAD = 62
CEFBS_None, // G_SEXTLOAD = 63
CEFBS_None, // G_ZEXTLOAD = 64
CEFBS_None, // G_INDEXED_LOAD = 65
CEFBS_None, // G_INDEXED_SEXTLOAD = 66
CEFBS_None, // G_INDEXED_ZEXTLOAD = 67
CEFBS_None, // G_STORE = 68
CEFBS_None, // G_INDEXED_STORE = 69
CEFBS_None, // G_ATOMIC_CMPXCHG_WITH_SUCCESS = 70
CEFBS_None, // G_ATOMIC_CMPXCHG = 71
CEFBS_None, // G_ATOMICRMW_XCHG = 72
CEFBS_None, // G_ATOMICRMW_ADD = 73
CEFBS_None, // G_ATOMICRMW_SUB = 74
CEFBS_None, // G_ATOMICRMW_AND = 75
CEFBS_None, // G_ATOMICRMW_NAND = 76
CEFBS_None, // G_ATOMICRMW_OR = 77
CEFBS_None, // G_ATOMICRMW_XOR = 78
CEFBS_None, // G_ATOMICRMW_MAX = 79
CEFBS_None, // G_ATOMICRMW_MIN = 80
CEFBS_None, // G_ATOMICRMW_UMAX = 81
CEFBS_None, // G_ATOMICRMW_UMIN = 82
CEFBS_None, // G_ATOMICRMW_FADD = 83
CEFBS_None, // G_ATOMICRMW_FSUB = 84
CEFBS_None, // G_FENCE = 85
CEFBS_None, // G_BRCOND = 86
CEFBS_None, // G_BRINDIRECT = 87
CEFBS_None, // G_INTRINSIC = 88
CEFBS_None, // G_INTRINSIC_W_SIDE_EFFECTS = 89
CEFBS_None, // G_ANYEXT = 90
CEFBS_None, // G_TRUNC = 91
CEFBS_None, // G_CONSTANT = 92
CEFBS_None, // G_FCONSTANT = 93
CEFBS_None, // G_VASTART = 94
CEFBS_None, // G_VAARG = 95
CEFBS_None, // G_SEXT = 96
CEFBS_None, // G_SEXT_INREG = 97
CEFBS_None, // G_ZEXT = 98
CEFBS_None, // G_SHL = 99
CEFBS_None, // G_LSHR = 100
CEFBS_None, // G_ASHR = 101
CEFBS_None, // G_ICMP = 102
CEFBS_None, // G_FCMP = 103
CEFBS_None, // G_SELECT = 104
CEFBS_None, // G_UADDO = 105
CEFBS_None, // G_UADDE = 106
CEFBS_None, // G_USUBO = 107
CEFBS_None, // G_USUBE = 108
CEFBS_None, // G_SADDO = 109
CEFBS_None, // G_SADDE = 110
CEFBS_None, // G_SSUBO = 111
CEFBS_None, // G_SSUBE = 112
CEFBS_None, // G_UMULO = 113
CEFBS_None, // G_SMULO = 114
CEFBS_None, // G_UMULH = 115
CEFBS_None, // G_SMULH = 116
CEFBS_None, // G_FADD = 117
CEFBS_None, // G_FSUB = 118
CEFBS_None, // G_FMUL = 119
CEFBS_None, // G_FMA = 120
CEFBS_None, // G_FMAD = 121
CEFBS_None, // G_FDIV = 122
CEFBS_None, // G_FREM = 123
CEFBS_None, // G_FPOW = 124
CEFBS_None, // G_FEXP = 125
CEFBS_None, // G_FEXP2 = 126
CEFBS_None, // G_FLOG = 127
CEFBS_None, // G_FLOG2 = 128
CEFBS_None, // G_FLOG10 = 129
CEFBS_None, // G_FNEG = 130
CEFBS_None, // G_FPEXT = 131
CEFBS_None, // G_FPTRUNC = 132
CEFBS_None, // G_FPTOSI = 133
CEFBS_None, // G_FPTOUI = 134
CEFBS_None, // G_SITOFP = 135
CEFBS_None, // G_UITOFP = 136
CEFBS_None, // G_FABS = 137
CEFBS_None, // G_FCOPYSIGN = 138
CEFBS_None, // G_FCANONICALIZE = 139
CEFBS_None, // G_FMINNUM = 140
CEFBS_None, // G_FMAXNUM = 141
CEFBS_None, // G_FMINNUM_IEEE = 142
CEFBS_None, // G_FMAXNUM_IEEE = 143
CEFBS_None, // G_FMINIMUM = 144
CEFBS_None, // G_FMAXIMUM = 145
CEFBS_None, // G_PTR_ADD = 146
CEFBS_None, // G_PTR_MASK = 147
CEFBS_None, // G_SMIN = 148
CEFBS_None, // G_SMAX = 149
CEFBS_None, // G_UMIN = 150
CEFBS_None, // G_UMAX = 151
CEFBS_None, // G_BR = 152
CEFBS_None, // G_BRJT = 153
CEFBS_None, // G_INSERT_VECTOR_ELT = 154
CEFBS_None, // G_EXTRACT_VECTOR_ELT = 155
CEFBS_None, // G_SHUFFLE_VECTOR = 156
CEFBS_None, // G_CTTZ = 157
CEFBS_None, // G_CTTZ_ZERO_UNDEF = 158
CEFBS_None, // G_CTLZ = 159
CEFBS_None, // G_CTLZ_ZERO_UNDEF = 160
CEFBS_None, // G_CTPOP = 161
CEFBS_None, // G_BSWAP = 162
CEFBS_None, // G_BITREVERSE = 163
CEFBS_None, // G_FCEIL = 164
CEFBS_None, // G_FCOS = 165
CEFBS_None, // G_FSIN = 166
CEFBS_None, // G_FSQRT = 167
CEFBS_None, // G_FFLOOR = 168
CEFBS_None, // G_FRINT = 169
CEFBS_None, // G_FNEARBYINT = 170
CEFBS_None, // G_ADDRSPACE_CAST = 171
CEFBS_None, // G_BLOCK_ADDR = 172
CEFBS_None, // G_JUMP_TABLE = 173
CEFBS_None, // G_DYN_STACKALLOC = 174
CEFBS_None, // G_READ_REGISTER = 175
CEFBS_None, // G_WRITE_REGISTER = 176
CEFBS_None, // ADJCALLSTACKDOWN = 177
CEFBS_None, // ADJCALLSTACKUP = 178
CEFBS_HasStdExtD, // BuildPairF64Pseudo = 179
CEFBS_None, // PseudoAddTPRel = 180
CEFBS_HasStdExtA, // PseudoAtomicLoadNand32 = 181
CEFBS_HasStdExtA_IsRV64, // PseudoAtomicLoadNand64 = 182
CEFBS_None, // PseudoBR = 183
CEFBS_None, // PseudoBRIND = 184
CEFBS_None, // PseudoCALL = 185
CEFBS_None, // PseudoCALLIndirect = 186
CEFBS_None, // PseudoCALLReg = 187
CEFBS_HasStdExtA, // PseudoCmpXchg32 = 188
CEFBS_HasStdExtA_IsRV64, // PseudoCmpXchg64 = 189
CEFBS_HasStdExtD, // PseudoFLD = 190
CEFBS_HasStdExtF, // PseudoFLW = 191
CEFBS_HasStdExtD, // PseudoFSD = 192
CEFBS_HasStdExtF, // PseudoFSW = 193
CEFBS_None, // PseudoLA = 194
CEFBS_None, // PseudoLA_TLS_GD = 195
CEFBS_None, // PseudoLA_TLS_IE = 196
CEFBS_None, // PseudoLB = 197
CEFBS_None, // PseudoLBU = 198
CEFBS_IsRV64, // PseudoLD = 199
CEFBS_None, // PseudoLH = 200
CEFBS_None, // PseudoLHU = 201
CEFBS_None, // PseudoLI = 202
CEFBS_None, // PseudoLLA = 203
CEFBS_None, // PseudoLW = 204
CEFBS_IsRV64, // PseudoLWU = 205
CEFBS_HasStdExtA, // PseudoMaskedAtomicLoadAdd32 = 206
CEFBS_HasStdExtA, // PseudoMaskedAtomicLoadMax32 = 207
CEFBS_HasStdExtA, // PseudoMaskedAtomicLoadMin32 = 208
CEFBS_HasStdExtA, // PseudoMaskedAtomicLoadNand32 = 209
CEFBS_HasStdExtA, // PseudoMaskedAtomicLoadSub32 = 210
CEFBS_HasStdExtA, // PseudoMaskedAtomicLoadUMax32 = 211
CEFBS_HasStdExtA, // PseudoMaskedAtomicLoadUMin32 = 212
CEFBS_HasStdExtA, // PseudoMaskedAtomicSwap32 = 213
CEFBS_HasStdExtA, // PseudoMaskedCmpXchg32 = 214
CEFBS_None, // PseudoRET = 215
CEFBS_None, // PseudoSB = 216
CEFBS_IsRV64, // PseudoSD = 217
CEFBS_None, // PseudoSH = 218
CEFBS_None, // PseudoSW = 219
CEFBS_None, // PseudoTAIL = 220
CEFBS_None, // PseudoTAILIndirect = 221
CEFBS_IsRV32, // ReadCycleWide = 222
CEFBS_HasStdExtF, // Select_FPR32_Using_CC_GPR = 223
CEFBS_HasStdExtD, // Select_FPR64_Using_CC_GPR = 224
CEFBS_None, // Select_GPR_Using_CC_GPR = 225
CEFBS_HasStdExtD, // SplitF64Pseudo = 226
CEFBS_None, // ADD = 227
CEFBS_None, // ADDI = 228
CEFBS_IsRV64, // ADDIW = 229
CEFBS_IsRV64, // ADDW = 230
CEFBS_HasStdExtA_IsRV64, // AMOADD_D = 231
CEFBS_HasStdExtA_IsRV64, // AMOADD_D_AQ = 232
CEFBS_HasStdExtA_IsRV64, // AMOADD_D_AQ_RL = 233
CEFBS_HasStdExtA_IsRV64, // AMOADD_D_RL = 234
CEFBS_HasStdExtA, // AMOADD_W = 235
CEFBS_HasStdExtA, // AMOADD_W_AQ = 236
CEFBS_HasStdExtA, // AMOADD_W_AQ_RL = 237
CEFBS_HasStdExtA, // AMOADD_W_RL = 238
CEFBS_HasStdExtA_IsRV64, // AMOAND_D = 239
CEFBS_HasStdExtA_IsRV64, // AMOAND_D_AQ = 240
CEFBS_HasStdExtA_IsRV64, // AMOAND_D_AQ_RL = 241
CEFBS_HasStdExtA_IsRV64, // AMOAND_D_RL = 242
CEFBS_HasStdExtA, // AMOAND_W = 243
CEFBS_HasStdExtA, // AMOAND_W_AQ = 244
CEFBS_HasStdExtA, // AMOAND_W_AQ_RL = 245
CEFBS_HasStdExtA, // AMOAND_W_RL = 246
CEFBS_HasStdExtA_IsRV64, // AMOMAXU_D = 247
CEFBS_HasStdExtA_IsRV64, // AMOMAXU_D_AQ = 248
CEFBS_HasStdExtA_IsRV64, // AMOMAXU_D_AQ_RL = 249
CEFBS_HasStdExtA_IsRV64, // AMOMAXU_D_RL = 250
CEFBS_HasStdExtA, // AMOMAXU_W = 251
CEFBS_HasStdExtA, // AMOMAXU_W_AQ = 252
CEFBS_HasStdExtA, // AMOMAXU_W_AQ_RL = 253
CEFBS_HasStdExtA, // AMOMAXU_W_RL = 254
CEFBS_HasStdExtA_IsRV64, // AMOMAX_D = 255
CEFBS_HasStdExtA_IsRV64, // AMOMAX_D_AQ = 256
CEFBS_HasStdExtA_IsRV64, // AMOMAX_D_AQ_RL = 257
CEFBS_HasStdExtA_IsRV64, // AMOMAX_D_RL = 258
CEFBS_HasStdExtA, // AMOMAX_W = 259
CEFBS_HasStdExtA, // AMOMAX_W_AQ = 260
CEFBS_HasStdExtA, // AMOMAX_W_AQ_RL = 261
CEFBS_HasStdExtA, // AMOMAX_W_RL = 262
CEFBS_HasStdExtA_IsRV64, // AMOMINU_D = 263
CEFBS_HasStdExtA_IsRV64, // AMOMINU_D_AQ = 264
CEFBS_HasStdExtA_IsRV64, // AMOMINU_D_AQ_RL = 265
CEFBS_HasStdExtA_IsRV64, // AMOMINU_D_RL = 266
CEFBS_HasStdExtA, // AMOMINU_W = 267
CEFBS_HasStdExtA, // AMOMINU_W_AQ = 268
CEFBS_HasStdExtA, // AMOMINU_W_AQ_RL = 269
CEFBS_HasStdExtA, // AMOMINU_W_RL = 270
CEFBS_HasStdExtA_IsRV64, // AMOMIN_D = 271
CEFBS_HasStdExtA_IsRV64, // AMOMIN_D_AQ = 272
CEFBS_HasStdExtA_IsRV64, // AMOMIN_D_AQ_RL = 273
CEFBS_HasStdExtA_IsRV64, // AMOMIN_D_RL = 274
CEFBS_HasStdExtA, // AMOMIN_W = 275
CEFBS_HasStdExtA, // AMOMIN_W_AQ = 276
CEFBS_HasStdExtA, // AMOMIN_W_AQ_RL = 277
CEFBS_HasStdExtA, // AMOMIN_W_RL = 278
CEFBS_HasStdExtA_IsRV64, // AMOOR_D = 279
CEFBS_HasStdExtA_IsRV64, // AMOOR_D_AQ = 280
CEFBS_HasStdExtA_IsRV64, // AMOOR_D_AQ_RL = 281
CEFBS_HasStdExtA_IsRV64, // AMOOR_D_RL = 282
CEFBS_HasStdExtA, // AMOOR_W = 283
CEFBS_HasStdExtA, // AMOOR_W_AQ = 284
CEFBS_HasStdExtA, // AMOOR_W_AQ_RL = 285
CEFBS_HasStdExtA, // AMOOR_W_RL = 286
CEFBS_HasStdExtA_IsRV64, // AMOSWAP_D = 287
CEFBS_HasStdExtA_IsRV64, // AMOSWAP_D_AQ = 288
CEFBS_HasStdExtA_IsRV64, // AMOSWAP_D_AQ_RL = 289
CEFBS_HasStdExtA_IsRV64, // AMOSWAP_D_RL = 290
CEFBS_HasStdExtA, // AMOSWAP_W = 291
CEFBS_HasStdExtA, // AMOSWAP_W_AQ = 292
CEFBS_HasStdExtA, // AMOSWAP_W_AQ_RL = 293
CEFBS_HasStdExtA, // AMOSWAP_W_RL = 294
CEFBS_HasStdExtA_IsRV64, // AMOXOR_D = 295
CEFBS_HasStdExtA_IsRV64, // AMOXOR_D_AQ = 296
CEFBS_HasStdExtA_IsRV64, // AMOXOR_D_AQ_RL = 297
CEFBS_HasStdExtA_IsRV64, // AMOXOR_D_RL = 298
CEFBS_HasStdExtA, // AMOXOR_W = 299
CEFBS_HasStdExtA, // AMOXOR_W_AQ = 300
CEFBS_HasStdExtA, // AMOXOR_W_AQ_RL = 301
CEFBS_HasStdExtA, // AMOXOR_W_RL = 302
CEFBS_None, // AND = 303
CEFBS_None, // ANDI = 304
CEFBS_None, // AUIPC = 305
CEFBS_None, // BEQ = 306
CEFBS_None, // BGE = 307
CEFBS_None, // BGEU = 308
CEFBS_None, // BLT = 309
CEFBS_None, // BLTU = 310
CEFBS_None, // BNE = 311
CEFBS_None, // CSRRC = 312
CEFBS_None, // CSRRCI = 313
CEFBS_None, // CSRRS = 314
CEFBS_None, // CSRRSI = 315
CEFBS_None, // CSRRW = 316
CEFBS_None, // CSRRWI = 317
CEFBS_HasStdExtC, // C_ADD = 318
CEFBS_HasStdExtC, // C_ADDI = 319
CEFBS_HasStdExtC, // C_ADDI16SP = 320
CEFBS_HasStdExtC, // C_ADDI4SPN = 321
CEFBS_HasStdExtC_IsRV64, // C_ADDIW = 322
CEFBS_HasStdExtC_HasRVCHints, // C_ADDI_HINT_IMM_ZERO = 323
CEFBS_HasStdExtC_HasRVCHints, // C_ADDI_HINT_X0 = 324
CEFBS_HasStdExtC, // C_ADDI_NOP = 325
CEFBS_HasStdExtC_IsRV64, // C_ADDW = 326
CEFBS_HasStdExtC_HasRVCHints, // C_ADD_HINT = 327
CEFBS_HasStdExtC, // C_AND = 328
CEFBS_HasStdExtC, // C_ANDI = 329
CEFBS_HasStdExtC, // C_BEQZ = 330
CEFBS_HasStdExtC, // C_BNEZ = 331
CEFBS_HasStdExtC, // C_EBREAK = 332
CEFBS_HasStdExtC_HasStdExtD, // C_FLD = 333
CEFBS_HasStdExtC_HasStdExtD, // C_FLDSP = 334
CEFBS_HasStdExtC_HasStdExtF_IsRV32, // C_FLW = 335
CEFBS_HasStdExtC_HasStdExtF_IsRV32, // C_FLWSP = 336
CEFBS_HasStdExtC_HasStdExtD, // C_FSD = 337
CEFBS_HasStdExtC_HasStdExtD, // C_FSDSP = 338
CEFBS_HasStdExtC_HasStdExtF_IsRV32, // C_FSW = 339
CEFBS_HasStdExtC_HasStdExtF_IsRV32, // C_FSWSP = 340
CEFBS_HasStdExtC, // C_J = 341
CEFBS_HasStdExtC_IsRV32, // C_JAL = 342
CEFBS_HasStdExtC, // C_JALR = 343
CEFBS_HasStdExtC, // C_JR = 344
CEFBS_HasStdExtC_IsRV64, // C_LD = 345
CEFBS_HasStdExtC_IsRV64, // C_LDSP = 346
CEFBS_HasStdExtC, // C_LI = 347
CEFBS_HasStdExtC_HasRVCHints, // C_LI_HINT = 348
CEFBS_HasStdExtC, // C_LUI = 349
CEFBS_HasStdExtC_HasRVCHints, // C_LUI_HINT = 350
CEFBS_HasStdExtC, // C_LW = 351
CEFBS_HasStdExtC, // C_LWSP = 352
CEFBS_HasStdExtC, // C_MV = 353
CEFBS_HasStdExtC_HasRVCHints, // C_MV_HINT = 354
CEFBS_HasStdExtC, // C_NOP = 355
CEFBS_HasStdExtC_HasRVCHints, // C_NOP_HINT = 356
CEFBS_HasStdExtC, // C_OR = 357
CEFBS_HasStdExtC_IsRV64, // C_SD = 358
CEFBS_HasStdExtC_IsRV64, // C_SDSP = 359
CEFBS_HasStdExtC, // C_SLLI = 360
CEFBS_HasStdExtC_HasRVCHints, // C_SLLI64_HINT = 361
CEFBS_HasStdExtC_HasRVCHints, // C_SLLI_HINT = 362
CEFBS_HasStdExtC, // C_SRAI = 363
CEFBS_HasStdExtC_HasRVCHints, // C_SRAI64_HINT = 364
CEFBS_HasStdExtC, // C_SRLI = 365
CEFBS_HasStdExtC_HasRVCHints, // C_SRLI64_HINT = 366
CEFBS_HasStdExtC, // C_SUB = 367
CEFBS_HasStdExtC_IsRV64, // C_SUBW = 368
CEFBS_HasStdExtC, // C_SW = 369
CEFBS_HasStdExtC, // C_SWSP = 370
CEFBS_HasStdExtC, // C_UNIMP = 371
CEFBS_HasStdExtC, // C_XOR = 372
CEFBS_HasStdExtM, // DIV = 373
CEFBS_HasStdExtM, // DIVU = 374
CEFBS_HasStdExtM_IsRV64, // DIVUW = 375
CEFBS_HasStdExtM_IsRV64, // DIVW = 376
CEFBS_None, // EBREAK = 377
CEFBS_None, // ECALL = 378
CEFBS_HasStdExtD, // FADD_D = 379
CEFBS_HasStdExtF, // FADD_S = 380
CEFBS_HasStdExtD, // FCLASS_D = 381
CEFBS_HasStdExtF, // FCLASS_S = 382
CEFBS_HasStdExtD_IsRV64, // FCVT_D_L = 383
CEFBS_HasStdExtD_IsRV64, // FCVT_D_LU = 384
CEFBS_HasStdExtD, // FCVT_D_S = 385
CEFBS_HasStdExtD, // FCVT_D_W = 386
CEFBS_HasStdExtD, // FCVT_D_WU = 387
CEFBS_HasStdExtD_IsRV64, // FCVT_LU_D = 388
CEFBS_HasStdExtF_IsRV64, // FCVT_LU_S = 389
CEFBS_HasStdExtD_IsRV64, // FCVT_L_D = 390
CEFBS_HasStdExtF_IsRV64, // FCVT_L_S = 391
CEFBS_HasStdExtD, // FCVT_S_D = 392
CEFBS_HasStdExtF_IsRV64, // FCVT_S_L = 393
CEFBS_HasStdExtF_IsRV64, // FCVT_S_LU = 394
CEFBS_HasStdExtF, // FCVT_S_W = 395
CEFBS_HasStdExtF, // FCVT_S_WU = 396
CEFBS_HasStdExtD, // FCVT_WU_D = 397
CEFBS_HasStdExtF, // FCVT_WU_S = 398
CEFBS_HasStdExtD, // FCVT_W_D = 399
CEFBS_HasStdExtF, // FCVT_W_S = 400
CEFBS_HasStdExtD, // FDIV_D = 401
CEFBS_HasStdExtF, // FDIV_S = 402
CEFBS_None, // FENCE = 403
CEFBS_None, // FENCE_I = 404
CEFBS_None, // FENCE_TSO = 405
CEFBS_HasStdExtD, // FEQ_D = 406
CEFBS_HasStdExtF, // FEQ_S = 407
CEFBS_HasStdExtD, // FLD = 408
CEFBS_HasStdExtD, // FLE_D = 409
CEFBS_HasStdExtF, // FLE_S = 410
CEFBS_HasStdExtD, // FLT_D = 411
CEFBS_HasStdExtF, // FLT_S = 412
CEFBS_HasStdExtF, // FLW = 413
CEFBS_HasStdExtD, // FMADD_D = 414
CEFBS_HasStdExtF, // FMADD_S = 415
CEFBS_HasStdExtD, // FMAX_D = 416
CEFBS_HasStdExtF, // FMAX_S = 417
CEFBS_HasStdExtD, // FMIN_D = 418
CEFBS_HasStdExtF, // FMIN_S = 419
CEFBS_HasStdExtD, // FMSUB_D = 420
CEFBS_HasStdExtF, // FMSUB_S = 421
CEFBS_HasStdExtD, // FMUL_D = 422
CEFBS_HasStdExtF, // FMUL_S = 423
CEFBS_HasStdExtD_IsRV64, // FMV_D_X = 424
CEFBS_HasStdExtF, // FMV_W_X = 425
CEFBS_HasStdExtD_IsRV64, // FMV_X_D = 426
CEFBS_HasStdExtF, // FMV_X_W = 427
CEFBS_HasStdExtD, // FNMADD_D = 428
CEFBS_HasStdExtF, // FNMADD_S = 429
CEFBS_HasStdExtD, // FNMSUB_D = 430
CEFBS_HasStdExtF, // FNMSUB_S = 431
CEFBS_HasStdExtD, // FSD = 432
CEFBS_HasStdExtD, // FSGNJN_D = 433
CEFBS_HasStdExtF, // FSGNJN_S = 434
CEFBS_HasStdExtD, // FSGNJX_D = 435
CEFBS_HasStdExtF, // FSGNJX_S = 436
CEFBS_HasStdExtD, // FSGNJ_D = 437
CEFBS_HasStdExtF, // FSGNJ_S = 438
CEFBS_HasStdExtD, // FSQRT_D = 439
CEFBS_HasStdExtF, // FSQRT_S = 440
CEFBS_HasStdExtD, // FSUB_D = 441
CEFBS_HasStdExtF, // FSUB_S = 442
CEFBS_HasStdExtF, // FSW = 443
CEFBS_None, // JAL = 444
CEFBS_None, // JALR = 445
CEFBS_None, // LB = 446
CEFBS_None, // LBU = 447
CEFBS_IsRV64, // LD = 448
CEFBS_None, // LH = 449
CEFBS_None, // LHU = 450
CEFBS_HasStdExtA_IsRV64, // LR_D = 451
CEFBS_HasStdExtA_IsRV64, // LR_D_AQ = 452
CEFBS_HasStdExtA_IsRV64, // LR_D_AQ_RL = 453
CEFBS_HasStdExtA_IsRV64, // LR_D_RL = 454
CEFBS_HasStdExtA, // LR_W = 455
CEFBS_HasStdExtA, // LR_W_AQ = 456
CEFBS_HasStdExtA, // LR_W_AQ_RL = 457
CEFBS_HasStdExtA, // LR_W_RL = 458
CEFBS_None, // LUI = 459
CEFBS_None, // LW = 460
CEFBS_IsRV64, // LWU = 461
CEFBS_None, // MRET = 462
CEFBS_HasStdExtM, // MUL = 463
CEFBS_HasStdExtM, // MULH = 464
CEFBS_HasStdExtM, // MULHSU = 465
CEFBS_HasStdExtM, // MULHU = 466
CEFBS_HasStdExtM_IsRV64, // MULW = 467
CEFBS_None, // OR = 468
CEFBS_None, // ORI = 469
CEFBS_HasStdExtM, // REM = 470
CEFBS_HasStdExtM, // REMU = 471
CEFBS_HasStdExtM_IsRV64, // REMUW = 472
CEFBS_HasStdExtM_IsRV64, // REMW = 473
CEFBS_None, // SB = 474
CEFBS_HasStdExtA_IsRV64, // SC_D = 475
CEFBS_HasStdExtA_IsRV64, // SC_D_AQ = 476
CEFBS_HasStdExtA_IsRV64, // SC_D_AQ_RL = 477
CEFBS_HasStdExtA_IsRV64, // SC_D_RL = 478
CEFBS_HasStdExtA, // SC_W = 479
CEFBS_HasStdExtA, // SC_W_AQ = 480
CEFBS_HasStdExtA, // SC_W_AQ_RL = 481
CEFBS_HasStdExtA, // SC_W_RL = 482
CEFBS_IsRV64, // SD = 483
CEFBS_None, // SFENCE_VMA = 484
CEFBS_None, // SH = 485
CEFBS_None, // SLL = 486
CEFBS_None, // SLLI = 487
CEFBS_IsRV64, // SLLIW = 488
CEFBS_IsRV64, // SLLW = 489
CEFBS_None, // SLT = 490
CEFBS_None, // SLTI = 491
CEFBS_None, // SLTIU = 492
CEFBS_None, // SLTU = 493
CEFBS_None, // SRA = 494
CEFBS_None, // SRAI = 495
CEFBS_IsRV64, // SRAIW = 496
CEFBS_IsRV64, // SRAW = 497
CEFBS_None, // SRET = 498
CEFBS_None, // SRL = 499
CEFBS_None, // SRLI = 500
CEFBS_IsRV64, // SRLIW = 501
CEFBS_IsRV64, // SRLW = 502
CEFBS_None, // SUB = 503
CEFBS_IsRV64, // SUBW = 504
CEFBS_None, // SW = 505
CEFBS_None, // UNIMP = 506
CEFBS_None, // URET = 507
CEFBS_None, // WFI = 508
CEFBS_None, // XOR = 509
CEFBS_None, // XORI = 510
};
assert(Inst.getOpcode() < 511);
const FeatureBitset &RequiredFeatures = FeatureBitsets[RequiredFeaturesRefs[Inst.getOpcode()]];
FeatureBitset MissingFeatures =
(AvailableFeatures & RequiredFeatures) ^
RequiredFeatures;
if (MissingFeatures.any()) {
std::ostringstream Msg;
Msg << "Attempting to emit " << MCII.getName(Inst.getOpcode()).str()
<< " instruction but the ";
for (unsigned i = 0, e = MissingFeatures.size(); i != e; ++i)
if (MissingFeatures.test(i))
Msg << SubtargetFeatureNames[i] << " ";
Msg << "predicate(s) are not met";
report_fatal_error(Msg.str());
}
#else
// Silence unused variable warning on targets that don't use MCII for other purposes (e.g. BPF).
(void)MCII;
#endif // NDEBUG
}
#endif