Author: Richard Plangger <planri...@gmail.com> Branch: s390x-backend Changeset: r80234:235a94b23040 Date: 2015-10-15 14:33 +0200 http://bitbucket.org/pypy/pypy/changeset/235a94b23040/
Log: immediate encoding with base register displacement (SI) diff --git a/rpython/jit/backend/zarch/codebuilder.py b/rpython/jit/backend/zarch/codebuilder.py --- a/rpython/jit/backend/zarch/codebuilder.py +++ b/rpython/jit/backend/zarch/codebuilder.py @@ -5,6 +5,7 @@ from rpython.rtyper.lltypesystem import lltype, rffi, llmemory from rpython.tool.udir import udir from rpython.jit.backend.detect_cpu import autodetect +from rpython.rtyper.lltypesystem.rbuilder import always_inline clear_cache = rffi.llexternal( "__clear_cache", @@ -26,6 +27,14 @@ class Operand(object): pass +@always_inline +def encode_base_displace(mc, base_displace): + displace = base_displace.displace # & 0x3ff + base = base_displace.base & 0xf + byte = (displace >> 8 & 0xf) | base << 4 + mc.writechar(chr(byte)) + mc.writechar(chr(displace & 0xff)) + def build_rr(mnemonic, (opcode,)): def encode_rr(self, reg1, reg2): self.writechar(opcode) @@ -72,25 +81,34 @@ return encode_rxy def build_ri(mnemonic, (opcode,halfopcode)): - def encode_ri(self, reg_or_mask, imm): + def encode_ri(self, reg_or_mask, imm16): self.writechar(opcode) byte = (reg_or_mask & 0xf) << 4 | (ord(halfopcode) & 0xf) self.writechar(chr(byte)) - self.writechar(chr(imm >> 8 & 0xff)) - self.writechar(chr(imm & 0xff)) + self.writechar(chr(imm16 >> 8 & 0xff)) + self.writechar(chr(imm16 & 0xff)) return encode_ri +def build_si(mnemonic, (opcode,)): + def encode_si(self, base_displace, uimm8): + self.writechar(opcode) + self.writechar(chr(uimm8)) + encode_base_displace(self, base_displace) + return encode_si + +_mnemonic_codes = { + 'AR': (build_rr, ['\x1A']), + 'AGR': (build_rre, ['\xB9\x08']), + 'AGFR': (build_rre, ['\xB9\x18']), + 'A': (build_rx, ['\x5A']), + 'AY': (build_rxy, ['\xE3','\x5A']), + 'AG': (build_rxy, ['\xE3','\x08']), + 'AGF': (build_rxy, ['\xE3','\x18']), + 'AHI': (build_ri, ['\xA7','\x0A']), + 'NI': (build_si, ['\x94']), +} + def build_instr_codes(clazz): - _mnemonic_codes = { - 'AR': (build_rr, ['\x1A']), - 'AGR': (build_rre, ['\xB9\x08']), - 'AGFR': (build_rre, ['\xB9\x18']), - 'A': (build_rx, ['\x5A']), - 'AY': (build_rxy, ['\xE3','\x5A']), - 'AG': (build_rxy, ['\xE3','\x08']), - 'AGF': (build_rxy, ['\xE3','\x18']), - 'AHI': (build_ri, ['\xA7','\x0A']), - } for mnemonic, (builder, args) in _mnemonic_codes.items(): func = builder(mnemonic, args) 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 @@ -5,6 +5,7 @@ from rpython.rlib.rarithmetic import intmask from rpython.tool.udir import udir import itertools +import re INPUTNAME = 'checkfile_%s.s' FILENAME = 'checkfile_%s.o' @@ -28,7 +29,7 @@ return # ignore the extra character '\x40' print self.op post = self.expected[self.index+1:self.index+1+15] - generated = "\x09from codebuilder.py: " + hexdump(self.expected[self.instrindex:self.index] + "!" + char + "!" + post)+"..." + generated = "\x09from codebuilder.py: " + hexdump(self.expected[self.instrindex:self.index] + char )+"..." print generated expected = "\x09from gnu as: " + hexdump(self.expected[self.instrindex:self.index+15])+"..." print expected @@ -75,8 +76,24 @@ base = self.base return "{disp}(%r{index},%r{base})".format(**locals()) +class FakeBaseDisplace(object): + def __init__(self, base, disp): + self.base = base + self.displace = disp + + def __str__(self): + disp = self.displace + base = self.base + return "{disp}(%r{base})".format(**locals()) + +def build_base_disp(base_bits, displace_bits): + possibilities = itertools.product(range(base_bits), range(displace_bits)) + results = [] + for (base,disp) in possibilities: + results.append(FakeBaseDisplace(base,disp)) + return results + def build_idx_base_disp(index_bits, base_bits, displace_bits): - possibilities = itertools.product(range(index_bits), range(base_bits), range(displace_bits)) results = [] @@ -91,6 +108,7 @@ REGNAMES = ['%%r%d' % i for i in REGS] accept_unnecessary_prefix = None methname = '?' + BASE_DISPLACE = build_base_disp(8,12) INDEX_BASE_DISPLACE = build_idx_base_disp(8,8,12) INDEX_BASE_DISPLACE_LONG = build_idx_base_disp(8,8,20) @@ -121,8 +139,24 @@ for ofs in self.stack_bp_tests(1) ] + def imm_tests(self, name, modes, index): + from rpython.jit.backend.zarch.codebuilder import AbstractZARCHBuilder + import inspect + mode = modes[index] + assert mode == 'i' + func = getattr(AbstractZARCHBuilder, name) + args = inspect.getargspec(func).args + # 1 off, self is first arg + match = re.compile("(u?imm\d+)").match(args[index+1]) + assert match + return getattr(self, match.group(1) + "_tests")() + + def uimm16_tests(self): + v = ([0,1,65535] + + [random.randrange(0,65535) for i in range(COUNT1)]) + return v def imm16_tests(self): - v = ([-128,-1,0,1,127] + + v = ([-32768,-1,0,1,32767] + [random.randrange(-32768, 32767) for i in range(COUNT1)]) return v @@ -130,6 +164,10 @@ v = ([-128,-1,0,1,127] + [random.randrange(-127, 127) for i in range(COUNT1)]) return v + def uimm8_tests(self): + v = ([0,1,255] + + [random.randrange(0,255) for i in range(COUNT1)]) + return v def imm32_tests(self): v = ([-0x80000000, 0x7FFFFFFF, 128, 256, -129, -255] + @@ -147,6 +185,7 @@ def get_mapping_asm_to_str(self): return { 'r': self.assembler_operand_reg, + 's': lambda x: str(x), 'x': lambda x: str(x), 'y': lambda x: str(x), 'i': lambda x: str(x) @@ -216,17 +255,17 @@ def make_all_tests(self, methname, modes, args=[]): tests = { - 'r': self.REGS, - 'x': self.INDEX_BASE_DISPLACE, - 'y': self.INDEX_BASE_DISPLACE_LONG, - 'i': self.imm16_tests(), + 'r': lambda i: self.REGS, + 'x': lambda i: self.INDEX_BASE_DISPLACE, + 'y': lambda i: self.INDEX_BASE_DISPLACE_LONG, + 'i': lambda i: self.imm_tests(methname, modes, i), + 's': lambda i: self.BASE_DISPLACE, } combinations = [] - for m in modes: - if tests[m] is not None: - elems = tests[m] - random.shuffle(elems) - combinations.append(elems) + for i,m in enumerate(modes): + elems = tests[m](i) + random.shuffle(elems) + combinations.append(elems) results = [] for args in itertools.product(*combinations): results.append(args) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit