Author: Richard Plangger <[email protected]>
Branch: s390x-backend
Changeset: r80385:05b9b0babd4d
Date: 2015-10-22 11:40 +0200
http://bitbucket.org/pypy/pypy/changeset/05b9b0babd4d/
Log: testing floating point operations, load float and round it to
integer
diff --git a/rpython/jit/backend/detect_cpu.py
b/rpython/jit/backend/detect_cpu.py
--- a/rpython/jit/backend/detect_cpu.py
+++ b/rpython/jit/backend/detect_cpu.py
@@ -13,6 +13,7 @@
MODEL_X86 = 'x86'
MODEL_X86_NO_SSE2 = 'x86-without-sse2'
MODEL_X86_64 = 'x86-64'
+MODEL_X86_64_SSE4 = 'x86-64-sse4'
MODEL_ARM = 'arm'
MODEL_PPC_64 = 'ppc-64'
MODEL_S390_64 = 's390x'
diff --git a/rpython/jit/backend/zarch/instruction_builder.py
b/rpython/jit/backend/zarch/instruction_builder.py
--- a/rpython/jit/backend/zarch/instruction_builder.py
+++ b/rpython/jit/backend/zarch/instruction_builder.py
@@ -7,6 +7,8 @@
""" NOT_RPYTHON """
if arg == 'r' or arg == 'r/m':
return 0
+ if arg == 'f':
+ return 0
if arg.startswith('i') or arg.startswith('u'):
return 0
return loc.addr(0)
@@ -18,6 +20,7 @@
""" NOT_RPYTHON """
"""
Available names:
+ f - floating point register
r - register
r/m - register or mask
iX - immediate X bits (signed)
@@ -287,11 +290,22 @@
self.writechar(opcode2)
return encode_ri
+def build_rrf(mnemonic, (opcode1,opcode2)):
+ @builder.arguments('r,r/m,r,r/m')
+ def encode_rrf(self, r1, rm3, r2, rm4):
+ self.writechar(opcode1)
+ self.writechar(opcode2)
+ byte = (rm3 & BIT_MASK_4) << 4 | (rm4 & BIT_MASK_4)
+ self.writechar(chr(byte))
+ byte = (r1 & BIT_MASK_4) << 4 | (r2 & BIT_MASK_4)
+ self.writechar(chr(byte))
+ return encode_rrf
+
def build_unpack_func(mnemonic, func):
def function(self, *args):
newargs = [None] * len(args)
for i,arg in enumerate(unrolling_iterable(func._arguments_)):
- if arg == 'r' or arg == 'r/m':
+ if arg == 'r' or arg == 'r/m' or arg == 'f':
newargs[i] = args[i].value
elif arg.startswith('i') or arg.startswith('u'):
newargs[i] = args[i].value
diff --git a/rpython/jit/backend/zarch/instructions.py
b/rpython/jit/backend/zarch/instructions.py
--- a/rpython/jit/backend/zarch/instructions.py
+++ b/rpython/jit/backend/zarch/instructions.py
@@ -20,6 +20,8 @@
'AG': ('rxy', ['\xE3','\x08']),
'AGF': ('rxy', ['\xE3','\x18']),
'AHI': ('ri', ['\xA7','\x0A']),
+
+ # floating point
}
logic_mnemonic_codes = {
@@ -64,6 +66,39 @@
'OILL': ('ri_u', ['\xA5', '\x0B']),
}
+memory_mnemonic_codes = {
+ # load address
+ 'LA': ('rx', ['\x41']),
+ 'LAY': ('rxy', ['\xE3','\x71']),
+
+ # load memory
+ 'LMD': ('sse', ['\xEF']),
+ 'LMG': ('rsy', ['\xEB','\x04']),
+ 'LGHI': ('ri', ['\xA7','\x09']),
+ 'LR': ('rr', ['\x18']),
+ 'LGR': ('rre', ['\xB9','\x04']),
+ 'LG': ('rxy', ['\xE3','\x04']),
+
+ # load binary float
+ # E -> short (32bit),
+ # D -> long (64bit),
+ # X -> extended (128bit)
+ 'LER': ('rr', ['\x38']),
+ 'LDR': ('rr', ['\x28']),
+ 'LE': ('rx', ['\x78']),
+ 'LD': ('rx', ['\x68']),
+ 'LEY': ('rxy', ['\xED', '\x64']),
+ 'LDY': ('rxy', ['\xED', '\x65']),
+}
+
+floatingpoint_mnemonic_codes = {
+ 'FIEBR': ('rrf', ['\xB3','\x57']),
+ 'FIDBR': ('rrf', ['\xB3','\x5F']),
+
+ 'CGEBR': ('rrf', ['\xB3','\xA8']),
+ 'CGDBR': ('rrf', ['\xB3','\xA9']),
+}
+
all_mnemonic_codes = {
#
'BXH': ('rs', ['\x86']),
@@ -77,15 +112,6 @@
'SRP': ('ssc', ['\xF0']),
'MVCK': ('ssd', ['\xD9']),
- 'LA': ('rx', ['\x41']),
- 'LAY': ('rxy', ['\xE3','\x71']),
- 'LMD': ('sse', ['\xEF']),
- 'LMG': ('rsy', ['\xEB','\x04']),
- 'LGHI': ('ri', ['\xA7','\x09']),
- 'LR': ('rr', ['\x18']),
- 'LGR': ('rre', ['\xB9','\x04']),
- 'LG': ('rxy', ['\xE3','\x04']),
-
'PKA': ('ssf', ['\xE9']),
'STMG': ('rsy', ['\xEB','\x24']),
@@ -93,6 +119,8 @@
}
all_mnemonic_codes.update(arith_mnemonic_codes)
all_mnemonic_codes.update(logic_mnemonic_codes)
+all_mnemonic_codes.update(memory_mnemonic_codes)
+all_mnemonic_codes.update(floatingpoint_mnemonic_codes)
all_mnemonic_codes.update(branch_mnemonic_codes)
diff --git a/rpython/jit/backend/zarch/test/support.py
b/rpython/jit/backend/zarch/test/support.py
--- a/rpython/jit/backend/zarch/test/support.py
+++ b/rpython/jit/backend/zarch/test/support.py
@@ -1,9 +1,11 @@
from rpython.rtyper.lltypesystem import lltype, rffi
-def run_asm(asm):
+def run_asm(asm, return_float=False):
BOOTSTRAP_TP = lltype.FuncType([], lltype.Signed)
addr = asm.mc.materialize(asm.cpu, [], None)
assert addr % 8 == 0
func = rffi.cast(lltype.Ptr(BOOTSTRAP_TP), addr)
asm.mc._dump_trace(addr, 'test.asm')
+ if return_float:
+ pass
return func()
diff --git a/rpython/jit/backend/zarch/test/test_assembler.py
b/rpython/jit/backend/zarch/test/test_assembler.py
--- a/rpython/jit/backend/zarch/test/test_assembler.py
+++ b/rpython/jit/backend/zarch/test/test_assembler.py
@@ -1,4 +1,6 @@
+import struct
from rpython.jit.backend.zarch import conditions as con
+from rpython.jit.backend.zarch import masks as msk
from rpython.jit.backend.zarch import registers as reg
from rpython.jit.backend.zarch.assembler import AssemblerZARCH
from rpython.jit.backend.zarch import locations as loc
@@ -15,12 +17,19 @@
from rpython.rtyper.annlowlevel import llhelper
from rpython.rlib.objectmodel import specialize
from rpython.rlib.debug import ll_assert
+from rpython.rlib.longlong2float import float2longlong
CPU = getcpuclass()
def byte_count(func):
return func._byte_count
+def BFL(value):
+ #assert 0x0000000000000000 == float2longlong(0.0)
+ #assert 0x8000000000000000 == abs(float2longlong(-0.0))
+ #assert hex(0xc02e000000000000) == hex(abs(float2longlong(-15.0)))
+ return struct.pack('>q', float2longlong(value))
+
class TestRunningAssembler(object):
def setup_method(self, method):
cpu = CPU(None, None)
@@ -184,3 +193,15 @@
self.mc.SVC(loc.imm(4))
self.a.jmpto(reg.r14)
assert run_asm(self.a) == 14
+
+ def test_float(self):
+ with self.label('func', func=True):
+ with self.label('lit'):
+ self.mc.BRAS(reg.r13, loc.imm(0))
+ self.mc.write(BFL(-15.0))
+ self.jump_here(self.mc.BRAS, 'lit')
+ self.mc.LD(reg.f0, loc.addr(0, reg.r13))
+ self.mc.FIDBR(reg.f1, msk.RND_CURMODE, reg.f0, loc.imm(0))
+ self.mc.CGDBR(reg.r2, msk.RND_CURMODE, reg.f1, loc.imm(0))
+ self.a.jmpto(reg.r14)
+ assert run_asm(self.a) == -15
diff --git a/rpython/jit/backend/zarch/test/test_auto_encoding.py
b/rpython/jit/backend/zarch/test/test_auto_encoding.py
--- a/rpython/jit/backend/zarch/test/test_auto_encoding.py
+++ b/rpython/jit/backend/zarch/test/test_auto_encoding.py
@@ -123,10 +123,13 @@
break
return results
-REGS = range(15+1)
+REGS = range(16)
REGNAMES = ['%%r%d' % i for i in REGS]
+FP_REGS = range(16)
+FP_REGNAMES = ['%%f%d' % i for i in FP_REGS]
TEST_CASE_GENERATE = {
'r': REGS,
+ 'f': FP_REGS,
'r/m': REGS,
'i4': range_of_bits(4, signed=True),
'i8': range_of_bits(8, signed=True),
@@ -157,13 +160,11 @@
func = getattr(AbstractZARCHBuilder, methodname)
return func._arguments_
- def assembler_operand_reg(self, regnum):
- return REGNAMES[regnum]
-
def operand_combinations(self, methodname, modes, arguments):
mapping = {
- 'r': self.assembler_operand_reg,
- 'r/m': self.assembler_operand_reg,
+ 'r': (lambda num: REGNAMES[num]),
+ 'r/m': (lambda num: REGNAMES[num]),
+ 'f': (lambda num: FP_REGNAMES[num]),
}
arg_types = self.get_func_arg_types(methodname)
for mode, args in zip(arg_types, arguments):
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit