[pypy-svn] r72403 - in pypy/trunk/pypy/jit/backend/x86: . test
fijal at codespeak.net
fijal at codespeak.net
Fri Mar 19 04:38:14 CET 2010
Author: fijal
Date: Fri Mar 19 04:38:13 2010
New Revision: 72403
Modified:
pypy/trunk/pypy/jit/backend/x86/ri386.py
pypy/trunk/pypy/jit/backend/x86/ri386setup.py
pypy/trunk/pypy/jit/backend/x86/test/test_ri386_auto_encoding.py
Log:
Add rel8 to JMP and Jxx. Apparently tests are happy, although I'm not 100%
sure if I did the right thing
Modified: pypy/trunk/pypy/jit/backend/x86/ri386.py
==============================================================================
--- pypy/trunk/pypy/jit/backend/x86/ri386.py (original)
+++ pypy/trunk/pypy/jit/backend/x86/ri386.py Fri Mar 19 04:38:13 2010
@@ -207,12 +207,19 @@
class MODRM8(MODRM):
width = 1
-class REL32(OPERAND):
- width = 4
+class REL(OPERAND):
def __init__(self, absolute_target):
self.absolute_target = absolute_target
def assembler(self):
- return '%d' % (self.absolute_target,)
+ return '%d' % (self.absolute_target,)
+
+class REL32(REL):
+ width = 4
+
+class REL8(REL):
+ def assembler(self):
+ return '.+%d' % (self.absolute_target,)
+ width = 1
class MISSING(OPERAND):
def __repr__(self):
@@ -274,6 +281,7 @@
imm8 = IMM8
imm16 = IMM16
rel32 = REL32
+rel8 = REL8
def imm(value):
if isinstance(value, ComputedIntSymbolic):
Modified: pypy/trunk/pypy/jit/backend/x86/ri386setup.py
==============================================================================
--- pypy/trunk/pypy/jit/backend/x86/ri386setup.py (original)
+++ pypy/trunk/pypy/jit/backend/x86/ri386setup.py Fri Mar 19 04:38:13 2010
@@ -44,6 +44,7 @@
IMM8: [(IMM8, None), (IMM32, None)],
REL32: [(REL32, None)],
+ REL8: [(REL8, None)],
MODRM: [(MODRM, None)],
MODRM8: [(MODRM8, None)],
@@ -103,16 +104,23 @@
elif self.width == 'h':
lines.append('builder.write(packimm16(arg%d.value))' % (self.op,))
else:
- raise AssertionError, "invalid width %r" % (self.width,)
+ raise ValueError("invalid width %r" % (self.width,))
return False
class relative(operand):
def eval(self, lines, has_orbyte):
assert not has_orbyte, "malformed bytecode"
- assert self.width == 'i', "only REL32 supported at the moment"
- lines.append('offset = arg%d.absolute_target - (builder.tell()+4)' % (
- self.op,))
- lines.append('builder.write(packimm32(offset))')
+ if self.width == 'i':
+ lines.append('offset = arg%d.absolute_target - (builder.tell()+4)'
+ % (self.op,))
+ lines.append('builder.write(packimm32(offset))')
+ elif self.width == 'b':
+ lines.append('offset = arg%d.absolute_target - (builder.tell()+2)'
+ % (self.op,))
+ lines.append('assert offset < 127')
+ lines.append('builder.write(packimm8(offset))')
+ else:
+ raise ValueError("Invalid width %s" % (self.width,))
return False
##class conditioncode(operand):
@@ -329,7 +337,7 @@
CALL.indirect = 1
JMP = Instruction()
-#JMP.mode1(REL8, ['\xEB', immediate(1,'b')])
+JMP.mode1(REL8, ['\xEB', relative(1,'b')])
JMP.mode1(REL32, ['\xE9', relative(1)])
JMP.mode1(MODRM, ['\xFF', orbyte(4<<3), modrm(1)])
JMP.indirect = 1
@@ -589,7 +597,7 @@
instr._mode(modes, code1)
instr.indirect = indirect
-#define_cond('J', 1, (REL8,), [None,'\x70', immediate(1,'b')])
+define_cond('J', 1, (REL8,), [None,'\x70', relative(1,'b')])
define_cond('J', 1, (REL32,), ['\x0F', None,'\x80', relative(1)])
define_cond('SET', 0, (MODRM8,), ['\x0F', None,'\x90',orbyte(0<<3),modrm(1,'b')])
define_cond('CMOV',0,(REG,MODRM),['\x0F', None,'\x40', register(1,8), modrm(2)])
Modified: pypy/trunk/pypy/jit/backend/x86/test/test_ri386_auto_encoding.py
==============================================================================
--- pypy/trunk/pypy/jit/backend/x86/test/test_ri386_auto_encoding.py (original)
+++ pypy/trunk/pypy/jit/backend/x86/test/test_ri386_auto_encoding.py Fri Mar 19 04:38:13 2010
@@ -40,7 +40,7 @@
i386.MODRM8: 1,
i386.IMM8: 1,
i386.IMM16: 2,
- #i386.REL8: 1,
+ i386.REL8: 1,
i386.REL32: 4,
}
@@ -56,6 +56,10 @@
v = [-128,-1,0,1,127] + [random.randrange(-127, 127) for i in range(COUNT1)]
return map(i386.imm8, v)
+def rel8_tests():
+ v = [-1,0,1] + [random.randrange(-123, 123) for i in range(COUNT1)]
+ return map(i386.rel8, v)
+
def imm16_tests():
v = [-32768,32767] + [random.randrange(-32767, -128) for i in range(COUNT1)] \
+ [random.randrange(128, 32767) for i in range(COUNT1)]
@@ -125,7 +129,7 @@
i386.MODRM8: modrm8_tests,
i386.IMM8: imm8_tests,
i386.IMM16: imm16_tests,
- #i386.REL8: imm8_tests,
+ i386.REL8: rel8_tests,
i386.REL32: lambda: [], # XXX imm32_tests,
}
@@ -148,7 +152,7 @@
following = ""
if instr.indirect:
suffix = ""
- if args[-1][0] == i386.REL32: #in (i386.REL8,i386.REL32):
+ if args[-1][0] in (i386.REL8,i386.REL32):
labelcount += 1
following = "\nL%d:" % labelcount
elif args[-1][0] in (i386.IMM8,i386.IMM32):
@@ -160,7 +164,7 @@
else:
k = len(args)
for m, extra in args[:k]:
- assert m != i386.REL32 #not in (i386.REL8,i386.REL32)
+ assert m not in (i386.REL8,i386.REL32)
ops = [extra.assembler() for m, extra in args]
ops.reverse()
op = '\x09%s%s %s%s' % (instrname, suffix, string.join(ops, ", "),
@@ -256,6 +260,9 @@
self.op = op
self.instrindex = self.index
+ def tell(self):
+ return 0
+
def write(self, listofchars):
data = ''.join(listofchars)
end = self.index+len(data)
More information about the Pypy-commit
mailing list