1 /*
2  * Copyright 2013 The Native Client Authors.  All rights reserved.
3  * Use of this source code is governed by a BSD-style license that can
4  * be found in the LICENSE file.
5  */
6 
7 // DO NOT EDIT: GENERATED CODE
8 
9 #ifndef NATIVE_CLIENT_SRC_TRUSTED_VALIDATOR_ARM_GEN_ARM32_DECODE_BASELINES_2_H_
10 #define NATIVE_CLIENT_SRC_TRUSTED_VALIDATOR_ARM_GEN_ARM32_DECODE_BASELINES_2_H_
11 
12 #include "native_client/src/trusted/validator_arm/arm_helpers.h"
13 #include "native_client/src/trusted/validator_arm/inst_classes.h"
14 
15 namespace nacl_arm_dec {
16 
17 // SMMLA_cccc01110101ddddaaaammmm00r1nnnn_case_0:
18 //
19 //   {M: M(5),
20 //    Pc: 15,
21 //    Ra: Ra(15:12),
22 //    Rd: Rd(19:16),
23 //    Rm: Rm(11:8),
24 //    Rn: Rn(3:0),
25 //    arch: v6,
26 //    cond: cond(31:28),
27 //    defs: {Rd},
28 //    fields: [cond(31:28), Rd(19:16), Ra(15:12), Rm(11:8), M(5), Rn(3:0)],
29 //    pattern: cccc01110101ddddaaaammmm00r1nnnn,
30 //    rule: SMMLA,
31 //    safety: [Ra  ==
32 //            Pc => DECODER_ERROR,
33 //      Pc in {Rd, Rn, Rm} => UNPREDICTABLE],
34 //    uses: {Rn, Rm, Ra}}
35 class SMMLA_cccc01110101ddddaaaammmm00r1nnnn_case_0
36      : public ClassDecoder {
37  public:
SMMLA_cccc01110101ddddaaaammmm00r1nnnn_case_0()38   SMMLA_cccc01110101ddddaaaammmm00r1nnnn_case_0()
39      : ClassDecoder() {}
40   virtual RegisterList defs(Instruction inst) const;
41   virtual SafetyLevel safety(Instruction i) const;
42   virtual RegisterList uses(Instruction i) const;
43  private:
44   NACL_DISALLOW_COPY_AND_ASSIGN(
45       SMMLA_cccc01110101ddddaaaammmm00r1nnnn_case_0);
46 };
47 
48 // SMMLS_cccc01110101ddddaaaammmm11r1nnnn_case_0:
49 //
50 //   {M: M(5),
51 //    Pc: 15,
52 //    Ra: Ra(15:12),
53 //    Rd: Rd(19:16),
54 //    Rm: Rm(11:8),
55 //    Rn: Rn(3:0),
56 //    arch: v6,
57 //    cond: cond(31:28),
58 //    defs: {Rd},
59 //    fields: [cond(31:28), Rd(19:16), Ra(15:12), Rm(11:8), M(5), Rn(3:0)],
60 //    pattern: cccc01110101ddddaaaammmm11r1nnnn,
61 //    rule: SMMLS,
62 //    safety: [Ra  ==
63 //            Pc => DECODER_ERROR,
64 //      Pc in {Rd, Rn, Rm} => UNPREDICTABLE],
65 //    uses: {Rn, Rm, Ra}}
66 class SMMLS_cccc01110101ddddaaaammmm11r1nnnn_case_0
67      : public ClassDecoder {
68  public:
SMMLS_cccc01110101ddddaaaammmm11r1nnnn_case_0()69   SMMLS_cccc01110101ddddaaaammmm11r1nnnn_case_0()
70      : ClassDecoder() {}
71   virtual RegisterList defs(Instruction inst) const;
72   virtual SafetyLevel safety(Instruction i) const;
73   virtual RegisterList uses(Instruction i) const;
74  private:
75   NACL_DISALLOW_COPY_AND_ASSIGN(
76       SMMLS_cccc01110101ddddaaaammmm11r1nnnn_case_0);
77 };
78 
79 // SMMUL_cccc01110101dddd1111mmmm00r1nnnn_case_0:
80 //
81 //   {M: M(5),
82 //    Pc: 15,
83 //    Rd: Rd(19:16),
84 //    Rm: Rm(11:8),
85 //    Rn: Rn(3:0),
86 //    arch: v6,
87 //    cond: cond(31:28),
88 //    defs: {Rd},
89 //    fields: [cond(31:28), Rd(19:16), Rm(11:8), M(5), Rn(3:0)],
90 //    pattern: cccc01110101dddd1111mmmm00r1nnnn,
91 //    rule: SMMUL,
92 //    safety: [Pc in {Rd, Rm, Rn} => UNPREDICTABLE],
93 //    uses: {Rm, Rn}}
94 class SMMUL_cccc01110101dddd1111mmmm00r1nnnn_case_0
95      : public ClassDecoder {
96  public:
SMMUL_cccc01110101dddd1111mmmm00r1nnnn_case_0()97   SMMUL_cccc01110101dddd1111mmmm00r1nnnn_case_0()
98      : ClassDecoder() {}
99   virtual RegisterList defs(Instruction inst) const;
100   virtual SafetyLevel safety(Instruction i) const;
101   virtual RegisterList uses(Instruction i) const;
102  private:
103   NACL_DISALLOW_COPY_AND_ASSIGN(
104       SMMUL_cccc01110101dddd1111mmmm00r1nnnn_case_0);
105 };
106 
107 // SMUAD_cccc01110000dddd1111mmmm00m1nnnn_case_0:
108 //
109 //   {M: M(5),
110 //    Pc: 15,
111 //    Rd: Rd(19:16),
112 //    Rm: Rm(11:8),
113 //    Rn: Rn(3:0),
114 //    arch: v6,
115 //    cond: cond(31:28),
116 //    defs: {Rd},
117 //    fields: [cond(31:28), Rd(19:16), Rm(11:8), M(5), Rn(3:0)],
118 //    pattern: cccc01110000dddd1111mmmm00m1nnnn,
119 //    rule: SMUAD,
120 //    safety: [Pc in {Rd, Rm, Rn} => UNPREDICTABLE],
121 //    uses: {Rm, Rn}}
122 class SMUAD_cccc01110000dddd1111mmmm00m1nnnn_case_0
123      : public ClassDecoder {
124  public:
SMUAD_cccc01110000dddd1111mmmm00m1nnnn_case_0()125   SMUAD_cccc01110000dddd1111mmmm00m1nnnn_case_0()
126      : ClassDecoder() {}
127   virtual RegisterList defs(Instruction inst) const;
128   virtual SafetyLevel safety(Instruction i) const;
129   virtual RegisterList uses(Instruction i) const;
130  private:
131   NACL_DISALLOW_COPY_AND_ASSIGN(
132       SMUAD_cccc01110000dddd1111mmmm00m1nnnn_case_0);
133 };
134 
135 // SMULBB_SMULBT_SMULTB_SMULTT_cccc00010110dddd0000mmmm1xx0nnnn_case_0:
136 //
137 //   {M: M(6),
138 //    N: N(5),
139 //    Pc: 15,
140 //    Rd: Rd(19:16),
141 //    Rm: Rm(11:8),
142 //    Rn: Rn(3:0),
143 //    arch: v5TE,
144 //    cond: cond(31:28),
145 //    defs: {Rd},
146 //    fields: [cond(31:28), Rd(19:16), Rm(11:8), M(6), N(5), Rn(3:0)],
147 //    m_high: M(6)=1,
148 //    n_high: N(5)=1,
149 //    pattern: cccc00010110dddd0000mmmm1xx0nnnn,
150 //    rule: SMULBB_SMULBT_SMULTB_SMULTT,
151 //    safety: [Pc in {Rd, Rn, Rm} => UNPREDICTABLE],
152 //    uses: {Rn, Rm}}
153 class SMULBB_SMULBT_SMULTB_SMULTT_cccc00010110dddd0000mmmm1xx0nnnn_case_0
154      : public ClassDecoder {
155  public:
SMULBB_SMULBT_SMULTB_SMULTT_cccc00010110dddd0000mmmm1xx0nnnn_case_0()156   SMULBB_SMULBT_SMULTB_SMULTT_cccc00010110dddd0000mmmm1xx0nnnn_case_0()
157      : ClassDecoder() {}
158   virtual RegisterList defs(Instruction inst) const;
159   virtual SafetyLevel safety(Instruction i) const;
160   virtual RegisterList uses(Instruction i) const;
161  private:
162   NACL_DISALLOW_COPY_AND_ASSIGN(
163       SMULBB_SMULBT_SMULTB_SMULTT_cccc00010110dddd0000mmmm1xx0nnnn_case_0);
164 };
165 
166 // SMULL_A1_cccc0000110shhhhllllmmmm1001nnnn_case_0:
167 //
168 //   {NZCV: 16,
169 //    None: 32,
170 //    Pc: 15,
171 //    RdHi: RdHi(19:16),
172 //    RdLo: RdLo(15:12),
173 //    Rm: Rm(11:8),
174 //    Rn: Rn(3:0),
175 //    S: S(20),
176 //    cond: cond(31:28),
177 //    defs: {RdLo, RdHi, NZCV
178 //         if setflags
179 //         else None},
180 //    fields: [cond(31:28),
181 //      S(20),
182 //      RdHi(19:16),
183 //      RdLo(15:12),
184 //      Rm(11:8),
185 //      Rn(3:0)],
186 //    pattern: cccc0000110shhhhllllmmmm1001nnnn,
187 //    rule: SMULL_A1,
188 //    safety: [Pc in {RdLo, RdHi, Rn, Rm} => UNPREDICTABLE,
189 //      RdHi  ==
190 //            RdLo => UNPREDICTABLE,
191 //      (ArchVersion()  <
192 //            6 &&
193 //         (RdHi  ==
194 //            Rn ||
195 //         RdLo  ==
196 //            Rn)) => UNPREDICTABLE],
197 //    setflags: S(20)=1,
198 //    uses: {Rn, Rm}}
199 class SMULL_A1_cccc0000110shhhhllllmmmm1001nnnn_case_0
200      : public ClassDecoder {
201  public:
SMULL_A1_cccc0000110shhhhllllmmmm1001nnnn_case_0()202   SMULL_A1_cccc0000110shhhhllllmmmm1001nnnn_case_0()
203      : ClassDecoder() {}
204   virtual RegisterList defs(Instruction inst) const;
205   virtual SafetyLevel safety(Instruction i) const;
206   virtual RegisterList uses(Instruction i) const;
207  private:
208   NACL_DISALLOW_COPY_AND_ASSIGN(
209       SMULL_A1_cccc0000110shhhhllllmmmm1001nnnn_case_0);
210 };
211 
212 // SMULWB_SMULWT_cccc00010010dddd0000mmmm1x10nnnn_case_0:
213 //
214 //   {M: M(6),
215 //    N: N(5),
216 //    Pc: 15,
217 //    Rd: Rd(19:16),
218 //    Rm: Rm(11:8),
219 //    Rn: Rn(3:0),
220 //    arch: v5TE,
221 //    cond: cond(31:28),
222 //    defs: {Rd},
223 //    fields: [cond(31:28), Rd(19:16), Rm(11:8), M(6), N(5), Rn(3:0)],
224 //    m_high: M(6)=1,
225 //    n_high: N(5)=1,
226 //    pattern: cccc00010010dddd0000mmmm1x10nnnn,
227 //    rule: SMULWB_SMULWT,
228 //    safety: [Pc in {Rd, Rn, Rm} => UNPREDICTABLE],
229 //    uses: {Rn, Rm}}
230 class SMULWB_SMULWT_cccc00010010dddd0000mmmm1x10nnnn_case_0
231      : public ClassDecoder {
232  public:
SMULWB_SMULWT_cccc00010010dddd0000mmmm1x10nnnn_case_0()233   SMULWB_SMULWT_cccc00010010dddd0000mmmm1x10nnnn_case_0()
234      : ClassDecoder() {}
235   virtual RegisterList defs(Instruction inst) const;
236   virtual SafetyLevel safety(Instruction i) const;
237   virtual RegisterList uses(Instruction i) const;
238  private:
239   NACL_DISALLOW_COPY_AND_ASSIGN(
240       SMULWB_SMULWT_cccc00010010dddd0000mmmm1x10nnnn_case_0);
241 };
242 
243 // SMUSD_cccc01110000dddd1111mmmm01m1nnnn_case_0:
244 //
245 //   {M: M(5),
246 //    Pc: 15,
247 //    Rd: Rd(19:16),
248 //    Rm: Rm(11:8),
249 //    Rn: Rn(3:0),
250 //    arch: v6,
251 //    cond: cond(31:28),
252 //    defs: {Rd},
253 //    fields: [cond(31:28), Rd(19:16), Rm(11:8), M(5), Rn(3:0)],
254 //    pattern: cccc01110000dddd1111mmmm01m1nnnn,
255 //    rule: SMUSD,
256 //    safety: [Pc in {Rd, Rm, Rn} => UNPREDICTABLE],
257 //    uses: {Rm, Rn}}
258 class SMUSD_cccc01110000dddd1111mmmm01m1nnnn_case_0
259      : public ClassDecoder {
260  public:
SMUSD_cccc01110000dddd1111mmmm01m1nnnn_case_0()261   SMUSD_cccc01110000dddd1111mmmm01m1nnnn_case_0()
262      : ClassDecoder() {}
263   virtual RegisterList defs(Instruction inst) const;
264   virtual SafetyLevel safety(Instruction i) const;
265   virtual RegisterList uses(Instruction i) const;
266  private:
267   NACL_DISALLOW_COPY_AND_ASSIGN(
268       SMUSD_cccc01110000dddd1111mmmm01m1nnnn_case_0);
269 };
270 
271 // SRS_1111100pu1w0110100000101000iiiii_case_0:
272 //
273 //   {arch: v6,
274 //    defs: {},
275 //    pattern: 1111100pu1w0110100000101000iiiii,
276 //    rule: SRS,
277 //    safety: [true => FORBIDDEN],
278 //    true: true,
279 //    uses: {}}
280 class SRS_1111100pu1w0110100000101000iiiii_case_0
281      : public ClassDecoder {
282  public:
SRS_1111100pu1w0110100000101000iiiii_case_0()283   SRS_1111100pu1w0110100000101000iiiii_case_0()
284      : ClassDecoder() {}
285   virtual RegisterList defs(Instruction inst) const;
286   virtual SafetyLevel safety(Instruction i) const;
287   virtual RegisterList uses(Instruction i) const;
288  private:
289   NACL_DISALLOW_COPY_AND_ASSIGN(
290       SRS_1111100pu1w0110100000101000iiiii_case_0);
291 };
292 
293 // SSAT16_cccc01101010iiiidddd11110011nnnn_case_0:
294 //
295 //   {Pc: 15,
296 //    Rd: Rd(15:12),
297 //    Rn: Rn(3:0),
298 //    arch: v6,
299 //    cond: cond(31:28),
300 //    defs: {Rd},
301 //    fields: [cond(31:28), sat_imm(19:16), Rd(15:12), Rn(3:0)],
302 //    pattern: cccc01101010iiiidddd11110011nnnn,
303 //    rule: SSAT16,
304 //    safety: [Pc in {Rd, Rn} => UNPREDICTABLE],
305 //    sat_imm: sat_imm(19:16),
306 //    saturate_to: sat_imm + 1,
307 //    uses: {Rn}}
308 class SSAT16_cccc01101010iiiidddd11110011nnnn_case_0
309      : public ClassDecoder {
310  public:
SSAT16_cccc01101010iiiidddd11110011nnnn_case_0()311   SSAT16_cccc01101010iiiidddd11110011nnnn_case_0()
312      : ClassDecoder() {}
313   virtual RegisterList defs(Instruction inst) const;
314   virtual SafetyLevel safety(Instruction i) const;
315   virtual RegisterList uses(Instruction i) const;
316  private:
317   NACL_DISALLOW_COPY_AND_ASSIGN(
318       SSAT16_cccc01101010iiiidddd11110011nnnn_case_0);
319 };
320 
321 // SSAT_cccc0110101iiiiiddddiiiiis01nnnn_case_0:
322 //
323 //   {Pc: 15,
324 //    Rd: Rd(15:12),
325 //    Rn: Rn(3:0),
326 //    arch: v6,
327 //    cond: cond(31:28),
328 //    defs: {Rd},
329 //    fields: [cond(31:28),
330 //      sat_imm(20:16),
331 //      Rd(15:12),
332 //      imm5(11:7),
333 //      sh(6),
334 //      Rn(3:0)],
335 //    imm5: imm5(11:7),
336 //    pattern: cccc0110101iiiiiddddiiiiis01nnnn,
337 //    rule: SSAT,
338 //    safety: [Pc in {Rd, Rn} => UNPREDICTABLE],
339 //    sat_imm: sat_imm(20:16),
340 //    saturate_to: sat_imm + 1,
341 //    sh: sh(6),
342 //    shift: DecodeImmShift(sh:'0'(0), imm5),
343 //    uses: {Rn}}
344 class SSAT_cccc0110101iiiiiddddiiiiis01nnnn_case_0
345      : public ClassDecoder {
346  public:
SSAT_cccc0110101iiiiiddddiiiiis01nnnn_case_0()347   SSAT_cccc0110101iiiiiddddiiiiis01nnnn_case_0()
348      : ClassDecoder() {}
349   virtual RegisterList defs(Instruction inst) const;
350   virtual SafetyLevel safety(Instruction i) const;
351   virtual RegisterList uses(Instruction i) const;
352  private:
353   NACL_DISALLOW_COPY_AND_ASSIGN(
354       SSAT_cccc0110101iiiiiddddiiiiis01nnnn_case_0);
355 };
356 
357 // SSAX_cccc01100001nnnndddd11110101mmmm_case_0:
358 //
359 //   {Pc: 15,
360 //    Rd: Rd(15:12),
361 //    Rm: Rm(3:0),
362 //    Rn: Rn(19:16),
363 //    arch: v6,
364 //    cond: cond(31:28),
365 //    defs: {Rd},
366 //    fields: [cond(31:28), Rn(19:16), Rd(15:12), Rm(3:0)],
367 //    pattern: cccc01100001nnnndddd11110101mmmm,
368 //    rule: SSAX,
369 //    safety: [Pc in {Rd, Rn, Rm} => UNPREDICTABLE],
370 //    uses: {Rn, Rm}}
371 class SSAX_cccc01100001nnnndddd11110101mmmm_case_0
372      : public ClassDecoder {
373  public:
SSAX_cccc01100001nnnndddd11110101mmmm_case_0()374   SSAX_cccc01100001nnnndddd11110101mmmm_case_0()
375      : ClassDecoder() {}
376   virtual RegisterList defs(Instruction inst) const;
377   virtual SafetyLevel safety(Instruction i) const;
378   virtual RegisterList uses(Instruction i) const;
379  private:
380   NACL_DISALLOW_COPY_AND_ASSIGN(
381       SSAX_cccc01100001nnnndddd11110101mmmm_case_0);
382 };
383 
384 // SSSUB16_cccc01100001nnnndddd11110111mmmm_case_0:
385 //
386 //   {Pc: 15,
387 //    Rd: Rd(15:12),
388 //    Rm: Rm(3:0),
389 //    Rn: Rn(19:16),
390 //    arch: v6,
391 //    cond: cond(31:28),
392 //    defs: {Rd},
393 //    fields: [cond(31:28), Rn(19:16), Rd(15:12), Rm(3:0)],
394 //    pattern: cccc01100001nnnndddd11110111mmmm,
395 //    rule: SSSUB16,
396 //    safety: [Pc in {Rd, Rn, Rm} => UNPREDICTABLE],
397 //    uses: {Rn, Rm}}
398 class SSSUB16_cccc01100001nnnndddd11110111mmmm_case_0
399      : public ClassDecoder {
400  public:
SSSUB16_cccc01100001nnnndddd11110111mmmm_case_0()401   SSSUB16_cccc01100001nnnndddd11110111mmmm_case_0()
402      : ClassDecoder() {}
403   virtual RegisterList defs(Instruction inst) const;
404   virtual SafetyLevel safety(Instruction i) const;
405   virtual RegisterList uses(Instruction i) const;
406  private:
407   NACL_DISALLOW_COPY_AND_ASSIGN(
408       SSSUB16_cccc01100001nnnndddd11110111mmmm_case_0);
409 };
410 
411 // SSUB8_cccc01100001nnnndddd11111111mmmm_case_0:
412 //
413 //   {Pc: 15,
414 //    Rd: Rd(15:12),
415 //    Rm: Rm(3:0),
416 //    Rn: Rn(19:16),
417 //    arch: v6,
418 //    cond: cond(31:28),
419 //    defs: {Rd},
420 //    fields: [cond(31:28), Rn(19:16), Rd(15:12), Rm(3:0)],
421 //    pattern: cccc01100001nnnndddd11111111mmmm,
422 //    rule: SSUB8,
423 //    safety: [Pc in {Rd, Rn, Rm} => UNPREDICTABLE],
424 //    uses: {Rn, Rm}}
425 class SSUB8_cccc01100001nnnndddd11111111mmmm_case_0
426      : public ClassDecoder {
427  public:
SSUB8_cccc01100001nnnndddd11111111mmmm_case_0()428   SSUB8_cccc01100001nnnndddd11111111mmmm_case_0()
429      : ClassDecoder() {}
430   virtual RegisterList defs(Instruction inst) const;
431   virtual SafetyLevel safety(Instruction i) const;
432   virtual RegisterList uses(Instruction i) const;
433  private:
434   NACL_DISALLOW_COPY_AND_ASSIGN(
435       SSUB8_cccc01100001nnnndddd11111111mmmm_case_0);
436 };
437 
438 // STC2_1111110pudw0nnnniiiiiiiiiiiiiiii_case_0:
439 //
440 //   {arch: v5,
441 //    defs: {},
442 //    pattern: 1111110pudw0nnnniiiiiiiiiiiiiiii,
443 //    rule: STC2,
444 //    safety: [true => FORBIDDEN],
445 //    true: true,
446 //    uses: {}}
447 class STC2_1111110pudw0nnnniiiiiiiiiiiiiiii_case_0
448      : public ClassDecoder {
449  public:
STC2_1111110pudw0nnnniiiiiiiiiiiiiiii_case_0()450   STC2_1111110pudw0nnnniiiiiiiiiiiiiiii_case_0()
451      : ClassDecoder() {}
452   virtual RegisterList defs(Instruction inst) const;
453   virtual SafetyLevel safety(Instruction i) const;
454   virtual RegisterList uses(Instruction i) const;
455  private:
456   NACL_DISALLOW_COPY_AND_ASSIGN(
457       STC2_1111110pudw0nnnniiiiiiiiiiiiiiii_case_0);
458 };
459 
460 // STC_cccc110pudw0nnnnddddcccciiiiiiii_case_0:
461 //
462 //   {defs: {},
463 //    pattern: cccc110pudw0nnnnddddcccciiiiiiii,
464 //    rule: STC,
465 //    safety: [true => FORBIDDEN],
466 //    true: true,
467 //    uses: {}}
468 class STC_cccc110pudw0nnnnddddcccciiiiiiii_case_0
469      : public ClassDecoder {
470  public:
STC_cccc110pudw0nnnnddddcccciiiiiiii_case_0()471   STC_cccc110pudw0nnnnddddcccciiiiiiii_case_0()
472      : ClassDecoder() {}
473   virtual RegisterList defs(Instruction inst) const;
474   virtual SafetyLevel safety(Instruction i) const;
475   virtual RegisterList uses(Instruction i) const;
476  private:
477   NACL_DISALLOW_COPY_AND_ASSIGN(
478       STC_cccc110pudw0nnnnddddcccciiiiiiii_case_0);
479 };
480 
481 // STMDA_STMED_cccc100000w0nnnnrrrrrrrrrrrrrrrr_case_0:
482 //
483 //   {None: 32,
484 //    Pc: 15,
485 //    Rn: Rn(19:16),
486 //    W: W(21),
487 //    base: Rn,
488 //    cond: cond(31:28),
489 //    defs: {Rn
490 //         if wback
491 //         else None},
492 //    fields: [cond(31:28), W(21), Rn(19:16), register_list(15:0)],
493 //    pattern: cccc100000w0nnnnrrrrrrrrrrrrrrrr,
494 //    register_list: register_list(15:0),
495 //    registers: RegisterList(register_list),
496 //    rule: STMDA_STMED,
497 //    safety: [Rn  ==
498 //            Pc ||
499 //         NumGPRs(registers)  <
500 //            1 => UNPREDICTABLE,
501 //      wback &&
502 //         Contains(registers, Rn) &&
503 //         Rn  !=
504 //            SmallestGPR(registers) => UNKNOWN],
505 //    small_imm_base_wb: wback,
506 //    uses: Union({Rn}, registers),
507 //    violations: [implied by 'base'],
508 //    wback: W(21)=1}
509 class STMDA_STMED_cccc100000w0nnnnrrrrrrrrrrrrrrrr_case_0
510      : public ClassDecoder {
511  public:
STMDA_STMED_cccc100000w0nnnnrrrrrrrrrrrrrrrr_case_0()512   STMDA_STMED_cccc100000w0nnnnrrrrrrrrrrrrrrrr_case_0()
513      : ClassDecoder() {}
514   virtual Register base_address_register(Instruction i) const;
515   virtual RegisterList defs(Instruction inst) const;
516   virtual SafetyLevel safety(Instruction i) const;
517   virtual bool base_address_register_writeback_small_immediate(
518       Instruction i) const;
519   virtual RegisterList uses(Instruction i) const;
520   virtual ViolationSet get_violations(
521       const nacl_arm_val::DecodedInstruction& first,
522       const nacl_arm_val::DecodedInstruction& second,
523       const nacl_arm_val::SfiValidator& sfi,
524       nacl_arm_val::AddressSet* branches,
525       nacl_arm_val::AddressSet* critical,
526       uint32_t* next_inst_addr) const;
527  private:
528   NACL_DISALLOW_COPY_AND_ASSIGN(
529       STMDA_STMED_cccc100000w0nnnnrrrrrrrrrrrrrrrr_case_0);
530 };
531 
532 // STMDB_STMFD_cccc100100w0nnnnrrrrrrrrrrrrrrrr_case_0:
533 //
534 //   {None: 32,
535 //    Pc: 15,
536 //    Rn: Rn(19:16),
537 //    W: W(21),
538 //    base: Rn,
539 //    cond: cond(31:28),
540 //    defs: {Rn
541 //         if wback
542 //         else None},
543 //    fields: [cond(31:28), W(21), Rn(19:16), register_list(15:0)],
544 //    pattern: cccc100100w0nnnnrrrrrrrrrrrrrrrr,
545 //    register_list: register_list(15:0),
546 //    registers: RegisterList(register_list),
547 //    rule: STMDB_STMFD,
548 //    safety: [Rn  ==
549 //            Pc ||
550 //         NumGPRs(registers)  <
551 //            1 => UNPREDICTABLE,
552 //      wback &&
553 //         Contains(registers, Rn) &&
554 //         Rn  !=
555 //            SmallestGPR(registers) => UNKNOWN],
556 //    small_imm_base_wb: wback,
557 //    uses: Union({Rn}, registers),
558 //    violations: [implied by 'base'],
559 //    wback: W(21)=1}
560 class STMDB_STMFD_cccc100100w0nnnnrrrrrrrrrrrrrrrr_case_0
561      : public ClassDecoder {
562  public:
STMDB_STMFD_cccc100100w0nnnnrrrrrrrrrrrrrrrr_case_0()563   STMDB_STMFD_cccc100100w0nnnnrrrrrrrrrrrrrrrr_case_0()
564      : ClassDecoder() {}
565   virtual Register base_address_register(Instruction i) const;
566   virtual RegisterList defs(Instruction inst) const;
567   virtual SafetyLevel safety(Instruction i) const;
568   virtual bool base_address_register_writeback_small_immediate(
569       Instruction i) const;
570   virtual RegisterList uses(Instruction i) const;
571   virtual ViolationSet get_violations(
572       const nacl_arm_val::DecodedInstruction& first,
573       const nacl_arm_val::DecodedInstruction& second,
574       const nacl_arm_val::SfiValidator& sfi,
575       nacl_arm_val::AddressSet* branches,
576       nacl_arm_val::AddressSet* critical,
577       uint32_t* next_inst_addr) const;
578  private:
579   NACL_DISALLOW_COPY_AND_ASSIGN(
580       STMDB_STMFD_cccc100100w0nnnnrrrrrrrrrrrrrrrr_case_0);
581 };
582 
583 // STMIB_STMFA_cccc100110w0nnnnrrrrrrrrrrrrrrrr_case_0:
584 //
585 //   {None: 32,
586 //    Pc: 15,
587 //    Rn: Rn(19:16),
588 //    W: W(21),
589 //    base: Rn,
590 //    cond: cond(31:28),
591 //    defs: {Rn
592 //         if wback
593 //         else None},
594 //    fields: [cond(31:28), W(21), Rn(19:16), register_list(15:0)],
595 //    pattern: cccc100110w0nnnnrrrrrrrrrrrrrrrr,
596 //    register_list: register_list(15:0),
597 //    registers: RegisterList(register_list),
598 //    rule: STMIB_STMFA,
599 //    safety: [Rn  ==
600 //            Pc ||
601 //         NumGPRs(registers)  <
602 //            1 => UNPREDICTABLE,
603 //      wback &&
604 //         Contains(registers, Rn) &&
605 //         Rn  !=
606 //            SmallestGPR(registers) => UNKNOWN],
607 //    small_imm_base_wb: wback,
608 //    uses: Union({Rn}, registers),
609 //    violations: [implied by 'base'],
610 //    wback: W(21)=1}
611 class STMIB_STMFA_cccc100110w0nnnnrrrrrrrrrrrrrrrr_case_0
612      : public ClassDecoder {
613  public:
STMIB_STMFA_cccc100110w0nnnnrrrrrrrrrrrrrrrr_case_0()614   STMIB_STMFA_cccc100110w0nnnnrrrrrrrrrrrrrrrr_case_0()
615      : ClassDecoder() {}
616   virtual Register base_address_register(Instruction i) const;
617   virtual RegisterList defs(Instruction inst) const;
618   virtual SafetyLevel safety(Instruction i) const;
619   virtual bool base_address_register_writeback_small_immediate(
620       Instruction i) const;
621   virtual RegisterList uses(Instruction i) const;
622   virtual ViolationSet get_violations(
623       const nacl_arm_val::DecodedInstruction& first,
624       const nacl_arm_val::DecodedInstruction& second,
625       const nacl_arm_val::SfiValidator& sfi,
626       nacl_arm_val::AddressSet* branches,
627       nacl_arm_val::AddressSet* critical,
628       uint32_t* next_inst_addr) const;
629  private:
630   NACL_DISALLOW_COPY_AND_ASSIGN(
631       STMIB_STMFA_cccc100110w0nnnnrrrrrrrrrrrrrrrr_case_0);
632 };
633 
634 // STM_STMIA_STMEA_cccc100010w0nnnnrrrrrrrrrrrrrrrr_case_0:
635 //
636 //   {None: 32,
637 //    Pc: 15,
638 //    Rn: Rn(19:16),
639 //    W: W(21),
640 //    base: Rn,
641 //    cond: cond(31:28),
642 //    defs: {Rn
643 //         if wback
644 //         else None},
645 //    fields: [cond(31:28), W(21), Rn(19:16), register_list(15:0)],
646 //    pattern: cccc100010w0nnnnrrrrrrrrrrrrrrrr,
647 //    register_list: register_list(15:0),
648 //    registers: RegisterList(register_list),
649 //    rule: STM_STMIA_STMEA,
650 //    safety: [Rn  ==
651 //            Pc ||
652 //         NumGPRs(registers)  <
653 //            1 => UNPREDICTABLE,
654 //      wback &&
655 //         Contains(registers, Rn) &&
656 //         Rn  !=
657 //            SmallestGPR(registers) => UNKNOWN],
658 //    small_imm_base_wb: wback,
659 //    uses: Union({Rn}, registers),
660 //    violations: [implied by 'base'],
661 //    wback: W(21)=1}
662 class STM_STMIA_STMEA_cccc100010w0nnnnrrrrrrrrrrrrrrrr_case_0
663      : public ClassDecoder {
664  public:
STM_STMIA_STMEA_cccc100010w0nnnnrrrrrrrrrrrrrrrr_case_0()665   STM_STMIA_STMEA_cccc100010w0nnnnrrrrrrrrrrrrrrrr_case_0()
666      : ClassDecoder() {}
667   virtual Register base_address_register(Instruction i) const;
668   virtual RegisterList defs(Instruction inst) const;
669   virtual SafetyLevel safety(Instruction i) const;
670   virtual bool base_address_register_writeback_small_immediate(
671       Instruction i) const;
672   virtual RegisterList uses(Instruction i) const;
673   virtual ViolationSet get_violations(
674       const nacl_arm_val::DecodedInstruction& first,
675       const nacl_arm_val::DecodedInstruction& second,
676       const nacl_arm_val::SfiValidator& sfi,
677       nacl_arm_val::AddressSet* branches,
678       nacl_arm_val::AddressSet* critical,
679       uint32_t* next_inst_addr) const;
680  private:
681   NACL_DISALLOW_COPY_AND_ASSIGN(
682       STM_STMIA_STMEA_cccc100010w0nnnnrrrrrrrrrrrrrrrr_case_0);
683 };
684 
685 // STM_User_registers_cccc100pu100nnnnrrrrrrrrrrrrrrrr_case_0:
686 //
687 //   {defs: {},
688 //    pattern: cccc100pu100nnnnrrrrrrrrrrrrrrrr,
689 //    rule: STM_User_registers,
690 //    safety: [true => FORBIDDEN],
691 //    true: true,
692 //    uses: {}}
693 class STM_User_registers_cccc100pu100nnnnrrrrrrrrrrrrrrrr_case_0
694      : public ClassDecoder {
695  public:
STM_User_registers_cccc100pu100nnnnrrrrrrrrrrrrrrrr_case_0()696   STM_User_registers_cccc100pu100nnnnrrrrrrrrrrrrrrrr_case_0()
697      : ClassDecoder() {}
698   virtual RegisterList defs(Instruction inst) const;
699   virtual SafetyLevel safety(Instruction i) const;
700   virtual RegisterList uses(Instruction i) const;
701  private:
702   NACL_DISALLOW_COPY_AND_ASSIGN(
703       STM_User_registers_cccc100pu100nnnnrrrrrrrrrrrrrrrr_case_0);
704 };
705 
706 // STRBT_A1_cccc0100u110nnnnttttiiiiiiiiiiii_case_0:
707 //
708 //   {defs: {},
709 //    pattern: cccc0100u110nnnnttttiiiiiiiiiiii,
710 //    rule: STRBT_A1,
711 //    safety: [true => FORBIDDEN],
712 //    true: true,
713 //    uses: {}}
714 class STRBT_A1_cccc0100u110nnnnttttiiiiiiiiiiii_case_0
715      : public ClassDecoder {
716  public:
STRBT_A1_cccc0100u110nnnnttttiiiiiiiiiiii_case_0()717   STRBT_A1_cccc0100u110nnnnttttiiiiiiiiiiii_case_0()
718      : ClassDecoder() {}
719   virtual RegisterList defs(Instruction inst) const;
720   virtual SafetyLevel safety(Instruction i) const;
721   virtual RegisterList uses(Instruction i) const;
722  private:
723   NACL_DISALLOW_COPY_AND_ASSIGN(
724       STRBT_A1_cccc0100u110nnnnttttiiiiiiiiiiii_case_0);
725 };
726 
727 // STRBT_A2_cccc0110u110nnnnttttiiiiitt0mmmm_case_0:
728 //
729 //   {defs: {},
730 //    pattern: cccc0110u110nnnnttttiiiiitt0mmmm,
731 //    rule: STRBT_A2,
732 //    safety: [true => FORBIDDEN],
733 //    true: true,
734 //    uses: {}}
735 class STRBT_A2_cccc0110u110nnnnttttiiiiitt0mmmm_case_0
736      : public ClassDecoder {
737  public:
STRBT_A2_cccc0110u110nnnnttttiiiiitt0mmmm_case_0()738   STRBT_A2_cccc0110u110nnnnttttiiiiitt0mmmm_case_0()
739      : ClassDecoder() {}
740   virtual RegisterList defs(Instruction inst) const;
741   virtual SafetyLevel safety(Instruction i) const;
742   virtual RegisterList uses(Instruction i) const;
743  private:
744   NACL_DISALLOW_COPY_AND_ASSIGN(
745       STRBT_A2_cccc0110u110nnnnttttiiiiitt0mmmm_case_0);
746 };
747 
748 // STRB_immediate_cccc010pu1w0nnnnttttiiiiiiiiiiii_case_0:
749 //
750 //   {None: 32,
751 //    P: P(24),
752 //    Pc: 15,
753 //    Rn: Rn(19:16),
754 //    Rt: Rt(15:12),
755 //    U: U(23),
756 //    W: W(21),
757 //    add: U(23)=1,
758 //    base: Rn,
759 //    cond: cond(31:28),
760 //    defs: {base
761 //         if wback
762 //         else None},
763 //    fields: [cond(31:28),
764 //      P(24),
765 //      U(23),
766 //      W(21),
767 //      Rn(19:16),
768 //      Rt(15:12),
769 //      imm12(11:0)],
770 //    imm12: imm12(11:0),
771 //    imm32: ZeroExtend(imm12, 32),
772 //    index: P(24)=1,
773 //    pattern: cccc010pu1w0nnnnttttiiiiiiiiiiii,
774 //    rule: STRB_immediate,
775 //    safety: [P(24)=0 &&
776 //         W(21)=1 => DECODER_ERROR,
777 //      Rt  ==
778 //            Pc => UNPREDICTABLE,
779 //      wback &&
780 //         (Rn  ==
781 //            Pc ||
782 //         Rn  ==
783 //            Rt) => UNPREDICTABLE],
784 //    small_imm_base_wb: wback,
785 //    uses: {Rn, Rt},
786 //    violations: [implied by 'base'],
787 //    wback: P(24)=0 ||
788 //         W(21)=1}
789 class STRB_immediate_cccc010pu1w0nnnnttttiiiiiiiiiiii_case_0
790      : public ClassDecoder {
791  public:
STRB_immediate_cccc010pu1w0nnnnttttiiiiiiiiiiii_case_0()792   STRB_immediate_cccc010pu1w0nnnnttttiiiiiiiiiiii_case_0()
793      : ClassDecoder() {}
794   virtual Register base_address_register(Instruction i) const;
795   virtual RegisterList defs(Instruction inst) const;
796   virtual SafetyLevel safety(Instruction i) const;
797   virtual bool base_address_register_writeback_small_immediate(
798       Instruction i) const;
799   virtual RegisterList uses(Instruction i) const;
800   virtual ViolationSet get_violations(
801       const nacl_arm_val::DecodedInstruction& first,
802       const nacl_arm_val::DecodedInstruction& second,
803       const nacl_arm_val::SfiValidator& sfi,
804       nacl_arm_val::AddressSet* branches,
805       nacl_arm_val::AddressSet* critical,
806       uint32_t* next_inst_addr) const;
807  private:
808   NACL_DISALLOW_COPY_AND_ASSIGN(
809       STRB_immediate_cccc010pu1w0nnnnttttiiiiiiiiiiii_case_0);
810 };
811 
812 // STRB_register_cccc011pu1w0nnnnttttiiiiitt0mmmm_case_0:
813 //
814 //   {None: 32,
815 //    P: P(24),
816 //    Pc: 15,
817 //    Rm: Rm(3:0),
818 //    Rn: Rn(19:16),
819 //    Rt: Rt(15:12),
820 //    U: U(23),
821 //    W: W(21),
822 //    add: U(23)=1,
823 //    base: Rn,
824 //    cond: cond(31:28),
825 //    defs: {base
826 //         if wback
827 //         else None},
828 //    fields: [cond(31:28),
829 //      P(24),
830 //      U(23),
831 //      W(21),
832 //      Rn(19:16),
833 //      Rt(15:12),
834 //      imm5(11:7),
835 //      type(6:5),
836 //      Rm(3:0)],
837 //    imm5: imm5(11:7),
838 //    index: P(24)=1,
839 //    pattern: cccc011pu1w0nnnnttttiiiiitt0mmmm,
840 //    rule: STRB_register,
841 //    safety: [P(24)=0 &&
842 //         W(21)=1 => DECODER_ERROR,
843 //      Pc in {Rm, Rt} => UNPREDICTABLE,
844 //      wback &&
845 //         (Rn  ==
846 //            Pc ||
847 //         Rn  ==
848 //            Rt) => UNPREDICTABLE,
849 //      ArchVersion()  <
850 //            6 &&
851 //         wback &&
852 //         Rn  ==
853 //            Rm => UNPREDICTABLE,
854 //      index => FORBIDDEN],
855 //    shift: DecodeImmShift(type, imm5),
856 //    type: type(6:5),
857 //    uses: {Rm, Rn, Rt},
858 //    violations: [implied by 'base'],
859 //    wback: P(24)=0 ||
860 //         W(21)=1}
861 class STRB_register_cccc011pu1w0nnnnttttiiiiitt0mmmm_case_0
862      : public ClassDecoder {
863  public:
STRB_register_cccc011pu1w0nnnnttttiiiiitt0mmmm_case_0()864   STRB_register_cccc011pu1w0nnnnttttiiiiitt0mmmm_case_0()
865      : ClassDecoder() {}
866   virtual Register base_address_register(Instruction i) const;
867   virtual RegisterList defs(Instruction inst) const;
868   virtual SafetyLevel safety(Instruction i) const;
869   virtual RegisterList uses(Instruction i) const;
870   virtual ViolationSet get_violations(
871       const nacl_arm_val::DecodedInstruction& first,
872       const nacl_arm_val::DecodedInstruction& second,
873       const nacl_arm_val::SfiValidator& sfi,
874       nacl_arm_val::AddressSet* branches,
875       nacl_arm_val::AddressSet* critical,
876       uint32_t* next_inst_addr) const;
877  private:
878   NACL_DISALLOW_COPY_AND_ASSIGN(
879       STRB_register_cccc011pu1w0nnnnttttiiiiitt0mmmm_case_0);
880 };
881 
882 // STRD_immediate_cccc000pu1w0nnnnttttiiii1111iiii_case_0:
883 //
884 //   {None: 32,
885 //    P: P(24),
886 //    Pc: 15,
887 //    Rn: Rn(19:16),
888 //    Rt: Rt(15:12),
889 //    Rt2: Rt + 1,
890 //    U: U(23),
891 //    W: W(21),
892 //    add: U(23)=1,
893 //    address: offset_addr
894 //         if index
895 //         else Rn,
896 //    base: Rn,
897 //    cond: cond(31:28),
898 //    defs: {base
899 //         if wback
900 //         else None},
901 //    fields: [cond(31:28),
902 //      P(24),
903 //      U(23),
904 //      W(21),
905 //      Rn(19:16),
906 //      Rt(15:12),
907 //      imm4H(11:8),
908 //      imm4L(3:0)],
909 //    imm32: ZeroExtend(imm4H:imm4L, 32),
910 //    imm4H: imm4H(11:8),
911 //    imm4L: imm4L(3:0),
912 //    index: P(24)=1,
913 //    offset_addr: Rn + imm32
914 //         if add
915 //         else Rn - imm32,
916 //    pattern: cccc000pu1w0nnnnttttiiii1111iiii,
917 //    rule: STRD_immediate,
918 //    safety: [Rt(0)=1 => UNPREDICTABLE,
919 //      P(24)=0 &&
920 //         W(21)=1 => UNPREDICTABLE,
921 //      wback &&
922 //         (Rn  ==
923 //            Pc ||
924 //         Rn  ==
925 //            Rt ||
926 //         Rn  ==
927 //            Rt2) => UNPREDICTABLE,
928 //      Rt2  ==
929 //            Pc => UNPREDICTABLE],
930 //    small_imm_base_wb: wback,
931 //    uses: {Rt, Rt2, Rn},
932 //    violations: [implied by 'base'],
933 //    wback: (P(24)=0) ||
934 //         (W(21)=1)}
935 class STRD_immediate_cccc000pu1w0nnnnttttiiii1111iiii_case_0
936      : public ClassDecoder {
937  public:
STRD_immediate_cccc000pu1w0nnnnttttiiii1111iiii_case_0()938   STRD_immediate_cccc000pu1w0nnnnttttiiii1111iiii_case_0()
939      : ClassDecoder() {}
940   virtual Register base_address_register(Instruction i) const;
941   virtual RegisterList defs(Instruction inst) const;
942   virtual SafetyLevel safety(Instruction i) const;
943   virtual bool base_address_register_writeback_small_immediate(
944       Instruction i) const;
945   virtual RegisterList uses(Instruction i) const;
946   virtual ViolationSet get_violations(
947       const nacl_arm_val::DecodedInstruction& first,
948       const nacl_arm_val::DecodedInstruction& second,
949       const nacl_arm_val::SfiValidator& sfi,
950       nacl_arm_val::AddressSet* branches,
951       nacl_arm_val::AddressSet* critical,
952       uint32_t* next_inst_addr) const;
953  private:
954   NACL_DISALLOW_COPY_AND_ASSIGN(
955       STRD_immediate_cccc000pu1w0nnnnttttiiii1111iiii_case_0);
956 };
957 
958 // STRD_register_cccc000pu0w0nnnntttt00001111mmmm_case_0:
959 //
960 //   {None: 32,
961 //    P: P(24),
962 //    Pc: 15,
963 //    Rm: Rm(3:0),
964 //    Rn: Rn(19:16),
965 //    Rt: Rt(15:12),
966 //    Rt2: Rt + 1,
967 //    U: U(23),
968 //    W: W(21),
969 //    add: U(23)=1,
970 //    base: Rn,
971 //    cond: cond(31:28),
972 //    defs: {base
973 //         if wback
974 //         else None},
975 //    fields: [cond(31:28),
976 //      P(24),
977 //      U(23),
978 //      W(21),
979 //      Rn(19:16),
980 //      Rt(15:12),
981 //      Rm(3:0)],
982 //    index: P(24)=1,
983 //    pattern: cccc000pu0w0nnnntttt00001111mmmm,
984 //    rule: STRD_register,
985 //    safety: [Rt(0)=1 => UNPREDICTABLE,
986 //      P(24)=0 &&
987 //         W(21)=1 => UNPREDICTABLE,
988 //      Rt2  ==
989 //            Pc ||
990 //         Rm  ==
991 //            Pc => UNPREDICTABLE,
992 //      wback &&
993 //         (Rn  ==
994 //            Pc ||
995 //         Rn  ==
996 //            Rt ||
997 //         Rn  ==
998 //            Rt2) => UNPREDICTABLE,
999 //      ArchVersion()  <
1000 //            6 &&
1001 //         wback &&
1002 //         Rm  ==
1003 //            Rn => UNPREDICTABLE,
1004 //      index => FORBIDDEN],
1005 //    uses: {Rt, Rt2, Rn, Rm},
1006 //    violations: [implied by 'base'],
1007 //    wback: (P(24)=0) ||
1008 //         (W(21)=1)}
1009 class STRD_register_cccc000pu0w0nnnntttt00001111mmmm_case_0
1010      : public ClassDecoder {
1011  public:
STRD_register_cccc000pu0w0nnnntttt00001111mmmm_case_0()1012   STRD_register_cccc000pu0w0nnnntttt00001111mmmm_case_0()
1013      : ClassDecoder() {}
1014   virtual Register base_address_register(Instruction i) const;
1015   virtual RegisterList defs(Instruction inst) const;
1016   virtual SafetyLevel safety(Instruction i) const;
1017   virtual RegisterList uses(Instruction i) const;
1018   virtual ViolationSet get_violations(
1019       const nacl_arm_val::DecodedInstruction& first,
1020       const nacl_arm_val::DecodedInstruction& second,
1021       const nacl_arm_val::SfiValidator& sfi,
1022       nacl_arm_val::AddressSet* branches,
1023       nacl_arm_val::AddressSet* critical,
1024       uint32_t* next_inst_addr) const;
1025  private:
1026   NACL_DISALLOW_COPY_AND_ASSIGN(
1027       STRD_register_cccc000pu0w0nnnntttt00001111mmmm_case_0);
1028 };
1029 
1030 // STREXB_cccc00011100nnnndddd11111001tttt_case_0:
1031 //
1032 //   {Pc: 15,
1033 //    Rd: Rd(15:12),
1034 //    Rn: Rn(19:16),
1035 //    Rt: Rt(3:0),
1036 //    arch: v6K,
1037 //    base: Rn,
1038 //    cond: cond(31:28),
1039 //    defs: {Rd},
1040 //    fields: [cond(31:28), Rn(19:16), Rd(15:12), Rt(3:0)],
1041 //    imm32: Zeros((32)),
1042 //    pattern: cccc00011100nnnndddd11111001tttt,
1043 //    rule: STREXB,
1044 //    safety: [Pc in {Rd, Rt, Rn} => UNPREDICTABLE,
1045 //      Rd in {Rn, Rt} => UNPREDICTABLE],
1046 //    uses: {Rn, Rt},
1047 //    violations: [implied by 'base']}
1048 class STREXB_cccc00011100nnnndddd11111001tttt_case_0
1049      : public ClassDecoder {
1050  public:
STREXB_cccc00011100nnnndddd11111001tttt_case_0()1051   STREXB_cccc00011100nnnndddd11111001tttt_case_0()
1052      : ClassDecoder() {}
1053   virtual Register base_address_register(Instruction i) const;
1054   virtual RegisterList defs(Instruction inst) const;
1055   virtual SafetyLevel safety(Instruction i) const;
1056   virtual RegisterList uses(Instruction i) const;
1057   virtual ViolationSet get_violations(
1058       const nacl_arm_val::DecodedInstruction& first,
1059       const nacl_arm_val::DecodedInstruction& second,
1060       const nacl_arm_val::SfiValidator& sfi,
1061       nacl_arm_val::AddressSet* branches,
1062       nacl_arm_val::AddressSet* critical,
1063       uint32_t* next_inst_addr) const;
1064  private:
1065   NACL_DISALLOW_COPY_AND_ASSIGN(
1066       STREXB_cccc00011100nnnndddd11111001tttt_case_0);
1067 };
1068 
1069 // STREXD_cccc00011010nnnndddd11111001tttt_case_0:
1070 //
1071 //   {Lr: 14,
1072 //    Pc: 15,
1073 //    Rd: Rd(15:12),
1074 //    Rn: Rn(19:16),
1075 //    Rt: Rt(3:0),
1076 //    Rt2: Rt + 1,
1077 //    arch: v6K,
1078 //    base: Rn,
1079 //    cond: cond(31:28),
1080 //    defs: {Rd},
1081 //    fields: [cond(31:28), Rn(19:16), Rd(15:12), Rt(3:0)],
1082 //    imm32: Zeros((32)),
1083 //    pattern: cccc00011010nnnndddd11111001tttt,
1084 //    rule: STREXD,
1085 //    safety: [Pc in {Rd, Rn} ||
1086 //         Rt(0)=1 ||
1087 //         Rt  ==
1088 //            Lr => UNPREDICTABLE,
1089 //      Rd in {Rn, Rt, Rt2} => UNPREDICTABLE],
1090 //    uses: {Rn, Rt, Rt2},
1091 //    violations: [implied by 'base']}
1092 class STREXD_cccc00011010nnnndddd11111001tttt_case_0
1093      : public ClassDecoder {
1094  public:
STREXD_cccc00011010nnnndddd11111001tttt_case_0()1095   STREXD_cccc00011010nnnndddd11111001tttt_case_0()
1096      : ClassDecoder() {}
1097   virtual Register base_address_register(Instruction i) const;
1098   virtual RegisterList defs(Instruction inst) const;
1099   virtual SafetyLevel safety(Instruction i) const;
1100   virtual RegisterList uses(Instruction i) const;
1101   virtual ViolationSet get_violations(
1102       const nacl_arm_val::DecodedInstruction& first,
1103       const nacl_arm_val::DecodedInstruction& second,
1104       const nacl_arm_val::SfiValidator& sfi,
1105       nacl_arm_val::AddressSet* branches,
1106       nacl_arm_val::AddressSet* critical,
1107       uint32_t* next_inst_addr) const;
1108  private:
1109   NACL_DISALLOW_COPY_AND_ASSIGN(
1110       STREXD_cccc00011010nnnndddd11111001tttt_case_0);
1111 };
1112 
1113 // STREXH_cccc00011110nnnndddd11111001tttt_case_0:
1114 //
1115 //   {Pc: 15,
1116 //    Rd: Rd(15:12),
1117 //    Rn: Rn(19:16),
1118 //    Rt: Rt(3:0),
1119 //    arch: v6K,
1120 //    base: Rn,
1121 //    cond: cond(31:28),
1122 //    defs: {Rd},
1123 //    fields: [cond(31:28), Rn(19:16), Rd(15:12), Rt(3:0)],
1124 //    imm32: Zeros((32)),
1125 //    pattern: cccc00011110nnnndddd11111001tttt,
1126 //    rule: STREXH,
1127 //    safety: [Pc in {Rd, Rt, Rn} => UNPREDICTABLE,
1128 //      Rd in {Rn, Rt} => UNPREDICTABLE],
1129 //    uses: {Rn, Rt},
1130 //    violations: [implied by 'base']}
1131 class STREXH_cccc00011110nnnndddd11111001tttt_case_0
1132      : public ClassDecoder {
1133  public:
STREXH_cccc00011110nnnndddd11111001tttt_case_0()1134   STREXH_cccc00011110nnnndddd11111001tttt_case_0()
1135      : ClassDecoder() {}
1136   virtual Register base_address_register(Instruction i) const;
1137   virtual RegisterList defs(Instruction inst) const;
1138   virtual SafetyLevel safety(Instruction i) const;
1139   virtual RegisterList uses(Instruction i) const;
1140   virtual ViolationSet get_violations(
1141       const nacl_arm_val::DecodedInstruction& first,
1142       const nacl_arm_val::DecodedInstruction& second,
1143       const nacl_arm_val::SfiValidator& sfi,
1144       nacl_arm_val::AddressSet* branches,
1145       nacl_arm_val::AddressSet* critical,
1146       uint32_t* next_inst_addr) const;
1147  private:
1148   NACL_DISALLOW_COPY_AND_ASSIGN(
1149       STREXH_cccc00011110nnnndddd11111001tttt_case_0);
1150 };
1151 
1152 // STREXH_cccc00011111nnnntttt111110011111_case_0:
1153 //
1154 //   {Pc: 15,
1155 //    Rn: Rn(19:16),
1156 //    Rt: Rt(15:12),
1157 //    arch: v6K,
1158 //    base: Rn,
1159 //    cond: cond(31:28),
1160 //    defs: {Rt},
1161 //    fields: [cond(31:28), Rn(19:16), Rt(15:12)],
1162 //    imm32: Zeros((32)),
1163 //    pattern: cccc00011111nnnntttt111110011111,
1164 //    rule: STREXH,
1165 //    safety: [Pc in {Rt, Rn} => UNPREDICTABLE],
1166 //    uses: {Rn},
1167 //    violations: [implied by 'base']}
1168 class STREXH_cccc00011111nnnntttt111110011111_case_0
1169      : public ClassDecoder {
1170  public:
STREXH_cccc00011111nnnntttt111110011111_case_0()1171   STREXH_cccc00011111nnnntttt111110011111_case_0()
1172      : ClassDecoder() {}
1173   virtual Register base_address_register(Instruction i) const;
1174   virtual RegisterList defs(Instruction inst) const;
1175   virtual SafetyLevel safety(Instruction i) const;
1176   virtual RegisterList uses(Instruction i) const;
1177   virtual ViolationSet get_violations(
1178       const nacl_arm_val::DecodedInstruction& first,
1179       const nacl_arm_val::DecodedInstruction& second,
1180       const nacl_arm_val::SfiValidator& sfi,
1181       nacl_arm_val::AddressSet* branches,
1182       nacl_arm_val::AddressSet* critical,
1183       uint32_t* next_inst_addr) const;
1184  private:
1185   NACL_DISALLOW_COPY_AND_ASSIGN(
1186       STREXH_cccc00011111nnnntttt111110011111_case_0);
1187 };
1188 
1189 // STREX_cccc00011000nnnndddd11111001tttt_case_0:
1190 //
1191 //   {Pc: 15,
1192 //    Rd: Rd(15:12),
1193 //    Rn: Rn(19:16),
1194 //    Rt: Rt(3:0),
1195 //    arch: v6,
1196 //    base: Rn,
1197 //    cond: cond(31:28),
1198 //    defs: {Rd},
1199 //    fields: [cond(31:28), Rn(19:16), Rd(15:12), Rt(3:0)],
1200 //    imm32: Zeros((32)),
1201 //    pattern: cccc00011000nnnndddd11111001tttt,
1202 //    rule: STREX,
1203 //    safety: [Pc in {Rd, Rt, Rn} => UNPREDICTABLE,
1204 //      Rd in {Rn, Rt} => UNPREDICTABLE],
1205 //    uses: {Rn, Rt},
1206 //    violations: [implied by 'base']}
1207 class STREX_cccc00011000nnnndddd11111001tttt_case_0
1208      : public ClassDecoder {
1209  public:
STREX_cccc00011000nnnndddd11111001tttt_case_0()1210   STREX_cccc00011000nnnndddd11111001tttt_case_0()
1211      : ClassDecoder() {}
1212   virtual Register base_address_register(Instruction i) const;
1213   virtual RegisterList defs(Instruction inst) const;
1214   virtual SafetyLevel safety(Instruction i) const;
1215   virtual RegisterList uses(Instruction i) const;
1216   virtual ViolationSet get_violations(
1217       const nacl_arm_val::DecodedInstruction& first,
1218       const nacl_arm_val::DecodedInstruction& second,
1219       const nacl_arm_val::SfiValidator& sfi,
1220       nacl_arm_val::AddressSet* branches,
1221       nacl_arm_val::AddressSet* critical,
1222       uint32_t* next_inst_addr) const;
1223  private:
1224   NACL_DISALLOW_COPY_AND_ASSIGN(
1225       STREX_cccc00011000nnnndddd11111001tttt_case_0);
1226 };
1227 
1228 // STRH_immediate_cccc000pu1w0nnnnttttiiii1011iiii_case_0:
1229 //
1230 //   {None: 32,
1231 //    P: P(24),
1232 //    Pc: 15,
1233 //    Rn: Rn(19:16),
1234 //    Rt: Rt(15:12),
1235 //    U: U(23),
1236 //    W: W(21),
1237 //    add: U(23)=1,
1238 //    address: offset_addr
1239 //         if index
1240 //         else Rn,
1241 //    base: Rn,
1242 //    cond: cond(31:28),
1243 //    defs: {base
1244 //         if wback
1245 //         else None},
1246 //    fields: [cond(31:28),
1247 //      P(24),
1248 //      U(23),
1249 //      W(21),
1250 //      Rn(19:16),
1251 //      Rt(15:12),
1252 //      imm4H(11:8),
1253 //      imm4L(3:0)],
1254 //    imm32: ZeroExtend(imm4H:imm4L, 32),
1255 //    imm4H: imm4H(11:8),
1256 //    imm4L: imm4L(3:0),
1257 //    index: P(24)=1,
1258 //    offset_addr: Rn + imm32
1259 //         if add
1260 //         else Rn - imm32,
1261 //    pattern: cccc000pu1w0nnnnttttiiii1011iiii,
1262 //    rule: STRH_immediate,
1263 //    safety: [P(24)=0 &&
1264 //         W(21)=1 => DECODER_ERROR,
1265 //      Rt  ==
1266 //            Pc => UNPREDICTABLE,
1267 //      wback &&
1268 //         (Rn  ==
1269 //            Pc ||
1270 //         Rn  ==
1271 //            Rt) => UNPREDICTABLE],
1272 //    small_imm_base_wb: wback,
1273 //    uses: {Rt, Rn},
1274 //    violations: [implied by 'base'],
1275 //    wback: (P(24)=0) ||
1276 //         (W(21)=1)}
1277 class STRH_immediate_cccc000pu1w0nnnnttttiiii1011iiii_case_0
1278      : public ClassDecoder {
1279  public:
STRH_immediate_cccc000pu1w0nnnnttttiiii1011iiii_case_0()1280   STRH_immediate_cccc000pu1w0nnnnttttiiii1011iiii_case_0()
1281      : ClassDecoder() {}
1282   virtual Register base_address_register(Instruction i) const;
1283   virtual RegisterList defs(Instruction inst) const;
1284   virtual SafetyLevel safety(Instruction i) const;
1285   virtual bool base_address_register_writeback_small_immediate(
1286       Instruction i) const;
1287   virtual RegisterList uses(Instruction i) const;
1288   virtual ViolationSet get_violations(
1289       const nacl_arm_val::DecodedInstruction& first,
1290       const nacl_arm_val::DecodedInstruction& second,
1291       const nacl_arm_val::SfiValidator& sfi,
1292       nacl_arm_val::AddressSet* branches,
1293       nacl_arm_val::AddressSet* critical,
1294       uint32_t* next_inst_addr) const;
1295  private:
1296   NACL_DISALLOW_COPY_AND_ASSIGN(
1297       STRH_immediate_cccc000pu1w0nnnnttttiiii1011iiii_case_0);
1298 };
1299 
1300 // STRH_register_cccc000pu0w0nnnntttt00001011mmmm_case_0:
1301 //
1302 //   {None: 32,
1303 //    P: P(24),
1304 //    Pc: 15,
1305 //    Rm: Rm(3:0),
1306 //    Rn: Rn(19:16),
1307 //    Rt: Rt(15:12),
1308 //    U: U(23),
1309 //    W: W(21),
1310 //    add: U(23)=1,
1311 //    base: Rn,
1312 //    cond: cond(31:28),
1313 //    defs: {base
1314 //         if wback
1315 //         else None},
1316 //    fields: [cond(31:28),
1317 //      P(24),
1318 //      U(23),
1319 //      W(21),
1320 //      Rn(19:16),
1321 //      Rt(15:12),
1322 //      Rm(3:0)],
1323 //    index: P(24)=1,
1324 //    pattern: cccc000pu0w0nnnntttt00001011mmmm,
1325 //    rule: STRH_register,
1326 //    safety: [P(24)=0 &&
1327 //         W(21)=1 => DECODER_ERROR,
1328 //      Pc in {Rt, Rm} => UNPREDICTABLE,
1329 //      wback &&
1330 //         (Rn  ==
1331 //            Pc ||
1332 //         Rn  ==
1333 //            Rt) => UNPREDICTABLE,
1334 //      ArchVersion()  <
1335 //            6 &&
1336 //         wback &&
1337 //         Rm  ==
1338 //            Rn => UNPREDICTABLE,
1339 //      index => FORBIDDEN],
1340 //    shift_n: 0,
1341 //    shift_t: SRType_LSL(),
1342 //    uses: {Rt, Rn, Rm},
1343 //    violations: [implied by 'base'],
1344 //    wback: (P(24)=0) ||
1345 //         (W(21)=1)}
1346 class STRH_register_cccc000pu0w0nnnntttt00001011mmmm_case_0
1347      : public ClassDecoder {
1348  public:
STRH_register_cccc000pu0w0nnnntttt00001011mmmm_case_0()1349   STRH_register_cccc000pu0w0nnnntttt00001011mmmm_case_0()
1350      : ClassDecoder() {}
1351   virtual Register base_address_register(Instruction i) const;
1352   virtual RegisterList defs(Instruction inst) const;
1353   virtual SafetyLevel safety(Instruction i) const;
1354   virtual RegisterList uses(Instruction i) const;
1355   virtual ViolationSet get_violations(
1356       const nacl_arm_val::DecodedInstruction& first,
1357       const nacl_arm_val::DecodedInstruction& second,
1358       const nacl_arm_val::SfiValidator& sfi,
1359       nacl_arm_val::AddressSet* branches,
1360       nacl_arm_val::AddressSet* critical,
1361       uint32_t* next_inst_addr) const;
1362  private:
1363   NACL_DISALLOW_COPY_AND_ASSIGN(
1364       STRH_register_cccc000pu0w0nnnntttt00001011mmmm_case_0);
1365 };
1366 
1367 // STRT_A1_cccc0100u010nnnnttttiiiiiiiiiiii_case_0:
1368 //
1369 //   {defs: {},
1370 //    pattern: cccc0100u010nnnnttttiiiiiiiiiiii,
1371 //    rule: STRT_A1,
1372 //    safety: [true => FORBIDDEN],
1373 //    true: true,
1374 //    uses: {}}
1375 class STRT_A1_cccc0100u010nnnnttttiiiiiiiiiiii_case_0
1376      : public ClassDecoder {
1377  public:
STRT_A1_cccc0100u010nnnnttttiiiiiiiiiiii_case_0()1378   STRT_A1_cccc0100u010nnnnttttiiiiiiiiiiii_case_0()
1379      : ClassDecoder() {}
1380   virtual RegisterList defs(Instruction inst) const;
1381   virtual SafetyLevel safety(Instruction i) const;
1382   virtual RegisterList uses(Instruction i) const;
1383  private:
1384   NACL_DISALLOW_COPY_AND_ASSIGN(
1385       STRT_A1_cccc0100u010nnnnttttiiiiiiiiiiii_case_0);
1386 };
1387 
1388 // STRT_A2_cccc0110u010nnnnttttiiiiitt0mmmm_case_0:
1389 //
1390 //   {defs: {},
1391 //    pattern: cccc0110u010nnnnttttiiiiitt0mmmm,
1392 //    rule: STRT_A2,
1393 //    safety: [true => FORBIDDEN],
1394 //    true: true,
1395 //    uses: {}}
1396 class STRT_A2_cccc0110u010nnnnttttiiiiitt0mmmm_case_0
1397      : public ClassDecoder {
1398  public:
STRT_A2_cccc0110u010nnnnttttiiiiitt0mmmm_case_0()1399   STRT_A2_cccc0110u010nnnnttttiiiiitt0mmmm_case_0()
1400      : ClassDecoder() {}
1401   virtual RegisterList defs(Instruction inst) const;
1402   virtual SafetyLevel safety(Instruction i) const;
1403   virtual RegisterList uses(Instruction i) const;
1404  private:
1405   NACL_DISALLOW_COPY_AND_ASSIGN(
1406       STRT_A2_cccc0110u010nnnnttttiiiiitt0mmmm_case_0);
1407 };
1408 
1409 // STR_immediate_cccc010pu0w0nnnnttttiiiiiiiiiiii_case_0:
1410 //
1411 //   {None: 32,
1412 //    P: P(24),
1413 //    Pc: 15,
1414 //    Rn: Rn(19:16),
1415 //    Rt: Rt(15:12),
1416 //    U: U(23),
1417 //    W: W(21),
1418 //    add: U(23)=1,
1419 //    base: Rn,
1420 //    cond: cond(31:28),
1421 //    defs: {base
1422 //         if wback
1423 //         else None},
1424 //    fields: [cond(31:28),
1425 //      P(24),
1426 //      U(23),
1427 //      W(21),
1428 //      Rn(19:16),
1429 //      Rt(15:12),
1430 //      imm12(11:0)],
1431 //    imm12: imm12(11:0),
1432 //    imm32: ZeroExtend(imm12, 32),
1433 //    index: P(24)=1,
1434 //    pattern: cccc010pu0w0nnnnttttiiiiiiiiiiii,
1435 //    rule: STR_immediate,
1436 //    safety: [P(24)=0 &&
1437 //         W(21)=1 => DECODER_ERROR,
1438 //      wback &&
1439 //         (Rn  ==
1440 //            Pc ||
1441 //         Rn  ==
1442 //            Rt) => UNPREDICTABLE],
1443 //    small_imm_base_wb: wback,
1444 //    uses: {Rn, Rt},
1445 //    violations: [implied by 'base'],
1446 //    wback: P(24)=0 ||
1447 //         W(21)=1}
1448 class STR_immediate_cccc010pu0w0nnnnttttiiiiiiiiiiii_case_0
1449      : public ClassDecoder {
1450  public:
STR_immediate_cccc010pu0w0nnnnttttiiiiiiiiiiii_case_0()1451   STR_immediate_cccc010pu0w0nnnnttttiiiiiiiiiiii_case_0()
1452      : ClassDecoder() {}
1453   virtual Register base_address_register(Instruction i) const;
1454   virtual RegisterList defs(Instruction inst) const;
1455   virtual SafetyLevel safety(Instruction i) const;
1456   virtual bool base_address_register_writeback_small_immediate(
1457       Instruction i) const;
1458   virtual RegisterList uses(Instruction i) const;
1459   virtual ViolationSet get_violations(
1460       const nacl_arm_val::DecodedInstruction& first,
1461       const nacl_arm_val::DecodedInstruction& second,
1462       const nacl_arm_val::SfiValidator& sfi,
1463       nacl_arm_val::AddressSet* branches,
1464       nacl_arm_val::AddressSet* critical,
1465       uint32_t* next_inst_addr) const;
1466  private:
1467   NACL_DISALLOW_COPY_AND_ASSIGN(
1468       STR_immediate_cccc010pu0w0nnnnttttiiiiiiiiiiii_case_0);
1469 };
1470 
1471 // STR_register_cccc011pd0w0nnnnttttiiiiitt0mmmm_case_0:
1472 //
1473 //   {None: 32,
1474 //    P: P(24),
1475 //    Pc: 15,
1476 //    Rm: Rm(3:0),
1477 //    Rn: Rn(19:16),
1478 //    Rt: Rt(15:12),
1479 //    U: U(23),
1480 //    W: W(21),
1481 //    add: U(23)=1,
1482 //    base: Rn,
1483 //    cond: cond(31:28),
1484 //    defs: {base
1485 //         if wback
1486 //         else None},
1487 //    fields: [cond(31:28),
1488 //      P(24),
1489 //      U(23),
1490 //      W(21),
1491 //      Rn(19:16),
1492 //      Rt(15:12),
1493 //      imm5(11:7),
1494 //      type(6:5),
1495 //      Rm(3:0)],
1496 //    imm5: imm5(11:7),
1497 //    index: P(24)=1,
1498 //    pattern: cccc011pd0w0nnnnttttiiiiitt0mmmm,
1499 //    rule: STR_register,
1500 //    safety: [P(24)=0 &&
1501 //         W(21)=1 => DECODER_ERROR,
1502 //      Rm  ==
1503 //            Pc => UNPREDICTABLE,
1504 //      wback &&
1505 //         (Rn  ==
1506 //            Pc ||
1507 //         Rn  ==
1508 //            Rt) => UNPREDICTABLE,
1509 //      ArchVersion()  <
1510 //            6 &&
1511 //         wback &&
1512 //         Rn  ==
1513 //            Rm => UNPREDICTABLE,
1514 //      index => FORBIDDEN],
1515 //    shift: DecodeImmShift(type, imm5),
1516 //    type: type(6:5),
1517 //    uses: {Rm, Rn, Rt},
1518 //    violations: [implied by 'base'],
1519 //    wback: P(24)=0 ||
1520 //         W(21)=1}
1521 class STR_register_cccc011pd0w0nnnnttttiiiiitt0mmmm_case_0
1522      : public ClassDecoder {
1523  public:
STR_register_cccc011pd0w0nnnnttttiiiiitt0mmmm_case_0()1524   STR_register_cccc011pd0w0nnnnttttiiiiitt0mmmm_case_0()
1525      : ClassDecoder() {}
1526   virtual Register base_address_register(Instruction i) const;
1527   virtual RegisterList defs(Instruction inst) const;
1528   virtual SafetyLevel safety(Instruction i) const;
1529   virtual RegisterList uses(Instruction i) const;
1530   virtual ViolationSet get_violations(
1531       const nacl_arm_val::DecodedInstruction& first,
1532       const nacl_arm_val::DecodedInstruction& second,
1533       const nacl_arm_val::SfiValidator& sfi,
1534       nacl_arm_val::AddressSet* branches,
1535       nacl_arm_val::AddressSet* critical,
1536       uint32_t* next_inst_addr) const;
1537  private:
1538   NACL_DISALLOW_COPY_AND_ASSIGN(
1539       STR_register_cccc011pd0w0nnnnttttiiiiitt0mmmm_case_0);
1540 };
1541 
1542 // SUB_immediate_cccc0010010snnnnddddiiiiiiiiiiii_case_0:
1543 //
1544 //   {NZCV: 16,
1545 //    None: 32,
1546 //    Rd: Rd(15:12),
1547 //    Rn: Rn(19:16),
1548 //    S: S(20),
1549 //    cond: cond(31:28),
1550 //    defs: {Rd, NZCV
1551 //         if setflags
1552 //         else None},
1553 //    fields: [cond(31:28), S(20), Rn(19:16), Rd(15:12), imm12(11:0)],
1554 //    imm12: imm12(11:0),
1555 //    imm32: ARMExpandImm(imm12),
1556 //    pattern: cccc0010010snnnnddddiiiiiiiiiiii,
1557 //    rule: SUB_immediate,
1558 //    safety: [(Rd(15:12)=1111 &&
1559 //         S(20)=1) => DECODER_ERROR,
1560 //      (Rn(19:16)=1111 &&
1561 //         S(20)=0) => DECODER_ERROR,
1562 //      Rd(15:12)=1111 => FORBIDDEN_OPERANDS],
1563 //    setflags: S(20)=1,
1564 //    uses: {Rn}}
1565 class SUB_immediate_cccc0010010snnnnddddiiiiiiiiiiii_case_0
1566      : public ClassDecoder {
1567  public:
SUB_immediate_cccc0010010snnnnddddiiiiiiiiiiii_case_0()1568   SUB_immediate_cccc0010010snnnnddddiiiiiiiiiiii_case_0()
1569      : ClassDecoder() {}
1570   virtual RegisterList defs(Instruction inst) const;
1571   virtual SafetyLevel safety(Instruction i) const;
1572   virtual RegisterList uses(Instruction i) const;
1573  private:
1574   NACL_DISALLOW_COPY_AND_ASSIGN(
1575       SUB_immediate_cccc0010010snnnnddddiiiiiiiiiiii_case_0);
1576 };
1577 
1578 // SUB_register_cccc0000010snnnnddddiiiiitt0mmmm_case_0:
1579 //
1580 //   {NZCV: 16,
1581 //    None: 32,
1582 //    Rd: Rd(15:12),
1583 //    Rm: Rm(3:0),
1584 //    Rn: Rn(19:16),
1585 //    S: S(20),
1586 //    cond: cond(31:28),
1587 //    defs: {Rd, NZCV
1588 //         if S
1589 //         else None},
1590 //    fields: [cond(31:28),
1591 //      S(20),
1592 //      Rn(19:16),
1593 //      Rd(15:12),
1594 //      imm5(11:7),
1595 //      type(6:5),
1596 //      Rm(3:0)],
1597 //    imm5: imm5(11:7),
1598 //    pattern: cccc0000010snnnnddddiiiiitt0mmmm,
1599 //    rule: SUB_register,
1600 //    safety: [(Rd(15:12)=1111 &&
1601 //         S(20)=1) => DECODER_ERROR,
1602 //      Rd(15:12)=1111 => FORBIDDEN_OPERANDS],
1603 //    shift: DecodeImmShift(type, imm5),
1604 //    type: type(6:5),
1605 //    uses: {Rn, Rm}}
1606 class SUB_register_cccc0000010snnnnddddiiiiitt0mmmm_case_0
1607      : public ClassDecoder {
1608  public:
SUB_register_cccc0000010snnnnddddiiiiitt0mmmm_case_0()1609   SUB_register_cccc0000010snnnnddddiiiiitt0mmmm_case_0()
1610      : ClassDecoder() {}
1611   virtual RegisterList defs(Instruction inst) const;
1612   virtual SafetyLevel safety(Instruction i) const;
1613   virtual RegisterList uses(Instruction i) const;
1614  private:
1615   NACL_DISALLOW_COPY_AND_ASSIGN(
1616       SUB_register_cccc0000010snnnnddddiiiiitt0mmmm_case_0);
1617 };
1618 
1619 // SUB_register_shifted_register_cccc0000010snnnnddddssss0tt1mmmm_case_0:
1620 //
1621 //   {NZCV: 16,
1622 //    None: 32,
1623 //    Pc: 15,
1624 //    Rd: Rd(15:12),
1625 //    Rm: Rm(3:0),
1626 //    Rn: Rn(19:16),
1627 //    Rs: Rs(11:8),
1628 //    S: S(20),
1629 //    cond: cond(31:28),
1630 //    defs: {Rd, NZCV
1631 //         if setflags
1632 //         else None},
1633 //    fields: [cond(31:28),
1634 //      S(20),
1635 //      Rn(19:16),
1636 //      Rd(15:12),
1637 //      Rs(11:8),
1638 //      type(6:5),
1639 //      Rm(3:0)],
1640 //    pattern: cccc0000010snnnnddddssss0tt1mmmm,
1641 //    rule: SUB_register_shifted_register,
1642 //    safety: [Pc in {Rn, Rd, Rm, Rs} => UNPREDICTABLE],
1643 //    setflags: S(20)=1,
1644 //    shift_t: DecodeRegShift(type),
1645 //    type: type(6:5),
1646 //    uses: {Rn, Rm, Rs}}
1647 class SUB_register_shifted_register_cccc0000010snnnnddddssss0tt1mmmm_case_0
1648      : public ClassDecoder {
1649  public:
SUB_register_shifted_register_cccc0000010snnnnddddssss0tt1mmmm_case_0()1650   SUB_register_shifted_register_cccc0000010snnnnddddssss0tt1mmmm_case_0()
1651      : ClassDecoder() {}
1652   virtual RegisterList defs(Instruction inst) const;
1653   virtual SafetyLevel safety(Instruction i) const;
1654   virtual RegisterList uses(Instruction i) const;
1655  private:
1656   NACL_DISALLOW_COPY_AND_ASSIGN(
1657       SUB_register_shifted_register_cccc0000010snnnnddddssss0tt1mmmm_case_0);
1658 };
1659 
1660 // SVC_cccc1111iiiiiiiiiiiiiiiiiiiiiiii_case_0:
1661 //
1662 //   {defs: {},
1663 //    pattern: cccc1111iiiiiiiiiiiiiiiiiiiiiiii,
1664 //    rule: SVC,
1665 //    safety: [true => FORBIDDEN],
1666 //    true: true,
1667 //    uses: {}}
1668 class SVC_cccc1111iiiiiiiiiiiiiiiiiiiiiiii_case_0
1669      : public ClassDecoder {
1670  public:
SVC_cccc1111iiiiiiiiiiiiiiiiiiiiiiii_case_0()1671   SVC_cccc1111iiiiiiiiiiiiiiiiiiiiiiii_case_0()
1672      : ClassDecoder() {}
1673   virtual RegisterList defs(Instruction inst) const;
1674   virtual SafetyLevel safety(Instruction i) const;
1675   virtual RegisterList uses(Instruction i) const;
1676  private:
1677   NACL_DISALLOW_COPY_AND_ASSIGN(
1678       SVC_cccc1111iiiiiiiiiiiiiiiiiiiiiiii_case_0);
1679 };
1680 
1681 // SWP_SWPB_cccc00010b00nnnntttt00001001tttt_case_0:
1682 //
1683 //   {defs: {},
1684 //    pattern: cccc00010b00nnnntttt00001001tttt,
1685 //    rule: SWP_SWPB,
1686 //    safety: [true => DEPRECATED],
1687 //    true: true,
1688 //    uses: {}}
1689 class SWP_SWPB_cccc00010b00nnnntttt00001001tttt_case_0
1690      : public ClassDecoder {
1691  public:
SWP_SWPB_cccc00010b00nnnntttt00001001tttt_case_0()1692   SWP_SWPB_cccc00010b00nnnntttt00001001tttt_case_0()
1693      : ClassDecoder() {}
1694   virtual RegisterList defs(Instruction inst) const;
1695   virtual SafetyLevel safety(Instruction i) const;
1696   virtual RegisterList uses(Instruction i) const;
1697  private:
1698   NACL_DISALLOW_COPY_AND_ASSIGN(
1699       SWP_SWPB_cccc00010b00nnnntttt00001001tttt_case_0);
1700 };
1701 
1702 // SXTAB16_cccc01101000nnnnddddrr000111mmmm_case_0:
1703 //
1704 //   {Pc: 15,
1705 //    Rd: Rd(15:12),
1706 //    Rm: Rm(3:0),
1707 //    Rn: Rn(19:16),
1708 //    arch: v6,
1709 //    cond: cond(31:28),
1710 //    defs: {Rd},
1711 //    fields: [cond(31:28), Rn(19:16), Rd(15:12), rotate(11:10), Rm(3:0)],
1712 //    pattern: cccc01101000nnnnddddrr000111mmmm,
1713 //    rotate: rotate(11:10),
1714 //    rotation: rotate:'000'(2:0),
1715 //    rule: SXTAB16,
1716 //    safety: [Rn(19:16)=1111 => DECODER_ERROR,
1717 //      Pc in {Rd, Rm} => UNPREDICTABLE],
1718 //    uses: {Rn, Rm}}
1719 class SXTAB16_cccc01101000nnnnddddrr000111mmmm_case_0
1720      : public ClassDecoder {
1721  public:
SXTAB16_cccc01101000nnnnddddrr000111mmmm_case_0()1722   SXTAB16_cccc01101000nnnnddddrr000111mmmm_case_0()
1723      : ClassDecoder() {}
1724   virtual RegisterList defs(Instruction inst) const;
1725   virtual SafetyLevel safety(Instruction i) const;
1726   virtual RegisterList uses(Instruction i) const;
1727  private:
1728   NACL_DISALLOW_COPY_AND_ASSIGN(
1729       SXTAB16_cccc01101000nnnnddddrr000111mmmm_case_0);
1730 };
1731 
1732 // SXTAB_cccc01101010nnnnddddrr000111mmmm_case_0:
1733 //
1734 //   {Pc: 15,
1735 //    Rd: Rd(15:12),
1736 //    Rm: Rm(3:0),
1737 //    Rn: Rn(19:16),
1738 //    arch: v6,
1739 //    cond: cond(31:28),
1740 //    defs: {Rd},
1741 //    fields: [cond(31:28), Rn(19:16), Rd(15:12), rotate(11:10), Rm(3:0)],
1742 //    pattern: cccc01101010nnnnddddrr000111mmmm,
1743 //    rotate: rotate(11:10),
1744 //    rotation: rotate:'000'(2:0),
1745 //    rule: SXTAB,
1746 //    safety: [Rn(19:16)=1111 => DECODER_ERROR,
1747 //      Pc in {Rd, Rm} => UNPREDICTABLE],
1748 //    uses: {Rn, Rm}}
1749 class SXTAB_cccc01101010nnnnddddrr000111mmmm_case_0
1750      : public ClassDecoder {
1751  public:
SXTAB_cccc01101010nnnnddddrr000111mmmm_case_0()1752   SXTAB_cccc01101010nnnnddddrr000111mmmm_case_0()
1753      : ClassDecoder() {}
1754   virtual RegisterList defs(Instruction inst) const;
1755   virtual SafetyLevel safety(Instruction i) const;
1756   virtual RegisterList uses(Instruction i) const;
1757  private:
1758   NACL_DISALLOW_COPY_AND_ASSIGN(
1759       SXTAB_cccc01101010nnnnddddrr000111mmmm_case_0);
1760 };
1761 
1762 // SXTAH_cccc01101011nnnnddddrr000111mmmm_case_0:
1763 //
1764 //   {Pc: 15,
1765 //    Rd: Rd(15:12),
1766 //    Rm: Rm(3:0),
1767 //    Rn: Rn(19:16),
1768 //    arch: v6,
1769 //    cond: cond(31:28),
1770 //    defs: {Rd},
1771 //    fields: [cond(31:28), Rn(19:16), Rd(15:12), rotate(11:10), Rm(3:0)],
1772 //    pattern: cccc01101011nnnnddddrr000111mmmm,
1773 //    rotate: rotate(11:10),
1774 //    rotation: rotate:'000'(2:0),
1775 //    rule: SXTAH,
1776 //    safety: [Rn(19:16)=1111 => DECODER_ERROR,
1777 //      Pc in {Rd, Rm} => UNPREDICTABLE],
1778 //    uses: {Rn, Rm}}
1779 class SXTAH_cccc01101011nnnnddddrr000111mmmm_case_0
1780      : public ClassDecoder {
1781  public:
SXTAH_cccc01101011nnnnddddrr000111mmmm_case_0()1782   SXTAH_cccc01101011nnnnddddrr000111mmmm_case_0()
1783      : ClassDecoder() {}
1784   virtual RegisterList defs(Instruction inst) const;
1785   virtual SafetyLevel safety(Instruction i) const;
1786   virtual RegisterList uses(Instruction i) const;
1787  private:
1788   NACL_DISALLOW_COPY_AND_ASSIGN(
1789       SXTAH_cccc01101011nnnnddddrr000111mmmm_case_0);
1790 };
1791 
1792 // SXTB16_cccc011010001111ddddrr000111mmmm_case_0:
1793 //
1794 //   {Pc: 15,
1795 //    Rd: Rd(15:12),
1796 //    Rm: Rm(3:0),
1797 //    arch: v6,
1798 //    cond: cond(31:28),
1799 //    defs: {Rd},
1800 //    fields: [cond(31:28), Rd(15:12), rotate(11:10), Rm(3:0)],
1801 //    pattern: cccc011010001111ddddrr000111mmmm,
1802 //    rotate: rotate(11:10),
1803 //    rotation: rotate:'000'(2:0),
1804 //    rule: SXTB16,
1805 //    safety: [Pc in {Rd, Rm} => UNPREDICTABLE],
1806 //    uses: {Rm}}
1807 class SXTB16_cccc011010001111ddddrr000111mmmm_case_0
1808      : public ClassDecoder {
1809  public:
SXTB16_cccc011010001111ddddrr000111mmmm_case_0()1810   SXTB16_cccc011010001111ddddrr000111mmmm_case_0()
1811      : ClassDecoder() {}
1812   virtual RegisterList defs(Instruction inst) const;
1813   virtual SafetyLevel safety(Instruction i) const;
1814   virtual RegisterList uses(Instruction i) const;
1815  private:
1816   NACL_DISALLOW_COPY_AND_ASSIGN(
1817       SXTB16_cccc011010001111ddddrr000111mmmm_case_0);
1818 };
1819 
1820 // SXTB_cccc011010101111ddddrr000111mmmm_case_0:
1821 //
1822 //   {Pc: 15,
1823 //    Rd: Rd(15:12),
1824 //    Rm: Rm(3:0),
1825 //    arch: v6,
1826 //    cond: cond(31:28),
1827 //    defs: {Rd},
1828 //    fields: [cond(31:28), Rd(15:12), rotate(11:10), Rm(3:0)],
1829 //    pattern: cccc011010101111ddddrr000111mmmm,
1830 //    rotate: rotate(11:10),
1831 //    rotation: rotate:'000'(2:0),
1832 //    rule: SXTB,
1833 //    safety: [Pc in {Rd, Rm} => UNPREDICTABLE],
1834 //    uses: {Rm}}
1835 class SXTB_cccc011010101111ddddrr000111mmmm_case_0
1836      : public ClassDecoder {
1837  public:
SXTB_cccc011010101111ddddrr000111mmmm_case_0()1838   SXTB_cccc011010101111ddddrr000111mmmm_case_0()
1839      : ClassDecoder() {}
1840   virtual RegisterList defs(Instruction inst) const;
1841   virtual SafetyLevel safety(Instruction i) const;
1842   virtual RegisterList uses(Instruction i) const;
1843  private:
1844   NACL_DISALLOW_COPY_AND_ASSIGN(
1845       SXTB_cccc011010101111ddddrr000111mmmm_case_0);
1846 };
1847 
1848 // SXTH_cccc011010111111ddddrr000111mmmm_case_0:
1849 //
1850 //   {Pc: 15,
1851 //    Rd: Rd(15:12),
1852 //    Rm: Rm(3:0),
1853 //    arch: v6,
1854 //    cond: cond(31:28),
1855 //    defs: {Rd},
1856 //    fields: [cond(31:28), Rd(15:12), rotate(11:10), Rm(3:0)],
1857 //    pattern: cccc011010111111ddddrr000111mmmm,
1858 //    rotate: rotate(11:10),
1859 //    rotation: rotate:'000'(2:0),
1860 //    rule: SXTH,
1861 //    safety: [Pc in {Rd, Rm} => UNPREDICTABLE],
1862 //    uses: {Rm}}
1863 class SXTH_cccc011010111111ddddrr000111mmmm_case_0
1864      : public ClassDecoder {
1865  public:
SXTH_cccc011010111111ddddrr000111mmmm_case_0()1866   SXTH_cccc011010111111ddddrr000111mmmm_case_0()
1867      : ClassDecoder() {}
1868   virtual RegisterList defs(Instruction inst) const;
1869   virtual SafetyLevel safety(Instruction i) const;
1870   virtual RegisterList uses(Instruction i) const;
1871  private:
1872   NACL_DISALLOW_COPY_AND_ASSIGN(
1873       SXTH_cccc011010111111ddddrr000111mmmm_case_0);
1874 };
1875 
1876 // TEQ_immediate_cccc00110011nnnn0000iiiiiiiiiiii_case_0:
1877 //
1878 //   {NZCV: 16,
1879 //    Rn: Rn(19:16),
1880 //    cond: cond(31:28),
1881 //    defs: {NZCV},
1882 //    fields: [cond(31:28), Rn(19:16), imm12(11:0)],
1883 //    imm12: imm12(11:0),
1884 //    imm32: ARMExpandImm_C(imm12),
1885 //    pattern: cccc00110011nnnn0000iiiiiiiiiiii,
1886 //    rule: TEQ_immediate,
1887 //    uses: {Rn}}
1888 class TEQ_immediate_cccc00110011nnnn0000iiiiiiiiiiii_case_0
1889      : public ClassDecoder {
1890  public:
TEQ_immediate_cccc00110011nnnn0000iiiiiiiiiiii_case_0()1891   TEQ_immediate_cccc00110011nnnn0000iiiiiiiiiiii_case_0()
1892      : ClassDecoder() {}
1893   virtual RegisterList defs(Instruction inst) const;
1894   virtual SafetyLevel safety(Instruction i) const;
1895   virtual RegisterList uses(Instruction i) const;
1896  private:
1897   NACL_DISALLOW_COPY_AND_ASSIGN(
1898       TEQ_immediate_cccc00110011nnnn0000iiiiiiiiiiii_case_0);
1899 };
1900 
1901 // TEQ_register_cccc00010011nnnn0000iiiiitt0mmmm_case_0:
1902 //
1903 //   {NZCV: 16,
1904 //    None: 32,
1905 //    Rm: Rm(3:0),
1906 //    Rn: Rn(19:16),
1907 //    S: S(20),
1908 //    cond: cond(31:28),
1909 //    defs: {NZCV
1910 //         if S
1911 //         else None},
1912 //    fields: [cond(31:28),
1913 //      S(20),
1914 //      Rn(19:16),
1915 //      imm5(11:7),
1916 //      type(6:5),
1917 //      Rm(3:0)],
1918 //    imm5: imm5(11:7),
1919 //    pattern: cccc00010011nnnn0000iiiiitt0mmmm,
1920 //    rule: TEQ_register,
1921 //    shift: DecodeImmShift(type, imm5),
1922 //    type: type(6:5),
1923 //    uses: {Rn, Rm}}
1924 class TEQ_register_cccc00010011nnnn0000iiiiitt0mmmm_case_0
1925      : public ClassDecoder {
1926  public:
TEQ_register_cccc00010011nnnn0000iiiiitt0mmmm_case_0()1927   TEQ_register_cccc00010011nnnn0000iiiiitt0mmmm_case_0()
1928      : ClassDecoder() {}
1929   virtual RegisterList defs(Instruction inst) const;
1930   virtual SafetyLevel safety(Instruction i) const;
1931   virtual RegisterList uses(Instruction i) const;
1932  private:
1933   NACL_DISALLOW_COPY_AND_ASSIGN(
1934       TEQ_register_cccc00010011nnnn0000iiiiitt0mmmm_case_0);
1935 };
1936 
1937 // TEQ_register_shifted_register_cccc00010011nnnn0000ssss0tt1mmmm_case_0:
1938 //
1939 //   {NZCV: 16,
1940 //    Pc: 15,
1941 //    Rm: Rm(3:0),
1942 //    Rn: Rn(19:16),
1943 //    Rs: Rs(11:8),
1944 //    cond: cond(31:28),
1945 //    defs: {NZCV},
1946 //    fields: [cond(31:28), Rn(19:16), Rs(11:8), type(6:5), Rm(3:0)],
1947 //    pattern: cccc00010011nnnn0000ssss0tt1mmmm,
1948 //    rule: TEQ_register_shifted_register,
1949 //    safety: [Pc in {Rn, Rm, Rs} => UNPREDICTABLE],
1950 //    shift_t: DecodeRegShift(type),
1951 //    type: type(6:5),
1952 //    uses: {Rn, Rm, Rs}}
1953 class TEQ_register_shifted_register_cccc00010011nnnn0000ssss0tt1mmmm_case_0
1954      : public ClassDecoder {
1955  public:
TEQ_register_shifted_register_cccc00010011nnnn0000ssss0tt1mmmm_case_0()1956   TEQ_register_shifted_register_cccc00010011nnnn0000ssss0tt1mmmm_case_0()
1957      : ClassDecoder() {}
1958   virtual RegisterList defs(Instruction inst) const;
1959   virtual SafetyLevel safety(Instruction i) const;
1960   virtual RegisterList uses(Instruction i) const;
1961  private:
1962   NACL_DISALLOW_COPY_AND_ASSIGN(
1963       TEQ_register_shifted_register_cccc00010011nnnn0000ssss0tt1mmmm_case_0);
1964 };
1965 
1966 // TST_immediate_cccc00110001nnnn0000iiiiiiiiiiii_case_0:
1967 //
1968 //   {NZCV: 16,
1969 //    Rn: Rn(19:16),
1970 //    cond: cond(31:28),
1971 //    defs: {NZCV},
1972 //    fields: [cond(31:28), Rn(19:16), imm12(11:0)],
1973 //    imm12: imm12(11:0),
1974 //    imm32: ARMExpandImm_C(imm12),
1975 //    pattern: cccc00110001nnnn0000iiiiiiiiiiii,
1976 //    rule: TST_immediate,
1977 //    sets_Z_if_clear_bits: Rn  ==
1978 //            RegIndex(test_register()) &&
1979 //         (imm32 &&
1980 //         clears_mask())  ==
1981 //            clears_mask(),
1982 //    uses: {Rn}}
1983 class TST_immediate_cccc00110001nnnn0000iiiiiiiiiiii_case_0
1984      : public ClassDecoder {
1985  public:
TST_immediate_cccc00110001nnnn0000iiiiiiiiiiii_case_0()1986   TST_immediate_cccc00110001nnnn0000iiiiiiiiiiii_case_0()
1987      : ClassDecoder() {}
1988   virtual RegisterList defs(Instruction inst) const;
1989   virtual SafetyLevel safety(Instruction i) const;
1990   virtual bool sets_Z_if_bits_clear(Instruction i,
1991                                     Register test_register,
1992                                     uint32_t clears_mask) const;
1993   virtual RegisterList uses(Instruction i) const;
1994  private:
1995   NACL_DISALLOW_COPY_AND_ASSIGN(
1996       TST_immediate_cccc00110001nnnn0000iiiiiiiiiiii_case_0);
1997 };
1998 
1999 // TST_register_cccc00010001nnnn0000iiiiitt0mmmm_case_0:
2000 //
2001 //   {NZCV: 16,
2002 //    None: 32,
2003 //    Rm: Rm(3:0),
2004 //    Rn: Rn(19:16),
2005 //    S: S(20),
2006 //    cond: cond(31:28),
2007 //    defs: {NZCV
2008 //         if S
2009 //         else None},
2010 //    fields: [cond(31:28),
2011 //      S(20),
2012 //      Rn(19:16),
2013 //      imm5(11:7),
2014 //      type(6:5),
2015 //      Rm(3:0)],
2016 //    imm5: imm5(11:7),
2017 //    pattern: cccc00010001nnnn0000iiiiitt0mmmm,
2018 //    rule: TST_register,
2019 //    shift: DecodeImmShift(type, imm5),
2020 //    type: type(6:5),
2021 //    uses: {Rn, Rm}}
2022 class TST_register_cccc00010001nnnn0000iiiiitt0mmmm_case_0
2023      : public ClassDecoder {
2024  public:
TST_register_cccc00010001nnnn0000iiiiitt0mmmm_case_0()2025   TST_register_cccc00010001nnnn0000iiiiitt0mmmm_case_0()
2026      : ClassDecoder() {}
2027   virtual RegisterList defs(Instruction inst) const;
2028   virtual SafetyLevel safety(Instruction i) const;
2029   virtual RegisterList uses(Instruction i) const;
2030  private:
2031   NACL_DISALLOW_COPY_AND_ASSIGN(
2032       TST_register_cccc00010001nnnn0000iiiiitt0mmmm_case_0);
2033 };
2034 
2035 // TST_register_shifted_register_cccc00010001nnnn0000ssss0tt1mmmm_case_0:
2036 //
2037 //   {NZCV: 16,
2038 //    Pc: 15,
2039 //    Rm: Rm(3:0),
2040 //    Rn: Rn(19:16),
2041 //    Rs: Rs(11:8),
2042 //    cond: cond(31:28),
2043 //    defs: {NZCV},
2044 //    fields: [cond(31:28), Rn(19:16), Rs(11:8), type(6:5), Rm(3:0)],
2045 //    pattern: cccc00010001nnnn0000ssss0tt1mmmm,
2046 //    rule: TST_register_shifted_register,
2047 //    safety: [Pc in {Rn, Rm, Rs} => UNPREDICTABLE],
2048 //    shift_t: DecodeRegShift(type),
2049 //    type: type(6:5),
2050 //    uses: {Rn, Rm, Rs}}
2051 class TST_register_shifted_register_cccc00010001nnnn0000ssss0tt1mmmm_case_0
2052      : public ClassDecoder {
2053  public:
TST_register_shifted_register_cccc00010001nnnn0000ssss0tt1mmmm_case_0()2054   TST_register_shifted_register_cccc00010001nnnn0000ssss0tt1mmmm_case_0()
2055      : ClassDecoder() {}
2056   virtual RegisterList defs(Instruction inst) const;
2057   virtual SafetyLevel safety(Instruction i) const;
2058   virtual RegisterList uses(Instruction i) const;
2059  private:
2060   NACL_DISALLOW_COPY_AND_ASSIGN(
2061       TST_register_shifted_register_cccc00010001nnnn0000ssss0tt1mmmm_case_0);
2062 };
2063 
2064 // UADD16_cccc01100101nnnndddd11110001mmmm_case_0:
2065 //
2066 //   {Pc: 15,
2067 //    Rd: Rd(15:12),
2068 //    Rm: Rm(3:0),
2069 //    Rn: Rn(19:16),
2070 //    arch: v6,
2071 //    cond: cond(31:28),
2072 //    defs: {Rd},
2073 //    fields: [cond(31:28), Rn(19:16), Rd(15:12), Rm(3:0)],
2074 //    pattern: cccc01100101nnnndddd11110001mmmm,
2075 //    rule: UADD16,
2076 //    safety: [Pc in {Rd, Rn, Rm} => UNPREDICTABLE],
2077 //    uses: {Rn, Rm}}
2078 class UADD16_cccc01100101nnnndddd11110001mmmm_case_0
2079      : public ClassDecoder {
2080  public:
UADD16_cccc01100101nnnndddd11110001mmmm_case_0()2081   UADD16_cccc01100101nnnndddd11110001mmmm_case_0()
2082      : ClassDecoder() {}
2083   virtual RegisterList defs(Instruction inst) const;
2084   virtual SafetyLevel safety(Instruction i) const;
2085   virtual RegisterList uses(Instruction i) const;
2086  private:
2087   NACL_DISALLOW_COPY_AND_ASSIGN(
2088       UADD16_cccc01100101nnnndddd11110001mmmm_case_0);
2089 };
2090 
2091 // UADD8_cccc01100101nnnndddd11111001mmmm_case_0:
2092 //
2093 //   {Pc: 15,
2094 //    Rd: Rd(15:12),
2095 //    Rm: Rm(3:0),
2096 //    Rn: Rn(19:16),
2097 //    arch: v6,
2098 //    cond: cond(31:28),
2099 //    defs: {Rd},
2100 //    fields: [cond(31:28), Rn(19:16), Rd(15:12), Rm(3:0)],
2101 //    pattern: cccc01100101nnnndddd11111001mmmm,
2102 //    rule: UADD8,
2103 //    safety: [Pc in {Rd, Rn, Rm} => UNPREDICTABLE],
2104 //    uses: {Rn, Rm}}
2105 class UADD8_cccc01100101nnnndddd11111001mmmm_case_0
2106      : public ClassDecoder {
2107  public:
UADD8_cccc01100101nnnndddd11111001mmmm_case_0()2108   UADD8_cccc01100101nnnndddd11111001mmmm_case_0()
2109      : ClassDecoder() {}
2110   virtual RegisterList defs(Instruction inst) const;
2111   virtual SafetyLevel safety(Instruction i) const;
2112   virtual RegisterList uses(Instruction i) const;
2113  private:
2114   NACL_DISALLOW_COPY_AND_ASSIGN(
2115       UADD8_cccc01100101nnnndddd11111001mmmm_case_0);
2116 };
2117 
2118 // UASX_cccc01100101nnnndddd11110011mmmm_case_0:
2119 //
2120 //   {Pc: 15,
2121 //    Rd: Rd(15:12),
2122 //    Rm: Rm(3:0),
2123 //    Rn: Rn(19:16),
2124 //    arch: v6,
2125 //    cond: cond(31:28),
2126 //    defs: {Rd},
2127 //    fields: [cond(31:28), Rn(19:16), Rd(15:12), Rm(3:0)],
2128 //    pattern: cccc01100101nnnndddd11110011mmmm,
2129 //    rule: UASX,
2130 //    safety: [Pc in {Rd, Rn, Rm} => UNPREDICTABLE],
2131 //    uses: {Rn, Rm}}
2132 class UASX_cccc01100101nnnndddd11110011mmmm_case_0
2133      : public ClassDecoder {
2134  public:
UASX_cccc01100101nnnndddd11110011mmmm_case_0()2135   UASX_cccc01100101nnnndddd11110011mmmm_case_0()
2136      : ClassDecoder() {}
2137   virtual RegisterList defs(Instruction inst) const;
2138   virtual SafetyLevel safety(Instruction i) const;
2139   virtual RegisterList uses(Instruction i) const;
2140  private:
2141   NACL_DISALLOW_COPY_AND_ASSIGN(
2142       UASX_cccc01100101nnnndddd11110011mmmm_case_0);
2143 };
2144 
2145 // UBFX_cccc0111111mmmmmddddlllll101nnnn_case_0:
2146 //
2147 //   {Pc: 15,
2148 //    Rd: Rd(15:12),
2149 //    Rn: Rn(3:0),
2150 //    arch: v6T2,
2151 //    cond: cond(31:28),
2152 //    defs: {Rd},
2153 //    fields: [cond(31:28), widthm1(20:16), Rd(15:12), lsb(11:7), Rn(3:0)],
2154 //    lsb: lsb(11:7),
2155 //    pattern: cccc0111111mmmmmddddlllll101nnnn,
2156 //    rule: UBFX,
2157 //    safety: [Pc in {Rd, Rn} => UNPREDICTABLE,
2158 //      lsb + widthm1  >
2159 //            31 => UNPREDICTABLE],
2160 //    uses: {Rn},
2161 //    widthm1: widthm1(20:16)}
2162 class UBFX_cccc0111111mmmmmddddlllll101nnnn_case_0
2163      : public ClassDecoder {
2164  public:
UBFX_cccc0111111mmmmmddddlllll101nnnn_case_0()2165   UBFX_cccc0111111mmmmmddddlllll101nnnn_case_0()
2166      : ClassDecoder() {}
2167   virtual RegisterList defs(Instruction inst) const;
2168   virtual SafetyLevel safety(Instruction i) const;
2169   virtual RegisterList uses(Instruction i) const;
2170  private:
2171   NACL_DISALLOW_COPY_AND_ASSIGN(
2172       UBFX_cccc0111111mmmmmddddlllll101nnnn_case_0);
2173 };
2174 
2175 // UDF_cccc01111111iiiiiiiiiiii1111iiii_case_0:
2176 //
2177 //   {defs: {},
2178 //    inst: inst,
2179 //    pattern: cccc01111111iiiiiiiiiiii1111iiii,
2180 //    rule: UDF,
2181 //    safety: [not IsUDFNaClSafe(inst) => FORBIDDEN_OPERANDS],
2182 //    uses: {}}
2183 class UDF_cccc01111111iiiiiiiiiiii1111iiii_case_0
2184      : public ClassDecoder {
2185  public:
UDF_cccc01111111iiiiiiiiiiii1111iiii_case_0()2186   UDF_cccc01111111iiiiiiiiiiii1111iiii_case_0()
2187      : ClassDecoder() {}
2188   virtual RegisterList defs(Instruction inst) const;
2189   virtual SafetyLevel safety(Instruction i) const;
2190   virtual RegisterList uses(Instruction i) const;
2191  private:
2192   NACL_DISALLOW_COPY_AND_ASSIGN(
2193       UDF_cccc01111111iiiiiiiiiiii1111iiii_case_0);
2194 };
2195 
2196 // UDIV_cccc01110011dddd1111mmmm0001nnnn_case_0:
2197 //
2198 //   {M: M(5),
2199 //    Pc: 15,
2200 //    Rd: Rd(19:16),
2201 //    Rm: Rm(11:8),
2202 //    Rn: Rn(3:0),
2203 //    arch: v7VEoptv7A_v7R,
2204 //    cond: cond(31:28),
2205 //    defs: {Rd},
2206 //    fields: [cond(31:28), Rd(19:16), Rm(11:8), M(5), Rn(3:0)],
2207 //    pattern: cccc01110011dddd1111mmmm0001nnnn,
2208 //    rule: UDIV,
2209 //    safety: [Pc in {Rd, Rm, Rn} => UNPREDICTABLE],
2210 //    uses: {Rm, Rn}}
2211 class UDIV_cccc01110011dddd1111mmmm0001nnnn_case_0
2212      : public ClassDecoder {
2213  public:
UDIV_cccc01110011dddd1111mmmm0001nnnn_case_0()2214   UDIV_cccc01110011dddd1111mmmm0001nnnn_case_0()
2215      : ClassDecoder() {}
2216   virtual RegisterList defs(Instruction inst) const;
2217   virtual SafetyLevel safety(Instruction i) const;
2218   virtual RegisterList uses(Instruction i) const;
2219  private:
2220   NACL_DISALLOW_COPY_AND_ASSIGN(
2221       UDIV_cccc01110011dddd1111mmmm0001nnnn_case_0);
2222 };
2223 
2224 // UHADD16_cccc01100111nnnndddd11110001mmmm_case_0:
2225 //
2226 //   {Pc: 15,
2227 //    Rd: Rd(15:12),
2228 //    Rm: Rm(3:0),
2229 //    Rn: Rn(19:16),
2230 //    arch: v6,
2231 //    cond: cond(31:28),
2232 //    defs: {Rd},
2233 //    fields: [cond(31:28), Rn(19:16), Rd(15:12), Rm(3:0)],
2234 //    pattern: cccc01100111nnnndddd11110001mmmm,
2235 //    rule: UHADD16,
2236 //    safety: [Pc in {Rd, Rn, Rm} => UNPREDICTABLE],
2237 //    uses: {Rn, Rm}}
2238 class UHADD16_cccc01100111nnnndddd11110001mmmm_case_0
2239      : public ClassDecoder {
2240  public:
UHADD16_cccc01100111nnnndddd11110001mmmm_case_0()2241   UHADD16_cccc01100111nnnndddd11110001mmmm_case_0()
2242      : ClassDecoder() {}
2243   virtual RegisterList defs(Instruction inst) const;
2244   virtual SafetyLevel safety(Instruction i) const;
2245   virtual RegisterList uses(Instruction i) const;
2246  private:
2247   NACL_DISALLOW_COPY_AND_ASSIGN(
2248       UHADD16_cccc01100111nnnndddd11110001mmmm_case_0);
2249 };
2250 
2251 // UHADD8_cccc01100111nnnndddd11111001mmmm_case_0:
2252 //
2253 //   {Pc: 15,
2254 //    Rd: Rd(15:12),
2255 //    Rm: Rm(3:0),
2256 //    Rn: Rn(19:16),
2257 //    arch: v6,
2258 //    cond: cond(31:28),
2259 //    defs: {Rd},
2260 //    fields: [cond(31:28), Rn(19:16), Rd(15:12), Rm(3:0)],
2261 //    pattern: cccc01100111nnnndddd11111001mmmm,
2262 //    rule: UHADD8,
2263 //    safety: [Pc in {Rd, Rn, Rm} => UNPREDICTABLE],
2264 //    uses: {Rn, Rm}}
2265 class UHADD8_cccc01100111nnnndddd11111001mmmm_case_0
2266      : public ClassDecoder {
2267  public:
UHADD8_cccc01100111nnnndddd11111001mmmm_case_0()2268   UHADD8_cccc01100111nnnndddd11111001mmmm_case_0()
2269      : ClassDecoder() {}
2270   virtual RegisterList defs(Instruction inst) const;
2271   virtual SafetyLevel safety(Instruction i) const;
2272   virtual RegisterList uses(Instruction i) const;
2273  private:
2274   NACL_DISALLOW_COPY_AND_ASSIGN(
2275       UHADD8_cccc01100111nnnndddd11111001mmmm_case_0);
2276 };
2277 
2278 // UHASX_cccc01100111nnnndddd11110011mmmm_case_0:
2279 //
2280 //   {Pc: 15,
2281 //    Rd: Rd(15:12),
2282 //    Rm: Rm(3:0),
2283 //    Rn: Rn(19:16),
2284 //    arch: v6,
2285 //    cond: cond(31:28),
2286 //    defs: {Rd},
2287 //    fields: [cond(31:28), Rn(19:16), Rd(15:12), Rm(3:0)],
2288 //    pattern: cccc01100111nnnndddd11110011mmmm,
2289 //    rule: UHASX,
2290 //    safety: [Pc in {Rd, Rn, Rm} => UNPREDICTABLE],
2291 //    uses: {Rn, Rm}}
2292 class UHASX_cccc01100111nnnndddd11110011mmmm_case_0
2293      : public ClassDecoder {
2294  public:
UHASX_cccc01100111nnnndddd11110011mmmm_case_0()2295   UHASX_cccc01100111nnnndddd11110011mmmm_case_0()
2296      : ClassDecoder() {}
2297   virtual RegisterList defs(Instruction inst) const;
2298   virtual SafetyLevel safety(Instruction i) const;
2299   virtual RegisterList uses(Instruction i) const;
2300  private:
2301   NACL_DISALLOW_COPY_AND_ASSIGN(
2302       UHASX_cccc01100111nnnndddd11110011mmmm_case_0);
2303 };
2304 
2305 // UHSAX_cccc01100111nnnndddd11110101mmmm_case_0:
2306 //
2307 //   {Pc: 15,
2308 //    Rd: Rd(15:12),
2309 //    Rm: Rm(3:0),
2310 //    Rn: Rn(19:16),
2311 //    arch: v6,
2312 //    cond: cond(31:28),
2313 //    defs: {Rd},
2314 //    fields: [cond(31:28), Rn(19:16), Rd(15:12), Rm(3:0)],
2315 //    pattern: cccc01100111nnnndddd11110101mmmm,
2316 //    rule: UHSAX,
2317 //    safety: [Pc in {Rd, Rn, Rm} => UNPREDICTABLE],
2318 //    uses: {Rn, Rm}}
2319 class UHSAX_cccc01100111nnnndddd11110101mmmm_case_0
2320      : public ClassDecoder {
2321  public:
UHSAX_cccc01100111nnnndddd11110101mmmm_case_0()2322   UHSAX_cccc01100111nnnndddd11110101mmmm_case_0()
2323      : ClassDecoder() {}
2324   virtual RegisterList defs(Instruction inst) const;
2325   virtual SafetyLevel safety(Instruction i) const;
2326   virtual RegisterList uses(Instruction i) const;
2327  private:
2328   NACL_DISALLOW_COPY_AND_ASSIGN(
2329       UHSAX_cccc01100111nnnndddd11110101mmmm_case_0);
2330 };
2331 
2332 // UHSUB16_cccc01100111nnnndddd11110111mmmm_case_0:
2333 //
2334 //   {Pc: 15,
2335 //    Rd: Rd(15:12),
2336 //    Rm: Rm(3:0),
2337 //    Rn: Rn(19:16),
2338 //    arch: v6,
2339 //    cond: cond(31:28),
2340 //    defs: {Rd},
2341 //    fields: [cond(31:28), Rn(19:16), Rd(15:12), Rm(3:0)],
2342 //    pattern: cccc01100111nnnndddd11110111mmmm,
2343 //    rule: UHSUB16,
2344 //    safety: [Pc in {Rd, Rn, Rm} => UNPREDICTABLE],
2345 //    uses: {Rn, Rm}}
2346 class UHSUB16_cccc01100111nnnndddd11110111mmmm_case_0
2347      : public ClassDecoder {
2348  public:
UHSUB16_cccc01100111nnnndddd11110111mmmm_case_0()2349   UHSUB16_cccc01100111nnnndddd11110111mmmm_case_0()
2350      : ClassDecoder() {}
2351   virtual RegisterList defs(Instruction inst) const;
2352   virtual SafetyLevel safety(Instruction i) const;
2353   virtual RegisterList uses(Instruction i) const;
2354  private:
2355   NACL_DISALLOW_COPY_AND_ASSIGN(
2356       UHSUB16_cccc01100111nnnndddd11110111mmmm_case_0);
2357 };
2358 
2359 // UHSUB8_cccc01100111nnnndddd11111111mmmm_case_0:
2360 //
2361 //   {Pc: 15,
2362 //    Rd: Rd(15:12),
2363 //    Rm: Rm(3:0),
2364 //    Rn: Rn(19:16),
2365 //    arch: v6,
2366 //    cond: cond(31:28),
2367 //    defs: {Rd},
2368 //    fields: [cond(31:28), Rn(19:16), Rd(15:12), Rm(3:0)],
2369 //    pattern: cccc01100111nnnndddd11111111mmmm,
2370 //    rule: UHSUB8,
2371 //    safety: [Pc in {Rd, Rn, Rm} => UNPREDICTABLE],
2372 //    uses: {Rn, Rm}}
2373 class UHSUB8_cccc01100111nnnndddd11111111mmmm_case_0
2374      : public ClassDecoder {
2375  public:
UHSUB8_cccc01100111nnnndddd11111111mmmm_case_0()2376   UHSUB8_cccc01100111nnnndddd11111111mmmm_case_0()
2377      : ClassDecoder() {}
2378   virtual RegisterList defs(Instruction inst) const;
2379   virtual SafetyLevel safety(Instruction i) const;
2380   virtual RegisterList uses(Instruction i) const;
2381  private:
2382   NACL_DISALLOW_COPY_AND_ASSIGN(
2383       UHSUB8_cccc01100111nnnndddd11111111mmmm_case_0);
2384 };
2385 
2386 // UMAAL_A1_cccc00000100hhhhllllmmmm1001nnnn_case_0:
2387 //
2388 //   {Pc: 15,
2389 //    RdHi: RdHi(19:16),
2390 //    RdLo: RdLo(15:12),
2391 //    Rm: Rm(11:8),
2392 //    Rn: Rn(3:0),
2393 //    cond: cond(31:28),
2394 //    defs: {RdLo, RdHi},
2395 //    fields: [cond(31:28), RdHi(19:16), RdLo(15:12), Rm(11:8), Rn(3:0)],
2396 //    pattern: cccc00000100hhhhllllmmmm1001nnnn,
2397 //    rule: UMAAL_A1,
2398 //    safety: [Pc in {RdLo, RdHi, Rn, Rm} => UNPREDICTABLE,
2399 //      RdHi  ==
2400 //            RdLo => UNPREDICTABLE],
2401 //    uses: {RdLo, RdHi, Rn, Rm}}
2402 class UMAAL_A1_cccc00000100hhhhllllmmmm1001nnnn_case_0
2403      : public ClassDecoder {
2404  public:
UMAAL_A1_cccc00000100hhhhllllmmmm1001nnnn_case_0()2405   UMAAL_A1_cccc00000100hhhhllllmmmm1001nnnn_case_0()
2406      : ClassDecoder() {}
2407   virtual RegisterList defs(Instruction inst) const;
2408   virtual SafetyLevel safety(Instruction i) const;
2409   virtual RegisterList uses(Instruction i) const;
2410  private:
2411   NACL_DISALLOW_COPY_AND_ASSIGN(
2412       UMAAL_A1_cccc00000100hhhhllllmmmm1001nnnn_case_0);
2413 };
2414 
2415 // UMLAL_A1_cccc0000101shhhhllllmmmm1001nnnn_case_0:
2416 //
2417 //   {NZCV: 16,
2418 //    None: 32,
2419 //    Pc: 15,
2420 //    RdHi: RdHi(19:16),
2421 //    RdLo: RdLo(15:12),
2422 //    Rm: Rm(11:8),
2423 //    Rn: Rn(3:0),
2424 //    S: S(20),
2425 //    cond: cond(31:28),
2426 //    defs: {RdLo, RdHi, NZCV
2427 //         if setflags
2428 //         else None},
2429 //    fields: [cond(31:28),
2430 //      S(20),
2431 //      RdHi(19:16),
2432 //      RdLo(15:12),
2433 //      Rm(11:8),
2434 //      Rn(3:0)],
2435 //    pattern: cccc0000101shhhhllllmmmm1001nnnn,
2436 //    rule: UMLAL_A1,
2437 //    safety: [Pc in {RdLo, RdHi, Rn, Rm} => UNPREDICTABLE,
2438 //      RdHi  ==
2439 //            RdLo => UNPREDICTABLE,
2440 //      (ArchVersion()  <
2441 //            6 &&
2442 //         (RdHi  ==
2443 //            Rn ||
2444 //         RdLo  ==
2445 //            Rn)) => UNPREDICTABLE],
2446 //    setflags: S(20)=1,
2447 //    uses: {RdLo, RdHi, Rn, Rm}}
2448 class UMLAL_A1_cccc0000101shhhhllllmmmm1001nnnn_case_0
2449      : public ClassDecoder {
2450  public:
UMLAL_A1_cccc0000101shhhhllllmmmm1001nnnn_case_0()2451   UMLAL_A1_cccc0000101shhhhllllmmmm1001nnnn_case_0()
2452      : ClassDecoder() {}
2453   virtual RegisterList defs(Instruction inst) const;
2454   virtual SafetyLevel safety(Instruction i) const;
2455   virtual RegisterList uses(Instruction i) const;
2456  private:
2457   NACL_DISALLOW_COPY_AND_ASSIGN(
2458       UMLAL_A1_cccc0000101shhhhllllmmmm1001nnnn_case_0);
2459 };
2460 
2461 // UMULL_A1_cccc0000100shhhhllllmmmm1001nnnn_case_0:
2462 //
2463 //   {NZCV: 16,
2464 //    None: 32,
2465 //    Pc: 15,
2466 //    RdHi: RdHi(19:16),
2467 //    RdLo: RdLo(15:12),
2468 //    Rm: Rm(11:8),
2469 //    Rn: Rn(3:0),
2470 //    S: S(20),
2471 //    cond: cond(31:28),
2472 //    defs: {RdLo, RdHi, NZCV
2473 //         if setflags
2474 //         else None},
2475 //    fields: [cond(31:28),
2476 //      S(20),
2477 //      RdHi(19:16),
2478 //      RdLo(15:12),
2479 //      Rm(11:8),
2480 //      Rn(3:0)],
2481 //    pattern: cccc0000100shhhhllllmmmm1001nnnn,
2482 //    rule: UMULL_A1,
2483 //    safety: [Pc in {RdLo, RdHi, Rn, Rm} => UNPREDICTABLE,
2484 //      RdHi  ==
2485 //            RdLo => UNPREDICTABLE,
2486 //      (ArchVersion()  <
2487 //            6 &&
2488 //         (RdHi  ==
2489 //            Rn ||
2490 //         RdLo  ==
2491 //            Rn)) => UNPREDICTABLE],
2492 //    setflags: S(20)=1,
2493 //    uses: {Rn, Rm}}
2494 class UMULL_A1_cccc0000100shhhhllllmmmm1001nnnn_case_0
2495      : public ClassDecoder {
2496  public:
UMULL_A1_cccc0000100shhhhllllmmmm1001nnnn_case_0()2497   UMULL_A1_cccc0000100shhhhllllmmmm1001nnnn_case_0()
2498      : ClassDecoder() {}
2499   virtual RegisterList defs(Instruction inst) const;
2500   virtual SafetyLevel safety(Instruction i) const;
2501   virtual RegisterList uses(Instruction i) const;
2502  private:
2503   NACL_DISALLOW_COPY_AND_ASSIGN(
2504       UMULL_A1_cccc0000100shhhhllllmmmm1001nnnn_case_0);
2505 };
2506 
2507 // UQADD16_cccc01100110nnnndddd11110001mmmm_case_0:
2508 //
2509 //   {Pc: 15,
2510 //    Rd: Rd(15:12),
2511 //    Rm: Rm(3:0),
2512 //    Rn: Rn(19:16),
2513 //    arch: v6,
2514 //    cond: cond(31:28),
2515 //    defs: {Rd},
2516 //    fields: [cond(31:28), Rn(19:16), Rd(15:12), Rm(3:0)],
2517 //    pattern: cccc01100110nnnndddd11110001mmmm,
2518 //    rule: UQADD16,
2519 //    safety: [Pc in {Rd, Rn, Rm} => UNPREDICTABLE],
2520 //    uses: {Rn, Rm}}
2521 class UQADD16_cccc01100110nnnndddd11110001mmmm_case_0
2522      : public ClassDecoder {
2523  public:
UQADD16_cccc01100110nnnndddd11110001mmmm_case_0()2524   UQADD16_cccc01100110nnnndddd11110001mmmm_case_0()
2525      : ClassDecoder() {}
2526   virtual RegisterList defs(Instruction inst) const;
2527   virtual SafetyLevel safety(Instruction i) const;
2528   virtual RegisterList uses(Instruction i) const;
2529  private:
2530   NACL_DISALLOW_COPY_AND_ASSIGN(
2531       UQADD16_cccc01100110nnnndddd11110001mmmm_case_0);
2532 };
2533 
2534 // UQADD8_cccc01100110nnnndddd11111001mmmm_case_0:
2535 //
2536 //   {Pc: 15,
2537 //    Rd: Rd(15:12),
2538 //    Rm: Rm(3:0),
2539 //    Rn: Rn(19:16),
2540 //    arch: v6,
2541 //    cond: cond(31:28),
2542 //    defs: {Rd},
2543 //    fields: [cond(31:28), Rn(19:16), Rd(15:12), Rm(3:0)],
2544 //    pattern: cccc01100110nnnndddd11111001mmmm,
2545 //    rule: UQADD8,
2546 //    safety: [Pc in {Rd, Rn, Rm} => UNPREDICTABLE],
2547 //    uses: {Rn, Rm}}
2548 class UQADD8_cccc01100110nnnndddd11111001mmmm_case_0
2549      : public ClassDecoder {
2550  public:
UQADD8_cccc01100110nnnndddd11111001mmmm_case_0()2551   UQADD8_cccc01100110nnnndddd11111001mmmm_case_0()
2552      : ClassDecoder() {}
2553   virtual RegisterList defs(Instruction inst) const;
2554   virtual SafetyLevel safety(Instruction i) const;
2555   virtual RegisterList uses(Instruction i) const;
2556  private:
2557   NACL_DISALLOW_COPY_AND_ASSIGN(
2558       UQADD8_cccc01100110nnnndddd11111001mmmm_case_0);
2559 };
2560 
2561 // UQASX_cccc01100110nnnndddd11110011mmmm_case_0:
2562 //
2563 //   {Pc: 15,
2564 //    Rd: Rd(15:12),
2565 //    Rm: Rm(3:0),
2566 //    Rn: Rn(19:16),
2567 //    arch: v6,
2568 //    cond: cond(31:28),
2569 //    defs: {Rd},
2570 //    fields: [cond(31:28), Rn(19:16), Rd(15:12), Rm(3:0)],
2571 //    pattern: cccc01100110nnnndddd11110011mmmm,
2572 //    rule: UQASX,
2573 //    safety: [Pc in {Rd, Rn, Rm} => UNPREDICTABLE],
2574 //    uses: {Rn, Rm}}
2575 class UQASX_cccc01100110nnnndddd11110011mmmm_case_0
2576      : public ClassDecoder {
2577  public:
UQASX_cccc01100110nnnndddd11110011mmmm_case_0()2578   UQASX_cccc01100110nnnndddd11110011mmmm_case_0()
2579      : ClassDecoder() {}
2580   virtual RegisterList defs(Instruction inst) const;
2581   virtual SafetyLevel safety(Instruction i) const;
2582   virtual RegisterList uses(Instruction i) const;
2583  private:
2584   NACL_DISALLOW_COPY_AND_ASSIGN(
2585       UQASX_cccc01100110nnnndddd11110011mmmm_case_0);
2586 };
2587 
2588 // UQSAX_cccc01100110nnnndddd11110101mmmm_case_0:
2589 //
2590 //   {Pc: 15,
2591 //    Rd: Rd(15:12),
2592 //    Rm: Rm(3:0),
2593 //    Rn: Rn(19:16),
2594 //    arch: v6,
2595 //    cond: cond(31:28),
2596 //    defs: {Rd},
2597 //    fields: [cond(31:28), Rn(19:16), Rd(15:12), Rm(3:0)],
2598 //    pattern: cccc01100110nnnndddd11110101mmmm,
2599 //    rule: UQSAX,
2600 //    safety: [Pc in {Rd, Rn, Rm} => UNPREDICTABLE],
2601 //    uses: {Rn, Rm}}
2602 class UQSAX_cccc01100110nnnndddd11110101mmmm_case_0
2603      : public ClassDecoder {
2604  public:
UQSAX_cccc01100110nnnndddd11110101mmmm_case_0()2605   UQSAX_cccc01100110nnnndddd11110101mmmm_case_0()
2606      : ClassDecoder() {}
2607   virtual RegisterList defs(Instruction inst) const;
2608   virtual SafetyLevel safety(Instruction i) const;
2609   virtual RegisterList uses(Instruction i) const;
2610  private:
2611   NACL_DISALLOW_COPY_AND_ASSIGN(
2612       UQSAX_cccc01100110nnnndddd11110101mmmm_case_0);
2613 };
2614 
2615 // UQSUB16_cccc01100110nnnndddd11110111mmmm_case_0:
2616 //
2617 //   {Pc: 15,
2618 //    Rd: Rd(15:12),
2619 //    Rm: Rm(3:0),
2620 //    Rn: Rn(19:16),
2621 //    arch: v6,
2622 //    cond: cond(31:28),
2623 //    defs: {Rd},
2624 //    fields: [cond(31:28), Rn(19:16), Rd(15:12), Rm(3:0)],
2625 //    pattern: cccc01100110nnnndddd11110111mmmm,
2626 //    rule: UQSUB16,
2627 //    safety: [Pc in {Rd, Rn, Rm} => UNPREDICTABLE],
2628 //    uses: {Rn, Rm}}
2629 class UQSUB16_cccc01100110nnnndddd11110111mmmm_case_0
2630      : public ClassDecoder {
2631  public:
UQSUB16_cccc01100110nnnndddd11110111mmmm_case_0()2632   UQSUB16_cccc01100110nnnndddd11110111mmmm_case_0()
2633      : ClassDecoder() {}
2634   virtual RegisterList defs(Instruction inst) const;
2635   virtual SafetyLevel safety(Instruction i) const;
2636   virtual RegisterList uses(Instruction i) const;
2637  private:
2638   NACL_DISALLOW_COPY_AND_ASSIGN(
2639       UQSUB16_cccc01100110nnnndddd11110111mmmm_case_0);
2640 };
2641 
2642 // UQSUB8_cccc01100110nnnndddd11111111mmmm_case_0:
2643 //
2644 //   {Pc: 15,
2645 //    Rd: Rd(15:12),
2646 //    Rm: Rm(3:0),
2647 //    Rn: Rn(19:16),
2648 //    arch: v6,
2649 //    cond: cond(31:28),
2650 //    defs: {Rd},
2651 //    fields: [cond(31:28), Rn(19:16), Rd(15:12), Rm(3:0)],
2652 //    pattern: cccc01100110nnnndddd11111111mmmm,
2653 //    rule: UQSUB8,
2654 //    safety: [Pc in {Rd, Rn, Rm} => UNPREDICTABLE],
2655 //    uses: {Rn, Rm}}
2656 class UQSUB8_cccc01100110nnnndddd11111111mmmm_case_0
2657      : public ClassDecoder {
2658  public:
UQSUB8_cccc01100110nnnndddd11111111mmmm_case_0()2659   UQSUB8_cccc01100110nnnndddd11111111mmmm_case_0()
2660      : ClassDecoder() {}
2661   virtual RegisterList defs(Instruction inst) const;
2662   virtual SafetyLevel safety(Instruction i) const;
2663   virtual RegisterList uses(Instruction i) const;
2664  private:
2665   NACL_DISALLOW_COPY_AND_ASSIGN(
2666       UQSUB8_cccc01100110nnnndddd11111111mmmm_case_0);
2667 };
2668 
2669 // USAD8_cccc01111000dddd1111mmmm0001nnnn_case_0:
2670 //
2671 //   {Pc: 15,
2672 //    Rd: Rd(19:16),
2673 //    Rm: Rm(11:8),
2674 //    Rn: Rn(3:0),
2675 //    arch: v6,
2676 //    cond: cond(31:28),
2677 //    defs: {Rd},
2678 //    fields: [cond(31:28), Rd(19:16), Rm(11:8), Rn(3:0)],
2679 //    pattern: cccc01111000dddd1111mmmm0001nnnn,
2680 //    rule: USAD8,
2681 //    safety: [Pc in {Rd, Rn, Rm} => UNPREDICTABLE],
2682 //    uses: {Rn, Rm}}
2683 class USAD8_cccc01111000dddd1111mmmm0001nnnn_case_0
2684      : public ClassDecoder {
2685  public:
USAD8_cccc01111000dddd1111mmmm0001nnnn_case_0()2686   USAD8_cccc01111000dddd1111mmmm0001nnnn_case_0()
2687      : ClassDecoder() {}
2688   virtual RegisterList defs(Instruction inst) const;
2689   virtual SafetyLevel safety(Instruction i) const;
2690   virtual RegisterList uses(Instruction i) const;
2691  private:
2692   NACL_DISALLOW_COPY_AND_ASSIGN(
2693       USAD8_cccc01111000dddd1111mmmm0001nnnn_case_0);
2694 };
2695 
2696 // USADA8_cccc01111000ddddaaaammmm0001nnnn_case_0:
2697 //
2698 //   {Pc: 15,
2699 //    Ra: Ra(15:12),
2700 //    Rd: Rd(19:16),
2701 //    Rm: Rm(11:8),
2702 //    Rn: Rn(3:0),
2703 //    arch: v6,
2704 //    cond: cond(31:28),
2705 //    defs: {Rd},
2706 //    fields: [cond(31:28), Rd(19:16), Ra(15:12), Rm(11:8), Rn(3:0)],
2707 //    pattern: cccc01111000ddddaaaammmm0001nnnn,
2708 //    rule: USADA8,
2709 //    safety: [Ra  ==
2710 //            Pc => DECODER_ERROR,
2711 //      Pc in {Rd, Rn, Rm} => UNPREDICTABLE],
2712 //    uses: {Rn, Rm, Ra}}
2713 class USADA8_cccc01111000ddddaaaammmm0001nnnn_case_0
2714      : public ClassDecoder {
2715  public:
USADA8_cccc01111000ddddaaaammmm0001nnnn_case_0()2716   USADA8_cccc01111000ddddaaaammmm0001nnnn_case_0()
2717      : ClassDecoder() {}
2718   virtual RegisterList defs(Instruction inst) const;
2719   virtual SafetyLevel safety(Instruction i) const;
2720   virtual RegisterList uses(Instruction i) const;
2721  private:
2722   NACL_DISALLOW_COPY_AND_ASSIGN(
2723       USADA8_cccc01111000ddddaaaammmm0001nnnn_case_0);
2724 };
2725 
2726 // USAT16_cccc01101110iiiidddd11110011nnnn_case_0:
2727 //
2728 //   {Pc: 15,
2729 //    Rd: Rd(15:12),
2730 //    Rn: Rn(3:0),
2731 //    arch: v6,
2732 //    cond: cond(31:28),
2733 //    defs: {Rd},
2734 //    fields: [cond(31:28), sat_imm(19:16), Rd(15:12), Rn(3:0)],
2735 //    pattern: cccc01101110iiiidddd11110011nnnn,
2736 //    rule: USAT16,
2737 //    safety: [Pc in {Rd, Rn} => UNPREDICTABLE],
2738 //    sat_imm: sat_imm(19:16),
2739 //    saturate_to: sat_imm,
2740 //    uses: {Rn}}
2741 class USAT16_cccc01101110iiiidddd11110011nnnn_case_0
2742      : public ClassDecoder {
2743  public:
USAT16_cccc01101110iiiidddd11110011nnnn_case_0()2744   USAT16_cccc01101110iiiidddd11110011nnnn_case_0()
2745      : ClassDecoder() {}
2746   virtual RegisterList defs(Instruction inst) const;
2747   virtual SafetyLevel safety(Instruction i) const;
2748   virtual RegisterList uses(Instruction i) const;
2749  private:
2750   NACL_DISALLOW_COPY_AND_ASSIGN(
2751       USAT16_cccc01101110iiiidddd11110011nnnn_case_0);
2752 };
2753 
2754 // USAT_cccc0110111iiiiiddddiiiiis01nnnn_case_0:
2755 //
2756 //   {Pc: 15,
2757 //    Rd: Rd(15:12),
2758 //    Rn: Rn(3:0),
2759 //    arch: v6,
2760 //    cond: cond(31:28),
2761 //    defs: {Rd},
2762 //    fields: [cond(31:28),
2763 //      sat_imm(20:16),
2764 //      Rd(15:12),
2765 //      imm5(11:7),
2766 //      sh(6),
2767 //      Rn(3:0)],
2768 //    imm5: imm5(11:7),
2769 //    pattern: cccc0110111iiiiiddddiiiiis01nnnn,
2770 //    rule: USAT,
2771 //    safety: [Pc in {Rd, Rn} => UNPREDICTABLE],
2772 //    sat_imm: sat_imm(20:16),
2773 //    saturate_to: sat_imm,
2774 //    sh: sh(6),
2775 //    shift: DecodeImmShift(sh:'0'(0), imm5),
2776 //    uses: {Rn}}
2777 class USAT_cccc0110111iiiiiddddiiiiis01nnnn_case_0
2778      : public ClassDecoder {
2779  public:
USAT_cccc0110111iiiiiddddiiiiis01nnnn_case_0()2780   USAT_cccc0110111iiiiiddddiiiiis01nnnn_case_0()
2781      : ClassDecoder() {}
2782   virtual RegisterList defs(Instruction inst) const;
2783   virtual SafetyLevel safety(Instruction i) const;
2784   virtual RegisterList uses(Instruction i) const;
2785  private:
2786   NACL_DISALLOW_COPY_AND_ASSIGN(
2787       USAT_cccc0110111iiiiiddddiiiiis01nnnn_case_0);
2788 };
2789 
2790 // USAX_cccc01100101nnnndddd11110101mmmm_case_0:
2791 //
2792 //   {Pc: 15,
2793 //    Rd: Rd(15:12),
2794 //    Rm: Rm(3:0),
2795 //    Rn: Rn(19:16),
2796 //    arch: v6,
2797 //    cond: cond(31:28),
2798 //    defs: {Rd},
2799 //    fields: [cond(31:28), Rn(19:16), Rd(15:12), Rm(3:0)],
2800 //    pattern: cccc01100101nnnndddd11110101mmmm,
2801 //    rule: USAX,
2802 //    safety: [Pc in {Rd, Rn, Rm} => UNPREDICTABLE],
2803 //    uses: {Rn, Rm}}
2804 class USAX_cccc01100101nnnndddd11110101mmmm_case_0
2805      : public ClassDecoder {
2806  public:
USAX_cccc01100101nnnndddd11110101mmmm_case_0()2807   USAX_cccc01100101nnnndddd11110101mmmm_case_0()
2808      : ClassDecoder() {}
2809   virtual RegisterList defs(Instruction inst) const;
2810   virtual SafetyLevel safety(Instruction i) const;
2811   virtual RegisterList uses(Instruction i) const;
2812  private:
2813   NACL_DISALLOW_COPY_AND_ASSIGN(
2814       USAX_cccc01100101nnnndddd11110101mmmm_case_0);
2815 };
2816 
2817 // USUB16_cccc01100101nnnndddd11110111mmmm_case_0:
2818 //
2819 //   {Pc: 15,
2820 //    Rd: Rd(15:12),
2821 //    Rm: Rm(3:0),
2822 //    Rn: Rn(19:16),
2823 //    arch: v6,
2824 //    cond: cond(31:28),
2825 //    defs: {Rd},
2826 //    fields: [cond(31:28), Rn(19:16), Rd(15:12), Rm(3:0)],
2827 //    pattern: cccc01100101nnnndddd11110111mmmm,
2828 //    rule: USUB16,
2829 //    safety: [Pc in {Rd, Rn, Rm} => UNPREDICTABLE],
2830 //    uses: {Rn, Rm}}
2831 class USUB16_cccc01100101nnnndddd11110111mmmm_case_0
2832      : public ClassDecoder {
2833  public:
USUB16_cccc01100101nnnndddd11110111mmmm_case_0()2834   USUB16_cccc01100101nnnndddd11110111mmmm_case_0()
2835      : ClassDecoder() {}
2836   virtual RegisterList defs(Instruction inst) const;
2837   virtual SafetyLevel safety(Instruction i) const;
2838   virtual RegisterList uses(Instruction i) const;
2839  private:
2840   NACL_DISALLOW_COPY_AND_ASSIGN(
2841       USUB16_cccc01100101nnnndddd11110111mmmm_case_0);
2842 };
2843 
2844 // USUB8_cccc01100101nnnndddd11111111mmmm_case_0:
2845 //
2846 //   {Pc: 15,
2847 //    Rd: Rd(15:12),
2848 //    Rm: Rm(3:0),
2849 //    Rn: Rn(19:16),
2850 //    arch: v6,
2851 //    cond: cond(31:28),
2852 //    defs: {Rd},
2853 //    fields: [cond(31:28), Rn(19:16), Rd(15:12), Rm(3:0)],
2854 //    pattern: cccc01100101nnnndddd11111111mmmm,
2855 //    rule: USUB8,
2856 //    safety: [Pc in {Rd, Rn, Rm} => UNPREDICTABLE],
2857 //    uses: {Rn, Rm}}
2858 class USUB8_cccc01100101nnnndddd11111111mmmm_case_0
2859      : public ClassDecoder {
2860  public:
USUB8_cccc01100101nnnndddd11111111mmmm_case_0()2861   USUB8_cccc01100101nnnndddd11111111mmmm_case_0()
2862      : ClassDecoder() {}
2863   virtual RegisterList defs(Instruction inst) const;
2864   virtual SafetyLevel safety(Instruction i) const;
2865   virtual RegisterList uses(Instruction i) const;
2866  private:
2867   NACL_DISALLOW_COPY_AND_ASSIGN(
2868       USUB8_cccc01100101nnnndddd11111111mmmm_case_0);
2869 };
2870 
2871 // UXTAB16_cccc01101100nnnnddddrr000111mmmm_case_0:
2872 //
2873 //   {Pc: 15,
2874 //    Rd: Rd(15:12),
2875 //    Rm: Rm(3:0),
2876 //    Rn: Rn(19:16),
2877 //    arch: v6,
2878 //    cond: cond(31:28),
2879 //    defs: {Rd},
2880 //    fields: [cond(31:28), Rn(19:16), Rd(15:12), rotate(11:10), Rm(3:0)],
2881 //    pattern: cccc01101100nnnnddddrr000111mmmm,
2882 //    rotate: rotate(11:10),
2883 //    rotation: rotate:'000'(2:0),
2884 //    rule: UXTAB16,
2885 //    safety: [Rn(19:16)=1111 => DECODER_ERROR,
2886 //      Pc in {Rd, Rm} => UNPREDICTABLE],
2887 //    uses: {Rn, Rm}}
2888 class UXTAB16_cccc01101100nnnnddddrr000111mmmm_case_0
2889      : public ClassDecoder {
2890  public:
UXTAB16_cccc01101100nnnnddddrr000111mmmm_case_0()2891   UXTAB16_cccc01101100nnnnddddrr000111mmmm_case_0()
2892      : ClassDecoder() {}
2893   virtual RegisterList defs(Instruction inst) const;
2894   virtual SafetyLevel safety(Instruction i) const;
2895   virtual RegisterList uses(Instruction i) const;
2896  private:
2897   NACL_DISALLOW_COPY_AND_ASSIGN(
2898       UXTAB16_cccc01101100nnnnddddrr000111mmmm_case_0);
2899 };
2900 
2901 // UXTAB_cccc01101110nnnnddddrr000111mmmm_case_0:
2902 //
2903 //   {Pc: 15,
2904 //    Rd: Rd(15:12),
2905 //    Rm: Rm(3:0),
2906 //    Rn: Rn(19:16),
2907 //    arch: v6,
2908 //    cond: cond(31:28),
2909 //    defs: {Rd},
2910 //    fields: [cond(31:28), Rn(19:16), Rd(15:12), rotate(11:10), Rm(3:0)],
2911 //    pattern: cccc01101110nnnnddddrr000111mmmm,
2912 //    rotate: rotate(11:10),
2913 //    rotation: rotate:'000'(2:0),
2914 //    rule: UXTAB,
2915 //    safety: [Rn(19:16)=1111 => DECODER_ERROR,
2916 //      Pc in {Rd, Rm} => UNPREDICTABLE],
2917 //    uses: {Rn, Rm}}
2918 class UXTAB_cccc01101110nnnnddddrr000111mmmm_case_0
2919      : public ClassDecoder {
2920  public:
UXTAB_cccc01101110nnnnddddrr000111mmmm_case_0()2921   UXTAB_cccc01101110nnnnddddrr000111mmmm_case_0()
2922      : ClassDecoder() {}
2923   virtual RegisterList defs(Instruction inst) const;
2924   virtual SafetyLevel safety(Instruction i) const;
2925   virtual RegisterList uses(Instruction i) const;
2926  private:
2927   NACL_DISALLOW_COPY_AND_ASSIGN(
2928       UXTAB_cccc01101110nnnnddddrr000111mmmm_case_0);
2929 };
2930 
2931 // UXTAH_cccc01101111nnnnddddrr000111mmmm_case_0:
2932 //
2933 //   {Pc: 15,
2934 //    Rd: Rd(15:12),
2935 //    Rm: Rm(3:0),
2936 //    Rn: Rn(19:16),
2937 //    arch: v6,
2938 //    cond: cond(31:28),
2939 //    defs: {Rd},
2940 //    fields: [cond(31:28), Rn(19:16), Rd(15:12), rotate(11:10), Rm(3:0)],
2941 //    pattern: cccc01101111nnnnddddrr000111mmmm,
2942 //    rotate: rotate(11:10),
2943 //    rotation: rotate:'000'(2:0),
2944 //    rule: UXTAH,
2945 //    safety: [Rn(19:16)=1111 => DECODER_ERROR,
2946 //      Pc in {Rd, Rm} => UNPREDICTABLE],
2947 //    uses: {Rn, Rm}}
2948 class UXTAH_cccc01101111nnnnddddrr000111mmmm_case_0
2949      : public ClassDecoder {
2950  public:
UXTAH_cccc01101111nnnnddddrr000111mmmm_case_0()2951   UXTAH_cccc01101111nnnnddddrr000111mmmm_case_0()
2952      : ClassDecoder() {}
2953   virtual RegisterList defs(Instruction inst) const;
2954   virtual SafetyLevel safety(Instruction i) const;
2955   virtual RegisterList uses(Instruction i) const;
2956  private:
2957   NACL_DISALLOW_COPY_AND_ASSIGN(
2958       UXTAH_cccc01101111nnnnddddrr000111mmmm_case_0);
2959 };
2960 
2961 // UXTB16_cccc011011001111ddddrr000111mmmm_case_0:
2962 //
2963 //   {Pc: 15,
2964 //    Rd: Rd(15:12),
2965 //    Rm: Rm(3:0),
2966 //    arch: v6,
2967 //    cond: cond(31:28),
2968 //    defs: {Rd},
2969 //    fields: [cond(31:28), Rd(15:12), rotate(11:10), Rm(3:0)],
2970 //    pattern: cccc011011001111ddddrr000111mmmm,
2971 //    rotate: rotate(11:10),
2972 //    rotation: rotate:'000'(2:0),
2973 //    rule: UXTB16,
2974 //    safety: [Pc in {Rd, Rm} => UNPREDICTABLE],
2975 //    uses: {Rm}}
2976 class UXTB16_cccc011011001111ddddrr000111mmmm_case_0
2977      : public ClassDecoder {
2978  public:
UXTB16_cccc011011001111ddddrr000111mmmm_case_0()2979   UXTB16_cccc011011001111ddddrr000111mmmm_case_0()
2980      : ClassDecoder() {}
2981   virtual RegisterList defs(Instruction inst) const;
2982   virtual SafetyLevel safety(Instruction i) const;
2983   virtual RegisterList uses(Instruction i) const;
2984  private:
2985   NACL_DISALLOW_COPY_AND_ASSIGN(
2986       UXTB16_cccc011011001111ddddrr000111mmmm_case_0);
2987 };
2988 
2989 // UXTB_cccc011011101111ddddrr000111mmmm_case_0:
2990 //
2991 //   {Pc: 15,
2992 //    Rd: Rd(15:12),
2993 //    Rm: Rm(3:0),
2994 //    arch: v6,
2995 //    cond: cond(31:28),
2996 //    defs: {Rd},
2997 //    fields: [cond(31:28), Rd(15:12), rotate(11:10), Rm(3:0)],
2998 //    pattern: cccc011011101111ddddrr000111mmmm,
2999 //    rotate: rotate(11:10),
3000 //    rotation: rotate:'000'(2:0),
3001 //    rule: UXTB,
3002 //    safety: [Pc in {Rd, Rm} => UNPREDICTABLE],
3003 //    uses: {Rm}}
3004 class UXTB_cccc011011101111ddddrr000111mmmm_case_0
3005      : public ClassDecoder {
3006  public:
UXTB_cccc011011101111ddddrr000111mmmm_case_0()3007   UXTB_cccc011011101111ddddrr000111mmmm_case_0()
3008      : ClassDecoder() {}
3009   virtual RegisterList defs(Instruction inst) const;
3010   virtual SafetyLevel safety(Instruction i) const;
3011   virtual RegisterList uses(Instruction i) const;
3012  private:
3013   NACL_DISALLOW_COPY_AND_ASSIGN(
3014       UXTB_cccc011011101111ddddrr000111mmmm_case_0);
3015 };
3016 
3017 // UXTH_cccc011011111111ddddrr000111mmmm_case_0:
3018 //
3019 //   {Pc: 15,
3020 //    Rd: Rd(15:12),
3021 //    Rm: Rm(3:0),
3022 //    arch: v6,
3023 //    cond: cond(31:28),
3024 //    defs: {Rd},
3025 //    fields: [cond(31:28), Rd(15:12), rotate(11:10), Rm(3:0)],
3026 //    pattern: cccc011011111111ddddrr000111mmmm,
3027 //    rotate: rotate(11:10),
3028 //    rotation: rotate:'000'(2:0),
3029 //    rule: UXTH,
3030 //    safety: [Pc in {Rd, Rm} => UNPREDICTABLE],
3031 //    uses: {Rm}}
3032 class UXTH_cccc011011111111ddddrr000111mmmm_case_0
3033      : public ClassDecoder {
3034  public:
UXTH_cccc011011111111ddddrr000111mmmm_case_0()3035   UXTH_cccc011011111111ddddrr000111mmmm_case_0()
3036      : ClassDecoder() {}
3037   virtual RegisterList defs(Instruction inst) const;
3038   virtual SafetyLevel safety(Instruction i) const;
3039   virtual RegisterList uses(Instruction i) const;
3040  private:
3041   NACL_DISALLOW_COPY_AND_ASSIGN(
3042       UXTH_cccc011011111111ddddrr000111mmmm_case_0);
3043 };
3044 
3045 // Unnamed_11110100x001xxxxxxxxxxxxxxxxxxxx_case_0:
3046 //
3047 //   {arch: MPExt,
3048 //    defs: {},
3049 //    pattern: 11110100x001xxxxxxxxxxxxxxxxxxxx,
3050 //    safety: [true => FORBIDDEN],
3051 //    true: true,
3052 //    uses: {}}
3053 class Unnamed_11110100x001xxxxxxxxxxxxxxxxxxxx_case_0
3054      : public ClassDecoder {
3055  public:
Unnamed_11110100x001xxxxxxxxxxxxxxxxxxxx_case_0()3056   Unnamed_11110100x001xxxxxxxxxxxxxxxxxxxx_case_0()
3057      : ClassDecoder() {}
3058   virtual RegisterList defs(Instruction inst) const;
3059   virtual SafetyLevel safety(Instruction i) const;
3060   virtual RegisterList uses(Instruction i) const;
3061  private:
3062   NACL_DISALLOW_COPY_AND_ASSIGN(
3063       Unnamed_11110100x001xxxxxxxxxxxxxxxxxxxx_case_0);
3064 };
3065 
3066 // Unnamed_11110100xx11xxxxxxxxxxxxxxxxxxxx_case_0:
3067 //
3068 //   {defs: {},
3069 //    pattern: 11110100xx11xxxxxxxxxxxxxxxxxxxx,
3070 //    safety: [true => UNPREDICTABLE],
3071 //    true: true,
3072 //    uses: {}}
3073 class Unnamed_11110100xx11xxxxxxxxxxxxxxxxxxxx_case_0
3074      : public ClassDecoder {
3075  public:
Unnamed_11110100xx11xxxxxxxxxxxxxxxxxxxx_case_0()3076   Unnamed_11110100xx11xxxxxxxxxxxxxxxxxxxx_case_0()
3077      : ClassDecoder() {}
3078   virtual RegisterList defs(Instruction inst) const;
3079   virtual SafetyLevel safety(Instruction i) const;
3080   virtual RegisterList uses(Instruction i) const;
3081  private:
3082   NACL_DISALLOW_COPY_AND_ASSIGN(
3083       Unnamed_11110100xx11xxxxxxxxxxxxxxxxxxxx_case_0);
3084 };
3085 
3086 // Unnamed_111101010011xxxxxxxxxxxxxxxxxxxx_case_0:
3087 //
3088 //   {defs: {},
3089 //    pattern: 111101010011xxxxxxxxxxxxxxxxxxxx,
3090 //    safety: [true => UNPREDICTABLE],
3091 //    true: true,
3092 //    uses: {}}
3093 class Unnamed_111101010011xxxxxxxxxxxxxxxxxxxx_case_0
3094      : public ClassDecoder {
3095  public:
Unnamed_111101010011xxxxxxxxxxxxxxxxxxxx_case_0()3096   Unnamed_111101010011xxxxxxxxxxxxxxxxxxxx_case_0()
3097      : ClassDecoder() {}
3098   virtual RegisterList defs(Instruction inst) const;
3099   virtual SafetyLevel safety(Instruction i) const;
3100   virtual RegisterList uses(Instruction i) const;
3101  private:
3102   NACL_DISALLOW_COPY_AND_ASSIGN(
3103       Unnamed_111101010011xxxxxxxxxxxxxxxxxxxx_case_0);
3104 };
3105 
3106 // Unnamed_111101010111xxxxxxxxxxxx0000xxxx_case_0:
3107 //
3108 //   {defs: {},
3109 //    pattern: 111101010111xxxxxxxxxxxx0000xxxx,
3110 //    safety: [true => UNPREDICTABLE],
3111 //    true: true,
3112 //    uses: {}}
3113 class Unnamed_111101010111xxxxxxxxxxxx0000xxxx_case_0
3114      : public ClassDecoder {
3115  public:
Unnamed_111101010111xxxxxxxxxxxx0000xxxx_case_0()3116   Unnamed_111101010111xxxxxxxxxxxx0000xxxx_case_0()
3117      : ClassDecoder() {}
3118   virtual RegisterList defs(Instruction inst) const;
3119   virtual SafetyLevel safety(Instruction i) const;
3120   virtual RegisterList uses(Instruction i) const;
3121  private:
3122   NACL_DISALLOW_COPY_AND_ASSIGN(
3123       Unnamed_111101010111xxxxxxxxxxxx0000xxxx_case_0);
3124 };
3125 
3126 // Unnamed_111101010111xxxxxxxxxxxx001xxxxx_case_0:
3127 //
3128 //   {defs: {},
3129 //    pattern: 111101010111xxxxxxxxxxxx001xxxxx,
3130 //    safety: [true => UNPREDICTABLE],
3131 //    true: true,
3132 //    uses: {}}
3133 class Unnamed_111101010111xxxxxxxxxxxx001xxxxx_case_0
3134      : public ClassDecoder {
3135  public:
Unnamed_111101010111xxxxxxxxxxxx001xxxxx_case_0()3136   Unnamed_111101010111xxxxxxxxxxxx001xxxxx_case_0()
3137      : ClassDecoder() {}
3138   virtual RegisterList defs(Instruction inst) const;
3139   virtual SafetyLevel safety(Instruction i) const;
3140   virtual RegisterList uses(Instruction i) const;
3141  private:
3142   NACL_DISALLOW_COPY_AND_ASSIGN(
3143       Unnamed_111101010111xxxxxxxxxxxx001xxxxx_case_0);
3144 };
3145 
3146 // Unnamed_111101010111xxxxxxxxxxxx0111xxxx_case_0:
3147 //
3148 //   {defs: {},
3149 //    pattern: 111101010111xxxxxxxxxxxx0111xxxx,
3150 //    safety: [true => UNPREDICTABLE],
3151 //    true: true,
3152 //    uses: {}}
3153 class Unnamed_111101010111xxxxxxxxxxxx0111xxxx_case_0
3154      : public ClassDecoder {
3155  public:
Unnamed_111101010111xxxxxxxxxxxx0111xxxx_case_0()3156   Unnamed_111101010111xxxxxxxxxxxx0111xxxx_case_0()
3157      : ClassDecoder() {}
3158   virtual RegisterList defs(Instruction inst) const;
3159   virtual SafetyLevel safety(Instruction i) const;
3160   virtual RegisterList uses(Instruction i) const;
3161  private:
3162   NACL_DISALLOW_COPY_AND_ASSIGN(
3163       Unnamed_111101010111xxxxxxxxxxxx0111xxxx_case_0);
3164 };
3165 
3166 // Unnamed_111101010111xxxxxxxxxxxx1xxxxxxx_case_0:
3167 //
3168 //   {defs: {},
3169 //    pattern: 111101010111xxxxxxxxxxxx1xxxxxxx,
3170 //    safety: [true => UNPREDICTABLE],
3171 //    true: true,
3172 //    uses: {}}
3173 class Unnamed_111101010111xxxxxxxxxxxx1xxxxxxx_case_0
3174      : public ClassDecoder {
3175  public:
Unnamed_111101010111xxxxxxxxxxxx1xxxxxxx_case_0()3176   Unnamed_111101010111xxxxxxxxxxxx1xxxxxxx_case_0()
3177      : ClassDecoder() {}
3178   virtual RegisterList defs(Instruction inst) const;
3179   virtual SafetyLevel safety(Instruction i) const;
3180   virtual RegisterList uses(Instruction i) const;
3181  private:
3182   NACL_DISALLOW_COPY_AND_ASSIGN(
3183       Unnamed_111101010111xxxxxxxxxxxx1xxxxxxx_case_0);
3184 };
3185 
3186 // Unnamed_111101011x11xxxxxxxxxxxxxxxxxxxx_case_0:
3187 //
3188 //   {defs: {},
3189 //    pattern: 111101011x11xxxxxxxxxxxxxxxxxxxx,
3190 //    safety: [true => UNPREDICTABLE],
3191 //    true: true,
3192 //    uses: {}}
3193 class Unnamed_111101011x11xxxxxxxxxxxxxxxxxxxx_case_0
3194      : public ClassDecoder {
3195  public:
Unnamed_111101011x11xxxxxxxxxxxxxxxxxxxx_case_0()3196   Unnamed_111101011x11xxxxxxxxxxxxxxxxxxxx_case_0()
3197      : ClassDecoder() {}
3198   virtual RegisterList defs(Instruction inst) const;
3199   virtual SafetyLevel safety(Instruction i) const;
3200   virtual RegisterList uses(Instruction i) const;
3201  private:
3202   NACL_DISALLOW_COPY_AND_ASSIGN(
3203       Unnamed_111101011x11xxxxxxxxxxxxxxxxxxxx_case_0);
3204 };
3205 
3206 // Unnamed_11110101x001xxxxxxxxxxxxxxxxxxxx_case_0:
3207 //
3208 //   {defs: {},
3209 //    pattern: 11110101x001xxxxxxxxxxxxxxxxxxxx,
3210 //    safety: [true => UNPREDICTABLE],
3211 //    true: true,
3212 //    uses: {}}
3213 class Unnamed_11110101x001xxxxxxxxxxxxxxxxxxxx_case_0
3214      : public ClassDecoder {
3215  public:
Unnamed_11110101x001xxxxxxxxxxxxxxxxxxxx_case_0()3216   Unnamed_11110101x001xxxxxxxxxxxxxxxxxxxx_case_0()
3217      : ClassDecoder() {}
3218   virtual RegisterList defs(Instruction inst) const;
3219   virtual SafetyLevel safety(Instruction i) const;
3220   virtual RegisterList uses(Instruction i) const;
3221  private:
3222   NACL_DISALLOW_COPY_AND_ASSIGN(
3223       Unnamed_11110101x001xxxxxxxxxxxxxxxxxxxx_case_0);
3224 };
3225 
3226 // Unnamed_11110110x001xxxxxxxxxxxxxxx0xxxx_case_0:
3227 //
3228 //   {arch: MPExt,
3229 //    defs: {},
3230 //    pattern: 11110110x001xxxxxxxxxxxxxxx0xxxx,
3231 //    safety: [true => FORBIDDEN],
3232 //    true: true,
3233 //    uses: {}}
3234 class Unnamed_11110110x001xxxxxxxxxxxxxxx0xxxx_case_0
3235      : public ClassDecoder {
3236  public:
Unnamed_11110110x001xxxxxxxxxxxxxxx0xxxx_case_0()3237   Unnamed_11110110x001xxxxxxxxxxxxxxx0xxxx_case_0()
3238      : ClassDecoder() {}
3239   virtual RegisterList defs(Instruction inst) const;
3240   virtual SafetyLevel safety(Instruction i) const;
3241   virtual RegisterList uses(Instruction i) const;
3242  private:
3243   NACL_DISALLOW_COPY_AND_ASSIGN(
3244       Unnamed_11110110x001xxxxxxxxxxxxxxx0xxxx_case_0);
3245 };
3246 
3247 // Unnamed_1111011xxx11xxxxxxxxxxxxxxx0xxxx_case_0:
3248 //
3249 //   {defs: {},
3250 //    pattern: 1111011xxx11xxxxxxxxxxxxxxx0xxxx,
3251 //    safety: [true => UNPREDICTABLE],
3252 //    true: true,
3253 //    uses: {}}
3254 class Unnamed_1111011xxx11xxxxxxxxxxxxxxx0xxxx_case_0
3255      : public ClassDecoder {
3256  public:
Unnamed_1111011xxx11xxxxxxxxxxxxxxx0xxxx_case_0()3257   Unnamed_1111011xxx11xxxxxxxxxxxxxxx0xxxx_case_0()
3258      : ClassDecoder() {}
3259   virtual RegisterList defs(Instruction inst) const;
3260   virtual SafetyLevel safety(Instruction i) const;
3261   virtual RegisterList uses(Instruction i) const;
3262  private:
3263   NACL_DISALLOW_COPY_AND_ASSIGN(
3264       Unnamed_1111011xxx11xxxxxxxxxxxxxxx0xxxx_case_0);
3265 };
3266 
3267 // Unnamed_case_0:
3268 //
3269 //   {defs: {},
3270 //    safety: [true => FORBIDDEN],
3271 //    true: true,
3272 //    uses: {}}
3273 class Unnamed_case_0
3274      : public ClassDecoder {
3275  public:
Unnamed_case_0()3276   Unnamed_case_0()
3277      : ClassDecoder() {}
3278   virtual RegisterList defs(Instruction inst) const;
3279   virtual SafetyLevel safety(Instruction i) const;
3280   virtual RegisterList uses(Instruction i) const;
3281  private:
3282   NACL_DISALLOW_COPY_AND_ASSIGN(
3283       Unnamed_case_0);
3284 };
3285 
3286 // Unnamed_case_1:
3287 //
3288 //   {defs: {},
3289 //    safety: [true => UNDEFINED],
3290 //    true: true,
3291 //    uses: {}}
3292 class Unnamed_case_1
3293      : public ClassDecoder {
3294  public:
Unnamed_case_1()3295   Unnamed_case_1()
3296      : ClassDecoder() {}
3297   virtual RegisterList defs(Instruction inst) const;
3298   virtual SafetyLevel safety(Instruction i) const;
3299   virtual RegisterList uses(Instruction i) const;
3300  private:
3301   NACL_DISALLOW_COPY_AND_ASSIGN(
3302       Unnamed_case_1);
3303 };
3304 
3305 // Unnamed_cccc00000101xxxxxxxxxxxx1001xxxx_case_0:
3306 //
3307 //   {defs: {},
3308 //    pattern: cccc00000101xxxxxxxxxxxx1001xxxx,
3309 //    safety: [true => UNDEFINED],
3310 //    true: true,
3311 //    uses: {}}
3312 class Unnamed_cccc00000101xxxxxxxxxxxx1001xxxx_case_0
3313      : public ClassDecoder {
3314  public:
Unnamed_cccc00000101xxxxxxxxxxxx1001xxxx_case_0()3315   Unnamed_cccc00000101xxxxxxxxxxxx1001xxxx_case_0()
3316      : ClassDecoder() {}
3317   virtual RegisterList defs(Instruction inst) const;
3318   virtual SafetyLevel safety(Instruction i) const;
3319   virtual RegisterList uses(Instruction i) const;
3320  private:
3321   NACL_DISALLOW_COPY_AND_ASSIGN(
3322       Unnamed_cccc00000101xxxxxxxxxxxx1001xxxx_case_0);
3323 };
3324 
3325 // Unnamed_cccc00000111xxxxxxxxxxxx1001xxxx_case_0:
3326 //
3327 //   {defs: {},
3328 //    pattern: cccc00000111xxxxxxxxxxxx1001xxxx,
3329 //    safety: [true => UNDEFINED],
3330 //    true: true,
3331 //    uses: {}}
3332 class Unnamed_cccc00000111xxxxxxxxxxxx1001xxxx_case_0
3333      : public ClassDecoder {
3334  public:
Unnamed_cccc00000111xxxxxxxxxxxx1001xxxx_case_0()3335   Unnamed_cccc00000111xxxxxxxxxxxx1001xxxx_case_0()
3336      : ClassDecoder() {}
3337   virtual RegisterList defs(Instruction inst) const;
3338   virtual SafetyLevel safety(Instruction i) const;
3339   virtual RegisterList uses(Instruction i) const;
3340  private:
3341   NACL_DISALLOW_COPY_AND_ASSIGN(
3342       Unnamed_cccc00000111xxxxxxxxxxxx1001xxxx_case_0);
3343 };
3344 
3345 // Unnamed_cccc1100000xnnnnxxxxccccxxxoxxxx_case_0:
3346 //
3347 //   {defs: {},
3348 //    pattern: cccc1100000xnnnnxxxxccccxxxoxxxx,
3349 //    safety: [true => UNDEFINED],
3350 //    true: true,
3351 //    uses: {}}
3352 class Unnamed_cccc1100000xnnnnxxxxccccxxxoxxxx_case_0
3353      : public ClassDecoder {
3354  public:
Unnamed_cccc1100000xnnnnxxxxccccxxxoxxxx_case_0()3355   Unnamed_cccc1100000xnnnnxxxxccccxxxoxxxx_case_0()
3356      : ClassDecoder() {}
3357   virtual RegisterList defs(Instruction inst) const;
3358   virtual SafetyLevel safety(Instruction i) const;
3359   virtual RegisterList uses(Instruction i) const;
3360  private:
3361   NACL_DISALLOW_COPY_AND_ASSIGN(
3362       Unnamed_cccc1100000xnnnnxxxxccccxxxoxxxx_case_0);
3363 };
3364 
3365 // VABAL_A2_1111001u1dssnnnndddd0101n0m0mmmm_case_0:
3366 //
3367 //   {D: D(22),
3368 //    M: M(5),
3369 //    N: N(7),
3370 //    U: U(24),
3371 //    Vd: Vd(15:12),
3372 //    Vm: Vm(3:0),
3373 //    Vn: Vn(19:16),
3374 //    d: D:Vd,
3375 //    defs: {},
3376 //    elements: 64 / esize,
3377 //    esize: 8 << size,
3378 //    fields: [U(24),
3379 //      D(22),
3380 //      size(21:20),
3381 //      Vn(19:16),
3382 //      Vd(15:12),
3383 //      op(8),
3384 //      N(7),
3385 //      M(5),
3386 //      Vm(3:0)],
3387 //    m: M:Vm,
3388 //    n: N:Vn,
3389 //    op: op(8),
3390 //    pattern: 1111001u1dssnnnndddd0101n0m0mmmm,
3391 //    rule: VABAL_A2,
3392 //    safety: [size(21:20)=11 => DECODER_ERROR, Vd(0)=1 => UNDEFINED],
3393 //    size: size(21:20),
3394 //    unsigned: U(24)=1,
3395 //    uses: {}}
3396 class VABAL_A2_1111001u1dssnnnndddd0101n0m0mmmm_case_0
3397      : public ClassDecoder {
3398  public:
VABAL_A2_1111001u1dssnnnndddd0101n0m0mmmm_case_0()3399   VABAL_A2_1111001u1dssnnnndddd0101n0m0mmmm_case_0()
3400      : ClassDecoder() {}
3401   virtual RegisterList defs(Instruction inst) const;
3402   virtual SafetyLevel safety(Instruction i) const;
3403   virtual RegisterList uses(Instruction i) const;
3404  private:
3405   NACL_DISALLOW_COPY_AND_ASSIGN(
3406       VABAL_A2_1111001u1dssnnnndddd0101n0m0mmmm_case_0);
3407 };
3408 
3409 // VABA_1111001u0dssnnnndddd0111nqm1mmmm_case_0:
3410 //
3411 //   {D: D(22),
3412 //    M: M(5),
3413 //    N: N(7),
3414 //    Q: Q(6),
3415 //    U: U(24),
3416 //    Vd: Vd(15:12),
3417 //    Vm: Vm(3:0),
3418 //    Vn: Vn(19:16),
3419 //    arch: ASIMD,
3420 //    d: D:Vd,
3421 //    defs: {},
3422 //    elements: 64 / esize,
3423 //    esize: 8 << size,
3424 //    fields: [U(24),
3425 //      D(22),
3426 //      size(21:20),
3427 //      Vn(19:16),
3428 //      Vd(15:12),
3429 //      op(9),
3430 //      N(7),
3431 //      Q(6),
3432 //      M(5),
3433 //      Vm(3:0)],
3434 //    m: M:Vm,
3435 //    n: N:Vn,
3436 //    op: op(9),
3437 //    pattern: 1111001u0dssnnnndddd0111nqm1mmmm,
3438 //    regs: 1
3439 //         if Q(6)=0
3440 //         else 2,
3441 //    rule: VABA,
3442 //    safety: [Q(6)=1 &&
3443 //         (Vd(0)=1 ||
3444 //         Vn(0)=1 ||
3445 //         Vm(0)=1) => UNDEFINED,
3446 //      size(21:20)=11 => UNDEFINED],
3447 //    size: size(21:20),
3448 //    unsigned: U(24)=1,
3449 //    uses: {}}
3450 class VABA_1111001u0dssnnnndddd0111nqm1mmmm_case_0
3451      : public ClassDecoder {
3452  public:
VABA_1111001u0dssnnnndddd0111nqm1mmmm_case_0()3453   VABA_1111001u0dssnnnndddd0111nqm1mmmm_case_0()
3454      : ClassDecoder() {}
3455   virtual RegisterList defs(Instruction inst) const;
3456   virtual SafetyLevel safety(Instruction i) const;
3457   virtual RegisterList uses(Instruction i) const;
3458  private:
3459   NACL_DISALLOW_COPY_AND_ASSIGN(
3460       VABA_1111001u0dssnnnndddd0111nqm1mmmm_case_0);
3461 };
3462 
3463 // VABDL_integer_A2_1111001u1dssnnnndddd0111n0m0mmmm_case_0:
3464 //
3465 //   {D: D(22),
3466 //    M: M(5),
3467 //    N: N(7),
3468 //    U: U(24),
3469 //    Vd: Vd(15:12),
3470 //    Vm: Vm(3:0),
3471 //    Vn: Vn(19:16),
3472 //    d: D:Vd,
3473 //    defs: {},
3474 //    elements: 64 / esize,
3475 //    esize: 8 << size,
3476 //    fields: [U(24),
3477 //      D(22),
3478 //      size(21:20),
3479 //      Vn(19:16),
3480 //      Vd(15:12),
3481 //      op(8),
3482 //      N(7),
3483 //      M(5),
3484 //      Vm(3:0)],
3485 //    m: M:Vm,
3486 //    n: N:Vn,
3487 //    op: op(8),
3488 //    pattern: 1111001u1dssnnnndddd0111n0m0mmmm,
3489 //    rule: VABDL_integer_A2,
3490 //    safety: [size(21:20)=11 => DECODER_ERROR, Vd(0)=1 => UNDEFINED],
3491 //    size: size(21:20),
3492 //    unsigned: U(24)=1,
3493 //    uses: {}}
3494 class VABDL_integer_A2_1111001u1dssnnnndddd0111n0m0mmmm_case_0
3495      : public ClassDecoder {
3496  public:
VABDL_integer_A2_1111001u1dssnnnndddd0111n0m0mmmm_case_0()3497   VABDL_integer_A2_1111001u1dssnnnndddd0111n0m0mmmm_case_0()
3498      : ClassDecoder() {}
3499   virtual RegisterList defs(Instruction inst) const;
3500   virtual SafetyLevel safety(Instruction i) const;
3501   virtual RegisterList uses(Instruction i) const;
3502  private:
3503   NACL_DISALLOW_COPY_AND_ASSIGN(
3504       VABDL_integer_A2_1111001u1dssnnnndddd0111n0m0mmmm_case_0);
3505 };
3506 
3507 // VABD_1111001u0dssnnnndddd0111nqm0mmmm_case_0:
3508 //
3509 //   {D: D(22),
3510 //    M: M(5),
3511 //    N: N(7),
3512 //    Q: Q(6),
3513 //    U: U(24),
3514 //    Vd: Vd(15:12),
3515 //    Vm: Vm(3:0),
3516 //    Vn: Vn(19:16),
3517 //    arch: ASIMD,
3518 //    d: D:Vd,
3519 //    defs: {},
3520 //    elements: 64 / esize,
3521 //    esize: 8 << size,
3522 //    fields: [U(24),
3523 //      D(22),
3524 //      size(21:20),
3525 //      Vn(19:16),
3526 //      Vd(15:12),
3527 //      op(9),
3528 //      N(7),
3529 //      Q(6),
3530 //      M(5),
3531 //      Vm(3:0)],
3532 //    m: M:Vm,
3533 //    n: N:Vn,
3534 //    op: op(9),
3535 //    pattern: 1111001u0dssnnnndddd0111nqm0mmmm,
3536 //    regs: 1
3537 //         if Q(6)=0
3538 //         else 2,
3539 //    rule: VABD,
3540 //    safety: [Q(6)=1 &&
3541 //         (Vd(0)=1 ||
3542 //         Vn(0)=1 ||
3543 //         Vm(0)=1) => UNDEFINED,
3544 //      size(21:20)=11 => UNDEFINED],
3545 //    size: size(21:20),
3546 //    unsigned: U(24)=1,
3547 //    uses: {}}
3548 class VABD_1111001u0dssnnnndddd0111nqm0mmmm_case_0
3549      : public ClassDecoder {
3550  public:
VABD_1111001u0dssnnnndddd0111nqm0mmmm_case_0()3551   VABD_1111001u0dssnnnndddd0111nqm0mmmm_case_0()
3552      : ClassDecoder() {}
3553   virtual RegisterList defs(Instruction inst) const;
3554   virtual SafetyLevel safety(Instruction i) const;
3555   virtual RegisterList uses(Instruction i) const;
3556  private:
3557   NACL_DISALLOW_COPY_AND_ASSIGN(
3558       VABD_1111001u0dssnnnndddd0111nqm0mmmm_case_0);
3559 };
3560 
3561 // VABD_floating_point_111100110d1snnnndddd1101nqm0mmmm_case_0:
3562 //
3563 //   {D: D(22),
3564 //    M: M(5),
3565 //    N: N(7),
3566 //    Q: Q(6),
3567 //    U: U(24),
3568 //    Vd: Vd(15:12),
3569 //    Vm: Vm(3:0),
3570 //    Vn: Vn(19:16),
3571 //    arch: ASIMD,
3572 //    d: D:Vd,
3573 //    defs: {},
3574 //    elements: 2,
3575 //    esize: 32,
3576 //    fields: [U(24),
3577 //      D(22),
3578 //      size(21:20),
3579 //      Vn(19:16),
3580 //      Vd(15:12),
3581 //      op(9),
3582 //      N(7),
3583 //      Q(6),
3584 //      M(5),
3585 //      Vm(3:0)],
3586 //    m: M:Vm,
3587 //    n: N:Vn,
3588 //    op: op(9),
3589 //    op1_neg: size(1),
3590 //    pattern: 111100110d1snnnndddd1101nqm0mmmm,
3591 //    rule: VABD_floating_point,
3592 //    safety: [Q(6)=1 &&
3593 //         (Vd(0)=1 ||
3594 //         Vn(0)=1 ||
3595 //         Vm(0)=1) => UNDEFINED,
3596 //      size(0)=1 => UNDEFINED],
3597 //    size: size(21:20),
3598 //    sz: size(0),
3599 //    uses: {}}
3600 class VABD_floating_point_111100110d1snnnndddd1101nqm0mmmm_case_0
3601      : public ClassDecoder {
3602  public:
VABD_floating_point_111100110d1snnnndddd1101nqm0mmmm_case_0()3603   VABD_floating_point_111100110d1snnnndddd1101nqm0mmmm_case_0()
3604      : ClassDecoder() {}
3605   virtual RegisterList defs(Instruction inst) const;
3606   virtual SafetyLevel safety(Instruction i) const;
3607   virtual RegisterList uses(Instruction i) const;
3608  private:
3609   NACL_DISALLOW_COPY_AND_ASSIGN(
3610       VABD_floating_point_111100110d1snnnndddd1101nqm0mmmm_case_0);
3611 };
3612 
3613 // VABS_A1_111100111d11ss01dddd0f110qm0mmmm_case_0:
3614 //
3615 //   {D: D(22),
3616 //    F: F(10),
3617 //    M: M(5),
3618 //    Q: Q(6),
3619 //    Vd: Vd(15:12),
3620 //    Vm: Vm(3:0),
3621 //    arch: ASIMD,
3622 //    d: D:Vd,
3623 //    defs: {},
3624 //    elements: 64 / esize,
3625 //    esize: 8 << size,
3626 //    fields: [D(22),
3627 //      size(19:18),
3628 //      Vd(15:12),
3629 //      F(10),
3630 //      op(8:7),
3631 //      Q(6),
3632 //      M(5),
3633 //      Vm(3:0)],
3634 //    m: M:Vm,
3635 //    op: op(8:7),
3636 //    pattern: 111100111d11ss01dddd0f110qm0mmmm,
3637 //    regs: 1
3638 //         if Q(6)=0
3639 //         else 2,
3640 //    rule: VABS_A1,
3641 //    safety: [size(19:18)=11 => UNDEFINED,
3642 //      Q(6)=1 &&
3643 //         (Vd(0)=1 ||
3644 //         Vm(0)=1) => UNDEFINED],
3645 //    size: size(19:18),
3646 //    uses: {}}
3647 class VABS_A1_111100111d11ss01dddd0f110qm0mmmm_case_0
3648      : public ClassDecoder {
3649  public:
VABS_A1_111100111d11ss01dddd0f110qm0mmmm_case_0()3650   VABS_A1_111100111d11ss01dddd0f110qm0mmmm_case_0()
3651      : ClassDecoder() {}
3652   virtual RegisterList defs(Instruction inst) const;
3653   virtual SafetyLevel safety(Instruction i) const;
3654   virtual RegisterList uses(Instruction i) const;
3655  private:
3656   NACL_DISALLOW_COPY_AND_ASSIGN(
3657       VABS_A1_111100111d11ss01dddd0f110qm0mmmm_case_0);
3658 };
3659 
3660 // VABS_A1_111100111d11ss01dddd0f110qm0mmmm_case_1:
3661 //
3662 //   {D: D(22),
3663 //    F: F(10),
3664 //    M: M(5),
3665 //    Q: Q(6),
3666 //    Vd: Vd(15:12),
3667 //    Vm: Vm(3:0),
3668 //    arch: ASIMD,
3669 //    d: D:Vd,
3670 //    defs: {},
3671 //    elements: 64 / esize,
3672 //    esize: 8 << size,
3673 //    fields: [D(22),
3674 //      size(19:18),
3675 //      Vd(15:12),
3676 //      F(10),
3677 //      op(8:7),
3678 //      Q(6),
3679 //      M(5),
3680 //      Vm(3:0)],
3681 //    m: M:Vm,
3682 //    op: op(8:7),
3683 //    pattern: 111100111d11ss01dddd0f110qm0mmmm,
3684 //    regs: 1
3685 //         if Q(6)=0
3686 //         else 2,
3687 //    rule: VABS_A1,
3688 //    safety: [Q(6)=1 &&
3689 //         (Vd(0)=1 ||
3690 //         Vm(0)=1) => UNDEFINED,
3691 //      size(19:18)=~10 => UNDEFINED],
3692 //    size: size(19:18),
3693 //    uses: {}}
3694 class VABS_A1_111100111d11ss01dddd0f110qm0mmmm_case_1
3695      : public ClassDecoder {
3696  public:
VABS_A1_111100111d11ss01dddd0f110qm0mmmm_case_1()3697   VABS_A1_111100111d11ss01dddd0f110qm0mmmm_case_1()
3698      : ClassDecoder() {}
3699   virtual RegisterList defs(Instruction inst) const;
3700   virtual SafetyLevel safety(Instruction i) const;
3701   virtual RegisterList uses(Instruction i) const;
3702  private:
3703   NACL_DISALLOW_COPY_AND_ASSIGN(
3704       VABS_A1_111100111d11ss01dddd0f110qm0mmmm_case_1);
3705 };
3706 
3707 // VABS_cccc11101d110000dddd101s11m0mmmm_case_0:
3708 //
3709 //   {D: D(22),
3710 //    M: M(5),
3711 //    Vd: Vd(15:12),
3712 //    Vm: Vm(3:0),
3713 //    advsimd: false,
3714 //    arch: VFPv2,
3715 //    cond: cond(31:28),
3716 //    d: Vd:D
3717 //         if sz(8)=0
3718 //         else D:Vd,
3719 //    defs: {},
3720 //    dp_operation: sz(8)=1,
3721 //    false: false,
3722 //    fields: [cond(31:28), D(22), Vd(15:12), sz(8), M(5), Vm(3:0)],
3723 //    m: Vm:D
3724 //         if sz(8)=0
3725 //         else M:Vm,
3726 //    pattern: cccc11101d110000dddd101s11m0mmmm,
3727 //    rule: VABS,
3728 //    safety: [true => MAY_BE_SAFE],
3729 //    sz: sz(8),
3730 //    true: true,
3731 //    uses: {}}
3732 class VABS_cccc11101d110000dddd101s11m0mmmm_case_0
3733      : public ClassDecoder {
3734  public:
VABS_cccc11101d110000dddd101s11m0mmmm_case_0()3735   VABS_cccc11101d110000dddd101s11m0mmmm_case_0()
3736      : ClassDecoder() {}
3737   virtual RegisterList defs(Instruction inst) const;
3738   virtual SafetyLevel safety(Instruction i) const;
3739   virtual RegisterList uses(Instruction i) const;
3740  private:
3741   NACL_DISALLOW_COPY_AND_ASSIGN(
3742       VABS_cccc11101d110000dddd101s11m0mmmm_case_0);
3743 };
3744 
3745 // VACGE_111100110dssnnnndddd1110nqm1mmmm_case_0:
3746 //
3747 //   {D: D(22),
3748 //    M: M(5),
3749 //    N: N(7),
3750 //    Q: Q(6),
3751 //    U: U(24),
3752 //    Vd: Vd(15:12),
3753 //    Vm: Vm(3:0),
3754 //    Vn: Vn(19:16),
3755 //    arch: ASIMD,
3756 //    d: D:Vd,
3757 //    defs: {},
3758 //    elements: 2,
3759 //    esize: 32,
3760 //    fields: [U(24),
3761 //      D(22),
3762 //      size(21:20),
3763 //      Vn(19:16),
3764 //      Vd(15:12),
3765 //      op(9),
3766 //      N(7),
3767 //      Q(6),
3768 //      M(5),
3769 //      Vm(3:0)],
3770 //    m: M:Vm,
3771 //    n: N:Vn,
3772 //    op: op(9),
3773 //    op1_neg: size(1),
3774 //    pattern: 111100110dssnnnndddd1110nqm1mmmm,
3775 //    rule: VACGE,
3776 //    safety: [Q(6)=1 &&
3777 //         (Vd(0)=1 ||
3778 //         Vn(0)=1 ||
3779 //         Vm(0)=1) => UNDEFINED,
3780 //      size(0)=1 => UNDEFINED],
3781 //    size: size(21:20),
3782 //    sz: size(0),
3783 //    uses: {}}
3784 class VACGE_111100110dssnnnndddd1110nqm1mmmm_case_0
3785      : public ClassDecoder {
3786  public:
VACGE_111100110dssnnnndddd1110nqm1mmmm_case_0()3787   VACGE_111100110dssnnnndddd1110nqm1mmmm_case_0()
3788      : ClassDecoder() {}
3789   virtual RegisterList defs(Instruction inst) const;
3790   virtual SafetyLevel safety(Instruction i) const;
3791   virtual RegisterList uses(Instruction i) const;
3792  private:
3793   NACL_DISALLOW_COPY_AND_ASSIGN(
3794       VACGE_111100110dssnnnndddd1110nqm1mmmm_case_0);
3795 };
3796 
3797 // VACGT_111100110dssnnnndddd1110nqm1mmmm_case_0:
3798 //
3799 //   {D: D(22),
3800 //    M: M(5),
3801 //    N: N(7),
3802 //    Q: Q(6),
3803 //    U: U(24),
3804 //    Vd: Vd(15:12),
3805 //    Vm: Vm(3:0),
3806 //    Vn: Vn(19:16),
3807 //    arch: ASIMD,
3808 //    d: D:Vd,
3809 //    defs: {},
3810 //    elements: 2,
3811 //    esize: 32,
3812 //    fields: [U(24),
3813 //      D(22),
3814 //      size(21:20),
3815 //      Vn(19:16),
3816 //      Vd(15:12),
3817 //      op(9),
3818 //      N(7),
3819 //      Q(6),
3820 //      M(5),
3821 //      Vm(3:0)],
3822 //    m: M:Vm,
3823 //    n: N:Vn,
3824 //    op: op(9),
3825 //    op1_neg: size(1),
3826 //    pattern: 111100110dssnnnndddd1110nqm1mmmm,
3827 //    rule: VACGT,
3828 //    safety: [Q(6)=1 &&
3829 //         (Vd(0)=1 ||
3830 //         Vn(0)=1 ||
3831 //         Vm(0)=1) => UNDEFINED,
3832 //      size(0)=1 => UNDEFINED],
3833 //    size: size(21:20),
3834 //    sz: size(0),
3835 //    uses: {}}
3836 class VACGT_111100110dssnnnndddd1110nqm1mmmm_case_0
3837      : public ClassDecoder {
3838  public:
VACGT_111100110dssnnnndddd1110nqm1mmmm_case_0()3839   VACGT_111100110dssnnnndddd1110nqm1mmmm_case_0()
3840      : ClassDecoder() {}
3841   virtual RegisterList defs(Instruction inst) const;
3842   virtual SafetyLevel safety(Instruction i) const;
3843   virtual RegisterList uses(Instruction i) const;
3844  private:
3845   NACL_DISALLOW_COPY_AND_ASSIGN(
3846       VACGT_111100110dssnnnndddd1110nqm1mmmm_case_0);
3847 };
3848 
3849 // VADDHN_111100101dssnnnndddd0100n0m0mmmm_case_0:
3850 //
3851 //   {D: D(22),
3852 //    M: M(5),
3853 //    N: N(7),
3854 //    U: U(24),
3855 //    Vd: Vd(15:12),
3856 //    Vm: Vm(3:0),
3857 //    Vn: Vn(19:16),
3858 //    d: D:Vd,
3859 //    defs: {},
3860 //    elements: 64 / esize,
3861 //    esize: 8 << size,
3862 //    fields: [U(24),
3863 //      D(22),
3864 //      size(21:20),
3865 //      Vn(19:16),
3866 //      Vd(15:12),
3867 //      op(8),
3868 //      N(7),
3869 //      M(5),
3870 //      Vm(3:0)],
3871 //    m: M:Vm,
3872 //    n: N:Vn,
3873 //    op: op(8),
3874 //    pattern: 111100101dssnnnndddd0100n0m0mmmm,
3875 //    rule: VADDHN,
3876 //    safety: [size(21:20)=11 => DECODER_ERROR,
3877 //      Vn(0)=1 ||
3878 //         Vm(0)=1 => UNDEFINED],
3879 //    size: size(21:20),
3880 //    unsigned: U(24)=1,
3881 //    uses: {}}
3882 class VADDHN_111100101dssnnnndddd0100n0m0mmmm_case_0
3883      : public ClassDecoder {
3884  public:
VADDHN_111100101dssnnnndddd0100n0m0mmmm_case_0()3885   VADDHN_111100101dssnnnndddd0100n0m0mmmm_case_0()
3886      : ClassDecoder() {}
3887   virtual RegisterList defs(Instruction inst) const;
3888   virtual SafetyLevel safety(Instruction i) const;
3889   virtual RegisterList uses(Instruction i) const;
3890  private:
3891   NACL_DISALLOW_COPY_AND_ASSIGN(
3892       VADDHN_111100101dssnnnndddd0100n0m0mmmm_case_0);
3893 };
3894 
3895 // VADDL_VADDW_1111001u1dssnnnndddd000pn0m0mmmm_case_0:
3896 //
3897 //   {D: D(22),
3898 //    M: M(5),
3899 //    N: N(7),
3900 //    U: U(24),
3901 //    Vd: Vd(15:12),
3902 //    Vm: Vm(3:0),
3903 //    Vn: Vn(19:16),
3904 //    d: D:Vd,
3905 //    defs: {},
3906 //    elements: 64 / esize,
3907 //    esize: 8 << size,
3908 //    fields: [U(24),
3909 //      D(22),
3910 //      size(21:20),
3911 //      Vn(19:16),
3912 //      Vd(15:12),
3913 //      op(8),
3914 //      N(7),
3915 //      M(5),
3916 //      Vm(3:0)],
3917 //    is_vaddw: U(24)=1,
3918 //    is_w: op(8)=1,
3919 //    m: M:Vm,
3920 //    n: N:Vn,
3921 //    op: op(8),
3922 //    pattern: 1111001u1dssnnnndddd000pn0m0mmmm,
3923 //    rule: VADDL_VADDW,
3924 //    safety: [size(21:20)=11 => DECODER_ERROR,
3925 //      Vd(0)=1 ||
3926 //         (op(8)=1 &&
3927 //         Vn(0)=1) => UNDEFINED],
3928 //    size: size(21:20),
3929 //    unsigned: U(24)=1,
3930 //    uses: {}}
3931 class VADDL_VADDW_1111001u1dssnnnndddd000pn0m0mmmm_case_0
3932      : public ClassDecoder {
3933  public:
VADDL_VADDW_1111001u1dssnnnndddd000pn0m0mmmm_case_0()3934   VADDL_VADDW_1111001u1dssnnnndddd000pn0m0mmmm_case_0()
3935      : ClassDecoder() {}
3936   virtual RegisterList defs(Instruction inst) const;
3937   virtual SafetyLevel safety(Instruction i) const;
3938   virtual RegisterList uses(Instruction i) const;
3939  private:
3940   NACL_DISALLOW_COPY_AND_ASSIGN(
3941       VADDL_VADDW_1111001u1dssnnnndddd000pn0m0mmmm_case_0);
3942 };
3943 
3944 // VADD_floating_point_A1_111100100d0snnnndddd1101nqm0mmmm_case_0:
3945 //
3946 //   {D: D(22),
3947 //    M: M(5),
3948 //    N: N(7),
3949 //    Q: Q(6),
3950 //    U: U(24),
3951 //    Vd: Vd(15:12),
3952 //    Vm: Vm(3:0),
3953 //    Vn: Vn(19:16),
3954 //    arch: ASIMD,
3955 //    d: D:Vd,
3956 //    defs: {},
3957 //    elements: 2,
3958 //    esize: 32,
3959 //    fields: [U(24),
3960 //      D(22),
3961 //      size(21:20),
3962 //      Vn(19:16),
3963 //      Vd(15:12),
3964 //      op(9),
3965 //      N(7),
3966 //      Q(6),
3967 //      M(5),
3968 //      Vm(3:0)],
3969 //    m: M:Vm,
3970 //    n: N:Vn,
3971 //    op: op(9),
3972 //    op1_neg: size(1),
3973 //    pattern: 111100100d0snnnndddd1101nqm0mmmm,
3974 //    rule: VADD_floating_point_A1,
3975 //    safety: [Q(6)=1 &&
3976 //         (Vd(0)=1 ||
3977 //         Vn(0)=1 ||
3978 //         Vm(0)=1) => UNDEFINED,
3979 //      size(0)=1 => UNDEFINED],
3980 //    size: size(21:20),
3981 //    sz: size(0),
3982 //    uses: {}}
3983 class VADD_floating_point_A1_111100100d0snnnndddd1101nqm0mmmm_case_0
3984      : public ClassDecoder {
3985  public:
VADD_floating_point_A1_111100100d0snnnndddd1101nqm0mmmm_case_0()3986   VADD_floating_point_A1_111100100d0snnnndddd1101nqm0mmmm_case_0()
3987      : ClassDecoder() {}
3988   virtual RegisterList defs(Instruction inst) const;
3989   virtual SafetyLevel safety(Instruction i) const;
3990   virtual RegisterList uses(Instruction i) const;
3991  private:
3992   NACL_DISALLOW_COPY_AND_ASSIGN(
3993       VADD_floating_point_A1_111100100d0snnnndddd1101nqm0mmmm_case_0);
3994 };
3995 
3996 // VADD_floating_point_cccc11100d11nnnndddd101sn0m0mmmm_case_0:
3997 //
3998 //   {D: D(22),
3999 //    M: M(5),
4000 //    N: N(7),
4001 //    Vd: Vd(15:12),
4002 //    Vm: Vm(3:0),
4003 //    Vn: Vn(19:16),
4004 //    advsimd: false,
4005 //    arch: VFPv2,
4006 //    cond: cond(31:28),
4007 //    d: D:Vd
4008 //         if dp_operation
4009 //         else Vd:D,
4010 //    defs: {},
4011 //    dp_operation: sz(8)=1,
4012 //    false: false,
4013 //    fields: [cond(31:28),
4014 //      D(22),
4015 //      Vn(19:16),
4016 //      Vd(15:12),
4017 //      sz(8),
4018 //      N(7),
4019 //      M(5),
4020 //      Vm(3:0)],
4021 //    m: M:Vm
4022 //         if dp_operation
4023 //         else Vm:M,
4024 //    n: N:Vn
4025 //         if dp_operation
4026 //         else Vn:N,
4027 //    pattern: cccc11100d11nnnndddd101sn0m0mmmm,
4028 //    rule: VADD_floating_point,
4029 //    safety: [cond(31:28)=1111 => DECODER_ERROR],
4030 //    sz: sz(8),
4031 //    uses: {}}
4032 class VADD_floating_point_cccc11100d11nnnndddd101sn0m0mmmm_case_0
4033      : public ClassDecoder {
4034  public:
VADD_floating_point_cccc11100d11nnnndddd101sn0m0mmmm_case_0()4035   VADD_floating_point_cccc11100d11nnnndddd101sn0m0mmmm_case_0()
4036      : ClassDecoder() {}
4037   virtual RegisterList defs(Instruction inst) const;
4038   virtual SafetyLevel safety(Instruction i) const;
4039   virtual RegisterList uses(Instruction i) const;
4040  private:
4041   NACL_DISALLOW_COPY_AND_ASSIGN(
4042       VADD_floating_point_cccc11100d11nnnndddd101sn0m0mmmm_case_0);
4043 };
4044 
4045 // VADD_integer_111100100dssnnnndddd1000nqm0mmmm_case_0:
4046 //
4047 //   {D: D(22),
4048 //    M: M(5),
4049 //    N: N(7),
4050 //    Q: Q(6),
4051 //    U: U(24),
4052 //    Vd: Vd(15:12),
4053 //    Vm: Vm(3:0),
4054 //    Vn: Vn(19:16),
4055 //    arch: ASIMD,
4056 //    d: D:Vd,
4057 //    defs: {},
4058 //    elements: 64 / esize,
4059 //    esize: 8 << size,
4060 //    fields: [U(24),
4061 //      D(22),
4062 //      size(21:20),
4063 //      Vn(19:16),
4064 //      Vd(15:12),
4065 //      op(9),
4066 //      N(7),
4067 //      Q(6),
4068 //      M(5),
4069 //      Vm(3:0)],
4070 //    m: M:Vm,
4071 //    n: N:Vn,
4072 //    op: op(9),
4073 //    pattern: 111100100dssnnnndddd1000nqm0mmmm,
4074 //    regs: 1
4075 //         if Q(6)=0
4076 //         else 2,
4077 //    rule: VADD_integer,
4078 //    safety: [Q(6)=1 &&
4079 //         (Vd(0)=1 ||
4080 //         Vn(0)=1 ||
4081 //         Vm(0)=1) => UNDEFINED],
4082 //    size: size(21:20),
4083 //    unsigned: U(24)=1,
4084 //    uses: {}}
4085 class VADD_integer_111100100dssnnnndddd1000nqm0mmmm_case_0
4086      : public ClassDecoder {
4087  public:
VADD_integer_111100100dssnnnndddd1000nqm0mmmm_case_0()4088   VADD_integer_111100100dssnnnndddd1000nqm0mmmm_case_0()
4089      : ClassDecoder() {}
4090   virtual RegisterList defs(Instruction inst) const;
4091   virtual SafetyLevel safety(Instruction i) const;
4092   virtual RegisterList uses(Instruction i) const;
4093  private:
4094   NACL_DISALLOW_COPY_AND_ASSIGN(
4095       VADD_integer_111100100dssnnnndddd1000nqm0mmmm_case_0);
4096 };
4097 
4098 // VAND_register_111100100d00nnnndddd0001nqm1mmmm_case_0:
4099 //
4100 //   {D: D(22),
4101 //    M: M(5),
4102 //    N: N(7),
4103 //    Q: Q(6),
4104 //    U: U(24),
4105 //    Vd: Vd(15:12),
4106 //    Vm: Vm(3:0),
4107 //    Vn: Vn(19:16),
4108 //    arch: ASIMD,
4109 //    d: D:Vd,
4110 //    defs: {},
4111 //    fields: [U(24),
4112 //      D(22),
4113 //      size(21:20),
4114 //      Vn(19:16),
4115 //      Vd(15:12),
4116 //      op(9),
4117 //      N(7),
4118 //      Q(6),
4119 //      M(5),
4120 //      Vm(3:0)],
4121 //    m: M:Vm,
4122 //    n: N:Vn,
4123 //    op: op(9),
4124 //    pattern: 111100100d00nnnndddd0001nqm1mmmm,
4125 //    regs: 1
4126 //         if Q(6)=0
4127 //         else 2,
4128 //    rule: VAND_register,
4129 //    safety: [Q(6)=1 &&
4130 //         (Vd(0)=1 ||
4131 //         Vn(0)=1 ||
4132 //         Vm(0)=1) => UNDEFINED],
4133 //    size: size(21:20),
4134 //    uses: {}}
4135 class VAND_register_111100100d00nnnndddd0001nqm1mmmm_case_0
4136      : public ClassDecoder {
4137  public:
VAND_register_111100100d00nnnndddd0001nqm1mmmm_case_0()4138   VAND_register_111100100d00nnnndddd0001nqm1mmmm_case_0()
4139      : ClassDecoder() {}
4140   virtual RegisterList defs(Instruction inst) const;
4141   virtual SafetyLevel safety(Instruction i) const;
4142   virtual RegisterList uses(Instruction i) const;
4143  private:
4144   NACL_DISALLOW_COPY_AND_ASSIGN(
4145       VAND_register_111100100d00nnnndddd0001nqm1mmmm_case_0);
4146 };
4147 
4148 // VBIC_immediate_1111001i1d000mmmddddcccc0q11mmmm_case_0:
4149 //
4150 //   {D: D(22),
4151 //    Q: Q(6),
4152 //    Vd: Vd(15:12),
4153 //    arch: ASIMD,
4154 //    cmode: cmode(11:8),
4155 //    d: D:Vd,
4156 //    defs: {},
4157 //    fields: [i(24),
4158 //      D(22),
4159 //      imm3(18:16),
4160 //      Vd(15:12),
4161 //      cmode(11:8),
4162 //      Q(6),
4163 //      op(5),
4164 //      imm4(3:0)],
4165 //    i: i(24),
4166 //    imm3: imm3(18:16),
4167 //    imm4: imm4(3:0),
4168 //    imm64: AdvSIMDExpandImm(op, cmode, i:imm3:imm4),
4169 //    op: op(5),
4170 //    pattern: 1111001i1d000mmmddddcccc0q11mmmm,
4171 //    regs: 1
4172 //         if Q(6)=0
4173 //         else 2,
4174 //    rule: VBIC_immediate,
4175 //    safety: [cmode(0)=0 ||
4176 //         cmode(3:2)=11 => DECODER_ERROR,
4177 //      Q(6)=1 &&
4178 //         Vd(0)=1 => UNDEFINED],
4179 //    uses: {}}
4180 class VBIC_immediate_1111001i1d000mmmddddcccc0q11mmmm_case_0
4181      : public ClassDecoder {
4182  public:
VBIC_immediate_1111001i1d000mmmddddcccc0q11mmmm_case_0()4183   VBIC_immediate_1111001i1d000mmmddddcccc0q11mmmm_case_0()
4184      : ClassDecoder() {}
4185   virtual RegisterList defs(Instruction inst) const;
4186   virtual SafetyLevel safety(Instruction i) const;
4187   virtual RegisterList uses(Instruction i) const;
4188  private:
4189   NACL_DISALLOW_COPY_AND_ASSIGN(
4190       VBIC_immediate_1111001i1d000mmmddddcccc0q11mmmm_case_0);
4191 };
4192 
4193 // VBIC_register_111100100d01nnnndddd0001nqm1mmmm_case_0:
4194 //
4195 //   {D: D(22),
4196 //    M: M(5),
4197 //    N: N(7),
4198 //    Q: Q(6),
4199 //    U: U(24),
4200 //    Vd: Vd(15:12),
4201 //    Vm: Vm(3:0),
4202 //    Vn: Vn(19:16),
4203 //    arch: ASIMD,
4204 //    d: D:Vd,
4205 //    defs: {},
4206 //    fields: [U(24),
4207 //      D(22),
4208 //      size(21:20),
4209 //      Vn(19:16),
4210 //      Vd(15:12),
4211 //      op(9),
4212 //      N(7),
4213 //      Q(6),
4214 //      M(5),
4215 //      Vm(3:0)],
4216 //    m: M:Vm,
4217 //    n: N:Vn,
4218 //    op: op(9),
4219 //    pattern: 111100100d01nnnndddd0001nqm1mmmm,
4220 //    regs: 1
4221 //         if Q(6)=0
4222 //         else 2,
4223 //    rule: VBIC_register,
4224 //    safety: [Q(6)=1 &&
4225 //         (Vd(0)=1 ||
4226 //         Vn(0)=1 ||
4227 //         Vm(0)=1) => UNDEFINED],
4228 //    size: size(21:20),
4229 //    uses: {}}
4230 class VBIC_register_111100100d01nnnndddd0001nqm1mmmm_case_0
4231      : public ClassDecoder {
4232  public:
VBIC_register_111100100d01nnnndddd0001nqm1mmmm_case_0()4233   VBIC_register_111100100d01nnnndddd0001nqm1mmmm_case_0()
4234      : ClassDecoder() {}
4235   virtual RegisterList defs(Instruction inst) const;
4236   virtual SafetyLevel safety(Instruction i) const;
4237   virtual RegisterList uses(Instruction i) const;
4238  private:
4239   NACL_DISALLOW_COPY_AND_ASSIGN(
4240       VBIC_register_111100100d01nnnndddd0001nqm1mmmm_case_0);
4241 };
4242 
4243 // VBIF_111100110d11nnnndddd0001nqm1mmmm_case_0:
4244 //
4245 //   {D: D(22),
4246 //    M: M(5),
4247 //    N: N(7),
4248 //    Q: Q(6),
4249 //    U: U(24),
4250 //    Vd: Vd(15:12),
4251 //    Vm: Vm(3:0),
4252 //    Vn: Vn(19:16),
4253 //    arch: ASIMD,
4254 //    d: D:Vd,
4255 //    defs: {},
4256 //    fields: [U(24),
4257 //      D(22),
4258 //      size(21:20),
4259 //      Vn(19:16),
4260 //      Vd(15:12),
4261 //      op(9),
4262 //      N(7),
4263 //      Q(6),
4264 //      M(5),
4265 //      Vm(3:0)],
4266 //    m: M:Vm,
4267 //    n: N:Vn,
4268 //    op: op(9),
4269 //    pattern: 111100110d11nnnndddd0001nqm1mmmm,
4270 //    regs: 1
4271 //         if Q(6)=0
4272 //         else 2,
4273 //    rule: VBIF,
4274 //    safety: [Q(6)=1 &&
4275 //         (Vd(0)=1 ||
4276 //         Vn(0)=1 ||
4277 //         Vm(0)=1) => UNDEFINED],
4278 //    size: size(21:20),
4279 //    uses: {}}
4280 class VBIF_111100110d11nnnndddd0001nqm1mmmm_case_0
4281      : public ClassDecoder {
4282  public:
VBIF_111100110d11nnnndddd0001nqm1mmmm_case_0()4283   VBIF_111100110d11nnnndddd0001nqm1mmmm_case_0()
4284      : ClassDecoder() {}
4285   virtual RegisterList defs(Instruction inst) const;
4286   virtual SafetyLevel safety(Instruction i) const;
4287   virtual RegisterList uses(Instruction i) const;
4288  private:
4289   NACL_DISALLOW_COPY_AND_ASSIGN(
4290       VBIF_111100110d11nnnndddd0001nqm1mmmm_case_0);
4291 };
4292 
4293 // VBIT_111100110d10nnnndddd0001nqm1mmmm_case_0:
4294 //
4295 //   {D: D(22),
4296 //    M: M(5),
4297 //    N: N(7),
4298 //    Q: Q(6),
4299 //    U: U(24),
4300 //    Vd: Vd(15:12),
4301 //    Vm: Vm(3:0),
4302 //    Vn: Vn(19:16),
4303 //    arch: ASIMD,
4304 //    d: D:Vd,
4305 //    defs: {},
4306 //    fields: [U(24),
4307 //      D(22),
4308 //      size(21:20),
4309 //      Vn(19:16),
4310 //      Vd(15:12),
4311 //      op(9),
4312 //      N(7),
4313 //      Q(6),
4314 //      M(5),
4315 //      Vm(3:0)],
4316 //    m: M:Vm,
4317 //    n: N:Vn,
4318 //    op: op(9),
4319 //    pattern: 111100110d10nnnndddd0001nqm1mmmm,
4320 //    regs: 1
4321 //         if Q(6)=0
4322 //         else 2,
4323 //    rule: VBIT,
4324 //    safety: [Q(6)=1 &&
4325 //         (Vd(0)=1 ||
4326 //         Vn(0)=1 ||
4327 //         Vm(0)=1) => UNDEFINED],
4328 //    size: size(21:20),
4329 //    uses: {}}
4330 class VBIT_111100110d10nnnndddd0001nqm1mmmm_case_0
4331      : public ClassDecoder {
4332  public:
VBIT_111100110d10nnnndddd0001nqm1mmmm_case_0()4333   VBIT_111100110d10nnnndddd0001nqm1mmmm_case_0()
4334      : ClassDecoder() {}
4335   virtual RegisterList defs(Instruction inst) const;
4336   virtual SafetyLevel safety(Instruction i) const;
4337   virtual RegisterList uses(Instruction i) const;
4338  private:
4339   NACL_DISALLOW_COPY_AND_ASSIGN(
4340       VBIT_111100110d10nnnndddd0001nqm1mmmm_case_0);
4341 };
4342 
4343 // VBSL_111100110d01nnnndddd0001nqm1mmmm_case_0:
4344 //
4345 //   {D: D(22),
4346 //    M: M(5),
4347 //    N: N(7),
4348 //    Q: Q(6),
4349 //    U: U(24),
4350 //    Vd: Vd(15:12),
4351 //    Vm: Vm(3:0),
4352 //    Vn: Vn(19:16),
4353 //    arch: ASIMD,
4354 //    d: D:Vd,
4355 //    defs: {},
4356 //    fields: [U(24),
4357 //      D(22),
4358 //      size(21:20),
4359 //      Vn(19:16),
4360 //      Vd(15:12),
4361 //      op(9),
4362 //      N(7),
4363 //      Q(6),
4364 //      M(5),
4365 //      Vm(3:0)],
4366 //    m: M:Vm,
4367 //    n: N:Vn,
4368 //    op: op(9),
4369 //    pattern: 111100110d01nnnndddd0001nqm1mmmm,
4370 //    regs: 1
4371 //         if Q(6)=0
4372 //         else 2,
4373 //    rule: VBSL,
4374 //    safety: [Q(6)=1 &&
4375 //         (Vd(0)=1 ||
4376 //         Vn(0)=1 ||
4377 //         Vm(0)=1) => UNDEFINED],
4378 //    size: size(21:20),
4379 //    uses: {}}
4380 class VBSL_111100110d01nnnndddd0001nqm1mmmm_case_0
4381      : public ClassDecoder {
4382  public:
VBSL_111100110d01nnnndddd0001nqm1mmmm_case_0()4383   VBSL_111100110d01nnnndddd0001nqm1mmmm_case_0()
4384      : ClassDecoder() {}
4385   virtual RegisterList defs(Instruction inst) const;
4386   virtual SafetyLevel safety(Instruction i) const;
4387   virtual RegisterList uses(Instruction i) const;
4388  private:
4389   NACL_DISALLOW_COPY_AND_ASSIGN(
4390       VBSL_111100110d01nnnndddd0001nqm1mmmm_case_0);
4391 };
4392 
4393 // VCEQ_immediate_0_111100111d11ss01dddd0f010qm0mmmm_case_0:
4394 //
4395 //   {D: D(22),
4396 //    F: F(10),
4397 //    M: M(5),
4398 //    Q: Q(6),
4399 //    Vd: Vd(15:12),
4400 //    Vm: Vm(3:0),
4401 //    arch: ASIMD,
4402 //    d: D:Vd,
4403 //    defs: {},
4404 //    elements: 64 / esize,
4405 //    esize: 8 << size,
4406 //    fields: [D(22),
4407 //      size(19:18),
4408 //      Vd(15:12),
4409 //      F(10),
4410 //      op(8:7),
4411 //      Q(6),
4412 //      M(5),
4413 //      Vm(3:0)],
4414 //    m: M:Vm,
4415 //    op: op(8:7),
4416 //    pattern: 111100111d11ss01dddd0f010qm0mmmm,
4417 //    regs: 1
4418 //         if Q(6)=0
4419 //         else 2,
4420 //    rule: VCEQ_immediate_0,
4421 //    safety: [size(19:18)=11 => UNDEFINED,
4422 //      Q(6)=1 &&
4423 //         (Vd(0)=1 ||
4424 //         Vm(0)=1) => UNDEFINED],
4425 //    size: size(19:18),
4426 //    uses: {}}
4427 class VCEQ_immediate_0_111100111d11ss01dddd0f010qm0mmmm_case_0
4428      : public ClassDecoder {
4429  public:
VCEQ_immediate_0_111100111d11ss01dddd0f010qm0mmmm_case_0()4430   VCEQ_immediate_0_111100111d11ss01dddd0f010qm0mmmm_case_0()
4431      : ClassDecoder() {}
4432   virtual RegisterList defs(Instruction inst) const;
4433   virtual SafetyLevel safety(Instruction i) const;
4434   virtual RegisterList uses(Instruction i) const;
4435  private:
4436   NACL_DISALLOW_COPY_AND_ASSIGN(
4437       VCEQ_immediate_0_111100111d11ss01dddd0f010qm0mmmm_case_0);
4438 };
4439 
4440 // VCEQ_immediate_0_111100111d11ss01dddd0f010qm0mmmm_case_1:
4441 //
4442 //   {D: D(22),
4443 //    F: F(10),
4444 //    M: M(5),
4445 //    Q: Q(6),
4446 //    Vd: Vd(15:12),
4447 //    Vm: Vm(3:0),
4448 //    arch: ASIMD,
4449 //    d: D:Vd,
4450 //    defs: {},
4451 //    elements: 64 / esize,
4452 //    esize: 8 << size,
4453 //    fields: [D(22),
4454 //      size(19:18),
4455 //      Vd(15:12),
4456 //      F(10),
4457 //      op(8:7),
4458 //      Q(6),
4459 //      M(5),
4460 //      Vm(3:0)],
4461 //    m: M:Vm,
4462 //    op: op(8:7),
4463 //    pattern: 111100111d11ss01dddd0f010qm0mmmm,
4464 //    regs: 1
4465 //         if Q(6)=0
4466 //         else 2,
4467 //    rule: VCEQ_immediate_0,
4468 //    safety: [Q(6)=1 &&
4469 //         (Vd(0)=1 ||
4470 //         Vm(0)=1) => UNDEFINED,
4471 //      size(19:18)=~10 => UNDEFINED],
4472 //    size: size(19:18),
4473 //    uses: {}}
4474 class VCEQ_immediate_0_111100111d11ss01dddd0f010qm0mmmm_case_1
4475      : public ClassDecoder {
4476  public:
VCEQ_immediate_0_111100111d11ss01dddd0f010qm0mmmm_case_1()4477   VCEQ_immediate_0_111100111d11ss01dddd0f010qm0mmmm_case_1()
4478      : ClassDecoder() {}
4479   virtual RegisterList defs(Instruction inst) const;
4480   virtual SafetyLevel safety(Instruction i) const;
4481   virtual RegisterList uses(Instruction i) const;
4482  private:
4483   NACL_DISALLOW_COPY_AND_ASSIGN(
4484       VCEQ_immediate_0_111100111d11ss01dddd0f010qm0mmmm_case_1);
4485 };
4486 
4487 // VCEQ_register_A1_111100110dssnnnndddd1000nqm1mmmm_case_0:
4488 //
4489 //   {D: D(22),
4490 //    M: M(5),
4491 //    N: N(7),
4492 //    Q: Q(6),
4493 //    U: U(24),
4494 //    Vd: Vd(15:12),
4495 //    Vm: Vm(3:0),
4496 //    Vn: Vn(19:16),
4497 //    arch: ASIMD,
4498 //    d: D:Vd,
4499 //    defs: {},
4500 //    elements: 64 / esize,
4501 //    esize: 8 << size,
4502 //    fields: [U(24),
4503 //      D(22),
4504 //      size(21:20),
4505 //      Vn(19:16),
4506 //      Vd(15:12),
4507 //      op(9),
4508 //      N(7),
4509 //      Q(6),
4510 //      M(5),
4511 //      Vm(3:0)],
4512 //    m: M:Vm,
4513 //    n: N:Vn,
4514 //    op: op(9),
4515 //    pattern: 111100110dssnnnndddd1000nqm1mmmm,
4516 //    regs: 1
4517 //         if Q(6)=0
4518 //         else 2,
4519 //    rule: VCEQ_register_A1,
4520 //    safety: [Q(6)=1 &&
4521 //         (Vd(0)=1 ||
4522 //         Vn(0)=1 ||
4523 //         Vm(0)=1) => UNDEFINED,
4524 //      size(21:20)=11 => UNDEFINED],
4525 //    size: size(21:20),
4526 //    unsigned: U(24)=1,
4527 //    uses: {}}
4528 class VCEQ_register_A1_111100110dssnnnndddd1000nqm1mmmm_case_0
4529      : public ClassDecoder {
4530  public:
VCEQ_register_A1_111100110dssnnnndddd1000nqm1mmmm_case_0()4531   VCEQ_register_A1_111100110dssnnnndddd1000nqm1mmmm_case_0()
4532      : ClassDecoder() {}
4533   virtual RegisterList defs(Instruction inst) const;
4534   virtual SafetyLevel safety(Instruction i) const;
4535   virtual RegisterList uses(Instruction i) const;
4536  private:
4537   NACL_DISALLOW_COPY_AND_ASSIGN(
4538       VCEQ_register_A1_111100110dssnnnndddd1000nqm1mmmm_case_0);
4539 };
4540 
4541 // VCEQ_register_A2_111100100d0snnnndddd1110nqm0mmmm_case_0:
4542 //
4543 //   {D: D(22),
4544 //    M: M(5),
4545 //    N: N(7),
4546 //    Q: Q(6),
4547 //    U: U(24),
4548 //    Vd: Vd(15:12),
4549 //    Vm: Vm(3:0),
4550 //    Vn: Vn(19:16),
4551 //    arch: ASIMD,
4552 //    d: D:Vd,
4553 //    defs: {},
4554 //    elements: 2,
4555 //    esize: 32,
4556 //    fields: [U(24),
4557 //      D(22),
4558 //      size(21:20),
4559 //      Vn(19:16),
4560 //      Vd(15:12),
4561 //      op(9),
4562 //      N(7),
4563 //      Q(6),
4564 //      M(5),
4565 //      Vm(3:0)],
4566 //    m: M:Vm,
4567 //    n: N:Vn,
4568 //    op: op(9),
4569 //    op1_neg: size(1),
4570 //    pattern: 111100100d0snnnndddd1110nqm0mmmm,
4571 //    rule: VCEQ_register_A2,
4572 //    safety: [Q(6)=1 &&
4573 //         (Vd(0)=1 ||
4574 //         Vn(0)=1 ||
4575 //         Vm(0)=1) => UNDEFINED,
4576 //      size(0)=1 => UNDEFINED],
4577 //    size: size(21:20),
4578 //    sz: size(0),
4579 //    uses: {}}
4580 class VCEQ_register_A2_111100100d0snnnndddd1110nqm0mmmm_case_0
4581      : public ClassDecoder {
4582  public:
VCEQ_register_A2_111100100d0snnnndddd1110nqm0mmmm_case_0()4583   VCEQ_register_A2_111100100d0snnnndddd1110nqm0mmmm_case_0()
4584      : ClassDecoder() {}
4585   virtual RegisterList defs(Instruction inst) const;
4586   virtual SafetyLevel safety(Instruction i) const;
4587   virtual RegisterList uses(Instruction i) const;
4588  private:
4589   NACL_DISALLOW_COPY_AND_ASSIGN(
4590       VCEQ_register_A2_111100100d0snnnndddd1110nqm0mmmm_case_0);
4591 };
4592 
4593 // VCGE_immediate_0_111100111d11ss01dddd0f001qm0mmmm_case_0:
4594 //
4595 //   {D: D(22),
4596 //    F: F(10),
4597 //    M: M(5),
4598 //    Q: Q(6),
4599 //    Vd: Vd(15:12),
4600 //    Vm: Vm(3:0),
4601 //    arch: ASIMD,
4602 //    d: D:Vd,
4603 //    defs: {},
4604 //    elements: 64 / esize,
4605 //    esize: 8 << size,
4606 //    fields: [D(22),
4607 //      size(19:18),
4608 //      Vd(15:12),
4609 //      F(10),
4610 //      op(8:7),
4611 //      Q(6),
4612 //      M(5),
4613 //      Vm(3:0)],
4614 //    m: M:Vm,
4615 //    op: op(8:7),
4616 //    pattern: 111100111d11ss01dddd0f001qm0mmmm,
4617 //    regs: 1
4618 //         if Q(6)=0
4619 //         else 2,
4620 //    rule: VCGE_immediate_0,
4621 //    safety: [size(19:18)=11 => UNDEFINED,
4622 //      Q(6)=1 &&
4623 //         (Vd(0)=1 ||
4624 //         Vm(0)=1) => UNDEFINED],
4625 //    size: size(19:18),
4626 //    uses: {}}
4627 class VCGE_immediate_0_111100111d11ss01dddd0f001qm0mmmm_case_0
4628      : public ClassDecoder {
4629  public:
VCGE_immediate_0_111100111d11ss01dddd0f001qm0mmmm_case_0()4630   VCGE_immediate_0_111100111d11ss01dddd0f001qm0mmmm_case_0()
4631      : ClassDecoder() {}
4632   virtual RegisterList defs(Instruction inst) const;
4633   virtual SafetyLevel safety(Instruction i) const;
4634   virtual RegisterList uses(Instruction i) const;
4635  private:
4636   NACL_DISALLOW_COPY_AND_ASSIGN(
4637       VCGE_immediate_0_111100111d11ss01dddd0f001qm0mmmm_case_0);
4638 };
4639 
4640 // VCGE_immediate_0_111100111d11ss01dddd0f001qm0mmmm_case_1:
4641 //
4642 //   {D: D(22),
4643 //    F: F(10),
4644 //    M: M(5),
4645 //    Q: Q(6),
4646 //    Vd: Vd(15:12),
4647 //    Vm: Vm(3:0),
4648 //    arch: ASIMD,
4649 //    d: D:Vd,
4650 //    defs: {},
4651 //    elements: 64 / esize,
4652 //    esize: 8 << size,
4653 //    fields: [D(22),
4654 //      size(19:18),
4655 //      Vd(15:12),
4656 //      F(10),
4657 //      op(8:7),
4658 //      Q(6),
4659 //      M(5),
4660 //      Vm(3:0)],
4661 //    m: M:Vm,
4662 //    op: op(8:7),
4663 //    pattern: 111100111d11ss01dddd0f001qm0mmmm,
4664 //    regs: 1
4665 //         if Q(6)=0
4666 //         else 2,
4667 //    rule: VCGE_immediate_0,
4668 //    safety: [Q(6)=1 &&
4669 //         (Vd(0)=1 ||
4670 //         Vm(0)=1) => UNDEFINED,
4671 //      size(19:18)=~10 => UNDEFINED],
4672 //    size: size(19:18),
4673 //    uses: {}}
4674 class VCGE_immediate_0_111100111d11ss01dddd0f001qm0mmmm_case_1
4675      : public ClassDecoder {
4676  public:
VCGE_immediate_0_111100111d11ss01dddd0f001qm0mmmm_case_1()4677   VCGE_immediate_0_111100111d11ss01dddd0f001qm0mmmm_case_1()
4678      : ClassDecoder() {}
4679   virtual RegisterList defs(Instruction inst) const;
4680   virtual SafetyLevel safety(Instruction i) const;
4681   virtual RegisterList uses(Instruction i) const;
4682  private:
4683   NACL_DISALLOW_COPY_AND_ASSIGN(
4684       VCGE_immediate_0_111100111d11ss01dddd0f001qm0mmmm_case_1);
4685 };
4686 
4687 // VCGE_register_A1_1111001u0dssnnnndddd0011nqm1mmmm_case_0:
4688 //
4689 //   {D: D(22),
4690 //    M: M(5),
4691 //    N: N(7),
4692 //    Q: Q(6),
4693 //    U: U(24),
4694 //    Vd: Vd(15:12),
4695 //    Vm: Vm(3:0),
4696 //    Vn: Vn(19:16),
4697 //    arch: ASIMD,
4698 //    d: D:Vd,
4699 //    defs: {},
4700 //    elements: 64 / esize,
4701 //    esize: 8 << size,
4702 //    fields: [U(24),
4703 //      D(22),
4704 //      size(21:20),
4705 //      Vn(19:16),
4706 //      Vd(15:12),
4707 //      op(9),
4708 //      N(7),
4709 //      Q(6),
4710 //      M(5),
4711 //      Vm(3:0)],
4712 //    m: M:Vm,
4713 //    n: N:Vn,
4714 //    op: op(9),
4715 //    pattern: 1111001u0dssnnnndddd0011nqm1mmmm,
4716 //    regs: 1
4717 //         if Q(6)=0
4718 //         else 2,
4719 //    rule: VCGE_register_A1,
4720 //    safety: [Q(6)=1 &&
4721 //         (Vd(0)=1 ||
4722 //         Vn(0)=1 ||
4723 //         Vm(0)=1) => UNDEFINED,
4724 //      size(21:20)=11 => UNDEFINED],
4725 //    size: size(21:20),
4726 //    unsigned: U(24)=1,
4727 //    uses: {}}
4728 class VCGE_register_A1_1111001u0dssnnnndddd0011nqm1mmmm_case_0
4729      : public ClassDecoder {
4730  public:
VCGE_register_A1_1111001u0dssnnnndddd0011nqm1mmmm_case_0()4731   VCGE_register_A1_1111001u0dssnnnndddd0011nqm1mmmm_case_0()
4732      : ClassDecoder() {}
4733   virtual RegisterList defs(Instruction inst) const;
4734   virtual SafetyLevel safety(Instruction i) const;
4735   virtual RegisterList uses(Instruction i) const;
4736  private:
4737   NACL_DISALLOW_COPY_AND_ASSIGN(
4738       VCGE_register_A1_1111001u0dssnnnndddd0011nqm1mmmm_case_0);
4739 };
4740 
4741 // VCGE_register_A2_111100110d0snnnndddd1110nqm0mmmm_case_0:
4742 //
4743 //   {D: D(22),
4744 //    M: M(5),
4745 //    N: N(7),
4746 //    Q: Q(6),
4747 //    U: U(24),
4748 //    Vd: Vd(15:12),
4749 //    Vm: Vm(3:0),
4750 //    Vn: Vn(19:16),
4751 //    arch: ASIMD,
4752 //    d: D:Vd,
4753 //    defs: {},
4754 //    elements: 2,
4755 //    esize: 32,
4756 //    fields: [U(24),
4757 //      D(22),
4758 //      size(21:20),
4759 //      Vn(19:16),
4760 //      Vd(15:12),
4761 //      op(9),
4762 //      N(7),
4763 //      Q(6),
4764 //      M(5),
4765 //      Vm(3:0)],
4766 //    m: M:Vm,
4767 //    n: N:Vn,
4768 //    op: op(9),
4769 //    op1_neg: size(1),
4770 //    pattern: 111100110d0snnnndddd1110nqm0mmmm,
4771 //    rule: VCGE_register_A2,
4772 //    safety: [Q(6)=1 &&
4773 //         (Vd(0)=1 ||
4774 //         Vn(0)=1 ||
4775 //         Vm(0)=1) => UNDEFINED,
4776 //      size(0)=1 => UNDEFINED],
4777 //    size: size(21:20),
4778 //    sz: size(0),
4779 //    uses: {}}
4780 class VCGE_register_A2_111100110d0snnnndddd1110nqm0mmmm_case_0
4781      : public ClassDecoder {
4782  public:
VCGE_register_A2_111100110d0snnnndddd1110nqm0mmmm_case_0()4783   VCGE_register_A2_111100110d0snnnndddd1110nqm0mmmm_case_0()
4784      : ClassDecoder() {}
4785   virtual RegisterList defs(Instruction inst) const;
4786   virtual SafetyLevel safety(Instruction i) const;
4787   virtual RegisterList uses(Instruction i) const;
4788  private:
4789   NACL_DISALLOW_COPY_AND_ASSIGN(
4790       VCGE_register_A2_111100110d0snnnndddd1110nqm0mmmm_case_0);
4791 };
4792 
4793 // VCGT_immediate_0_111100111d11ss01dddd0f000qm0mmmm_case_0:
4794 //
4795 //   {D: D(22),
4796 //    F: F(10),
4797 //    M: M(5),
4798 //    Q: Q(6),
4799 //    Vd: Vd(15:12),
4800 //    Vm: Vm(3:0),
4801 //    arch: ASIMD,
4802 //    d: D:Vd,
4803 //    defs: {},
4804 //    elements: 64 / esize,
4805 //    esize: 8 << size,
4806 //    fields: [D(22),
4807 //      size(19:18),
4808 //      Vd(15:12),
4809 //      F(10),
4810 //      op(8:7),
4811 //      Q(6),
4812 //      M(5),
4813 //      Vm(3:0)],
4814 //    m: M:Vm,
4815 //    op: op(8:7),
4816 //    pattern: 111100111d11ss01dddd0f000qm0mmmm,
4817 //    regs: 1
4818 //         if Q(6)=0
4819 //         else 2,
4820 //    rule: VCGT_immediate_0,
4821 //    safety: [size(19:18)=11 => UNDEFINED,
4822 //      Q(6)=1 &&
4823 //         (Vd(0)=1 ||
4824 //         Vm(0)=1) => UNDEFINED],
4825 //    size: size(19:18),
4826 //    uses: {}}
4827 class VCGT_immediate_0_111100111d11ss01dddd0f000qm0mmmm_case_0
4828      : public ClassDecoder {
4829  public:
VCGT_immediate_0_111100111d11ss01dddd0f000qm0mmmm_case_0()4830   VCGT_immediate_0_111100111d11ss01dddd0f000qm0mmmm_case_0()
4831      : ClassDecoder() {}
4832   virtual RegisterList defs(Instruction inst) const;
4833   virtual SafetyLevel safety(Instruction i) const;
4834   virtual RegisterList uses(Instruction i) const;
4835  private:
4836   NACL_DISALLOW_COPY_AND_ASSIGN(
4837       VCGT_immediate_0_111100111d11ss01dddd0f000qm0mmmm_case_0);
4838 };
4839 
4840 // VCGT_immediate_0_111100111d11ss01dddd0f000qm0mmmm_case_1:
4841 //
4842 //   {D: D(22),
4843 //    F: F(10),
4844 //    M: M(5),
4845 //    Q: Q(6),
4846 //    Vd: Vd(15:12),
4847 //    Vm: Vm(3:0),
4848 //    arch: ASIMD,
4849 //    d: D:Vd,
4850 //    defs: {},
4851 //    elements: 64 / esize,
4852 //    esize: 8 << size,
4853 //    fields: [D(22),
4854 //      size(19:18),
4855 //      Vd(15:12),
4856 //      F(10),
4857 //      op(8:7),
4858 //      Q(6),
4859 //      M(5),
4860 //      Vm(3:0)],
4861 //    m: M:Vm,
4862 //    op: op(8:7),
4863 //    pattern: 111100111d11ss01dddd0f000qm0mmmm,
4864 //    regs: 1
4865 //         if Q(6)=0
4866 //         else 2,
4867 //    rule: VCGT_immediate_0,
4868 //    safety: [Q(6)=1 &&
4869 //         (Vd(0)=1 ||
4870 //         Vm(0)=1) => UNDEFINED,
4871 //      size(19:18)=~10 => UNDEFINED],
4872 //    size: size(19:18),
4873 //    uses: {}}
4874 class VCGT_immediate_0_111100111d11ss01dddd0f000qm0mmmm_case_1
4875      : public ClassDecoder {
4876  public:
VCGT_immediate_0_111100111d11ss01dddd0f000qm0mmmm_case_1()4877   VCGT_immediate_0_111100111d11ss01dddd0f000qm0mmmm_case_1()
4878      : ClassDecoder() {}
4879   virtual RegisterList defs(Instruction inst) const;
4880   virtual SafetyLevel safety(Instruction i) const;
4881   virtual RegisterList uses(Instruction i) const;
4882  private:
4883   NACL_DISALLOW_COPY_AND_ASSIGN(
4884       VCGT_immediate_0_111100111d11ss01dddd0f000qm0mmmm_case_1);
4885 };
4886 
4887 // VCGT_register_A1_1111001u0dssnnnndddd0011nqm0mmmm_case_0:
4888 //
4889 //   {D: D(22),
4890 //    M: M(5),
4891 //    N: N(7),
4892 //    Q: Q(6),
4893 //    U: U(24),
4894 //    Vd: Vd(15:12),
4895 //    Vm: Vm(3:0),
4896 //    Vn: Vn(19:16),
4897 //    arch: ASIMD,
4898 //    d: D:Vd,
4899 //    defs: {},
4900 //    elements: 64 / esize,
4901 //    esize: 8 << size,
4902 //    fields: [U(24),
4903 //      D(22),
4904 //      size(21:20),
4905 //      Vn(19:16),
4906 //      Vd(15:12),
4907 //      op(9),
4908 //      N(7),
4909 //      Q(6),
4910 //      M(5),
4911 //      Vm(3:0)],
4912 //    m: M:Vm,
4913 //    n: N:Vn,
4914 //    op: op(9),
4915 //    pattern: 1111001u0dssnnnndddd0011nqm0mmmm,
4916 //    regs: 1
4917 //         if Q(6)=0
4918 //         else 2,
4919 //    rule: VCGT_register_A1,
4920 //    safety: [Q(6)=1 &&
4921 //         (Vd(0)=1 ||
4922 //         Vn(0)=1 ||
4923 //         Vm(0)=1) => UNDEFINED,
4924 //      size(21:20)=11 => UNDEFINED],
4925 //    size: size(21:20),
4926 //    unsigned: U(24)=1,
4927 //    uses: {}}
4928 class VCGT_register_A1_1111001u0dssnnnndddd0011nqm0mmmm_case_0
4929      : public ClassDecoder {
4930  public:
VCGT_register_A1_1111001u0dssnnnndddd0011nqm0mmmm_case_0()4931   VCGT_register_A1_1111001u0dssnnnndddd0011nqm0mmmm_case_0()
4932      : ClassDecoder() {}
4933   virtual RegisterList defs(Instruction inst) const;
4934   virtual SafetyLevel safety(Instruction i) const;
4935   virtual RegisterList uses(Instruction i) const;
4936  private:
4937   NACL_DISALLOW_COPY_AND_ASSIGN(
4938       VCGT_register_A1_1111001u0dssnnnndddd0011nqm0mmmm_case_0);
4939 };
4940 
4941 // VCGT_register_A2_111100110d1snnnndddd1110nqm0mmmm_case_0:
4942 //
4943 //   {D: D(22),
4944 //    M: M(5),
4945 //    N: N(7),
4946 //    Q: Q(6),
4947 //    U: U(24),
4948 //    Vd: Vd(15:12),
4949 //    Vm: Vm(3:0),
4950 //    Vn: Vn(19:16),
4951 //    arch: ASIMD,
4952 //    d: D:Vd,
4953 //    defs: {},
4954 //    elements: 2,
4955 //    esize: 32,
4956 //    fields: [U(24),
4957 //      D(22),
4958 //      size(21:20),
4959 //      Vn(19:16),
4960 //      Vd(15:12),
4961 //      op(9),
4962 //      N(7),
4963 //      Q(6),
4964 //      M(5),
4965 //      Vm(3:0)],
4966 //    m: M:Vm,
4967 //    n: N:Vn,
4968 //    op: op(9),
4969 //    op1_neg: size(1),
4970 //    pattern: 111100110d1snnnndddd1110nqm0mmmm,
4971 //    rule: VCGT_register_A2,
4972 //    safety: [Q(6)=1 &&
4973 //         (Vd(0)=1 ||
4974 //         Vn(0)=1 ||
4975 //         Vm(0)=1) => UNDEFINED,
4976 //      size(0)=1 => UNDEFINED],
4977 //    size: size(21:20),
4978 //    sz: size(0),
4979 //    uses: {}}
4980 class VCGT_register_A2_111100110d1snnnndddd1110nqm0mmmm_case_0
4981      : public ClassDecoder {
4982  public:
VCGT_register_A2_111100110d1snnnndddd1110nqm0mmmm_case_0()4983   VCGT_register_A2_111100110d1snnnndddd1110nqm0mmmm_case_0()
4984      : ClassDecoder() {}
4985   virtual RegisterList defs(Instruction inst) const;
4986   virtual SafetyLevel safety(Instruction i) const;
4987   virtual RegisterList uses(Instruction i) const;
4988  private:
4989   NACL_DISALLOW_COPY_AND_ASSIGN(
4990       VCGT_register_A2_111100110d1snnnndddd1110nqm0mmmm_case_0);
4991 };
4992 
4993 // VCLE_immediate_0_111100111d11ss01dddd0f011qm0mmmm_case_0:
4994 //
4995 //   {D: D(22),
4996 //    F: F(10),
4997 //    M: M(5),
4998 //    Q: Q(6),
4999 //    Vd: Vd(15:12),
5000 //    Vm: Vm(3:0),
5001 //    arch: ASIMD,
5002 //    d: D:Vd,
5003 //    defs: {},
5004 //    elements: 64 / esize,
5005 //    esize: 8 << size,
5006 //    fields: [D(22),
5007 //      size(19:18),
5008 //      Vd(15:12),
5009 //      F(10),
5010 //      op(8:7),
5011 //      Q(6),
5012 //      M(5),
5013 //      Vm(3:0)],
5014 //    m: M:Vm,
5015 //    op: op(8:7),
5016 //    pattern: 111100111d11ss01dddd0f011qm0mmmm,
5017 //    regs: 1
5018 //         if Q(6)=0
5019 //         else 2,
5020 //    rule: VCLE_immediate_0,
5021 //    safety: [size(19:18)=11 => UNDEFINED,
5022 //      Q(6)=1 &&
5023 //         (Vd(0)=1 ||
5024 //         Vm(0)=1) => UNDEFINED],
5025 //    size: size(19:18),
5026 //    uses: {}}
5027 class VCLE_immediate_0_111100111d11ss01dddd0f011qm0mmmm_case_0
5028      : public ClassDecoder {
5029  public:
VCLE_immediate_0_111100111d11ss01dddd0f011qm0mmmm_case_0()5030   VCLE_immediate_0_111100111d11ss01dddd0f011qm0mmmm_case_0()
5031      : ClassDecoder() {}
5032   virtual RegisterList defs(Instruction inst) const;
5033   virtual SafetyLevel safety(Instruction i) const;
5034   virtual RegisterList uses(Instruction i) const;
5035  private:
5036   NACL_DISALLOW_COPY_AND_ASSIGN(
5037       VCLE_immediate_0_111100111d11ss01dddd0f011qm0mmmm_case_0);
5038 };
5039 
5040 // VCLE_immediate_0_111100111d11ss01dddd0f011qm0mmmm_case_1:
5041 //
5042 //   {D: D(22),
5043 //    F: F(10),
5044 //    M: M(5),
5045 //    Q: Q(6),
5046 //    Vd: Vd(15:12),
5047 //    Vm: Vm(3:0),
5048 //    arch: ASIMD,
5049 //    d: D:Vd,
5050 //    defs: {},
5051 //    elements: 64 / esize,
5052 //    esize: 8 << size,
5053 //    fields: [D(22),
5054 //      size(19:18),
5055 //      Vd(15:12),
5056 //      F(10),
5057 //      op(8:7),
5058 //      Q(6),
5059 //      M(5),
5060 //      Vm(3:0)],
5061 //    m: M:Vm,
5062 //    op: op(8:7),
5063 //    pattern: 111100111d11ss01dddd0f011qm0mmmm,
5064 //    regs: 1
5065 //         if Q(6)=0
5066 //         else 2,
5067 //    rule: VCLE_immediate_0,
5068 //    safety: [Q(6)=1 &&
5069 //         (Vd(0)=1 ||
5070 //         Vm(0)=1) => UNDEFINED,
5071 //      size(19:18)=~10 => UNDEFINED],
5072 //    size: size(19:18),
5073 //    uses: {}}
5074 class VCLE_immediate_0_111100111d11ss01dddd0f011qm0mmmm_case_1
5075      : public ClassDecoder {
5076  public:
VCLE_immediate_0_111100111d11ss01dddd0f011qm0mmmm_case_1()5077   VCLE_immediate_0_111100111d11ss01dddd0f011qm0mmmm_case_1()
5078      : ClassDecoder() {}
5079   virtual RegisterList defs(Instruction inst) const;
5080   virtual SafetyLevel safety(Instruction i) const;
5081   virtual RegisterList uses(Instruction i) const;
5082  private:
5083   NACL_DISALLOW_COPY_AND_ASSIGN(
5084       VCLE_immediate_0_111100111d11ss01dddd0f011qm0mmmm_case_1);
5085 };
5086 
5087 // VCLS_111100111d11ss00dddd01000qm0mmmm_case_0:
5088 //
5089 //   {D: D(22),
5090 //    F: F(10),
5091 //    M: M(5),
5092 //    Q: Q(6),
5093 //    Vd: Vd(15:12),
5094 //    Vm: Vm(3:0),
5095 //    arch: ASIMD,
5096 //    d: D:Vd,
5097 //    defs: {},
5098 //    elements: 64 / esize,
5099 //    esize: 8 << size,
5100 //    fields: [D(22),
5101 //      size(19:18),
5102 //      Vd(15:12),
5103 //      F(10),
5104 //      op(8:7),
5105 //      Q(6),
5106 //      M(5),
5107 //      Vm(3:0)],
5108 //    m: M:Vm,
5109 //    op: op(8:7),
5110 //    pattern: 111100111d11ss00dddd01000qm0mmmm,
5111 //    regs: 1
5112 //         if Q(6)=0
5113 //         else 2,
5114 //    rule: VCLS,
5115 //    safety: [size(19:18)=11 => UNDEFINED,
5116 //      Q(6)=1 &&
5117 //         (Vd(0)=1 ||
5118 //         Vm(0)=1) => UNDEFINED],
5119 //    size: size(19:18),
5120 //    uses: {}}
5121 class VCLS_111100111d11ss00dddd01000qm0mmmm_case_0
5122      : public ClassDecoder {
5123  public:
VCLS_111100111d11ss00dddd01000qm0mmmm_case_0()5124   VCLS_111100111d11ss00dddd01000qm0mmmm_case_0()
5125      : ClassDecoder() {}
5126   virtual RegisterList defs(Instruction inst) const;
5127   virtual SafetyLevel safety(Instruction i) const;
5128   virtual RegisterList uses(Instruction i) const;
5129  private:
5130   NACL_DISALLOW_COPY_AND_ASSIGN(
5131       VCLS_111100111d11ss00dddd01000qm0mmmm_case_0);
5132 };
5133 
5134 // VCLT_immediate_0_111100111d11ss01dddd0f100qm0mmmm_case_0:
5135 //
5136 //   {D: D(22),
5137 //    F: F(10),
5138 //    M: M(5),
5139 //    Q: Q(6),
5140 //    Vd: Vd(15:12),
5141 //    Vm: Vm(3:0),
5142 //    arch: ASIMD,
5143 //    d: D:Vd,
5144 //    defs: {},
5145 //    elements: 64 / esize,
5146 //    esize: 8 << size,
5147 //    fields: [D(22),
5148 //      size(19:18),
5149 //      Vd(15:12),
5150 //      F(10),
5151 //      op(8:7),
5152 //      Q(6),
5153 //      M(5),
5154 //      Vm(3:0)],
5155 //    m: M:Vm,
5156 //    op: op(8:7),
5157 //    pattern: 111100111d11ss01dddd0f100qm0mmmm,
5158 //    regs: 1
5159 //         if Q(6)=0
5160 //         else 2,
5161 //    rule: VCLT_immediate_0,
5162 //    safety: [size(19:18)=11 => UNDEFINED,
5163 //      Q(6)=1 &&
5164 //         (Vd(0)=1 ||
5165 //         Vm(0)=1) => UNDEFINED],
5166 //    size: size(19:18),
5167 //    uses: {}}
5168 class VCLT_immediate_0_111100111d11ss01dddd0f100qm0mmmm_case_0
5169      : public ClassDecoder {
5170  public:
VCLT_immediate_0_111100111d11ss01dddd0f100qm0mmmm_case_0()5171   VCLT_immediate_0_111100111d11ss01dddd0f100qm0mmmm_case_0()
5172      : ClassDecoder() {}
5173   virtual RegisterList defs(Instruction inst) const;
5174   virtual SafetyLevel safety(Instruction i) const;
5175   virtual RegisterList uses(Instruction i) const;
5176  private:
5177   NACL_DISALLOW_COPY_AND_ASSIGN(
5178       VCLT_immediate_0_111100111d11ss01dddd0f100qm0mmmm_case_0);
5179 };
5180 
5181 // VCLT_immediate_0_111100111d11ss01dddd0f100qm0mmmm_case_1:
5182 //
5183 //   {D: D(22),
5184 //    F: F(10),
5185 //    M: M(5),
5186 //    Q: Q(6),
5187 //    Vd: Vd(15:12),
5188 //    Vm: Vm(3:0),
5189 //    arch: ASIMD,
5190 //    d: D:Vd,
5191 //    defs: {},
5192 //    elements: 64 / esize,
5193 //    esize: 8 << size,
5194 //    fields: [D(22),
5195 //      size(19:18),
5196 //      Vd(15:12),
5197 //      F(10),
5198 //      op(8:7),
5199 //      Q(6),
5200 //      M(5),
5201 //      Vm(3:0)],
5202 //    m: M:Vm,
5203 //    op: op(8:7),
5204 //    pattern: 111100111d11ss01dddd0f100qm0mmmm,
5205 //    regs: 1
5206 //         if Q(6)=0
5207 //         else 2,
5208 //    rule: VCLT_immediate_0,
5209 //    safety: [Q(6)=1 &&
5210 //         (Vd(0)=1 ||
5211 //         Vm(0)=1) => UNDEFINED,
5212 //      size(19:18)=~10 => UNDEFINED],
5213 //    size: size(19:18),
5214 //    uses: {}}
5215 class VCLT_immediate_0_111100111d11ss01dddd0f100qm0mmmm_case_1
5216      : public ClassDecoder {
5217  public:
VCLT_immediate_0_111100111d11ss01dddd0f100qm0mmmm_case_1()5218   VCLT_immediate_0_111100111d11ss01dddd0f100qm0mmmm_case_1()
5219      : ClassDecoder() {}
5220   virtual RegisterList defs(Instruction inst) const;
5221   virtual SafetyLevel safety(Instruction i) const;
5222   virtual RegisterList uses(Instruction i) const;
5223  private:
5224   NACL_DISALLOW_COPY_AND_ASSIGN(
5225       VCLT_immediate_0_111100111d11ss01dddd0f100qm0mmmm_case_1);
5226 };
5227 
5228 // VCLZ_111100111d11ss00dddd01001qm0mmmm_case_0:
5229 //
5230 //   {D: D(22),
5231 //    F: F(10),
5232 //    M: M(5),
5233 //    Q: Q(6),
5234 //    Vd: Vd(15:12),
5235 //    Vm: Vm(3:0),
5236 //    arch: ASIMD,
5237 //    d: D:Vd,
5238 //    defs: {},
5239 //    elements: 64 / esize,
5240 //    esize: 8 << size,
5241 //    fields: [D(22),
5242 //      size(19:18),
5243 //      Vd(15:12),
5244 //      F(10),
5245 //      op(8:7),
5246 //      Q(6),
5247 //      M(5),
5248 //      Vm(3:0)],
5249 //    m: M:Vm,
5250 //    op: op(8:7),
5251 //    pattern: 111100111d11ss00dddd01001qm0mmmm,
5252 //    regs: 1
5253 //         if Q(6)=0
5254 //         else 2,
5255 //    rule: VCLZ,
5256 //    safety: [size(19:18)=11 => UNDEFINED,
5257 //      Q(6)=1 &&
5258 //         (Vd(0)=1 ||
5259 //         Vm(0)=1) => UNDEFINED],
5260 //    size: size(19:18),
5261 //    uses: {}}
5262 class VCLZ_111100111d11ss00dddd01001qm0mmmm_case_0
5263      : public ClassDecoder {
5264  public:
VCLZ_111100111d11ss00dddd01001qm0mmmm_case_0()5265   VCLZ_111100111d11ss00dddd01001qm0mmmm_case_0()
5266      : ClassDecoder() {}
5267   virtual RegisterList defs(Instruction inst) const;
5268   virtual SafetyLevel safety(Instruction i) const;
5269   virtual RegisterList uses(Instruction i) const;
5270  private:
5271   NACL_DISALLOW_COPY_AND_ASSIGN(
5272       VCLZ_111100111d11ss00dddd01001qm0mmmm_case_0);
5273 };
5274 
5275 // VCMP_VCMPE_cccc11101d110100dddd101se1m0mmmm_case_0:
5276 //
5277 //   {D: D(22),
5278 //    E: E(7),
5279 //    M: M(5),
5280 //    Vd: Vd(15:12),
5281 //    Vm: Vm(3:0),
5282 //    arch: VFPv2,
5283 //    cond: cond(31:28),
5284 //    d: Vd:D
5285 //         if sz(8)=0
5286 //         else D:Vd,
5287 //    defs: {},
5288 //    dp_operation: sz(8)=1,
5289 //    false: false,
5290 //    fields: [cond(31:28), D(22), Vd(15:12), sz(8), E(7), M(5), Vm(3:0)],
5291 //    m: M:Vm
5292 //         if dp_operation
5293 //         else Vm:M,
5294 //    pattern: cccc11101d110100dddd101se1m0mmmm,
5295 //    quiet_nan_exc: E(7)=1,
5296 //    rule: VCMP_VCMPE,
5297 //    safety: [true => MAY_BE_SAFE],
5298 //    sz: sz(8),
5299 //    true: true,
5300 //    uses: {},
5301 //    with_zero: false}
5302 class VCMP_VCMPE_cccc11101d110100dddd101se1m0mmmm_case_0
5303      : public ClassDecoder {
5304  public:
VCMP_VCMPE_cccc11101d110100dddd101se1m0mmmm_case_0()5305   VCMP_VCMPE_cccc11101d110100dddd101se1m0mmmm_case_0()
5306      : ClassDecoder() {}
5307   virtual RegisterList defs(Instruction inst) const;
5308   virtual SafetyLevel safety(Instruction i) const;
5309   virtual RegisterList uses(Instruction i) const;
5310  private:
5311   NACL_DISALLOW_COPY_AND_ASSIGN(
5312       VCMP_VCMPE_cccc11101d110100dddd101se1m0mmmm_case_0);
5313 };
5314 
5315 // VCMP_VCMPE_cccc11101d110101dddd101se1000000_case_0:
5316 //
5317 //   {D: D(22),
5318 //    E: E(7),
5319 //    Vd: Vd(15:12),
5320 //    arch: VFPv2,
5321 //    cond: cond(31:28),
5322 //    d: Vd:D
5323 //         if sz(8)=0
5324 //         else D:Vd,
5325 //    defs: {},
5326 //    dp_operation: sz(8)=1,
5327 //    fields: [cond(31:28), D(22), Vd(15:12), sz(8), E(7)],
5328 //    pattern: cccc11101d110101dddd101se1000000,
5329 //    quiet_nan_exc: E(7)=1,
5330 //    rule: VCMP_VCMPE,
5331 //    safety: [true => MAY_BE_SAFE],
5332 //    sz: sz(8),
5333 //    true: true,
5334 //    uses: {},
5335 //    with_zero: true}
5336 class VCMP_VCMPE_cccc11101d110101dddd101se1000000_case_0
5337      : public ClassDecoder {
5338  public:
VCMP_VCMPE_cccc11101d110101dddd101se1000000_case_0()5339   VCMP_VCMPE_cccc11101d110101dddd101se1000000_case_0()
5340      : ClassDecoder() {}
5341   virtual RegisterList defs(Instruction inst) const;
5342   virtual SafetyLevel safety(Instruction i) const;
5343   virtual RegisterList uses(Instruction i) const;
5344  private:
5345   NACL_DISALLOW_COPY_AND_ASSIGN(
5346       VCMP_VCMPE_cccc11101d110101dddd101se1000000_case_0);
5347 };
5348 
5349 // VCNT_111100111d11ss00dddd01010qm0mmmm_case_0:
5350 //
5351 //   {D: D(22),
5352 //    F: F(10),
5353 //    M: M(5),
5354 //    Q: Q(6),
5355 //    Vd: Vd(15:12),
5356 //    Vm: Vm(3:0),
5357 //    arch: ASIMD,
5358 //    d: D:Vd,
5359 //    defs: {},
5360 //    elements: 64 / esize,
5361 //    esize: 8 << size,
5362 //    fields: [D(22),
5363 //      size(19:18),
5364 //      Vd(15:12),
5365 //      F(10),
5366 //      op(8:7),
5367 //      Q(6),
5368 //      M(5),
5369 //      Vm(3:0)],
5370 //    m: M:Vm,
5371 //    op: op(8:7),
5372 //    pattern: 111100111d11ss00dddd01010qm0mmmm,
5373 //    regs: 1
5374 //         if Q(6)=0
5375 //         else 2,
5376 //    rule: VCNT,
5377 //    safety: [size(19:18)=~00 => UNDEFINED,
5378 //      Q(6)=1 &&
5379 //         (Vd(0)=1 ||
5380 //         Vm(0)=1) => UNDEFINED],
5381 //    size: size(19:18),
5382 //    uses: {}}
5383 class VCNT_111100111d11ss00dddd01010qm0mmmm_case_0
5384      : public ClassDecoder {
5385  public:
VCNT_111100111d11ss00dddd01010qm0mmmm_case_0()5386   VCNT_111100111d11ss00dddd01010qm0mmmm_case_0()
5387      : ClassDecoder() {}
5388   virtual RegisterList defs(Instruction inst) const;
5389   virtual SafetyLevel safety(Instruction i) const;
5390   virtual RegisterList uses(Instruction i) const;
5391  private:
5392   NACL_DISALLOW_COPY_AND_ASSIGN(
5393       VCNT_111100111d11ss00dddd01010qm0mmmm_case_0);
5394 };
5395 
5396 // VCVTB_VCVTT_cccc11101d11001odddd1010t1m0mmmm_case_0:
5397 //
5398 //   {D: D(22),
5399 //    M: M(5),
5400 //    T: T(7),
5401 //    Vd: Vd(15:12),
5402 //    Vm: Vm(3:0),
5403 //    arch: VFPv3HP,
5404 //    cond: cond(31:28),
5405 //    d: Vd:D,
5406 //    defs: {},
5407 //    fields: [cond(31:28), D(22), op(16), Vd(15:12), T(7), M(5), Vm(3:0)],
5408 //    half_to_single: op(16)=0,
5409 //    lowbit: 16
5410 //         if T(7)=1
5411 //         else 0,
5412 //    m: Vm:M,
5413 //    op: op(16),
5414 //    pattern: cccc11101d11001odddd1010t1m0mmmm,
5415 //    rule: VCVTB_VCVTT,
5416 //    safety: [true => MAY_BE_SAFE],
5417 //    true: true,
5418 //    uses: {}}
5419 class VCVTB_VCVTT_cccc11101d11001odddd1010t1m0mmmm_case_0
5420      : public ClassDecoder {
5421  public:
VCVTB_VCVTT_cccc11101d11001odddd1010t1m0mmmm_case_0()5422   VCVTB_VCVTT_cccc11101d11001odddd1010t1m0mmmm_case_0()
5423      : ClassDecoder() {}
5424   virtual RegisterList defs(Instruction inst) const;
5425   virtual SafetyLevel safety(Instruction i) const;
5426   virtual RegisterList uses(Instruction i) const;
5427  private:
5428   NACL_DISALLOW_COPY_AND_ASSIGN(
5429       VCVTB_VCVTT_cccc11101d11001odddd1010t1m0mmmm_case_0);
5430 };
5431 
5432 // VCVT_111100111d11ss11dddd011ppqm0mmmm_case_0:
5433 //
5434 //   {D: D(22),
5435 //    F: F(10),
5436 //    M: M(5),
5437 //    Q: Q(6),
5438 //    Vd: Vd(15:12),
5439 //    Vm: Vm(3:0),
5440 //    arch: ASIMD,
5441 //    d: D:Vd,
5442 //    defs: {},
5443 //    elements: 64 / esize,
5444 //    esize: 8 << size,
5445 //    fields: [D(22),
5446 //      size(19:18),
5447 //      Vd(15:12),
5448 //      F(10),
5449 //      op(8:7),
5450 //      Q(6),
5451 //      M(5),
5452 //      Vm(3:0)],
5453 //    m: M:Vm,
5454 //    op: op(8:7),
5455 //    pattern: 111100111d11ss11dddd011ppqm0mmmm,
5456 //    regs: 1
5457 //         if Q(6)=0
5458 //         else 2,
5459 //    rule: VCVT,
5460 //    safety: [Q(6)=1 &&
5461 //         (Vd(0)=1 ||
5462 //         Vm(0)=1) => UNDEFINED,
5463 //      size(19:18)=~10 => UNDEFINED],
5464 //    size: size(19:18),
5465 //    to_integer: op(1)=1,
5466 //    unsigned: op(0)=1,
5467 //    uses: {}}
5468 class VCVT_111100111d11ss11dddd011ppqm0mmmm_case_0
5469      : public ClassDecoder {
5470  public:
VCVT_111100111d11ss11dddd011ppqm0mmmm_case_0()5471   VCVT_111100111d11ss11dddd011ppqm0mmmm_case_0()
5472      : ClassDecoder() {}
5473   virtual RegisterList defs(Instruction inst) const;
5474   virtual SafetyLevel safety(Instruction i) const;
5475   virtual RegisterList uses(Instruction i) const;
5476  private:
5477   NACL_DISALLOW_COPY_AND_ASSIGN(
5478       VCVT_111100111d11ss11dddd011ppqm0mmmm_case_0);
5479 };
5480 
5481 // VCVT_VCVTR_between_floating_point_and_integer_Floating_point_cccc11101d111ooodddd101sp1m0mmmm_case_0:
5482 //
5483 //   {D: D(22),
5484 //    M: M(5),
5485 //    Vd: Vd(15:12),
5486 //    Vm: Vm(3:0),
5487 //    arch: VFPv2,
5488 //    cond: cond(31:28),
5489 //    d: Vd:D
5490 //         if to_integer
5491 //         else D:Vd
5492 //         if dp_operation
5493 //         else Vd:D,
5494 //    defs: {},
5495 //    dp_operation: sz(8)=1,
5496 //    fields: [cond(31:28),
5497 //      D(22),
5498 //      opc2(18:16),
5499 //      Vd(15:12),
5500 //      sz(8),
5501 //      op(7),
5502 //      M(5),
5503 //      Vm(3:0)],
5504 //    m: Vm:M
5505 //         if not to_integer
5506 //         else M:Vm
5507 //         if dp_operation
5508 //         else Vm:M,
5509 //    op: op(7),
5510 //    opc2: opc2(18:16),
5511 //    pattern: cccc11101d111ooodddd101sp1m0mmmm,
5512 //    round_nearest: not to_integer,
5513 //    round_zero: to_integer &&
5514 //         op(7)=1,
5515 //    rule: VCVT_VCVTR_between_floating_point_and_integer_Floating_point,
5516 //    safety: [opc2(18:16)=~000 &&
5517 //         opc2(18:16)=~10x => DECODER_ERROR],
5518 //    sz: sz(8),
5519 //    to_integer: opc2(2)=1,
5520 //    true: true,
5521 //    unsigned: opc2(0)=0
5522 //         if to_integer
5523 //         else op(7)=0,
5524 //    uses: {}}
5525 class VCVT_VCVTR_between_floating_point_and_integer_Floating_point_cccc11101d111ooodddd101sp1m0mmmm_case_0
5526      : public ClassDecoder {
5527  public:
VCVT_VCVTR_between_floating_point_and_integer_Floating_point_cccc11101d111ooodddd101sp1m0mmmm_case_0()5528   VCVT_VCVTR_between_floating_point_and_integer_Floating_point_cccc11101d111ooodddd101sp1m0mmmm_case_0()
5529      : ClassDecoder() {}
5530   virtual RegisterList defs(Instruction inst) const;
5531   virtual SafetyLevel safety(Instruction i) const;
5532   virtual RegisterList uses(Instruction i) const;
5533  private:
5534   NACL_DISALLOW_COPY_AND_ASSIGN(
5535       VCVT_VCVTR_between_floating_point_and_integer_Floating_point_cccc11101d111ooodddd101sp1m0mmmm_case_0);
5536 };
5537 
5538 // VCVT_between_double_precision_and_single_precision_cccc11101d110111dddd101s11m0mmmm_case_0:
5539 //
5540 //   {D: D(22),
5541 //    M: M(5),
5542 //    Vd: Vd(15:12),
5543 //    Vm: Vm(3:0),
5544 //    arch: VFPv2,
5545 //    cond: cond(31:28),
5546 //    d: Vd:D
5547 //         if sz(8)=0
5548 //         else D:Vd,
5549 //    defs: {},
5550 //    double_to_single: sz(8)=1,
5551 //    fields: [cond(31:28), D(22), Vd(15:12), sz(8), M(5), Vm(3:0)],
5552 //    m: Vm:D
5553 //         if sz(8)=0
5554 //         else M:Vm,
5555 //    pattern: cccc11101d110111dddd101s11m0mmmm,
5556 //    rule: VCVT_between_double_precision_and_single_precision,
5557 //    safety: [true => MAY_BE_SAFE],
5558 //    sz: sz(8),
5559 //    true: true,
5560 //    uses: {}}
5561 class VCVT_between_double_precision_and_single_precision_cccc11101d110111dddd101s11m0mmmm_case_0
5562      : public ClassDecoder {
5563  public:
VCVT_between_double_precision_and_single_precision_cccc11101d110111dddd101s11m0mmmm_case_0()5564   VCVT_between_double_precision_and_single_precision_cccc11101d110111dddd101s11m0mmmm_case_0()
5565      : ClassDecoder() {}
5566   virtual RegisterList defs(Instruction inst) const;
5567   virtual SafetyLevel safety(Instruction i) const;
5568   virtual RegisterList uses(Instruction i) const;
5569  private:
5570   NACL_DISALLOW_COPY_AND_ASSIGN(
5571       VCVT_between_double_precision_and_single_precision_cccc11101d110111dddd101s11m0mmmm_case_0);
5572 };
5573 
5574 // VCVT_between_floating_point_and_fixed_point_1111001u1diiiiiidddd111p0qm1mmmm_case_0:
5575 //
5576 //   {D: D(22),
5577 //    L: L(7),
5578 //    M: M(5),
5579 //    Q: Q(6),
5580 //    U: U(24),
5581 //    Vd: Vd(15:12),
5582 //    Vm: Vm(3:0),
5583 //    arch: ASIMD,
5584 //    d: D:Vd,
5585 //    defs: {},
5586 //    elements: 2,
5587 //    esize: 32,
5588 //    fields: [U(24),
5589 //      D(22),
5590 //      imm6(21:16),
5591 //      Vd(15:12),
5592 //      op(8),
5593 //      L(7),
5594 //      Q(6),
5595 //      M(5),
5596 //      Vm(3:0)],
5597 //    frac_bits: 64 - imm6,
5598 //    imm6: imm6(21:16),
5599 //    n: M:Vm,
5600 //    op: op(8),
5601 //    pattern: 1111001u1diiiiiidddd111p0qm1mmmm,
5602 //    regs: 1
5603 //         if Q(6)=0
5604 //         else 2,
5605 //    rule: VCVT_between_floating_point_and_fixed_point,
5606 //    safety: [imm6(21:16)=000xxx => DECODER_ERROR,
5607 //      imm6(21:16)=0xxxxx => UNDEFINED,
5608 //      Q(6)=1 &&
5609 //         (Vd(0)=1 ||
5610 //         Vm(0)=1) => UNDEFINED],
5611 //    to_fixed: op(8)=1,
5612 //    unsigned: U(24)=1,
5613 //    uses: {}}
5614 class VCVT_between_floating_point_and_fixed_point_1111001u1diiiiiidddd111p0qm1mmmm_case_0
5615      : public ClassDecoder {
5616  public:
VCVT_between_floating_point_and_fixed_point_1111001u1diiiiiidddd111p0qm1mmmm_case_0()5617   VCVT_between_floating_point_and_fixed_point_1111001u1diiiiiidddd111p0qm1mmmm_case_0()
5618      : ClassDecoder() {}
5619   virtual RegisterList defs(Instruction inst) const;
5620   virtual SafetyLevel safety(Instruction i) const;
5621   virtual RegisterList uses(Instruction i) const;
5622  private:
5623   NACL_DISALLOW_COPY_AND_ASSIGN(
5624       VCVT_between_floating_point_and_fixed_point_1111001u1diiiiiidddd111p0qm1mmmm_case_0);
5625 };
5626 
5627 // VCVT_between_floating_point_and_fixed_point_Floating_point_cccc11101d111o1udddd101fx1i0iiii_case_0:
5628 //
5629 //   {D: D(22),
5630 //    U: U(16),
5631 //    Vd: Vd(12),
5632 //    arch: VFPv3,
5633 //    cond: cond(31:28),
5634 //    d: Vd:D
5635 //         if sz(8)=0
5636 //         else D:Vd,
5637 //    defs: {},
5638 //    dp_operation: sf(8)=1,
5639 //    fields: [cond(31:28),
5640 //      D(22),
5641 //      op(18),
5642 //      U(16),
5643 //      Vd(12),
5644 //      sf(8),
5645 //      sx(7),
5646 //      i(5),
5647 //      imm4(3:0)],
5648 //    frac_bits: size - imm4:i,
5649 //    i: i(5),
5650 //    imm4: imm4(3:0),
5651 //    op: op(18),
5652 //    pattern: cccc11101d111o1udddd101fx1i0iiii,
5653 //    round_nearest: not to_fixed,
5654 //    round_zero: to_fixed,
5655 //    rule: VCVT_between_floating_point_and_fixed_point_Floating_point,
5656 //    safety: [frac_bits  <
5657 //            0 => UNPREDICTABLE],
5658 //    sf: sf(8),
5659 //    size: 16
5660 //         if sx(7)=0
5661 //         else 32,
5662 //    sx: sx(7),
5663 //    sz: sz(8),
5664 //    to_fixed: op(18)=1,
5665 //    true: true,
5666 //    unsigned: U(16)=1,
5667 //    uses: {}}
5668 class VCVT_between_floating_point_and_fixed_point_Floating_point_cccc11101d111o1udddd101fx1i0iiii_case_0
5669      : public ClassDecoder {
5670  public:
VCVT_between_floating_point_and_fixed_point_Floating_point_cccc11101d111o1udddd101fx1i0iiii_case_0()5671   VCVT_between_floating_point_and_fixed_point_Floating_point_cccc11101d111o1udddd101fx1i0iiii_case_0()
5672      : ClassDecoder() {}
5673   virtual RegisterList defs(Instruction inst) const;
5674   virtual SafetyLevel safety(Instruction i) const;
5675   virtual RegisterList uses(Instruction i) const;
5676  private:
5677   NACL_DISALLOW_COPY_AND_ASSIGN(
5678       VCVT_between_floating_point_and_fixed_point_Floating_point_cccc11101d111o1udddd101fx1i0iiii_case_0);
5679 };
5680 
5681 // VDIV_cccc11101d00nnnndddd101sn0m0mmmm_case_0:
5682 //
5683 //   {D: D(22),
5684 //    M: M(5),
5685 //    N: N(7),
5686 //    Vd: Vd(15:12),
5687 //    Vm: Vm(3:0),
5688 //    Vn: Vn(19:16),
5689 //    advsimd: false,
5690 //    arch: VFPv2,
5691 //    cond: cond(31:28),
5692 //    d: D:Vd
5693 //         if dp_operation
5694 //         else Vd:D,
5695 //    defs: {},
5696 //    dp_operation: sz(8)=1,
5697 //    false: false,
5698 //    fields: [cond(31:28),
5699 //      D(22),
5700 //      Vn(19:16),
5701 //      Vd(15:12),
5702 //      sz(8),
5703 //      N(7),
5704 //      M(5),
5705 //      Vm(3:0)],
5706 //    m: M:Vm
5707 //         if dp_operation
5708 //         else Vm:M,
5709 //    n: N:Vn
5710 //         if dp_operation
5711 //         else Vn:N,
5712 //    pattern: cccc11101d00nnnndddd101sn0m0mmmm,
5713 //    rule: VDIV,
5714 //    safety: [cond(31:28)=1111 => DECODER_ERROR],
5715 //    sz: sz(8),
5716 //    uses: {}}
5717 class VDIV_cccc11101d00nnnndddd101sn0m0mmmm_case_0
5718      : public ClassDecoder {
5719  public:
VDIV_cccc11101d00nnnndddd101sn0m0mmmm_case_0()5720   VDIV_cccc11101d00nnnndddd101sn0m0mmmm_case_0()
5721      : ClassDecoder() {}
5722   virtual RegisterList defs(Instruction inst) const;
5723   virtual SafetyLevel safety(Instruction i) const;
5724   virtual RegisterList uses(Instruction i) const;
5725  private:
5726   NACL_DISALLOW_COPY_AND_ASSIGN(
5727       VDIV_cccc11101d00nnnndddd101sn0m0mmmm_case_0);
5728 };
5729 
5730 // VDUP_ARM_core_register_cccc11101bq0ddddtttt1011d0e10000_case_0:
5731 //
5732 //   {B: B(22),
5733 //    D: D(7),
5734 //    E: E(5),
5735 //    Pc: 15,
5736 //    Q: Q(21),
5737 //    Rt: Rt(15:12),
5738 //    Vd: Vd(19:16),
5739 //    arch: AdvSIMD,
5740 //    cond: cond(31:28),
5741 //    cond_AL: 14,
5742 //    d: D:Vd,
5743 //    defs: {},
5744 //    elements: 2
5745 //         if B:E(1:0)=00
5746 //         else 4
5747 //         if B:E(1:0)=01
5748 //         else 8
5749 //         if B:E(1:0)=10
5750 //         else 0,
5751 //    esize: 32
5752 //         if B:E(1:0)=00
5753 //         else 16
5754 //         if B:E(1:0)=01
5755 //         else 8
5756 //         if B:E(1:0)=10
5757 //         else 0,
5758 //    fields: [cond(31:28),
5759 //      B(22),
5760 //      Q(21),
5761 //      Vd(19:16),
5762 //      Rt(15:12),
5763 //      D(7),
5764 //      E(5)],
5765 //    pattern: cccc11101bq0ddddtttt1011d0e10000,
5766 //    regs: 1
5767 //         if Q(21)=0
5768 //         else 2,
5769 //    rule: VDUP_ARM_core_register,
5770 //    safety: [cond  !=
5771 //            cond_AL => DEPRECATED,
5772 //      Q(21)=1 &&
5773 //         Vd(0)=1 => UNDEFINED,
5774 //      B:E(1:0)=11 => UNDEFINED,
5775 //      t  ==
5776 //            Pc => UNPREDICTABLE],
5777 //    sel: B:E,
5778 //    t: Rt,
5779 //    uses: {Rt}}
5780 class VDUP_ARM_core_register_cccc11101bq0ddddtttt1011d0e10000_case_0
5781      : public ClassDecoder {
5782  public:
VDUP_ARM_core_register_cccc11101bq0ddddtttt1011d0e10000_case_0()5783   VDUP_ARM_core_register_cccc11101bq0ddddtttt1011d0e10000_case_0()
5784      : ClassDecoder() {}
5785   virtual RegisterList defs(Instruction inst) const;
5786   virtual SafetyLevel safety(Instruction i) const;
5787   virtual RegisterList uses(Instruction i) const;
5788  private:
5789   NACL_DISALLOW_COPY_AND_ASSIGN(
5790       VDUP_ARM_core_register_cccc11101bq0ddddtttt1011d0e10000_case_0);
5791 };
5792 
5793 // VDUP_scalar_111100111d11iiiidddd11000qm0mmmm_case_0:
5794 //
5795 //   {D: D(22),
5796 //    M: M(5),
5797 //    Q: Q(6),
5798 //    Vd: Vd(15:12),
5799 //    Vm: Vm(3:0),
5800 //    d: D:Vd,
5801 //    defs: {},
5802 //    elements: 8
5803 //         if imm4(19:16)=xxx1
5804 //         else 4
5805 //         if imm4(19:16)=xx10
5806 //         else 2
5807 //         if imm4(19:16)=x100
5808 //         else 0,
5809 //    esize: 8
5810 //         if imm4(19:16)=xxx1
5811 //         else 16
5812 //         if imm4(19:16)=xx10
5813 //         else 32
5814 //         if imm4(19:16)=x100
5815 //         else 0,
5816 //    fields: [D(22), imm4(19:16), Vd(15:12), Q(6), M(5), Vm(3:0)],
5817 //    imm4: imm4(19:16),
5818 //    index: imm4(3:1)
5819 //         if imm4(19:16)=xxx1
5820 //         else imm4(3:2)
5821 //         if imm4(19:16)=xx10
5822 //         else imm4(3)
5823 //         if imm4(19:16)=x100
5824 //         else 0,
5825 //    m: M:Vm,
5826 //    pattern: 111100111d11iiiidddd11000qm0mmmm,
5827 //    regs: 1
5828 //         if Q(6)=0
5829 //         else 2,
5830 //    rule: VDUP_scalar,
5831 //    safety: [imm4(19:16)=x000 => UNDEFINED,
5832 //      Q(6)=1 &&
5833 //         Vd(0)=1 => UNDEFINED],
5834 //    uses: {}}
5835 class VDUP_scalar_111100111d11iiiidddd11000qm0mmmm_case_0
5836      : public ClassDecoder {
5837  public:
VDUP_scalar_111100111d11iiiidddd11000qm0mmmm_case_0()5838   VDUP_scalar_111100111d11iiiidddd11000qm0mmmm_case_0()
5839      : ClassDecoder() {}
5840   virtual RegisterList defs(Instruction inst) const;
5841   virtual SafetyLevel safety(Instruction i) const;
5842   virtual RegisterList uses(Instruction i) const;
5843  private:
5844   NACL_DISALLOW_COPY_AND_ASSIGN(
5845       VDUP_scalar_111100111d11iiiidddd11000qm0mmmm_case_0);
5846 };
5847 
5848 // VEOR_111100110d00nnnndddd0001nqm1mmmm_case_0:
5849 //
5850 //   {D: D(22),
5851 //    M: M(5),
5852 //    N: N(7),
5853 //    Q: Q(6),
5854 //    U: U(24),
5855 //    Vd: Vd(15:12),
5856 //    Vm: Vm(3:0),
5857 //    Vn: Vn(19:16),
5858 //    arch: ASIMD,
5859 //    d: D:Vd,
5860 //    defs: {},
5861 //    fields: [U(24),
5862 //      D(22),
5863 //      size(21:20),
5864 //      Vn(19:16),
5865 //      Vd(15:12),
5866 //      op(9),
5867 //      N(7),
5868 //      Q(6),
5869 //      M(5),
5870 //      Vm(3:0)],
5871 //    m: M:Vm,
5872 //    n: N:Vn,
5873 //    op: op(9),
5874 //    pattern: 111100110d00nnnndddd0001nqm1mmmm,
5875 //    regs: 1
5876 //         if Q(6)=0
5877 //         else 2,
5878 //    rule: VEOR,
5879 //    safety: [Q(6)=1 &&
5880 //         (Vd(0)=1 ||
5881 //         Vn(0)=1 ||
5882 //         Vm(0)=1) => UNDEFINED],
5883 //    size: size(21:20),
5884 //    uses: {}}
5885 class VEOR_111100110d00nnnndddd0001nqm1mmmm_case_0
5886      : public ClassDecoder {
5887  public:
VEOR_111100110d00nnnndddd0001nqm1mmmm_case_0()5888   VEOR_111100110d00nnnndddd0001nqm1mmmm_case_0()
5889      : ClassDecoder() {}
5890   virtual RegisterList defs(Instruction inst) const;
5891   virtual SafetyLevel safety(Instruction i) const;
5892   virtual RegisterList uses(Instruction i) const;
5893  private:
5894   NACL_DISALLOW_COPY_AND_ASSIGN(
5895       VEOR_111100110d00nnnndddd0001nqm1mmmm_case_0);
5896 };
5897 
5898 // VEXT_111100101d11nnnnddddiiiinqm0mmmm_case_0:
5899 //
5900 //   {D: D(22),
5901 //    M: M(5),
5902 //    N: N(7),
5903 //    Q: Q(6),
5904 //    Vd: Vd(15:12),
5905 //    Vm: Vm(3:0),
5906 //    Vn: Vn(19:16),
5907 //    d: D:Vd,
5908 //    defs: {},
5909 //    fields: [D(22),
5910 //      Vn(19:16),
5911 //      Vd(15:12),
5912 //      imm4(11:8),
5913 //      N(7),
5914 //      Q(6),
5915 //      M(5),
5916 //      Vm(3:0)],
5917 //    imm4: imm4(11:8),
5918 //    m: M:Vm,
5919 //    n: N:Vn,
5920 //    pattern: 111100101d11nnnnddddiiiinqm0mmmm,
5921 //    position: 8 * imm4,
5922 //    quadword_operation: Q(6)=1,
5923 //    rule: VEXT,
5924 //    safety: [Q(6)=1 &&
5925 //         (Vd(0)=1 ||
5926 //         Vn(0)=1 ||
5927 //         Vm(0)=1) => UNDEFINED,
5928 //      Q(6)=0 &&
5929 //         imm4(3)=1 => UNDEFINED],
5930 //    uses: {}}
5931 class VEXT_111100101d11nnnnddddiiiinqm0mmmm_case_0
5932      : public ClassDecoder {
5933  public:
VEXT_111100101d11nnnnddddiiiinqm0mmmm_case_0()5934   VEXT_111100101d11nnnnddddiiiinqm0mmmm_case_0()
5935      : ClassDecoder() {}
5936   virtual RegisterList defs(Instruction inst) const;
5937   virtual SafetyLevel safety(Instruction i) const;
5938   virtual RegisterList uses(Instruction i) const;
5939  private:
5940   NACL_DISALLOW_COPY_AND_ASSIGN(
5941       VEXT_111100101d11nnnnddddiiiinqm0mmmm_case_0);
5942 };
5943 
5944 // VFMA_A1_111100100d00nnnndddd1100nqm1mmmm_case_0:
5945 //
5946 //   {D: D(22),
5947 //    M: M(5),
5948 //    N: N(7),
5949 //    Q: Q(6),
5950 //    U: U(24),
5951 //    Vd: Vd(15:12),
5952 //    Vm: Vm(3:0),
5953 //    Vn: Vn(19:16),
5954 //    arch: ASIMDv2,
5955 //    d: D:Vd,
5956 //    defs: {},
5957 //    elements: 2,
5958 //    esize: 32,
5959 //    fields: [U(24),
5960 //      D(22),
5961 //      size(21:20),
5962 //      Vn(19:16),
5963 //      Vd(15:12),
5964 //      op(9),
5965 //      N(7),
5966 //      Q(6),
5967 //      M(5),
5968 //      Vm(3:0)],
5969 //    m: M:Vm,
5970 //    n: N:Vn,
5971 //    op: op(9),
5972 //    op1_neg: size(1),
5973 //    pattern: 111100100d00nnnndddd1100nqm1mmmm,
5974 //    rule: VFMA_A1,
5975 //    safety: [Q(6)=1 &&
5976 //         (Vd(0)=1 ||
5977 //         Vn(0)=1 ||
5978 //         Vm(0)=1) => UNDEFINED,
5979 //      size(0)=1 => UNDEFINED],
5980 //    size: size(21:20),
5981 //    sz: size(0),
5982 //    uses: {}}
5983 class VFMA_A1_111100100d00nnnndddd1100nqm1mmmm_case_0
5984      : public ClassDecoder {
5985  public:
VFMA_A1_111100100d00nnnndddd1100nqm1mmmm_case_0()5986   VFMA_A1_111100100d00nnnndddd1100nqm1mmmm_case_0()
5987      : ClassDecoder() {}
5988   virtual RegisterList defs(Instruction inst) const;
5989   virtual SafetyLevel safety(Instruction i) const;
5990   virtual RegisterList uses(Instruction i) const;
5991  private:
5992   NACL_DISALLOW_COPY_AND_ASSIGN(
5993       VFMA_A1_111100100d00nnnndddd1100nqm1mmmm_case_0);
5994 };
5995 
5996 // VFMA_VFMS_cccc11101d10nnnndddd101snom0mmmm_case_0:
5997 //
5998 //   {D: D(22),
5999 //    M: M(5),
6000 //    N: N(7),
6001 //    Vd: Vd(15:12),
6002 //    Vm: Vm(3:0),
6003 //    Vn: Vn(19:16),
6004 //    advsimd: false,
6005 //    arch: VFPv4,
6006 //    cond: cond(31:28),
6007 //    d: D:Vd
6008 //         if dp_operation
6009 //         else Vd:D,
6010 //    defs: {},
6011 //    dp_operation: sz(8)=1,
6012 //    false: false,
6013 //    fields: [cond(31:28),
6014 //      D(22),
6015 //      Vn(19:16),
6016 //      Vd(15:12),
6017 //      sz(8),
6018 //      N(7),
6019 //      op(6),
6020 //      M(5),
6021 //      Vm(3:0)],
6022 //    m: M:Vm
6023 //         if dp_operation
6024 //         else Vm:M,
6025 //    n: N:Vn
6026 //         if dp_operation
6027 //         else Vn:N,
6028 //    op: op(6),
6029 //    op1_neg: op(6)=1,
6030 //    pattern: cccc11101d10nnnndddd101snom0mmmm,
6031 //    rule: VFMA_VFMS,
6032 //    safety: [cond(31:28)=1111 => DECODER_ERROR],
6033 //    sz: sz(8),
6034 //    uses: {}}
6035 class VFMA_VFMS_cccc11101d10nnnndddd101snom0mmmm_case_0
6036      : public ClassDecoder {
6037  public:
VFMA_VFMS_cccc11101d10nnnndddd101snom0mmmm_case_0()6038   VFMA_VFMS_cccc11101d10nnnndddd101snom0mmmm_case_0()
6039      : ClassDecoder() {}
6040   virtual RegisterList defs(Instruction inst) const;
6041   virtual SafetyLevel safety(Instruction i) const;
6042   virtual RegisterList uses(Instruction i) const;
6043  private:
6044   NACL_DISALLOW_COPY_AND_ASSIGN(
6045       VFMA_VFMS_cccc11101d10nnnndddd101snom0mmmm_case_0);
6046 };
6047 
6048 // VFMS_A1_111100100d10nnnndddd1100nqm1mmmm_case_0:
6049 //
6050 //   {D: D(22),
6051 //    M: M(5),
6052 //    N: N(7),
6053 //    Q: Q(6),
6054 //    U: U(24),
6055 //    Vd: Vd(15:12),
6056 //    Vm: Vm(3:0),
6057 //    Vn: Vn(19:16),
6058 //    arch: ASIMDv2,
6059 //    d: D:Vd,
6060 //    defs: {},
6061 //    elements: 2,
6062 //    esize: 32,
6063 //    fields: [U(24),
6064 //      D(22),
6065 //      size(21:20),
6066 //      Vn(19:16),
6067 //      Vd(15:12),
6068 //      op(9),
6069 //      N(7),
6070 //      Q(6),
6071 //      M(5),
6072 //      Vm(3:0)],
6073 //    m: M:Vm,
6074 //    n: N:Vn,
6075 //    op: op(9),
6076 //    op1_neg: size(1),
6077 //    pattern: 111100100d10nnnndddd1100nqm1mmmm,
6078 //    rule: VFMS_A1,
6079 //    safety: [Q(6)=1 &&
6080 //         (Vd(0)=1 ||
6081 //         Vn(0)=1 ||
6082 //         Vm(0)=1) => UNDEFINED,
6083 //      size(0)=1 => UNDEFINED],
6084 //    size: size(21:20),
6085 //    sz: size(0),
6086 //    uses: {}}
6087 class VFMS_A1_111100100d10nnnndddd1100nqm1mmmm_case_0
6088      : public ClassDecoder {
6089  public:
VFMS_A1_111100100d10nnnndddd1100nqm1mmmm_case_0()6090   VFMS_A1_111100100d10nnnndddd1100nqm1mmmm_case_0()
6091      : ClassDecoder() {}
6092   virtual RegisterList defs(Instruction inst) const;
6093   virtual SafetyLevel safety(Instruction i) const;
6094   virtual RegisterList uses(Instruction i) const;
6095  private:
6096   NACL_DISALLOW_COPY_AND_ASSIGN(
6097       VFMS_A1_111100100d10nnnndddd1100nqm1mmmm_case_0);
6098 };
6099 
6100 // VFNMA_VFNMS_cccc11101d01nnnndddd101snom0mmmm_case_0:
6101 //
6102 //   {D: D(22),
6103 //    M: M(5),
6104 //    N: N(7),
6105 //    Vd: Vd(15:12),
6106 //    Vm: Vm(3:0),
6107 //    Vn: Vn(19:16),
6108 //    arch: VFPv4,
6109 //    cond: cond(31:28),
6110 //    d: D:Vd
6111 //         if dp_operation
6112 //         else Vd:D,
6113 //    defs: {},
6114 //    dp_operation: sz(8)=1,
6115 //    fields: [cond(31:28),
6116 //      D(22),
6117 //      Vn(19:16),
6118 //      Vd(15:12),
6119 //      sz(8),
6120 //      N(7),
6121 //      op(6),
6122 //      M(5),
6123 //      Vm(3:0)],
6124 //    m: M:Vm
6125 //         if dp_operation
6126 //         else Vm:M,
6127 //    n: N:Vn
6128 //         if dp_operation
6129 //         else Vn:N,
6130 //    op: op(6),
6131 //    op1_neg: op(6)=1,
6132 //    pattern: cccc11101d01nnnndddd101snom0mmmm,
6133 //    rule: VFNMA_VFNMS,
6134 //    safety: [cond(31:28)=1111 => DECODER_ERROR],
6135 //    sz: sz(8),
6136 //    uses: {}}
6137 class VFNMA_VFNMS_cccc11101d01nnnndddd101snom0mmmm_case_0
6138      : public ClassDecoder {
6139  public:
VFNMA_VFNMS_cccc11101d01nnnndddd101snom0mmmm_case_0()6140   VFNMA_VFNMS_cccc11101d01nnnndddd101snom0mmmm_case_0()
6141      : ClassDecoder() {}
6142   virtual RegisterList defs(Instruction inst) const;
6143   virtual SafetyLevel safety(Instruction i) const;
6144   virtual RegisterList uses(Instruction i) const;
6145  private:
6146   NACL_DISALLOW_COPY_AND_ASSIGN(
6147       VFNMA_VFNMS_cccc11101d01nnnndddd101snom0mmmm_case_0);
6148 };
6149 
6150 // VHADD_1111001u0dssnnnndddd0000nqm0mmmm_case_0:
6151 //
6152 //   {D: D(22),
6153 //    M: M(5),
6154 //    N: N(7),
6155 //    Q: Q(6),
6156 //    U: U(24),
6157 //    Vd: Vd(15:12),
6158 //    Vm: Vm(3:0),
6159 //    Vn: Vn(19:16),
6160 //    arch: ASIMD,
6161 //    d: D:Vd,
6162 //    defs: {},
6163 //    elements: 64 / esize,
6164 //    esize: 8 << size,
6165 //    fields: [U(24),
6166 //      D(22),
6167 //      size(21:20),
6168 //      Vn(19:16),
6169 //      Vd(15:12),
6170 //      op(9),
6171 //      N(7),
6172 //      Q(6),
6173 //      M(5),
6174 //      Vm(3:0)],
6175 //    m: M:Vm,
6176 //    n: N:Vn,
6177 //    op: op(9),
6178 //    pattern: 1111001u0dssnnnndddd0000nqm0mmmm,
6179 //    regs: 1
6180 //         if Q(6)=0
6181 //         else 2,
6182 //    rule: VHADD,
6183 //    safety: [Q(6)=1 &&
6184 //         (Vd(0)=1 ||
6185 //         Vn(0)=1 ||
6186 //         Vm(0)=1) => UNDEFINED,
6187 //      size(21:20)=11 => UNDEFINED],
6188 //    size: size(21:20),
6189 //    unsigned: U(24)=1,
6190 //    uses: {}}
6191 class VHADD_1111001u0dssnnnndddd0000nqm0mmmm_case_0
6192      : public ClassDecoder {
6193  public:
VHADD_1111001u0dssnnnndddd0000nqm0mmmm_case_0()6194   VHADD_1111001u0dssnnnndddd0000nqm0mmmm_case_0()
6195      : ClassDecoder() {}
6196   virtual RegisterList defs(Instruction inst) const;
6197   virtual SafetyLevel safety(Instruction i) const;
6198   virtual RegisterList uses(Instruction i) const;
6199  private:
6200   NACL_DISALLOW_COPY_AND_ASSIGN(
6201       VHADD_1111001u0dssnnnndddd0000nqm0mmmm_case_0);
6202 };
6203 
6204 // VHSUB_1111001u0dssnnnndddd0010nqm0mmmm_case_0:
6205 //
6206 //   {D: D(22),
6207 //    M: M(5),
6208 //    N: N(7),
6209 //    Q: Q(6),
6210 //    U: U(24),
6211 //    Vd: Vd(15:12),
6212 //    Vm: Vm(3:0),
6213 //    Vn: Vn(19:16),
6214 //    arch: ASIMD,
6215 //    d: D:Vd,
6216 //    defs: {},
6217 //    elements: 64 / esize,
6218 //    esize: 8 << size,
6219 //    fields: [U(24),
6220 //      D(22),
6221 //      size(21:20),
6222 //      Vn(19:16),
6223 //      Vd(15:12),
6224 //      op(9),
6225 //      N(7),
6226 //      Q(6),
6227 //      M(5),
6228 //      Vm(3:0)],
6229 //    m: M:Vm,
6230 //    n: N:Vn,
6231 //    op: op(9),
6232 //    pattern: 1111001u0dssnnnndddd0010nqm0mmmm,
6233 //    regs: 1
6234 //         if Q(6)=0
6235 //         else 2,
6236 //    rule: VHSUB,
6237 //    safety: [Q(6)=1 &&
6238 //         (Vd(0)=1 ||
6239 //         Vn(0)=1 ||
6240 //         Vm(0)=1) => UNDEFINED,
6241 //      size(21:20)=11 => UNDEFINED],
6242 //    size: size(21:20),
6243 //    unsigned: U(24)=1,
6244 //    uses: {}}
6245 class VHSUB_1111001u0dssnnnndddd0010nqm0mmmm_case_0
6246      : public ClassDecoder {
6247  public:
VHSUB_1111001u0dssnnnndddd0010nqm0mmmm_case_0()6248   VHSUB_1111001u0dssnnnndddd0010nqm0mmmm_case_0()
6249      : ClassDecoder() {}
6250   virtual RegisterList defs(Instruction inst) const;
6251   virtual SafetyLevel safety(Instruction i) const;
6252   virtual RegisterList uses(Instruction i) const;
6253  private:
6254   NACL_DISALLOW_COPY_AND_ASSIGN(
6255       VHSUB_1111001u0dssnnnndddd0010nqm0mmmm_case_0);
6256 };
6257 
6258 } // namespace nacl_arm_test
6259 
6260 #endif  // NATIVE_CLIENT_SRC_TRUSTED_VALIDATOR_ARM_GEN_ARM32_DECODE_BASELINES_2_H_
6261