[pypy-commit] pypy arm-backed-float: move functions to helper module and add some tests
bivab
noreply at buildbot.pypy.org
Mon Jun 6 18:06:41 CEST 2011
Author: David Schneider <david.schneider at picle.org>
Branch: arm-backed-float
Changeset: r44757:12afac47419d
Date: 2011-06-06 14:27 +0200
http://bitbucket.org/pypy/pypy/changeset/12afac47419d/
Log: move functions to helper module and add some tests
diff --git a/pypy/jit/backend/arm/assembler.py b/pypy/jit/backend/arm/assembler.py
--- a/pypy/jit/backend/arm/assembler.py
+++ b/pypy/jit/backend/arm/assembler.py
@@ -1,5 +1,7 @@
from __future__ import with_statement
-from pypy.jit.backend.arm.helper.assembler import saved_registers, count_reg_args
+from pypy.jit.backend.arm.helper.assembler import saved_registers, \
+ count_reg_args, decode32, \
+ decode64, encode32
from pypy.jit.backend.arm import conditions as c
from pypy.jit.backend.arm import locations
from pypy.jit.backend.arm import registers as r
@@ -172,25 +174,25 @@
if res == self.IMM_LOC:
assert group == self.INT_TYPE or group == self.REF_TYPE
# imm value
- value = self.decode32(enc, i+1)
+ value = decode32(enc, i+1)
i += 4
elif res == self.STACK_LOC:
- stack_loc = self.decode32(enc, i+1)
+ stack_loc = decode32(enc, i+1)
i += 4
if group == self.FLOAT_TYPE:
- value = self.decode64(stack, frame_depth - stack_loc*WORD)
+ value = decode64(stack, frame_depth - stack_loc*WORD)
self.fail_boxes_float.setitem(fail_index, value)
continue
else:
- value = self.decode32(stack, frame_depth - stack_loc*WORD)
+ value = decode32(stack, frame_depth - stack_loc*WORD)
else: # REG_LOC
reg = ord(enc[i])
if group == self.FLOAT_TYPE:
- value = self.decode64(vfp_regs, reg*2*WORD)
+ value = decode64(vfp_regs, reg*2*WORD)
self.fail_boxes_float.setitem(fail_index, value)
continue
else:
- value = self.decode32(regs, reg*WORD)
+ value = decode32(regs, reg*WORD)
if group == self.INT_TYPE:
self.fail_boxes_int.setitem(fail_index, value)
@@ -202,7 +204,7 @@
assert enc[i] == self.END_OF_LOCS
- descr = self.decode32(enc, i+1)
+ descr = decode32(enc, i+1)
self.fail_boxes_count = fail_index
self.fail_force_index = frame_loc
return descr
@@ -228,7 +230,7 @@
elif res == self.STACK_LOC:
if res_type == FLOAT:
assert 0, 'float on stack'
- stack_loc = self.decode32(enc, j+1)
+ stack_loc = decode32(enc, j+1)
loc = regalloc.frame_manager.frame_pos(stack_loc, INT)
j += 4
else: # REG_LOC
@@ -240,27 +242,6 @@
locs.append(loc)
return locs
- def decode32(self, mem, index):
- highval = ord(mem[index+3])
- if highval >= 128:
- highval -= 256
- return (ord(mem[index])
- | ord(mem[index+1]) << 8
- | ord(mem[index+2]) << 16
- | highval << 24)
-
- def decode64(self, mem, index):
- low = self.decode32(mem, index)
- index += 4
- high = self.decode32(mem, index)
- return r_longlong(high << 32) | r_longlong(r_uint(low))
-
- def encode32(self, mem, i, n):
- mem[i] = chr(n & 0xFF)
- mem[i+1] = chr((n >> 8) & 0xFF)
- mem[i+2] = chr((n >> 16) & 0xFF)
- mem[i+3] = chr((n >> 24) & 0xFF)
-
def _build_malloc_slowpath(self):
gcrootmap = self.cpu.gc_ll_descr.gcrootmap
mc = ARMv7Builder()
@@ -351,11 +332,11 @@
elif loc.is_imm():
assert arg.type == INT or arg.type == REF
mem[j] = self.IMM_LOC
- self.encode32(mem, j+1, loc.getint())
+ encode32(mem, j+1, loc.getint())
j += 5
else:
mem[j] = self.STACK_LOC
- self.encode32(mem, j+1, loc.position)
+ encode32(mem, j+1, loc.position)
j += 5
else:
mem[j] = self.EMPTY_LOC
@@ -365,7 +346,7 @@
mem[j] = chr(0xFF)
n = self.cpu.get_fail_descr_number(descr)
- self.encode32(mem, j+1, n)
+ encode32(mem, j+1, n)
self.mc.LDR_ri(r.ip.value, r.pc.value, imm=WORD)
if save_exc:
path = self._leave_jitted_jook_save_exc
diff --git a/pypy/jit/backend/arm/helper/assembler.py b/pypy/jit/backend/arm/helper/assembler.py
--- a/pypy/jit/backend/arm/helper/assembler.py
+++ b/pypy/jit/backend/arm/helper/assembler.py
@@ -3,6 +3,7 @@
from pypy.jit.backend.arm import registers as r
from pypy.jit.backend.arm.codebuilder import AbstractARMv7Builder
from pypy.jit.metainterp.history import ConstInt, BoxInt, FLOAT
+from pypy.rlib.rarithmetic import r_uint, r_longlong, intmask
def gen_emit_op_unary_cmp(true_cond, false_cond):
def f(self, op, arglocs, regalloc, fcond):
@@ -134,3 +135,20 @@
break
return reg_args
+def decode32(mem, index):
+ return intmask(ord(mem[index])
+ | ord(mem[index+1]) << 8
+ | ord(mem[index+2]) << 16
+ | ord(mem[index+3]) << 24)
+
+def decode64(mem, index):
+ low = decode32(mem, index)
+ index += 4
+ high = decode32(mem, index)
+ return (r_longlong(high) << 32) | r_longlong(r_uint(low))
+
+def encode32(mem, i, n):
+ mem[i] = chr(n & 0xFF)
+ mem[i+1] = chr((n >> 8) & 0xFF)
+ mem[i+2] = chr((n >> 16) & 0xFF)
+ mem[i+3] = chr((n >> 24) & 0xFF)
diff --git a/pypy/jit/backend/arm/test/test_helper.py b/pypy/jit/backend/arm/test/test_helper.py
--- a/pypy/jit/backend/arm/test/test_helper.py
+++ b/pypy/jit/backend/arm/test/test_helper.py
@@ -1,4 +1,5 @@
-from pypy.jit.backend.arm.helper.assembler import count_reg_args
+from pypy.jit.backend.arm.helper.assembler import count_reg_args, decode32, \
+ decode64, encode32
from pypy.jit.metainterp.history import (BoxInt, BoxPtr, BoxFloat,
INT, REF, FLOAT)
@@ -17,4 +18,21 @@
assert count_reg_args([BoxInt(), BoxFloat(), BoxInt()]) == 2
assert count_reg_args([BoxInt(), BoxInt(), BoxInt(), BoxFloat()]) == 3
-
+
+def test_encode32():
+ mem = [None]*4
+ encode32(mem, 0, 1234567)
+ assert ''.join(mem) == '\x87\xd6\x12\x00'
+ mem = [None]*4
+ encode32(mem, 0, 983040)
+ assert ''.join(mem) == '\x00\x00\x0F\x00'
+
+def test_decode32():
+ mem = list('\x87\xd6\x12\x00')
+ assert decode32(mem, 0) == 1234567
+ mem = list('\x00\x00\x0F\x00')
+ assert decode32(mem, 0) == 983040
+
+def test_decode64():
+ mem = list('\x87\xd6\x12\x00\x00\x00\x0F\x00')
+ assert decode64(mem, 0) == 4222124651894407L
More information about the pypy-commit
mailing list