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()
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(temp2))
elif opcodeint == 45:
temp = np.int8(
self.machinestate.Linear_Memory[0][int(immediates[1])]
)
temp2 = temp & 0x000000FF
self.machinestate.append(np.uint32(temp2))
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(temp2))
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(temp2))
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(temp2))
elif opcodeint == 49:
temp = np.uint8(
self.machinestate.Linear_Memory[0][int(immediates[1])]
)
self.machinestate.append(np.uint64(temp))
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(temp2))
elif opcodeint == 51:
temp = np.uint8(
self.machinestate.Linear_Memory[0][
int(immediates[1]) : int(immediates[1] + 2)
]
)
self.machinestate.append(np.uint64(temp))
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(temp2))
elif opcodeint == 53:
temp = np.uint8(
self.machinestate.Linear_Memory[0][
int(immediates[1]) : int(immediates[1] + 4)
]
)
self.machinestate.append(np.uint64(temp))
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):
v2 = self.machinestate.Stack_Omni.pop()
v1 = 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):
v2 = self.machinestate.Stack_Omni.pop()
v1 = 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):
v2 = self.machinestate.Stack_Omni.pop()
v1 = 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):
v2 = self.machinestate.Stack_Omni.pop()
v1 = 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):
val = 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):
val = 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):
val = 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):
v2 = self.machinestate.Stack_Omni.pop()
v1 = 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))