From abd69d11d571568c503ad416a1551e3bbb6ed970 Mon Sep 17 00:00:00 2001 From: Aleksey Demakov Date: Fri, 10 Nov 2006 21:03:09 +0000 Subject: [PATCH] add JIT_OP_IABS and JIT_OP_LABS rules --- ChangeLog | 4 ++++ jit/jit-rules-x86.ins | 21 +++++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/ChangeLog b/ChangeLog index 1dbf7bd..bb29b9e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2006-11-11 Aleksey Demakov + + * jit/jit-rules-x86.ins: add JIT_OP_IABS and JIT_OP_LABS rules. + 2006-11-04 Aleksey Demakov * jit/jit-rules-x86.ins: make comparison opcodes use three-address diff --git a/jit/jit-rules-x86.ins b/jit/jit-rules-x86.ins index 10db6d4..b4f5720 100644 --- a/jit/jit-rules-x86.ins +++ b/jit/jit-rules-x86.ins @@ -1248,6 +1248,27 @@ JIT_OP_FSQRT, JIT_OP_DSQRT, JIT_OP_NFSQRT: unary, stack x86_fsqrt(inst); } +/* + * Absolute, minimum, maximum, and sign. + */ + +JIT_OP_IABS: + [reg("eax"), scratch("edx")] -> { + x86_cdq(inst); + x86_alu_reg_reg(inst, X86_XOR, $1, $2); + x86_alu_reg_reg(inst, X86_SUB, $1, $2); + } + +JIT_OP_LABS: + [lreg, scratch("?")] -> { + x86_mov_reg_reg(inst, $2, %1, 4); + x86_shift_reg_imm(inst, X86_SAR, $2, 31); + x86_alu_reg_reg(inst, X86_XOR, $1, $2); + x86_alu_reg_reg(inst, X86_XOR, %1, $2); + x86_alu_reg_reg(inst, X86_SUB, $1, $2); + x86_alu_reg_reg(inst, X86_SBB, %1, $2); + } + JIT_OP_FABS, JIT_OP_DABS, JIT_OP_NFABS: unary, stack [freg] -> { x86_fabs(inst); -- 2.47.3