Author: David Schneider <[email protected]>
Branch: arm-backend-2
Changeset: r45105:c1ce871f2c04
Date: 2011-06-24 10:42 +0200
http://bitbucket.org/pypy/pypy/changeset/c1ce871f2c04/
Log: fix for bc71e715e308 on ARM
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,7 +1,7 @@
from __future__ import with_statement
-from pypy.jit.backend.arm.helper.assembler import saved_registers, \
- count_reg_args, decode32, \
- decode64, encode32
+from pypy.jit.backend.arm.helper.assembler import saved_registers,
count_reg_args, \
+ decode32, encode32, \
+ decode64, encode64
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
@@ -19,9 +19,9 @@
INT, REF, FLOAT)
from pypy.jit.metainterp.resoperation import rop
from pypy.rlib import rgc
-from pypy.rlib.longlong2float import float2longlong, longlong2float
from pypy.rlib.objectmodel import we_are_translated
from pypy.rlib.rarithmetic import r_uint, r_longlong
+from pypy.rlib.longlong2float import float2longlong, longlong2float
from pypy.rpython.annlowlevel import llhelper
from pypy.rpython.lltypesystem import lltype, rffi, llmemory
from pypy.rpython.lltypesystem.lloperation import llop
@@ -173,10 +173,17 @@
i += 1
res = enc[i]
if res == self.IMM_LOC:
- assert group == self.INT_TYPE or group == self.REF_TYPE
# imm value
- value = decode32(enc, i+1)
- i += 4
+ if group == self.INT_TYPE or group == self.REF_TYPE:
+ value = decode32(enc, i+1)
+ i += 4
+ else:
+ assert group == self.FLOAT_TYPE
+ adr = decode32(enc, i+1)
+ value = rffi.cast(rffi.CArrayPtr(longlong.FLOATSTORAGE),
adr)[0]
+ self.fail_boxes_float.setitem(fail_index, value)
+ i += 4
+ continue
elif res == self.STACK_LOC:
stack_loc = decode32(enc, i+1)
i += 4
@@ -306,6 +313,7 @@
# 1 byte for the location
# 1 separator byte
# 4 bytes for the faildescr
+ # const floats are stored in memory and the box contains the address
memsize = (len(arglocs)-1)*6+5
memaddr = self.datablockwrapper.malloc_aligned(memsize, alignment=1)
mem = rffi.cast(rffi.CArrayPtr(lltype.Char), memaddr)
@@ -330,8 +338,9 @@
if loc.is_reg() or loc.is_vfp_reg():
mem[j] = chr(loc.value)
j += 1
- elif loc.is_imm():
- assert arg.type == INT or arg.type == REF
+ elif loc.is_imm() or loc.is_imm_float():
+ assert (arg.type == INT or arg.type == REF
+ or arg.type == FLOAT)
mem[j] = self.IMM_LOC
encode32(mem, j+1, loc.getint())
j += 5
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit