Author: Richard Plangger <planri...@gmail.com> 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 pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit