def test_decode(self): # this test is crappy field = Field("test", 0, 31) for i in range(100): j = random.randrange(maxppcint) assert field.decode(j) == j field = Field("test", 0, 31 - 4) for i in range(100): j = random.randrange(maxppcint) assert field.decode(j) == j >> 4 assert field.decode(j) == j >> 4 field = Field("test", 3, 31 - 4) for i in range(100): j = random.randrange(maxppcint >> 3) assert field.decode(j) == j >> 4
def test_error_checking_signed(self): for b in range(0, 17): field = Field("test", b, 15 + b, 'signed') assert field.decode(field.encode(0)) == 0 assert field.decode(field.encode(-32768)) == -32768 assert field.decode(field.encode(32767)) == 32767 raises(ValueError, field.encode, 32768) raises(ValueError, field.encode, -32769)
def test_error_checking_unsigned(self): for b in range(0, 17): field = Field("test", b, 15 + b) assert field.decode(field.encode(0)) == 0 assert field.decode(field.encode(32768)) == 32768 assert field.decode(field.encode(65535)) == 65535 raises(ValueError, field.encode, -32768) raises(ValueError, field.encode, -1) raises(ValueError, field.encode, 65536)
def test_decode_signed(self): field = Field("test", 16, 31, 'signed') for i in range(1000): hi = long(random.randrange(0x10000)) << 16 lo = long(random.randrange(0x10000)) word = hi | lo if lo & 0x8000: lo |= ~0xFFFF assert field.decode(word) == lo
def test_bitclash(self): raises(FormException, TestForm, 'h', 'hh') raises(FormException, TestForm, Field('t1', 0, 0), Field('t2', 0, 0))
import random import sys from pypy.jit.codegen.ppc.ppcgen.form import Form, FormException from pypy.jit.codegen.ppc.ppcgen.field import Field from pypy.jit.codegen.ppc.ppcgen.assembler import Assembler # 0 31 # +-------------------------------+ # | h | l | # +-------------------------------+ # | hh | hl | lh | ll | # +-------------------------------+ test_fieldmap = { 'l': Field('l', 16, 31), 'h': Field('h', 0, 15), 'll': Field('ll', 24, 31), 'lh': Field('lh', 16, 23), 'hl': Field('hl', 8, 15), 'hh': Field('hh', 0, 7), } def p(w): import struct return struct.pack('>i', w) class TestForm(Form): fieldmap = test_fieldmap
def test_decode_unsigned(self): field = Field("test", 16, 31) for i in range(1000): hi = long(random.randrange(0x10000)) << 16 lo = long(random.randrange(0x10000)) assert field.decode(hi | lo) == lo
def r(self, i, labels, pc): if not ppc_fields['AA'].decode(i): v = self.decode(i) if pc + v in labels: return "%s (%r)" % (v, ', '.join(labels[pc + v])) else: return self.decode(i) class spr(Field): def encode(self, value): value = (value & 31) << 5 | (value >> 5 & 31) return super(spr, self).encode(value) def decode(self, inst): value = super(spr, self).decode(inst) return (value & 31) << 5 | (value >> 5 & 31) # other special fields? ppc_fields = { "LI": IField("LI", *fields["LI"]), "BD": IField("BD", *fields["BD"]), "spr": spr("spr", *fields["spr"]), } for f in fields: if f not in ppc_fields: ppc_fields[f] = Field(f, *fields[f])