uint64_t LanaiMCCodeEmitter::getBinaryCodeForInstr(const MCInst &MI,
SmallVectorImpl<MCFixup> &Fixups,
const MCSubtargetInfo &STI) const { … }
#ifdef GET_OPERAND_BIT_OFFSET
#undef GET_OPERAND_BIT_OFFSET
uint32_t LanaiMCCodeEmitter::getOperandBitOffset(const MCInst &MI,
unsigned OpNum,
const MCSubtargetInfo &STI) const {
switch (MI.getOpcode()) {
case Lanai::LOG0:
case Lanai::LOG1:
case Lanai::LOG2:
case Lanai::LOG3:
case Lanai::LOG4:
case Lanai::NOP:
case Lanai::RET: {
break;
}
case Lanai::ADDC_F_R:
case Lanai::ADDC_R:
case Lanai::ADD_F_R:
case Lanai::ADD_R:
case Lanai::AND_F_R:
case Lanai::AND_R:
case Lanai::OR_F_R:
case Lanai::OR_R:
case Lanai::SELECT:
case Lanai::SHL_F_R:
case Lanai::SHL_R:
case Lanai::SRA_F_R:
case Lanai::SRA_R:
case Lanai::SRL_F_R:
case Lanai::SRL_R:
case Lanai::SUBB_F_R:
case Lanai::SUBB_R:
case Lanai::SUB_F_R:
case Lanai::SUB_R:
case Lanai::XOR_F_R:
case Lanai::XOR_R: {
switch (OpNum) {
case 0:
return 23;
case 1:
return 18;
case 2:
return 11;
case 3:
return 0;
}
break;
}
case Lanai::ADDC_F_I_HI:
case Lanai::ADDC_F_I_LO:
case Lanai::ADDC_I_HI:
case Lanai::ADDC_I_LO:
case Lanai::ADD_F_I_HI:
case Lanai::ADD_F_I_LO:
case Lanai::ADD_I_HI:
case Lanai::ADD_I_LO:
case Lanai::AND_F_I_HI:
case Lanai::AND_F_I_LO:
case Lanai::AND_I_HI:
case Lanai::AND_I_LO:
case Lanai::OR_F_I_HI:
case Lanai::OR_F_I_LO:
case Lanai::OR_I_HI:
case Lanai::OR_I_LO:
case Lanai::SA_F_I:
case Lanai::SA_I:
case Lanai::SL_F_I:
case Lanai::SL_I:
case Lanai::SUBB_F_I_HI:
case Lanai::SUBB_F_I_LO:
case Lanai::SUBB_I_HI:
case Lanai::SUBB_I_LO:
case Lanai::SUB_F_I_HI:
case Lanai::SUB_F_I_LO:
case Lanai::SUB_I_HI:
case Lanai::SUB_I_LO:
case Lanai::XOR_F_I_HI:
case Lanai::XOR_F_I_LO:
case Lanai::XOR_I_HI:
case Lanai::XOR_I_LO: {
switch (OpNum) {
case 0:
return 23;
case 1:
return 18;
case 2:
return 0;
}
break;
}
case Lanai::LEADZ:
case Lanai::POPC:
case Lanai::TRAILZ: {
switch (OpNum) {
case 0:
return 23;
case 1:
return 18;
}
break;
}
case Lanai::STADDR:
case Lanai::STB_RI:
case Lanai::STH_RI:
case Lanai::SW_RI: {
switch (OpNum) {
case 0:
return 23;
case 1:
return 0;
}
break;
}
case Lanai::STB_RR:
case Lanai::STH_RR:
case Lanai::SW_RR: {
switch (OpNum) {
case 0:
return 23;
case 1:
return 3;
}
break;
}
case Lanai::SLI: {
switch (OpNum) {
case 0:
return 23;
case 1:
return 0;
}
break;
}
case Lanai::MOVHI: {
switch (OpNum) {
case 0:
return 23;
case 1:
return 0;
}
break;
}
case Lanai::LDADDR:
case Lanai::LDBs_RI:
case Lanai::LDBz_RI:
case Lanai::LDHs_RI:
case Lanai::LDHz_RI:
case Lanai::LDW_RI: {
switch (OpNum) {
case 0:
return 23;
case 1:
return 0;
}
break;
}
case Lanai::LDBs_RR:
case Lanai::LDBz_RR:
case Lanai::LDHs_RR:
case Lanai::LDHz_RR:
case Lanai::LDW_RR:
case Lanai::LDWz_RR: {
switch (OpNum) {
case 0:
return 23;
case 1:
return 3;
}
break;
}
case Lanai::BRIND_CC:
case Lanai::SCC: {
switch (OpNum) {
case 0:
return 18;
case 1:
return 0;
}
break;
}
case Lanai::BRIND_CCA: {
switch (OpNum) {
case 0:
return 18;
case 1:
return 11;
case 2:
return 0;
}
break;
}
case Lanai::SFSUB_F_RR: {
switch (OpNum) {
case 0:
return 18;
case 1:
return 11;
}
break;
}
case Lanai::SFSUB_F_RI_HI:
case Lanai::SFSUB_F_RI_LO: {
switch (OpNum) {
case 0:
return 18;
case 1:
return 0;
}
break;
}
case Lanai::JR: {
switch (OpNum) {
case 0:
return 11;
}
break;
}
case Lanai::BRCC: {
switch (OpNum) {
case 0:
return 2;
case 1:
return 0;
}
break;
}
case Lanai::BT: {
switch (OpNum) {
case 0:
return 2;
}
break;
}
case Lanai::BRR: {
switch (OpNum) {
case 1:
return 0;
case 0:
return 2;
}
break;
}
}
std::string msg;
raw_string_ostream Msg(msg);
Msg << "Not supported instr[opcode]: " << MI << "[" << OpNum << "]";
report_fatal_error(Msg.str().c_str());
}
#endif