@@ -1181,12 +1181,12 @@ static int patch_offset_in_pc_relative(address branch, int64_t offset) {
1181
1181
1182
1182
static int patch_addr_in_movptr (address branch, address target) {
1183
1183
const int MOVPTR_INSTRUCTIONS_NUM = 6 ; // lui + addi + slli + addi + slli + addi/jalr/load
1184
- int32_t lower = ((intptr_t )target << 36 ) >> 36 ;
1185
- int64_t upper = ((intptr_t )target - lower) >> 28 ;
1186
- Assembler::patch (branch + 0 , 31 , 12 , upper & 0xfffff ); // Lui. target[47:28 ] + target[27 ] ==> branch[31:12]
1187
- Assembler::patch (branch + 4 , 31 , 20 , (lower >> 16 ) & 0xfff ); // Addi. target[27:16 ] ==> branch[31:20]
1188
- Assembler::patch (branch + 12 , 31 , 20 , (lower >> 5 ) & 0x7ff ); // Addi. target[15: 5 ] ==> branch[31:20]
1189
- Assembler::patch (branch + 20 , 31 , 20 , lower & 0x1f ); // Addi/Jalr/Load. target[ 4 : 0] ==> branch[31:20]
1184
+ int32_t lower = ((intptr_t )target << 35 ) >> 35 ;
1185
+ int64_t upper = ((intptr_t )target - lower) >> 29 ;
1186
+ Assembler::patch (branch + 0 , 31 , 12 , upper & 0xfffff ); // Lui. target[48:29 ] + target[28 ] ==> branch[31:12]
1187
+ Assembler::patch (branch + 4 , 31 , 20 , (lower >> 17 ) & 0xfff ); // Addi. target[28:17 ] ==> branch[31:20]
1188
+ Assembler::patch (branch + 12 , 31 , 20 , (lower >> 6 ) & 0x7ff ); // Addi. target[16: 6 ] ==> branch[31:20]
1189
+ Assembler::patch (branch + 20 , 31 , 20 , lower & 0x3f ); // Addi/Jalr/Load. target[ 5 : 0] ==> branch[31:20]
1190
1190
return MOVPTR_INSTRUCTIONS_NUM * NativeInstruction::instruction_size;
1191
1191
}
1192
1192
@@ -1258,9 +1258,9 @@ static long get_offset_of_pc_relative(address insn_addr) {
1258
1258
1259
1259
static address get_target_of_movptr (address insn_addr) {
1260
1260
assert_cond (insn_addr != NULL );
1261
- intptr_t target_address = (((int64_t )Assembler::sextract (((unsigned *)insn_addr)[0 ], 31 , 12 )) & 0xfffff ) << 28 ; // Lui.
1262
- target_address += ((int64_t )Assembler::sextract (((unsigned *)insn_addr)[1 ], 31 , 20 )) << 16 ; // Addi.
1263
- target_address += ((int64_t )Assembler::sextract (((unsigned *)insn_addr)[3 ], 31 , 20 )) << 5 ; // Addi.
1261
+ intptr_t target_address = (((int64_t )Assembler::sextract (((unsigned *)insn_addr)[0 ], 31 , 12 )) & 0xfffff ) << 29 ; // Lui.
1262
+ target_address += ((int64_t )Assembler::sextract (((unsigned *)insn_addr)[1 ], 31 , 20 )) << 17 ; // Addi.
1263
+ target_address += ((int64_t )Assembler::sextract (((unsigned *)insn_addr)[3 ], 31 , 20 )) << 6 ; // Addi.
1264
1264
target_address += ((int64_t )Assembler::sextract (((unsigned *)insn_addr)[5 ], 31 , 20 )); // Addi/Jalr/Load.
1265
1265
return (address) target_address;
1266
1266
}
0 commit comments