Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 23 additions & 23 deletions src/coreclr/jit/emitriscv64.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -693,7 +693,7 @@ void emitter::emitIns_R_R_I(
code |= ((imm >> 5) & 0x3f) << 25;
code |= ((imm >> 12) & 0x1) << 31;
// TODO-RISCV64: Move jump logic to emitIns_J
id->idAddr()->iiaSetInstrCount(imm / sizeof(code_t));
id->idAddr()->iiaSetInstrCount(static_cast<int>(imm / sizeof(code_t)));
}
else if (ins == INS_csrrs || ins == INS_csrrw || ins == INS_csrrc)
{
Expand Down Expand Up @@ -2748,48 +2748,48 @@ ssize_t emitter::emitOutputInstrJumpDistance(const BYTE* src, const insGroup* ig
return distVal;
}

static constexpr size_t NBitMask(uint8_t bits)
static inline constexpr unsigned WordMask(uint8_t bits)
{
return (static_cast<size_t>(1) << bits) - 1;
return static_cast<unsigned>((1ull << bits) - 1);
}

template <uint8_t MaskSize>
static ssize_t LowerNBitsOfWord(ssize_t word)
static unsigned LowerNBitsOfWord(ssize_t word)
{
static_assert(MaskSize < 32, "Given mask size is bigger than the word itself");
static_assert(MaskSize > 0, "Given mask size cannot be zero");

static constexpr size_t kMask = NBitMask(MaskSize);
static constexpr unsigned kMask = WordMask(MaskSize);

return word & kMask;
return static_cast<unsigned>(word & kMask);
}

template <uint8_t MaskSize>
static ssize_t UpperNBitsOfWord(ssize_t word)
static unsigned UpperNBitsOfWord(ssize_t word)
{
static constexpr size_t kShift = 32 - MaskSize;
static constexpr unsigned kShift = 32 - MaskSize;

return LowerNBitsOfWord<MaskSize>(word >> kShift);
}

template <uint8_t MaskSize>
static ssize_t UpperNBitsOfWordSignExtend(ssize_t word)
static unsigned UpperNBitsOfWordSignExtend(ssize_t word)
{
static constexpr unsigned kSignExtend = 1 << (31 - MaskSize);

return UpperNBitsOfWord<MaskSize>(word + kSignExtend);
}

static ssize_t UpperWordOfDoubleWord(ssize_t immediate)
static unsigned UpperWordOfDoubleWord(ssize_t immediate)
{
return immediate >> 32;
return static_cast<unsigned>(immediate >> 32);
}

static ssize_t LowerWordOfDoubleWord(ssize_t immediate)
static unsigned LowerWordOfDoubleWord(ssize_t immediate)
{
static constexpr size_t kWordMask = NBitMask(32);
static constexpr size_t kWordMask = WordMask(32);

return immediate & kWordMask;
return static_cast<unsigned>(immediate & kWordMask);
}

template <uint8_t UpperMaskSize, uint8_t LowerMaskSize>
Expand All @@ -2815,28 +2815,28 @@ static ssize_t UpperWordOfDoubleWordDoubleSignExtend(ssize_t doubleWord)
return UpperWordOfDoubleWord(DoubleWordSignExtend<UpperMaskSize, LowerMaskSize>(doubleWord));
}

/*static*/ unsigned emitter::TrimSignedToImm12(int imm12)
/*static*/ unsigned emitter::TrimSignedToImm12(ssize_t imm12)
{
assert(isValidSimm12(imm12));

return static_cast<unsigned>(LowerNBitsOfWord<12>(imm12));
}

/*static*/ unsigned emitter::TrimSignedToImm13(int imm13)
/*static*/ unsigned emitter::TrimSignedToImm13(ssize_t imm13)
{
assert(isValidSimm13(imm13));

return static_cast<unsigned>(LowerNBitsOfWord<13>(imm13));
}

/*static*/ unsigned emitter::TrimSignedToImm20(int imm20)
/*static*/ unsigned emitter::TrimSignedToImm20(ssize_t imm20)
{
assert(isValidSimm20(imm20));

return static_cast<unsigned>(LowerNBitsOfWord<20>(imm20));
}

/*static*/ unsigned emitter::TrimSignedToImm21(int imm21)
/*static*/ unsigned emitter::TrimSignedToImm21(ssize_t imm21)
{
assert(isValidSimm21(imm21));

Expand Down Expand Up @@ -2890,8 +2890,8 @@ BYTE* emitter::emitOutputInstr_OptsI8(BYTE* dst, const instrDesc* id, ssize_t im
if (id->idReg2())
{
// special for INT64_MAX or UINT32_MAX
dst += emitOutput_ITypeInstr(dst, INS_addi, reg1, REG_R0, NBitMask(12));
const ssize_t shiftValue = (immediate == INT64_MAX) ? 1 : 32;
dst += emitOutput_ITypeInstr(dst, INS_addi, reg1, REG_R0, WordMask(12));
const unsigned shiftValue = (immediate == INT64_MAX) ? 1 : 32;
dst += emitOutput_ITypeInstr(dst, INS_srli, reg1, reg1, shiftValue);
}
else
Expand All @@ -2904,10 +2904,10 @@ BYTE* emitter::emitOutputInstr_OptsI8(BYTE* dst, const instrDesc* id, ssize_t im

BYTE* emitter::emitOutputInstr_OptsI32(BYTE* dst, ssize_t immediate, regNumber reg1)
{
const ssize_t upperWord = UpperWordOfDoubleWord(immediate);
const unsigned upperWord = UpperWordOfDoubleWord(immediate);
dst += emitOutput_UTypeInstr(dst, INS_lui, reg1, UpperNBitsOfWordSignExtend<20>(upperWord));
dst += emitOutput_ITypeInstr(dst, INS_addi, reg1, reg1, LowerNBitsOfWord<12>(upperWord));
const ssize_t lowerWord = LowerWordOfDoubleWord(immediate);
const unsigned lowerWord = LowerWordOfDoubleWord(immediate);
dst += emitOutput_ITypeInstr(dst, INS_slli, reg1, reg1, 11);
dst += emitOutput_ITypeInstr(dst, INS_addi, reg1, reg1, LowerNBitsOfWord<11>(lowerWord >> 21));
dst += emitOutput_ITypeInstr(dst, INS_slli, reg1, reg1, 11);
Expand Down Expand Up @@ -2966,7 +2966,7 @@ BYTE* emitter::emitOutputInstr_OptsRcNoReloc(BYTE* dst, instruction* ins, unsign
const regNumber rsvdReg = codeGen->rsGetRsvdReg();

const instruction lastIns = (*ins == INS_jal) ? (*ins = INS_addi) : *ins;
const UINT32 high = immediate >> 11;
const ssize_t high = immediate >> 11;

dst += emitOutput_UTypeInstr(dst, INS_lui, rsvdReg, UpperNBitsOfWordSignExtend<20>(high));
dst += emitOutput_ITypeInstr(dst, INS_addi, rsvdReg, rsvdReg, LowerNBitsOfWord<12>(high));
Expand Down
8 changes: 4 additions & 4 deletions src/coreclr/jit/emitriscv64.h
Original file line number Diff line number Diff line change
Expand Up @@ -141,10 +141,10 @@ BYTE* emitOutputInstr_OptsJCond(BYTE* dst, instrDesc* id, const insGroup* ig, in
BYTE* emitOutputInstr_OptsJ(BYTE* dst, instrDesc* id, const insGroup* ig, instruction* ins);
BYTE* emitOutputInstr_OptsC(BYTE* dst, instrDesc* id, const insGroup* ig, size_t* size);

static unsigned TrimSignedToImm12(int imm12);
static unsigned TrimSignedToImm13(int imm13);
static unsigned TrimSignedToImm20(int imm20);
static unsigned TrimSignedToImm21(int imm21);
static unsigned TrimSignedToImm12(ssize_t imm12);
static unsigned TrimSignedToImm13(ssize_t imm13);
static unsigned TrimSignedToImm20(ssize_t imm20);
static unsigned TrimSignedToImm21(ssize_t imm21);

/************************************************************************/
/* Public inline informational methods */
Expand Down