]> git.unchartedbackwaters.co.uk Git - francis/libjit.git/commitdiff
add JIT_OP_IABS and JIT_OP_LABS rules
authorAleksey Demakov <ademakov@gmail.com>
Fri, 10 Nov 2006 21:03:09 +0000 (21:03 +0000)
committerAleksey Demakov <ademakov@gmail.com>
Fri, 10 Nov 2006 21:03:09 +0000 (21:03 +0000)
ChangeLog
jit/jit-rules-x86.ins

index 1dbf7bd801c8e4a3b944fbff0240358be7fda31f..bb29b9e274f7d33fc989f3c104e8c8e90b099b57 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2006-11-11  Aleksey Demakov  <ademakov@gmail.com>
+
+       * jit/jit-rules-x86.ins: add JIT_OP_IABS and JIT_OP_LABS rules.
+
 2006-11-04  Aleksey Demakov  <ademakov@gmail.com>
 
        * jit/jit-rules-x86.ins: make comparison opcodes use three-address
index 10db6d47a712640560e9339cf7aa6b1c71683b9a..b4f5720e6935ab0ee882a80bf68380451fe1be06 100644 (file)
@@ -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);