Skip to content

Commit 46fc7a3

Browse files
committed
py/asmx64: Add helper macro for generating REX_[WRXB] bits from a reg64.
1 parent 4cd45f4 commit 46fc7a3

1 file changed

Lines changed: 8 additions & 4 deletions

File tree

py/asmx64.c

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,10 @@
9898
#define REX_R (0x04) // register
9999
#define REX_X (0x02) // index
100100
#define REX_B (0x01) // base
101+
#define REX_W_FROM_R64(r64) ((r64) >> 0 & 0x08)
102+
#define REX_R_FROM_R64(r64) ((r64) >> 1 & 0x04)
103+
#define REX_X_FROM_R64(r64) ((r64) >> 2 & 0x02)
104+
#define REX_B_FROM_R64(r64) ((r64) >> 3 & 0x01)
101105

102106
#define IMM32_L0(x) ((x) & 0xff)
103107
#define IMM32_L1(x) (((x) >> 8) & 0xff)
@@ -274,7 +278,7 @@ STATIC void asm_x64_write_r64_disp(asm_x64_t *as, int r64, int disp_r64, int dis
274278
}
275279

276280
STATIC void asm_x64_generic_r64_r64(asm_x64_t *as, int dest_r64, int src_r64, int op) {
277-
asm_x64_write_byte_3(as, REX_PREFIX | REX_W | (src_r64 < 8 ? 0 : REX_R) | (dest_r64 < 8 ? 0 : REX_B), op, MODRM_R64(src_r64) | MODRM_RM_REG | MODRM_RM_R64(dest_r64));
281+
asm_x64_write_byte_3(as, REX_PREFIX | REX_W | REX_R_FROM_R64(src_r64) | REX_B_FROM_R64(dest_r64), op, MODRM_R64(src_r64) | MODRM_RM_REG | MODRM_RM_R64(dest_r64));
278282
}
279283

280284
void asm_x64_nop(asm_x64_t *as) {
@@ -352,7 +356,7 @@ void asm_x64_mov_r32_to_mem32(asm_x64_t *as, int src_r64, int dest_r64, int dest
352356

353357
void asm_x64_mov_r64_to_mem64(asm_x64_t *as, int src_r64, int dest_r64, int dest_disp) {
354358
// use REX prefix for 64 bit operation
355-
asm_x64_write_byte_2(as, REX_PREFIX | REX_W | (src_r64 < 8 ? 0 : REX_R) | (dest_r64 < 8 ? 0 : REX_B), OPCODE_MOV_R64_TO_RM64);
359+
asm_x64_write_byte_2(as, REX_PREFIX | REX_W | REX_R_FROM_R64(src_r64) | REX_B_FROM_R64(dest_r64), OPCODE_MOV_R64_TO_RM64);
356360
asm_x64_write_r64_disp(as, src_r64, dest_r64, dest_disp);
357361
}
358362

@@ -388,7 +392,7 @@ void asm_x64_mov_mem32_to_r64zx(asm_x64_t *as, int src_r64, int src_disp, int de
388392

389393
void asm_x64_mov_mem64_to_r64(asm_x64_t *as, int src_r64, int src_disp, int dest_r64) {
390394
// use REX prefix for 64 bit operation
391-
asm_x64_write_byte_2(as, REX_PREFIX | REX_W | (dest_r64 < 8 ? 0 : REX_R) | (src_r64 < 8 ? 0 : REX_B), OPCODE_MOV_RM64_TO_R64);
395+
asm_x64_write_byte_2(as, REX_PREFIX | REX_W | REX_R_FROM_R64(dest_r64) | REX_B_FROM_R64(src_r64), OPCODE_MOV_RM64_TO_R64);
392396
asm_x64_write_r64_disp(as, dest_r64, src_r64, src_disp);
393397
}
394398

@@ -475,7 +479,7 @@ void asm_x64_sub_r64_r64(asm_x64_t *as, int dest_r64, int src_r64) {
475479

476480
void asm_x64_mul_r64_r64(asm_x64_t *as, int dest_r64, int src_r64) {
477481
// imul reg64, reg/mem64 -- 0x0f 0xaf /r
478-
asm_x64_write_byte_1(as, REX_PREFIX | REX_W | (dest_r64 < 8 ? 0 : REX_R) | (src_r64 < 8 ? 0 : REX_B));
482+
asm_x64_write_byte_1(as, REX_PREFIX | REX_W | REX_R_FROM_R64(dest_r64) | REX_B_FROM_R64(src_r64));
479483
asm_x64_write_byte_3(as, 0x0f, 0xaf, MODRM_R64(dest_r64) | MODRM_RM_REG | MODRM_RM_R64(src_r64));
480484
}
481485

0 commit comments

Comments
 (0)