Author: Richard Plangger <[email protected]>
Branch: s390x-backend
Changeset: r80214:b21ba89abdb2
Date: 2015-10-14 19:01 +0200
http://bitbucket.org/pypy/pypy/changeset/b21ba89abdb2/
Log: extending to the different opcode formats, now supporting agr the 64
bit version of signed integer add!
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
@@ -24,13 +24,41 @@
self.BL(addr, c)
return f
+class Operand(object):
+ pass
-codes = {
- 'ADD_rr': 0x1A,
+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)
+ 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)
+ self.writechar(chr(operands))
+ return encode_rr
+
+_mnemonic_codes = {
+ 'AR': (build_rr, ['\x1A']),
+ 'AGR': (build_rre, ['\xB9\x08'])
}
-def encode_rr(reg1, reg2):
- return chr(((reg2 & 0x0f) << 4) | (reg1 & 0xf))
+def build_instr_codes(clazz):
+ for mnemonic, (builder, args) in _mnemonic_codes.items():
+ func = builder(mnemonic, args)
+ name = mnemonic + "_" + builder.__name__.split("_")[1]
+ setattr(clazz, name, func)
class AbstractZARCHBuilder(object):
def write32(self, word):
@@ -43,6 +71,9 @@
self.writechar(chr(0x1A))
self.writechar(encode_rr(reg1, reg2))
+build_instr_codes(AbstractZARCHBuilder)
+
+
class InstrBuilder(BlockBuilderMixin, AbstractZARCHBuilder):
def __init__(self):
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
@@ -4,6 +4,7 @@
from rpython.jit.backend.zarch import codebuilder
from rpython.rlib.rarithmetic import intmask
from rpython.tool.udir import udir
+import itertools
INPUTNAME = 'checkfile_%s.s'
FILENAME = 'checkfile_%s.o'
@@ -26,8 +27,8 @@
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])+"..."
+ 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")
self.index += 1
@@ -113,6 +114,7 @@
def get_all_tests(self):
return {
'r': self.reg_tests,
+ 'e': lambda: [],
}
def assembler_operand_reg(self, regnum):
@@ -207,38 +209,20 @@
return oplist, as_code
def make_all_tests(self, methname, modes, args=[]):
- if modes:
- tests = self.get_all_tests()
- m = modes[0]
- lst = tests[m]()
- random.shuffle(lst)
- if methname == 'PSRAD_xi' and m == 'i':
- lst = [x for x in lst if 0 <= x <= 31]
- result = []
- for v in lst:
- result += self.make_all_tests(methname, modes[1:], args+[v])
- return result
- else:
- # special cases
- if methname in ('ADD_ri', 'AND_ri', 'CMP_ri', 'OR_ri',
- 'SUB_ri', 'XOR_ri', 'SBB_ri'):
- if args[0] == rx86.R.eax:
- return [] # ADD EAX, constant: there is a special encoding
- if methname in ('CMP8_ri',):
- if args[0] == rx86.R.al:
- return [] # CMP AL, constant: there is a special encoding
- if methname == 'XCHG_rr' and rx86.R.eax in args:
- return [] # special encoding
- if methname == 'MOV_rj' and args[0] == rx86.R.eax:
- return [] # MOV EAX, [immediate]: there is a special encoding
- if methname == 'MOV_jr' and args[1] == rx86.R.eax:
- return [] # MOV [immediate], EAX: there is a special encoding
- if methname == 'MOV8_rj' and args[0] == rx86.R.al:
- return [] # MOV AL, [immediate]: there is a special encoding
- if methname == 'MOV8_jr' and args[1] == rx86.R.al:
- return [] # MOV [immediate], AL: there is a special encoding
-
- return [args]
+ tests = {
+ 'r': self.REGS,
+ 'e': None,
+ }
+ combinations = []
+ for m in modes:
+ if tests[m] is not None:
+ elems = tests[m]
+ random.shuffle(elems)
+ combinations.append(elems)
+ results = []
+ for args in itertools.product(*combinations):
+ results.append(args)
+ return results
def should_skip_instruction(self, instrname, argmodes):
return False
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit