@@ -30,24 +30,65 @@ pub fn brillig_to_avm(
30
30
for brillig_instr in brillig_bytecode {
31
31
match brillig_instr {
32
32
BrilligOpcode :: BinaryFieldOp { destination, op, lhs, rhs } => {
33
+ let bits_needed =
34
+ [ lhs. 0 , rhs. 0 , destination. 0 ] . iter ( ) . map ( bits_needed_for) . max ( ) . unwrap ( ) ;
35
+
36
+ assert ! (
37
+ bits_needed == 8 || bits_needed == 16 ,
38
+ "BinaryFieldOp only support 8 or 16 bit encodings, got: {}" ,
39
+ bits_needed
40
+ ) ;
41
+
33
42
let avm_opcode = match op {
34
- BinaryFieldOp :: Add => AvmOpcode :: ADD ,
35
- BinaryFieldOp :: Sub => AvmOpcode :: SUB ,
36
- BinaryFieldOp :: Mul => AvmOpcode :: MUL ,
37
- BinaryFieldOp :: Div => AvmOpcode :: FDIV ,
38
- BinaryFieldOp :: IntegerDiv => AvmOpcode :: DIV ,
39
- BinaryFieldOp :: Equals => AvmOpcode :: EQ ,
40
- BinaryFieldOp :: LessThan => AvmOpcode :: LT ,
41
- BinaryFieldOp :: LessThanEquals => AvmOpcode :: LTE ,
43
+ BinaryFieldOp :: Add => match bits_needed {
44
+ 8 => AvmOpcode :: ADD_8 ,
45
+ 16 => AvmOpcode :: ADD_16 ,
46
+ _ => unreachable ! ( ) ,
47
+ } ,
48
+ BinaryFieldOp :: Sub => match bits_needed {
49
+ 8 => AvmOpcode :: SUB_8 ,
50
+ 16 => AvmOpcode :: SUB_16 ,
51
+ _ => unreachable ! ( ) ,
52
+ } ,
53
+ BinaryFieldOp :: Mul => match bits_needed {
54
+ 8 => AvmOpcode :: MUL_8 ,
55
+ 16 => AvmOpcode :: MUL_16 ,
56
+ _ => unreachable ! ( ) ,
57
+ } ,
58
+ BinaryFieldOp :: Div => match bits_needed {
59
+ 8 => AvmOpcode :: FDIV_8 ,
60
+ 16 => AvmOpcode :: FDIV_16 ,
61
+ _ => unreachable ! ( ) ,
62
+ } ,
63
+ BinaryFieldOp :: IntegerDiv => match bits_needed {
64
+ 8 => AvmOpcode :: DIV_8 ,
65
+ 16 => AvmOpcode :: DIV_16 ,
66
+ _ => unreachable ! ( ) ,
67
+ } ,
68
+ BinaryFieldOp :: Equals => match bits_needed {
69
+ 8 => AvmOpcode :: EQ_8 ,
70
+ 16 => AvmOpcode :: EQ_16 ,
71
+ _ => unreachable ! ( ) ,
72
+ } ,
73
+ BinaryFieldOp :: LessThan => match bits_needed {
74
+ 8 => AvmOpcode :: LT_8 ,
75
+ 16 => AvmOpcode :: LT_16 ,
76
+ _ => unreachable ! ( ) ,
77
+ } ,
78
+ BinaryFieldOp :: LessThanEquals => match bits_needed {
79
+ 8 => AvmOpcode :: LTE_8 ,
80
+ 16 => AvmOpcode :: LTE_16 ,
81
+ _ => unreachable ! ( ) ,
82
+ } ,
42
83
} ;
43
84
avm_instrs. push ( AvmInstruction {
44
85
opcode : avm_opcode,
45
86
indirect : Some ( ALL_DIRECT ) ,
46
- tag : if avm_opcode == AvmOpcode :: FDIV { None } else { Some ( AvmTypeTag :: FIELD ) } ,
87
+ tag : Some ( AvmTypeTag :: FIELD ) ,
47
88
operands : vec ! [
48
- AvmOperand :: U32 { value : lhs. to_usize ( ) as u32 } ,
49
- AvmOperand :: U32 { value : rhs. to_usize ( ) as u32 } ,
50
- AvmOperand :: U32 { value : destination. to_usize ( ) as u32 } ,
89
+ make_operand ( bits_needed , & lhs. 0 ) ,
90
+ make_operand ( bits_needed , & rhs. 0 ) ,
91
+ make_operand ( bits_needed , & destination. 0 ) ,
51
92
] ,
52
93
} ) ;
53
94
}
@@ -57,28 +98,84 @@ pub fn brillig_to_avm(
57
98
"BinaryIntOp bit size should be integral: {:?}" ,
58
99
brillig_instr
59
100
) ;
101
+ let bits_needed =
102
+ [ lhs. 0 , rhs. 0 , destination. 0 ] . iter ( ) . map ( bits_needed_for) . max ( ) . unwrap ( ) ;
103
+ assert ! (
104
+ bits_needed == 8 || bits_needed == 16 ,
105
+ "BinaryIntOp only support 8 or 16 bit encodings, got: {}" ,
106
+ bits_needed
107
+ ) ;
108
+
60
109
let avm_opcode = match op {
61
- BinaryIntOp :: Add => AvmOpcode :: ADD ,
62
- BinaryIntOp :: Sub => AvmOpcode :: SUB ,
63
- BinaryIntOp :: Mul => AvmOpcode :: MUL ,
64
- BinaryIntOp :: Div => AvmOpcode :: DIV ,
65
- BinaryIntOp :: Equals => AvmOpcode :: EQ ,
66
- BinaryIntOp :: LessThan => AvmOpcode :: LT ,
67
- BinaryIntOp :: LessThanEquals => AvmOpcode :: LTE ,
68
- BinaryIntOp :: And => AvmOpcode :: AND ,
69
- BinaryIntOp :: Or => AvmOpcode :: OR ,
70
- BinaryIntOp :: Xor => AvmOpcode :: XOR ,
71
- BinaryIntOp :: Shl => AvmOpcode :: SHL ,
72
- BinaryIntOp :: Shr => AvmOpcode :: SHR ,
110
+ BinaryIntOp :: Add => match bits_needed {
111
+ 8 => AvmOpcode :: ADD_8 ,
112
+ 16 => AvmOpcode :: ADD_16 ,
113
+ _ => unreachable ! ( ) ,
114
+ } ,
115
+ BinaryIntOp :: Sub => match bits_needed {
116
+ 8 => AvmOpcode :: SUB_8 ,
117
+ 16 => AvmOpcode :: SUB_16 ,
118
+ _ => unreachable ! ( ) ,
119
+ } ,
120
+ BinaryIntOp :: Mul => match bits_needed {
121
+ 8 => AvmOpcode :: MUL_8 ,
122
+ 16 => AvmOpcode :: MUL_16 ,
123
+ _ => unreachable ! ( ) ,
124
+ } ,
125
+ BinaryIntOp :: Div => match bits_needed {
126
+ 8 => AvmOpcode :: DIV_8 ,
127
+ 16 => AvmOpcode :: DIV_16 ,
128
+ _ => unreachable ! ( ) ,
129
+ } ,
130
+ BinaryIntOp :: And => match bits_needed {
131
+ 8 => AvmOpcode :: AND_8 ,
132
+ 16 => AvmOpcode :: AND_16 ,
133
+ _ => unreachable ! ( ) ,
134
+ } ,
135
+ BinaryIntOp :: Or => match bits_needed {
136
+ 8 => AvmOpcode :: OR_8 ,
137
+ 16 => AvmOpcode :: OR_16 ,
138
+ _ => unreachable ! ( ) ,
139
+ } ,
140
+ BinaryIntOp :: Xor => match bits_needed {
141
+ 8 => AvmOpcode :: XOR_8 ,
142
+ 16 => AvmOpcode :: XOR_16 ,
143
+ _ => unreachable ! ( ) ,
144
+ } ,
145
+ BinaryIntOp :: Shl => match bits_needed {
146
+ 8 => AvmOpcode :: SHL_8 ,
147
+ 16 => AvmOpcode :: SHL_16 ,
148
+ _ => unreachable ! ( ) ,
149
+ } ,
150
+ BinaryIntOp :: Shr => match bits_needed {
151
+ 8 => AvmOpcode :: SHR_8 ,
152
+ 16 => AvmOpcode :: SHR_16 ,
153
+ _ => unreachable ! ( ) ,
154
+ } ,
155
+ BinaryIntOp :: Equals => match bits_needed {
156
+ 8 => AvmOpcode :: EQ_8 ,
157
+ 16 => AvmOpcode :: EQ_16 ,
158
+ _ => unreachable ! ( ) ,
159
+ } ,
160
+ BinaryIntOp :: LessThan => match bits_needed {
161
+ 8 => AvmOpcode :: LT_8 ,
162
+ 16 => AvmOpcode :: LT_16 ,
163
+ _ => unreachable ! ( ) ,
164
+ } ,
165
+ BinaryIntOp :: LessThanEquals => match bits_needed {
166
+ 8 => AvmOpcode :: LTE_8 ,
167
+ 16 => AvmOpcode :: LTE_16 ,
168
+ _ => unreachable ! ( ) ,
169
+ } ,
73
170
} ;
74
171
avm_instrs. push ( AvmInstruction {
75
172
opcode : avm_opcode,
76
173
indirect : Some ( ALL_DIRECT ) ,
77
174
tag : Some ( tag_from_bit_size ( BitSize :: Integer ( * bit_size) ) ) ,
78
175
operands : vec ! [
79
- AvmOperand :: U32 { value : lhs. to_usize ( ) as u32 } ,
80
- AvmOperand :: U32 { value : rhs. to_usize ( ) as u32 } ,
81
- AvmOperand :: U32 { value : destination. to_usize ( ) as u32 } ,
176
+ make_operand ( bits_needed , & lhs. 0 ) ,
177
+ make_operand ( bits_needed , & rhs. 0 ) ,
178
+ make_operand ( bits_needed , & destination. 0 ) ,
82
179
] ,
83
180
} ) ;
84
181
}
@@ -214,9 +311,9 @@ pub fn brillig_to_avm(
214
311
// We are adding a MOV instruction that moves a value to itself.
215
312
// This should therefore not affect the program's execution.
216
313
avm_instrs. push ( AvmInstruction {
217
- opcode : AvmOpcode :: MOV_8 ,
314
+ opcode : AvmOpcode :: MOV_16 ,
218
315
indirect : Some ( ALL_DIRECT ) ,
219
- operands : vec ! [ AvmOperand :: U32 { value: 0x18ca } , AvmOperand :: U32 { value: 0x18ca } ] ,
316
+ operands : vec ! [ AvmOperand :: U16 { value: 0x18ca } , AvmOperand :: U16 { value: 0x18ca } ] ,
220
317
..Default :: default ( )
221
318
} ) ;
222
319
0 commit comments