1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker * Copyright © 2020 Google, Inc.
3*61046927SAndroid Build Coastguard Worker * SPDX-License-Identifier: MIT
4*61046927SAndroid Build Coastguard Worker */
5*61046927SAndroid Build Coastguard Worker
6*61046927SAndroid Build Coastguard Worker #include "util/log.h"
7*61046927SAndroid Build Coastguard Worker #include "util/u_math.h"
8*61046927SAndroid Build Coastguard Worker
9*61046927SAndroid Build Coastguard Worker #include "ir3/ir3.h"
10*61046927SAndroid Build Coastguard Worker #include "ir3/ir3_shader.h"
11*61046927SAndroid Build Coastguard Worker #include "ir3/instr-a3xx.h" // TODO move opc's and other useful things to ir3-instr.h or so
12*61046927SAndroid Build Coastguard Worker
13*61046927SAndroid Build Coastguard Worker #include "isa.h"
14*61046927SAndroid Build Coastguard Worker
15*61046927SAndroid Build Coastguard Worker struct bitset_params;
16*61046927SAndroid Build Coastguard Worker
17*61046927SAndroid Build Coastguard Worker struct encode_state {
18*61046927SAndroid Build Coastguard Worker unsigned gen;
19*61046927SAndroid Build Coastguard Worker
20*61046927SAndroid Build Coastguard Worker struct ir3_compiler *compiler;
21*61046927SAndroid Build Coastguard Worker
22*61046927SAndroid Build Coastguard Worker /**
23*61046927SAndroid Build Coastguard Worker * The instruction which is currently being encoded
24*61046927SAndroid Build Coastguard Worker */
25*61046927SAndroid Build Coastguard Worker struct ir3_instruction *instr;
26*61046927SAndroid Build Coastguard Worker };
27*61046927SAndroid Build Coastguard Worker
28*61046927SAndroid Build Coastguard Worker /*
29*61046927SAndroid Build Coastguard Worker * Helpers defining how to map from ir3_instruction/ir3_register/etc to fields
30*61046927SAndroid Build Coastguard Worker * to be encoded:
31*61046927SAndroid Build Coastguard Worker */
32*61046927SAndroid Build Coastguard Worker
33*61046927SAndroid Build Coastguard Worker static inline bool
extract_SRC1_R(const struct ir3_instruction * instr)34*61046927SAndroid Build Coastguard Worker extract_SRC1_R(const struct ir3_instruction *instr)
35*61046927SAndroid Build Coastguard Worker {
36*61046927SAndroid Build Coastguard Worker if (instr->nop) {
37*61046927SAndroid Build Coastguard Worker assert(!instr->repeat);
38*61046927SAndroid Build Coastguard Worker return instr->nop & 0x1;
39*61046927SAndroid Build Coastguard Worker }
40*61046927SAndroid Build Coastguard Worker return !!(instr->srcs[0]->flags & IR3_REG_R);
41*61046927SAndroid Build Coastguard Worker }
42*61046927SAndroid Build Coastguard Worker
43*61046927SAndroid Build Coastguard Worker static inline bool
extract_SRC2_R(const struct ir3_instruction * instr)44*61046927SAndroid Build Coastguard Worker extract_SRC2_R(const struct ir3_instruction *instr)
45*61046927SAndroid Build Coastguard Worker {
46*61046927SAndroid Build Coastguard Worker if (instr->nop) {
47*61046927SAndroid Build Coastguard Worker assert(!instr->repeat);
48*61046927SAndroid Build Coastguard Worker return (instr->nop >> 1) & 0x1;
49*61046927SAndroid Build Coastguard Worker }
50*61046927SAndroid Build Coastguard Worker /* src2 does not appear in all cat2, but SRC2_R does (for nop encoding) */
51*61046927SAndroid Build Coastguard Worker if (instr->srcs_count > 1)
52*61046927SAndroid Build Coastguard Worker return !!(instr->srcs[1]->flags & IR3_REG_R);
53*61046927SAndroid Build Coastguard Worker return 0;
54*61046927SAndroid Build Coastguard Worker }
55*61046927SAndroid Build Coastguard Worker
56*61046927SAndroid Build Coastguard Worker static inline opc_t
__instruction_case(struct encode_state * s,const struct ir3_instruction * instr)57*61046927SAndroid Build Coastguard Worker __instruction_case(struct encode_state *s, const struct ir3_instruction *instr)
58*61046927SAndroid Build Coastguard Worker {
59*61046927SAndroid Build Coastguard Worker /*
60*61046927SAndroid Build Coastguard Worker * Temporary hack.. the new world doesn't map opcodes directly to hw
61*61046927SAndroid Build Coastguard Worker * encoding, so there are some cases where we need to fixup the opc
62*61046927SAndroid Build Coastguard Worker * to match what the encoder expects. Eventually this will go away
63*61046927SAndroid Build Coastguard Worker * once we completely transition away from the packed-struct encoding/
64*61046927SAndroid Build Coastguard Worker * decoding and split up things which are logically different
65*61046927SAndroid Build Coastguard Worker * instructions
66*61046927SAndroid Build Coastguard Worker */
67*61046927SAndroid Build Coastguard Worker if (instr->opc == OPC_MOV) {
68*61046927SAndroid Build Coastguard Worker struct ir3_register *src = instr->srcs[0];
69*61046927SAndroid Build Coastguard Worker if (src->flags & IR3_REG_IMMED) {
70*61046927SAndroid Build Coastguard Worker return OPC_MOV_IMMED;
71*61046927SAndroid Build Coastguard Worker } if (src->flags & IR3_REG_RELATIV) {
72*61046927SAndroid Build Coastguard Worker if (src->flags & IR3_REG_CONST) {
73*61046927SAndroid Build Coastguard Worker return OPC_MOV_RELCONST;
74*61046927SAndroid Build Coastguard Worker } else {
75*61046927SAndroid Build Coastguard Worker return OPC_MOV_RELGPR;
76*61046927SAndroid Build Coastguard Worker }
77*61046927SAndroid Build Coastguard Worker } else if (src->flags & IR3_REG_CONST) {
78*61046927SAndroid Build Coastguard Worker return OPC_MOV_CONST;
79*61046927SAndroid Build Coastguard Worker } else {
80*61046927SAndroid Build Coastguard Worker return OPC_MOV_GPR;
81*61046927SAndroid Build Coastguard Worker }
82*61046927SAndroid Build Coastguard Worker } else if (instr->opc == OPC_DEMOTE) {
83*61046927SAndroid Build Coastguard Worker return OPC_KILL;
84*61046927SAndroid Build Coastguard Worker } else if (s->compiler->gen >= 6) {
85*61046927SAndroid Build Coastguard Worker if (instr->opc == OPC_RESINFO) {
86*61046927SAndroid Build Coastguard Worker return OPC_RESINFO_B;
87*61046927SAndroid Build Coastguard Worker } else if (instr->opc == OPC_LDIB) {
88*61046927SAndroid Build Coastguard Worker return OPC_LDIB_B;
89*61046927SAndroid Build Coastguard Worker } else if (instr->opc == OPC_STIB) {
90*61046927SAndroid Build Coastguard Worker return OPC_STIB_B;
91*61046927SAndroid Build Coastguard Worker }
92*61046927SAndroid Build Coastguard Worker }
93*61046927SAndroid Build Coastguard Worker return instr->opc;
94*61046927SAndroid Build Coastguard Worker }
95*61046927SAndroid Build Coastguard Worker
96*61046927SAndroid Build Coastguard Worker static inline unsigned
extract_ABSNEG(const struct ir3_register * reg)97*61046927SAndroid Build Coastguard Worker extract_ABSNEG(const struct ir3_register *reg)
98*61046927SAndroid Build Coastguard Worker {
99*61046927SAndroid Build Coastguard Worker // TODO generate enums for this:
100*61046927SAndroid Build Coastguard Worker if (reg->flags & (IR3_REG_FNEG | IR3_REG_SNEG | IR3_REG_BNOT)) {
101*61046927SAndroid Build Coastguard Worker if (reg->flags & (IR3_REG_FABS | IR3_REG_SABS)) {
102*61046927SAndroid Build Coastguard Worker return 3; // ABSNEG
103*61046927SAndroid Build Coastguard Worker } else {
104*61046927SAndroid Build Coastguard Worker return 1; // NEG
105*61046927SAndroid Build Coastguard Worker }
106*61046927SAndroid Build Coastguard Worker } else if (reg->flags & (IR3_REG_FABS | IR3_REG_SABS)) {
107*61046927SAndroid Build Coastguard Worker return 2; // ABS
108*61046927SAndroid Build Coastguard Worker } else {
109*61046927SAndroid Build Coastguard Worker return 0;
110*61046927SAndroid Build Coastguard Worker }
111*61046927SAndroid Build Coastguard Worker }
112*61046927SAndroid Build Coastguard Worker
113*61046927SAndroid Build Coastguard Worker static inline int32_t
extract_reg_iim(const struct ir3_register * reg)114*61046927SAndroid Build Coastguard Worker extract_reg_iim(const struct ir3_register *reg)
115*61046927SAndroid Build Coastguard Worker {
116*61046927SAndroid Build Coastguard Worker assert(reg->flags & IR3_REG_IMMED);
117*61046927SAndroid Build Coastguard Worker return reg->iim_val;
118*61046927SAndroid Build Coastguard Worker }
119*61046927SAndroid Build Coastguard Worker
120*61046927SAndroid Build Coastguard Worker static inline uint32_t
extract_reg_uim(const struct ir3_register * reg)121*61046927SAndroid Build Coastguard Worker extract_reg_uim(const struct ir3_register *reg)
122*61046927SAndroid Build Coastguard Worker {
123*61046927SAndroid Build Coastguard Worker assert(reg->flags & IR3_REG_IMMED);
124*61046927SAndroid Build Coastguard Worker return reg->uim_val;
125*61046927SAndroid Build Coastguard Worker }
126*61046927SAndroid Build Coastguard Worker
127*61046927SAndroid Build Coastguard Worker /**
128*61046927SAndroid Build Coastguard Worker * This is a bit messy, to deal with the fact that the optional "s2en"
129*61046927SAndroid Build Coastguard Worker * src is the first src, shifting everything else up by one.
130*61046927SAndroid Build Coastguard Worker *
131*61046927SAndroid Build Coastguard Worker * TODO revisit this once legacy 'packed struct' encoding is gone
132*61046927SAndroid Build Coastguard Worker */
133*61046927SAndroid Build Coastguard Worker static inline struct ir3_register *
extract_cat5_SRC(const struct ir3_instruction * instr,unsigned n)134*61046927SAndroid Build Coastguard Worker extract_cat5_SRC(const struct ir3_instruction *instr, unsigned n)
135*61046927SAndroid Build Coastguard Worker {
136*61046927SAndroid Build Coastguard Worker if (instr->flags & IR3_INSTR_S2EN) {
137*61046927SAndroid Build Coastguard Worker n++;
138*61046927SAndroid Build Coastguard Worker }
139*61046927SAndroid Build Coastguard Worker if (n < instr->srcs_count)
140*61046927SAndroid Build Coastguard Worker return instr->srcs[n];
141*61046927SAndroid Build Coastguard Worker return NULL;
142*61046927SAndroid Build Coastguard Worker }
143*61046927SAndroid Build Coastguard Worker
144*61046927SAndroid Build Coastguard Worker static inline bool
extract_cat5_FULL(const struct ir3_instruction * instr)145*61046927SAndroid Build Coastguard Worker extract_cat5_FULL(const struct ir3_instruction *instr)
146*61046927SAndroid Build Coastguard Worker {
147*61046927SAndroid Build Coastguard Worker struct ir3_register *reg = extract_cat5_SRC(instr, 0);
148*61046927SAndroid Build Coastguard Worker /* some cat5 have zero src regs, in which case 'FULL' is false */
149*61046927SAndroid Build Coastguard Worker if (!reg)
150*61046927SAndroid Build Coastguard Worker return false;
151*61046927SAndroid Build Coastguard Worker return !(reg->flags & IR3_REG_HALF);
152*61046927SAndroid Build Coastguard Worker }
153*61046927SAndroid Build Coastguard Worker
154*61046927SAndroid Build Coastguard Worker static inline cat5_desc_mode_t
extract_cat5_DESC_MODE(const struct ir3_instruction * instr)155*61046927SAndroid Build Coastguard Worker extract_cat5_DESC_MODE(const struct ir3_instruction *instr)
156*61046927SAndroid Build Coastguard Worker {
157*61046927SAndroid Build Coastguard Worker assert(instr->flags & (IR3_INSTR_S2EN | IR3_INSTR_B));
158*61046927SAndroid Build Coastguard Worker if (instr->flags & IR3_INSTR_S2EN) {
159*61046927SAndroid Build Coastguard Worker if (instr->flags & IR3_INSTR_B) {
160*61046927SAndroid Build Coastguard Worker if (instr->flags & IR3_INSTR_A1EN) {
161*61046927SAndroid Build Coastguard Worker if (instr->flags & IR3_INSTR_NONUNIF) {
162*61046927SAndroid Build Coastguard Worker return CAT5_BINDLESS_A1_NONUNIFORM;
163*61046927SAndroid Build Coastguard Worker } else {
164*61046927SAndroid Build Coastguard Worker return CAT5_BINDLESS_A1_UNIFORM;
165*61046927SAndroid Build Coastguard Worker }
166*61046927SAndroid Build Coastguard Worker } else if (instr->flags & IR3_INSTR_NONUNIF) {
167*61046927SAndroid Build Coastguard Worker return CAT5_BINDLESS_NONUNIFORM;
168*61046927SAndroid Build Coastguard Worker } else {
169*61046927SAndroid Build Coastguard Worker return CAT5_BINDLESS_UNIFORM;
170*61046927SAndroid Build Coastguard Worker }
171*61046927SAndroid Build Coastguard Worker } else {
172*61046927SAndroid Build Coastguard Worker if (instr->flags & IR3_INSTR_NONUNIF)
173*61046927SAndroid Build Coastguard Worker return CAT5_NONUNIFORM;
174*61046927SAndroid Build Coastguard Worker else
175*61046927SAndroid Build Coastguard Worker return CAT5_UNIFORM;
176*61046927SAndroid Build Coastguard Worker }
177*61046927SAndroid Build Coastguard Worker assert(!(instr->cat5.samp | instr->cat5.tex));
178*61046927SAndroid Build Coastguard Worker } else if (instr->flags & IR3_INSTR_B) {
179*61046927SAndroid Build Coastguard Worker if (instr->flags & IR3_INSTR_A1EN) {
180*61046927SAndroid Build Coastguard Worker return CAT5_BINDLESS_A1_IMM;
181*61046927SAndroid Build Coastguard Worker } else {
182*61046927SAndroid Build Coastguard Worker return CAT5_BINDLESS_IMM;
183*61046927SAndroid Build Coastguard Worker }
184*61046927SAndroid Build Coastguard Worker }
185*61046927SAndroid Build Coastguard Worker return 0;
186*61046927SAndroid Build Coastguard Worker }
187*61046927SAndroid Build Coastguard Worker
188*61046927SAndroid Build Coastguard Worker static inline unsigned
extract_cat6_DESC_MODE(const struct ir3_instruction * instr)189*61046927SAndroid Build Coastguard Worker extract_cat6_DESC_MODE(const struct ir3_instruction *instr)
190*61046927SAndroid Build Coastguard Worker {
191*61046927SAndroid Build Coastguard Worker struct ir3_register *ssbo = instr->srcs[0];
192*61046927SAndroid Build Coastguard Worker if (ssbo->flags & IR3_REG_IMMED) {
193*61046927SAndroid Build Coastguard Worker return 0; // todo enum
194*61046927SAndroid Build Coastguard Worker } else if (instr->flags & IR3_INSTR_NONUNIF) {
195*61046927SAndroid Build Coastguard Worker return 2; // todo enum
196*61046927SAndroid Build Coastguard Worker } else {
197*61046927SAndroid Build Coastguard Worker return 1; // todo enum
198*61046927SAndroid Build Coastguard Worker }
199*61046927SAndroid Build Coastguard Worker }
200*61046927SAndroid Build Coastguard Worker
201*61046927SAndroid Build Coastguard Worker /**
202*61046927SAndroid Build Coastguard Worker * This is a bit messy, for legacy (pre-bindless) atomic instructions,
203*61046927SAndroid Build Coastguard Worker * the .g (global) variety have SSBO as first src and everything else
204*61046927SAndroid Build Coastguard Worker * shifted up by one.
205*61046927SAndroid Build Coastguard Worker *
206*61046927SAndroid Build Coastguard Worker * TODO revisit this once legacy 'packed struct' encoding is gone
207*61046927SAndroid Build Coastguard Worker */
208*61046927SAndroid Build Coastguard Worker static inline struct ir3_register *
extract_cat6_SRC(const struct ir3_instruction * instr,unsigned n)209*61046927SAndroid Build Coastguard Worker extract_cat6_SRC(const struct ir3_instruction *instr, unsigned n)
210*61046927SAndroid Build Coastguard Worker {
211*61046927SAndroid Build Coastguard Worker if (is_global_a3xx_atomic(instr->opc)) {
212*61046927SAndroid Build Coastguard Worker n++;
213*61046927SAndroid Build Coastguard Worker }
214*61046927SAndroid Build Coastguard Worker assert(n < instr->srcs_count);
215*61046927SAndroid Build Coastguard Worker return instr->srcs[n];
216*61046927SAndroid Build Coastguard Worker }
217*61046927SAndroid Build Coastguard Worker
218*61046927SAndroid Build Coastguard Worker typedef enum {
219*61046927SAndroid Build Coastguard Worker REG_MULITSRC_IMMED,
220*61046927SAndroid Build Coastguard Worker REG_MULTISRC_IMMED_FLUT_FULL,
221*61046927SAndroid Build Coastguard Worker REG_MULTISRC_IMMED_FLUT_HALF,
222*61046927SAndroid Build Coastguard Worker REG_MULTISRC_GPR,
223*61046927SAndroid Build Coastguard Worker REG_MULTISRC_CONST,
224*61046927SAndroid Build Coastguard Worker REG_MULTISRC_RELATIVE_GPR,
225*61046927SAndroid Build Coastguard Worker REG_MULTISRC_RELATIVE_CONST,
226*61046927SAndroid Build Coastguard Worker } reg_multisrc_t;
227*61046927SAndroid Build Coastguard Worker
228*61046927SAndroid Build Coastguard Worker static inline reg_multisrc_t
__multisrc_case(struct encode_state * s,const struct ir3_register * reg)229*61046927SAndroid Build Coastguard Worker __multisrc_case(struct encode_state *s, const struct ir3_register *reg)
230*61046927SAndroid Build Coastguard Worker {
231*61046927SAndroid Build Coastguard Worker if (reg->flags & IR3_REG_IMMED) {
232*61046927SAndroid Build Coastguard Worker assert(opc_cat(s->instr->opc) == 2);
233*61046927SAndroid Build Coastguard Worker if (ir3_cat2_int(s->instr->opc)) {
234*61046927SAndroid Build Coastguard Worker return REG_MULITSRC_IMMED;
235*61046927SAndroid Build Coastguard Worker } else if (reg->flags & IR3_REG_HALF) {
236*61046927SAndroid Build Coastguard Worker return REG_MULTISRC_IMMED_FLUT_HALF;
237*61046927SAndroid Build Coastguard Worker } else {
238*61046927SAndroid Build Coastguard Worker return REG_MULTISRC_IMMED_FLUT_FULL;
239*61046927SAndroid Build Coastguard Worker }
240*61046927SAndroid Build Coastguard Worker } else if (reg->flags & IR3_REG_RELATIV) {
241*61046927SAndroid Build Coastguard Worker if (reg->flags & IR3_REG_CONST) {
242*61046927SAndroid Build Coastguard Worker return REG_MULTISRC_RELATIVE_CONST;
243*61046927SAndroid Build Coastguard Worker } else {
244*61046927SAndroid Build Coastguard Worker return REG_MULTISRC_RELATIVE_GPR;
245*61046927SAndroid Build Coastguard Worker }
246*61046927SAndroid Build Coastguard Worker } else if (reg->flags & IR3_REG_CONST) {
247*61046927SAndroid Build Coastguard Worker return REG_MULTISRC_CONST;
248*61046927SAndroid Build Coastguard Worker } else {
249*61046927SAndroid Build Coastguard Worker return REG_MULTISRC_GPR;
250*61046927SAndroid Build Coastguard Worker }
251*61046927SAndroid Build Coastguard Worker }
252*61046927SAndroid Build Coastguard Worker
253*61046927SAndroid Build Coastguard Worker typedef enum {
254*61046927SAndroid Build Coastguard Worker REG_CAT3_SRC_GPR,
255*61046927SAndroid Build Coastguard Worker REG_CAT3_SRC_CONST_OR_IMMED,
256*61046927SAndroid Build Coastguard Worker REG_CAT3_SRC_RELATIVE_GPR,
257*61046927SAndroid Build Coastguard Worker REG_CAT3_SRC_RELATIVE_CONST,
258*61046927SAndroid Build Coastguard Worker } reg_cat3_src_t;
259*61046927SAndroid Build Coastguard Worker
260*61046927SAndroid Build Coastguard Worker static inline reg_cat3_src_t
__cat3_src_case(struct encode_state * s,const struct ir3_register * reg)261*61046927SAndroid Build Coastguard Worker __cat3_src_case(struct encode_state *s, const struct ir3_register *reg)
262*61046927SAndroid Build Coastguard Worker {
263*61046927SAndroid Build Coastguard Worker if (reg->flags & IR3_REG_RELATIV) {
264*61046927SAndroid Build Coastguard Worker if (reg->flags & IR3_REG_CONST) {
265*61046927SAndroid Build Coastguard Worker return REG_CAT3_SRC_RELATIVE_CONST;
266*61046927SAndroid Build Coastguard Worker } else {
267*61046927SAndroid Build Coastguard Worker return REG_CAT3_SRC_RELATIVE_GPR;
268*61046927SAndroid Build Coastguard Worker }
269*61046927SAndroid Build Coastguard Worker } else if (reg->flags & (IR3_REG_CONST | IR3_REG_IMMED)) {
270*61046927SAndroid Build Coastguard Worker return REG_CAT3_SRC_CONST_OR_IMMED;
271*61046927SAndroid Build Coastguard Worker } else {
272*61046927SAndroid Build Coastguard Worker return REG_CAT3_SRC_GPR;
273*61046927SAndroid Build Coastguard Worker }
274*61046927SAndroid Build Coastguard Worker }
275*61046927SAndroid Build Coastguard Worker
276*61046927SAndroid Build Coastguard Worker typedef enum {
277*61046927SAndroid Build Coastguard Worker CONST_DST_IMM,
278*61046927SAndroid Build Coastguard Worker CONST_DST_A1
279*61046927SAndroid Build Coastguard Worker } stc_dst_t;
280*61046927SAndroid Build Coastguard Worker
281*61046927SAndroid Build Coastguard Worker static inline stc_dst_t
__const_dst_case(struct encode_state * s,const struct ir3_instruction * instr)282*61046927SAndroid Build Coastguard Worker __const_dst_case(struct encode_state *s, const struct ir3_instruction *instr)
283*61046927SAndroid Build Coastguard Worker {
284*61046927SAndroid Build Coastguard Worker return (instr->flags & IR3_INSTR_A1EN) ? CONST_DST_A1 : CONST_DST_IMM;
285*61046927SAndroid Build Coastguard Worker }
286*61046927SAndroid Build Coastguard Worker
287*61046927SAndroid Build Coastguard Worker #include "encode.h"
288*61046927SAndroid Build Coastguard Worker
289*61046927SAndroid Build Coastguard Worker
290*61046927SAndroid Build Coastguard Worker void *
isa_assemble(struct ir3_shader_variant * v)291*61046927SAndroid Build Coastguard Worker isa_assemble(struct ir3_shader_variant *v)
292*61046927SAndroid Build Coastguard Worker {
293*61046927SAndroid Build Coastguard Worker BITSET_WORD *ptr, *instrs;
294*61046927SAndroid Build Coastguard Worker const struct ir3_info *info = &v->info;
295*61046927SAndroid Build Coastguard Worker struct ir3 *shader = v->ir;
296*61046927SAndroid Build Coastguard Worker
297*61046927SAndroid Build Coastguard Worker ptr = instrs = rzalloc_size(v, info->size);
298*61046927SAndroid Build Coastguard Worker
299*61046927SAndroid Build Coastguard Worker foreach_block (block, &shader->block_list) {
300*61046927SAndroid Build Coastguard Worker foreach_instr (instr, &block->instr_list) {
301*61046927SAndroid Build Coastguard Worker struct encode_state s = {
302*61046927SAndroid Build Coastguard Worker .gen = shader->compiler->gen * 100,
303*61046927SAndroid Build Coastguard Worker .compiler = shader->compiler,
304*61046927SAndroid Build Coastguard Worker .instr = instr,
305*61046927SAndroid Build Coastguard Worker };
306*61046927SAndroid Build Coastguard Worker
307*61046927SAndroid Build Coastguard Worker bitmask_t encoded;
308*61046927SAndroid Build Coastguard Worker if (instr->opc == OPC_META_RAW) {
309*61046927SAndroid Build Coastguard Worker encoded = uint64_t_to_bitmask(instr->raw.value);
310*61046927SAndroid Build Coastguard Worker } else {
311*61046927SAndroid Build Coastguard Worker encoded = encode__instruction(&s, NULL, instr);
312*61046927SAndroid Build Coastguard Worker }
313*61046927SAndroid Build Coastguard Worker store_instruction(instrs, encoded);
314*61046927SAndroid Build Coastguard Worker instrs += BITMASK_WORDS;
315*61046927SAndroid Build Coastguard Worker }
316*61046927SAndroid Build Coastguard Worker }
317*61046927SAndroid Build Coastguard Worker
318*61046927SAndroid Build Coastguard Worker return ptr;
319*61046927SAndroid Build Coastguard Worker }
320