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+
256262void 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
298303void 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
450449void 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
542539void 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) {
587584void 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
601598void 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
620617void 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
0 commit comments