Skip to content

Commit f1ad214

Browse files
authored
[RISC-V] Opt emitLoadImmediate (#109062)
Skip `slli` and `add` if `low12` is 0 for the iterations.
1 parent 6bc04bf commit f1ad214

File tree

2 files changed

+25
-7
lines changed

2 files changed

+25
-7
lines changed

src/coreclr/jit/emitriscv64.cpp

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1258,19 +1258,34 @@ void emitter::emitLoadImmediate(emitAttr size, regNumber reg, ssize_t imm)
12581258
INT32 high19 = ((int32_t)(high31 + 0x800)) >> 12;
12591259

12601260
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+
}
12621265

12631266
// And load remaining part part by batches of 11 bits size.
12641267
INT32 remainingShift = msb - 30;
1268+
1269+
UINT32 shiftAccumulator = 0;
12651270
while (remainingShift > 0)
12661271
{
12671272
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;
12691282

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);
12741289
}
12751290
}
12761291

src/coreclr/vm/riscv64/stubs.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1071,7 +1071,10 @@ void StubLinkerCPU::EmitMovConstant(IntReg reg, UINT64 imm)
10711071

10721072
EmitLuImm(reg, high19);
10731073
int low12 = int(high31) << (32-12) >> (32-12);
1074-
EmitAddImm(reg, reg, low12);
1074+
if (low12)
1075+
{
1076+
EmitAddImm(reg, reg, low12);
1077+
}
10751078

10761079
// And load remaining part by batches of 11 bits size.
10771080
INT32 remainingShift = msb - 30;

0 commit comments

Comments
 (0)