from opcodes import *
from utils import Colors, ror, rol
import numpy as np
import math
class Label():
def __init__(self, arity, name):
self.arity = arity
self.name = name
class Frame():
def __init__(self, arity, local_indices, self_ref):
self.arity = arity
self.local_indices = local_indices
self.self_ref = self_ref
# takes the machinestate, opcode and operand to run. updates the machinestate
class Execute(): # pragma: no cover
def __init__(self, machinestate):
self.machinestate = machinestate
self.opcodeint = ''
self.immediates = []
self.op_gas = int()
self.stack_top = []
def getOPGas(self):
return self.op_gas
def chargeGasMem(self, mem_size_page):
factor = 64
self.op_gas += 64 * mem_size_page
def chargeGas(self, opcodeint):
if opcodeint != 64:
self.op_gas += 1
else:
chargeGasMem()
pass
def getInstruction(self, opcodeint, immediates):
self.opcodeint = opcodeint
dummy = []
#FIXME-why is it being cast to int?
for i in immediates:
dummy.append(int(i))
self.immediates = dummy
def callExecuteMethod(self):
runmethod = self.instructionUnwinder(self.opcodeint, self.immediates, self.machinestate)
#print (repr(hex(self.opcodeint)) + ' ' + repr(self.immediates))
try:
runmethod(self.opcodeint, self.immediates)
except IndexError:
# trap
print(Colors.red + 'bad stack access.' + Colors.ENDC)
val2 = self.machinestate.Stack_Omni.pop()
def instructionUnwinder(self, opcodeint, immediates, machinestate):
self.chargeGas(opcodeint)
if opcodeint == 0:
return(self.run_unreachable)
elif opcodeint == 1:
return(self.run_nop)
elif opcodeint == 2:
return(self.run_block)
elif opcodeint == 3:
return(self.run_loop)
elif opcodeint == 4:
return(self.run_if)
elif opcodeint == 5:
return(self.run_else)
elif opcodeint == 11:
return(self.run_end)
elif opcodeint == 12:
return(self.run_br)
elif opcodeint == 13:
return(self.run_br_if)
elif opcodeint == 14:
return(self.run_br_table)
elif opcodeint == 15:
return(self.run_return)
elif opcodeint == 16:
return(self.run_call)
elif opcodeint == 17:
return(self.run_call_indirect)
elif opcodeint == 26:
return(self.run_drop)
elif opcodeint == 27:
return(self.run_select)
elif opcodeint == 32:
return(self.run_getlocal)
elif opcodeint == 33:
return(self.run_setlocal)
elif opcodeint == 34:
return(self.run_teelocal)
elif opcodeint == 35:
return(self.run_getglobal)
elif opcodeint == 36:
return(self.run_setglobal)
elif opcodeint >= 40 and opcodeint <= 53:
return(self.run_load)
elif opcodeint >= 54 and opcodeint <= 62:
return(self.run_store)
elif opcodeint == 63:
return(self.run_current_memory)
elif opcodeint == 64:
self.chargeGasMem(immediates[0])
return(self.run_grow_memory)
elif opcodeint >= 65 and opcodeint <= 68:
return(self.run_const)
elif opcodeint == 69 or opcodeint == 80:
return(self.run_eqz)
elif opcodeint == 70 or opcodeint == 81 or opcodeint == 91 or opcodeint == 97:
return(self.run_eq)
elif opcodeint == 71 or opcodeint == 82 or opcodeint == 92 or opcodeint == 98:
return(self.run_ne)
elif opcodeint == 72 or opcodeint == 83:
return(self.run_lt_s)
elif opcodeint == 73 or opcodeint == 84:
return(self.run_lt_u)
elif opcodeint == 74 or opcodeint == 85:
return(self.run_gt_s)
elif opcodeint == 75 or opcodeint == 86:
return(self.run_gt_u)
elif opcodeint == 76 or opcodeint == 87:
return(self.run_le_s)
elif opcodeint == 77 or opcodeint == 88:
return(self.run_le_u)
elif opcodeint == 78 or opcodeint == 89:
return(self.run_ge_s)
elif opcodeint == 79 or opcodeint == 90:
return(self.run_ge_u)
elif opcodeint == 93 or opcodeint == 99:
return(self.run_lt)
elif opcodeint == 94 or opcodeint == 100:
return(self.run_gt)
elif opcodeint == 95 or opcodeint == 101:
return(self.run_le)
elif opcodeint == 96 or opcodeint == 102:
return(self.run_ge)
elif opcodeint == 103 or opcodeint == 121:
return(self.run_clz)
elif opcodeint == 104 or opcodeint == 122:
return(self.run_ctz)
elif opcodeint == 105 or opcodeint == 123:
return(self.run_popcnt)
elif opcodeint == 106 or opcodeint == 124 or opcodeint == 146 or opcodeint == 160:
return(self.run_add)
elif opcodeint == 107 or opcodeint == 125 or opcodeint == 147 or opcodeint == 161:
return(self.run_sub)
elif opcodeint == 108 or opcodeint == 126 or opcodeint == 148 or opcodeint == 162:
return(self.run_mul)
elif opcodeint == 109 or opcodeint == 127:
return(self.run_div_s)
elif opcodeint == 110 or opcodeint == 128:
return(self.run_div_u)
elif opcodeint == 111 or opcodeint == 129:
return(self.run_rem_s)
elif opcodeint == 112 or opcodeint == 130:
return(self.run_rem_u)
elif opcodeint == 113 or opcodeint == 131:
return(self.run_and)
elif opcodeint == 114 or opcodeint == 132:
return(self.run_or)
elif opcodeint == 115 or opcodeint == 133:
return(self.run_xor)
elif opcodeint == 116 or opcodeint == 134:
return(self.run_shl)
elif opcodeint == 117 or opcodeint == 135:
return(self.run_shr_s)
elif opcodeint == 118 or opcodeint == 136:
return(self.run_shr_u)
elif opcodeint == 119 or opcodeint == 137:
return(self.run_rotl)
elif opcodeint == 120 or opcodeint == 138:
return(self.run_rotr)
elif opcodeint == 139 or opcodeint == 153:
return(self.run_abs)
elif opcodeint == 140 or opcodeint == 154:
return(self.run_neg)
elif opcodeint == 141 or opcodeint == 155:
return(self.run_ceil)
elif opcodeint == 142 or opcodeint == 156:
return(self.run_floor)
elif opcodeint == 143 or opcodeint == 157:
return(self.run_trunc)
elif opcodeint == 144 or opcodeint == 158:
return(self.run_nearest)
elif opcodeint == 145 or opcodeint == 159:
return(self.run_sqrt)
elif opcodeint == 149 or opcodeint == 163:
return(self.run_div)
elif opcodeint == 150 or opcodeint == 164:
return(self.run_min)
elif opcodeint == 151 or opcodeint == 165:
return(self.run_max)
elif opcodeint == 152 or opcodeint == 166:
return(self.run_copysign)
elif opcodeint == 167:
return(self.run_i32wrapi64)
elif opcodeint == 168:
return(self.run_i32trunc_sf32)
elif opcodeint == 169:
return(self.run_i32trunc_uf32)
elif opcodeint == 170:
return(self.run_i32trunc_sf64)
elif opcodeint == 171:
return(self.run_i32trunc_uf64)
elif opcodeint == 172:
return(self.run_i64extend_si32)
elif opcodeint == 173:
return(self.run_i64extend_ui3o)
elif opcodeint == 174:
return(self.run_i64trunc_sf32)
elif opcodeint == 175:
return(self.run_i64trunc_uf32)
elif opcodeint == 176:
return(self.run_i64trunc_sf64)
elif opcodeint == 177:
return(self.run_i64trunc_uf64)
elif opcodeint == 178:
return(self.run_f32convert_si32)
elif opcodeint == 179:
return(self.run_f32convert_ui32)
elif opcodeint == 180:
return(self.run_f32convert_si64)
elif opcodeint == 181:
return(self.run_f32convert_ui64)
elif opcodeint == 182:
return(self.run_f32demotef64)
elif opcodeint == 183:
return(self.run_f64convert_si32)
elif opcodeint == 184:
return(self.run_f64convert_ui32)
elif opcodeint == 185:
return(self.run_f64convert_si64)
elif opcodeint == 186:
return(self.run_f64convert_ui64)
elif opcodeint == 187:
return(self.run_f64promotef32)
elif opcodeint == 188:
return(self.run_i32reinterpretf32)
elif opcodeint == 189:
return(self.run_i64reinterpretf64)
elif opcodeint == 190:
return(self.run_f32reinterpreti32)
elif opcodeint == 191:
return(self.run_f64reinterpreti64)
else:
raise Exception(Colors.red + 'unknown opcode' + Colors.ENDC)
def run_unreachable(self, opcodeint, immediates):
# trap
raise Exception(Colors.red + "trapped." + Colors.ENDC)
def run_nop(self, opcodeint, immediates):
# literally do nothing
pass
def run_block(self, opcodeint, immediates):
self.machinestate.Stack_Label.append(self.machinestate.Stack_Label_Height)
self.machinestate.Stack_Label_Height += 1
def run_loop(self, opcodeint, immediates):
# assertion
if not self.machinestate.Stack_Omni:
print(Colors.red + "entered a loop. stack is empty." + Colors.ENDC)
# exit 1
self.machinestate.Stack_Label.append(self.machinestate.Stack_Label_Height)
self.machinestate.Stack_Label_Height += 1
val = self.machinestate.Stack_Omni.pop()
if val != 0:
pass
else:
pass
def run_if(self, opcodeint, immediates):
pass
def run_else(self, opcodeint, immediates):
pass
def run_end(self, opcodeint, immediates):
#self.machinestate.Stack_Label.pop()
pass
def run_br(self, opcodeint, immediates):
if self.machinestate.Stack_Label_Height >= immediates[0] + 1:
print(Colors.red + "label stack does not have enough labels." + Colors.ENDC)
# exit 1
if len(self.machinestate.Stack_Omni) < 1:
print(Colors.red + "the value stack does not have enough values." + Colors.ENDC)
# exit 1
val = self.machinestate.Stack_Omni.pop()
label = self.machinestate.Stack_Label.pop()
def run_br_if(self, opcodeint, immediates):
val = self.machinestate.Stack_Omni.pop()
if val:
pass
else:
self.run_br(dummy, immediates[0])
def run_br_table(self, opcodeint, immediates):
pass
def run_return(self, opcodeint, immediates):
pass
def run_call(self, opcodeint, immediates):
pass
def run_call_indirect(self, opcodeint, immediates):
pass
def run_drop(self, opcodeint, immediates):
self.machinestate.Stack_Omni.pop()
def run_select(self, opcodeint, immediates):
pass
def run_getlocal(self, opcodeint, immediates):
local = self.machinestate.Index_Space_Locals[int(immediates[0])]
self.machinestate.Stack_Omni.append(local)
def run_setlocal(self, opcodeint, immediates):
self.machinestate.Index_Space_Locals[int(immediates[0])] = self.machinestate.Stack_Omni.pop()
def run_teelocal(self, dummy, immediates):
# @DEVI-we dont pop and push
self.machinestate.Index_Space_Locals[int(immediates[0])] = self.machinestate.Stack_Omni[-1]
def run_getglobal(self, opcodeint, immediates):
val = self.machinestate.Index_Space_Global[immediates[0]]
self.machinestate.Stack_Omni.append(val)
def run_setglobal(self, opcodeint, immediates):
val = self.machinestate.Stack_Omni.pop()
self.machinestate.Index_Space_Global = val
# currently only one linear memory is allowed so thats the default.
def run_load(self, opcodeint, immediates):
if opcodeint == 40:
bytes = self.machinestate.Linear_Memory[0][int(immediates[1]):int(immediates) + 4]
self.machinestate.Stack_Omni.append(np.int32(bytes))
elif opcodeint == 41:
bytes = self.machinestate.Linear_Memory[0][int(immediates[1]):int(immediates) + 8]
self.machinestate.Stack_Omni.append(np.int64(bytes))
elif opcodeint == 42:
bytes = self.machinestate.Linear_Memory[0][int(immediates[1]):int(immediates) + 4]
self.machinestate.Stack_Omni.append(np.float32(bytes))
elif opcodeint == 43:
bytes = self.machinestate.Linear_Memory[0][int(immediates[1]):int(immediates) + 8]
self.machinestate.Stack_Omni.append(np.float64(bytes))
elif opcodeint == 44:
temp = np.int8(self.machinestate.Linear_Memory[0][int(immediates[1])])
temp2 = (temp & 0x0000007f) | ((temp & 0x80) << 24)
self.machinestate.append(np.int32(tmep2))
elif opcodeint == 45:
temp = np.int8(self.machinestate.Linear_Memory[0][int(immediates[1])])
temp2 = temp & 0x000000ff
self.machinestate.append(np.uint32(tmep2))
elif opcodeint == 46:
temp = np.int8(self.machinestate.Linear_Memory[0][int(immediates[1]):int(immediates[1] + 2)])
temp2 = (temp & 0x00007fff) | ((temp & 0x8000) << 16)
self.machinestate.append(np.int32(tmep2))
elif opcodeint == 47:
temp = np.int8(self.machinestate.Linear_Memory[0][int(immediates[1]):int(immediates[1] + 2)])
temp2 = temp & 0x0000ffff
self.machinestate.append(np.uint32(tmep2))
elif opcodeint == 48:
temp = np.int8(self.machinestate.Linear_Memory[0][int(immediates[1])])
temp2 = (temp & 0x000000000000007f) | ((temp & 0x80) << 56)
self.machinestate.append(np.int64(tmep2))
elif opcodeint == 49:
temp = np.uint8(self.machinestate.Linear_Memory[0][int(immediates[1])])
self.machinestate.append(np.uint64(tmep))
elif opcodeint == 50:
temp = np.int8(self.machinestate.Linear_Memory[0][int(immediates[1]):int(immediates[1] + 2)])
temp2 = (temp & 0x0000000000007fff) | ((temp & 0x8000) << 48)
self.machinestate.append(np.int64(tmep2))
elif opcodeint == 51:
temp = np.uint8(self.machinestate.Linear_Memory[0][int(immediates[1]):int(immediates[1] + 2)])
self.machinestate.append(np.uint64(tmep))
elif opcodeint == 52:
temp = np.int8(self.machinestate.Linear_Memory[0][int(immediates[1]):int(immediates[1] + 4)])
temp2 = (temp & 0x000000007fffffff) | ((temp & 0x80000000) << 32)
self.machinestate.append(np.int64(tmep2))
elif opcodeint == 53:
temp = np.uint8(self.machinestate.Linear_Memory[0][int(immediates[1]):int(immediates[1] + 4)])
self.machinestate.append(np.uint64(tmep))
else:
raise Exception(Colors.red + 'invalid load instruction.' + Colors.ENDC)
# currently only one linear memory is allowed so thats the default.
def run_store(self, opcodeint, immediates):
if opcodeint == 54:
val = self.machinestate.Stack_Omni.pop()
self.machinestate.Linear_Memory[0][int(immediates[1]) + 0] = val & 0x000000ff
self.machinestate.Linear_Memory[0][int(immediates[1]) + 1] = val & 0x0000ff00 >> 8
self.machinestate.Linear_Memory[0][int(immediates[1]) + 2] = val & 0x00ff0000 >> 16
self.machinestate.Linear_Memory[0][int(immediates[1]) + 3] = val & 0xff000000 >> 24
elif opcodeint == 55:
val = self.machinestate.Stack_Omni.pop()
self.machinestate.Linear_Memory[0][int(immediates[1]) + 0] = val & 0x00000000000000ff
self.machinestate.Linear_Memory[0][int(immediates[1]) + 1] = val & 0x000000000000ff00 >> 8
self.machinestate.Linear_Memory[0][int(immediates[1]) + 2] = val & 0x0000000000ff0000 >> 16
self.machinestate.Linear_Memory[0][int(immediates[1]) + 3] = val & 0x00000000ff000000 >> 24
self.machinestate.Linear_Memory[0][int(immediates[1]) + 4] = val & 0x000000ff00000000 >> 32
self.machinestate.Linear_Memory[0][int(immediates[1]) + 5] = val & 0x0000ff0000000000 >> 40
self.machinestate.Linear_Memory[0][int(immediates[1]) + 6] = val & 0x00ff000000000000 >> 48
self.machinestate.Linear_Memory[0][int(immediates[1]) + 7] = val & 0xff00000000000000 >> 56
# @DEVI-FIXME-needs reinterpret cast
elif opcodeint == 56:
pass
# @DEVI-FIXME-needs reinterpret cast
elif opcodeint == 57:
pass
elif opcodeint == 58:
val = self.machinestate.Stack_Omni.pop()
self.machinestate.Linear_Memory[0][int(immediates[1])] = np.in8(val & 0x000000ff)
elif opcodeint == 59:
val = self.machinestate.Stack_Omni.pop()
self.machinestate.Linear_Memory[0][int(immediates[1]) + 0] = np.in8(val & 0x000000ff)
self.machinestate.Linear_Memory[0][int(immediates[1]) + 1] = np.in8(val & 0x0000ff00 >> 8)
elif opcodeint == 60:
val = self.machinestate.Stack_Omni.pop()
self.machinestate.Linear_Memory[0][int(immediates[1])] = np.in8(val & 0x00000000000000ff)
elif opcodeint == 61:
val = self.machinestate.Stack_Omni.pop()
self.machinestate.Linear_Memory[0][int(immediates[1]) + 0] = np.in8(val & 0x00000000000000ff)
self.machinestate.Linear_Memory[0][int(immediates[1]) + 1] = np.in8(val & 0x000000000000ff00 >> 8)
elif opcodeint == 62:
val = self.machinestate.Stack_Omni.pop()
self.machinestate.Linear_Memory[0][int(immediates[1]) + 0] = np.in8(val & 0x00000000000000ff)
self.machinestate.Linear_Memory[0][int(immediates[1]) + 1] = np.in8(val & 0x000000000000ff00 >> 8)
self.machinestate.Linear_Memory[0][int(immediates[1]) + 2] = np.in8(val & 0x0000000000ff0000 >> 16)
self.machinestate.Linear_Memory[0][int(immediates[1]) + 3] = np.in8(val & 0x00000000ff000000 >> 24)
else:
raise Exception(Colors.red + 'invalid store instruction' + Colors.ENDC)
def run_current_memory(self, opcodeint, immediates):
pass
def run_grow_memory(self, opcodeint, immediates):
pass
def run_const(self, opcodeint, immediates):
if opcodeint == 65:
self.machinestate.Stack_Omni.append(immediates[0])
elif opcodeint == 66:
self.machinestate.Stack_Omni.append(immediates[0])
elif opcodeint == 67:
self.machinestate.Stack_Omni.append(immediates[0])
elif opcodeint == 68:
self.machinestate.Stack_Omni.append(immediates[0])
else:
raise Exception(Colors.red + 'invalid const instruction' + Colors.ENDC)
def run_eqz(self, opcodeint, immediates):
if opcodeint == 69 or opcodeint == 80:
val = self.machinestate.Stack_Omni.pop()
if val == 0:
self.machinestate.Stack_Omni.append(1)
else:
self.machinestate.Stack_Omni.append(0)
else:
raise Exception(Colors.red + 'invalid eqz instruction' + Colors.ENDC)
def run_eq(self, opcodeint, immediates):
if opcodeint == 70 or opcodeint == 81 or opcodeint == 91 or opcodeint == 97:
val2 = self.machinestate.Stack_Omni.pop()
val1 = self.machinestate.Stack_Omni.pop()
if val1 == val2:
self.machinestate.Stack_Omni.append(1)
else:
self.machinestate.Stack_Omni.append(0)
else:
raise Exception(Colors.red + 'invalid eq instruction' + Colors.ENDC)
def run_ne(self, opcodeint, immediates):
if opcodeint == 71 or opcodeint == 82 or opcodeint == 92 or opcodeint == 98:
val2 = self.machinestate.Stack_Omni.pop()
val1 = self.machinestate.Stack_Omni.pop()
if val1 != val2:
self.machinestate.Stack_Omni.append(1)
else:
self.machinestate.Stack_Omni.append(0)
else:
raise Exception(Colors.red + 'invalid ne instruction' + Colors.ENDC)
def run_lt_s(self, opcodeint, immediates):
val2 = self.machinestate.Stack_Omni.pop()
val1 = self.machinestate.Stack_Omni.pop()
if opcodeint == 72:
if np.int32(val1) < np.int32(val2):
self.machinestate.Stack_Omni.append(1)
else:
self.machinestate.Stack_Omni.append(0)
elif opcodeint == 83:
if np.int64(val1) < np.int64(val2):
self.machinestate.Stack_Omni.append(1)
else:
self.machinestate.Stack_Omni.append(0)
else:
raise Exception(Colors.red + 'invalid lt_s instruction' + Colors.ENDC)
def run_lt_u(self, opcodeint, immediates):
val2 = self.machinestate.Stack_Omni.pop()
val1 = self.machinestate.Stack_Omni.pop()
if opcodeint == 73:
if np.uint32(val1) < np.uint32(val2):
self.machinestate.Stack_Omni.append(1)
else:
self.machinestate.Stack_Omni.append(0)
elif opcodeint == 84:
if np.uint64(val1) < np.uint64(val2):
self.machinestate.Stack_Omni.append(1)
else:
self.machinestate.Stack_Omni.append(0)
else:
raise Exception(Colors.red + 'invalid lt_u instruction' + Colors.ENDC)
def run_gt_s(self, opcodeint, immediates):
val2 = self.machinestate.Stack_Omni.pop()
val1 = self.machinestate.Stack_Omni.pop()
if opcodeint == 74:
if np.int32(val1) > np.int32(val2):
self.machinestate.Stack_Omni.append(1)
else:
self.machinestate.Stack_Omni.append(0)
elif opcodeint == 85:
if np.int64(val1) > np.int64(val2):
self.machinestate.Stack_Omni.append(1)
else:
self.machinestate.Stack_Omni.append(0)
else:
raise Exception(Colors.red + 'invalid gt_s instruction' + Colors.ENDC)
def run_gt_u(self, opcodeint, immediates):
val2 = self.machinestate.Stack_Omni.pop()
val1 = self.machinestate.Stack_Omni.pop()
if opcodeint == 75:
if np.uint32(val1) > np.uint32(val2):
self.machinestate.Stack_Omni.append(1)
else:
self.machinestate.Stack_Omni.append(0)
elif opcodeint == 86:
if np.uint64(val1) > np.uint64(val2):
self.machinestate.Stack_Omni.append(1)
else:
self.machinestate.Stack_Omni.append(0)
else:
raise Exception(Colors.red + 'invalid gt_u instruction' + Colors.ENDC)
def run_le_s(self, opcodeint, immediates):
val2 = self.machinestate.Stack_Omni.pop()
val1 = self.machinestate.Stack_Omni.pop()
if opcodeint == 76:
if np.int32(val1) <= np.int32(val2):
self.machinestate.Stack_Omni.append(1)
else:
self.machinestate.Stack_Omni.append(0)
elif opcodeint == 87:
if np.int64(val1) <= np.int64(val2):
self.machinestate.Stack_Omni.append(1)
else:
self.machinestate.Stack_Omni.append(0)
else:
raise Exception(Colors.red + 'invalid le_s instruction' + Colors.ENDC)
def run_le_u(self, opcodeint, immediates):
val2 = self.machinestate.Stack_Omni.pop()
val1 = self.machinestate.Stack_Omni.pop()
if opcodeint == 77:
if np.uint32(val1) <= np.uint32(val2):
self.machinestate.Stack_Omni.append(1)
else:
self.machinestate.Stack_Omni.append(0)
elif opcodeint == 88:
if np.uint64(val1) <= np.uint64(val2):
self.machinestate.Stack_Omni.append(1)
else:
self.machinestate.Stack_Omni.append(0)
else:
raise Exception(Colors.red + 'invalid le_u instruction' + Colors.ENDC)
def run_ge_s(self, opcodeint, immediates):
val2 = self.machinestate.Stack_Omni.pop()
val1 = self.machinestate.Stack_Omni.pop()
if opcodeint == 78:
if np.int32(val1) >= np.int32(val2):
self.machinestate.Stack_Omni.append(1)
else:
self.machinestate.Stack_Omni.append(0)
elif opcodeint == 89:
if np.int64(val1) >= np.int64(val2):
self.machinestate.Stack_Omni.append(1)
else:
self.machinestate.Stack_Omni.append(0)
else:
raise Exception(Colors.red + 'invalid ge_s instruction' + Colors.ENDC)
def run_ge_u(self, opcodeint, immediates):
val2 = self.machinestate.Stack_Omni.pop()
val1 = self.machinestate.Stack_Omni.pop()
if opcodeint == 79:
if np.uint32(val1) >= np.uint32(val2):
self.machinestate.Stack_Omni.append(1)
else:
self.machinestate.Stack_Omni.append(0)
elif opcodeint == 90:
if np.uint64(val1) >= np.uint64(val2):
self.machinestate.Stack_Omni.append(1)
else:
self.machinestate.Stack_Omni.append(0)
else:
raise Exception(Colors.red + 'invalid ge_u instruction' + Colors.ENDC)
def run_lt(self, opcodeint, immediates):
val2 = self.machinestate.Stack_Omni.pop()
val1 = self.machinestate.Stack_Omni.pop()
if opcodeint == 93:
if np.float32(v1) < np.float32(v2):
self.machinestate.Stack_Omni.append(1)
else:
self.machinestate.Stack_Omni.append(0)
elif opcodeint == 99:
if np.float64(v1) < np.float64(v2):
self.machinestate.Stack_Omni.append(1)
else:
self.machinestate.Stack_Omni.append(0)
else:
raise Exception(Colors.red + 'invalid lt instruction' + Colors.ENDC)
def run_gt(self, opcodeint, immediates):
val2 = self.machinestate.Stack_Omni.pop()
val1 = self.machinestate.Stack_Omni.pop()
if opcodeint == 94:
if np.float32(v1) > np.float32(v2):
self.machinestate.Stack_Omni.append(1)
else:
self.machinestate.Stack_Omni.append(0)
elif opcodeint == 100:
if np.float64(v1) > np.float64(v2):
self.machinestate.Stack_Omni.append(1)
else:
self.machinestate.Stack_Omni.append(0)
else:
raise Exception(Colors.red + 'invalid gt instruction' + Colors.ENDC)
def run_le(self, opcodeint, immediates):
val2 = self.machinestate.Stack_Omni.pop()
val1 = self.machinestate.Stack_Omni.pop()
if opcodeint == 95:
if np.float32(v1) <= np.float32(v2):
self.machinestate.Stack_Omni.append(1)
else:
self.machinestate.Stack_Omni.append(0)
elif opcodeint == 101:
if np.float64(v1) <= np.float64(v2):
self.machinestate.Stack_Omni.append(1)
else:
self.machinestate.Stack_Omni.append(0)
else:
raise Exception(Colors.red + 'invalid le instruction' + Colors.ENDC)
def run_ge(self, opcodeint, immediates):
val2 = self.machinestate.Stack_Omni.pop()
val1 = self.machinestate.Stack_Omni.pop()
if opcodeint == 96:
if np.float32(v1) >= np.float32(v2):
self.machinestate.Stack_Omni.append(1)
else:
self.machinestate.Stack_Omni.append(0)
elif opcodeint == 102:
if np.float64(v1) >= np.float64(v2):
self.machinestate.Stack_Omni.append(1)
else:
self.machinestate.Stack_Omni.append(0)
else:
raise Exception(Colors.red + 'invalid ge instruction' + Colors.ENDC)
def run_clz(self, opcodeint, immediates):
val1 = self.machinestate.Stack_Omni.pop()
if opcodeint == 103:
self.machinestate.Stack_Omni.append(clz(val, 'uint32'))
elif opcodeint == 121:
self.machinestate.Stack_Omni.append(clz(val, 'uint64'))
else:
raise Exception(Colors.red + 'invalid clz instruction' + Colors.ENDC)
def run_ctz(self, opcodeint, immediates):
val1 = self.machinestate.Stack_Omni.pop()
if opcodeint == 104:
self.machinestate.Stack_Omni.append(ctz(val, 'uint32'))
elif opcodeint == 122:
self.machinestate.Stack_Omni.append(ctz(val, 'uint64'))
else:
raise Exception(Colors.red + 'invalid ctz instruction' + Colors.ENDC)
def run_popcnt(self, opcodeint, immediates):
val1 = self.machinestate.Stack_Omni.pop()
if opcodeint == 105:
self.machinestate.Stack_Omni.append(pop_cnt(val, 'uint32'))
elif opcodeint == 123:
self.machinestate.Stack_Omni.append(pop_cnt(val, 'uint64'))
else:
raise Exception(Colors.red + 'invalid popcnt instruction' + Colors.ENDC)
def run_add(self, opcodeint, immediates):
val2 = self.machinestate.Stack_Omni.pop()
val1 = self.machinestate.Stack_Omni.pop()
if opcodeint == 106:
self.machinestate.Stack_Omni.append(np.uint32(val1 + val2))
elif opcodeint == 124:
self.machinestate.Stack_Omni.append(np.uint64(val1 + val2))
elif opcodeint == 146:
self.machinestate.Stack_Omni.append(np.float32(val1 + val2))
elif opcodeint == 160:
self.machinestate.Stack_Omni.append(np.float64(val1 + val2))
else:
raise Exception(Colors.red + 'invalid add instruction' + Colors.ENDC)
def run_sub(self, opcodeint, immediates):
val2 = self.machinestate.Stack_Omni.pop()
val1 = self.machinestate.Stack_Omni.pop()
if opcodeint == 107:
self.machinestate.Stack_Omni.append(np.uint32(val1 - val2))
elif opcodeint == 125:
self.machinestate.Stack_Omni.append(np.uint64(val1 - val2))
elif opcodeint == 147:
self.machinestate.Stack_Omni.append(np.float32(val1 - val2))
elif opcodeint == 161:
self.machinestate.Stack_Omni.append(np.float64(val1 - val2))
else:
raise Exception(Colors.red + 'invalid sub instruction' + Colors.ENDC)
def run_mul(self, opcodeint, immediates):
val2 = self.machinestate.Stack_Omni.pop()
val1 = self.machinestate.Stack_Omni.pop()
if opcodeint == 108:
self.machinestate.Stack_Omni.append(np.uint32(val1 * val2))
elif opcodeint == 126:
self.machinestate.Stack_Omni.append(np.uint64(val1 * val2))
elif opcodeint == 148:
self.machinestate.Stack_Omni.append(np.float32(val1 * val2))
elif opcodeint == 162:
self.machinestate.Stack_Omni.append(np.float64(val1 * val2))
else:
raise Exception(Colors.red + 'invalid mul instruction' + Colors.ENDC)
def run_div_s(self, opcodeint, immediates):
val2 = self.machinestate.Stack_Omni.pop()
val1 = self.machinestate.Stack_Omni.pop()
if opcodeint == 109:
self.machinestate.Stack_Omni.append(np.int32(np.int32(val1) / np.int32(val2)))
elif opcodeint == 127:
self.machinestate.Stack_Omni.append(np.int64(np.int64(val1) / np.int64(val2)))
else:
raise Exception(Colors.red + 'invalid div_s instruction' + Colors.ENDC)
def run_div_u(self, opcodeint, immediates):
val2 = self.machinestate.Stack_Omni.pop()
val1 = self.machinestate.Stack_Omni.pop()
if opcodeint == 110:
self.machinestate.Stack_Omni.append(np.uint32(np.uint32(val1) / np.uint32(val2)))
elif opcodeint == 128:
self.machinestate.Stack_Omni.append(np.uint64(np.uint64(val1) / np.uint64(val2)))
else:
raise Exception(Colors.red + 'invalid div_u instruction' + Colors.ENDC)
def run_rem_s(self, opcodeint, immediates):
val2 = self.machinestate.Stack_Omni.pop()
val1 = self.machinestate.Stack_Omni.pop()
if opcodeint == 111:
self.machinestate.Stack_Omni.append(np.int32(np.int32(val1) % np.int32(val2)))
elif opcodeint == 129:
self.machinestate.Stack_Omni.append(np.int64(np.int64(val1) % np.int64(val2)))
else:
raise Exception(Colors.red + 'invalid rem_s instruction' + Colors.ENDC)
def run_rem_u(self, opcodeint, immediates):
val2 = self.machinestate.Stack_Omni.pop()
val1 = self.machinestate.Stack_Omni.pop()
if opcodeint == 112:
self.machinestate.Stack_Omni.append(np.uint32(np.uint32(val1) % np.uint32(val2)))
elif opcodeint == 130:
self.machinestate.Stack_Omni.append(np.uint64(np.uint64(val1) % np.uint64(val2)))
else:
raise Exception(Colors.red + 'invalid rem_u instruction' + Colors.ENDC)
def run_and(self, opcodeint, immediates):
val2 = self.machinestate.Stack_Omni.pop()
val1 = self.machinestate.Stack_Omni.pop()
if opcodeint == 113:
self.machinestate.Stack_Omni.append(np.uint32(np.uint32(val1) & np.uint32(val2)))
elif opcodeint == 131:
self.machinestate.Stack_Omni.append(np.uint64(np.uint64(val1) & np.uint64(val2)))
else:
raise Exception(Colors.red + 'invalid and instruction' + Colors.ENDC)
def run_or(self, opcodeint, immediates):
val2 = self.machinestate.Stack_Omni.pop()
val1 = self.machinestate.Stack_Omni.pop()
if opcodeint == 114:
self.machinestate.Stack_Omni.append(np.uint32(np.uint32(val1) | np.uint32(val2)))
elif opcodeint == 132:
self.machinestate.Stack_Omni.append(np.uint64(np.uint64(val1) | np.uint64(val2)))
else:
raise Exception(Colors.red + 'invalid or instruction' + Colors.ENDC)
def run_xor(self, opcodeint, immediates):
val2 = self.machinestate.Stack_Omni.pop()
val1 = self.machinestate.Stack_Omni.pop()
if opcodeint == 115:
self.machinestate.Stack_Omni.append(np.uint32(np.uint32(val1) ^ np.uint32(val2)))
elif opcodeint == 133:
self.machinestate.Stack_Omni.append(np.uint64(np.uint64(val1) ^ np.uint64(val2)))
else:
raise Exception(Colors.red + 'invalid xor instruction' + Colors.ENDC)
def run_shl(self, opcodeint, immediates):
val2 = self.machinestate.Stack_Omni.pop()
val1 = self.machinestate.Stack_Omni.pop()
if opcodeint == 116:
self.machinestate.Stack_Omni.append(np.uint32(np.uint32(val1) << (np.uint32(val2))))
elif opcodeint == 134:
self.machinestate.Stack_Omni.append(np.uint64(np.uint64(val1) << (np.uint64(val2))))
else:
raise Exception(Colors.red + 'invalid shl instruction' + Colors.ENDC)
def run_shr_s(self, opcodeint, immediates):
val2 = self.machinestate.Stack_Omni.pop()
val1 = self.machinestate.Stack_Omni.pop()
if opcodeint == 117:
self.machinestate.Stack_Omni.append(np.int32(np.int32(val1) >> (np.int32(val2))))
elif opcodeint == 135:
self.machinestate.Stack_Omni.append(np.int64(np.int64(val1) >> (np.int64(val2))))
else:
raise Exception(Colors.red + 'invalid shr_s instruction' + Colors.ENDC)
def run_shr_u(self, opcodeint, immediates):
val2 = self.machinestate.Stack_Omni.pop()
val1 = self.machinestate.Stack_Omni.pop()
if opcodeint == 118:
self.machinestate.Stack_Omni.append(np.uint32(np.uint32(val1) >> (np.uint32(val2))))
elif opcodeint == 136:
self.machinestate.Stack_Omni.append(np.uint64(np.uint64(val1) >> (np.uint64(val2))))
else:
raise Exception(Colors.red + 'invalid shr_u instruction' + Colors.ENDC)
def run_rotl(self, opcodeint, immediates):
val2 = self.machinestate.Stack_Omni.pop()
val1 = self.machinestate.Stack_Omni.pop()
if opcodeint == 119:
self.machinestate.Stack_Omni.append(rol(val1, 32, val2))
elif opcodeint == 137:
self.machinestate.Stack_Omni.append(rol(val1, 64, val2))
else:
raise Exception(Colors.red + 'invalid rotl instruction' + Colors.ENDC)
def run_rotr(self, opcodeint, immediates):
val2 = self.machinestate.Stack_Omni.pop()
val1 = self.machinestate.Stack_Omni.pop()
if opcodeint == 120:
self.machinestate.Stack_Omni.append(ror(val1, 32, val2))
elif opcodeint == 138:
self.machinestate.Stack_Omni.append(ror(val1, 32, val2))
else:
raise Exception(Colors.red + 'invalid rotl instruction' + Colors.ENDC)
def run_abs(self, opcodeint, immediates):
val1 = self.machinestate.Stack_Omni.pop()
if opcodeint == 139 or opcodeint == 153:
self.machinestate.Stack_Omni.append(abs(val1))
else:
raise Exception(Colors.red + 'invalid abs instruction' + Colors.ENDC)
def run_neg(self, opcodeint, immediates):
val1 = self.machinestate.Stack_Omni.pop()
if opcodeint == 140 or opcodeint == 154:
self.machinestate.Stack_Omni.append(-val1)
else:
raise Exception(Colors.red + 'invalid neg instruction' + Colors.ENDC)
def run_ceil(self, opcodeint, immediates):
val1 = self.machinestate.Stack_Omni.pop()
if opcodeint == 141 or opcodeint == 155:
self.machinestate.Stack_Omni.append(math.ceil(val1))
else:
raise Exception(Colors.red + 'invalid ceil instruction' + Colors.ENDC)
def run_floor(self, opcodeint, immediates):
if opcodeint == 142 or opcodeint == 156:
self.machinestate.Stack_Omni.append(math.floor(val1))
else:
raise Exception(Colors.red + 'invalid floor instruction' + Colors.ENDC)
def run_trunc(self, opcodeint, immediates):
val1 = self.machinestate.Stack_Omni.pop()
if opcodeint == 143 or opcodeint == 157:
self.machinestate.Stack_Omni.append(math.trunc(val1))
else:
raise Exception(Colors.red + 'invalid trunc instruction' + Colors.ENDC)
def run_nearest(self, opcodeint, immediates):
val1 = self.machinestate.Stack_Omni.pop()
if opcodeint == 144 or opcodeint == 158:
self.machinestate.Stack_Omni.append(round(val1))
else:
raise Exception(Colors.red + 'invalid nearest instruction' + Colors.ENDC)
def run_sqrt(self, opcodeint, immediates):
val1 = self.machinestate.Stack_Omni.pop()
if opcodeint == 145 or opcodeint == 159:
self.machinestate.Stack_Omni.append(math.sqrt(val1))
else:
raise Exception(Colors.red + 'invalid sqrt instruction' + Colors.ENDC)
def run_div(self, opcodeint, immediates):
val2 = self.machinestate.Stack_Omni.pop()
val1 = self.machinestate.Stack_Omni.pop()
if opcodeint == 149:
self.machinestate.Stack_Omni.append(v1 / v2)
else:
raise Exception(Colors.red + 'invalid float div instruction' + Colors.ENDC)
def run_min(self, opcodeint, immediates):
val2 = self.machinestate.Stack_Omni.pop()
val1 = self.machinestate.Stack_Omni.pop()
if opcodeint == 150 or opcodeint == 164:
self.machinestate.Stack_Omni.append(min(val1, val2))
else:
raise Exception(Colors.red + 'invalid min instruction' + Colors.ENDC)
def run_max(self, opcodeint, immediates):
val2 = self.machinestate.Stack_Omni.pop()
val1 = self.machinestate.Stack_Omni.pop()
if opcodeint == 151 or opcodeint == 165:
self.machinestate.Stack_Omni.append(max(val1, val2))
else:
raise Exception(Colors.red + 'invalid max instruction' + Colors.ENDC)
def run_copysign(self, opcodeint, immediates):
val2 = self.machinestate.Stack_Omni.pop()
val1 = self.machinestate.Stack_Omni.pop()
if opcodeint == 152 or opcodeint == 166:
self.machinestate.Stack_Omni.append(math.copysign(val1, val2))
else:
raise Exception(Colors.red + 'invalid max instruction' + Colors.ENDC)
def run_i32wrapi64(self, opcodeint, immediates):
val1 = self.machinestate.Stack_Omni.pop()
self.machinestate.Stack_Omni.append(np.int32(np.float64(val1)))
def run_i32trunc_sf32(self, opcodeint, immediates):
val1 = self.machinestate.Stack_Omni.pop()
self.machinestate.Stack_Omni.append(np.int32(np.float32(val1)))
def run_i32trunc_uf32(self, opcodeint, immediates):
val1 = self.machinestate.Stack_Omni.pop()
self.machinestate.Stack_Omni.append(np.uint32(np.float32(val1)))
def run_i32trunc_sf64(self, opcodeint, immediates):
val1 = self.machinestate.Stack_Omni.pop()
self.machinestate.Stack_Omni.append(np.int32(np.float64(val1)))
def run_i32trunc_uf64(self, opcodeint, immediates):
val1 = self.machinestate.Stack_Omni.pop()
self.machinestate.Stack_Omni.append(np.int32(np.float64(val1)))
def run_i64extend_si32(self, opcodeint, immediates):
val1 = self.machinestate.Stack_Omni.pop()
self.machinestate.Stack_Omni.append(np.float64(np.int32(val1)))
def run_i64extend_ui32(self, opcodeint, immediates):
val1 = self.machinestate.Stack_Omni.pop()
self.machinestate.Stack_Omni.append(np.float64(np.uint32(val1)))
def run_i64trunc_sf32(self, opcodeint, immediates):
val1 = self.machinestate.Stack_Omni.pop()
self.machinestate.Stack_Omni.append(np.int64(np.float32(val1)))
def run_i64trunc_uf32(self, opcodeint, immediates):
val1 = self.machinestate.Stack_Omni.pop()
self.machinestate.Stack_Omni.append(np.uint64(np.float32(val1)))
def run_i64trunc_sf64(self, opcodeint, immediates):
val1 = self.machinestate.Stack_Omni.pop()
self.machinestate.Stack_Omni.append(np.int64(np.float64(val1)))
def run_i64trunc_uf64(self, opcodeint, immediates):
val1 = self.machinestate.Stack_Omni.pop()
self.machinestate.Stack_Omni.append(np.uint64(np.float64(val1)))
def run_f32convert_si32(self, opcodeint, immediates):
val1 = self.machinestate.Stack_Omni.pop()
self.machinestate.Stack_Omni.append(np.float32(np.uint32(val1)))
def run_f32convert_ui32(self, opcodeint, immediates):
val1 = self.machinestate.Stack_Omni.pop()
self.machinestate.Stack_Omni.append(np.float32(np.int32(val1)))
def run_f32convert_si64(self, opcodeint, immediates):
val1 = self.machinestate.Stack_Omni.pop()
self.machinestate.Stack_Omni.append(np.float32(np.int64(val1)))
def run_f32convert_ui64(self, opcodeint, immediates):
val1 = self.machinestate.Stack_Omni.pop()
self.machinestate.Stack_Omni.append(np.float32(np.uint64(val1)))
def run_f32demotef64(self, opcodeint, immediates):
val1 = self.machinestate.Stack_Omni.pop()
self.machinestate.Stack_Omni.append(np.float32(np.float64(val1)))
def run_f64convert_si32(self, opcodeint, immediates):
val1 = self.machinestate.Stack_Omni.pop()
self.machinestate.Stack_Omni.append(np.float64(np.int32(val1)))
def run_f64convert_ui32(self, opcodeint, immediates):
val1 = self.machinestate.Stack_Omni.pop()
self.machinestate.Stack_Omni.append(np.float64(np.uint32(val1)))
def run_f64convert_si64(self, opcodeint, immediates):
val1 = self.machinestate.Stack_Omni.pop()
self.machinestate.Stack_Omni.append(np.float64(np.int64(val1)))
def run_f64convert_ui64(self, opcodeint, immediates):
val1 = self.machinestate.Stack_Omni.pop()
self.machinestate.Stack_Omni.append(np.float64(np.uint64(val1)))
def run_f64promotef32(self, opcodeint, immediates):
val1 = self.machinestate.Stack_Omni.pop()
self.machinestate.Stack_Omni.append(np.float64(np.float32(val1)))
def run_i32reinterpretf32(self, opcodeint, immediates):
val1 = self.machinestate.Stack_Omni.pop()
sel.machinestate.Stack_Omni.append(reinterpretf32toi32(val1))
def run_i64reinterpretf64(self, opcodeint, immediates):
val1 = self.machinestate.Stack_Omni.pop()
sel.machinestate.Stack_Omni.append(reinterpretf64toi64(val1))
def run_f32reinterpreti32(self, opcodeint, immediates):
val1 = self.machinestate.Stack_Omni.pop()
sel.machinestate.Stack_Omni.append(reinterpreti32tof32(val1))
def run_f64reinterpreti64(self, opcodeint, immediates):
val1 = self.machinestate.Stack_Omni.pop()
sel.machinestate.Stack_Omni.append(reinterpreti64tof64(val1))