Phasor 3.1.1
Stack VM based Programming Language
Loading...
Searching...
No Matches
OpCode.py
Go to the documentation of this file.
1"""
2phasor.OpCode
3=============
4OpCode enumeration — mirrors ISA.hpp exactly.
5
6Values are assigned in declaration order starting at 0, matching the C++
7``enum class OpCode : uint8_t`` which uses implicit sequential values.
8"""
9
10from enum import IntEnum
11
12
13class OpCode(IntEnum):
14 """Phasor VM instruction opcodes"""
15
16 PUSH_CONST = 0x00 # Push constant from constant pool
17 POP = 0x01 # Pop top of stack
18
19 IADD = 0x02 # pop b, pop a → push a + b
20 ISUBTRACT = 0x03 # pop b, pop a → push a - b
21 IMULTIPLY = 0x04 # pop b, pop a → push a * b
22 IDIVIDE = 0x05 # pop b, pop a → push a / b
23 IMODULO = 0x06 # pop b, pop a → push a % b
24
25 FLADD = 0x07
26 FLSUBTRACT = 0x08
27 FLMULTIPLY = 0x09
28 FLDIVIDE = 0x0A
29 FLMODULO = 0x0B
30
31 SQRT = 0x0C
32 POW = 0x0D
33 LOG = 0x0E
34 EXP = 0x0F
35 SIN = 0x10
36 COS = 0x11
37 TAN = 0x12
38
39 NEGATE = 0x13 # pop a → push -a
40 NOT = 0x14 # pop a → push !a
41
42 IAND = 0x15
43 IOR = 0x16
44 FLAND = 0x17
45 FLOR = 0x18
46
47 IEQUAL = 0x19
48 INOT_EQUAL = 0x1A
49 ILESS_THAN = 0x1B
50 IGREATER_THAN = 0x1C
51 ILESS_EQUAL = 0x1D
52 IGREATER_EQUAL = 0x1E
53
54 FLEQUAL = 0x1F
55 FLNOT_EQUAL = 0x20
56 FLLESS_THAN = 0x21
57 FLGREATER_THAN = 0x22
58 FLLESS_EQUAL = 0x23
59 FLGREATER_EQUAL = 0x24
60
61 JUMP = 0x25 # unconditional jump to offset
62 JUMP_IF_FALSE = 0x26 # jump if TOS is false (pops value)
63 JUMP_IF_TRUE = 0x27 # jump if TOS is true (pops value)
64 JUMP_BACK = 0x28 # backward jump (loops)
65
66 STORE_VAR = 0x29 # pop TOS → variable slot
67 LOAD_VAR = 0x2A # push variable value
68
69 PRINT = 0x2B
70 PRINTERROR = 0x2C
71 READLINE = 0x2D
72 IMPORT = 0x2E
73 HALT = 0x2F
74 CALL_NATIVE = 0x30
75 CALL = 0x31
76 SYSTEM = 0x32
77 SYSTEM_OUT = 0x33
78 SYSTEM_ERR = 0x34
79 RETURN = 0x35
80
81 TRUE_P = 0x36
82 FALSE_P = 0x37
83 NULL_VAL = 0x38
84
85 LEN = 0x39 # pop s → push len(s)
86 CHAR_AT = 0x3A # pop index, pop s → push s[index]
87 SUBSTR = 0x3B # pop len, pop start, pop s → push s[start:start+len]
88
89 NEW_STRUCT = 0x3C
90 GET_FIELD = 0x3D
91 SET_FIELD = 0x3E
92
93 NEW_STRUCT_INSTANCE_STATIC = 0x3F
94 GET_FIELD_STATIC = 0x40
95 SET_FIELD_STATIC = 0x41
96
97 MOV = 0x42 # R[rA] = R[rB]
98 LOAD_CONST_R = 0x43 # R[rA] = constants[imm]
99 LOAD_VAR_R = 0x44 # R[rA] = variables[imm]
100 STORE_VAR_R = 0x45 # variables[imm] = R[rA]
101 PUSH_R = 0x46 # push(R[rA])
102 PUSH2_R = 0x47 # push(R[rA]); push(R[rB])
103 POP_R = 0x48 # R[rA] = pop()
104 POP2_R = 0x49 # R[rA], R[rB] = pop2()
105
106 IADD_R = 0x4A # R[rA] = R[rB] + R[rC]
107 ISUB_R = 0x4B
108 IMUL_R = 0x4C
109 IDIV_R = 0x4D
110 IMOD_R = 0x4E
111 FLADD_R = 0x4F
112 FLSUB_R = 0x50
113 FLMUL_R = 0x51
114 FLDIV_R = 0x52
115 FLMOD_R = 0x53
116 SQRT_R = 0x54 # R[rA] = sqrt(R[rB])
117 POW_R = 0x55 # R[rA] = pow(R[rB], R[rC])
118 LOG_R = 0x56
119 EXP_R = 0x57
120 SIN_R = 0x58
121 COS_R = 0x59
122 TAN_R = 0x5A
123
124 IAND_R = 0x5B
125 IOR_R = 0x5C
126 IEQ_R = 0x5D
127 INE_R = 0x5E
128 ILT_R = 0x5F
129 IGT_R = 0x60
130 ILE_R = 0x61
131 IGE_R = 0x62
132 FLAND_R = 0x63
133 FLOR_R = 0x64
134 FLEQ_R = 0x65
135 FLNE_R = 0x66
136 FLLT_R = 0x67
137 FLGT_R = 0x68
138 FLLE_R = 0x69
139 FLGE_R = 0x6A
140
141 NEG_R = 0x6B # R[rA] = -R[rB]
142 NOT_R = 0x6C # R[rA] = !R[rB]
143
144 PRINT_R = 0x6D
145 PRINTERROR_R = 0x6E
146 READLINE_R = 0x6F
147 SYSTEM_R = 0x70
148 SYSTEM_OUT_R = 0x71
149 SYSTEM_ERR_R = 0x72