[pypy-commit] pypy arm64: more calling
fijal
pypy.commits at gmail.com
Mon Apr 22 06:25:57 EDT 2019
Author: fijal
Branch: arm64
Changeset: r96534:26809d94a756
Date: 2019-04-22 12:25 +0200
http://bitbucket.org/pypy/pypy/changeset/26809d94a756/
Log: more calling
diff --git a/rpython/jit/backend/aarch64/assembler.py b/rpython/jit/backend/aarch64/assembler.py
--- a/rpython/jit/backend/aarch64/assembler.py
+++ b/rpython/jit/backend/aarch64/assembler.py
@@ -717,10 +717,23 @@
else:
XXX
+ def _mov_imm_to_loc(self, prev_loc, loc):
+ assert loc.is_core_reg()
+ self.mc.gen_load_int(loc.value, prev_loc.value)
+
def new_stack_loc(self, i, tp):
base_ofs = self.cpu.get_baseofs_of_frame_field()
return StackLocation(i, get_fp_offset(base_ofs, i), tp)
+ def mov_loc_to_raw_stack(self, loc, pos):
+ if loc.is_core_reg():
+ self.mc.STR_ri(loc.value, r.sp.value, pos)
+ elif loc.is_stack():
+ self.mc.LDR_ri(r.ip0.value, r.fp.value, loc.value)
+ self.mc.STR_ri(r.ip0.value, r.sp.value, pos)
+ else:
+ assert False, "wrong loc"
+
def regalloc_mov(self, prev_loc, loc):
"""Moves a value from a previous location to some other location"""
if prev_loc.is_imm():
@@ -733,8 +746,6 @@
self._mov_imm_float_to_loc(prev_loc, loc)
elif prev_loc.is_vfp_reg():
self._mov_vfp_reg_to_loc(prev_loc, loc)
- elif prev_loc.is_raw_sp():
- self._mov_raw_sp_to_loc(prev_loc, loc)
else:
assert 0, 'unsupported case'
mov_loc_loc = regalloc_mov
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
@@ -11,13 +11,6 @@
class AbstractAarch64Builder(object):
# just copied some values from https://gist.github.com/dinfuehr/51a01ac58c0b23e4de9aac313ed6a06a
- immr_imms = {
- 32: (0b111011, 0b000000),
- 56: (0b111101, 0b000010),
- 48: (0b111100, 0b000001),
- 16: (0b111100, 0b000000),
- }
-
def write32(self, word):
self.writechar(chr(word & 0xFF))
self.writechar(chr((word >> 8) & 0xFF))
@@ -139,12 +132,22 @@
base = 0b10001010000
self.write32((base << 21) | (rm << 16) | (rn << 5) | rd)
+ def AND_ri(self, rd, rn, immed):
+ assert immed == 0xFF # just one value for now, don't feel like
+ # understanding IMMR/IMMS quite yet
+ base = 0b1001001001
+ immr = 0b000000
+ imms = 0b000111
+ self.write32((base << 22) | (immr << 16) | (imms << 10) | (rn << 5) | rd)
+
def LSL_rr(self, rd, rn, rm):
base = 0b10011010110
self.write32((base << 21) | (rm << 16) | (0b001000 << 10) | (rn << 5) | rd)
def LSL_ri(self, rd, rn, shift):
- immr, imms = self.immr_imms[shift]
+ assert 0 <= shift <= 63
+ immr = 64 - shift
+ imms = immr - 1
base = 0b1101001101
self.write32((base << 22) | (immr << 16) | (imms << 10) | (rn << 5) | rd)
@@ -153,10 +156,19 @@
self.write32((base << 21) | (rm << 16) | (0b001010 << 10) | (rn << 5) | rd)
def ASR_ri(self, rd, rn, shift):
- immr, imms = self.immr_imms[shift]
+ assert 0 <= shift <= 63
+ imms = 0b111111
+ immr = shift
base = 0b1001001101
self.write32((base << 22) | (immr << 16) | (imms << 10) | (rn << 5) | rd)
+ def LSR_ri(self, rd, rn, shift):
+ assert 0 <= shift <= 63
+ imms = 0b111111
+ immr = shift
+ base = 0b1101001101
+ self.write32((base << 22) | (immr << 16) | (imms << 10) | (rn << 5) | rd)
+
def LSR_rr(self, rd, rn, rm):
base = 0b10011010110
self.write32((base << 21) | (rm << 16) | (0b001001 << 10) | (rn << 5) | rd)
More information about the pypy-commit
mailing list