@@ -510,57 +510,60 @@ compile_int_div_no_check(JitCompContext *cc, IntArithmetic arith_op,
510510#if defined(BUILD_TARGET_X86_64 ) || defined(BUILD_TARGET_AMD_64 )
511511 case INT_DIV_S :
512512 case INT_DIV_U :
513+ {
514+ JitInsn * insn = NULL ;
515+
513516 if (is_i32 ) {
514517 GEN_INSN (MOV , eax_hreg , left );
515518 if (arith_op == INT_DIV_S )
516- GEN_INSN (DIV_S , eax_hreg , eax_hreg , right );
519+ insn = GEN_INSN (DIV_S , eax_hreg , eax_hreg , right );
517520 else
518- GEN_INSN (DIV_U , eax_hreg , eax_hreg , right );
519- /* Just to indicate that edx is used,
520- register allocator cannot spill it out */
521- GEN_INSN (MOV , edx_hreg , edx_hreg );
521+ insn = GEN_INSN (DIV_U , eax_hreg , eax_hreg , right );
522+
522523 res = eax_hreg ;
523524 }
524525 else {
525526 GEN_INSN (MOV , rax_hreg , left );
526- /* Just to indicate that eax is used,
527- register allocator cannot spill it out */
528- GEN_INSN (MOV , eax_hreg , eax_hreg );
529527 if (arith_op == INT_DIV_S )
530- GEN_INSN (DIV_S , rax_hreg , rax_hreg , right );
528+ insn = GEN_INSN (DIV_S , rax_hreg , rax_hreg , right );
531529 else
532- GEN_INSN (DIV_U , rax_hreg , rax_hreg , right );
533- /* Just to indicate that edx is used,
534- register allocator cannot spill it out */
535- GEN_INSN (MOV , edx_hreg , edx_hreg );
530+ insn = GEN_INSN (DIV_U , rax_hreg , rax_hreg , right );
531+
536532 res = rax_hreg ;
537533 }
534+
535+ jit_lock_reg_in_insn (cc , insn , eax_hreg );
536+ jit_lock_reg_in_insn (cc , insn , edx_hreg );
538537 break ;
538+ }
539539 case INT_REM_S :
540540 case INT_REM_U :
541+ {
542+ JitInsn * insn = NULL ;
543+
541544 if (is_i32 ) {
542545 GEN_INSN (MOV , eax_hreg , left );
543546 if (arith_op == INT_REM_S )
544- GEN_INSN (REM_S , edx_hreg , eax_hreg , right );
547+ insn = GEN_INSN (REM_S , edx_hreg , eax_hreg , right );
545548 else
546- GEN_INSN (REM_U , edx_hreg , eax_hreg , right );
549+ insn = GEN_INSN (REM_U , edx_hreg , eax_hreg , right );
550+
547551 res = edx_hreg ;
548552 }
549553 else {
550554 GEN_INSN (MOV , rax_hreg , left );
551- /* Just to indicate that eax is used,
552- register allocator cannot spill it out */
553- GEN_INSN (MOV , eax_hreg , eax_hreg );
554555 if (arith_op == INT_REM_S )
555- GEN_INSN (REM_S , rdx_hreg , rax_hreg , right );
556+ insn = GEN_INSN (REM_S , rdx_hreg , rax_hreg , right );
556557 else
557- GEN_INSN (REM_U , rdx_hreg , rax_hreg , right );
558- /* Just to indicate that edx is used,
559- register allocator cannot spill it out */
560- GEN_INSN (MOV , edx_hreg , edx_hreg );
558+ insn = GEN_INSN (REM_U , rdx_hreg , rax_hreg , right );
559+
561560 res = rdx_hreg ;
562561 }
562+
563+ jit_lock_reg_in_insn (cc , insn , eax_hreg );
564+ jit_lock_reg_in_insn (cc , insn , edx_hreg );
563565 break ;
566+ }
564567#else
565568 case INT_DIV_S :
566569 GEN_INSN (DIV_S , res , left , right );
@@ -1050,6 +1053,7 @@ compile_int_shl(JitCompContext *cc, JitReg left, JitReg right, bool is_i32)
10501053#if defined(BUILD_TARGET_X86_64 ) || defined(BUILD_TARGET_AMD_64 )
10511054 JitReg ecx_hreg = jit_codegen_get_hreg_by_name ("ecx" );
10521055 JitReg rcx_hreg = jit_codegen_get_hreg_by_name ("rcx" );
1056+ JitInsn * insn = NULL ;
10531057#endif
10541058
10551059 right = compile_int_shift_modulo (cc , right , is_i32 );
@@ -1063,8 +1067,8 @@ compile_int_shl(JitCompContext *cc, JitReg left, JitReg right, bool is_i32)
10631067 res = is_i32 ? jit_cc_new_reg_I32 (cc ) : jit_cc_new_reg_I64 (cc );
10641068#if defined(BUILD_TARGET_X86_64 ) || defined(BUILD_TARGET_AMD_64 )
10651069 GEN_INSN (MOV , is_i32 ? ecx_hreg : rcx_hreg , right );
1066- GEN_INSN (SHL , res , left , is_i32 ? ecx_hreg : rcx_hreg );
1067- GEN_INSN ( MOV , ecx_hreg , ecx_hreg );
1070+ insn = GEN_INSN (SHL , res , left , is_i32 ? ecx_hreg : rcx_hreg );
1071+ jit_lock_reg_in_insn ( cc , insn , ecx_hreg );
10681072#else
10691073 GEN_INSN (SHL , res , left , right );
10701074#endif
@@ -1080,6 +1084,7 @@ compile_int_shrs(JitCompContext *cc, JitReg left, JitReg right, bool is_i32)
10801084#if defined(BUILD_TARGET_X86_64 ) || defined(BUILD_TARGET_AMD_64 )
10811085 JitReg ecx_hreg = jit_codegen_get_hreg_by_name ("ecx" );
10821086 JitReg rcx_hreg = jit_codegen_get_hreg_by_name ("rcx" );
1087+ JitInsn * insn = NULL ;
10831088#endif
10841089
10851090 right = compile_int_shift_modulo (cc , right , is_i32 );
@@ -1093,8 +1098,8 @@ compile_int_shrs(JitCompContext *cc, JitReg left, JitReg right, bool is_i32)
10931098 res = is_i32 ? jit_cc_new_reg_I32 (cc ) : jit_cc_new_reg_I64 (cc );
10941099#if defined(BUILD_TARGET_X86_64 ) || defined(BUILD_TARGET_AMD_64 )
10951100 GEN_INSN (MOV , is_i32 ? ecx_hreg : rcx_hreg , right );
1096- GEN_INSN (SHRS , res , left , is_i32 ? ecx_hreg : rcx_hreg );
1097- GEN_INSN ( MOV , ecx_hreg , ecx_hreg );
1101+ insn = GEN_INSN (SHRS , res , left , is_i32 ? ecx_hreg : rcx_hreg );
1102+ jit_lock_reg_in_insn ( cc , insn , ecx_hreg );
10981103#else
10991104 GEN_INSN (SHRS , res , left , right );
11001105#endif
@@ -1110,6 +1115,7 @@ compile_int_shru(JitCompContext *cc, JitReg left, JitReg right, bool is_i32)
11101115#if defined(BUILD_TARGET_X86_64 ) || defined(BUILD_TARGET_AMD_64 )
11111116 JitReg ecx_hreg = jit_codegen_get_hreg_by_name ("ecx" );
11121117 JitReg rcx_hreg = jit_codegen_get_hreg_by_name ("rcx" );
1118+ JitInsn * insn = NULL ;
11131119#endif
11141120
11151121 right = compile_int_shift_modulo (cc , right , is_i32 );
@@ -1123,8 +1129,8 @@ compile_int_shru(JitCompContext *cc, JitReg left, JitReg right, bool is_i32)
11231129 res = is_i32 ? jit_cc_new_reg_I32 (cc ) : jit_cc_new_reg_I64 (cc );
11241130#if defined(BUILD_TARGET_X86_64 ) || defined(BUILD_TARGET_AMD_64 )
11251131 GEN_INSN (MOV , is_i32 ? ecx_hreg : rcx_hreg , right );
1126- GEN_INSN (SHRU , res , left , is_i32 ? ecx_hreg : rcx_hreg );
1127- GEN_INSN ( MOV , ecx_hreg , ecx_hreg );
1132+ insn = GEN_INSN (SHRU , res , left , is_i32 ? ecx_hreg : rcx_hreg );
1133+ jit_lock_reg_in_insn ( cc , insn , ecx_hreg );
11281134#else
11291135 GEN_INSN (SHRU , res , left , right );
11301136#endif
@@ -1171,6 +1177,7 @@ compile_int_rotl(JitCompContext *cc, JitReg left, JitReg right, bool is_i32)
11711177#if defined(BUILD_TARGET_X86_64 ) || defined(BUILD_TARGET_AMD_64 )
11721178 JitReg ecx_hreg = jit_codegen_get_hreg_by_name ("ecx" );
11731179 JitReg rcx_hreg = jit_codegen_get_hreg_by_name ("rcx" );
1180+ JitInsn * insn = NULL ;
11741181#endif
11751182
11761183 right = compile_int_shift_modulo (cc , right , is_i32 );
@@ -1184,8 +1191,8 @@ compile_int_rotl(JitCompContext *cc, JitReg left, JitReg right, bool is_i32)
11841191 res = is_i32 ? jit_cc_new_reg_I32 (cc ) : jit_cc_new_reg_I64 (cc );
11851192#if defined(BUILD_TARGET_X86_64 ) || defined(BUILD_TARGET_AMD_64 )
11861193 GEN_INSN (MOV , is_i32 ? ecx_hreg : rcx_hreg , right );
1187- GEN_INSN (ROTL , res , left , is_i32 ? ecx_hreg : rcx_hreg );
1188- GEN_INSN ( MOV , ecx_hreg , ecx_hreg );
1194+ insn = GEN_INSN (ROTL , res , left , is_i32 ? ecx_hreg : rcx_hreg );
1195+ jit_lock_reg_in_insn ( cc , insn , ecx_hreg );
11891196#else
11901197 GEN_INSN (ROTL , res , left , right );
11911198#endif
@@ -1232,6 +1239,7 @@ compile_int_rotr(JitCompContext *cc, JitReg left, JitReg right, bool is_i32)
12321239#if defined(BUILD_TARGET_X86_64 ) || defined(BUILD_TARGET_AMD_64 )
12331240 JitReg ecx_hreg = jit_codegen_get_hreg_by_name ("ecx" );
12341241 JitReg rcx_hreg = jit_codegen_get_hreg_by_name ("rcx" );
1242+ JitInsn * insn = NULL ;
12351243#endif
12361244
12371245 right = compile_int_shift_modulo (cc , right , is_i32 );
@@ -1245,8 +1253,8 @@ compile_int_rotr(JitCompContext *cc, JitReg left, JitReg right, bool is_i32)
12451253 res = is_i32 ? jit_cc_new_reg_I32 (cc ) : jit_cc_new_reg_I64 (cc );
12461254#if defined(BUILD_TARGET_X86_64 ) || defined(BUILD_TARGET_AMD_64 )
12471255 GEN_INSN (MOV , is_i32 ? ecx_hreg : rcx_hreg , right );
1248- GEN_INSN (ROTR , res , left , is_i32 ? ecx_hreg : rcx_hreg );
1249- GEN_INSN ( MOV , ecx_hreg , ecx_hreg );
1256+ insn = GEN_INSN (ROTR , res , left , is_i32 ? ecx_hreg : rcx_hreg );
1257+ jit_lock_reg_in_insn ( cc , insn , ecx_hreg );
12501258#else
12511259 GEN_INSN (ROTR , res , left , right );
12521260#endif
0 commit comments