def andor(imm, a, b, ainv, binv):
inbits = [a, b, ainv, binv]
res = 0
for i in range(4):
if ((imm >> i) & 0b1) & inbits[i]:
res = 1
return res
def dorow(imm8, step_i, chunk_size):
step_o = 0
for j in range(64):
if (j&chunk_size) == 0:
imm = (imm8 & 0b1111)
else:
imm = (imm8>>4)
a = (step_i>>j)&1
b = (step_i>>(j ^ chunk_size))&1
res = andor(imm, a, b, ~a, ~b)
#print(j, bin(imm), a, b, res)
step_o |= (res<<j)
#print (" ", chunk_size, bin(step_o))
return step_o
def grevlut64(RA, RB, imm, iv):
x = 0
if RA is None: # RA=0
x = 0x5555555555555555
else:
x = RA
if (iv): x = ~x;
shamt = RB & 63;
#print (bin(shamt), bin(63))
for i in range(6):
step = 1<<i
if shamt & step:
x = dorow(imm, x, step)
return x & ((1<<64)-1)
if __name__ == '__main__':
imm = 0b0110
a = 1
b = 0
print (andor(imm, a, b, ~a, ~b))
# answer: 8888888...
RB = 0b0000
imm = 0b1100_0110
x = grevlut64(None, RB, imm, 1)
print ("grevlut", bin(RB), bin(imm), hex(x), "\n", bin(x))
# answer: 8888888...
RB = 0b000001
imm = 0b10001000
x = grevlut64(None, RB, imm, 1)
print ("grevlut", bin(RB), bin(imm), hex(x), "\n", bin(x))
exit(0)
# answer: 80808080...
RB = 0b00110
imm = 0b11000110
x = grevlut64(None, RB, imm, 1)
print ("grevlut", bin(RB), bin(imm), hex(x), "\n", bin(x))
# answer: 80008000...
RB = 0b01110
imm = 0b11000110
x = grevlut64(None, RB, imm, 1)
print ("grevlut", bin(RB), bin(imm), hex(x), "\n", bin(x))
print()
# answer: 01010101...
RB = 0b00110
imm = 0b01101100
x = grevlut64(None, RB, imm, 0)
print ("grevlut", bin(RB), bin(imm), hex(x), "\n", bin(x))
# answer: 00010001...
RB = 0b01110
imm = 0b01101100
x = grevlut64(None, RB, imm, 0)
print ("grevlut", bin(RB), bin(imm), hex(x), "\n", bin(x))
print()
for RB in range(64):
imm = 0b11000110
x = grevlut64(None, RB, imm, 1)
print ("grevlut", bin(RB), bin(imm), hex(x), "\n", bin(x))
print()
for RB in range(64):
imm = 0b01101100
x = grevlut64(None, RB, imm, 0)
print ("grevlut", bin(RB), bin(imm), hex(x), "\n", bin(x))
print()
for RB in range(64):
imm = 0b10011010
x = grevlut64(None, RB, imm, 1)
print ("grevlut", bin(RB), bin(imm), hex(x), "\n", bin(x))
print()
for RB in range(64):
imm = 0b01011010
x = grevlut64(None, RB, imm, 1)
print ("grevlut", bin(RB), bin(imm), hex(x), "\n", bin(x))
print()