Skip to content

Commit 3112cde

Browse files
committed
py: Implement more binary ops for viper emitter.
This included a bit of restructuring of the assembler backends. Note that the ARM backend is missing a few functions and won't compile.
1 parent 6f81348 commit 3112cde

File tree

7 files changed

+260
-117
lines changed

7 files changed

+260
-117
lines changed

py/asmarm.c

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,11 @@ STATIC uint asm_arm_op_sub_imm(uint rd, uint rn, uint imm) {
170170
return 0x2400000 | (rn << 16) | (rd << 12) | (imm & 0xFF);
171171
}
172172

173+
STATIC uint asm_arm_op_sub_reg(uint rd, uint rn, uint rm) {
174+
// sub rd, rn, rm
175+
return 0x0400000 | (rn << 16) | (rd << 12) | rm;
176+
}
177+
173178
void asm_arm_bkpt(asm_arm_t *as) {
174179
// bkpt #0
175180
emit_al(as, 0x1200070);
@@ -298,11 +303,16 @@ void asm_arm_less_op(asm_arm_t *as, uint rd, uint rn, uint rm) {
298303
emit(as, asm_arm_op_mov_imm(rd, 0) | ASM_ARM_CC_GE); // movge rd, #0
299304
}
300305

301-
void asm_arm_add_reg(asm_arm_t *as, uint rd, uint rn, uint rm) {
306+
void asm_arm_add_reg_reg_reg(asm_arm_t *as, uint rd, uint rn, uint rm) {
302307
// add rd, rn, rm
303308
emit_al(as, asm_arm_op_add_reg(rd, rn, rm));
304309
}
305310

311+
void asm_arm_sub_reg_reg_reg(asm_arm_t *as, uint rd, uint rn, uint rm) {
312+
// sub rd, rn, rm
313+
emit_al(as, asm_arm_op_sub_reg(rd, rn, rm));
314+
}
315+
306316
void asm_arm_mov_reg_local_addr(asm_arm_t *as, uint rd, int local_num) {
307317
// add rd, sp, #local_num*4
308318
emit_al(as, asm_arm_op_add_imm(rd, ASM_ARM_REG_SP, local_num << 2));

py/asmarm.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,8 @@ void asm_arm_mov_reg_local(asm_arm_t *as, uint rd, int local_num);
8989
void asm_arm_cmp_reg_i8(asm_arm_t *as, uint rd, int imm);
9090
void asm_arm_cmp_reg_reg(asm_arm_t *as, uint rd, uint rn);
9191
void asm_arm_less_op(asm_arm_t *as, uint rd, uint rn, uint rm);
92-
void asm_arm_add_reg(asm_arm_t *as, uint rd, uint rn, uint rm);
92+
void asm_arm_add_reg_reg_reg(asm_arm_t *as, uint rd, uint rn, uint rm);
93+
void asm_arm_sub_reg_reg_reg(asm_arm_t *as, uint rd, uint rn, uint rm);
9394
void asm_arm_mov_reg_local_addr(asm_arm_t *as, uint rd, int local_num);
9495

9596
void asm_arm_bcc_label(asm_arm_t *as, int cond, uint label);

py/asmx64.c

Lines changed: 36 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -54,19 +54,21 @@
5454
#define OPCODE_MOV_RM64_TO_R64 (0x8b)
5555
#define OPCODE_LEA_MEM_TO_R64 (0x8d) /* /r */
5656
#define OPCODE_XOR_R64_TO_RM64 (0x31) /* /r */
57-
#define OPCODE_ADD_R64_TO_RM64 (0x01)
57+
#define OPCODE_ADD_R64_TO_RM64 (0x01) /* /r */
5858
#define OPCODE_ADD_I32_TO_RM32 (0x81) /* /0 */
5959
#define OPCODE_ADD_I8_TO_RM32 (0x83) /* /0 */
6060
#define OPCODE_SUB_R64_FROM_RM64 (0x29)
6161
#define OPCODE_SUB_I32_FROM_RM64 (0x81) /* /5 */
6262
#define OPCODE_SUB_I8_FROM_RM64 (0x83) /* /5 */
63-
#define OPCODE_SHL_RM32_BY_I8 (0xc1) /* /4 */
64-
#define OPCODE_SHR_RM32_BY_I8 (0xc1) /* /5 */
65-
#define OPCODE_SAR_RM32_BY_I8 (0xc1) /* /7 */
66-
#define OPCODE_CMP_I32_WITH_RM32 (0x81) /* /7 */
67-
#define OPCODE_CMP_I8_WITH_RM32 (0x83) /* /7 */
68-
#define OPCODE_CMP_R64_WITH_RM64 (0x39)
69-
#define OPCODE_CMP_RM32_WITH_R32 (0x3b)
63+
//#define OPCODE_SHL_RM32_BY_I8 (0xc1) /* /4 */
64+
//#define OPCODE_SHR_RM32_BY_I8 (0xc1) /* /5 */
65+
//#define OPCODE_SAR_RM32_BY_I8 (0xc1) /* /7 */
66+
#define OPCODE_SHL_RM64_CL (0xd3) /* /4 */
67+
#define OPCODE_SAR_RM64_CL (0xd3) /* /7 */
68+
//#define OPCODE_CMP_I32_WITH_RM32 (0x81) /* /7 */
69+
//#define OPCODE_CMP_I8_WITH_RM32 (0x83) /* /7 */
70+
#define OPCODE_CMP_R64_WITH_RM64 (0x39) /* /r */
71+
//#define OPCODE_CMP_RM32_WITH_R32 (0x3b)
7072
#define OPCODE_TEST_R8_WITH_RM8 (0x84) /* /r */
7173
#define OPCODE_JMP_REL8 (0xeb)
7274
#define OPCODE_JMP_REL32 (0xe9)
@@ -253,6 +255,10 @@ STATIC void asm_x64_write_r64_disp(asm_x64_t *as, int r64, int disp_r64, int dis
253255
}
254256
}
255257

258+
STATIC void asm_x64_generic_r64_r64(asm_x64_t *as, int dest_r64, int src_r64, int op) {
259+
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));
260+
}
261+
256262
void asm_x64_nop(asm_x64_t *as) {
257263
asm_x64_write_byte_1(as, OPCODE_NOP);
258264
}
@@ -290,9 +296,8 @@ STATIC void asm_x64_ret(asm_x64_t *as) {
290296
asm_x64_write_byte_1(as, OPCODE_RET);
291297
}
292298

