xref: /aosp_15_r20/external/mesa3d/src/freedreno/afuc/parser.y (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright (c) 2013 Rob Clark <[email protected]>
3*61046927SAndroid Build Coastguard Worker  *
4*61046927SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
5*61046927SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
6*61046927SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
7*61046927SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*61046927SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
9*61046927SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
10*61046927SAndroid Build Coastguard Worker  *
11*61046927SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice (including the next
12*61046927SAndroid Build Coastguard Worker  * paragraph) shall be included in all copies or substantial portions of the
13*61046927SAndroid Build Coastguard Worker  * Software.
14*61046927SAndroid Build Coastguard Worker  *
15*61046927SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*61046927SAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*61046927SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18*61046927SAndroid Build Coastguard Worker  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*61046927SAndroid Build Coastguard Worker  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20*61046927SAndroid Build Coastguard Worker  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21*61046927SAndroid Build Coastguard Worker  * SOFTWARE.
22*61046927SAndroid Build Coastguard Worker  */
23*61046927SAndroid Build Coastguard Worker 
24*61046927SAndroid Build Coastguard Worker %{
25*61046927SAndroid Build Coastguard Worker #define YYDEBUG 0
26*61046927SAndroid Build Coastguard Worker 
27*61046927SAndroid Build Coastguard Worker #include <stdlib.h>
28*61046927SAndroid Build Coastguard Worker #include <stdio.h>
29*61046927SAndroid Build Coastguard Worker #include <string.h>
30*61046927SAndroid Build Coastguard Worker #include <math.h>
31*61046927SAndroid Build Coastguard Worker #include "asm.h"
32*61046927SAndroid Build Coastguard Worker 
33*61046927SAndroid Build Coastguard Worker 
34*61046927SAndroid Build Coastguard Worker int yyget_lineno(void);
35*61046927SAndroid Build Coastguard Worker 
36*61046927SAndroid Build Coastguard Worker #ifdef YYDEBUG
37*61046927SAndroid Build Coastguard Worker int yydebug;
38*61046927SAndroid Build Coastguard Worker #endif
39*61046927SAndroid Build Coastguard Worker 
40*61046927SAndroid Build Coastguard Worker extern int yylex(void);
41*61046927SAndroid Build Coastguard Worker typedef void *YY_BUFFER_STATE;
42*61046927SAndroid Build Coastguard Worker extern YY_BUFFER_STATE yy_scan_string(const char *);
43*61046927SAndroid Build Coastguard Worker extern void yy_delete_buffer(YY_BUFFER_STATE);
44*61046927SAndroid Build Coastguard Worker 
45*61046927SAndroid Build Coastguard Worker int yyparse(void);
46*61046927SAndroid Build Coastguard Worker 
47*61046927SAndroid Build Coastguard Worker void yyerror(const char *error);
yyerror(const char * error)48*61046927SAndroid Build Coastguard Worker void yyerror(const char *error)
49*61046927SAndroid Build Coastguard Worker {
50*61046927SAndroid Build Coastguard Worker 	fprintf(stderr, "error at line %d: %s\n", yyget_lineno(), error);
51*61046927SAndroid Build Coastguard Worker }
52*61046927SAndroid Build Coastguard Worker 
53*61046927SAndroid Build Coastguard Worker static struct afuc_instr *instr;   /* current instruction */
54*61046927SAndroid Build Coastguard Worker 
55*61046927SAndroid Build Coastguard Worker static void
new_instr(afuc_opc opc)56*61046927SAndroid Build Coastguard Worker new_instr(afuc_opc opc)
57*61046927SAndroid Build Coastguard Worker {
58*61046927SAndroid Build Coastguard Worker 	instr = next_instr(opc);
59*61046927SAndroid Build Coastguard Worker }
60*61046927SAndroid Build Coastguard Worker 
61*61046927SAndroid Build Coastguard Worker static void
dst(int num)62*61046927SAndroid Build Coastguard Worker dst(int num)
63*61046927SAndroid Build Coastguard Worker {
64*61046927SAndroid Build Coastguard Worker 	instr->dst = num;
65*61046927SAndroid Build Coastguard Worker }
66*61046927SAndroid Build Coastguard Worker 
67*61046927SAndroid Build Coastguard Worker static void
src1(int num)68*61046927SAndroid Build Coastguard Worker src1(int num)
69*61046927SAndroid Build Coastguard Worker {
70*61046927SAndroid Build Coastguard Worker 	instr->src1 = num;
71*61046927SAndroid Build Coastguard Worker }
72*61046927SAndroid Build Coastguard Worker 
73*61046927SAndroid Build Coastguard Worker static void
src2(int num)74*61046927SAndroid Build Coastguard Worker src2(int num)
75*61046927SAndroid Build Coastguard Worker {
76*61046927SAndroid Build Coastguard Worker 	instr->src2 = num;
77*61046927SAndroid Build Coastguard Worker }
78*61046927SAndroid Build Coastguard Worker 
79*61046927SAndroid Build Coastguard Worker static void
immed(int num)80*61046927SAndroid Build Coastguard Worker immed(int num)
81*61046927SAndroid Build Coastguard Worker {
82*61046927SAndroid Build Coastguard Worker 	instr->immed = num;
83*61046927SAndroid Build Coastguard Worker 	instr->has_immed = true;
84*61046927SAndroid Build Coastguard Worker }
85*61046927SAndroid Build Coastguard Worker 
86*61046927SAndroid Build Coastguard Worker static void
shift(int num)87*61046927SAndroid Build Coastguard Worker shift(int num)
88*61046927SAndroid Build Coastguard Worker {
89*61046927SAndroid Build Coastguard Worker 	instr->shift = num;
90*61046927SAndroid Build Coastguard Worker 	instr->has_shift = true;
91*61046927SAndroid Build Coastguard Worker }
92*61046927SAndroid Build Coastguard Worker 
93*61046927SAndroid Build Coastguard Worker static void
bit(int num)94*61046927SAndroid Build Coastguard Worker bit(int num)
95*61046927SAndroid Build Coastguard Worker {
96*61046927SAndroid Build Coastguard Worker 	instr->bit = num;
97*61046927SAndroid Build Coastguard Worker 	instr->has_bit = true;
98*61046927SAndroid Build Coastguard Worker }
99*61046927SAndroid Build Coastguard Worker 
100*61046927SAndroid Build Coastguard Worker static void
literal(uint32_t num)101*61046927SAndroid Build Coastguard Worker literal(uint32_t num)
102*61046927SAndroid Build Coastguard Worker {
103*61046927SAndroid Build Coastguard Worker 	instr->literal = num;
104*61046927SAndroid Build Coastguard Worker 	instr->is_literal = true;
105*61046927SAndroid Build Coastguard Worker         parse_version(instr);
106*61046927SAndroid Build Coastguard Worker }
107*61046927SAndroid Build Coastguard Worker 
108*61046927SAndroid Build Coastguard Worker static void
label(const char * str)109*61046927SAndroid Build Coastguard Worker label(const char *str)
110*61046927SAndroid Build Coastguard Worker {
111*61046927SAndroid Build Coastguard Worker 	instr->label = str;
112*61046927SAndroid Build Coastguard Worker }
113*61046927SAndroid Build Coastguard Worker 
114*61046927SAndroid Build Coastguard Worker %}
115*61046927SAndroid Build Coastguard Worker 
116*61046927SAndroid Build Coastguard Worker %union {
117*61046927SAndroid Build Coastguard Worker 	int tok;
118*61046927SAndroid Build Coastguard Worker 	uint32_t num;
119*61046927SAndroid Build Coastguard Worker 	const char *str;
120*61046927SAndroid Build Coastguard Worker }
121*61046927SAndroid Build Coastguard Worker 
122*61046927SAndroid Build Coastguard Worker %token <num> T_INT
123*61046927SAndroid Build Coastguard Worker %token <num> T_HEX
124*61046927SAndroid Build Coastguard Worker %token <num> T_CONTROL_REG
125*61046927SAndroid Build Coastguard Worker %token <num> T_SQE_REG
126*61046927SAndroid Build Coastguard Worker %token <str> T_LABEL_REF
127*61046927SAndroid Build Coastguard Worker %token <num> T_LITERAL
128*61046927SAndroid Build Coastguard Worker %token <num> T_BIT
129*61046927SAndroid Build Coastguard Worker %token <num> T_REGISTER
130*61046927SAndroid Build Coastguard Worker %token <str> T_IDENTIFIER
131*61046927SAndroid Build Coastguard Worker 
132*61046927SAndroid Build Coastguard Worker %token <tok> T_OP_NOP
133*61046927SAndroid Build Coastguard Worker %token <tok> T_OP_ADD
134*61046927SAndroid Build Coastguard Worker %token <tok> T_OP_ADDHI
135*61046927SAndroid Build Coastguard Worker %token <tok> T_OP_SUB
136*61046927SAndroid Build Coastguard Worker %token <tok> T_OP_SUBHI
137*61046927SAndroid Build Coastguard Worker %token <tok> T_OP_AND
138*61046927SAndroid Build Coastguard Worker %token <tok> T_OP_OR
139*61046927SAndroid Build Coastguard Worker %token <tok> T_OP_XOR
140*61046927SAndroid Build Coastguard Worker %token <tok> T_OP_NOT
141*61046927SAndroid Build Coastguard Worker %token <tok> T_OP_SHL
142*61046927SAndroid Build Coastguard Worker %token <tok> T_OP_USHR
143*61046927SAndroid Build Coastguard Worker %token <tok> T_OP_ISHR
144*61046927SAndroid Build Coastguard Worker %token <tok> T_OP_ROT
145*61046927SAndroid Build Coastguard Worker %token <tok> T_OP_MUL8
146*61046927SAndroid Build Coastguard Worker %token <tok> T_OP_MIN
147*61046927SAndroid Build Coastguard Worker %token <tok> T_OP_MAX
148*61046927SAndroid Build Coastguard Worker %token <tok> T_OP_CMP
149*61046927SAndroid Build Coastguard Worker %token <tok> T_OP_BIC
150*61046927SAndroid Build Coastguard Worker %token <tok> T_OP_MSB
151*61046927SAndroid Build Coastguard Worker %token <tok> T_OP_SETBIT
152*61046927SAndroid Build Coastguard Worker %token <tok> T_OP_CLRBIT
153*61046927SAndroid Build Coastguard Worker %token <tok> T_OP_BFI
154*61046927SAndroid Build Coastguard Worker %token <tok> T_OP_UBFX
155*61046927SAndroid Build Coastguard Worker %token <tok> T_OP_MOV
156*61046927SAndroid Build Coastguard Worker %token <tok> T_OP_CWRITE
157*61046927SAndroid Build Coastguard Worker %token <tok> T_OP_CREAD
158*61046927SAndroid Build Coastguard Worker %token <tok> T_OP_SWRITE
159*61046927SAndroid Build Coastguard Worker %token <tok> T_OP_SREAD
160*61046927SAndroid Build Coastguard Worker %token <tok> T_OP_STORE
161*61046927SAndroid Build Coastguard Worker %token <tok> T_OP_LOAD
162*61046927SAndroid Build Coastguard Worker %token <tok> T_OP_BRNE
163*61046927SAndroid Build Coastguard Worker %token <tok> T_OP_BREQ
164*61046927SAndroid Build Coastguard Worker %token <tok> T_OP_RET
165*61046927SAndroid Build Coastguard Worker %token <tok> T_OP_IRET
166*61046927SAndroid Build Coastguard Worker %token <tok> T_OP_CALL
167*61046927SAndroid Build Coastguard Worker %token <tok> T_OP_JUMP
168*61046927SAndroid Build Coastguard Worker %token <tok> T_OP_JUMPA
169*61046927SAndroid Build Coastguard Worker %token <tok> T_OP_SRET
170*61046927SAndroid Build Coastguard Worker %token <tok> T_OP_WAITIN
171*61046927SAndroid Build Coastguard Worker %token <tok> T_OP_BL
172*61046927SAndroid Build Coastguard Worker %token <tok> T_OP_SETSECURE
173*61046927SAndroid Build Coastguard Worker %token <tok> T_LSHIFT
174*61046927SAndroid Build Coastguard Worker %token <tok> T_REP
175*61046927SAndroid Build Coastguard Worker %token <tok> T_PEEK
176*61046927SAndroid Build Coastguard Worker %token <num> T_XMOV
177*61046927SAndroid Build Coastguard Worker %token <num> T_SDS
178*61046927SAndroid Build Coastguard Worker 
179*61046927SAndroid Build Coastguard Worker %token <tok> T_ALIGN
180*61046927SAndroid Build Coastguard Worker %token <tok> T_JUMPTBL
181*61046927SAndroid Build Coastguard Worker %token <tok> T_SECTION
182*61046927SAndroid Build Coastguard Worker 
183*61046927SAndroid Build Coastguard Worker %type <num> reg
184*61046927SAndroid Build Coastguard Worker %type <num> immediate
185*61046927SAndroid Build Coastguard Worker %type <num> xmov
186*61046927SAndroid Build Coastguard Worker %type <num> peek
187*61046927SAndroid Build Coastguard Worker 
188*61046927SAndroid Build Coastguard Worker %error-verbose
189*61046927SAndroid Build Coastguard Worker 
190*61046927SAndroid Build Coastguard Worker %start instrs
191*61046927SAndroid Build Coastguard Worker 
192*61046927SAndroid Build Coastguard Worker %%
193*61046927SAndroid Build Coastguard Worker 
194*61046927SAndroid Build Coastguard Worker instrs:            instrs instr_or_label
195*61046927SAndroid Build Coastguard Worker |                  instr_or_label
196*61046927SAndroid Build Coastguard Worker 
197*61046927SAndroid Build Coastguard Worker instr_or_label:    instr_r
198*61046927SAndroid Build Coastguard Worker |                  T_REP instr_r       { instr->rep = true; }
199*61046927SAndroid Build Coastguard Worker |                  branch_instr
200*61046927SAndroid Build Coastguard Worker |                  other_instr
201*61046927SAndroid Build Coastguard Worker |                  T_IDENTIFIER ':'    { decl_label($1); }
202*61046927SAndroid Build Coastguard Worker |                  T_ALIGN immediate   { align_instr($2); }
203*61046927SAndroid Build Coastguard Worker |                  T_JUMPTBL           { decl_jumptbl(); }
204*61046927SAndroid Build Coastguard Worker |                  T_SECTION T_IDENTIFIER { next_section(); }
205*61046927SAndroid Build Coastguard Worker 
206*61046927SAndroid Build Coastguard Worker xmov:              T_XMOV { $$ = $1; }
207*61046927SAndroid Build Coastguard Worker |                  { $$ = 0; }
208*61046927SAndroid Build Coastguard Worker 
209*61046927SAndroid Build Coastguard Worker peek:              T_PEEK { $$ = 1; }
210*61046927SAndroid Build Coastguard Worker |                  { $$ = 0; }
211*61046927SAndroid Build Coastguard Worker 
212*61046927SAndroid Build Coastguard Worker /* instructions that can optionally have (rep) flag: */
213*61046927SAndroid Build Coastguard Worker instr_r:           xmov peek alu_instr    { instr->xmov = $1; instr->peek = $2; }
214*61046927SAndroid Build Coastguard Worker |                  load_instr
215*61046927SAndroid Build Coastguard Worker |                  store_instr
216*61046927SAndroid Build Coastguard Worker 
217*61046927SAndroid Build Coastguard Worker /* need to special case:
218*61046927SAndroid Build Coastguard Worker  * - not (single src, possibly an immediate)
219*61046927SAndroid Build Coastguard Worker  * - msb (single src, must be reg)
220*61046927SAndroid Build Coastguard Worker  * - mov (single src, plus possibly a shift)
221*61046927SAndroid Build Coastguard Worker  * from the other ALU instructions:
222*61046927SAndroid Build Coastguard Worker  */
223*61046927SAndroid Build Coastguard Worker 
224*61046927SAndroid Build Coastguard Worker alu_msb_instr:     T_OP_MSB reg ',' reg        { new_instr(OPC_MSB); dst($2); src1($4); }
225*61046927SAndroid Build Coastguard Worker 
226*61046927SAndroid Build Coastguard Worker alu_not_instr:     T_OP_NOT reg ',' reg        { new_instr(OPC_NOT); dst($2); src1($4); }
227*61046927SAndroid Build Coastguard Worker |                  T_OP_NOT reg ',' immediate  { new_instr(OPC_NOT); dst($2); immed($4); }
228*61046927SAndroid Build Coastguard Worker 
229*61046927SAndroid Build Coastguard Worker alu_mov_instr:     T_OP_MOV reg ',' reg        { new_instr(OPC_OR); dst($2); src1(0); src2($4); }
230*61046927SAndroid Build Coastguard Worker |                  T_OP_MOV reg ',' immediate T_LSHIFT immediate {
231*61046927SAndroid Build Coastguard Worker                        new_instr(OPC_MOVI); dst($2); immed($4); shift($6);
232*61046927SAndroid Build Coastguard Worker }
233*61046927SAndroid Build Coastguard Worker |                  T_OP_MOV reg ',' immediate  { new_instr(OPC_MOVI); dst($2); immed($4); shift(0); }
234*61046927SAndroid Build Coastguard Worker |                  T_OP_MOV reg ',' T_LABEL_REF T_LSHIFT immediate {
235*61046927SAndroid Build Coastguard Worker                        new_instr(OPC_MOVI); dst($2); label($4); shift($6);
236*61046927SAndroid Build Coastguard Worker }
237*61046927SAndroid Build Coastguard Worker |                  T_OP_MOV reg ',' T_LABEL_REF { new_instr(OPC_MOVI); dst($2); label($4); shift(0); }
238*61046927SAndroid Build Coastguard Worker 
239*61046927SAndroid Build Coastguard Worker alu_2src_op:       T_OP_ADD       { new_instr(OPC_ADD); }
240*61046927SAndroid Build Coastguard Worker |                  T_OP_ADDHI     { new_instr(OPC_ADDHI); }
241*61046927SAndroid Build Coastguard Worker |                  T_OP_SUB       { new_instr(OPC_SUB); }
242*61046927SAndroid Build Coastguard Worker |                  T_OP_SUBHI     { new_instr(OPC_SUBHI); }
243*61046927SAndroid Build Coastguard Worker |                  T_OP_AND       { new_instr(OPC_AND); }
244*61046927SAndroid Build Coastguard Worker |                  T_OP_OR        { new_instr(OPC_OR); }
245*61046927SAndroid Build Coastguard Worker |                  T_OP_XOR       { new_instr(OPC_XOR); }
246*61046927SAndroid Build Coastguard Worker |                  T_OP_SHL       { new_instr(OPC_SHL); }
247*61046927SAndroid Build Coastguard Worker |                  T_OP_USHR      { new_instr(OPC_USHR); }
248*61046927SAndroid Build Coastguard Worker |                  T_OP_ISHR      { new_instr(OPC_ISHR); }
249*61046927SAndroid Build Coastguard Worker |                  T_OP_ROT       { new_instr(OPC_ROT); }
250*61046927SAndroid Build Coastguard Worker |                  T_OP_MUL8      { new_instr(OPC_MUL8); }
251*61046927SAndroid Build Coastguard Worker |                  T_OP_MIN       { new_instr(OPC_MIN); }
252*61046927SAndroid Build Coastguard Worker |                  T_OP_MAX       { new_instr(OPC_MAX); }
253*61046927SAndroid Build Coastguard Worker |                  T_OP_CMP       { new_instr(OPC_CMP); }
254*61046927SAndroid Build Coastguard Worker |                  T_OP_BIC       { new_instr(OPC_BIC); }
255*61046927SAndroid Build Coastguard Worker 
256*61046927SAndroid Build Coastguard Worker alu_2src_instr:    alu_2src_op reg ',' reg ',' reg { dst($2); src1($4); src2($6); }
257*61046927SAndroid Build Coastguard Worker |                  alu_2src_op reg ',' reg ',' immediate { dst($2); src1($4); immed($6); }
258*61046927SAndroid Build Coastguard Worker 
259*61046927SAndroid Build Coastguard Worker alu_clrsetbit_instr: T_OP_SETBIT reg ',' reg ',' T_BIT { new_instr(OPC_SETBITI); dst($2); src1($4); bit($6); }
260*61046927SAndroid Build Coastguard Worker |                    T_OP_SETBIT reg ',' reg ',' reg { new_instr(OPC_SETBIT); dst($2); src1($4); src2($6); }
261*61046927SAndroid Build Coastguard Worker |                    T_OP_CLRBIT reg ',' reg ',' T_BIT { new_instr(OPC_CLRBIT); dst($2); src1($4); bit($6); }
262*61046927SAndroid Build Coastguard Worker 
263*61046927SAndroid Build Coastguard Worker alu_bitfield_op:  T_OP_UBFX { new_instr(OPC_UBFX); }
264*61046927SAndroid Build Coastguard Worker |                 T_OP_BFI  { new_instr(OPC_BFI); }
265*61046927SAndroid Build Coastguard Worker 
266*61046927SAndroid Build Coastguard Worker alu_bitfield_instr: alu_bitfield_op reg ',' reg ',' T_BIT ',' T_BIT { dst($2); src1($4); bit($6); immed($8); }
267*61046927SAndroid Build Coastguard Worker 
268*61046927SAndroid Build Coastguard Worker alu_instr:         alu_2src_instr
269*61046927SAndroid Build Coastguard Worker |                  alu_msb_instr
270*61046927SAndroid Build Coastguard Worker |                  alu_not_instr
271*61046927SAndroid Build Coastguard Worker |                  alu_mov_instr
272*61046927SAndroid Build Coastguard Worker |                  alu_clrsetbit_instr
273*61046927SAndroid Build Coastguard Worker |                  alu_bitfield_instr
274*61046927SAndroid Build Coastguard Worker 
275*61046927SAndroid Build Coastguard Worker load_op:           T_OP_LOAD           { new_instr(OPC_LOAD); }
276*61046927SAndroid Build Coastguard Worker |                  T_OP_CREAD          { new_instr(OPC_CREAD); }
277*61046927SAndroid Build Coastguard Worker |                  T_OP_SREAD          { new_instr(OPC_SREAD); }
278*61046927SAndroid Build Coastguard Worker store_op:          T_OP_STORE          { new_instr(OPC_STORE); }
279*61046927SAndroid Build Coastguard Worker |                  T_OP_CWRITE         { new_instr(OPC_CWRITE); instr->sds = 0; }
280*61046927SAndroid Build Coastguard Worker |                  T_SDS T_OP_CWRITE   { new_instr(OPC_CWRITE); instr->sds = $1; }
281*61046927SAndroid Build Coastguard Worker |                  T_OP_SWRITE         { new_instr(OPC_SWRITE); }
282*61046927SAndroid Build Coastguard Worker 
283*61046927SAndroid Build Coastguard Worker preincrement:
284*61046927SAndroid Build Coastguard Worker |              '!'   { instr->preincrement = true; }
285*61046927SAndroid Build Coastguard Worker 
286*61046927SAndroid Build Coastguard Worker load_instr:        load_op reg ',' '[' reg '+' immediate ']' preincrement {
287*61046927SAndroid Build Coastguard Worker                        dst($2); src1($5); immed($7);
288*61046927SAndroid Build Coastguard Worker }
289*61046927SAndroid Build Coastguard Worker store_instr:       store_op reg ',' '[' reg '+' immediate ']' preincrement {
290*61046927SAndroid Build Coastguard Worker                        src1($2); src2($5); immed($7);
291*61046927SAndroid Build Coastguard Worker }
292*61046927SAndroid Build Coastguard Worker 
293*61046927SAndroid Build Coastguard Worker branch_op:         T_OP_BRNE      { new_instr(OPC_BRNE); }
294*61046927SAndroid Build Coastguard Worker |                  T_OP_BREQ      { new_instr(OPC_BREQ); }
295*61046927SAndroid Build Coastguard Worker 
296*61046927SAndroid Build Coastguard Worker branch_instr:      branch_op reg ',' T_BIT ',' T_LABEL_REF     { src1($2); bit($4); label($6); }
297*61046927SAndroid Build Coastguard Worker |                  branch_op reg ',' immediate ',' T_LABEL_REF { src1($2); immed($4); label($6); }
298*61046927SAndroid Build Coastguard Worker 
299*61046927SAndroid Build Coastguard Worker other_instr:       T_OP_CALL T_LABEL_REF { new_instr(OPC_CALL); label($2); }
300*61046927SAndroid Build Coastguard Worker |                  T_OP_BL T_LABEL_REF   { new_instr(OPC_BL); label($2); }
301*61046927SAndroid Build Coastguard Worker |                  T_OP_SETSECURE reg ',' T_LABEL_REF { new_instr(OPC_SETSECURE); src1($2); label($4); }
302*61046927SAndroid Build Coastguard Worker |                  T_OP_RET              { new_instr(OPC_RET); }
303*61046927SAndroid Build Coastguard Worker |                  T_OP_IRET             { new_instr(OPC_IRET); }
304*61046927SAndroid Build Coastguard Worker |                  T_OP_JUMP T_LABEL_REF { new_instr(OPC_JUMP); label($2); }
305*61046927SAndroid Build Coastguard Worker |                  T_OP_JUMPA T_LABEL_REF { new_instr(OPC_JUMPA); label($2); }
306*61046927SAndroid Build Coastguard Worker |                  T_OP_JUMP reg         { new_instr(OPC_JUMPR); src1($2); }
307*61046927SAndroid Build Coastguard Worker |                  T_OP_SRET             { new_instr(OPC_SRET); }
308*61046927SAndroid Build Coastguard Worker |                  T_OP_WAITIN           { new_instr(OPC_WAITIN); }
309*61046927SAndroid Build Coastguard Worker |                  T_OP_NOP              { new_instr(OPC_NOP); }
310*61046927SAndroid Build Coastguard Worker |                  T_LITERAL             { new_instr(OPC_RAW_LITERAL); literal($1); }
311*61046927SAndroid Build Coastguard Worker |                  '[' T_LABEL_REF ']'   { new_instr(OPC_RAW_LITERAL); label($2); }
312*61046927SAndroid Build Coastguard Worker 
313*61046927SAndroid Build Coastguard Worker reg:               T_REGISTER
314*61046927SAndroid Build Coastguard Worker 
315*61046927SAndroid Build Coastguard Worker immediate:         T_HEX
316*61046927SAndroid Build Coastguard Worker |                  T_INT
317*61046927SAndroid Build Coastguard Worker |                  T_CONTROL_REG
318*61046927SAndroid Build Coastguard Worker |                  T_CONTROL_REG '+' immediate { $$ = $1 + $3; }
319*61046927SAndroid Build Coastguard Worker |                  T_SQE_REG
320*61046927SAndroid Build Coastguard Worker |                  T_SQE_REG '+' immediate { $$ = $1 + $3; }
321*61046927SAndroid Build Coastguard Worker 
322