Author: Maciej Fijalkowski <[email protected]>
Branch: arm64
Changeset: r96854:d11024632dda
Date: 2019-06-24 10:08 +0000
http://bitbucket.org/pypy/pypy/changeset/d11024632dda/

Log:    a few more obscure operations

diff --git a/rpython/jit/backend/aarch64/codebuilder.py 
b/rpython/jit/backend/aarch64/codebuilder.py
--- a/rpython/jit/backend/aarch64/codebuilder.py
+++ b/rpython/jit/backend/aarch64/codebuilder.py
@@ -246,6 +246,18 @@
         base = 0b1001111001100010
         self.write32((base << 16) | (rn << 5) | rd)
 
+    def SXTB_rr(self, rd, rn):
+        base = 0b1001001101000000000111
+        self.write32((base << 10) | (rn << 5) | rd)
+
+    def SXTH_rr(self, rd, rn):
+        base = 0b1001001101000000001111
+        self.write32((base << 10) | (rn << 5) | rd)        
+
+    def SXTW_rr(self, rd, rn):
+        base = 0b1001001101000000011111
+        self.write32((base << 10) | (rn << 5) | rd)        
+
     def FSQRT_dd(self, rd, rn):
         base = 0b0001111001100001110000
         self.write32((base << 10) | (rn << 5) | rd)
diff --git a/rpython/jit/backend/aarch64/opassembler.py 
b/rpython/jit/backend/aarch64/opassembler.py
--- a/rpython/jit/backend/aarch64/opassembler.py
+++ b/rpython/jit/backend/aarch64/opassembler.py
@@ -228,6 +228,26 @@
         reg, res = arglocs
         self.mc.MVN_rr(res.value, reg.value)
 
+    def emit_op_int_force_ge_zero(self, op, arglocs):
+        arg, res = arglocs
+        self.mc.MOVZ_r_u16(res.value, 0, 0)
+        self.mc.CMP_ri(arg.value, 0)
+        self.mc.B_ofs_cond(8, c.LT) # jump over the next instruction
+        self.mc.MOV_rr(res.value, arg.value)
+        # jump here
+
+    def emit_op_int_signext(self, op, arglocs):
+        arg, numbytes, res = arglocs
+        assert numbytes.is_imm()
+        if numbytes.value == 1:
+            self.mc.SXTB_rr(res.value, arg.value)
+        elif numbytes.value == 2:
+            self.mc.SXTH_rr(res.value, arg.value)
+        elif numbytes.value == 4:
+            self.mc.SXTW_rr(res.value, arg.value)
+        else:
+            raise AssertionError("bad number of bytes")
+
     def emit_op_increment_debug_counter(self, op, arglocs):
         return # XXXX
         base_loc, value_loc = arglocs
diff --git a/rpython/jit/backend/aarch64/regalloc.py 
b/rpython/jit/backend/aarch64/regalloc.py
--- a/rpython/jit/backend/aarch64/regalloc.py
+++ b/rpython/jit/backend/aarch64/regalloc.py
@@ -371,6 +371,17 @@
     def prepare_comp_op_int_mul_ovf(self, op, res_in_cc):
         return self.prepare_op_int_mul(op)
 
+    def prepare_op_int_force_ge_zero(self, op):
+        argloc = self.make_sure_var_in_reg(op.getarg(0))
+        resloc = self.force_allocate_reg(op, [op.getarg(0)])
+        return [argloc, resloc]
+
+    def prepare_op_int_signext(self, op):
+        argloc = self.make_sure_var_in_reg(op.getarg(0))
+        numbytes = op.getarg(1).getint()
+        resloc = self.force_allocate_reg(op)
+        return [argloc, imm(numbytes), resloc]
+
     # some of those have forms of imm that they accept, but they're rather
     # obscure. Can be future optimization
     prepare_op_int_and = prepare_op_int_mul
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to