Author: Richard Plangger <planri...@gmail.com> Branch: s390x-backend Changeset: r80230:99988dacdae0 Date: 2015-10-15 11:31 +0200 http://bitbucket.org/pypy/pypy/changeset/99988dacdae0/
Log: index base displace parameter implemented 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 @@ -13,7 +13,6 @@ _nowrapper=True, sandboxsafe=True) - def binary_helper_call(name): function = getattr(support, 'arm_%s' % name) @@ -29,32 +28,47 @@ def build_rr(mnemonic, args): opcode = args[0] - assert isinstance(opcode, str) def encode_rr(self, reg1, reg2): self.writechar(opcode) - operands = ((reg2 & 0x0f) << 4) | (reg1 & 0xf) + operands = ((reg1 & 0x0f) << 4) | (reg2 & 0xf) self.writechar(chr(operands)) return encode_rr def build_rre(mnemonic, args): opcode1,opcode2 = args[0] - assert isinstance(opcode1, str) - assert isinstance(opcode2, str) def encode_rr(self, reg1, reg2): self.writechar(opcode1) self.writechar(opcode2) self.writechar('\x00') #self.writechar('\x00') - operands = ((reg2 & 0x0f) << 4) | (reg1 & 0xf) + operands = ((reg1 & 0x0f) << 4) | (reg2 & 0xf) self.writechar(chr(operands)) return encode_rr -_mnemonic_codes = { - 'AR': (build_rr, ['\x1A']), - 'AGR': (build_rre, ['\xB9\x08']) -} +def build_rx(mnemonic, args): + opcode = args[0] + def encode_rx(self, reg_or_mask, idxbasedisp): + self.writechar(opcode) + index = idxbasedisp.index + byte = (reg_or_mask & 0x0f) << 4 | index & 0xf + self.writechar(chr(byte)) + displace = idxbasedisp.displace & 0x3ff + base = idxbasedisp.base & 0xf + byte = displace >> 8 & 0xf | base << 4 + self.writechar(chr(byte)) + self.writechar(chr(displace & 0xff)) + + return encode_rx + 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']), + } + for mnemonic, (builder, args) in _mnemonic_codes.items(): func = builder(mnemonic, args) name = mnemonic + "_" + builder.__name__.split("_")[1] 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 @@ -27,9 +27,11 @@ and self.index == self.instrindex): return # ignore the extra character '\x40' print self.op - print "\x09from codebuilder.py: ", hexdump(self.expected[self.instrindex:self.index] + char)+"..." - print "\x09from 'as': ", hexdump(self.expected[self.instrindex:self.index+15])+"..." - raise Exception("Differs") + 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 + raise Exception("Differs:\n" + generated + "\n" + expected) self.index += 1 def done(self): @@ -60,6 +62,26 @@ COUNT1 = 15 suffixes = {0:'', 1:'b', 2:'w', 4:'l', 8:'q'} +class FakeIndexBaseDisplace(object): + def __init__(self, index, base, disp): + self.index = index + self.base = base + self.displace = disp + + def __str__(self): + disp = self.displace + index = self.index + base = self.base + return "{disp}(%r{index},%r{base})".format(**locals()) + +def build_idx_base_disp(index_bits, base_bits, displace_bits): + + possibilities = itertools.product(range(index_bits), range(base_bits), + range(displace_bits)) + results = [] + for (index,base,disp) in possibilities: + results.append(FakeIndexBaseDisplace(index,base,disp)) + return results class TestZARCH(object): WORD = 8 @@ -68,6 +90,7 @@ REGNAMES = ['%%r%d' % i for i in REGS] accept_unnecessary_prefix = None methname = '?' + INDEX_BASE_DISPLACE = build_idx_base_disp(8,8,12) def reg_tests(self): return self.REGS @@ -111,47 +134,14 @@ def relative_tests(self): py.test.skip("explicit test required for %r" % (self.methname,)) - def get_all_tests(self): - return { - 'r': self.reg_tests, - 'e': lambda: [], - } - def assembler_operand_reg(self, regnum): return self.REGNAMES[regnum] - def assembler_operand_reg8(self, regnum): - assert regnum & rx86.BYTE_REG_FLAG - return self.REGNAMES8[regnum &~ rx86.BYTE_REG_FLAG] - - def assembler_operand_xmm_reg(self, regnum): - return self.XMMREGNAMES[regnum] - - def assembler_operand_stack_bp(self, position): - return '%d(%s)' % (position, self.REGNAMES[5]) - - def assembler_operand_stack_sp(self, position): - return '%d(%s)' % (position, self.REGNAMES[4]) - - def assembler_operand_memory(self, (reg1, offset)): - if not offset: offset = '' - return '%s(%s)' % (offset, self.REGNAMES[reg1]) - - def assembler_operand_array(self, (reg1, reg2, scaleshift, offset)): - if not offset: offset = '' - return '%s(%s,%s,%d)' % (offset, self.REGNAMES[reg1], - self.REGNAMES[reg2], 1<<scaleshift) - - def assembler_operand_imm(self, value): - return '$%d' % value - - def assembler_operand_imm_addr(self, value): - return '%d' % value - def get_all_assembler_operands(self): return { 'r': self.assembler_operand_reg, - } + 'x': lambda x: str(x), + } def run_test(self, methname, instrname, argmodes, args_lists, instr_suffix=None): @@ -173,7 +163,6 @@ ops = [] for mode, v in zip(argmodes, args): ops.append(assembler_operand[mode](v)) - ops.reverse() # op = '\t%s%s %s' % (instrname.lower(), suffix, ', '.join(ops)) @@ -212,6 +201,7 @@ tests = { 'r': self.REGS, 'e': None, + 'x': self.INDEX_BASE_DISPLACE, } combinations = [] for m in modes: _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit