From: Aleksey Demakov Date: Fri, 10 Nov 2006 21:03:09 +0000 (+0000) Subject: add JIT_OP_IABS and JIT_OP_LABS rules X-Git-Tag: before.move.to.git~180 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=abd69d11d571568c503ad416a1551e3bbb6ed970;p=francis%2Flibjit.git add JIT_OP_IABS and JIT_OP_LABS rules --- 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);