@@ -659,7 +659,9 @@ void emitter::emitIns_R_R(
659
659
void emitter::emitIns_R_R_I (
660
660
instruction ins, emitAttr attr, regNumber reg1, regNumber reg2, ssize_t imm, insOpts opt /* = INS_OPTS_NONE */ )
661
661
{
662
- code_t code = emitInsCode (ins);
662
+ code_t code = emitInsCode (ins);
663
+ instrDesc* id = emitNewInstr (attr);
664
+
663
665
if ((INS_addi <= ins && INS_srai >= ins) || (INS_addiw <= ins && INS_sraiw >= ins) ||
664
666
(INS_lb <= ins && INS_lhu >= ins) || INS_ld == ins || INS_lw == ins || INS_jalr == ins || INS_fld == ins ||
665
667
INS_flw == ins)
@@ -688,6 +690,8 @@ void emitter::emitIns_R_R_I(
688
690
code |= ((imm >> 1 ) & 0xf ) << 8 ;
689
691
code |= ((imm >> 5 ) & 0x3f ) << 25 ;
690
692
code |= ((imm >> 12 ) & 0x1 ) << 31 ;
693
+ // TODO-RISCV64: Move jump logic to emitIns_J
694
+ id->idAddr ()->iiaSetInstrCount (imm / sizeof (code_t ));
691
695
}
692
696
else if (ins == INS_csrrs || ins == INS_csrrw || ins == INS_csrrc)
693
697
{
@@ -702,7 +706,6 @@ void emitter::emitIns_R_R_I(
702
706
{
703
707
NYI_RISCV64 (" illegal ins within emitIns_R_R_I!" );
704
708
}
705
- instrDesc* id = emitNewInstr (attr);
706
709
707
710
id->idIns (ins);
708
711
id->idReg1 (reg1);
@@ -2124,22 +2127,22 @@ void emitter::emitOutputInstrJumpDistanceHelper(const insGroup* ig,
2124
2127
UNATIVE_OFFSET& dstOffs,
2125
2128
const BYTE*& dstAddr) const
2126
2129
{
2127
- // TODO-RISCV64-BUG: iiaEncodedInstrCount is not set by the riscv impl making distinguishing the jumps to label and
2128
- // an instruction-count based jumps impossible
2129
- if (jmp->idAddr ()->iiaHasInstrCount ())
2130
- {
2131
- assert (ig != nullptr );
2132
- int instrCount = jmp->idAddr ()->iiaGetInstrCount ();
2133
- unsigned insNum = emitFindInsNum (ig, jmp);
2134
- if (instrCount < 0 )
2135
- {
2136
- // Backward branches using instruction count must be within the same instruction group.
2137
- assert (insNum + 1 >= static_cast <unsigned >(-instrCount));
2138
- }
2139
- dstOffs = ig->igOffs + emitFindOffset (ig, ( insNum + 1 + instrCount) );
2140
- dstAddr = emitOffsetToPtr (dstOffs);
2141
- return ;
2142
- }
2130
+ // TODO-RISCV64: Currently the iiaEncodedInstrCount is not set by any of the emitIns_* methods
2131
+ assert (!jmp-> idAddr ()-> iiaHasInstrCount ());
2132
+ // if (jmp->idAddr()->iiaHasInstrCount())
2133
+ // {
2134
+ // assert(ig != nullptr);
2135
+ // int instrCount = jmp->idAddr()->iiaGetInstrCount();
2136
+ // unsigned insNum = emitFindInsNum(ig, jmp);
2137
+ // if (instrCount < 0)
2138
+ // {
2139
+ // // Backward branches using instruction count must be within the same instruction group.
2140
+ // assert(insNum + 1 >= static_cast<unsigned>(-instrCount));
2141
+ // }
2142
+ // dstOffs = ig->igOffs + emitFindOffset(ig, insNum + 1 + instrCount);
2143
+ // dstAddr = emitOffsetToPtr(dstOffs);
2144
+ // return;
2145
+ // }
2143
2146
dstOffs = jmp->idAddr ()->iiaIGlabel ->igOffs ;
2144
2147
dstAddr = emitOffsetToPtr (dstOffs);
2145
2148
}
@@ -2997,10 +3000,18 @@ void emitter::emitDispBranchOffset(const instrDesc* id, const insGroup* ig) cons
2997
3000
printf (" pc%s%d instructions" , signFn (instrCount), instrCount);
2998
3001
return ;
2999
3002
}
3000
- unsigned insNum = emitFindInsNum (ig, id);
3003
+ unsigned insNum = emitFindInsNum (ig, id);
3004
+
3005
+ if (ig->igInsCnt >= insNum + 1 + instrCount)
3006
+ {
3007
+ // TODO-RISCV64-BUG: This should be a labeled offset but does not contain a label
3008
+ printf (" pc%s%d instructions" , signFn (instrCount), instrCount);
3009
+ return ;
3010
+ }
3011
+
3001
3012
UNATIVE_OFFSET srcOffs = ig->igOffs + emitFindOffset (ig, insNum + 1 );
3002
3013
UNATIVE_OFFSET dstOffs = ig->igOffs + emitFindOffset (ig, insNum + 1 + instrCount);
3003
- ssize_t relOffs = static_cast <ssize_t >(emitOffsetToPtr (dstOffs) - emitOffsetToPtr (dstOffs ));
3014
+ ssize_t relOffs = static_cast <ssize_t >(emitOffsetToPtr (dstOffs) - emitOffsetToPtr (srcOffs ));
3004
3015
printf (" pc%s%d (%d instructions)" , signFn (relOffs), static_cast <int >(relOffs), instrCount);
3005
3016
}
3006
3017
0 commit comments