[pypy-svn] r68076 - in pypy/branch/floats-via-sse2/pypy/jit/backend: llsupport llsupport/test x86
fijal at codespeak.net
fijal at codespeak.net
Thu Oct 1 00:27:34 CEST 2009
Author: fijal
Date: Thu Oct 1 00:27:33 2009
New Revision: 68076
Modified:
pypy/branch/floats-via-sse2/pypy/jit/backend/llsupport/descr.py
pypy/branch/floats-via-sse2/pypy/jit/backend/llsupport/llmodel.py
pypy/branch/floats-via-sse2/pypy/jit/backend/llsupport/test/test_descr.py
pypy/branch/floats-via-sse2/pypy/jit/backend/x86/assembler.py
pypy/branch/floats-via-sse2/pypy/jit/backend/x86/regalloc.py
pypy/branch/floats-via-sse2/pypy/jit/backend/x86/runner.py
Log:
Enough to pass the first, very basic call
Modified: pypy/branch/floats-via-sse2/pypy/jit/backend/llsupport/descr.py
==============================================================================
--- pypy/branch/floats-via-sse2/pypy/jit/backend/llsupport/descr.py (original)
+++ pypy/branch/floats-via-sse2/pypy/jit/backend/llsupport/descr.py Thu Oct 1 00:27:33 2009
@@ -1,6 +1,7 @@
from pypy.rpython.lltypesystem import lltype
from pypy.jit.backend.llsupport import symbolic
-from pypy.jit.metainterp.history import AbstractDescr, getkind, BoxInt, BoxPtr
+from pypy.jit.metainterp.history import AbstractDescr, getkind, BoxInt, BoxPtr,\
+ BoxFloat
from pypy.jit.metainterp.history import BasicFailDescr
from pypy.jit.metainterp.resoperation import ResOperation, rop
@@ -175,6 +176,7 @@
result = []
for c in self.arg_classes:
if c == 'i': box = BoxInt()
+ elif c == 'f': box = BoxFloat()
else: box = BoxPtr()
result.append(box)
return result
@@ -189,12 +191,15 @@
if self.executable_token is not None:
return self.executable_token
args = [BoxInt()] + self.instantiate_arg_classes()
- if self.get_result_size(cpu.translate_support_code) == 0:
+ res_size = self.get_result_size(cpu.translate_support_code)
+ if res_size == 0:
result = None
result_list = []
else:
if self.returns_a_pointer():
result = BoxPtr()
+ elif res_size == 8:
+ result = BoxFloat()
else:
result = BoxInt()
result_list = [result]
@@ -240,6 +245,7 @@
kind = getkind(ARG)
if kind == 'int': arg_classes.append('i')
elif kind == 'ref': arg_classes.append('r')
+ elif kind == 'float': arg_classes.append('f')
else:
raise NotImplementedError('ARG = %r' % (ARG,))
arg_classes = ''.join(arg_classes)
Modified: pypy/branch/floats-via-sse2/pypy/jit/backend/llsupport/llmodel.py
==============================================================================
--- pypy/branch/floats-via-sse2/pypy/jit/backend/llsupport/llmodel.py (original)
+++ pypy/branch/floats-via-sse2/pypy/jit/backend/llsupport/llmodel.py Thu Oct 1 00:27:33 2009
@@ -4,7 +4,8 @@
from pypy.rpython.llinterp import LLInterpreter
from pypy.rpython.annlowlevel import llhelper
from pypy.rlib.objectmodel import we_are_translated, specialize
-from pypy.jit.metainterp.history import BoxInt, BoxPtr, set_future_values
+from pypy.jit.metainterp.history import BoxInt, BoxPtr, set_future_values,\
+ BoxFloat
from pypy.jit.backend.model import AbstractCPU
from pypy.jit.backend.llsupport import symbolic
from pypy.jit.backend.llsupport.symbolic import WORD, unroll_basic_sizes
@@ -414,9 +415,12 @@
self.execute_token(executable_token)
# Note: if an exception is set, the rest of the code does a bit of
# nonsense but nothing wrong (the return value should be ignored)
+ res = calldescr.get_result_size(self.translate_support_code)
if calldescr.returns_a_pointer():
return BoxPtr(self.get_latest_value_ref(0))
- elif calldescr.get_result_size(self.translate_support_code) != 0:
+ elif res == self.FLOATSIZE:
+ return BoxFloat(self.get_latest_value_float(0))
+ elif res > 0:
return BoxInt(self.get_latest_value_int(0))
else:
return None
Modified: pypy/branch/floats-via-sse2/pypy/jit/backend/llsupport/test/test_descr.py
==============================================================================
--- pypy/branch/floats-via-sse2/pypy/jit/backend/llsupport/test/test_descr.py (original)
+++ pypy/branch/floats-via-sse2/pypy/jit/backend/llsupport/test/test_descr.py Thu Oct 1 00:27:33 2009
@@ -130,7 +130,10 @@
assert isinstance(descr3.get_result_size(True), Symbolic)
assert descr3.returns_a_pointer()
assert descr3.arg_classes == "r"
-
+ #
+ c1 = GcCache(True)
+ descr4 = get_call_descr(c1, [lltype.Float, lltype.Float], lltype.Float)
+ assert descr4.get_result_size(False) == rffi.sizeof(lltype.Float)
def test_repr_of_descr():
c0 = GcCache(False)
Modified: pypy/branch/floats-via-sse2/pypy/jit/backend/x86/assembler.py
==============================================================================
--- pypy/branch/floats-via-sse2/pypy/jit/backend/x86/assembler.py (original)
+++ pypy/branch/floats-via-sse2/pypy/jit/backend/x86/assembler.py Thu Oct 1 00:27:33 2009
@@ -255,6 +255,9 @@
else:
self.mc.MOV(to_loc, from_loc)
+ def regalloc_fstp(self, loc):
+ self.mc.FSTP(loc)
+
def regalloc_push(self, loc):
self.mc.PUSH(loc)
@@ -780,15 +783,26 @@
tmp = ecx
else:
tmp = eax
+ p = 0
for i in range(2, nargs + 2):
loc = arglocs[i]
if isinstance(loc, REG):
- self.mc.MOV(mem(esp, WORD * (i - 2)), loc)
+ if isinstance(loc, XMMREG):
+ self.mc.MOVSD(mem64(esp, p), loc)
+ p += 2*WORD
+ else:
+ self.mc.MOV(mem(esp, p), loc)
+ p += WORD
+ p = 0
for i in range(2, nargs + 2):
loc = arglocs[i]
if not isinstance(loc, REG):
- self.mc.MOV(tmp, loc)
- self.mc.MOV(mem(esp, WORD * (i - 2)), tmp)
+ if isinstance(loc, MODRM64):
+ xxx
+ else:
+ self.mc.MOV(tmp, loc)
+ self.mc.MOV(mem(esp, p), tmp)
+ p += WORD
self.mc.CALL(x)
self.mark_gc_roots()
self.mc.ADD(esp, imm(WORD * extra_on_stack))
Modified: pypy/branch/floats-via-sse2/pypy/jit/backend/x86/regalloc.py
==============================================================================
--- pypy/branch/floats-via-sse2/pypy/jit/backend/x86/regalloc.py (original)
+++ pypy/branch/floats-via-sse2/pypy/jit/backend/x86/regalloc.py Thu Oct 1 00:27:33 2009
@@ -93,12 +93,11 @@
return heap64(rffi.cast(lltype.Signed, arr) + num_pos * WORD * 2)
def after_call(self, v):
- xxx # test
# the result is stored in st0, but we don't have this around,
# so we move it to some stack location
if v is not None:
- loc = self.sm.stack_loc(v, 2)
- self.assembler.regalloc_mov(st0, loc)
+ loc = self.stack_manager.loc(v, 2)
+ self.assembler.regalloc_fstp(loc)
class X86StackManager(StackManager):
@@ -569,8 +568,12 @@
def _call(self, op, arglocs, force_store=[]):
self.rm.before_call(force_store)
+ self.xrm.before_call(force_store)
self.Perform(op, arglocs, eax)
- self.rm.after_call(op.result)
+ if op.result.type == FLOAT:
+ self.xrm.after_call(op.result)
+ else:
+ self.rm.after_call(op.result)
def consider_call(self, op, ignored):
calldescr = op.descr
Modified: pypy/branch/floats-via-sse2/pypy/jit/backend/x86/runner.py
==============================================================================
--- pypy/branch/floats-via-sse2/pypy/jit/backend/x86/runner.py (original)
+++ pypy/branch/floats-via-sse2/pypy/jit/backend/x86/runner.py Thu Oct 1 00:27:33 2009
@@ -12,6 +12,7 @@
class CPU386(AbstractLLCPU):
debug = True
supports_floats = True
+ FLOATSIZE = 8
BOOTSTRAP_TP = lltype.FuncType([], lltype.Signed)
dont_keepalive_stuff = False # for tests
More information about the Pypy-commit
mailing list