@@ -667,6 +667,7 @@ void emitter::emitIns_R_R_I(
667667    {
668668        assert (isGeneralRegister (reg1));
669669        assert (isGeneralRegister (reg2));
670+         assert (isValidSimm13 (imm));
670671        code |= reg1 << 15 ;
671672        code |= reg2 << 20 ;
672673        code |= ((imm >> 11 ) & 0x1 ) << 7 ;
@@ -1621,10 +1622,10 @@ void emitter::emitJumpDistBind()
16211622#endif  //  DEBUG
16221623
16231624    //  NOTE:
1624-     //   bit0 of isLinkingEnd_LA : indicating whether updating the instrDescJmp's size with the type INS_OPTS_J;
1625-     //   bit1 of isLinkingEnd_LA : indicating not needed updating the size while emitTotalCodeSize <= (0x7fff << 2)  or had
1625+     //   bit0 of isLinkingEnd : indicating whether updating the instrDescJmp's size with the type INS_OPTS_J;
1626+     //   bit1 of isLinkingEnd : indicating not needed updating the size while emitTotalCodeSize <= 0xfff  or had
16261627    //   updated;
1627-     unsigned  int  isLinkingEnd_LA  = emitTotalCodeSize <= ( 0x7fff  <<  2 )  ? 2  : 0 ;
1628+     unsigned  int  isLinkingEnd  = emitTotalCodeSize <= 0xfff  ? 2  : 0 ;
16281629
16291630    UNATIVE_OFFSET ssz = 0 ; //  relative small jump's delay-slot.
16301631    //  small  jump max. neg distance
@@ -1836,7 +1837,7 @@ void emitter::emitJumpDistBind()
18361837            assert (jmpDist >= 0 ); //  Forward jump
18371838            assert (!(jmpDist & 0x3 ));
18381839
1839-             if  (isLinkingEnd_LA  & 0x2 )
1840+             if  (isLinkingEnd  & 0x2 )
18401841            {
18411842                jmp->idAddr ()->iiaSetJmpOffset (jmpDist);
18421843            }
@@ -1879,7 +1880,7 @@ void emitter::emitJumpDistBind()
18791880                adjIG += (UNATIVE_OFFSET)extra;
18801881                emitTotalCodeSize += (UNATIVE_OFFSET)extra;
18811882                jmpIG->igFlags  |= IGF_UPD_ISZ;
1882-                 isLinkingEnd_LA  |= 0x1 ;
1883+                 isLinkingEnd  |= 0x1 ;
18831884            }
18841885            continue ;
18851886        }
@@ -1923,7 +1924,7 @@ void emitter::emitJumpDistBind()
19231924            assert (jmpDist >= 0 ); //  Backward jump
19241925            assert (!(jmpDist & 0x3 ));
19251926
1926-             if  (isLinkingEnd_LA  & 0x2 )
1927+             if  (isLinkingEnd  & 0x2 )
19271928            {
19281929                jmp->idAddr ()->iiaSetJmpOffset (-jmpDist); //  Backward jump is negative!
19291930            }
@@ -1954,7 +1955,7 @@ void emitter::emitJumpDistBind()
19541955                }
19551956                else 
19561957                {
1957-                     assert (ins == INS_jal || ins == INS_jalr);
1958+                     assert (ins == INS_jal || ins == INS_jalr || ins == INS_j );
19581959                    assert ((jmpDist + emitCounts_INS_OPTS_J * 4 ) < 0x8000000 );
19591960                    continue ;
19601961                }
@@ -1966,17 +1967,17 @@ void emitter::emitJumpDistBind()
19661967                adjIG += (UNATIVE_OFFSET)extra;
19671968                emitTotalCodeSize += (UNATIVE_OFFSET)extra;
19681969                jmpIG->igFlags  |= IGF_UPD_ISZ;
1969-                 isLinkingEnd_LA  |= 0x1 ;
1970+                 isLinkingEnd  |= 0x1 ;
19701971            }
19711972            continue ;
19721973        }
19731974    } //  end for each jump
19741975
1975-     if  ((isLinkingEnd_LA  & 0x3 ) < 0x2 )
1976+     if  ((isLinkingEnd  & 0x3 ) < 0x2 )
19761977    {
19771978        //  indicating the instrDescJmp's size of the type INS_OPTS_J had updated
19781979        //  after the first round and should iterate again to update.
1979-         isLinkingEnd_LA  = 0x2 ;
1980+         isLinkingEnd  = 0x2 ;
19801981
19811982        //  Adjust offsets of any remaining blocks.
19821983        for  (; lstIG;)
@@ -2460,7 +2461,7 @@ size_t emitter::emitOutputInstr(insGroup* ig, instrDesc* id, BYTE** dp)
24602461                            }
24612462                            else 
24622463                            {
2463-                                 assert ((- 0x100000  <=  imm) && (imm <  0x100000 ));
2464+                                 assert (isValidSimm21 ( imm));
24642465                                assert ((emitInsCode (INS_bne) & 0xefff ) == emitInsCode (INS_beq));
24652466
24662467                                code = emitInsCode (ins) ^ 0x1000 ;
@@ -2482,7 +2483,7 @@ size_t emitter::emitOutputInstr(insGroup* ig, instrDesc* id, BYTE** dp)
24822483                        }
24832484                        else  if  ((INS_blt <= ins) && (ins <= INS_bgeu))
24842485                        {
2485-                             assert ((- 0x100000  <=  imm) && (imm <  0x100000 ));
2486+                             assert (isValidSimm21 ( imm));
24862487                            assert ((emitInsCode (INS_bge) & 0xefff ) == emitInsCode (INS_blt));
24872488                            assert ((emitInsCode (INS_bgeu) & 0xefff ) == emitInsCode (INS_bltu));
24882489
@@ -2542,6 +2543,7 @@ size_t emitter::emitOutputInstr(insGroup* ig, instrDesc* id, BYTE** dp)
25422543                code = emitInsCode (ins);
25432544                if  (ins == INS_jal)
25442545                {
2546+                     assert (isValidSimm21 (imm));
25452547                    code |= ((imm >> 12 ) & 0xff ) << 12 ;
25462548                    code |= ((imm >> 11 ) & 0x1 ) << 20 ;
25472549                    code |= ((imm >> 1 ) & 0x3ff ) << 21 ;
@@ -2550,17 +2552,20 @@ size_t emitter::emitOutputInstr(insGroup* ig, instrDesc* id, BYTE** dp)
25502552                }
25512553                else  if  (ins == INS_j)
25522554                {
2555+                     assert (isValidSimm21 (imm));
25532556                    code |= ((imm >> 12 ) & 0xff ) << 12 ;
25542557                    code |= ((imm >> 11 ) & 0x1 ) << 20 ;
25552558                    code |= ((imm >> 1 ) & 0x3ff ) << 21 ;
25562559                    code |= ((imm >> 20 ) & 0x1 ) << 31 ;
25572560                }
25582561                else  if  (ins == INS_jalr)
25592562                {
2563+                     assert (isValidSimm12 (imm));
25602564                    code |= ((code_t )(imm & 0xfff ) << 20 );
25612565                }
25622566                else  if  (ins == INS_bnez || ins == INS_beqz)
25632567                {
2568+                     assert (isValidSimm13 (imm));
25642569                    code |= (code_t )id->idReg1 () << 15 ;
25652570                    code |= ((imm >> 11 ) & 0x1 ) << 7 ;
25662571                    code |= ((imm >> 1 ) & 0xf ) << 8 ;
@@ -2569,6 +2574,7 @@ size_t emitter::emitOutputInstr(insGroup* ig, instrDesc* id, BYTE** dp)
25692574                }
25702575                else  if  ((INS_beq <= ins) && (ins <= INS_bgeu))
25712576                {
2577+                     assert (isValidSimm13 (imm));
25722578                    code |= ((code_t )id->idReg1 ()) << 15 ;
25732579                    code |= ((code_t )id->idReg2 ()) << 20 ;
25742580                    code |= ((imm >> 11 ) & 0x1 ) << 7 ;
0 commit comments