@@ -17,138 +17,88 @@ const MOV_IMM16_OFFSET: u32 = 5;
1717const MOV_IMM16_WIDTH : u32 = 16 ;
1818
1919pub fn mov_w_abs_g0_reloc ( value : u64 , mem : & mut [ u8 ] , offset : usize ) -> Result < ( ) , Rel64Error > {
20- const INST_MASK : u32 = ( ( 1 << MOV_IMM16_WIDTH ) - 1 ) << MOV_IMM16_OFFSET ;
21-
2220 let target: u16 = value. try_into ( ) ?;
2321 let bytes = get_bytes_mut ( mem, offset) ?;
24-
25- let mut inst_code = InstructionCode ( * bytes) . unpack ( ) ;
26- inst_code &= !INST_MASK ;
27- inst_code |= ( target as u32 ) << MOV_IMM16_OFFSET ;
28- * bytes = InstructionCode :: from_u32 ( inst_code) . 0 ;
29-
22+ patch_mov ( target, bytes) ;
3023 Ok ( ( ) )
3124}
3225
3326pub fn mov_w_abs_g0nc_reloc ( value : u64 , mem : & mut [ u8 ] , offset : usize ) -> Result < ( ) , Rel64Error > {
34- const INST_MASK : u32 = ( ( 1 << MOV_IMM16_WIDTH ) - 1 ) << MOV_IMM16_OFFSET ;
35-
3627 let target = value as u16 ;
3728 let bytes = get_bytes_mut ( mem, offset) ?;
38-
39- let mut inst_code = InstructionCode ( * bytes) . unpack ( ) ;
40- inst_code &= !INST_MASK ;
41- inst_code |= ( target as u32 ) << MOV_IMM16_OFFSET ;
42- * bytes = InstructionCode :: from_u32 ( inst_code) . 0 ;
43-
29+ patch_mov ( target, bytes) ;
4430 Ok ( ( ) )
4531}
4632
4733pub fn mov_w_abs_g0s_reloc ( value : i64 , mem : & mut [ u8 ] , offset : usize ) -> Result < ( ) , Rel64Error > {
48- const INST_MASK : u32 = ( ( ( 1 << MOV_IMM16_WIDTH ) - 1 ) << MOV_IMM16_OFFSET )
49- | ( ( ( 1 << MOV_OPCODE_WIDTH ) - 1 ) << MOV_OPCODE_OFFSET ) ;
50-
5134 let target: i16 = value. try_into ( ) ?;
5235 let bytes = get_bytes_mut ( mem, offset) ?;
53-
54- let mut inst_code = InstructionCode ( * bytes) . unpack ( ) ;
55- inst_code &= !INST_MASK ;
56- if target < 0 {
57- inst_code |= ( ( !target as u16 ) as u32 ) << MOV_IMM16_OFFSET ;
58- inst_code |= MOV_OPCODE_MOVN << MOV_OPCODE_OFFSET ;
59- } else {
60- inst_code |= ( ( target as u16 ) as u32 ) << MOV_IMM16_OFFSET ;
61- inst_code |= MOV_OPCODE_MOVZ << MOV_OPCODE_OFFSET ;
62- }
63- * bytes = InstructionCode :: from_u32 ( inst_code) . 0 ;
64-
36+ patch_mov_signed ( target, bytes) ;
6537 Ok ( ( ) )
6638}
6739
6840pub fn mov_w_abs_g1_reloc ( value : u64 , mem : & mut [ u8 ] , offset : usize ) -> Result < ( ) , Rel64Error > {
69- const INST_MASK : u32 = ( ( 1 << MOV_IMM16_WIDTH ) - 1 ) << MOV_IMM16_OFFSET ;
70-
7141 let target: u16 = ( value >> 16 ) . try_into ( ) ?;
7242 let bytes = get_bytes_mut ( mem, offset) ?;
73-
74- let mut inst_code = InstructionCode ( * bytes) . unpack ( ) ;
75- inst_code &= !INST_MASK ;
76- inst_code |= ( target as u32 ) << MOV_IMM16_OFFSET ;
77- * bytes = InstructionCode :: from_u32 ( inst_code) . 0 ;
78-
43+ patch_mov ( target, bytes) ;
7944 Ok ( ( ) )
8045}
8146
8247pub fn mov_w_abs_g1nc_reloc ( value : u64 , mem : & mut [ u8 ] , offset : usize ) -> Result < ( ) , Rel64Error > {
83- const INST_MASK : u32 = ( ( 1 << MOV_IMM16_WIDTH ) - 1 ) << MOV_IMM16_OFFSET ;
84-
8548 let target = ( value >> 16 ) as u16 ;
8649 let bytes = get_bytes_mut ( mem, offset) ?;
87-
88- let mut inst_code = InstructionCode ( * bytes) . unpack ( ) ;
89- inst_code &= !INST_MASK ;
90- inst_code |= ( target as u32 ) << MOV_IMM16_OFFSET ;
91- * bytes = InstructionCode :: from_u32 ( inst_code) . 0 ;
92-
50+ patch_mov ( target, bytes) ;
9351 Ok ( ( ) )
9452}
9553
9654pub fn mov_w_abs_g1s_reloc ( value : i64 , mem : & mut [ u8 ] , offset : usize ) -> Result < ( ) , Rel64Error > {
97- const INST_MASK : u32 = ( ( ( 1 << MOV_IMM16_WIDTH ) - 1 ) << MOV_IMM16_OFFSET )
98- | ( ( ( 1 << MOV_OPCODE_WIDTH ) - 1 ) << MOV_OPCODE_OFFSET ) ;
99-
10055 let target: i16 = ( value >> 16 ) . try_into ( ) ?;
10156 let bytes = get_bytes_mut ( mem, offset) ?;
102-
103- let mut inst_code = InstructionCode ( * bytes) . unpack ( ) ;
104- inst_code &= !INST_MASK ;
105- if target < 0 {
106- inst_code |= ( ( !target as u16 ) as u32 ) << MOV_IMM16_OFFSET ;
107- inst_code |= MOV_OPCODE_MOVN << MOV_OPCODE_OFFSET ;
108- } else {
109- inst_code |= ( ( target as u16 ) as u32 ) << MOV_IMM16_OFFSET ;
110- inst_code |= MOV_OPCODE_MOVZ << MOV_OPCODE_OFFSET ;
111- }
112- * bytes = InstructionCode :: from_u32 ( inst_code) . 0 ;
113-
57+ patch_mov_signed ( target, bytes) ;
11458 Ok ( ( ) )
11559}
11660
11761pub fn mov_w_abs_g2_reloc ( value : u64 , mem : & mut [ u8 ] , offset : usize ) -> Result < ( ) , Rel64Error > {
118- const INST_MASK : u32 = ( ( 1 << MOV_IMM16_WIDTH ) - 1 ) << MOV_IMM16_OFFSET ;
119-
12062 let target: u16 = ( value >> 32 ) . try_into ( ) ?;
12163 let bytes = get_bytes_mut ( mem, offset) ?;
122-
123- let mut inst_code = InstructionCode ( * bytes) . unpack ( ) ;
124- inst_code &= !INST_MASK ;
125- inst_code |= ( target as u32 ) << MOV_IMM16_OFFSET ;
126- * bytes = InstructionCode :: from_u32 ( inst_code) . 0 ;
127-
64+ patch_mov ( target, bytes) ;
12865 Ok ( ( ) )
12966}
13067
13168pub fn mov_w_abs_g2nc_reloc ( value : u64 , mem : & mut [ u8 ] , offset : usize ) -> Result < ( ) , Rel64Error > {
132- const INST_MASK : u32 = ( ( 1 << MOV_IMM16_WIDTH ) - 1 ) << MOV_IMM16_OFFSET ;
133-
13469 let target = ( value >> 32 ) as u16 ;
13570 let bytes = get_bytes_mut ( mem, offset) ?;
71+ patch_mov ( target, bytes) ;
72+ Ok ( ( ) )
73+ }
74+
75+ pub fn mov_w_abs_g2s_reloc ( value : i64 , mem : & mut [ u8 ] , offset : usize ) -> Result < ( ) , Rel64Error > {
76+ let target: i16 = ( value >> 32 ) . try_into ( ) ?;
77+ let bytes = get_bytes_mut ( mem, offset) ?;
78+ patch_mov_signed ( target, bytes) ;
79+ Ok ( ( ) )
80+ }
81+
82+ pub fn mov_w_abs_g3_reloc ( value : u64 , mem : & mut [ u8 ] , offset : usize ) -> Result < ( ) , Rel64Error > {
83+ let target = ( value >> 48 ) as u16 ;
84+ let bytes = get_bytes_mut ( mem, offset) ?;
85+ patch_mov ( target, bytes) ;
86+ Ok ( ( ) )
87+ }
88+
89+ fn patch_mov ( target : u16 , bytes : & mut [ u8 ; 4 ] ) {
90+ const INST_MASK : u32 = ( ( 1 << MOV_IMM16_WIDTH ) - 1 ) << MOV_IMM16_OFFSET ;
13691
13792 let mut inst_code = InstructionCode ( * bytes) . unpack ( ) ;
13893 inst_code &= !INST_MASK ;
13994 inst_code |= ( target as u32 ) << MOV_IMM16_OFFSET ;
14095 * bytes = InstructionCode :: from_u32 ( inst_code) . 0 ;
141-
142- Ok ( ( ) )
14396}
14497
145- pub fn mov_w_abs_g2s_reloc ( value : i64 , mem : & mut [ u8 ] , offset : usize ) -> Result < ( ) , Rel64Error > {
98+ fn patch_mov_signed ( target : i16 , bytes : & mut [ u8 ; 4 ] ) {
14699 const INST_MASK : u32 = ( ( ( 1 << MOV_IMM16_WIDTH ) - 1 ) << MOV_IMM16_OFFSET )
147100 | ( ( ( 1 << MOV_OPCODE_WIDTH ) - 1 ) << MOV_OPCODE_OFFSET ) ;
148101
149- let target: i16 = ( value >> 32 ) . try_into ( ) ?;
150- let bytes = get_bytes_mut ( mem, offset) ?;
151-
152102 let mut inst_code = InstructionCode ( * bytes) . unpack ( ) ;
153103 inst_code &= !INST_MASK ;
154104 if target < 0 {
@@ -159,20 +109,4 @@ pub fn mov_w_abs_g2s_reloc(value: i64, mem: &mut [u8], offset: usize) -> Result<
159109 inst_code |= MOV_OPCODE_MOVZ << MOV_OPCODE_OFFSET ;
160110 }
161111 * bytes = InstructionCode :: from_u32 ( inst_code) . 0 ;
162-
163- Ok ( ( ) )
164- }
165-
166- pub fn mov_w_abs_g3_reloc ( value : u64 , mem : & mut [ u8 ] , offset : usize ) -> Result < ( ) , Rel64Error > {
167- const INST_MASK : u32 = ( ( 1 << MOV_IMM16_WIDTH ) - 1 ) << MOV_IMM16_OFFSET ;
168-
169- let target = ( value >> 48 ) as u32 ;
170- let bytes = get_bytes_mut ( mem, offset) ?;
171-
172- let mut inst_code = InstructionCode ( * bytes) . unpack ( ) ;
173- inst_code &= !INST_MASK ;
174- inst_code |= target << MOV_IMM16_OFFSET ;
175- * bytes = InstructionCode :: from_u32 ( inst_code) . 0 ;
176-
177- Ok ( ( ) )
178112}
0 commit comments