293-
void asm_x64_mov_r64_to_r64(asm_x64_t *as, int src_r64, int dest_r64) {
294-
// use REX prefix for 64 bit operation
295-
asm_x64_write_byte_3(as, REX_PREFIX | REX_W | (src_r64 < 8 ? 0 : REX_R) | (dest_r64 < 8 ? 0 : REX_B), OPCODE_MOV_R64_TO_RM64, MODRM_R64(src_r64) | MODRM_RM_REG | MODRM_RM_R64(dest_r64));
299+
void asm_x64_mov_r64_r64(asm_x64_t *as, int dest_r64, int src_r64) {
300+
asm_x64_generic_r64_r64(as, dest_r64, src_r64, OPCODE_MOV_R64_TO_RM64);
296301
}
297302

298303
void asm_x64_mov_r8_to_disp(asm_x64_t *as, int src_r64, int dest_r64, int dest_disp) {
@@ -377,30 +382,24 @@ void asm_x64_mov_i64_to_r64_aligned(asm_x64_t *as, int64_t src_i64, int dest_r64
377382
asm_x64_mov_i64_to_r64(as, src_i64, dest_r64);
378383
}
379384

380-
void asm_x64_xor_r64_to_r64(asm_x64_t *as, int src_r64, int dest_r64) {
381-
assert(src_r64 < 8);
382-
assert(dest_r64 < 8);
383-
asm_x64_write_byte_3(as, REX_PREFIX | REX_W, OPCODE_XOR_R64_TO_RM64, MODRM_R64(src_r64) | MODRM_RM_REG | MODRM_RM_R64(dest_r64));
385+
void asm_x64_xor_r64_r64(asm_x64_t *as, int dest_r64, int src_r64) {
386+
asm_x64_generic_r64_r64(as, dest_r64, src_r64, OPCODE_XOR_R64_TO_RM64);
384387
}
385388

386-
void asm_x64_add_r64_to_r64(asm_x64_t *as, int src_r64, int dest_r64) {
387-
assert(src_r64 < 8);
388-
assert(dest_r64 < 8);
389-
asm_x64_write_byte_3(as, REX_PREFIX | REX_W, OPCODE_ADD_R64_TO_RM64, MODRM_R64(src_r64) | MODRM_RM_REG | MODRM_RM_R64(dest_r64));
389+
void asm_x64_shl_r64_cl(asm_x64_t* as, int dest_r64) {
390+
asm_x64_generic_r64_r64(as, dest_r64, 4, OPCODE_SHL_RM64_CL);
390391
}
391392

392-
/*
393-
void asm_x64_sub_r32_from_r32(asm_x64_t *as, int src_r32, int dest_r32) {
394-
// defaults to 32 bit operation
395-
asm_x64_write_byte_2(as, OPCODE_SUB_R64_FROM_RM64, MODRM_R64(src_r32) | MODRM_RM_REG | MODRM_RM_R64(dest_r32));
393+
void asm_x64_sar_r64_cl(asm_x64_t* as, int dest_r64) {
394+
asm_x64_generic_r64_r64(as, dest_r64, 7, OPCODE_SAR_RM64_CL);
396395
}
397-
*/
398396

399-
void asm_x64_sub_r64_from_r64(asm_x64_t *as, int src_r64, int dest_r64) {
400-
// use REX prefix for 64 bit operation
401-
assert(src_r64 < 8);
402-
assert(dest_r64 < 8);
403-
asm_x64_write_byte_3(as, REX_PREFIX | REX_W, OPCODE_SUB_R64_FROM_RM64, MODRM_R64(src_r64) | MODRM_RM_REG | MODRM_RM_R64(dest_r64));
397+
void asm_x64_add_r64_r64(asm_x64_t *as, int dest_r64, int src_r64) {
398+
asm_x64_generic_r64_r64(as, dest_r64, src_r64, OPCODE_ADD_R64_TO_RM64);
399+
}
400+
401+
void asm_x64_sub_r64_r64(asm_x64_t *as, int dest_r64, int src_r64) {
402+
asm_x64_generic_r64_r64(as, dest_r64, src_r64, OPCODE_SUB_R64_FROM_RM64);
404403
}
405404

406405
/*
@@ -417,7 +416,7 @@ void asm_x64_sub_i32_from_r32(asm_x64_t *as, int src_i32, int dest_r32) {
417416
}
418417
*/
419418

420-
void asm_x64_sub_i32_from_r64(asm_x64_t *as, int src_i32, int dest_r64) {
419+
STATIC void asm_x64_sub_r64_i32(asm_x64_t *as, int dest_r64, int src_i32) {
421420
assert(dest_r64 < 8);
422421
if (SIGNED_FIT8(src_i32)) {
423422
// use REX prefix for 64 bit operation
@@ -448,9 +447,7 @@ void asm_x64_sar_r32_by_imm(asm_x64_t *as, int r32, int imm) {
448447
*/
449448

450449
void asm_x64_cmp_r64_with_r64(asm_x64_t *as, int src_r64_a, int src_r64_b) {
451-
assert(src_r64_a < 8);
452-
assert(src_r64_b < 8);
453-
asm_x64_write_byte_3(as, REX_PREFIX | REX_W, OPCODE_CMP_R64_WITH_RM64, MODRM_R64(src_r64_a) | MODRM_RM_REG | MODRM_RM_R64(src_r64_b));
450+
asm_x64_generic_r64_r64(as, src_r64_b, src_r64_a, OPCODE_CMP_R64_WITH_RM64);
454451
}
455452

456453
/*
@@ -541,12 +538,12 @@ void asm_x64_jcc_label(asm_x64_t *as, int jcc_type, int label) {
541538

542539
void asm_x64_entry(asm_x64_t *as, int num_locals) {
543540
asm_x64_push_r64(as, ASM_X64_REG_RBP);
544-
asm_x64_mov_r64_to_r64(as, ASM_X64_REG_RSP, ASM_X64_REG_RBP);
541+
asm_x64_mov_r64_r64(as, ASM_X64_REG_RBP, ASM_X64_REG_RSP);
545542
if (num_locals < 0) {
546543
num_locals = 0;
547544
}
548545
num_locals |= 1; // make it odd so stack is aligned on 16 byte boundary
549-
asm_x64_sub_i32_from_r64(as, num_locals * WORD_SIZE, ASM_X64_REG_RSP);
546+
asm_x64_sub_r64_i32(as, ASM_X64_REG_RSP, num_locals * WORD_SIZE);
550547
asm_x64_push_r64(as, ASM_X64_REG_RBX);
551548
asm_x64_push_r64(as, ASM_X64_REG_R12);
552549
asm_x64_push_r64(as, ASM_X64_REG_R13);
@@ -587,7 +584,7 @@ void asm_x64_mov_r64_to_local(asm_x64_t *as, int src_r64, int dest_local_num) {
587584
void asm_x64_mov_local_addr_to_r64(asm_x64_t *as, int local_num, int dest_r64) {
588585
int offset = asm_x64_local_offset_from_ebp(as, local_num);
589586
if (offset == 0) {
590-
asm_x64_mov_r64_to_r64(as, ASM_X64_REG_RBP, dest_r64);
587+
asm_x64_mov_r64_r64(as, dest_r64, ASM_X64_REG_RBP);
591588
} else {
592589
asm_x64_lea_disp_to_r64(as, ASM_X64_REG_RBP, offset, dest_r64);
593590
}
@@ -600,7 +597,7 @@ void asm_x64_push_local(asm_x64_t *as, int local_num) {
600597
601598
void asm_x64_push_local_addr(asm_x64_t *as, int local_num, int temp_r64)
602599
{
603-
asm_x64_mov_r64_to_r64(as, ASM_X64_REG_RBP, temp_r64);
600+
asm_x64_mov_r64_r64(as, temp_r64, ASM_X64_REG_RBP);
604601
asm_x64_add_i32_to_r32(as, asm_x64_local_offset_from_ebp(as, local_num), temp_r64);
605602
asm_x64_push_r64(as, temp_r64);
606603
}
@@ -614,7 +611,7 @@ void asm_x64_call(asm_x64_t *as, void* func)
614611
asm_x64_sub_i32_from_r32(as, 8, ASM_X64_REG_RSP);
615612
asm_x64_write_byte_1(as, OPCODE_CALL_REL32);
616613
asm_x64_write_word32(as, func - (void*)(as->code_cur + 4));
617-
asm_x64_mov_r64_to_r64(as, ASM_X64_REG_RBP, ASM_X64_REG_RSP);
614+
asm_x64_mov_r64_r64(as, ASM_X64_REG_RSP, ASM_X64_REG_RBP);
618615
}
619616
620617
void asm_x64_call_i1(asm_x64_t *as, void* func, int i1)
@@ -625,7 +622,7 @@ void asm_x64_call_i1(asm_x64_t *as, void* func, int i1)
625622
asm_x64_write_byte_1(as, OPCODE_CALL_REL32);
626623
asm_x64_write_word32(as, func - (void*)(as->code_cur + 4));
627624
asm_x64_add_i32_to_r32(as, 16, ASM_X64_REG_RSP);
628-
asm_x64_mov_r64_to_r64(as, ASM_X64_REG_RBP, ASM_X64_REG_RSP);
625+
asm_x64_mov_r64_r64(as, ASM_X64_REG_RSP, ASM_X64_REG_RBP);
629626
}
630627
*/
631628

py/asmx64.h

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,11 @@
3131
// - RAX, RCX, RDX, RSI, RDI, R08, R09, R10, R11 are caller-save
3232
// - RBX, RBP, R12, R13, R14, R15 are callee-save
3333

34+
// In the functions below, argument order follows x86 docs and generally
35+
// the destination is the first argument.
36+
// NOTE: this is a change from the old convention used in this file and
37+
// some functions still use the old (reverse) convention.
38+
3439
#define ASM_X64_PASS_COMPUTE (1)
3540
#define ASM_X64_PASS_EMIT (2)
3641

@@ -58,6 +63,8 @@
5863
#define ASM_X64_CC_JNZ (0x5)
5964
#define ASM_X64_CC_JNE (0x5)
6065
#define ASM_X64_CC_JL (0xc) // less, signed
66+
#define ASM_X64_CC_JGE (0xd) // greater or equal, signed
67+
#define ASM_X64_CC_JLE (0xe) // less or equal, signed
6168
#define ASM_X64_CC_JG (0xf) // greater, signed
6269

6370
typedef struct _asm_x64_t asm_x64_t;
@@ -72,15 +79,18 @@ void* asm_x64_get_code(asm_x64_t* as);
7279
void asm_x64_nop(asm_x64_t* as);
7380
void asm_x64_push_r64(asm_x64_t* as, int src_r64);
7481
void asm_x64_pop_r64(asm_x64_t* as, int dest_r64);
75-
void asm_x64_mov_r64_to_r64(asm_x64_t* as, int src_r64, int dest_r64);
82+
void asm_x64_mov_r64_r64(asm_x64_t* as, int dest_r64, int src_r64);
7683
void asm_x64_mov_i64_to_r64(asm_x64_t* as, int64_t src_i64, int dest_r64);
7784
void asm_x64_mov_i64_to_r64_optimised(asm_x64_t *as, int64_t src_i64, int dest_r64);
7885
void asm_x64_mov_i64_to_r64_aligned(asm_x64_t *as, int64_t src_i64, int dest_r64);
7986
void asm_x64_mov_r8_to_disp(asm_x64_t *as, int src_r64, int dest_r64, int dest_disp);
8087
void asm_x64_mov_r16_to_disp(asm_x64_t *as, int src_r64, int dest_r64, int dest_disp);
8188
void asm_x64_mov_r64_to_disp(asm_x64_t *as, int src_r64, int dest_r64, int dest_disp);
82-
void asm_x64_xor_r64_to_r64(asm_x64_t *as, int src_r64, int dest_r64);
83-
void asm_x64_add_r64_to_r64(asm_x64_t* as, int src_r64, int dest_r64);
89+
void asm_x64_xor_r64_r64(asm_x64_t *as, int dest_r64, int src_r64);
90+
void asm_x64_shl_r64_cl(asm_x64_t* as, int dest_r64);
91+
void asm_x64_sar_r64_cl(asm_x64_t* as, int dest_r64);
92+
void asm_x64_add_r64_r64(asm_x64_t* as, int dest_r64, int src_r64);
93+
void asm_x64_sub_r64_r64(asm_x64_t* as, int dest_r64, int src_r64);
8494
void asm_x64_cmp_r64_with_r64(asm_x64_t* as, int src_r64_a, int src_r64_b);
8595
void asm_x64_test_r8_with_r8(asm_x64_t* as, int src_r64_a, int src_r64_b);
8696
void asm_x64_setcc_r8(asm_x64_t* as, int jcc_type, int dest_r8);

py/asmx86.c

Lines changed: 28 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -57,12 +57,14 @@
5757
#define OPCODE_ADD_R32_TO_RM32 (0x01)
5858
#define OPCODE_ADD_I32_TO_RM32 (0x81) /* /0 */
5959
#define OPCODE_ADD_I8_TO_RM32 (0x83) /* /0 */
60-
//#define OPCODE_SUB_R32_FROM_RM32 (0x29)
60+
#define OPCODE_SUB_R32_FROM_RM32 (0x29)
6161
#define OPCODE_SUB_I32_FROM_RM32 (0x81) /* /5 */
6262
#define OPCODE_SUB_I8_FROM_RM32 (0x83) /* /5 */
6363
//#define OPCODE_SHL_RM32_BY_I8 (0xc1) /* /4 */
6464
//#define OPCODE_SHR_RM32_BY_I8 (0xc1) /* /5 */
6565
//#define OPCODE_SAR_RM32_BY_I8 (0xc1) /* /7 */
66+
#define OPCODE_SHL_RM32_CL (0xd3) /* /4 */
67+
#define OPCODE_SAR_RM32_CL (0xd3) /* /7 */
6668
//#define OPCODE_CMP_I32_WITH_RM32 (0x81) /* /7 */
6769
//#define OPCODE_CMP_I8_WITH_RM32 (0x83) /* /7 */
6870
#define OPCODE_CMP_R32_WITH_RM32 (0x39)
@@ -204,6 +206,10 @@ STATIC void asm_x86_write_r32_disp(asm_x86_t *as, int r32, int disp_r32, int dis
204206
}
205207
}
206208

209+
STATIC void asm_x86_generic_r32_r32(asm_x86_t *as, int dest_r32, int src_r32, int op) {
210+
asm_x86_write_byte_2(as, op, MODRM_R32(src_r32) | MODRM_RM_REG | MODRM_RM_R32(dest_r32));
211+
}
212+
207213
STATIC void asm_x86_nop(asm_x86_t *as) {
208214
asm_x86_write_byte_1(as, OPCODE_NOP);
209215
}
@@ -232,8 +238,8 @@ STATIC void asm_x86_ret(asm_x86_t *as) {
232238
asm_x86_write_byte_1(as, OPCODE_RET);
233239
}
234240

235-
void asm_x86_mov_r32_to_r32(asm_x86_t *as, int src_r32, int dest_r32) {
236-
asm_x86_write_byte_2(as, OPCODE_MOV_R32_TO_RM32, MODRM_R32(src_r32) | MODRM_RM_REG | MODRM_RM_R32(dest_r32));
241+
void asm_x86_mov_r32_r32(asm_x86_t *as, int dest_r32, int src_r32) {
242+
asm_x86_generic_r32_r32(as, dest_r32, src_r32, OPCODE_MOV_R32_TO_RM32);
237243
}
238244

239245
void asm_x86_mov_r8_to_disp(asm_x86_t *as, int src_r32, int dest_r32, int dest_disp) {
@@ -281,12 +287,20 @@ void asm_x86_mov_i32_to_r32_aligned(asm_x86_t *as, int32_t src_i32, int dest_r32
281287
asm_x86_mov_i32_to_r32(as, src_i32, dest_r32);
282288
}
283289

284-
void asm_x86_xor_r32_to_r32(asm_x86_t *as, int src_r32, int dest_r32) {
285-
asm_x86_write_byte_2(as, OPCODE_XOR_R32_TO_RM32, MODRM_R32(src_r32) | MODRM_RM_REG | MODRM_RM_R32(dest_r32));
290+
void asm_x86_xor_r32_r32(asm_x86_t *as, int dest_r32, int src_r32) {
291+
asm_x86_generic_r32_r32(as, dest_r32, src_r32, OPCODE_XOR_R32_TO_RM32);
292+
}
293+
294+
void asm_x86_shl_r32_cl(asm_x86_t* as, int dest_r32) {
295+
asm_x86_generic_r32_r32(as, dest_r32, 4, OPCODE_SHL_RM32_CL);
286296
}
287297

288-
void asm_x86_add_r32_to_r32(asm_x86_t *as, int src_r32, int dest_r32) {
289-
asm_x86_write_byte_2(as, OPCODE_ADD_R32_TO_RM32, MODRM_R32(src_r32) | MODRM_RM_REG | MODRM_RM_R32(dest_r32));
298+
void asm_x86_sar_r32_cl(asm_x86_t* as, int dest_r32) {
299+
asm_x86_generic_r32_r32(as, dest_r32, 7, OPCODE_SAR_RM32_CL);
300+
}
301+
302+
void asm_x86_add_r32_r32(asm_x86_t *as, int dest_r32, int src_r32) {
303+
asm_x86_generic_r32_r32(as, dest_r32, src_r32, OPCODE_ADD_R32_TO_RM32);
290304
}
291305

292306
void asm_x86_add_i32_to_r32(asm_x86_t *as, int src_i32, int dest_r32) {
@@ -299,13 +313,11 @@ void asm_x86_add_i32_to_r32(asm_x86_t *as, int src_i32, int dest_r32) {
299313
}
300314
}
301315

302-
#if 0
303-
void asm_x86_sub_r32_from_r32(asm_x86_t *as, int src_r32, int dest_r32) {
304-
asm_x86_write_byte_2(as, OPCODE_SUB_R32_FROM_RM32, MODRM_R32(src_r32) | MODRM_RM_REG | MODRM_RM_R32(dest_r32));
316+
void asm_x86_sub_r32_r32(asm_x86_t *as, int dest_r32, int src_r32) {
317+
asm_x86_generic_r32_r32(as, dest_r32, src_r32, OPCODE_SUB_R32_FROM_RM32);
305318
}
306-
#endif
307319

308-
void asm_x86_sub_i32_from_r32(asm_x86_t *as, int src_i32, int dest_r32) {
320+
STATIC void asm_x86_sub_r32_i32(asm_x86_t *as, int dest_r32, int src_i32) {
309321
if (SIGNED_FIT8(src_i32)) {
310322
// defaults to 32 bit operation
311323
asm_x86_write_byte_2(as, OPCODE_SUB_I8_FROM_RM32, MODRM_R32(5) | MODRM_RM_REG | MODRM_RM_R32(dest_r32));
@@ -426,9 +438,9 @@ void asm_x86_jcc_label(asm_x86_t *as, mp_uint_t jcc_type, mp_uint_t label) {
426438

427439
void asm_x86_entry(asm_x86_t *as, mp_uint_t num_locals) {
428440
asm_x86_push_r32(as, ASM_X86_REG_EBP);
429-
asm_x86_mov_r32_to_r32(as, ASM_X86_REG_ESP, ASM_X86_REG_EBP);
441+
asm_x86_mov_r32_r32(as, ASM_X86_REG_EBP, ASM_X86_REG_ESP);
430442
if (num_locals > 0) {
431-
asm_x86_sub_i32_from_r32(as, num_locals * WORD_SIZE, ASM_X86_REG_ESP);
443+
asm_x86_sub_r32_i32(as, ASM_X86_REG_ESP, num_locals * WORD_SIZE);
432444
}
433445
asm_x86_push_r32(as, ASM_X86_REG_EBX);
434446
asm_x86_push_r32(as, ASM_X86_REG_ESI);
@@ -487,7 +499,7 @@ void asm_x86_mov_r32_to_local(asm_x86_t *as, int src_r32, int dest_local_num) {
487499
void asm_x86_mov_local_addr_to_r32(asm_x86_t *as, int local_num, int dest_r32) {
488500
int offset = asm_x86_local_offset_from_ebp(as, local_num);
489501
if (offset == 0) {
490-
asm_x86_mov_r32_to_r32(as, ASM_X86_REG_EBP, dest_r32);
502+
asm_x86_mov_r32_r32(as, dest_r32, ASM_X86_REG_EBP);
491503
} else {
492504
asm_x86_lea_disp_to_r32(as, ASM_X86_REG_EBP, offset, dest_r32);
493505
}
@@ -500,7 +512,7 @@ void asm_x86_push_local(asm_x86_t *as, int local_num) {
500512

501513
void asm_x86_push_local_addr(asm_x86_t *as, int local_num, int temp_r32)
502514
{
503-
asm_x86_mov_r32_to_r32(as, ASM_X86_REG_EBP, temp_r32);
515+
asm_x86_mov_r32_r32(as, temp_r32, ASM_X86_REG_EBP);
504516
asm_x86_add_i32_to_r32(as, asm_x86_local_offset_from_ebp(as, local_num), temp_r32);
505517
asm_x86_push_r32(as, temp_r32);
506518
}

0 commit comments

Comments
 (0)