@@ -1258,19 +1258,34 @@ void emitter::emitLoadImmediate(emitAttr size, regNumber reg, ssize_t imm)
1258
1258
INT32 high19 = ((int32_t )(high31 + 0x800 )) >> 12 ;
1259
1259
1260
1260
emitIns_R_I (INS_lui, size, reg, high19);
1261
- emitIns_R_R_I (INS_addiw, size, reg, reg, high31 & 0xFFF );
1261
+ if (high31 & 0xFFF )
1262
+ {
1263
+ emitIns_R_R_I (INS_addiw, size, reg, reg, high31 & 0xFFF );
1264
+ }
1262
1265
1263
1266
// And load remaining part part by batches of 11 bits size.
1264
1267
INT32 remainingShift = msb - 30 ;
1268
+
1269
+ UINT32 shiftAccumulator = 0 ;
1265
1270
while (remainingShift > 0 )
1266
1271
{
1267
1272
UINT32 shift = remainingShift >= 11 ? 11 : remainingShift % 11 ;
1268
- emitIns_R_R_I (INS_slli, size, reg, reg, shift);
1273
+ UINT32 mask = 0x7ff >> (11 - shift);
1274
+ remainingShift -= shift;
1275
+ ssize_t low11 = (imm >> remainingShift) & mask;
1276
+ shiftAccumulator += shift;
1277
+
1278
+ if (low11)
1279
+ {
1280
+ emitIns_R_R_I (INS_slli, size, reg, reg, shiftAccumulator);
1281
+ shiftAccumulator = 0 ;
1269
1282
1270
- UINT32 mask = 0x7ff >> (11 - shift);
1271
- ssize_t low11 = (imm >> (remainingShift - shift)) & mask;
1272
- emitIns_R_R_I (INS_addi, size, reg, reg, low11);
1273
- remainingShift = remainingShift - shift;
1283
+ emitIns_R_R_I (INS_addi, size, reg, reg, low11);
1284
+ }
1285
+ }
1286
+ if (shiftAccumulator)
1287
+ {
1288
+ emitIns_R_R_I (INS_slli, size, reg, reg, shiftAccumulator);
1274
1289
}
1275
1290
}
1276
1291
0 commit comments