@@ -2187,16 +2187,25 @@ void CodeGen::genTableBasedSwitch(GenTree* treeNode)
2187
2187
regNumber idxReg = treeNode->AsOp ()->gtOp1 ->GetRegNum ();
2188
2188
regNumber baseReg = treeNode->AsOp ()->gtOp2 ->GetRegNum ();
2189
2189
2190
- regNumber tmpReg = internalRegisters.GetSingle (treeNode);
2191
-
2192
2190
// load the ip-relative offset (which is relative to start of fgFirstBB)
2193
- GetEmitter ()->emitIns_R_R_I (INS_slli, EA_8BYTE, tmpReg, idxReg, 2 );
2194
- GetEmitter ()->emitIns_R_R_R (INS_add, EA_8BYTE, baseReg, baseReg, tmpReg);
2191
+ assert (treeNode->gtGetOp2 ()->TypeIs (TYP_I_IMPL));
2192
+ if (compiler->compOpportunisticallyDependsOn (InstructionSet_Zba))
2193
+ {
2194
+ emitAttr idxSize = emitTypeSize (treeNode->gtGetOp1 ());
2195
+ instruction sh2add = (idxSize == EA_4BYTE) ? INS_sh2add_uw : INS_sh2add;
2196
+ GetEmitter ()->emitIns_R_R_R (sh2add, idxSize, baseReg, idxReg, baseReg);
2197
+ }
2198
+ else
2199
+ {
2200
+ assert (treeNode->gtGetOp1 ()->TypeIs (TYP_I_IMPL));
2201
+ GetEmitter ()->emitIns_R_R_I (INS_slli, EA_8BYTE, idxReg, idxReg, 2 );
2202
+ GetEmitter ()->emitIns_R_R_R (INS_add, EA_8BYTE, baseReg, baseReg, idxReg);
2203
+ }
2195
2204
GetEmitter ()->emitIns_R_R_I (INS_lw, EA_4BYTE, baseReg, baseReg, 0 );
2196
2205
2197
2206
// add it to the absolute address of fgFirstBB
2198
- GetEmitter ()->emitIns_R_L (INS_lea, EA_PTRSIZE, compiler->fgFirstBB , tmpReg );
2199
- GetEmitter ()->emitIns_R_R_R (INS_add, EA_PTRSIZE, baseReg, baseReg, tmpReg );
2207
+ GetEmitter ()->emitIns_R_L (INS_lea, EA_PTRSIZE, compiler->fgFirstBB , idxReg );
2208
+ GetEmitter ()->emitIns_R_R_R (INS_add, EA_PTRSIZE, baseReg, baseReg, idxReg );
2200
2209
2201
2210
// jr baseReg
2202
2211
GetEmitter ()->emitIns_R_R_I (INS_jalr, emitActualTypeSize (TYP_I_IMPL), REG_R0, baseReg, 0 );
0 commit comments