Author: Richard Plangger <planri...@gmail.com> Branch: s390x-backend Changeset: r80395:20f482e7b1ef Date: 2015-10-22 16:01 +0200 http://bitbucket.org/pypy/pypy/changeset/20f482e7b1ef/
Log: testing single float to float cast, testing int64 to float cast, added div (with remainer) instr 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 @@ -5,11 +5,7 @@ def dummy_argument(arg): """ NOT_RPYTHON """ - if arg == 'r' or arg == 'r/m': - return 0 - if arg == 'f': - return 0 - if arg == '-': + if arg in ('r', 'r/m', 'm', 'f', '-'): return 0 if arg.startswith('i') or arg.startswith('u'): return 0 @@ -25,6 +21,7 @@ - - unused f - floating point register r - register + m - mask r/m - register or mask iX - immediate X bits (signed) uX - immediate X bits (unsigend) 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 @@ -102,15 +102,23 @@ 'LNEBR': ('rre', ['\xB3','\x01']), 'LNDBR': ('rre', ['\xB3','\x11']), + + # load lengthended + 'LDEBR': ('rre', ['\xB3','\x04']), } floatingpoint_mnemonic_codes = { 'FIEBR': ('rrf', ['\xB3','\x57'], 'r,u4,r,-'), 'FIDBR': ('rrf', ['\xB3','\x5F'], 'r,u4,r,-'), + # convert to fixed 'CGEBR': ('rrf', ['\xB3','\xA8'], 'r,u4,r,-'), 'CGDBR': ('rrf', ['\xB3','\xA9'], 'r,u4,r,-'), + # convert from fixed + 'CEGBR': ('rre', ['\xB3','\xA4']), + 'CDGBR': ('rre', ['\xB3','\xA5']), + # arithmetic # ADDITION 'AEBR': ('rre', ['\xB3','\x0A']), @@ -133,6 +141,11 @@ 'DDBR': ('rre', ['\xB3','\x1D']), 'DEB': ('rxe', ['\xED','\x0D'], 'r,bidl,-'), 'DDB': ('rxe', ['\xED','\x1D'], 'r,bidl,-'), + + # DIVIDE (+mod) + 'DIEBR': ('rrf', ['\xB3','\x53'], 'r,r,r,m'), + 'DIDBR': ('rrf', ['\xB3','\x5B'], 'r,r,r,m'), + } all_mnemonic_codes = { 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 @@ -20,7 +20,7 @@ from rpython.rlib.objectmodel import specialize from rpython.rlib.debug import ll_assert from rpython.rlib.longlong2float import (float2longlong, - DOUBLE_ARRAY_PTR) + DOUBLE_ARRAY_PTR, singlefloat2uint_emulator) import ctypes CPU = getcpuclass() @@ -28,13 +28,14 @@ def byte_count(func): return func._byte_count -def BFL(value): +def BFL(value, short=False): + if short: + return struct.pack('f', value) return struct.pack('>q', float2longlong(value)) def ADDR(value): ptr = ll2ctypes.lltype2ctypes(value) addr = ctypes.addressof(ptr.contents.items) - print hex(addr) return struct.pack('>Q', addr) def isclose(a,b, rel_tol=1e-9, abs_tol=0.0): @@ -65,6 +66,12 @@ def float(self, val): self.asm.mc.write(BFL(val)) + def single_float(self, val): + self.asm.mc.write(BFL(val, short=True)) + + def int64(self, val): + self.asm.mc.write(struct.pack('>q', val)) + class LabelCtx(object): def __init__(self, asm, name): self.asm = asm @@ -315,3 +322,32 @@ self.mc.STD(reg.f0, loc.addr(0, reg.r11)) run_asm(self.a) assert isclose(mem[0], 0.0) + + def test_cast_single_float_to_float(self): + with lltype.scoped_alloc(DOUBLE_ARRAY_PTR.TO, 16) as mem: + with ActivationRecordCtx(self): + with LiteralPoolCtx(self) as pool: + pool.single_float(6.66) + pool.addr(mem) + self.mc.LEY(reg.f1, loc.addr(0, reg.r13)) + ## cast short to long! + self.mc.LDEBR(reg.f0, reg.f1) + self.mc.LG(reg.r11, loc.addr(4, reg.r13)) + self.mc.STD(reg.f0, loc.addr(0, reg.r11)) + run_asm(self.a) + assert isclose(mem[0], 6.66, abs_tol=0.05) + + def test_cast_int64_to_float(self): + with lltype.scoped_alloc(DOUBLE_ARRAY_PTR.TO, 16) as mem: + with ActivationRecordCtx(self): + with LiteralPoolCtx(self) as pool: + pool.int64(12345) + pool.addr(mem) + self.mc.LG(reg.r12, loc.addr(0, reg.r13)) + # cast int to float! + self.mc.CDGBR(reg.f0, reg.r12) + self.mc.LG(reg.r11, loc.addr(8, reg.r13)) + self.mc.STD(reg.f0, loc.addr(0, reg.r11)) + run_asm(self.a) + assert isclose(mem[0], 12345.0) + 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 @@ -132,6 +132,7 @@ 'r': REGS, 'f': FP_REGS, 'r/m': REGS, + 'm': range_of_bits(4), 'i4': range_of_bits(4, signed=True), 'i8': range_of_bits(8, signed=True), 'i16': range_of_bits(16, signed=True), _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit