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))