Turns out it's supposed to duplicate the lower 32 bits to the high 32
bits, and do a 64 bit rotate
- return rotl(value, bits, 32)
+ if isinstance(value, SelectableInt):
+ value = SelectableInt(value.value, 64)
+ return rotl(value | (value << 32), bits, 64)
---- fixedshift.py.orig 2020-05-09 09:56:10.393656481 -0400
-+++ fixedshift.py 2020-05-10 18:51:24.725396454 -0400
-@@ -12,48 +12,48 @@
- @inject()
+--- fixedshift.py.orig 2020-05-11 10:20:55.781417649 -0400
++++ fixedshift.py 2020-05-13 14:02:01.147691354 -0400
+@@ -13,7 +13,7 @@
def op_rlwinm(self, RS):
n = SH
def op_rlwinm(self, RS):
n = SH
-- r = ROTL32(RS[32:64], n)
+ r = ROTL32(RS[32:64], n)
- m = MASK(MB + 32, ME + 32)
- m = MASK(MB + 32, ME + 32)
-+ r = ROTL32(EXTZ64(RS[32:64]), n)
+ m = MASK(MB.value + 32, ME.value + 32)
RA = r & m
return (RA,)
+ m = MASK(MB.value + 32, ME.value + 32)
RA = r & m
return (RA,)
def op_rlwinm_(self, RS):
n = SH
def op_rlwinm_(self, RS):
n = SH
-- r = ROTL32(RS[32:64], n)
+ r = ROTL32(RS[32:64], n)
- m = MASK(MB + 32, ME + 32)
- m = MASK(MB + 32, ME + 32)
-+ r = ROTL32(EXTZ64(RS[32:64]), n)
+ m = MASK(MB.value + 32, ME.value + 32)
RA = r & m
return (RA,)
+ m = MASK(MB.value + 32, ME.value + 32)
RA = r & m
return (RA,)
def op_rlwnm(self, RB, RS):
n = RB[59:64]
def op_rlwnm(self, RB, RS):
n = RB[59:64]
-- r = ROTL32(RS[32:64], n)
+ r = ROTL32(RS[32:64], n)
- m = MASK(MB + 32, ME + 32)
- m = MASK(MB + 32, ME + 32)
-+ r = ROTL32(EXTZ64(RS[32:64]), n)
+ m = MASK(MB.value + 32, ME.value + 32)
RA = r & m
return (RA,)
+ m = MASK(MB.value + 32, ME.value + 32)
RA = r & m
return (RA,)
def op_rlwnm_(self, RB, RS):
n = RB[59:64]
def op_rlwnm_(self, RB, RS):
n = RB[59:64]
-- r = ROTL32(RS[32:64], n)
+ r = ROTL32(RS[32:64], n)
- m = MASK(MB + 32, ME + 32)
- m = MASK(MB + 32, ME + 32)
-+ r = ROTL32(EXTZ64(RS[32:64]), n)
+ m = MASK(MB.value + 32, ME.value + 32)
RA = r & m
return (RA,)
+ m = MASK(MB.value + 32, ME.value + 32)
RA = r & m
return (RA,)
def op_rlwimi(self, RS, RA):
n = SH
def op_rlwimi(self, RS, RA):
n = SH
-- r = ROTL32(RS[32:64], n)
+ r = ROTL32(RS[32:64], n)
- m = MASK(MB + 32, ME + 32)
- m = MASK(MB + 32, ME + 32)
-+ r = ROTL32(EXTZ64(RS[32:64]), n)
+ m = MASK(MB.value + 32, ME.value + 32)
RA = r & m | RA & ~m
return (RA,)
+ m = MASK(MB.value + 32, ME.value + 32)
RA = r & m | RA & ~m
return (RA,)
def op_rlwimi_(self, RS, RA):
n = SH
def op_rlwimi_(self, RS, RA):
n = SH
-- r = ROTL32(RS[32:64], n)
+ r = ROTL32(RS[32:64], n)
- m = MASK(MB + 32, ME + 32)
- m = MASK(MB + 32, ME + 32)
-+ r = ROTL32(EXTZ64(RS[32:64]), n)
+ m = MASK(MB.value + 32, ME.value + 32)
RA = r & m | RA & ~m
return (RA,)
+ m = MASK(MB.value + 32, ME.value + 32)
RA = r & m | RA & ~m
return (RA,)
def op_slw(self, RB, RS):
n = RB[59:64]
- r = ROTL32(RS[32:64], n)
def op_slw(self, RB, RS):
n = RB[59:64]
- r = ROTL32(RS[32:64], n)
-+ r = ROTL32(EXTZ64(RS[32:64]), n.value)
++ r = ROTL32(RS[32:64], n.value)
if eq(RB[58], 0):
- m = MASK(32, 63 - n)
+ m = MASK(32, 63 - n.value)
if eq(RB[58], 0):
- m = MASK(32, 63 - n)
+ m = MASK(32, 63 - n.value)
def op_slw_(self, RB, RS):
n = RB[59:64]
- r = ROTL32(RS[32:64], n)
def op_slw_(self, RB, RS):
n = RB[59:64]
- r = ROTL32(RS[32:64], n)
-+ r = ROTL32(EXTZ64(RS[32:64]), n.value)
++ r = ROTL32(RS[32:64], n.value)
if eq(RB[58], 0):
- m = MASK(32, 63 - n)
+ m = MASK(32, 63 - n.value)
if eq(RB[58], 0):
- m = MASK(32, 63 - n)
+ m = MASK(32, 63 - n.value)
def op_srw(self, RB, RS):
n = RB[59:64]
- r = ROTL32(RS[32:64], 64 - n)
def op_srw(self, RB, RS):
n = RB[59:64]
- r = ROTL32(RS[32:64], 64 - n)
-+ r = ROTL32(EXTZ64(RS[32:64]), 64 - n.value)
++ r = ROTL32(RS[32:64], 64 - n.value)
if eq(RB[58], 0):
- m = MASK(n + 32, 63)
+ m = MASK(n.value + 32, 63)
if eq(RB[58], 0):
- m = MASK(n + 32, 63)
+ m = MASK(n.value + 32, 63)
def op_srw_(self, RB, RS):
n = RB[59:64]
- r = ROTL32(RS[32:64], 64 - n)
def op_srw_(self, RB, RS):
n = RB[59:64]
- r = ROTL32(RS[32:64], 64 - n)
-+ r = ROTL32(EXTZ64(RS[32:64]), 64 - n.value)
++ r = ROTL32(RS[32:64], 64 - n.value)
if eq(RB[58], 0):
- m = MASK(n + 32, 63)
+ m = MASK(n.value + 32, 63)
if eq(RB[58], 0):
- m = MASK(n + 32, 63)
+ m = MASK(n.value + 32, 63)
n = SH
- r = ROTL32(RS[32:64], 64 - n)
- m = MASK(n + 32, 63)
n = SH
- r = ROTL32(RS[32:64], 64 - n)
- m = MASK(n + 32, 63)
-+ r = ROTL32(EXTZ64(RS[32:64]), 64 - n.value)
++ r = ROTL32(RS[32:64], 64 - n.value)
+ m = MASK(n.value + 32, 63)
s = RS[32]
RA = r & m | concat(s, repeat=64) & ~m
+ m = MASK(n.value + 32, 63)
s = RS[32]
RA = r & m | concat(s, repeat=64) & ~m
n = SH
- r = ROTL32(RS[32:64], 64 - n)
- m = MASK(n + 32, 63)
n = SH
- r = ROTL32(RS[32:64], 64 - n)
- m = MASK(n + 32, 63)
-+ r = ROTL32(EXTZ64(RS[32:64]), 64 - n.value)
++ r = ROTL32(RS[32:64], 64 - n.value)
+ m = MASK(n.value + 32, 63)
s = RS[32]
RA = r & m | concat(s, repeat=64) & ~m
+ m = MASK(n.value + 32, 63)
s = RS[32]
RA = r & m | concat(s, repeat=64) & ~m
def op_sraw(self, RB, RS):
n = RB[59:64]
- r = ROTL32(RS[32:64], 64 - n)
def op_sraw(self, RB, RS):
n = RB[59:64]
- r = ROTL32(RS[32:64], 64 - n)
-+ r = ROTL32(EXTZ64(RS[32:64]), 64 - n.value)
++ r = ROTL32(RS[32:64], 64 - n.value)
if eq(RB[58], 0):
- m = MASK(n + 32, 63)
+ m = MASK(n.value + 32, 63)
if eq(RB[58], 0):
- m = MASK(n + 32, 63)
+ m = MASK(n.value + 32, 63)
def op_sraw_(self, RB, RS):
n = RB[59:64]
- r = ROTL32(RS[32:64], 64 - n)
def op_sraw_(self, RB, RS):
n = RB[59:64]
- r = ROTL32(RS[32:64], 64 - n)
-+ r = ROTL32(EXTZ64(RS[32:64]), 64 - n.value)
++ r = ROTL32(RS[32:64], 64 - n.value)
if eq(RB[58], 0):
- m = MASK(n + 32, 63)
+ m = MASK(n.value + 32, 63)
if eq(RB[58], 0):
- m = MASK(n + 32, 63)
+ m = MASK(n.value + 32, 63)
initial_regs[1] = -1
with Program(lst) as program:
sim = self.run_tst_program(program, initial_regs)
initial_regs[1] = -1
with Program(lst) as program:
sim = self.run_tst_program(program, initial_regs)
- self.assertEqual(sim.gpr(3), SelectableInt(0xfe000fff, 64))
+ self.assertEqual(sim.gpr(3), SelectableInt(0xfffffffffe000fff, 64))
def test_rlwimi(self):
lst = ["rlwimi 3, 1, 5, 20, 6"]
initial_regs = [0] * 32
def test_rlwimi(self):
lst = ["rlwimi 3, 1, 5, 20, 6"]
initial_regs = [0] * 32
- initial_regs[1] = 0xdeadbeef
+ initial_regs[1] = 0xffffffffdeadbeef
initial_regs[3] = 0x12345678
with Program(lst) as program:
sim = self.run_tst_program(program, initial_regs)
initial_regs[3] = 0x12345678
with Program(lst) as program:
sim = self.run_tst_program(program, initial_regs)
- self.assertEqual(sim.gpr(3), SelectableInt(0xd4345dfb, 64))
+ self.assertEqual(sim.gpr(3), SelectableInt(0xd5b7ddfbd4345dfb, 64))
def test_mtcrf(self):
for i in range(4):
def test_mtcrf(self):
for i in range(4):