diff --git a/src/code/amd64.c b/src/code/amd64.c index da05268ab5b13c5478af18db64b032f295a4d81a..7803769dacc6eeff8516ed8265e803394e2e13ae 100644 --- a/src/code/amd64.c +++ b/src/code/amd64.c @@ -457,14 +457,12 @@ static void clear_reg( enum amd64_reg reg ) xor_reg_reg( reg, reg ); } -#if 0 static void neg_reg( enum amd64_reg reg ) { rex(1,0,0,reg); opcode(0xf7); modrm(3,3,reg); } -#endif static void mov_imm_reg( long imm, enum amd64_reg reg ) { @@ -1951,11 +1949,18 @@ void ins_f_byte(unsigned int b) return; case F_DIVIDE: + case F_MOD: { LABELS(); if_not_two_int(&label_A,0); mov_mem_reg(sp_reg, SVAL(-1).value, P_REG_RBX ); mov_mem_reg(sp_reg, SVAL(-2).value, P_REG_RAX ); + if( b+F_OFFSET == F_MOD ) + { + cmp_reg_imm(P_REG_RAX, 0 ); + /* FIXME: Emulate pikes % functionality. */ + jl(&label_A); + } cmp_reg_imm(P_REG_RBX,0); je(&label_A); cmp_reg_imm(P_REG_RBX,-1); @@ -1966,16 +1971,23 @@ void ins_f_byte(unsigned int b) Int.native_min / -1 -> exception. + This checks for -<whatever> / -1. + There is bound to be a better way. Somehow disable the exception? - Some SSE alternative? + Some SSE alternative that does not throw? + + Perhaps a 64/64->64 instead of the current 128/64->64? */ LABEL_C; div_reg_reg(P_REG_RAX,P_REG_RBX); jo(&label_A); mov_imm_mem(PIKE_T_INT, sp_reg, SVAL(-2).type); - mov_reg_mem(P_REG_RAX, sp_reg, SVAL(-2).value); + if( b+F_OFFSET == F_MOD ) + mov_reg_mem(P_REG_RDX, sp_reg, SVAL(-2).value); + else + mov_reg_mem(P_REG_RAX, sp_reg, SVAL(-2).value); amd64_add_sp(-1); jmp(&label_B); LABEL_A;