@@ -146,18 +146,6 @@ bool MacroAssembler::is_li32_at(address instr) {
146
146
check_li32_data_dependency (instr);
147
147
}
148
148
149
- bool MacroAssembler::is_li64_at (address instr) {
150
- return is_lui_at (instr) && // lui
151
- is_addi_at (instr + instruction_size) && // addi
152
- is_slli_shift_at (instr + instruction_size * 2 , 12 ) && // Slli Rd, Rs, 12
153
- is_addi_at (instr + instruction_size * 3 ) && // addi
154
- is_slli_shift_at (instr + instruction_size * 4 , 12 ) && // Slli Rd, Rs, 12
155
- is_addi_at (instr + instruction_size * 5 ) && // addi
156
- is_slli_shift_at (instr + instruction_size * 6 , 8 ) && // Slli Rd, Rs, 8
157
- is_addi_at (instr + instruction_size * 7 ) && // addi
158
- check_li64_data_dependency (instr);
159
- }
160
-
161
149
bool MacroAssembler::is_lwu_to_zr (address instr) {
162
150
assert_cond (instr != nullptr );
163
151
return (extract_opcode (instr) == 0b0000011 &&
@@ -909,37 +897,9 @@ void MacroAssembler::li32(Register Rd, int32_t imm) {
909
897
upper = (int32_t )upper;
910
898
// lui Rd, imm[31:12] + imm[11]
911
899
lui (Rd, upper);
912
- // use addiw to distinguish li32 to li64
913
900
addiw (Rd, Rd, lower);
914
901
}
915
902
916
- void MacroAssembler::li64 (Register Rd, int64_t imm) {
917
- // Load upper 32 bits. upper = imm[63:32], but if imm[31] == 1 or
918
- // (imm[31:20] == 0x7ff && imm[19] == 1), upper = imm[63:32] + 1.
919
- int64_t lower = imm & 0xffffffff ;
920
- lower -= ((lower << 44 ) >> 44 );
921
- int64_t tmp_imm = ((uint64_t )(imm & 0xffffffff00000000 )) + (uint64_t )lower;
922
- int32_t upper = (tmp_imm - (int32_t )lower) >> 32 ;
923
-
924
- // Load upper 32 bits
925
- int64_t up = upper, lo = upper;
926
- lo = (lo << 52 ) >> 52 ;
927
- up -= lo;
928
- up = (int32_t )up;
929
- lui (Rd, up);
930
- addi (Rd, Rd, lo);
931
-
932
- // Load the rest 32 bits.
933
- slli (Rd, Rd, 12 );
934
- addi (Rd, Rd, (int32_t )lower >> 20 );
935
- slli (Rd, Rd, 12 );
936
- lower = ((int32_t )imm << 12 ) >> 20 ;
937
- addi (Rd, Rd, lower);
938
- slli (Rd, Rd, 8 );
939
- lower = imm & 0xff ;
940
- addi (Rd, Rd, lower);
941
- }
942
-
943
903
void MacroAssembler::li (Register Rd, int64_t imm) {
944
904
// int64_t is in range 0x8000 0000 0000 0000 ~ 0x7fff ffff ffff ffff
945
905
// li -> c.li
@@ -1741,27 +1701,6 @@ static int patch_addr_in_movptr2(address instruction_address, address target) {
1741
1701
return MacroAssembler::movptr2_instruction_size;
1742
1702
}
1743
1703
1744
- static int patch_imm_in_li64 (address branch, address target) {
1745
- const int LI64_INSTRUCTIONS_NUM = 8 ; // lui + addi + slli + addi + slli + addi + slli + addi
1746
- int64_t lower = (intptr_t )target & 0xffffffff ;
1747
- lower = lower - ((lower << 44 ) >> 44 );
1748
- int64_t tmp_imm = ((uint64_t )((intptr_t )target & 0xffffffff00000000 )) + (uint64_t )lower;
1749
- int32_t upper = (tmp_imm - (int32_t )lower) >> 32 ;
1750
- int64_t tmp_upper = upper, tmp_lower = upper;
1751
- tmp_lower = (tmp_lower << 52 ) >> 52 ;
1752
- tmp_upper -= tmp_lower;
1753
- tmp_upper >>= 12 ;
1754
- // Load upper 32 bits. Upper = target[63:32], but if target[31] = 1 or (target[31:20] == 0x7ff && target[19] == 1),
1755
- // upper = target[63:32] + 1.
1756
- Assembler::patch (branch + 0 , 31 , 12 , tmp_upper & 0xfffff ); // Lui.
1757
- Assembler::patch (branch + 4 , 31 , 20 , tmp_lower & 0xfff ); // Addi.
1758
- // Load the rest 32 bits.
1759
- Assembler::patch (branch + 12 , 31 , 20 , ((int32_t )lower >> 20 ) & 0xfff ); // Addi.
1760
- Assembler::patch (branch + 20 , 31 , 20 , (((intptr_t )target << 44 ) >> 52 ) & 0xfff ); // Addi.
1761
- Assembler::patch (branch + 28 , 31 , 20 , (intptr_t )target & 0xff ); // Addi.
1762
- return LI64_INSTRUCTIONS_NUM * MacroAssembler::instruction_size;
1763
- }
1764
-
1765
1704
static int patch_imm_in_li16u (address branch, uint16_t target) {
1766
1705
Assembler::patch (branch, 31 , 12 , target); // patch lui only
1767
1706
return MacroAssembler::instruction_size;
@@ -1832,16 +1771,6 @@ static address get_target_of_movptr2(address insn_addr) {
1832
1771
return ret;
1833
1772
}
1834
1773
1835
- static address get_target_of_li64 (address insn_addr) {
1836
- assert_cond (insn_addr != nullptr );
1837
- intptr_t target_address = (((int64_t )Assembler::sextract (Assembler::ld_instr (insn_addr), 31 , 12 )) & 0xfffff ) << 44 ; // Lui.
1838
- target_address += ((int64_t )Assembler::sextract (Assembler::ld_instr (insn_addr + 4 ), 31 , 20 )) << 32 ; // Addi.
1839
- target_address += ((int64_t )Assembler::sextract (Assembler::ld_instr (insn_addr + 12 ), 31 , 20 )) << 20 ; // Addi.
1840
- target_address += ((int64_t )Assembler::sextract (Assembler::ld_instr (insn_addr + 20 ), 31 , 20 )) << 8 ; // Addi.
1841
- target_address += ((int64_t )Assembler::sextract (Assembler::ld_instr (insn_addr + 28 ), 31 , 20 )); // Addi.
1842
- return (address)target_address;
1843
- }
1844
-
1845
1774
address MacroAssembler::get_target_of_li32 (address insn_addr) {
1846
1775
assert_cond (insn_addr != nullptr );
1847
1776
intptr_t target_address = (((int64_t )Assembler::sextract (Assembler::ld_instr (insn_addr), 31 , 12 )) & 0xfffff ) << 12 ; // Lui.
@@ -1864,8 +1793,6 @@ int MacroAssembler::pd_patch_instruction_size(address instruction_address, addre
1864
1793
return patch_addr_in_movptr1 (instruction_address, target);
1865
1794
} else if (MacroAssembler::is_movptr2_at (instruction_address)) { // movptr2
1866
1795
return patch_addr_in_movptr2 (instruction_address, target);
1867
- } else if (MacroAssembler::is_li64_at (instruction_address)) { // li64
1868
- return patch_imm_in_li64 (instruction_address, target);
1869
1796
} else if (MacroAssembler::is_li32_at (instruction_address)) { // li32
1870
1797
int64_t imm = (intptr_t )target;
1871
1798
return patch_imm_in_li32 (instruction_address, (int32_t )imm);
@@ -1896,8 +1823,6 @@ address MacroAssembler::target_addr_for_insn(address insn_addr) {
1896
1823
return get_target_of_movptr1 (insn_addr);
1897
1824
} else if (MacroAssembler::is_movptr2_at (insn_addr)) { // movptr2
1898
1825
return get_target_of_movptr2 (insn_addr);
1899
- } else if (MacroAssembler::is_li64_at (insn_addr)) { // li64
1900
- return get_target_of_li64 (insn_addr);
1901
1826
} else if (MacroAssembler::is_li32_at (insn_addr)) { // li32
1902
1827
return get_target_of_li32 (insn_addr);
1903
1828
} else {
0 commit comments