From 36fea05e845180308f1e19aeb1a9e508d5eb7a86 Mon Sep 17 00:00:00 2001 From: Per Hedbor <ph@opera.com> Date: Sun, 31 Aug 2014 15:26:19 +0200 Subject: [PATCH] Added F_COMPL. Fixed F_AND_INT --- src/code/amd64.c | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/src/code/amd64.c b/src/code/amd64.c index dc2aa8f249..7ede03f513 100644 --- a/src/code/amd64.c +++ b/src/code/amd64.c @@ -585,6 +585,13 @@ static void neg_mem( enum amd64_reg reg, int off ) offset_modrm_sib( off, 3, reg ); } +static void not_mem( enum amd64_reg reg, int off ) +{ + rex( 1, 0, 0, reg ); + opcode(0xf7); + offset_modrm_sib( off, 2, reg ); +} + static void add_reg_imm( enum amd64_reg reg, int imm32 ) { if( !imm32 ) return; @@ -1866,6 +1873,23 @@ void ins_f_byte(unsigned int b) } return; + case F_COMPL: + { + LABELS(); + ins_debug_instr_prologue(b, 0, 0); + amd64_load_sp_reg(); + mov_mem8_reg(sp_reg, SVAL(-1).type, P_REG_RAX ); + test_reg32(P_REG_RAX); + jz(&label_B); + LABEL_A; + amd64_call_c_opcode(addr, flags); + jmp(&label_C); + LABEL_B; + not_mem(sp_reg, SVAL(-1).value ); + LABEL_C; + } + return; + case F_AND: { LABELS(); @@ -2871,7 +2895,7 @@ void ins_f_byte_with_arg(unsigned int a, INT32 b) mov_mem_reg(sp_reg, SVAL(-1).value, P_REG_RAX ); and_reg_imm(P_REG_RAX,b); mov_imm_mem(PIKE_T_INT,sp_reg,SVAL(-1).type); - mov_reg_mem(P_REG_RBX,sp_reg,SVAL(-1).value); + mov_reg_mem(P_REG_RAX,sp_reg,SVAL(-1).value); jmp(&label_B); LABEL_A; update_arg1(b); -- GitLab