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_3_H_
10 #define NATIVE_CLIENT_SRC_TRUSTED_VALIDATOR_ARM_GEN_ARM32_DECODE_BASELINES_3_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 // VLD1_multiple_single_elements_111101000d10nnnnddddttttssaammmm_case_0:
18 //
19 //   {D: D(22),
20 //    None: 32,
21 //    Pc: 15,
22 //    Rm: Rm(3:0),
23 //    Rn: Rn(19:16),
24 //    Sp: 13,
25 //    Vd: Vd(15:12),
26 //    align: align(5:4),
27 //    alignment: 1
28 //         if align(5:4)=00
29 //         else 4 << align,
30 //    arch: ASIMD,
31 //    base: n,
32 //    d: D:Vd,
33 //    defs: {base}
34 //         if wback
35 //         else {},
36 //    ebytes: 1 << size,
37 //    elements: 8 / ebytes,
38 //    esize: 8 * ebytes,
39 //    fields: [D(22),
40 //      Rn(19:16),
41 //      Vd(15:12),
42 //      type(11:8),
43 //      size(7:6),
44 //      align(5:4),
45 //      Rm(3:0)],
46 //    m: Rm,
47 //    n: Rn,
48 //    pattern: 111101000d10nnnnddddttttssaammmm,
49 //    register_index: (m  !=
50 //            Pc &&
51 //         m  !=
52 //            Sp),
53 //    regs: 1
54 //         if type(11:8)=0111
55 //         else 2
56 //         if type(11:8)=1010
57 //         else 3
58 //         if type(11:8)=0110
59 //         else 4
60 //         if type(11:8)=0010
61 //         else 0,
62 //    rule: VLD1_multiple_single_elements,
63 //    safety: [type(11:8)=0111 &&
64 //         align(1)=1 => UNDEFINED,
65 //      type(11:8)=1010 &&
66 //         align(5:4)=11 => UNDEFINED,
67 //      type(11:8)=0110 &&
68 //         align(1)=1 => UNDEFINED,
69 //      not type in bitset {'0111', '1010', '0110', '0010'} => DECODER_ERROR,
70 //      n  ==
71 //            Pc ||
72 //         d + regs  >
73 //            32 => UNPREDICTABLE],
74 //    size: size(7:6),
75 //    small_imm_base_wb: wback &&
76 //         not register_index,
77 //    type: type(11:8),
78 //    uses: {m
79 //         if wback
80 //         else None, n},
81 //    violations: [implied by 'base'],
82 //    wback: (m  !=
83 //            Pc)}
84 class VLD1_multiple_single_elements_111101000d10nnnnddddttttssaammmm_case_0
85      : public ClassDecoder {
86  public:
VLD1_multiple_single_elements_111101000d10nnnnddddttttssaammmm_case_0()87   VLD1_multiple_single_elements_111101000d10nnnnddddttttssaammmm_case_0()
88      : ClassDecoder() {}
89   virtual Register base_address_register(Instruction i) const;
90   virtual RegisterList defs(Instruction inst) const;
91   virtual SafetyLevel safety(Instruction i) const;
92   virtual bool base_address_register_writeback_small_immediate(
93       Instruction i) const;
94   virtual RegisterList uses(Instruction i) const;
95   virtual ViolationSet get_violations(
96       const nacl_arm_val::DecodedInstruction& first,
97       const nacl_arm_val::DecodedInstruction& second,
98       const nacl_arm_val::SfiValidator& sfi,
99       nacl_arm_val::AddressSet* branches,
100       nacl_arm_val::AddressSet* critical,
101       uint32_t* next_inst_addr) const;
102  private:
103   NACL_DISALLOW_COPY_AND_ASSIGN(
104       VLD1_multiple_single_elements_111101000d10nnnnddddttttssaammmm_case_0);
105 };
106 
107 // VLD1_single_element_to_all_lanes_111101001d10nnnndddd1100sstammmm_case_0:
108 //
109 //   {D: D(22),
110 //    None: 32,
111 //    Pc: 15,
112 //    Rm: Rm(3:0),
113 //    Rn: Rn(19:16),
114 //    Sp: 13,
115 //    T: T(5),
116 //    Vd: Vd(15:12),
117 //    a: a(4),
118 //    alignment: 1
119 //         if a(4)=0
120 //         else ebytes,
121 //    arch: ASIMD,
122 //    base: n,
123 //    d: D:Vd,
124 //    defs: {base}
125 //         if wback
126 //         else {},
127 //    ebytes: 1 << size,
128 //    elements: 8 / ebytes,
129 //    fields: [D(22),
130 //      Rn(19:16),
131 //      Vd(15:12),
132 //      size(7:6),
133 //      T(5),
134 //      a(4),
135 //      Rm(3:0)],
136 //    m: Rm,
137 //    n: Rn,
138 //    pattern: 111101001d10nnnndddd1100sstammmm,
139 //    register_index: (m  !=
140 //            Pc &&
141 //         m  !=
142 //            Sp),
143 //    regs: 1
144 //         if T(5)=0
145 //         else 2,
146 //    rule: VLD1_single_element_to_all_lanes,
147 //    safety: [size(7:6)=11 ||
148 //         (size(7:6)=00 &&
149 //         a(4)=1) => UNDEFINED,
150 //      n  ==
151 //            Pc ||
152 //         d + regs  >
153 //            32 => UNPREDICTABLE],
154 //    size: size(7:6),
155 //    small_imm_base_wb: wback &&
156 //         not register_index,
157 //    uses: {m
158 //         if wback
159 //         else None, n},
160 //    violations: [implied by 'base'],
161 //    wback: (m  !=
162 //            Pc)}
163 class VLD1_single_element_to_all_lanes_111101001d10nnnndddd1100sstammmm_case_0
164      : public ClassDecoder {
165  public:
VLD1_single_element_to_all_lanes_111101001d10nnnndddd1100sstammmm_case_0()166   VLD1_single_element_to_all_lanes_111101001d10nnnndddd1100sstammmm_case_0()
167      : ClassDecoder() {}
168   virtual Register base_address_register(Instruction i) const;
169   virtual RegisterList defs(Instruction inst) const;
170   virtual SafetyLevel safety(Instruction i) const;
171   virtual bool base_address_register_writeback_small_immediate(
172       Instruction i) const;
173   virtual RegisterList uses(Instruction i) const;
174   virtual ViolationSet get_violations(
175       const nacl_arm_val::DecodedInstruction& first,
176       const nacl_arm_val::DecodedInstruction& second,
177       const nacl_arm_val::SfiValidator& sfi,
178       nacl_arm_val::AddressSet* branches,
179       nacl_arm_val::AddressSet* critical,
180       uint32_t* next_inst_addr) const;
181  private:
182   NACL_DISALLOW_COPY_AND_ASSIGN(
183       VLD1_single_element_to_all_lanes_111101001d10nnnndddd1100sstammmm_case_0);
184 };
185 
186 // VLD1_single_element_to_one_lane_111101001d10nnnnddddss00aaaammmm_case_0:
187 //
188 //   {D: D(22),
189 //    None: 32,
190 //    Pc: 15,
191 //    Rm: Rm(3:0),
192 //    Rn: Rn(19:16),
193 //    Sp: 13,
194 //    Vd: Vd(15:12),
195 //    alignment: 1
196 //         if size(11:10)=00
197 //         else (1
198 //         if index_align(0)=0
199 //         else 2)
200 //         if size(11:10)=01
201 //         else (1
202 //         if index_align(1:0)=00
203 //         else 4)
204 //         if size(11:10)=10
205 //         else 0,
206 //    arch: ASIMD,
207 //    base: n,
208 //    d: D:Vd,
209 //    defs: {base}
210 //         if wback
211 //         else {},
212 //    ebytes: 1 << size,
213 //    esize: 8 * ebytes,
214 //    fields: [D(22),
215 //      Rn(19:16),
216 //      Vd(15:12),
217 //      size(11:10),
218 //      index_align(7:4),
219 //      Rm(3:0)],
220 //    inc: 1
221 //         if size(11:10)=00
222 //         else (1
223 //         if index_align(1)=0
224 //         else 2)
225 //         if size(11:10)=01
226 //         else (1
227 //         if index_align(2)=0
228 //         else 2)
229 //         if size(11:10)=10
230 //         else 0,
231 //    index: index_align(3:1)
232 //         if size(11:10)=00
233 //         else index_align(3:2)
234 //         if size(11:10)=01
235 //         else index_align(3)
236 //         if size(11:10)=10
237 //         else 0,
238 //    index_align: index_align(7:4),
239 //    m: Rm,
240 //    n: Rn,
241 //    pattern: 111101001d10nnnnddddss00aaaammmm,
242 //    register_index: (m  !=
243 //            Pc &&
244 //         m  !=
245 //            Sp),
246 //    rule: VLD1_single_element_to_one_lane,
247 //    safety: [size(11:10)=11 => UNDEFINED,
248 //      size(11:10)=00 &&
249 //         index_align(0)=~0 => UNDEFINED,
250 //      size(11:10)=01 &&
251 //         index_align(1)=~0 => UNDEFINED,
252 //      size(11:10)=10 &&
253 //         index_align(2)=~0 => UNDEFINED,
254 //      size(11:10)=10 &&
255 //         index_align(1:0)=~00 &&
256 //         index_align(1:0)=~11 => UNDEFINED,
257 //      n  ==
258 //            Pc => UNPREDICTABLE],
259 //    size: size(11:10),
260 //    small_imm_base_wb: wback &&
261 //         not register_index,
262 //    uses: {m
263 //         if wback
264 //         else None, n},
265 //    violations: [implied by 'base'],
266 //    wback: (m  !=
267 //            Pc)}
268 class VLD1_single_element_to_one_lane_111101001d10nnnnddddss00aaaammmm_case_0
269      : public ClassDecoder {
270  public:
VLD1_single_element_to_one_lane_111101001d10nnnnddddss00aaaammmm_case_0()271   VLD1_single_element_to_one_lane_111101001d10nnnnddddss00aaaammmm_case_0()
272      : ClassDecoder() {}
273   virtual Register base_address_register(Instruction i) const;
274   virtual RegisterList defs(Instruction inst) const;
275   virtual SafetyLevel safety(Instruction i) const;
276   virtual bool base_address_register_writeback_small_immediate(
277       Instruction i) const;
278   virtual RegisterList uses(Instruction i) const;
279   virtual ViolationSet get_violations(
280       const nacl_arm_val::DecodedInstruction& first,
281       const nacl_arm_val::DecodedInstruction& second,
282       const nacl_arm_val::SfiValidator& sfi,
283       nacl_arm_val::AddressSet* branches,
284       nacl_arm_val::AddressSet* critical,
285       uint32_t* next_inst_addr) const;
286  private:
287   NACL_DISALLOW_COPY_AND_ASSIGN(
288       VLD1_single_element_to_one_lane_111101001d10nnnnddddss00aaaammmm_case_0);
289 };
290 
291 // VLD2_multiple_2_element_structures_111101000d10nnnnddddttttssaammmm_case_0:
292 //
293 //   {D: D(22),
294 //    None: 32,
295 //    Pc: 15,
296 //    Rm: Rm(3:0),
297 //    Rn: Rn(19:16),
298 //    Sp: 13,
299 //    Vd: Vd(15:12),
300 //    align: align(5:4),
301 //    alignment: 1
302 //         if align(5:4)=00
303 //         else 4 << align,
304 //    arch: ASIMD,
305 //    base: n,
306 //    d: D:Vd,
307 //    d2: d + inc,
308 //    defs: {base}
309 //         if wback
310 //         else {},
311 //    ebytes: 1 << size,
312 //    elements: 8 / ebytes,
313 //    esize: 8 * ebytes,
314 //    fields: [D(22),
315 //      Rn(19:16),
316 //      Vd(15:12),
317 //      type(11:8),
318 //      size(7:6),
319 //      align(5:4),
320 //      Rm(3:0)],
321 //    inc: 1
322 //         if type(11:8)=1000
323 //         else 2,
324 //    m: Rm,
325 //    n: Rn,
326 //    pattern: 111101000d10nnnnddddttttssaammmm,
327 //    register_index: (m  !=
328 //            Pc &&
329 //         m  !=
330 //            Sp),
331 //    regs: 1
332 //         if type in bitset {'1000', '1001'}
333 //         else 2,
334 //    rule: VLD2_multiple_2_element_structures,
335 //    safety: [size(7:6)=11 => UNDEFINED,
336 //      type in bitset {'1000', '1001'} &&
337 //         align(5:4)=11 => UNDEFINED,
338 //      not type in bitset {'1000', '1001', '0011'} => DECODER_ERROR,
339 //      n  ==
340 //            Pc ||
341 //         d2 + regs  >
342 //            32 => UNPREDICTABLE],
343 //    size: size(7:6),
344 //    small_imm_base_wb: wback &&
345 //         not register_index,
346 //    type: type(11:8),
347 //    uses: {m
348 //         if wback
349 //         else None, n},
350 //    violations: [implied by 'base'],
351 //    wback: (m  !=
352 //            Pc)}
353 class VLD2_multiple_2_element_structures_111101000d10nnnnddddttttssaammmm_case_0
354      : public ClassDecoder {
355  public:
VLD2_multiple_2_element_structures_111101000d10nnnnddddttttssaammmm_case_0()356   VLD2_multiple_2_element_structures_111101000d10nnnnddddttttssaammmm_case_0()
357      : ClassDecoder() {}
358   virtual Register base_address_register(Instruction i) const;
359   virtual RegisterList defs(Instruction inst) const;
360   virtual SafetyLevel safety(Instruction i) const;
361   virtual bool base_address_register_writeback_small_immediate(
362       Instruction i) const;
363   virtual RegisterList uses(Instruction i) const;
364   virtual ViolationSet get_violations(
365       const nacl_arm_val::DecodedInstruction& first,
366       const nacl_arm_val::DecodedInstruction& second,
367       const nacl_arm_val::SfiValidator& sfi,
368       nacl_arm_val::AddressSet* branches,
369       nacl_arm_val::AddressSet* critical,
370       uint32_t* next_inst_addr) const;
371  private:
372   NACL_DISALLOW_COPY_AND_ASSIGN(
373       VLD2_multiple_2_element_structures_111101000d10nnnnddddttttssaammmm_case_0);
374 };
375 
376 // VLD2_single_2_element_structure_to_all_lanes_111101001d10nnnndddd1101sstammmm_case_0:
377 //
378 //   {D: D(22),
379 //    None: 32,
380 //    Pc: 15,
381 //    Rm: Rm(3:0),
382 //    Rn: Rn(19:16),
383 //    Sp: 13,
384 //    T: T(5),
385 //    Vd: Vd(15:12),
386 //    a: a(4),
387 //    alignment: 1
388 //         if a(4)=0
389 //         else 2 * ebytes,
390 //    arch: ASIMD,
391 //    base: n,
392 //    d: D:Vd,
393 //    d2: d + inc,
394 //    defs: {base}
395 //         if wback
396 //         else {},
397 //    ebytes: 1 << size,
398 //    elements: 8 / ebytes,
399 //    fields: [D(22),
400 //      Rn(19:16),
401 //      Vd(15:12),
402 //      size(7:6),
403 //      T(5),
404 //      a(4),
405 //      Rm(3:0)],
406 //    inc: 1
407 //         if T(5)=0
408 //         else 2,
409 //    m: Rm,
410 //    n: Rn,
411 //    pattern: 111101001d10nnnndddd1101sstammmm,
412 //    register_index: (m  !=
413 //            Pc &&
414 //         m  !=
415 //            Sp),
416 //    rule: VLD2_single_2_element_structure_to_all_lanes,
417 //    safety: [size(7:6)=11 => UNDEFINED,
418 //      n  ==
419 //            Pc ||
420 //         d2  >
421 //            31 => UNPREDICTABLE],
422 //    size: size(7:6),
423 //    small_imm_base_wb: wback &&
424 //         not register_index,
425 //    uses: {m
426 //         if wback
427 //         else None, n},
428 //    violations: [implied by 'base'],
429 //    wback: (m  !=
430 //            Pc)}
431 class VLD2_single_2_element_structure_to_all_lanes_111101001d10nnnndddd1101sstammmm_case_0
432      : public ClassDecoder {
433  public:
VLD2_single_2_element_structure_to_all_lanes_111101001d10nnnndddd1101sstammmm_case_0()434   VLD2_single_2_element_structure_to_all_lanes_111101001d10nnnndddd1101sstammmm_case_0()
435      : ClassDecoder() {}
436   virtual Register base_address_register(Instruction i) const;
437   virtual RegisterList defs(Instruction inst) const;
438   virtual SafetyLevel safety(Instruction i) const;
439   virtual bool base_address_register_writeback_small_immediate(
440       Instruction i) const;
441   virtual RegisterList uses(Instruction i) const;
442   virtual ViolationSet get_violations(
443       const nacl_arm_val::DecodedInstruction& first,
444       const nacl_arm_val::DecodedInstruction& second,
445       const nacl_arm_val::SfiValidator& sfi,
446       nacl_arm_val::AddressSet* branches,
447       nacl_arm_val::AddressSet* critical,
448       uint32_t* next_inst_addr) const;
449  private:
450   NACL_DISALLOW_COPY_AND_ASSIGN(
451       VLD2_single_2_element_structure_to_all_lanes_111101001d10nnnndddd1101sstammmm_case_0);
452 };
453 
454 // VLD2_single_2_element_structure_to_one_lane_111101001d10nnnnddddss01aaaammmm_case_0:
455 //
456 //   {D: D(22),
457 //    None: 32,
458 //    Pc: 15,
459 //    Rm: Rm(3:0),
460 //    Rn: Rn(19:16),
461 //    Sp: 13,
462 //    Vd: Vd(15:12),
463 //    alignment: (1
464 //         if index_align(0)=0
465 //         else 2)
466 //         if size(11:10)=00
467 //         else (1
468 //         if index_align(0)=0
469 //         else 4)
470 //         if size(11:10)=01
471 //         else (1
472 //         if index_align(0)=0
473 //         else 8)
474 //         if size(11:10)=10
475 //         else 0,
476 //    arch: ASIMD,
477 //    base: n,
478 //    d: D:Vd,
479 //    d2: d + inc,
480 //    defs: {base}
481 //         if wback
482 //         else {},
483 //    ebytes: 1 << size,
484 //    esize: 8 * ebytes,
485 //    fields: [D(22),
486 //      Rn(19:16),
487 //      Vd(15:12),
488 //      size(11:10),
489 //      index_align(7:4),
490 //      Rm(3:0)],
491 //    inc: 1
492 //         if size(11:10)=00
493 //         else (1
494 //         if index_align(1)=0
495 //         else 2)
496 //         if size(11:10)=01
497 //         else (1
498 //         if index_align(2)=0
499 //         else 2)
500 //         if size(11:10)=10
501 //         else 0,
502 //    index: index_align(3:1)
503 //         if size(11:10)=00
504 //         else index_align(3:2)
505 //         if size(11:10)=01
506 //         else index_align(3)
507 //         if size(11:10)=10
508 //         else 0,
509 //    index_align: index_align(7:4),
510 //    m: Rm,
511 //    n: Rn,
512 //    pattern: 111101001d10nnnnddddss01aaaammmm,
513 //    register_index: (m  !=
514 //            Pc &&
515 //         m  !=
516 //            Sp),
517 //    rule: VLD2_single_2_element_structure_to_one_lane,
518 //    safety: [size(11:10)=11 => UNDEFINED,
519 //      size(11:10)=10 &&
520 //         index_align(1)=~0 => UNDEFINED,
521 //      n  ==
522 //            Pc ||
523 //         d2  >
524 //            31 => UNPREDICTABLE],
525 //    size: size(11:10),
526 //    small_imm_base_wb: wback &&
527 //         not register_index,
528 //    uses: {m
529 //         if wback
530 //         else None, n},
531 //    violations: [implied by 'base'],
532 //    wback: (m  !=
533 //            Pc)}
534 class VLD2_single_2_element_structure_to_one_lane_111101001d10nnnnddddss01aaaammmm_case_0
535      : public ClassDecoder {
536  public:
VLD2_single_2_element_structure_to_one_lane_111101001d10nnnnddddss01aaaammmm_case_0()537   VLD2_single_2_element_structure_to_one_lane_111101001d10nnnnddddss01aaaammmm_case_0()
538      : ClassDecoder() {}
539   virtual Register base_address_register(Instruction i) const;
540   virtual RegisterList defs(Instruction inst) const;
541   virtual SafetyLevel safety(Instruction i) const;
542   virtual bool base_address_register_writeback_small_immediate(
543       Instruction i) const;
544   virtual RegisterList uses(Instruction i) const;
545   virtual ViolationSet get_violations(
546       const nacl_arm_val::DecodedInstruction& first,
547       const nacl_arm_val::DecodedInstruction& second,
548       const nacl_arm_val::SfiValidator& sfi,
549       nacl_arm_val::AddressSet* branches,
550       nacl_arm_val::AddressSet* critical,
551       uint32_t* next_inst_addr) const;
552  private:
553   NACL_DISALLOW_COPY_AND_ASSIGN(
554       VLD2_single_2_element_structure_to_one_lane_111101001d10nnnnddddss01aaaammmm_case_0);
555 };
556 
557 // VLD3_multiple_3_element_structures_111101000d10nnnnddddttttssaammmm_case_0:
558 //
559 //   {D: D(22),
560 //    None: 32,
561 //    Pc: 15,
562 //    Rm: Rm(3:0),
563 //    Rn: Rn(19:16),
564 //    Sp: 13,
565 //    Vd: Vd(15:12),
566 //    align: align(5:4),
567 //    alignment: 1
568 //         if align(0)=0
569 //         else 8,
570 //    arch: ASIMD,
571 //    base: n,
572 //    d: D:Vd,
573 //    d2: d + inc,
574 //    d3: d2 + inc,
575 //    defs: {base}
576 //         if wback
577 //         else {},
578 //    ebytes: 1 << size,
579 //    elements: 8 / ebytes,
580 //    esize: 8 * ebytes,
581 //    fields: [D(22),
582 //      Rn(19:16),
583 //      Vd(15:12),
584 //      type(11:8),
585 //      size(7:6),
586 //      align(5:4),
587 //      Rm(3:0)],
588 //    inc: 1
589 //         if type(11:8)=0100
590 //         else 2,
591 //    m: Rm,
592 //    n: Rn,
593 //    pattern: 111101000d10nnnnddddttttssaammmm,
594 //    register_index: (m  !=
595 //            Pc &&
596 //         m  !=
597 //            Sp),
598 //    rule: VLD3_multiple_3_element_structures,
599 //    safety: [size(7:6)=11 ||
600 //         align(1)=1 => UNDEFINED,
601 //      not type in bitset {'0100', '0101'} => DECODER_ERROR,
602 //      n  ==
603 //            Pc ||
604 //         d3  >
605 //            31 => UNPREDICTABLE],
606 //    size: size(7:6),
607 //    small_imm_base_wb: wback &&
608 //         not register_index,
609 //    type: type(11:8),
610 //    uses: {m
611 //         if wback
612 //         else None, n},
613 //    violations: [implied by 'base'],
614 //    wback: (m  !=
615 //            Pc)}
616 class VLD3_multiple_3_element_structures_111101000d10nnnnddddttttssaammmm_case_0
617      : public ClassDecoder {
618  public:
VLD3_multiple_3_element_structures_111101000d10nnnnddddttttssaammmm_case_0()619   VLD3_multiple_3_element_structures_111101000d10nnnnddddttttssaammmm_case_0()
620      : ClassDecoder() {}
621   virtual Register base_address_register(Instruction i) const;
622   virtual RegisterList defs(Instruction inst) const;
623   virtual SafetyLevel safety(Instruction i) const;
624   virtual bool base_address_register_writeback_small_immediate(
625       Instruction i) const;
626   virtual RegisterList uses(Instruction i) const;
627   virtual ViolationSet get_violations(
628       const nacl_arm_val::DecodedInstruction& first,
629       const nacl_arm_val::DecodedInstruction& second,
630       const nacl_arm_val::SfiValidator& sfi,
631       nacl_arm_val::AddressSet* branches,
632       nacl_arm_val::AddressSet* critical,
633       uint32_t* next_inst_addr) const;
634  private:
635   NACL_DISALLOW_COPY_AND_ASSIGN(
636       VLD3_multiple_3_element_structures_111101000d10nnnnddddttttssaammmm_case_0);
637 };
638 
639 // VLD3_single_3_element_structure_to_all_lanes_111101001d10nnnndddd1110sstammmm_case_0:
640 //
641 //   {D: D(22),
642 //    None: 32,
643 //    Pc: 15,
644 //    Rm: Rm(3:0),
645 //    Rn: Rn(19:16),
646 //    Sp: 13,
647 //    T: T(5),
648 //    Vd: Vd(15:12),
649 //    a: a(4),
650 //    alignment: 1,
651 //    arch: ASIMD,
652 //    base: n,
653 //    d: D:Vd,
654 //    d2: d + inc,
655 //    d3: d2 + inc,
656 //    defs: {base}
657 //         if wback
658 //         else {},
659 //    ebytes: 1 << size,
660 //    elements: 8 / ebytes,
661 //    fields: [D(22),
662 //      Rn(19:16),
663 //      Vd(15:12),
664 //      size(7:6),
665 //      T(5),
666 //      a(4),
667 //      Rm(3:0)],
668 //    inc: 1
669 //         if T(5)=0
670 //         else 2,
671 //    m: Rm,
672 //    n: Rn,
673 //    pattern: 111101001d10nnnndddd1110sstammmm,
674 //    register_index: (m  !=
675 //            Pc &&
676 //         m  !=
677 //            Sp),
678 //    rule: VLD3_single_3_element_structure_to_all_lanes,
679 //    safety: [size(7:6)=11 ||
680 //         a(4)=1 => UNDEFINED,
681 //      n  ==
682 //            Pc ||
683 //         d3  >
684 //            31 => UNPREDICTABLE],
685 //    size: size(7:6),
686 //    small_imm_base_wb: wback &&
687 //         not register_index,
688 //    uses: {m
689 //         if wback
690 //         else None, n},
691 //    violations: [implied by 'base'],
692 //    wback: (m  !=
693 //            Pc)}
694 class VLD3_single_3_element_structure_to_all_lanes_111101001d10nnnndddd1110sstammmm_case_0
695      : public ClassDecoder {
696  public:
VLD3_single_3_element_structure_to_all_lanes_111101001d10nnnndddd1110sstammmm_case_0()697   VLD3_single_3_element_structure_to_all_lanes_111101001d10nnnndddd1110sstammmm_case_0()
698      : ClassDecoder() {}
699   virtual Register base_address_register(Instruction i) const;
700   virtual RegisterList defs(Instruction inst) const;
701   virtual SafetyLevel safety(Instruction i) const;
702   virtual bool base_address_register_writeback_small_immediate(
703       Instruction i) const;
704   virtual RegisterList uses(Instruction i) const;
705   virtual ViolationSet get_violations(
706       const nacl_arm_val::DecodedInstruction& first,
707       const nacl_arm_val::DecodedInstruction& second,
708       const nacl_arm_val::SfiValidator& sfi,
709       nacl_arm_val::AddressSet* branches,
710       nacl_arm_val::AddressSet* critical,
711       uint32_t* next_inst_addr) const;
712  private:
713   NACL_DISALLOW_COPY_AND_ASSIGN(
714       VLD3_single_3_element_structure_to_all_lanes_111101001d10nnnndddd1110sstammmm_case_0);
715 };
716 
717 // VLD3_single_3_element_structure_to_one_lane_111101001d10nnnnddddss10aaaammmm_case_0:
718 //
719 //   {D: D(22),
720 //    None: 32,
721 //    Pc: 15,
722 //    Rm: Rm(3:0),
723 //    Rn: Rn(19:16),
724 //    Sp: 13,
725 //    Vd: Vd(15:12),
726 //    alignment: 1,
727 //    arch: ASIMD,
728 //    base: n,
729 //    d: D:Vd,
730 //    d2: d + inc,
731 //    d3: d2 + inc,
732 //    defs: {base}
733 //         if wback
734 //         else {},
735 //    ebytes: 1 << size,
736 //    esize: 8 * ebytes,
737 //    fields: [D(22),
738 //      Rn(19:16),
739 //      Vd(15:12),
740 //      size(11:10),
741 //      index_align(7:4),
742 //      Rm(3:0)],
743 //    inc: 1
744 //         if size(11:10)=00
745 //         else (1
746 //         if index_align(1)=0
747 //         else 2)
748 //         if size(11:10)=01
749 //         else (1
750 //         if index_align(2)=0
751 //         else 2)
752 //         if size(11:10)=10
753 //         else 0,
754 //    index: index_align(3:1)
755 //         if size(11:10)=00
756 //         else index_align(3:2)
757 //         if size(11:10)=01
758 //         else index_align(3)
759 //         if size(11:10)=10
760 //         else 0,
761 //    index_align: index_align(7:4),
762 //    m: Rm,
763 //    n: Rn,
764 //    pattern: 111101001d10nnnnddddss10aaaammmm,
765 //    register_index: (m  !=
766 //            Pc &&
767 //         m  !=
768 //            Sp),
769 //    rule: VLD3_single_3_element_structure_to_one_lane,
770 //    safety: [size(11:10)=11 => UNDEFINED,
771 //      size(11:10)=00 &&
772 //         index_align(0)=~0 => UNDEFINED,
773 //      size(11:10)=01 &&
774 //         index_align(0)=~0 => UNDEFINED,
775 //      size(11:10)=10 &&
776 //         index_align(1:0)=~00 => UNDEFINED,
777 //      n  ==
778 //            Pc ||
779 //         d3  >
780 //            31 => UNPREDICTABLE],
781 //    size: size(11:10),
782 //    small_imm_base_wb: wback &&
783 //         not register_index,
784 //    uses: {m
785 //         if wback
786 //         else None, n},
787 //    violations: [implied by 'base'],
788 //    wback: (m  !=
789 //            Pc)}
790 class VLD3_single_3_element_structure_to_one_lane_111101001d10nnnnddddss10aaaammmm_case_0
791      : public ClassDecoder {
792  public:
VLD3_single_3_element_structure_to_one_lane_111101001d10nnnnddddss10aaaammmm_case_0()793   VLD3_single_3_element_structure_to_one_lane_111101001d10nnnnddddss10aaaammmm_case_0()
794      : ClassDecoder() {}
795   virtual Register base_address_register(Instruction i) const;
796   virtual RegisterList defs(Instruction inst) const;
797   virtual SafetyLevel safety(Instruction i) const;
798   virtual bool base_address_register_writeback_small_immediate(
799       Instruction i) const;
800   virtual RegisterList uses(Instruction i) const;
801   virtual ViolationSet get_violations(
802       const nacl_arm_val::DecodedInstruction& first,
803       const nacl_arm_val::DecodedInstruction& second,
804       const nacl_arm_val::SfiValidator& sfi,
805       nacl_arm_val::AddressSet* branches,
806       nacl_arm_val::AddressSet* critical,
807       uint32_t* next_inst_addr) const;
808  private:
809   NACL_DISALLOW_COPY_AND_ASSIGN(
810       VLD3_single_3_element_structure_to_one_lane_111101001d10nnnnddddss10aaaammmm_case_0);
811 };
812 
813 // VLD4_multiple_4_element_structures_111101000d10nnnnddddttttssaammmm_case_0:
814 //
815 //   {D: D(22),
816 //    None: 32,
817 //    Pc: 15,
818 //    Rm: Rm(3:0),
819 //    Rn: Rn(19:16),
820 //    Sp: 13,
821 //    Vd: Vd(15:12),
822 //    align: align(5:4),
823 //    alignment: 1
824 //         if align(5:4)=00
825 //         else 4 << align,
826 //    arch: ASIMD,
827 //    base: n,
828 //    d: D:Vd,
829 //    d2: d + inc,
830 //    d3: d2 + inc,
831 //    d4: d3 + inc,
832 //    defs: {base}
833 //         if wback
834 //         else {},
835 //    ebytes: 1 << size,
836 //    elements: 8 / ebytes,
837 //    esize: 8 * ebytes,
838 //    fields: [D(22),
839 //      Rn(19:16),
840 //      Vd(15:12),
841 //      type(11:8),
842 //      size(7:6),
843 //      align(5:4),
844 //      Rm(3:0)],
845 //    inc: 1
846 //         if type(11:8)=0000
847 //         else 2,
848 //    m: Rm,
849 //    n: Rn,
850 //    pattern: 111101000d10nnnnddddttttssaammmm,
851 //    register_index: (m  !=
852 //            Pc &&
853 //         m  !=
854 //            Sp),
855 //    rule: VLD4_multiple_4_element_structures,
856 //    safety: [size(7:6)=11 => UNDEFINED,
857 //      not type in bitset {'0000', '0001'} => DECODER_ERROR,
858 //      n  ==
859 //            Pc ||
860 //         d4  >
861 //            31 => UNPREDICTABLE],
862 //    size: size(7:6),
863 //    small_imm_base_wb: wback &&
864 //         not register_index,
865 //    type: type(11:8),
866 //    uses: {m
867 //         if wback
868 //         else None, n},
869 //    violations: [implied by 'base'],
870 //    wback: (m  !=
871 //            Pc)}
872 class VLD4_multiple_4_element_structures_111101000d10nnnnddddttttssaammmm_case_0
873      : public ClassDecoder {
874  public:
VLD4_multiple_4_element_structures_111101000d10nnnnddddttttssaammmm_case_0()875   VLD4_multiple_4_element_structures_111101000d10nnnnddddttttssaammmm_case_0()
876      : ClassDecoder() {}
877   virtual Register base_address_register(Instruction i) const;
878   virtual RegisterList defs(Instruction inst) const;
879   virtual SafetyLevel safety(Instruction i) const;
880   virtual bool base_address_register_writeback_small_immediate(
881       Instruction i) const;
882   virtual RegisterList uses(Instruction i) const;
883   virtual ViolationSet get_violations(
884       const nacl_arm_val::DecodedInstruction& first,
885       const nacl_arm_val::DecodedInstruction& second,
886       const nacl_arm_val::SfiValidator& sfi,
887       nacl_arm_val::AddressSet* branches,
888       nacl_arm_val::AddressSet* critical,
889       uint32_t* next_inst_addr) const;
890  private:
891   NACL_DISALLOW_COPY_AND_ASSIGN(
892       VLD4_multiple_4_element_structures_111101000d10nnnnddddttttssaammmm_case_0);
893 };
894 
895 // VLD4_single_4_element_structure_to_all_lanes_111101001d10nnnndddd1111sstammmm_case_0:
896 //
897 //   {D: D(22),
898 //    None: 32,
899 //    Pc: 15,
900 //    Rm: Rm(3:0),
901 //    Rn: Rn(19:16),
902 //    Sp: 13,
903 //    T: T(5),
904 //    Vd: Vd(15:12),
905 //    a: a(4),
906 //    alignment: 16
907 //         if size(7:6)=11
908 //         else (1
909 //         if a(4)=0
910 //         else 8)
911 //         if size(7:6)=10
912 //         else (1
913 //         if a(4)=0
914 //         else 4 * ebytes),
915 //    arch: ASIMD,
916 //    base: n,
917 //    d: D:Vd,
918 //    d2: d + inc,
919 //    d3: d2 + inc,
920 //    d4: d3 + inc,
921 //    defs: {base}
922 //         if wback
923 //         else {},
924 //    ebytes: 1 << size,
925 //    elements: 8 / ebytes,
926 //    fields: [D(22),
927 //      Rn(19:16),
928 //      Vd(15:12),
929 //      size(7:6),
930 //      T(5),
931 //      a(4),
932 //      Rm(3:0)],
933 //    inc: 1
934 //         if T(5)=0
935 //         else 2,
936 //    m: Rm,
937 //    n: Rn,
938 //    pattern: 111101001d10nnnndddd1111sstammmm,
939 //    register_index: (m  !=
940 //            Pc &&
941 //         m  !=
942 //            Sp),
943 //    rule: VLD4_single_4_element_structure_to_all_lanes,
944 //    safety: [size(7:6)=11 &&
945 //         a(4)=0 => UNDEFINED,
946 //      n  ==
947 //            Pc ||
948 //         d4  >
949 //            31 => UNPREDICTABLE],
950 //    size: size(7:6),
951 //    small_imm_base_wb: wback &&
952 //         not register_index,
953 //    uses: {m
954 //         if wback
955 //         else None, n},
956 //    violations: [implied by 'base'],
957 //    wback: (m  !=
958 //            Pc)}
959 class VLD4_single_4_element_structure_to_all_lanes_111101001d10nnnndddd1111sstammmm_case_0
960      : public ClassDecoder {
961  public:
VLD4_single_4_element_structure_to_all_lanes_111101001d10nnnndddd1111sstammmm_case_0()962   VLD4_single_4_element_structure_to_all_lanes_111101001d10nnnndddd1111sstammmm_case_0()
963      : ClassDecoder() {}
964   virtual Register base_address_register(Instruction i) const;
965   virtual RegisterList defs(Instruction inst) const;
966   virtual SafetyLevel safety(Instruction i) const;
967   virtual bool base_address_register_writeback_small_immediate(
968       Instruction i) const;
969   virtual RegisterList uses(Instruction i) const;
970   virtual ViolationSet get_violations(
971       const nacl_arm_val::DecodedInstruction& first,
972       const nacl_arm_val::DecodedInstruction& second,
973       const nacl_arm_val::SfiValidator& sfi,
974       nacl_arm_val::AddressSet* branches,
975       nacl_arm_val::AddressSet* critical,
976       uint32_t* next_inst_addr) const;
977  private:
978   NACL_DISALLOW_COPY_AND_ASSIGN(
979       VLD4_single_4_element_structure_to_all_lanes_111101001d10nnnndddd1111sstammmm_case_0);
980 };
981 
982 // VLD4_single_4_element_structure_to_one_lane_111101001d10nnnnddddss11aaaammmm_case_0:
983 //
984 //   {D: D(22),
985 //    None: 32,
986 //    Pc: 15,
987 //    Rm: Rm(3:0),
988 //    Rn: Rn(19:16),
989 //    Sp: 13,
990 //    Vd: Vd(15:12),
991 //    alignment: (1
992 //         if index_align(0)=0
993 //         else 4)
994 //         if size(11:10)=00
995 //         else (1
996 //         if index_align(0)=0
997 //         else 8)
998 //         if size(11:10)=01
999 //         else (1
1000 //         if index_align(1:0)=00
1001 //         else 4 << index_align(1:0))
1002 //         if size(11:10)=10
1003 //         else 0,
1004 //    arch: ASIMD,
1005 //    base: n,
1006 //    d: D:Vd,
1007 //    d2: d + inc,
1008 //    d3: d2 + inc,
1009 //    d4: d3 + inc,
1010 //    defs: {base}
1011 //         if wback
1012 //         else {},
1013 //    ebytes: 1 << size,
1014 //    esize: 8 * ebytes,
1015 //    fields: [D(22),
1016 //      Rn(19:16),
1017 //      Vd(15:12),
1018 //      size(11:10),
1019 //      index_align(7:4),
1020 //      Rm(3:0)],
1021 //    inc: 1
1022 //         if size(11:10)=00
1023 //         else (1
1024 //         if index_align(1)=0
1025 //         else 2)
1026 //         if size(11:10)=01
1027 //         else (1
1028 //         if index_align(2)=0
1029 //         else 2)
1030 //         if size(11:10)=10
1031 //         else 0,
1032 //    index: index_align(3:1)
1033 //         if size(11:10)=00
1034 //         else index_align(3:2)
1035 //         if size(11:10)=01
1036 //         else index_align(3)
1037 //         if size(11:10)=10
1038 //         else 0,
1039 //    index_align: index_align(7:4),
1040 //    m: Rm,
1041 //    n: Rn,
1042 //    pattern: 111101001d10nnnnddddss11aaaammmm,
1043 //    register_index: (m  !=
1044 //            Pc &&
1045 //         m  !=
1046 //            Sp),
1047 //    rule: VLD4_single_4_element_structure_to_one_lane,
1048 //    safety: [size(11:10)=11 => UNDEFINED,
1049 //      size(11:10)=10 &&
1050 //         index_align(1:0)=11 => UNDEFINED,
1051 //      n  ==
1052 //            Pc ||
1053 //         d4  >
1054 //            31 => UNPREDICTABLE],
1055 //    size: size(11:10),
1056 //    small_imm_base_wb: wback &&
1057 //         not register_index,
1058 //    uses: {m
1059 //         if wback
1060 //         else None, n},
1061 //    violations: [implied by 'base'],
1062 //    wback: (m  !=
1063 //            Pc)}
1064 class VLD4_single_4_element_structure_to_one_lane_111101001d10nnnnddddss11aaaammmm_case_0
1065      : public ClassDecoder {
1066  public:
VLD4_single_4_element_structure_to_one_lane_111101001d10nnnnddddss11aaaammmm_case_0()1067   VLD4_single_4_element_structure_to_one_lane_111101001d10nnnnddddss11aaaammmm_case_0()
1068      : ClassDecoder() {}
1069   virtual Register base_address_register(Instruction i) const;
1070   virtual RegisterList defs(Instruction inst) const;
1071   virtual SafetyLevel safety(Instruction i) const;
1072   virtual bool base_address_register_writeback_small_immediate(
1073       Instruction i) const;
1074   virtual RegisterList uses(Instruction i) const;
1075   virtual ViolationSet get_violations(
1076       const nacl_arm_val::DecodedInstruction& first,
1077       const nacl_arm_val::DecodedInstruction& second,
1078       const nacl_arm_val::SfiValidator& sfi,
1079       nacl_arm_val::AddressSet* branches,
1080       nacl_arm_val::AddressSet* critical,
1081       uint32_t* next_inst_addr) const;
1082  private:
1083   NACL_DISALLOW_COPY_AND_ASSIGN(
1084       VLD4_single_4_element_structure_to_one_lane_111101001d10nnnnddddss11aaaammmm_case_0);
1085 };
1086 
1087 // VLDM_cccc110pudw1nnnndddd1010iiiiiiii_case_0:
1088 //
1089 //   {D: D(22),
1090 //    None: 32,
1091 //    P: P(24),
1092 //    Pc: 15,
1093 //    Rn: Rn(19:16),
1094 //    Sp: 13,
1095 //    U: U(23),
1096 //    Vd: Vd(15:12),
1097 //    W: W(21),
1098 //    add: U(23)=1,
1099 //    arch: VFPv2,
1100 //    base: Rn,
1101 //    cond: cond(31:28),
1102 //    d: Vd:D,
1103 //    defs: {Rn
1104 //         if wback
1105 //         else None},
1106 //    fields: [cond(31:28),
1107 //      P(24),
1108 //      U(23),
1109 //      D(22),
1110 //      W(21),
1111 //      Rn(19:16),
1112 //      Vd(15:12),
1113 //      imm8(7:0)],
1114 //    imm32: ZeroExtend(imm8:'00'(1:0), 32),
1115 //    imm8: imm8(7:0),
1116 //    is_literal_load: Rn  ==
1117 //            Pc,
1118 //    n: Rn,
1119 //    pattern: cccc110pudw1nnnndddd1010iiiiiiii,
1120 //    regs: imm8,
1121 //    rule: VLDM,
1122 //    safety: [P(24)=0 &&
1123 //         U(23)=0 &&
1124 //         W(21)=0 => DECODER_ERROR,
1125 //      P(24)=1 &&
1126 //         W(21)=0 => DECODER_ERROR,
1127 //      P  ==
1128 //            U &&
1129 //         W(21)=1 => UNDEFINED,
1130 //      n  ==
1131 //            Pc &&
1132 //         wback => UNPREDICTABLE,
1133 //      P(24)=0 &&
1134 //         U(23)=1 &&
1135 //         W(21)=1 &&
1136 //         Rn  ==
1137 //            Sp => DECODER_ERROR,
1138 //      regs  ==
1139 //            0 ||
1140 //         d + regs  >
1141 //            32 => UNPREDICTABLE],
1142 //    single_regs: true,
1143 //    small_imm_base_wb: wback,
1144 //    true: true,
1145 //    uses: {Rn},
1146 //    violations: [implied by 'base'],
1147 //    wback: W(21)=1}
1148 class VLDM_cccc110pudw1nnnndddd1010iiiiiiii_case_0
1149      : public ClassDecoder {
1150  public:
VLDM_cccc110pudw1nnnndddd1010iiiiiiii_case_0()1151   VLDM_cccc110pudw1nnnndddd1010iiiiiiii_case_0()
1152      : ClassDecoder() {}
1153   virtual Register base_address_register(Instruction i) const;
1154   virtual RegisterList defs(Instruction inst) const;
1155   virtual bool is_literal_load(Instruction i) const;
1156   virtual SafetyLevel safety(Instruction i) const;
1157   virtual bool base_address_register_writeback_small_immediate(
1158       Instruction i) const;
1159   virtual RegisterList uses(Instruction i) const;
1160   virtual ViolationSet get_violations(
1161       const nacl_arm_val::DecodedInstruction& first,
1162       const nacl_arm_val::DecodedInstruction& second,
1163       const nacl_arm_val::SfiValidator& sfi,
1164       nacl_arm_val::AddressSet* branches,
1165       nacl_arm_val::AddressSet* critical,
1166       uint32_t* next_inst_addr) const;
1167  private:
1168   NACL_DISALLOW_COPY_AND_ASSIGN(
1169       VLDM_cccc110pudw1nnnndddd1010iiiiiiii_case_0);
1170 };
1171 
1172 // VLDM_cccc110pudw1nnnndddd1011iiiiiiii_case_0:
1173 //
1174 //   {D: D(22),
1175 //    None: 32,
1176 //    P: P(24),
1177 //    Pc: 15,
1178 //    Rn: Rn(19:16),
1179 //    Sp: 13,
1180 //    U: U(23),
1181 //    Vd: Vd(15:12),
1182 //    W: W(21),
1183 //    add: U(23)=1,
1184 //    arch: ['VFPv2', 'AdvSIMD'],
1185 //    base: Rn,
1186 //    cond: cond(31:28),
1187 //    d: D:Vd,
1188 //    defs: {Rn
1189 //         if wback
1190 //         else None},
1191 //    false: false,
1192 //    fields: [cond(31:28),
1193 //      P(24),
1194 //      U(23),
1195 //      D(22),
1196 //      W(21),
1197 //      Rn(19:16),
1198 //      Vd(15:12),
1199 //      imm8(7:0)],
1200 //    imm32: ZeroExtend(imm8:'00'(1:0), 32),
1201 //    imm8: imm8(7:0),
1202 //    is_literal_load: Rn  ==
1203 //            Pc,
1204 //    n: Rn,
1205 //    pattern: cccc110pudw1nnnndddd1011iiiiiiii,
1206 //    regs: imm8 / 2,
1207 //    rule: VLDM,
1208 //    safety: [P(24)=0 &&
1209 //         U(23)=0 &&
1210 //         W(21)=0 => DECODER_ERROR,
1211 //      P(24)=1 &&
1212 //         W(21)=0 => DECODER_ERROR,
1213 //      P  ==
1214 //            U &&
1215 //         W(21)=1 => UNDEFINED,
1216 //      n  ==
1217 //            Pc &&
1218 //         wback => UNPREDICTABLE,
1219 //      P(24)=0 &&
1220 //         U(23)=1 &&
1221 //         W(21)=1 &&
1222 //         Rn  ==
1223 //            Sp => DECODER_ERROR,
1224 //      regs  ==
1225 //            0 ||
1226 //         regs  >
1227 //            16 ||
1228 //         d + regs  >
1229 //            32 => UNPREDICTABLE,
1230 //      VFPSmallRegisterBank() &&
1231 //         d + regs  >
1232 //            16 => UNPREDICTABLE,
1233 //      imm8(0)  ==
1234 //            1 => DEPRECATED],
1235 //    single_regs: false,
1236 //    small_imm_base_wb: wback,
1237 //    uses: {Rn},
1238 //    violations: [implied by 'base'],
1239 //    wback: W(21)=1}
1240 class VLDM_cccc110pudw1nnnndddd1011iiiiiiii_case_0
1241      : public ClassDecoder {
1242  public:
VLDM_cccc110pudw1nnnndddd1011iiiiiiii_case_0()1243   VLDM_cccc110pudw1nnnndddd1011iiiiiiii_case_0()
1244      : ClassDecoder() {}
1245   virtual Register base_address_register(Instruction i) const;
1246   virtual RegisterList defs(Instruction inst) const;
1247   virtual bool is_literal_load(Instruction i) const;
1248   virtual SafetyLevel safety(Instruction i) const;
1249   virtual bool base_address_register_writeback_small_immediate(
1250       Instruction i) const;
1251   virtual RegisterList uses(Instruction i) const;
1252   virtual ViolationSet get_violations(
1253       const nacl_arm_val::DecodedInstruction& first,
1254       const nacl_arm_val::DecodedInstruction& second,
1255       const nacl_arm_val::SfiValidator& sfi,
1256       nacl_arm_val::AddressSet* branches,
1257       nacl_arm_val::AddressSet* critical,
1258       uint32_t* next_inst_addr) const;
1259  private:
1260   NACL_DISALLOW_COPY_AND_ASSIGN(
1261       VLDM_cccc110pudw1nnnndddd1011iiiiiiii_case_0);
1262 };
1263 
1264 // VLDR_cccc1101ud01nnnndddd1010iiiiiiii_case_0:
1265 //
1266 //   {D: D(22),
1267 //    Pc: 15,
1268 //    Rn: Rn(19:16),
1269 //    U: U(23),
1270 //    Vd: Vd(15:12),
1271 //    add: U(23)=1,
1272 //    arch: VFPv2,
1273 //    base: Rn,
1274 //    cond: cond(31:28),
1275 //    d: D:Vd,
1276 //    defs: {},
1277 //    fields: [cond(31:28), U(23), D(22), Rn(19:16), Vd(15:12), imm8(7:0)],
1278 //    imm32: ZeroExtend(imm8:'00'(1:0), 32),
1279 //    imm8: imm8(7:0),
1280 //    is_literal_load: Rn  ==
1281 //            Pc,
1282 //    n: Rn,
1283 //    pattern: cccc1101ud01nnnndddd1010iiiiiiii,
1284 //    rule: VLDR,
1285 //    single_reg: true,
1286 //    true: true,
1287 //    uses: {Rn},
1288 //    violations: [implied by 'base']}
1289 class VLDR_cccc1101ud01nnnndddd1010iiiiiiii_case_0
1290      : public ClassDecoder {
1291  public:
VLDR_cccc1101ud01nnnndddd1010iiiiiiii_case_0()1292   VLDR_cccc1101ud01nnnndddd1010iiiiiiii_case_0()
1293      : ClassDecoder() {}
1294   virtual Register base_address_register(Instruction i) const;
1295   virtual RegisterList defs(Instruction inst) const;
1296   virtual bool is_literal_load(Instruction i) const;
1297   virtual SafetyLevel safety(Instruction i) const;
1298   virtual RegisterList uses(Instruction i) const;
1299   virtual ViolationSet get_violations(
1300       const nacl_arm_val::DecodedInstruction& first,
1301       const nacl_arm_val::DecodedInstruction& second,
1302       const nacl_arm_val::SfiValidator& sfi,
1303       nacl_arm_val::AddressSet* branches,
1304       nacl_arm_val::AddressSet* critical,
1305       uint32_t* next_inst_addr) const;
1306  private:
1307   NACL_DISALLOW_COPY_AND_ASSIGN(
1308       VLDR_cccc1101ud01nnnndddd1010iiiiiiii_case_0);
1309 };
1310 
1311 // VLDR_cccc1101ud01nnnndddd1011iiiiiiii_case_0:
1312 //
1313 //   {D: D(22),
1314 //    Pc: 15,
1315 //    Rn: Rn(19:16),
1316 //    U: U(23),
1317 //    Vd: Vd(15:12),
1318 //    add: U(23)=1,
1319 //    arch: ['VFPv2', 'AdvSIMD'],
1320 //    base: Rn,
1321 //    cond: cond(31:28),
1322 //    d: D:Vd,
1323 //    defs: {},
1324 //    false: false,
1325 //    fields: [cond(31:28), U(23), D(22), Rn(19:16), Vd(15:12), imm8(7:0)],
1326 //    imm32: ZeroExtend(imm8:'00'(1:0), 32),
1327 //    imm8: imm8(7:0),
1328 //    is_literal_load: Rn  ==
1329 //            Pc,
1330 //    n: Rn,
1331 //    pattern: cccc1101ud01nnnndddd1011iiiiiiii,
1332 //    rule: VLDR,
1333 //    single_reg: false,
1334 //    uses: {Rn},
1335 //    violations: [implied by 'base']}
1336 class VLDR_cccc1101ud01nnnndddd1011iiiiiiii_case_0
1337      : public ClassDecoder {
1338  public:
VLDR_cccc1101ud01nnnndddd1011iiiiiiii_case_0()1339   VLDR_cccc1101ud01nnnndddd1011iiiiiiii_case_0()
1340      : ClassDecoder() {}
1341   virtual Register base_address_register(Instruction i) const;
1342   virtual RegisterList defs(Instruction inst) const;
1343   virtual bool is_literal_load(Instruction i) const;
1344   virtual SafetyLevel safety(Instruction i) const;
1345   virtual RegisterList uses(Instruction i) const;
1346   virtual ViolationSet get_violations(
1347       const nacl_arm_val::DecodedInstruction& first,
1348       const nacl_arm_val::DecodedInstruction& second,
1349       const nacl_arm_val::SfiValidator& sfi,
1350       nacl_arm_val::AddressSet* branches,
1351       nacl_arm_val::AddressSet* critical,
1352       uint32_t* next_inst_addr) const;
1353  private:
1354   NACL_DISALLOW_COPY_AND_ASSIGN(
1355       VLDR_cccc1101ud01nnnndddd1011iiiiiiii_case_0);
1356 };
1357 
1358 // VMAX_1111001u0dssnnnndddd0110nqm0mmmm_case_0:
1359 //
1360 //   {D: D(22),
1361 //    M: M(5),
1362 //    N: N(7),
1363 //    Q: Q(6),
1364 //    U: U(24),
1365 //    Vd: Vd(15:12),
1366 //    Vm: Vm(3:0),
1367 //    Vn: Vn(19:16),
1368 //    arch: ASIMD,
1369 //    d: D:Vd,
1370 //    defs: {},
1371 //    elements: 64 / esize,
1372 //    esize: 8 << size,
1373 //    fields: [U(24),
1374 //      D(22),
1375 //      size(21:20),
1376 //      Vn(19:16),
1377 //      Vd(15:12),
1378 //      op(9),
1379 //      N(7),
1380 //      Q(6),
1381 //      M(5),
1382 //      Vm(3:0)],
1383 //    m: M:Vm,
1384 //    n: N:Vn,
1385 //    op: op(9),
1386 //    pattern: 1111001u0dssnnnndddd0110nqm0mmmm,
1387 //    regs: 1
1388 //         if Q(6)=0
1389 //         else 2,
1390 //    rule: VMAX,
1391 //    safety: [Q(6)=1 &&
1392 //         (Vd(0)=1 ||
1393 //         Vn(0)=1 ||
1394 //         Vm(0)=1) => UNDEFINED,
1395 //      size(21:20)=11 => UNDEFINED],
1396 //    size: size(21:20),
1397 //    unsigned: U(24)=1,
1398 //    uses: {}}
1399 class VMAX_1111001u0dssnnnndddd0110nqm0mmmm_case_0
1400      : public ClassDecoder {
1401  public:
VMAX_1111001u0dssnnnndddd0110nqm0mmmm_case_0()1402   VMAX_1111001u0dssnnnndddd0110nqm0mmmm_case_0()
1403      : ClassDecoder() {}
1404   virtual RegisterList defs(Instruction inst) const;
1405   virtual SafetyLevel safety(Instruction i) const;
1406   virtual RegisterList uses(Instruction i) const;
1407  private:
1408   NACL_DISALLOW_COPY_AND_ASSIGN(
1409       VMAX_1111001u0dssnnnndddd0110nqm0mmmm_case_0);
1410 };
1411 
1412 // VMAX_floating_point_111100100dssnnnndddd1111nqm0mmmm_case_0:
1413 //
1414 //   {D: D(22),
1415 //    M: M(5),
1416 //    N: N(7),
1417 //    Q: Q(6),
1418 //    U: U(24),
1419 //    Vd: Vd(15:12),
1420 //    Vm: Vm(3:0),
1421 //    Vn: Vn(19:16),
1422 //    arch: ASIMD,
1423 //    d: D:Vd,
1424 //    defs: {},
1425 //    elements: 2,
1426 //    esize: 32,
1427 //    fields: [U(24),
1428 //      D(22),
1429 //      size(21:20),
1430 //      Vn(19:16),
1431 //      Vd(15:12),
1432 //      op(9),
1433 //      N(7),
1434 //      Q(6),
1435 //      M(5),
1436 //      Vm(3:0)],
1437 //    m: M:Vm,
1438 //    n: N:Vn,
1439 //    op: op(9),
1440 //    op1_neg: size(1),
1441 //    pattern: 111100100dssnnnndddd1111nqm0mmmm,
1442 //    rule: VMAX_floating_point,
1443 //    safety: [Q(6)=1 &&
1444 //         (Vd(0)=1 ||
1445 //         Vn(0)=1 ||
1446 //         Vm(0)=1) => UNDEFINED,
1447 //      size(0)=1 => UNDEFINED],
1448 //    size: size(21:20),
1449 //    sz: size(0),
1450 //    uses: {}}
1451 class VMAX_floating_point_111100100dssnnnndddd1111nqm0mmmm_case_0
1452      : public ClassDecoder {
1453  public:
VMAX_floating_point_111100100dssnnnndddd1111nqm0mmmm_case_0()1454   VMAX_floating_point_111100100dssnnnndddd1111nqm0mmmm_case_0()
1455      : ClassDecoder() {}
1456   virtual RegisterList defs(Instruction inst) const;
1457   virtual SafetyLevel safety(Instruction i) const;
1458   virtual RegisterList uses(Instruction i) const;
1459  private:
1460   NACL_DISALLOW_COPY_AND_ASSIGN(
1461       VMAX_floating_point_111100100dssnnnndddd1111nqm0mmmm_case_0);
1462 };
1463 
1464 // VMIN_1111001u0dssnnnndddd0110nqm1mmmm_case_0:
1465 //
1466 //   {D: D(22),
1467 //    M: M(5),
1468 //    N: N(7),
1469 //    Q: Q(6),
1470 //    U: U(24),
1471 //    Vd: Vd(15:12),
1472 //    Vm: Vm(3:0),
1473 //    Vn: Vn(19:16),
1474 //    arch: ASIMD,
1475 //    d: D:Vd,
1476 //    defs: {},
1477 //    elements: 64 / esize,
1478 //    esize: 8 << size,
1479 //    fields: [U(24),
1480 //      D(22),
1481 //      size(21:20),
1482 //      Vn(19:16),
1483 //      Vd(15:12),
1484 //      op(9),
1485 //      N(7),
1486 //      Q(6),
1487 //      M(5),
1488 //      Vm(3:0)],
1489 //    m: M:Vm,
1490 //    n: N:Vn,
1491 //    op: op(9),
1492 //    pattern: 1111001u0dssnnnndddd0110nqm1mmmm,
1493 //    regs: 1
1494 //         if Q(6)=0
1495 //         else 2,
1496 //    rule: VMIN,
1497 //    safety: [Q(6)=1 &&
1498 //         (Vd(0)=1 ||
1499 //         Vn(0)=1 ||
1500 //         Vm(0)=1) => UNDEFINED,
1501 //      size(21:20)=11 => UNDEFINED],
1502 //    size: size(21:20),
1503 //    unsigned: U(24)=1,
1504 //    uses: {}}
1505 class VMIN_1111001u0dssnnnndddd0110nqm1mmmm_case_0
1506      : public ClassDecoder {
1507  public:
VMIN_1111001u0dssnnnndddd0110nqm1mmmm_case_0()1508   VMIN_1111001u0dssnnnndddd0110nqm1mmmm_case_0()
1509      : ClassDecoder() {}
1510   virtual RegisterList defs(Instruction inst) const;
1511   virtual SafetyLevel safety(Instruction i) const;
1512   virtual RegisterList uses(Instruction i) const;
1513  private:
1514   NACL_DISALLOW_COPY_AND_ASSIGN(
1515       VMIN_1111001u0dssnnnndddd0110nqm1mmmm_case_0);
1516 };
1517 
1518 // VMIN_floating_point_111100100dssnnnndddd1111nqm0mmmm_case_0:
1519 //
1520 //   {D: D(22),
1521 //    M: M(5),
1522 //    N: N(7),
1523 //    Q: Q(6),
1524 //    U: U(24),
1525 //    Vd: Vd(15:12),
1526 //    Vm: Vm(3:0),
1527 //    Vn: Vn(19:16),
1528 //    arch: ASIMD,
1529 //    d: D:Vd,
1530 //    defs: {},
1531 //    elements: 2,
1532 //    esize: 32,
1533 //    fields: [U(24),
1534 //      D(22),
1535 //      size(21:20),
1536 //      Vn(19:16),
1537 //      Vd(15:12),
1538 //      op(9),
1539 //      N(7),
1540 //      Q(6),
1541 //      M(5),
1542 //      Vm(3:0)],
1543 //    m: M:Vm,
1544 //    n: N:Vn,
1545 //    op: op(9),
1546 //    op1_neg: size(1),
1547 //    pattern: 111100100dssnnnndddd1111nqm0mmmm,
1548 //    rule: VMIN_floating_point,
1549 //    safety: [Q(6)=1 &&
1550 //         (Vd(0)=1 ||
1551 //         Vn(0)=1 ||
1552 //         Vm(0)=1) => UNDEFINED,
1553 //      size(0)=1 => UNDEFINED],
1554 //    size: size(21:20),
1555 //    sz: size(0),
1556 //    uses: {}}
1557 class VMIN_floating_point_111100100dssnnnndddd1111nqm0mmmm_case_0
1558      : public ClassDecoder {
1559  public:
VMIN_floating_point_111100100dssnnnndddd1111nqm0mmmm_case_0()1560   VMIN_floating_point_111100100dssnnnndddd1111nqm0mmmm_case_0()
1561      : ClassDecoder() {}
1562   virtual RegisterList defs(Instruction inst) const;
1563   virtual SafetyLevel safety(Instruction i) const;
1564   virtual RegisterList uses(Instruction i) const;
1565  private:
1566   NACL_DISALLOW_COPY_AND_ASSIGN(
1567       VMIN_floating_point_111100100dssnnnndddd1111nqm0mmmm_case_0);
1568 };
1569 
1570 // VMLAL_VMLSL_integer_A2_1111001u1dssnnnndddd10p0n0m0mmmm_case_0:
1571 //
1572 //   {D: D(22),
1573 //    M: M(5),
1574 //    N: N(7),
1575 //    U: U(24),
1576 //    Vd: Vd(15:12),
1577 //    Vm: Vm(3:0),
1578 //    Vn: Vn(19:16),
1579 //    d: D:Vd,
1580 //    defs: {},
1581 //    elements: 64 / esize,
1582 //    esize: 8 << size,
1583 //    fields: [U(24),
1584 //      D(22),
1585 //      size(21:20),
1586 //      Vn(19:16),
1587 //      Vd(15:12),
1588 //      op(8),
1589 //      N(7),
1590 //      M(5),
1591 //      Vm(3:0)],
1592 //    m: M:Vm,
1593 //    n: N:Vn,
1594 //    op: op(8),
1595 //    pattern: 1111001u1dssnnnndddd10p0n0m0mmmm,
1596 //    rule: VMLAL_VMLSL_integer_A2,
1597 //    safety: [size(21:20)=11 => DECODER_ERROR, Vd(0)=1 => UNDEFINED],
1598 //    size: size(21:20),
1599 //    unsigned: U(24)=1,
1600 //    uses: {}}
1601 class VMLAL_VMLSL_integer_A2_1111001u1dssnnnndddd10p0n0m0mmmm_case_0
1602      : public ClassDecoder {
1603  public:
VMLAL_VMLSL_integer_A2_1111001u1dssnnnndddd10p0n0m0mmmm_case_0()1604   VMLAL_VMLSL_integer_A2_1111001u1dssnnnndddd10p0n0m0mmmm_case_0()
1605      : ClassDecoder() {}
1606   virtual RegisterList defs(Instruction inst) const;
1607   virtual SafetyLevel safety(Instruction i) const;
1608   virtual RegisterList uses(Instruction i) const;
1609  private:
1610   NACL_DISALLOW_COPY_AND_ASSIGN(
1611       VMLAL_VMLSL_integer_A2_1111001u1dssnnnndddd10p0n0m0mmmm_case_0);
1612 };
1613 
1614 // VMLAL_by_scalar_A2_1111001u1dssnnnndddd0p10n1m0mmmm_case_0:
1615 //
1616 //   {D: D(22),
1617 //    F: F(8),
1618 //    M: M(5),
1619 //    N: N(7),
1620 //    Q: Q(24),
1621 //    Vd: Vd(15:12),
1622 //    Vm: Vm(3:0),
1623 //    Vn: Vn(19:16),
1624 //    arch: ASIMD,
1625 //    d: D:Vd,
1626 //    defs: {},
1627 //    elements: 64 / esize,
1628 //    esize: 8 << size,
1629 //    fields: [Q(24),
1630 //      D(22),
1631 //      size(21:20),
1632 //      Vn(19:16),
1633 //      Vd(15:12),
1634 //      op(10),
1635 //      F(8),
1636 //      N(7),
1637 //      M(5),
1638 //      Vm(3:0)],
1639 //    index: M:Vm(3)
1640 //         if size(21:20)=01
1641 //         else M,
1642 //    m: Vm(2:0)
1643 //         if size(21:20)=01
1644 //         else Vm,
1645 //    n: N:Vn,
1646 //    op: op(10),
1647 //    pattern: 1111001u1dssnnnndddd0p10n1m0mmmm,
1648 //    regs: 1,
1649 //    rule: VMLAL_by_scalar_A2,
1650 //    safety: [size(21:20)=11 => DECODER_ERROR,
1651 //      (size(21:20)=00 ||
1652 //         Vd(0)=1) => UNDEFINED],
1653 //    size: size(21:20),
1654 //    unsigned: Q(24)=1,
1655 //    uses: {}}
1656 class VMLAL_by_scalar_A2_1111001u1dssnnnndddd0p10n1m0mmmm_case_0
1657      : public ClassDecoder {
1658  public:
VMLAL_by_scalar_A2_1111001u1dssnnnndddd0p10n1m0mmmm_case_0()1659   VMLAL_by_scalar_A2_1111001u1dssnnnndddd0p10n1m0mmmm_case_0()
1660      : ClassDecoder() {}
1661   virtual RegisterList defs(Instruction inst) const;
1662   virtual SafetyLevel safety(Instruction i) const;
1663   virtual RegisterList uses(Instruction i) const;
1664  private:
1665   NACL_DISALLOW_COPY_AND_ASSIGN(
1666       VMLAL_by_scalar_A2_1111001u1dssnnnndddd0p10n1m0mmmm_case_0);
1667 };
1668 
1669 // VMLA_VMLS_floating_point_cccc11100d00nnnndddd101snom0mmmm_case_0:
1670 //
1671 //   {D: D(22),
1672 //    M: M(5),
1673 //    N: N(7),
1674 //    Vd: Vd(15:12),
1675 //    Vm: Vm(3:0),
1676 //    Vn: Vn(19:16),
1677 //    add: op(6)=0,
1678 //    advsimd: false,
1679 //    arch: VFPv2,
1680 //    cond: cond(31:28),
1681 //    d: D:Vd
1682 //         if dp_operation
1683 //         else Vd:D,
1684 //    defs: {},
1685 //    dp_operation: sz(8)=1,
1686 //    false: false,
1687 //    fields: [cond(31:28),
1688 //      D(22),
1689 //      Vn(19:16),
1690 //      Vd(15:12),
1691 //      sz(8),
1692 //      N(7),
1693 //      op(6),
1694 //      M(5),
1695 //      Vm(3:0)],
1696 //    m: M:Vm
1697 //         if dp_operation
1698 //         else Vm:M,
1699 //    n: N:Vn
1700 //         if dp_operation
1701 //         else Vn:N,
1702 //    op: op(6),
1703 //    pattern: cccc11100d00nnnndddd101snom0mmmm,
1704 //    rule: VMLA_VMLS_floating_point,
1705 //    safety: [cond(31:28)=1111 => DECODER_ERROR],
1706 //    sz: sz(8),
1707 //    uses: {}}
1708 class VMLA_VMLS_floating_point_cccc11100d00nnnndddd101snom0mmmm_case_0
1709      : public ClassDecoder {
1710  public:
VMLA_VMLS_floating_point_cccc11100d00nnnndddd101snom0mmmm_case_0()1711   VMLA_VMLS_floating_point_cccc11100d00nnnndddd101snom0mmmm_case_0()
1712      : ClassDecoder() {}
1713   virtual RegisterList defs(Instruction inst) const;
1714   virtual SafetyLevel safety(Instruction i) const;
1715   virtual RegisterList uses(Instruction i) const;
1716  private:
1717   NACL_DISALLOW_COPY_AND_ASSIGN(
1718       VMLA_VMLS_floating_point_cccc11100d00nnnndddd101snom0mmmm_case_0);
1719 };
1720 
1721 // VMLA_by_scalar_A1_1111001q1dssnnnndddd0p0fn1m0mmmm_case_0:
1722 //
1723 //   {D: D(22),
1724 //    F: F(8),
1725 //    M: M(5),
1726 //    N: N(7),
1727 //    Q: Q(24),
1728 //    Vd: Vd(15:12),
1729 //    Vm: Vm(3:0),
1730 //    Vn: Vn(19:16),
1731 //    arch: ASIMD,
1732 //    d: D:Vd,
1733 //    defs: {},
1734 //    elements: 64 / esize,
1735 //    esize: 8 << size,
1736 //    fields: [Q(24),
1737 //      D(22),
1738 //      size(21:20),
1739 //      Vn(19:16),
1740 //      Vd(15:12),
1741 //      op(10),
1742 //      F(8),
1743 //      N(7),
1744 //      M(5),
1745 //      Vm(3:0)],
1746 //    index: M,
1747 //    m: Vm,
1748 //    n: N:Vn,
1749 //    op: op(10),
1750 //    pattern: 1111001q1dssnnnndddd0p0fn1m0mmmm,
1751 //    regs: 1
1752 //         if Q(24)=0
1753 //         else 2,
1754 //    rule: VMLA_by_scalar_A1,
1755 //    safety: [size(21:20)=11 => DECODER_ERROR,
1756 //      (size(21:20)=00 ||
1757 //         size(21:20)=01) => UNDEFINED,
1758 //      Q(24)=1 &&
1759 //         (Vd(0)=1 ||
1760 //         Vn(0)=1) => UNDEFINED],
1761 //    size: size(21:20),
1762 //    uses: {}}
1763 class VMLA_by_scalar_A1_1111001q1dssnnnndddd0p0fn1m0mmmm_case_0
1764      : public ClassDecoder {
1765  public:
VMLA_by_scalar_A1_1111001q1dssnnnndddd0p0fn1m0mmmm_case_0()1766   VMLA_by_scalar_A1_1111001q1dssnnnndddd0p0fn1m0mmmm_case_0()
1767      : ClassDecoder() {}
1768   virtual RegisterList defs(Instruction inst) const;
1769   virtual SafetyLevel safety(Instruction i) const;
1770   virtual RegisterList uses(Instruction i) const;
1771  private:
1772   NACL_DISALLOW_COPY_AND_ASSIGN(
1773       VMLA_by_scalar_A1_1111001q1dssnnnndddd0p0fn1m0mmmm_case_0);
1774 };
1775 
1776 // VMLA_by_scalar_A1_1111001q1dssnnnndddd0p0fn1m0mmmm_case_1:
1777 //
1778 //   {D: D(22),
1779 //    F: F(8),
1780 //    M: M(5),
1781 //    N: N(7),
1782 //    Q: Q(24),
1783 //    Vd: Vd(15:12),
1784 //    Vm: Vm(3:0),
1785 //    Vn: Vn(19:16),
1786 //    arch: ASIMD,
1787 //    d: D:Vd,
1788 //    defs: {},
1789 //    elements: 64 / esize,
1790 //    esize: 8 << size,
1791 //    fields: [Q(24),
1792 //      D(22),
1793 //      size(21:20),
1794 //      Vn(19:16),
1795 //      Vd(15:12),
1796 //      op(10),
1797 //      F(8),
1798 //      N(7),
1799 //      M(5),
1800 //      Vm(3:0)],
1801 //    index: M:Vm(3)
1802 //         if size(21:20)=01
1803 //         else M,
1804 //    m: Vm(2:0)
1805 //         if size(21:20)=01
1806 //         else Vm,
1807 //    n: N:Vn,
1808 //    op: op(10),
1809 //    pattern: 1111001q1dssnnnndddd0p0fn1m0mmmm,
1810 //    regs: 1
1811 //         if Q(24)=0
1812 //         else 2,
1813 //    rule: VMLA_by_scalar_A1,
1814 //    safety: [size(21:20)=11 => DECODER_ERROR,
1815 //      size(21:20)=00 => UNDEFINED,
1816 //      Q(24)=1 &&
1817 //         (Vd(0)=1 ||
1818 //         Vn(0)=1) => UNDEFINED],
1819 //    size: size(21:20),
1820 //    uses: {}}
1821 class VMLA_by_scalar_A1_1111001q1dssnnnndddd0p0fn1m0mmmm_case_1
1822      : public ClassDecoder {
1823  public:
VMLA_by_scalar_A1_1111001q1dssnnnndddd0p0fn1m0mmmm_case_1()1824   VMLA_by_scalar_A1_1111001q1dssnnnndddd0p0fn1m0mmmm_case_1()
1825      : ClassDecoder() {}
1826   virtual RegisterList defs(Instruction inst) const;
1827   virtual SafetyLevel safety(Instruction i) const;
1828   virtual RegisterList uses(Instruction i) const;
1829  private:
1830   NACL_DISALLOW_COPY_AND_ASSIGN(
1831       VMLA_by_scalar_A1_1111001q1dssnnnndddd0p0fn1m0mmmm_case_1);
1832 };
1833 
1834 // VMLA_floating_point_A1_111100100dpsnnnndddd1101nqm1mmmm_case_0:
1835 //
1836 //   {D: D(22),
1837 //    M: M(5),
1838 //    N: N(7),
1839 //    Q: Q(6),
1840 //    U: U(24),
1841 //    Vd: Vd(15:12),
1842 //    Vm: Vm(3:0),
1843 //    Vn: Vn(19:16),
1844 //    arch: ASIMD,
1845 //    d: D:Vd,
1846 //    defs: {},
1847 //    elements: 2,
1848 //    esize: 32,
1849 //    fields: [U(24),
1850 //      D(22),
1851 //      size(21:20),
1852 //      Vn(19:16),
1853 //      Vd(15:12),
1854 //      op(9),
1855 //      N(7),
1856 //      Q(6),
1857 //      M(5),
1858 //      Vm(3:0)],
1859 //    m: M:Vm,
1860 //    n: N:Vn,
1861 //    op: op(9),
1862 //    op1_neg: size(1),
1863 //    pattern: 111100100dpsnnnndddd1101nqm1mmmm,
1864 //    rule: VMLA_floating_point_A1,
1865 //    safety: [Q(6)=1 &&
1866 //         (Vd(0)=1 ||
1867 //         Vn(0)=1 ||
1868 //         Vm(0)=1) => UNDEFINED,
1869 //      size(0)=1 => UNDEFINED],
1870 //    size: size(21:20),
1871 //    sz: size(0),
1872 //    uses: {}}
1873 class VMLA_floating_point_A1_111100100dpsnnnndddd1101nqm1mmmm_case_0
1874      : public ClassDecoder {
1875  public:
VMLA_floating_point_A1_111100100dpsnnnndddd1101nqm1mmmm_case_0()1876   VMLA_floating_point_A1_111100100dpsnnnndddd1101nqm1mmmm_case_0()
1877      : ClassDecoder() {}
1878   virtual RegisterList defs(Instruction inst) const;
1879   virtual SafetyLevel safety(Instruction i) const;
1880   virtual RegisterList uses(Instruction i) const;
1881  private:
1882   NACL_DISALLOW_COPY_AND_ASSIGN(
1883       VMLA_floating_point_A1_111100100dpsnnnndddd1101nqm1mmmm_case_0);
1884 };
1885 
1886 // VMLA_integer_A1_1111001u0dssnnnndddd1001nqm0mmmm_case_0:
1887 //
1888 //   {D: D(22),
1889 //    M: M(5),
1890 //    N: N(7),
1891 //    Q: Q(6),
1892 //    U: U(24),
1893 //    Vd: Vd(15:12),
1894 //    Vm: Vm(3:0),
1895 //    Vn: Vn(19:16),
1896 //    arch: ASIMD,
1897 //    d: D:Vd,
1898 //    defs: {},
1899 //    elements: 64 / esize,
1900 //    esize: 8 << size,
1901 //    fields: [U(24),
1902 //      D(22),
1903 //      size(21:20),
1904 //      Vn(19:16),
1905 //      Vd(15:12),
1906 //      op(9),
1907 //      N(7),
1908 //      Q(6),
1909 //      M(5),
1910 //      Vm(3:0)],
1911 //    m: M:Vm,
1912 //    n: N:Vn,
1913 //    op: op(9),
1914 //    pattern: 1111001u0dssnnnndddd1001nqm0mmmm,
1915 //    regs: 1
1916 //         if Q(6)=0
1917 //         else 2,
1918 //    rule: VMLA_integer_A1,
1919 //    safety: [Q(6)=1 &&
1920 //         (Vd(0)=1 ||
1921 //         Vn(0)=1 ||
1922 //         Vm(0)=1) => UNDEFINED,
1923 //      size(21:20)=11 => UNDEFINED],
1924 //    size: size(21:20),
1925 //    unsigned: U(24)=1,
1926 //    uses: {}}
1927 class VMLA_integer_A1_1111001u0dssnnnndddd1001nqm0mmmm_case_0
1928      : public ClassDecoder {
1929  public:
VMLA_integer_A1_1111001u0dssnnnndddd1001nqm0mmmm_case_0()1930   VMLA_integer_A1_1111001u0dssnnnndddd1001nqm0mmmm_case_0()
1931      : ClassDecoder() {}
1932   virtual RegisterList defs(Instruction inst) const;
1933   virtual SafetyLevel safety(Instruction i) const;
1934   virtual RegisterList uses(Instruction i) const;
1935  private:
1936   NACL_DISALLOW_COPY_AND_ASSIGN(
1937       VMLA_integer_A1_1111001u0dssnnnndddd1001nqm0mmmm_case_0);
1938 };
1939 
1940 // VMLSL_by_scalar_A2_1111001u1dssnnnndddd0p10n1m0mmmm_case_0:
1941 //
1942 //   {D: D(22),
1943 //    F: F(8),
1944 //    M: M(5),
1945 //    N: N(7),
1946 //    Q: Q(24),
1947 //    Vd: Vd(15:12),
1948 //    Vm: Vm(3:0),
1949 //    Vn: Vn(19:16),
1950 //    arch: ASIMD,
1951 //    d: D:Vd,
1952 //    defs: {},
1953 //    elements: 64 / esize,
1954 //    esize: 8 << size,
1955 //    fields: [Q(24),
1956 //      D(22),
1957 //      size(21:20),
1958 //      Vn(19:16),
1959 //      Vd(15:12),
1960 //      op(10),
1961 //      F(8),
1962 //      N(7),
1963 //      M(5),
1964 //      Vm(3:0)],
1965 //    index: M:Vm(3)
1966 //         if size(21:20)=01
1967 //         else M,
1968 //    m: Vm(2:0)
1969 //         if size(21:20)=01
1970 //         else Vm,
1971 //    n: N:Vn,
1972 //    op: op(10),
1973 //    pattern: 1111001u1dssnnnndddd0p10n1m0mmmm,
1974 //    regs: 1,
1975 //    rule: VMLSL_by_scalar_A2,
1976 //    safety: [size(21:20)=11 => DECODER_ERROR,
1977 //      (size(21:20)=00 ||
1978 //         Vd(0)=1) => UNDEFINED],
1979 //    size: size(21:20),
1980 //    unsigned: Q(24)=1,
1981 //    uses: {}}
1982 class VMLSL_by_scalar_A2_1111001u1dssnnnndddd0p10n1m0mmmm_case_0
1983      : public ClassDecoder {
1984  public:
VMLSL_by_scalar_A2_1111001u1dssnnnndddd0p10n1m0mmmm_case_0()1985   VMLSL_by_scalar_A2_1111001u1dssnnnndddd0p10n1m0mmmm_case_0()
1986      : ClassDecoder() {}
1987   virtual RegisterList defs(Instruction inst) const;
1988   virtual SafetyLevel safety(Instruction i) const;
1989   virtual RegisterList uses(Instruction i) const;
1990  private:
1991   NACL_DISALLOW_COPY_AND_ASSIGN(
1992       VMLSL_by_scalar_A2_1111001u1dssnnnndddd0p10n1m0mmmm_case_0);
1993 };
1994 
1995 // VMLS_by_scalar_A1_1111001q1dssnnnndddd0p0fn1m0mmmm_case_0:
1996 //
1997 //   {D: D(22),
1998 //    F: F(8),
1999 //    M: M(5),
2000 //    N: N(7),
2001 //    Q: Q(24),
2002 //    Vd: Vd(15:12),
2003 //    Vm: Vm(3:0),
2004 //    Vn: Vn(19:16),
2005 //    arch: ASIMD,
2006 //    d: D:Vd,
2007 //    defs: {},
2008 //    elements: 64 / esize,
2009 //    esize: 8 << size,
2010 //    fields: [Q(24),
2011 //      D(22),
2012 //      size(21:20),
2013 //      Vn(19:16),
2014 //      Vd(15:12),
2015 //      op(10),
2016 //      F(8),
2017 //      N(7),
2018 //      M(5),
2019 //      Vm(3:0)],
2020 //    index: M,
2021 //    m: Vm,
2022 //    n: N:Vn,
2023 //    op: op(10),
2024 //    pattern: 1111001q1dssnnnndddd0p0fn1m0mmmm,
2025 //    regs: 1
2026 //         if Q(24)=0
2027 //         else 2,
2028 //    rule: VMLS_by_scalar_A1,
2029 //    safety: [size(21:20)=11 => DECODER_ERROR,
2030 //      (size(21:20)=00 ||
2031 //         size(21:20)=01) => UNDEFINED,
2032 //      Q(24)=1 &&
2033 //         (Vd(0)=1 ||
2034 //         Vn(0)=1) => UNDEFINED],
2035 //    size: size(21:20),
2036 //    uses: {}}
2037 class VMLS_by_scalar_A1_1111001q1dssnnnndddd0p0fn1m0mmmm_case_0
2038      : public ClassDecoder {
2039  public:
VMLS_by_scalar_A1_1111001q1dssnnnndddd0p0fn1m0mmmm_case_0()2040   VMLS_by_scalar_A1_1111001q1dssnnnndddd0p0fn1m0mmmm_case_0()
2041      : ClassDecoder() {}
2042   virtual RegisterList defs(Instruction inst) const;
2043   virtual SafetyLevel safety(Instruction i) const;
2044   virtual RegisterList uses(Instruction i) const;
2045  private:
2046   NACL_DISALLOW_COPY_AND_ASSIGN(
2047       VMLS_by_scalar_A1_1111001q1dssnnnndddd0p0fn1m0mmmm_case_0);
2048 };
2049 
2050 // VMLS_by_scalar_A1_1111001q1dssnnnndddd0p0fn1m0mmmm_case_1:
2051 //
2052 //   {D: D(22),
2053 //    F: F(8),
2054 //    M: M(5),
2055 //    N: N(7),
2056 //    Q: Q(24),
2057 //    Vd: Vd(15:12),
2058 //    Vm: Vm(3:0),
2059 //    Vn: Vn(19:16),
2060 //    arch: ASIMD,
2061 //    d: D:Vd,
2062 //    defs: {},
2063 //    elements: 64 / esize,
2064 //    esize: 8 << size,
2065 //    fields: [Q(24),
2066 //      D(22),
2067 //      size(21:20),
2068 //      Vn(19:16),
2069 //      Vd(15:12),
2070 //      op(10),
2071 //      F(8),
2072 //      N(7),
2073 //      M(5),
2074 //      Vm(3:0)],
2075 //    index: M:Vm(3)
2076 //         if size(21:20)=01
2077 //         else M,
2078 //    m: Vm(2:0)
2079 //         if size(21:20)=01
2080 //         else Vm,
2081 //    n: N:Vn,
2082 //    op: op(10),
2083 //    pattern: 1111001q1dssnnnndddd0p0fn1m0mmmm,
2084 //    regs: 1
2085 //         if Q(24)=0
2086 //         else 2,
2087 //    rule: VMLS_by_scalar_A1,
2088 //    safety: [size(21:20)=11 => DECODER_ERROR,
2089 //      size(21:20)=00 => UNDEFINED,
2090 //      Q(24)=1 &&
2091 //         (Vd(0)=1 ||
2092 //         Vn(0)=1) => UNDEFINED],
2093 //    size: size(21:20),
2094 //    uses: {}}
2095 class VMLS_by_scalar_A1_1111001q1dssnnnndddd0p0fn1m0mmmm_case_1
2096      : public ClassDecoder {
2097  public:
VMLS_by_scalar_A1_1111001q1dssnnnndddd0p0fn1m0mmmm_case_1()2098   VMLS_by_scalar_A1_1111001q1dssnnnndddd0p0fn1m0mmmm_case_1()
2099      : ClassDecoder() {}
2100   virtual RegisterList defs(Instruction inst) const;
2101   virtual SafetyLevel safety(Instruction i) const;
2102   virtual RegisterList uses(Instruction i) const;
2103  private:
2104   NACL_DISALLOW_COPY_AND_ASSIGN(
2105       VMLS_by_scalar_A1_1111001q1dssnnnndddd0p0fn1m0mmmm_case_1);
2106 };
2107 
2108 // VMLS_floating_point_A1_111100100dpsnnnndddd1101nqm1mmmm_case_0:
2109 //
2110 //   {D: D(22),
2111 //    M: M(5),
2112 //    N: N(7),
2113 //    Q: Q(6),
2114 //    U: U(24),
2115 //    Vd: Vd(15:12),
2116 //    Vm: Vm(3:0),
2117 //    Vn: Vn(19:16),
2118 //    arch: ASIMD,
2119 //    d: D:Vd,
2120 //    defs: {},
2121 //    elements: 2,
2122 //    esize: 32,
2123 //    fields: [U(24),
2124 //      D(22),
2125 //      size(21:20),
2126 //      Vn(19:16),
2127 //      Vd(15:12),
2128 //      op(9),
2129 //      N(7),
2130 //      Q(6),
2131 //      M(5),
2132 //      Vm(3:0)],
2133 //    m: M:Vm,
2134 //    n: N:Vn,
2135 //    op: op(9),
2136 //    op1_neg: size(1),
2137 //    pattern: 111100100dpsnnnndddd1101nqm1mmmm,
2138 //    rule: VMLS_floating_point_A1,
2139 //    safety: [Q(6)=1 &&
2140 //         (Vd(0)=1 ||
2141 //         Vn(0)=1 ||
2142 //         Vm(0)=1) => UNDEFINED,
2143 //      size(0)=1 => UNDEFINED],
2144 //    size: size(21:20),
2145 //    sz: size(0),
2146 //    uses: {}}
2147 class VMLS_floating_point_A1_111100100dpsnnnndddd1101nqm1mmmm_case_0
2148      : public ClassDecoder {
2149  public:
VMLS_floating_point_A1_111100100dpsnnnndddd1101nqm1mmmm_case_0()2150   VMLS_floating_point_A1_111100100dpsnnnndddd1101nqm1mmmm_case_0()
2151      : ClassDecoder() {}
2152   virtual RegisterList defs(Instruction inst) const;
2153   virtual SafetyLevel safety(Instruction i) const;
2154   virtual RegisterList uses(Instruction i) const;
2155  private:
2156   NACL_DISALLOW_COPY_AND_ASSIGN(
2157       VMLS_floating_point_A1_111100100dpsnnnndddd1101nqm1mmmm_case_0);
2158 };
2159 
2160 // VMLS_integer_A1_1111001u0dssnnnndddd1001nqm0mmmm_case_0:
2161 //
2162 //   {D: D(22),
2163 //    M: M(5),
2164 //    N: N(7),
2165 //    Q: Q(6),
2166 //    U: U(24),
2167 //    Vd: Vd(15:12),
2168 //    Vm: Vm(3:0),
2169 //    Vn: Vn(19:16),
2170 //    arch: ASIMD,
2171 //    d: D:Vd,
2172 //    defs: {},
2173 //    elements: 64 / esize,
2174 //    esize: 8 << size,
2175 //    fields: [U(24),
2176 //      D(22),
2177 //      size(21:20),
2178 //      Vn(19:16),
2179 //      Vd(15:12),
2180 //      op(9),
2181 //      N(7),
2182 //      Q(6),
2183 //      M(5),
2184 //      Vm(3:0)],
2185 //    m: M:Vm,
2186 //    n: N:Vn,
2187 //    op: op(9),
2188 //    pattern: 1111001u0dssnnnndddd1001nqm0mmmm,
2189 //    regs: 1
2190 //         if Q(6)=0
2191 //         else 2,
2192 //    rule: VMLS_integer_A1,
2193 //    safety: [Q(6)=1 &&
2194 //         (Vd(0)=1 ||
2195 //         Vn(0)=1 ||
2196 //         Vm(0)=1) => UNDEFINED,
2197 //      size(21:20)=11 => UNDEFINED],
2198 //    size: size(21:20),
2199 //    unsigned: U(24)=1,
2200 //    uses: {}}
2201 class VMLS_integer_A1_1111001u0dssnnnndddd1001nqm0mmmm_case_0
2202      : public ClassDecoder {
2203  public:
VMLS_integer_A1_1111001u0dssnnnndddd1001nqm0mmmm_case_0()2204   VMLS_integer_A1_1111001u0dssnnnndddd1001nqm0mmmm_case_0()
2205      : ClassDecoder() {}
2206   virtual RegisterList defs(Instruction inst) const;
2207   virtual SafetyLevel safety(Instruction i) const;
2208   virtual RegisterList uses(Instruction i) const;
2209  private:
2210   NACL_DISALLOW_COPY_AND_ASSIGN(
2211       VMLS_integer_A1_1111001u0dssnnnndddd1001nqm0mmmm_case_0);
2212 };
2213 
2214 // VMOVN_111100111d11ss10dddd001000m0mmmm_case_0:
2215 //
2216 //   {D: D(22),
2217 //    F: F(10),
2218 //    M: M(5),
2219 //    Q: Q(6),
2220 //    Vd: Vd(15:12),
2221 //    Vm: Vm(3:0),
2222 //    arch: ASIMD,
2223 //    d: D:Vd,
2224 //    defs: {},
2225 //    elements: 64 / esize,
2226 //    esize: 8 << size,
2227 //    fields: [D(22),
2228 //      size(19:18),
2229 //      Vd(15:12),
2230 //      F(10),
2231 //      op(8:7),
2232 //      Q(6),
2233 //      M(5),
2234 //      Vm(3:0)],
2235 //    m: M:Vm,
2236 //    op: op(8:7),
2237 //    pattern: 111100111d11ss10dddd001000m0mmmm,
2238 //    regs: 1
2239 //         if Q(6)=0
2240 //         else 2,
2241 //    rule: VMOVN,
2242 //    safety: [size(19:18)=11 => UNDEFINED, Vm(0)=1 => UNDEFINED],
2243 //    size: size(19:18),
2244 //    uses: {}}
2245 class VMOVN_111100111d11ss10dddd001000m0mmmm_case_0
2246      : public ClassDecoder {
2247  public:
VMOVN_111100111d11ss10dddd001000m0mmmm_case_0()2248   VMOVN_111100111d11ss10dddd001000m0mmmm_case_0()
2249      : ClassDecoder() {}
2250   virtual RegisterList defs(Instruction inst) const;
2251   virtual SafetyLevel safety(Instruction i) const;
2252   virtual RegisterList uses(Instruction i) const;
2253  private:
2254   NACL_DISALLOW_COPY_AND_ASSIGN(
2255       VMOVN_111100111d11ss10dddd001000m0mmmm_case_0);
2256 };
2257 
2258 // VMOV_ARM_core_register_to_scalar_cccc11100ii0ddddtttt1011dii10000_case_0:
2259 //
2260 //   {D: D(7),
2261 //    Pc: 15,
2262 //    Rt: Rt(15:12),
2263 //    Vd: Vd(19:16),
2264 //    advsimd: sel in bitset {'1xxx', '0xx1'},
2265 //    arch: ['VFPv2', 'AdvSIMD'],
2266 //    cond: cond(31:28),
2267 //    d: D:Vd,
2268 //    defs: {},
2269 //    esize: 8
2270 //         if opc1:opc2(3:0)=1xxx
2271 //         else 16
2272 //         if opc1:opc2(3:0)=0xx1
2273 //         else 32
2274 //         if opc1:opc2(3:0)=0x00
2275 //         else 0,
2276 //    fields: [cond(31:28),
2277 //      opc1(22:21),
2278 //      Vd(19:16),
2279 //      Rt(15:12),
2280 //      D(7),
2281 //      opc2(6:5)],
2282 //    index: opc1(0):opc2
2283 //         if opc1:opc2(3:0)=1xxx
2284 //         else opc1(0):opc2(1)
2285 //         if opc1:opc2(3:0)=0xx1
2286 //         else opc1(0)
2287 //         if opc1:opc2(3:0)=0x00
2288 //         else 0,
2289 //    opc1: opc1(22:21),
2290 //    opc2: opc2(6:5),
2291 //    pattern: cccc11100ii0ddddtttt1011dii10000,
2292 //    rule: VMOV_ARM_core_register_to_scalar,
2293 //    safety: [opc1:opc2(3:0)=0x10 => UNDEFINED,
2294 //      t  ==
2295 //            Pc => UNPREDICTABLE],
2296 //    sel: opc1:opc2,
2297 //    t: Rt,
2298 //    uses: {Rt}}
2299 class VMOV_ARM_core_register_to_scalar_cccc11100ii0ddddtttt1011dii10000_case_0
2300      : public ClassDecoder {
2301  public:
VMOV_ARM_core_register_to_scalar_cccc11100ii0ddddtttt1011dii10000_case_0()2302   VMOV_ARM_core_register_to_scalar_cccc11100ii0ddddtttt1011dii10000_case_0()
2303      : ClassDecoder() {}
2304   virtual RegisterList defs(Instruction inst) const;
2305   virtual SafetyLevel safety(Instruction i) const;
2306   virtual RegisterList uses(Instruction i) const;
2307  private:
2308   NACL_DISALLOW_COPY_AND_ASSIGN(
2309       VMOV_ARM_core_register_to_scalar_cccc11100ii0ddddtttt1011dii10000_case_0);
2310 };
2311 
2312 // VMOV_between_ARM_core_register_and_single_precision_register_cccc1110000onnnntttt1010n0010000_case_0:
2313 //
2314 //   {N: N(7),
2315 //    None: 32,
2316 //    Pc: 15,
2317 //    Rt: Rt(15:12),
2318 //    Vn: Vn(19:16),
2319 //    arch: VFPv2,
2320 //    cond: cond(31:28),
2321 //    defs: {Rt
2322 //         if to_arm_register
2323 //         else None},
2324 //    fields: [cond(31:28), op(20), Vn(19:16), Rt(15:12), N(7)],
2325 //    n: Vn:N,
2326 //    op: op(20),
2327 //    pattern: cccc1110000onnnntttt1010n0010000,
2328 //    rule: VMOV_between_ARM_core_register_and_single_precision_register,
2329 //    safety: [t  ==
2330 //            Pc => UNPREDICTABLE],
2331 //    t: Rt,
2332 //    to_arm_register: op(20)=1,
2333 //    uses: {Rt
2334 //         if not to_arm_register
2335 //         else None}}
2336 class VMOV_between_ARM_core_register_and_single_precision_register_cccc1110000onnnntttt1010n0010000_case_0
2337      : public ClassDecoder {
2338  public:
VMOV_between_ARM_core_register_and_single_precision_register_cccc1110000onnnntttt1010n0010000_case_0()2339   VMOV_between_ARM_core_register_and_single_precision_register_cccc1110000onnnntttt1010n0010000_case_0()
2340      : ClassDecoder() {}
2341   virtual RegisterList defs(Instruction inst) const;
2342   virtual SafetyLevel safety(Instruction i) const;
2343   virtual RegisterList uses(Instruction i) const;
2344  private:
2345   NACL_DISALLOW_COPY_AND_ASSIGN(
2346       VMOV_between_ARM_core_register_and_single_precision_register_cccc1110000onnnntttt1010n0010000_case_0);
2347 };
2348 
2349 // VMOV_between_ARM_core_register_and_single_precision_register_cccc1110000xnnnntttt1010n0010000_case_0:
2350 //
2351 //   {N: N(7),
2352 //    None: 32,
2353 //    Pc: 15,
2354 //    Rt: Rt(15:12),
2355 //    Vn: Vn(19:16),
2356 //    arch: VFPv2,
2357 //    cond: cond(31:28),
2358 //    defs: {Rt
2359 //         if to_arm_register
2360 //         else None},
2361 //    fields: [cond(31:28), op(20), Vn(19:16), Rt(15:12), N(7)],
2362 //    n: Vn:N,
2363 //    op: op(20),
2364 //    pattern: cccc1110000xnnnntttt1010n0010000,
2365 //    rule: VMOV_between_ARM_core_register_and_single_precision_register,
2366 //    safety: [t  ==
2367 //            Pc => UNPREDICTABLE],
2368 //    t: Rt,
2369 //    to_arm_register: op(20)=1,
2370 //    uses: {Rt
2371 //         if not to_arm_register
2372 //         else None}}
2373 class VMOV_between_ARM_core_register_and_single_precision_register_cccc1110000xnnnntttt1010n0010000_case_0
2374      : public ClassDecoder {
2375  public:
VMOV_between_ARM_core_register_and_single_precision_register_cccc1110000xnnnntttt1010n0010000_case_0()2376   VMOV_between_ARM_core_register_and_single_precision_register_cccc1110000xnnnntttt1010n0010000_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       VMOV_between_ARM_core_register_and_single_precision_register_cccc1110000xnnnntttt1010n0010000_case_0);
2384 };
2385 
2386 // VMOV_between_two_ARM_core_registers_and_a_doubleword_extension_register_cccc1100010otttttttt101100m1mmmm_case_0:
2387 //
2388 //   {M: M(5),
2389 //    Pc: 15,
2390 //    Rt: Rt(15:12),
2391 //    Rt2: Rt2(19:16),
2392 //    Vm: Vm(3:0),
2393 //    arch: ['VFPv2', 'AdvSIMD'],
2394 //    cond: cond(31:28),
2395 //    defs: {Rt, Rt2}
2396 //         if to_arm_registers
2397 //         else {},
2398 //    fields: [cond(31:28), op(20), Rt2(19:16), Rt(15:12), M(5), Vm(3:0)],
2399 //    m: M:Vm,
2400 //    op: op(20),
2401 //    pattern: cccc1100010otttttttt101100m1mmmm,
2402 //    rule: VMOV_between_two_ARM_core_registers_and_a_doubleword_extension_register,
2403 //    safety: [Pc in {t, t2} => UNPREDICTABLE,
2404 //      to_arm_registers &&
2405 //         t  ==
2406 //            t2 => UNPREDICTABLE],
2407 //    t: Rt,
2408 //    t2: Rt2,
2409 //    to_arm_registers: op(20)=1,
2410 //    uses: {}
2411 //         if to_arm_registers
2412 //         else {Rt, Rt2}}
2413 class VMOV_between_two_ARM_core_registers_and_a_doubleword_extension_register_cccc1100010otttttttt101100m1mmmm_case_0
2414      : public ClassDecoder {
2415  public:
VMOV_between_two_ARM_core_registers_and_a_doubleword_extension_register_cccc1100010otttttttt101100m1mmmm_case_0()2416   VMOV_between_two_ARM_core_registers_and_a_doubleword_extension_register_cccc1100010otttttttt101100m1mmmm_case_0()
2417      : ClassDecoder() {}
2418   virtual RegisterList defs(Instruction inst) const;
2419   virtual SafetyLevel safety(Instruction i) const;
2420   virtual RegisterList uses(Instruction i) const;
2421  private:
2422   NACL_DISALLOW_COPY_AND_ASSIGN(
2423       VMOV_between_two_ARM_core_registers_and_a_doubleword_extension_register_cccc1100010otttttttt101100m1mmmm_case_0);
2424 };
2425 
2426 // VMOV_between_two_ARM_core_registers_and_two_single_precision_registers_cccc1100010otttttttt101000m1mmmm_case_0:
2427 //
2428 //   {M: M(5),
2429 //    Pc: 15,
2430 //    Rt: Rt(15:12),
2431 //    Rt2: Rt2(19:16),
2432 //    Vm: Vm(3:0),
2433 //    arch: ['VFPv2'],
2434 //    cond: cond(31:28),
2435 //    defs: {Rt, Rt2}
2436 //         if to_arm_registers
2437 //         else {},
2438 //    fields: [cond(31:28), op(20), Rt2(19:16), Rt(15:12), M(5), Vm(3:0)],
2439 //    m: Vm:M,
2440 //    op: op(20),
2441 //    pattern: cccc1100010otttttttt101000m1mmmm,
2442 //    rule: VMOV_between_two_ARM_core_registers_and_two_single_precision_registers,
2443 //    safety: [Pc in {t, t2} ||
2444 //         m  ==
2445 //            31 => UNPREDICTABLE,
2446 //      to_arm_registers &&
2447 //         t  ==
2448 //            t2 => UNPREDICTABLE],
2449 //    t: Rt,
2450 //    t2: Rt2,
2451 //    to_arm_registers: op(20)=1,
2452 //    uses: {}
2453 //         if to_arm_registers
2454 //         else {Rt, Rt2}}
2455 class VMOV_between_two_ARM_core_registers_and_two_single_precision_registers_cccc1100010otttttttt101000m1mmmm_case_0
2456      : public ClassDecoder {
2457  public:
VMOV_between_two_ARM_core_registers_and_two_single_precision_registers_cccc1100010otttttttt101000m1mmmm_case_0()2458   VMOV_between_two_ARM_core_registers_and_two_single_precision_registers_cccc1100010otttttttt101000m1mmmm_case_0()
2459      : ClassDecoder() {}
2460   virtual RegisterList defs(Instruction inst) const;
2461   virtual SafetyLevel safety(Instruction i) const;
2462   virtual RegisterList uses(Instruction i) const;
2463  private:
2464   NACL_DISALLOW_COPY_AND_ASSIGN(
2465       VMOV_between_two_ARM_core_registers_and_two_single_precision_registers_cccc1100010otttttttt101000m1mmmm_case_0);
2466 };
2467 
2468 // VMOV_immediate_A1_1111001m1d000mmmddddcccc0qp1mmmm_case_0:
2469 //
2470 //   {D: D(22),
2471 //    Q: Q(6),
2472 //    Vd: Vd(15:12),
2473 //    arch: ASIMD,
2474 //    cmode: cmode(11:8),
2475 //    d: D:Vd,
2476 //    defs: {},
2477 //    false: false,
2478 //    fields: [i(24),
2479 //      D(22),
2480 //      imm3(18:16),
2481 //      Vd(15:12),
2482 //      cmode(11:8),
2483 //      Q(6),
2484 //      op(5),
2485 //      imm4(3:0)],
2486 //    i: i(24),
2487 //    imm3: imm3(18:16),
2488 //    imm4: imm4(3:0),
2489 //    imm64: AdvSIMDExpandImm(op, cmode, i:imm3:imm4),
2490 //    op: op(5),
2491 //    pattern: 1111001m1d000mmmddddcccc0qp1mmmm,
2492 //    regs: 1
2493 //         if Q(6)=0
2494 //         else 2,
2495 //    rule: VMOV_immediate_A1,
2496 //    safety: [op(5)=0 &&
2497 //         cmode(0)=1 &&
2498 //         cmode(3:2)=~11 => DECODER_ERROR,
2499 //      op(5)=1 &&
2500 //         cmode(11:8)=~1110 => DECODER_ERROR,
2501 //      Q(6)=1 &&
2502 //         Vd(0)=1 => UNDEFINED],
2503 //    single_register: false,
2504 //    uses: {}}
2505 class VMOV_immediate_A1_1111001m1d000mmmddddcccc0qp1mmmm_case_0
2506      : public ClassDecoder {
2507  public:
VMOV_immediate_A1_1111001m1d000mmmddddcccc0qp1mmmm_case_0()2508   VMOV_immediate_A1_1111001m1d000mmmddddcccc0qp1mmmm_case_0()
2509      : ClassDecoder() {}
2510   virtual RegisterList defs(Instruction inst) const;
2511   virtual SafetyLevel safety(Instruction i) const;
2512   virtual RegisterList uses(Instruction i) const;
2513  private:
2514   NACL_DISALLOW_COPY_AND_ASSIGN(
2515       VMOV_immediate_A1_1111001m1d000mmmddddcccc0qp1mmmm_case_0);
2516 };
2517 
2518 // VMOV_immediate_cccc11101d11iiiidddd101s0000iiii_case_0:
2519 //
2520 //   {D: D(22),
2521 //    Vd: Vd(15:12),
2522 //    advsimd: false,
2523 //    arch: VFPv3,
2524 //    cond: cond(31:28),
2525 //    d: Vd:D
2526 //         if sz(8)=0
2527 //         else D:Vd,
2528 //    defs: {},
2529 //    false: false,
2530 //    fields: [cond(31:28),
2531 //      D(22),
2532 //      imm4H(19:16),
2533 //      Vd(15:12),
2534 //      sz(8),
2535 //      imm4L(3:0)],
2536 //    imm32: VFPExpandImm(imm4H:imm4L, 32),
2537 //    imm4H: imm4H(19:16),
2538 //    imm4L: imm4L(3:0),
2539 //    imm64: VFPExpandImm(imm4H:imm4L, 64),
2540 //    pattern: cccc11101d11iiiidddd101s0000iiii,
2541 //    regs: 1,
2542 //    rule: VMOV_immediate,
2543 //    safety: [true => MAY_BE_SAFE],
2544 //    single_register: sz(8)=0,
2545 //    sz: sz(8),
2546 //    true: true,
2547 //    uses: {}}
2548 class VMOV_immediate_cccc11101d11iiiidddd101s0000iiii_case_0
2549      : public ClassDecoder {
2550  public:
VMOV_immediate_cccc11101d11iiiidddd101s0000iiii_case_0()2551   VMOV_immediate_cccc11101d11iiiidddd101s0000iiii_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       VMOV_immediate_cccc11101d11iiiidddd101s0000iiii_case_0);
2559 };
2560 
2561 // VMOV_register_cccc11101d110000dddd101s01m0mmmm_case_0:
2562 //
2563 //   {D: D(22),
2564 //    M: M(5),
2565 //    Vd: Vd(15:12),
2566 //    Vm: Vm(3:0),
2567 //    advsimd: false,
2568 //    arch: VFPv2,
2569 //    cond: cond(31:28),
2570 //    d: Vd:D
2571 //         if sz(8)=0
2572 //         else D:Vd,
2573 //    defs: {},
2574 //    false: false,
2575 //    fields: [cond(31:28), D(22), Vd(15:12), sz(8), M(5), Vm(3:0)],
2576 //    m: Vm:D
2577 //         if sz(8)=0
2578 //         else M:Vm,
2579 //    pattern: cccc11101d110000dddd101s01m0mmmm,
2580 //    regs: 1,
2581 //    rule: VMOV_register,
2582 //    safety: [true => MAY_BE_SAFE],
2583 //    single_register: sz(8)=0,
2584 //    sz: sz(8),
2585 //    true: true,
2586 //    uses: {}}
2587 class VMOV_register_cccc11101d110000dddd101s01m0mmmm_case_0
2588      : public ClassDecoder {
2589  public:
VMOV_register_cccc11101d110000dddd101s01m0mmmm_case_0()2590   VMOV_register_cccc11101d110000dddd101s01m0mmmm_case_0()
2591      : ClassDecoder() {}
2592   virtual RegisterList defs(Instruction inst) const;
2593   virtual SafetyLevel safety(Instruction i) const;
2594   virtual RegisterList uses(Instruction i) const;
2595  private:
2596   NACL_DISALLOW_COPY_AND_ASSIGN(
2597       VMOV_register_cccc11101d110000dddd101s01m0mmmm_case_0);
2598 };
2599 
2600 // VMRS_cccc111011110001tttt101000010000_case_0:
2601 //
2602 //   {NZCV: 16,
2603 //    Pc: 15,
2604 //    Rt: Rt(15:12),
2605 //    arch: ['VFPv2', 'AdvSIMD'],
2606 //    cond: cond(31:28),
2607 //    defs: {NZCV
2608 //         if t  ==
2609 //            Pc
2610 //         else Rt},
2611 //    fields: [cond(31:28), Rt(15:12)],
2612 //    pattern: cccc111011110001tttt101000010000,
2613 //    rule: VMRS,
2614 //    t: Rt}
2615 class VMRS_cccc111011110001tttt101000010000_case_0
2616      : public ClassDecoder {
2617  public:
VMRS_cccc111011110001tttt101000010000_case_0()2618   VMRS_cccc111011110001tttt101000010000_case_0()
2619      : ClassDecoder() {}
2620   virtual RegisterList defs(Instruction inst) const;
2621   virtual SafetyLevel safety(Instruction i) const;
2622  private:
2623   NACL_DISALLOW_COPY_AND_ASSIGN(
2624       VMRS_cccc111011110001tttt101000010000_case_0);
2625 };
2626 
2627 // VMSR_cccc111011100001tttt101000010000_case_0:
2628 //
2629 //   {Pc: 15,
2630 //    Rt: Rt(15:12),
2631 //    arch: ['VFPv2', 'AdvSIMD'],
2632 //    cond: cond(31:28),
2633 //    defs: {},
2634 //    fields: [cond(31:28), Rt(15:12)],
2635 //    pattern: cccc111011100001tttt101000010000,
2636 //    rule: VMSR,
2637 //    safety: [t  ==
2638 //            Pc => UNPREDICTABLE],
2639 //    t: Rt,
2640 //    uses: {Rt}}
2641 class VMSR_cccc111011100001tttt101000010000_case_0
2642      : public ClassDecoder {
2643  public:
VMSR_cccc111011100001tttt101000010000_case_0()2644   VMSR_cccc111011100001tttt101000010000_case_0()
2645      : ClassDecoder() {}
2646   virtual RegisterList defs(Instruction inst) const;
2647   virtual SafetyLevel safety(Instruction i) const;
2648   virtual RegisterList uses(Instruction i) const;
2649  private:
2650   NACL_DISALLOW_COPY_AND_ASSIGN(
2651       VMSR_cccc111011100001tttt101000010000_case_0);
2652 };
2653 
2654 // VMULL_by_scalar_A2_1111001u1dssnnnndddd1010n1m0mmmm_case_0:
2655 //
2656 //   {D: D(22),
2657 //    F: F(8),
2658 //    M: M(5),
2659 //    N: N(7),
2660 //    Q: Q(24),
2661 //    Vd: Vd(15:12),
2662 //    Vm: Vm(3:0),
2663 //    Vn: Vn(19:16),
2664 //    arch: ASIMD,
2665 //    d: D:Vd,
2666 //    defs: {},
2667 //    elements: 64 / esize,
2668 //    esize: 8 << size,
2669 //    fields: [Q(24),
2670 //      D(22),
2671 //      size(21:20),
2672 //      Vn(19:16),
2673 //      Vd(15:12),
2674 //      op(10),
2675 //      F(8),
2676 //      N(7),
2677 //      M(5),
2678 //      Vm(3:0)],
2679 //    index: M:Vm(3)
2680 //         if size(21:20)=01
2681 //         else M,
2682 //    m: Vm(2:0)
2683 //         if size(21:20)=01
2684 //         else Vm,
2685 //    n: N:Vn,
2686 //    op: op(10),
2687 //    pattern: 1111001u1dssnnnndddd1010n1m0mmmm,
2688 //    regs: 1,
2689 //    rule: VMULL_by_scalar_A2,
2690 //    safety: [size(21:20)=11 => DECODER_ERROR,
2691 //      (size(21:20)=00 ||
2692 //         Vd(0)=1) => UNDEFINED],
2693 //    size: size(21:20),
2694 //    unsigned: Q(24)=1,
2695 //    uses: {}}
2696 class VMULL_by_scalar_A2_1111001u1dssnnnndddd1010n1m0mmmm_case_0
2697      : public ClassDecoder {
2698  public:
VMULL_by_scalar_A2_1111001u1dssnnnndddd1010n1m0mmmm_case_0()2699   VMULL_by_scalar_A2_1111001u1dssnnnndddd1010n1m0mmmm_case_0()
2700      : ClassDecoder() {}
2701   virtual RegisterList defs(Instruction inst) const;
2702   virtual SafetyLevel safety(Instruction i) const;
2703   virtual RegisterList uses(Instruction i) const;
2704  private:
2705   NACL_DISALLOW_COPY_AND_ASSIGN(
2706       VMULL_by_scalar_A2_1111001u1dssnnnndddd1010n1m0mmmm_case_0);
2707 };
2708 
2709 // VMULL_integer_A2_1111001u1dssnnnndddd11p0n0m0mmmm_case_0:
2710 //
2711 //   {D: D(22),
2712 //    M: M(5),
2713 //    N: N(7),
2714 //    U: U(24),
2715 //    Vd: Vd(15:12),
2716 //    Vm: Vm(3:0),
2717 //    Vn: Vn(19:16),
2718 //    d: D:Vd,
2719 //    defs: {},
2720 //    elements: 64 / esize,
2721 //    esize: 8 << size,
2722 //    fields: [U(24),
2723 //      D(22),
2724 //      size(21:20),
2725 //      Vn(19:16),
2726 //      Vd(15:12),
2727 //      op(8),
2728 //      N(7),
2729 //      M(5),
2730 //      Vm(3:0)],
2731 //    m: M:Vm,
2732 //    n: N:Vn,
2733 //    op: op(8),
2734 //    pattern: 1111001u1dssnnnndddd11p0n0m0mmmm,
2735 //    rule: VMULL_integer_A2,
2736 //    safety: [size(21:20)=11 => DECODER_ERROR, Vd(0)=1 => UNDEFINED],
2737 //    size: size(21:20),
2738 //    unsigned: U(24)=1,
2739 //    uses: {}}
2740 class VMULL_integer_A2_1111001u1dssnnnndddd11p0n0m0mmmm_case_0
2741      : public ClassDecoder {
2742  public:
VMULL_integer_A2_1111001u1dssnnnndddd11p0n0m0mmmm_case_0()2743   VMULL_integer_A2_1111001u1dssnnnndddd11p0n0m0mmmm_case_0()
2744      : ClassDecoder() {}
2745   virtual RegisterList defs(Instruction inst) const;
2746   virtual SafetyLevel safety(Instruction i) const;
2747   virtual RegisterList uses(Instruction i) const;
2748  private:
2749   NACL_DISALLOW_COPY_AND_ASSIGN(
2750       VMULL_integer_A2_1111001u1dssnnnndddd11p0n0m0mmmm_case_0);
2751 };
2752 
2753 // VMULL_polynomial_A2_1111001u1dssnnnndddd11p0n0m0mmmm_case_0:
2754 //
2755 //   {D: D(22),
2756 //    M: M(5),
2757 //    N: N(7),
2758 //    U: U(24),
2759 //    Vd: Vd(15:12),
2760 //    Vm: Vm(3:0),
2761 //    Vn: Vn(19:16),
2762 //    d: D:Vd,
2763 //    defs: {},
2764 //    elements: 64 / esize,
2765 //    esize: 8 << size,
2766 //    fields: [U(24),
2767 //      D(22),
2768 //      size(21:20),
2769 //      Vn(19:16),
2770 //      Vd(15:12),
2771 //      op(8),
2772 //      N(7),
2773 //      M(5),
2774 //      Vm(3:0)],
2775 //    m: M:Vm,
2776 //    n: N:Vn,
2777 //    op: op(8),
2778 //    pattern: 1111001u1dssnnnndddd11p0n0m0mmmm,
2779 //    rule: VMULL_polynomial_A2,
2780 //    safety: [size(21:20)=11 => DECODER_ERROR,
2781 //      U(24)=1 ||
2782 //         size(21:20)=~00 => UNDEFINED,
2783 //      Vd(0)=1 => UNDEFINED],
2784 //    size: size(21:20),
2785 //    unsigned: U(24)=1,
2786 //    uses: {}}
2787 class VMULL_polynomial_A2_1111001u1dssnnnndddd11p0n0m0mmmm_case_0
2788      : public ClassDecoder {
2789  public:
VMULL_polynomial_A2_1111001u1dssnnnndddd11p0n0m0mmmm_case_0()2790   VMULL_polynomial_A2_1111001u1dssnnnndddd11p0n0m0mmmm_case_0()
2791      : ClassDecoder() {}
2792   virtual RegisterList defs(Instruction inst) const;
2793   virtual SafetyLevel safety(Instruction i) const;
2794   virtual RegisterList uses(Instruction i) const;
2795  private:
2796   NACL_DISALLOW_COPY_AND_ASSIGN(
2797       VMULL_polynomial_A2_1111001u1dssnnnndddd11p0n0m0mmmm_case_0);
2798 };
2799 
2800 // VMUL_by_scalar_A1_1111001q1dssnnnndddd100fn1m0mmmm_case_0:
2801 //
2802 //   {D: D(22),
2803 //    F: F(8),
2804 //    M: M(5),
2805 //    N: N(7),
2806 //    Q: Q(24),
2807 //    Vd: Vd(15:12),
2808 //    Vm: Vm(3:0),
2809 //    Vn: Vn(19:16),
2810 //    arch: ASIMD,
2811 //    d: D:Vd,
2812 //    defs: {},
2813 //    elements: 64 / esize,
2814 //    esize: 8 << size,
2815 //    fields: [Q(24),
2816 //      D(22),
2817 //      size(21:20),
2818 //      Vn(19:16),
2819 //      Vd(15:12),
2820 //      op(10),
2821 //      F(8),
2822 //      N(7),
2823 //      M(5),
2824 //      Vm(3:0)],
2825 //    index: M,
2826 //    m: Vm,
2827 //    n: N:Vn,
2828 //    op: op(10),
2829 //    pattern: 1111001q1dssnnnndddd100fn1m0mmmm,
2830 //    regs: 1
2831 //         if Q(24)=0
2832 //         else 2,
2833 //    rule: VMUL_by_scalar_A1,
2834 //    safety: [size(21:20)=11 => DECODER_ERROR,
2835 //      (size(21:20)=00 ||
2836 //         size(21:20)=01) => UNDEFINED,
2837 //      Q(24)=1 &&
2838 //         (Vd(0)=1 ||
2839 //         Vn(0)=1) => UNDEFINED],
2840 //    size: size(21:20),
2841 //    uses: {}}
2842 class VMUL_by_scalar_A1_1111001q1dssnnnndddd100fn1m0mmmm_case_0
2843      : public ClassDecoder {
2844  public:
VMUL_by_scalar_A1_1111001q1dssnnnndddd100fn1m0mmmm_case_0()2845   VMUL_by_scalar_A1_1111001q1dssnnnndddd100fn1m0mmmm_case_0()
2846      : ClassDecoder() {}
2847   virtual RegisterList defs(Instruction inst) const;
2848   virtual SafetyLevel safety(Instruction i) const;
2849   virtual RegisterList uses(Instruction i) const;
2850  private:
2851   NACL_DISALLOW_COPY_AND_ASSIGN(
2852       VMUL_by_scalar_A1_1111001q1dssnnnndddd100fn1m0mmmm_case_0);
2853 };
2854 
2855 // VMUL_by_scalar_A1_1111001q1dssnnnndddd100fn1m0mmmm_case_1:
2856 //
2857 //   {D: D(22),
2858 //    F: F(8),
2859 //    M: M(5),
2860 //    N: N(7),
2861 //    Q: Q(24),
2862 //    Vd: Vd(15:12),
2863 //    Vm: Vm(3:0),
2864 //    Vn: Vn(19:16),
2865 //    arch: ASIMD,
2866 //    d: D:Vd,
2867 //    defs: {},
2868 //    elements: 64 / esize,
2869 //    esize: 8 << size,
2870 //    fields: [Q(24),
2871 //      D(22),
2872 //      size(21:20),
2873 //      Vn(19:16),
2874 //      Vd(15:12),
2875 //      op(10),
2876 //      F(8),
2877 //      N(7),
2878 //      M(5),
2879 //      Vm(3:0)],
2880 //    index: M:Vm(3)
2881 //         if size(21:20)=01
2882 //         else M,
2883 //    m: Vm(2:0)
2884 //         if size(21:20)=01
2885 //         else Vm,
2886 //    n: N:Vn,
2887 //    op: op(10),
2888 //    pattern: 1111001q1dssnnnndddd100fn1m0mmmm,
2889 //    regs: 1
2890 //         if Q(24)=0
2891 //         else 2,
2892 //    rule: VMUL_by_scalar_A1,
2893 //    safety: [size(21:20)=11 => DECODER_ERROR,
2894 //      size(21:20)=00 => UNDEFINED,
2895 //      Q(24)=1 &&
2896 //         (Vd(0)=1 ||
2897 //         Vn(0)=1) => UNDEFINED],
2898 //    size: size(21:20),
2899 //    uses: {}}
2900 class VMUL_by_scalar_A1_1111001q1dssnnnndddd100fn1m0mmmm_case_1
2901      : public ClassDecoder {
2902  public:
VMUL_by_scalar_A1_1111001q1dssnnnndddd100fn1m0mmmm_case_1()2903   VMUL_by_scalar_A1_1111001q1dssnnnndddd100fn1m0mmmm_case_1()
2904      : ClassDecoder() {}
2905   virtual RegisterList defs(Instruction inst) const;
2906   virtual SafetyLevel safety(Instruction i) const;
2907   virtual RegisterList uses(Instruction i) const;
2908  private:
2909   NACL_DISALLOW_COPY_AND_ASSIGN(
2910       VMUL_by_scalar_A1_1111001q1dssnnnndddd100fn1m0mmmm_case_1);
2911 };
2912 
2913 // VMUL_floating_point_A1_111100110d0snnnndddd1101nqm1mmmm_case_0:
2914 //
2915 //   {D: D(22),
2916 //    M: M(5),
2917 //    N: N(7),
2918 //    Q: Q(6),
2919 //    U: U(24),
2920 //    Vd: Vd(15:12),
2921 //    Vm: Vm(3:0),
2922 //    Vn: Vn(19:16),
2923 //    arch: ASIMD,
2924 //    d: D:Vd,
2925 //    defs: {},
2926 //    elements: 2,
2927 //    esize: 32,
2928 //    fields: [U(24),
2929 //      D(22),
2930 //      size(21:20),
2931 //      Vn(19:16),
2932 //      Vd(15:12),
2933 //      op(9),
2934 //      N(7),
2935 //      Q(6),
2936 //      M(5),
2937 //      Vm(3:0)],
2938 //    m: M:Vm,
2939 //    n: N:Vn,
2940 //    op: op(9),
2941 //    op1_neg: size(1),
2942 //    pattern: 111100110d0snnnndddd1101nqm1mmmm,
2943 //    rule: VMUL_floating_point_A1,
2944 //    safety: [Q(6)=1 &&
2945 //         (Vd(0)=1 ||
2946 //         Vn(0)=1 ||
2947 //         Vm(0)=1) => UNDEFINED,
2948 //      size(0)=1 => UNDEFINED],
2949 //    size: size(21:20),
2950 //    sz: size(0),
2951 //    uses: {}}
2952 class VMUL_floating_point_A1_111100110d0snnnndddd1101nqm1mmmm_case_0
2953      : public ClassDecoder {
2954  public:
VMUL_floating_point_A1_111100110d0snnnndddd1101nqm1mmmm_case_0()2955   VMUL_floating_point_A1_111100110d0snnnndddd1101nqm1mmmm_case_0()
2956      : ClassDecoder() {}
2957   virtual RegisterList defs(Instruction inst) const;
2958   virtual SafetyLevel safety(Instruction i) const;
2959   virtual RegisterList uses(Instruction i) const;
2960  private:
2961   NACL_DISALLOW_COPY_AND_ASSIGN(
2962       VMUL_floating_point_A1_111100110d0snnnndddd1101nqm1mmmm_case_0);
2963 };
2964 
2965 // VMUL_floating_point_cccc11100d10nnnndddd101sn0m0mmmm_case_0:
2966 //
2967 //   {D: D(22),
2968 //    M: M(5),
2969 //    N: N(7),
2970 //    Vd: Vd(15:12),
2971 //    Vm: Vm(3:0),
2972 //    Vn: Vn(19:16),
2973 //    advsimd: false,
2974 //    arch: VFPv2,
2975 //    cond: cond(31:28),
2976 //    d: D:Vd
2977 //         if dp_operation
2978 //         else Vd:D,
2979 //    defs: {},
2980 //    dp_operation: sz(8)=1,
2981 //    false: false,
2982 //    fields: [cond(31:28),
2983 //      D(22),
2984 //      Vn(19:16),
2985 //      Vd(15:12),
2986 //      sz(8),
2987 //      N(7),
2988 //      M(5),
2989 //      Vm(3:0)],
2990 //    m: M:Vm
2991 //         if dp_operation
2992 //         else Vm:M,
2993 //    n: N:Vn
2994 //         if dp_operation
2995 //         else Vn:N,
2996 //    pattern: cccc11100d10nnnndddd101sn0m0mmmm,
2997 //    rule: VMUL_floating_point,
2998 //    safety: [cond(31:28)=1111 => DECODER_ERROR],
2999 //    sz: sz(8),
3000 //    uses: {}}
3001 class VMUL_floating_point_cccc11100d10nnnndddd101sn0m0mmmm_case_0
3002      : public ClassDecoder {
3003  public:
VMUL_floating_point_cccc11100d10nnnndddd101sn0m0mmmm_case_0()3004   VMUL_floating_point_cccc11100d10nnnndddd101sn0m0mmmm_case_0()
3005      : ClassDecoder() {}
3006   virtual RegisterList defs(Instruction inst) const;
3007   virtual SafetyLevel safety(Instruction i) const;
3008   virtual RegisterList uses(Instruction i) const;
3009  private:
3010   NACL_DISALLOW_COPY_AND_ASSIGN(
3011       VMUL_floating_point_cccc11100d10nnnndddd101sn0m0mmmm_case_0);
3012 };
3013 
3014 // VMUL_integer_A1_1111001u0dssnnnndddd1001nqm1mmmm_case_0:
3015 //
3016 //   {D: D(22),
3017 //    M: M(5),
3018 //    N: N(7),
3019 //    Q: Q(6),
3020 //    U: U(24),
3021 //    Vd: Vd(15:12),
3022 //    Vm: Vm(3:0),
3023 //    Vn: Vn(19:16),
3024 //    arch: ASIMD,
3025 //    d: D:Vd,
3026 //    defs: {},
3027 //    elements: 64 / esize,
3028 //    esize: 8 << size,
3029 //    fields: [U(24),
3030 //      D(22),
3031 //      size(21:20),
3032 //      Vn(19:16),
3033 //      Vd(15:12),
3034 //      op(9),
3035 //      N(7),
3036 //      Q(6),
3037 //      M(5),
3038 //      Vm(3:0)],
3039 //    m: M:Vm,
3040 //    n: N:Vn,
3041 //    op: op(9),
3042 //    pattern: 1111001u0dssnnnndddd1001nqm1mmmm,
3043 //    regs: 1
3044 //         if Q(6)=0
3045 //         else 2,
3046 //    rule: VMUL_integer_A1,
3047 //    safety: [Q(6)=1 &&
3048 //         (Vd(0)=1 ||
3049 //         Vn(0)=1 ||
3050 //         Vm(0)=1) => UNDEFINED,
3051 //      size(21:20)=11 => UNDEFINED],
3052 //    size: size(21:20),
3053 //    unsigned: U(24)=1,
3054 //    uses: {}}
3055 class VMUL_integer_A1_1111001u0dssnnnndddd1001nqm1mmmm_case_0
3056      : public ClassDecoder {
3057  public:
VMUL_integer_A1_1111001u0dssnnnndddd1001nqm1mmmm_case_0()3058   VMUL_integer_A1_1111001u0dssnnnndddd1001nqm1mmmm_case_0()
3059      : ClassDecoder() {}
3060   virtual RegisterList defs(Instruction inst) const;
3061   virtual SafetyLevel safety(Instruction i) const;
3062   virtual RegisterList uses(Instruction i) const;
3063  private:
3064   NACL_DISALLOW_COPY_AND_ASSIGN(
3065       VMUL_integer_A1_1111001u0dssnnnndddd1001nqm1mmmm_case_0);
3066 };
3067 
3068 // VMUL_polynomial_A1_1111001u0dssnnnndddd1001nqm1mmmm_case_0:
3069 //
3070 //   {D: D(22),
3071 //    M: M(5),
3072 //    N: N(7),
3073 //    Q: Q(6),
3074 //    U: U(24),
3075 //    Vd: Vd(15:12),
3076 //    Vm: Vm(3:0),
3077 //    Vn: Vn(19:16),
3078 //    arch: ASIMD,
3079 //    d: D:Vd,
3080 //    defs: {},
3081 //    elements: 64 / esize,
3082 //    esize: 8 << size,
3083 //    false: false,
3084 //    fields: [U(24),
3085 //      D(22),
3086 //      size(21:20),
3087 //      Vn(19:16),
3088 //      Vd(15:12),
3089 //      op(9),
3090 //      N(7),
3091 //      Q(6),
3092 //      M(5),
3093 //      Vm(3:0)],
3094 //    m: M:Vm,
3095 //    n: N:Vn,
3096 //    op: op(9),
3097 //    pattern: 1111001u0dssnnnndddd1001nqm1mmmm,
3098 //    regs: 1
3099 //         if Q(6)=0
3100 //         else 2,
3101 //    rule: VMUL_polynomial_A1,
3102 //    safety: [Q(6)=1 &&
3103 //         (Vd(0)=1 ||
3104 //         Vn(0)=1 ||
3105 //         Vm(0)=1) => UNDEFINED,
3106 //      size(21:20)=~00 => UNDEFINED],
3107 //    size: size(21:20),
3108 //    unsigned: false,
3109 //    uses: {}}
3110 class VMUL_polynomial_A1_1111001u0dssnnnndddd1001nqm1mmmm_case_0
3111      : public ClassDecoder {
3112  public:
VMUL_polynomial_A1_1111001u0dssnnnndddd1001nqm1mmmm_case_0()3113   VMUL_polynomial_A1_1111001u0dssnnnndddd1001nqm1mmmm_case_0()
3114      : ClassDecoder() {}
3115   virtual RegisterList defs(Instruction inst) const;
3116   virtual SafetyLevel safety(Instruction i) const;
3117   virtual RegisterList uses(Instruction i) const;
3118  private:
3119   NACL_DISALLOW_COPY_AND_ASSIGN(
3120       VMUL_polynomial_A1_1111001u0dssnnnndddd1001nqm1mmmm_case_0);
3121 };
3122 
3123 // VMVN_immediate_1111001i1d000mmmddddcccc0q11mmmm_case_0:
3124 //
3125 //   {D: D(22),
3126 //    Q: Q(6),
3127 //    Vd: Vd(15:12),
3128 //    arch: ASIMD,
3129 //    cmode: cmode(11:8),
3130 //    d: D:Vd,
3131 //    defs: {},
3132 //    fields: [i(24),
3133 //      D(22),
3134 //      imm3(18:16),
3135 //      Vd(15:12),
3136 //      cmode(11:8),
3137 //      Q(6),
3138 //      op(5),
3139 //      imm4(3:0)],
3140 //    i: i(24),
3141 //    imm3: imm3(18:16),
3142 //    imm4: imm4(3:0),
3143 //    imm64: AdvSIMDExpandImm(op, cmode, i:imm3:imm4),
3144 //    op: op(5),
3145 //    pattern: 1111001i1d000mmmddddcccc0q11mmmm,
3146 //    regs: 1
3147 //         if Q(6)=0
3148 //         else 2,
3149 //    rule: VMVN_immediate,
3150 //    safety: [(cmode(0)=1 &&
3151 //         cmode(3:2)=~11) ||
3152 //         cmode(3:1)=111 => DECODER_ERROR,
3153 //      Q(6)=1 &&
3154 //         Vd(0)=1 => UNDEFINED],
3155 //    uses: {}}
3156 class VMVN_immediate_1111001i1d000mmmddddcccc0q11mmmm_case_0
3157      : public ClassDecoder {
3158  public:
VMVN_immediate_1111001i1d000mmmddddcccc0q11mmmm_case_0()3159   VMVN_immediate_1111001i1d000mmmddddcccc0q11mmmm_case_0()
3160      : ClassDecoder() {}
3161   virtual RegisterList defs(Instruction inst) const;
3162   virtual SafetyLevel safety(Instruction i) const;
3163   virtual RegisterList uses(Instruction i) const;
3164  private:
3165   NACL_DISALLOW_COPY_AND_ASSIGN(
3166       VMVN_immediate_1111001i1d000mmmddddcccc0q11mmmm_case_0);
3167 };
3168 
3169 // VMVN_register_111100111d11ss00dddd01011qm0mmmm_case_0:
3170 //
3171 //   {D: D(22),
3172 //    F: F(10),
3173 //    M: M(5),
3174 //    Q: Q(6),
3175 //    Vd: Vd(15:12),
3176 //    Vm: Vm(3:0),
3177 //    arch: ASIMD,
3178 //    d: D:Vd,
3179 //    defs: {},
3180 //    elements: 64 / esize,
3181 //    esize: 8 << size,
3182 //    fields: [D(22),
3183 //      size(19:18),
3184 //      Vd(15:12),
3185 //      F(10),
3186 //      op(8:7),
3187 //      Q(6),
3188 //      M(5),
3189 //      Vm(3:0)],
3190 //    m: M:Vm,
3191 //    op: op(8:7),
3192 //    pattern: 111100111d11ss00dddd01011qm0mmmm,
3193 //    regs: 1
3194 //         if Q(6)=0
3195 //         else 2,
3196 //    rule: VMVN_register,
3197 //    safety: [size(19:18)=~00 => UNDEFINED,
3198 //      Q(6)=1 &&
3199 //         (Vd(0)=1 ||
3200 //         Vm(0)=1) => UNDEFINED],
3201 //    size: size(19:18),
3202 //    uses: {}}
3203 class VMVN_register_111100111d11ss00dddd01011qm0mmmm_case_0
3204      : public ClassDecoder {
3205  public:
VMVN_register_111100111d11ss00dddd01011qm0mmmm_case_0()3206   VMVN_register_111100111d11ss00dddd01011qm0mmmm_case_0()
3207      : ClassDecoder() {}
3208   virtual RegisterList defs(Instruction inst) const;
3209   virtual SafetyLevel safety(Instruction i) const;
3210   virtual RegisterList uses(Instruction i) const;
3211  private:
3212   NACL_DISALLOW_COPY_AND_ASSIGN(
3213       VMVN_register_111100111d11ss00dddd01011qm0mmmm_case_0);
3214 };
3215 
3216 // VNEG_111100111d11ss01dddd0f111qm0mmmm_case_0:
3217 //
3218 //   {D: D(22),
3219 //    F: F(10),
3220 //    M: M(5),
3221 //    Q: Q(6),
3222 //    Vd: Vd(15:12),
3223 //    Vm: Vm(3:0),
3224 //    arch: ASIMD,
3225 //    d: D:Vd,
3226 //    defs: {},
3227 //    elements: 64 / esize,
3228 //    esize: 8 << size,
3229 //    fields: [D(22),
3230 //      size(19:18),
3231 //      Vd(15:12),
3232 //      F(10),
3233 //      op(8:7),
3234 //      Q(6),
3235 //      M(5),
3236 //      Vm(3:0)],
3237 //    m: M:Vm,
3238 //    op: op(8:7),
3239 //    pattern: 111100111d11ss01dddd0f111qm0mmmm,
3240 //    regs: 1
3241 //         if Q(6)=0
3242 //         else 2,
3243 //    rule: VNEG,
3244 //    safety: [size(19:18)=11 => UNDEFINED,
3245 //      Q(6)=1 &&
3246 //         (Vd(0)=1 ||
3247 //         Vm(0)=1) => UNDEFINED],
3248 //    size: size(19:18),
3249 //    uses: {}}
3250 class VNEG_111100111d11ss01dddd0f111qm0mmmm_case_0
3251      : public ClassDecoder {
3252  public:
VNEG_111100111d11ss01dddd0f111qm0mmmm_case_0()3253   VNEG_111100111d11ss01dddd0f111qm0mmmm_case_0()
3254      : ClassDecoder() {}
3255   virtual RegisterList defs(Instruction inst) const;
3256   virtual SafetyLevel safety(Instruction i) const;
3257   virtual RegisterList uses(Instruction i) const;
3258  private:
3259   NACL_DISALLOW_COPY_AND_ASSIGN(
3260       VNEG_111100111d11ss01dddd0f111qm0mmmm_case_0);
3261 };
3262 
3263 // VNEG_111100111d11ss01dddd0f111qm0mmmm_case_1:
3264 //
3265 //   {D: D(22),
3266 //    F: F(10),
3267 //    M: M(5),
3268 //    Q: Q(6),
3269 //    Vd: Vd(15:12),
3270 //    Vm: Vm(3:0),
3271 //    arch: ASIMD,
3272 //    d: D:Vd,
3273 //    defs: {},
3274 //    elements: 64 / esize,
3275 //    esize: 8 << size,
3276 //    fields: [D(22),
3277 //      size(19:18),
3278 //      Vd(15:12),
3279 //      F(10),
3280 //      op(8:7),
3281 //      Q(6),
3282 //      M(5),
3283 //      Vm(3:0)],
3284 //    m: M:Vm,
3285 //    op: op(8:7),
3286 //    pattern: 111100111d11ss01dddd0f111qm0mmmm,
3287 //    regs: 1
3288 //         if Q(6)=0
3289 //         else 2,
3290 //    rule: VNEG,
3291 //    safety: [Q(6)=1 &&
3292 //         (Vd(0)=1 ||
3293 //         Vm(0)=1) => UNDEFINED,
3294 //      size(19:18)=~10 => UNDEFINED],
3295 //    size: size(19:18),
3296 //    uses: {}}
3297 class VNEG_111100111d11ss01dddd0f111qm0mmmm_case_1
3298      : public ClassDecoder {
3299  public:
VNEG_111100111d11ss01dddd0f111qm0mmmm_case_1()3300   VNEG_111100111d11ss01dddd0f111qm0mmmm_case_1()
3301      : ClassDecoder() {}
3302   virtual RegisterList defs(Instruction inst) const;
3303   virtual SafetyLevel safety(Instruction i) const;
3304   virtual RegisterList uses(Instruction i) const;
3305  private:
3306   NACL_DISALLOW_COPY_AND_ASSIGN(
3307       VNEG_111100111d11ss01dddd0f111qm0mmmm_case_1);
3308 };
3309 
3310 // VNEG_cccc11101d110001dddd101s01m0mmmm_case_0:
3311 //
3312 //   {D: D(22),
3313 //    M: M(5),
3314 //    Vd: Vd(15:12),
3315 //    Vm: Vm(3:0),
3316 //    advsimd: false,
3317 //    arch: VFPv2,
3318 //    cond: cond(31:28),
3319 //    d: Vd:D
3320 //         if sz(8)=0
3321 //         else D:Vd,
3322 //    defs: {},
3323 //    dp_operation: sz(8)=1,
3324 //    false: false,
3325 //    fields: [cond(31:28), D(22), Vd(15:12), sz(8), M(5), Vm(3:0)],
3326 //    m: Vm:D
3327 //         if sz(8)=0
3328 //         else M:Vm,
3329 //    pattern: cccc11101d110001dddd101s01m0mmmm,
3330 //    rule: VNEG,
3331 //    safety: [true => MAY_BE_SAFE],
3332 //    sz: sz(8),
3333 //    true: true,
3334 //    uses: {}}
3335 class VNEG_cccc11101d110001dddd101s01m0mmmm_case_0
3336      : public ClassDecoder {
3337  public:
VNEG_cccc11101d110001dddd101s01m0mmmm_case_0()3338   VNEG_cccc11101d110001dddd101s01m0mmmm_case_0()
3339      : ClassDecoder() {}
3340   virtual RegisterList defs(Instruction inst) const;
3341   virtual SafetyLevel safety(Instruction i) const;
3342   virtual RegisterList uses(Instruction i) const;
3343  private:
3344   NACL_DISALLOW_COPY_AND_ASSIGN(
3345       VNEG_cccc11101d110001dddd101s01m0mmmm_case_0);
3346 };
3347 
3348 // VNMLA_VNMLS_cccc11100d01nnnndddd101snom0mmmm_case_0:
3349 //
3350 //   {D: D(22),
3351 //    M: M(5),
3352 //    N: N(7),
3353 //    VFPNegMul_VNMLA: 1,
3354 //    VFPNegMul_VNMLS: 2,
3355 //    Vd: Vd(15:12),
3356 //    Vm: Vm(3:0),
3357 //    Vn: Vn(19:16),
3358 //    arch: VFPv2,
3359 //    cond: cond(31:28),
3360 //    d: D:Vd
3361 //         if dp_operation
3362 //         else Vd:D,
3363 //    defs: {},
3364 //    dp_operation: sz(8)=1,
3365 //    fields: [cond(31:28),
3366 //      D(22),
3367 //      Vn(19:16),
3368 //      Vd(15:12),
3369 //      sz(8),
3370 //      N(7),
3371 //      op(6),
3372 //      M(5),
3373 //      Vm(3:0)],
3374 //    m: M:Vm
3375 //         if dp_operation
3376 //         else Vm:M,
3377 //    n: N:Vn
3378 //         if dp_operation
3379 //         else Vn:N,
3380 //    op: op(6),
3381 //    pattern: cccc11100d01nnnndddd101snom0mmmm,
3382 //    rule: VNMLA_VNMLS,
3383 //    safety: [cond(31:28)=1111 => DECODER_ERROR],
3384 //    sz: sz(8),
3385 //    type: VFPNegMul_VNMLA
3386 //         if op(6)=1
3387 //         else VFPNegMul_VNMLS,
3388 //    uses: {}}
3389 class VNMLA_VNMLS_cccc11100d01nnnndddd101snom0mmmm_case_0
3390      : public ClassDecoder {
3391  public:
VNMLA_VNMLS_cccc11100d01nnnndddd101snom0mmmm_case_0()3392   VNMLA_VNMLS_cccc11100d01nnnndddd101snom0mmmm_case_0()
3393      : ClassDecoder() {}
3394   virtual RegisterList defs(Instruction inst) const;
3395   virtual SafetyLevel safety(Instruction i) const;
3396   virtual RegisterList uses(Instruction i) const;
3397  private:
3398   NACL_DISALLOW_COPY_AND_ASSIGN(
3399       VNMLA_VNMLS_cccc11100d01nnnndddd101snom0mmmm_case_0);
3400 };
3401 
3402 // VNMUL_cccc11100d10nnnndddd101sn1m0mmmm_case_0:
3403 //
3404 //   {D: D(22),
3405 //    M: M(5),
3406 //    N: N(7),
3407 //    VFPNegMul_VNMUL: 3,
3408 //    Vd: Vd(15:12),
3409 //    Vm: Vm(3:0),
3410 //    Vn: Vn(19:16),
3411 //    arch: VFPv2,
3412 //    cond: cond(31:28),
3413 //    d: D:Vd
3414 //         if dp_operation
3415 //         else Vd:D,
3416 //    defs: {},
3417 //    dp_operation: sz(8)=1,
3418 //    fields: [cond(31:28),
3419 //      D(22),
3420 //      Vn(19:16),
3421 //      Vd(15:12),
3422 //      sz(8),
3423 //      N(7),
3424 //      M(5),
3425 //      Vm(3:0)],
3426 //    m: M:Vm
3427 //         if dp_operation
3428 //         else Vm:M,
3429 //    n: N:Vn
3430 //         if dp_operation
3431 //         else Vn:N,
3432 //    pattern: cccc11100d10nnnndddd101sn1m0mmmm,
3433 //    rule: VNMUL,
3434 //    safety: [cond(31:28)=1111 => DECODER_ERROR],
3435 //    sz: sz(8),
3436 //    type: VFPNegMul_VNMUL,
3437 //    uses: {}}
3438 class VNMUL_cccc11100d10nnnndddd101sn1m0mmmm_case_0
3439      : public ClassDecoder {
3440  public:
VNMUL_cccc11100d10nnnndddd101sn1m0mmmm_case_0()3441   VNMUL_cccc11100d10nnnndddd101sn1m0mmmm_case_0()
3442      : ClassDecoder() {}
3443   virtual RegisterList defs(Instruction inst) const;
3444   virtual SafetyLevel safety(Instruction i) const;
3445   virtual RegisterList uses(Instruction i) const;
3446  private:
3447   NACL_DISALLOW_COPY_AND_ASSIGN(
3448       VNMUL_cccc11100d10nnnndddd101sn1m0mmmm_case_0);
3449 };
3450 
3451 // VORN_register_111100100d11nnnndddd0001nqm1mmmm_case_0:
3452 //
3453 //   {D: D(22),
3454 //    M: M(5),
3455 //    N: N(7),
3456 //    Q: Q(6),
3457 //    U: U(24),
3458 //    Vd: Vd(15:12),
3459 //    Vm: Vm(3:0),
3460 //    Vn: Vn(19:16),
3461 //    arch: ASIMD,
3462 //    d: D:Vd,
3463 //    defs: {},
3464 //    fields: [U(24),
3465 //      D(22),
3466 //      size(21:20),
3467 //      Vn(19:16),
3468 //      Vd(15:12),
3469 //      op(9),
3470 //      N(7),
3471 //      Q(6),
3472 //      M(5),
3473 //      Vm(3:0)],
3474 //    m: M:Vm,
3475 //    n: N:Vn,
3476 //    op: op(9),
3477 //    pattern: 111100100d11nnnndddd0001nqm1mmmm,
3478 //    regs: 1
3479 //         if Q(6)=0
3480 //         else 2,
3481 //    rule: VORN_register,
3482 //    safety: [Q(6)=1 &&
3483 //         (Vd(0)=1 ||
3484 //         Vn(0)=1 ||
3485 //         Vm(0)=1) => UNDEFINED],
3486 //    size: size(21:20),
3487 //    uses: {}}
3488 class VORN_register_111100100d11nnnndddd0001nqm1mmmm_case_0
3489      : public ClassDecoder {
3490  public:
VORN_register_111100100d11nnnndddd0001nqm1mmmm_case_0()3491   VORN_register_111100100d11nnnndddd0001nqm1mmmm_case_0()
3492      : ClassDecoder() {}
3493   virtual RegisterList defs(Instruction inst) const;
3494   virtual SafetyLevel safety(Instruction i) const;
3495   virtual RegisterList uses(Instruction i) const;
3496  private:
3497   NACL_DISALLOW_COPY_AND_ASSIGN(
3498       VORN_register_111100100d11nnnndddd0001nqm1mmmm_case_0);
3499 };
3500 
3501 // VORR_immediate_1111001i1d000mmmddddcccc0q01mmmm_case_0:
3502 //
3503 //   {D: D(22),
3504 //    Q: Q(6),
3505 //    Vd: Vd(15:12),
3506 //    arch: ASIMD,
3507 //    cmode: cmode(11:8),
3508 //    d: D:Vd,
3509 //    defs: {},
3510 //    fields: [i(24),
3511 //      D(22),
3512 //      imm3(18:16),
3513 //      Vd(15:12),
3514 //      cmode(11:8),
3515 //      Q(6),
3516 //      op(5),
3517 //      imm4(3:0)],
3518 //    i: i(24),
3519 //    imm3: imm3(18:16),
3520 //    imm4: imm4(3:0),
3521 //    imm64: AdvSIMDExpandImm(op, cmode, i:imm3:imm4),
3522 //    op: op(5),
3523 //    pattern: 1111001i1d000mmmddddcccc0q01mmmm,
3524 //    regs: 1
3525 //         if Q(6)=0
3526 //         else 2,
3527 //    rule: VORR_immediate,
3528 //    safety: [cmode(0)=0 ||
3529 //         cmode(3:2)=11 => DECODER_ERROR,
3530 //      Q(6)=1 &&
3531 //         Vd(0)=1 => UNDEFINED],
3532 //    uses: {}}
3533 class VORR_immediate_1111001i1d000mmmddddcccc0q01mmmm_case_0
3534      : public ClassDecoder {
3535  public:
VORR_immediate_1111001i1d000mmmddddcccc0q01mmmm_case_0()3536   VORR_immediate_1111001i1d000mmmddddcccc0q01mmmm_case_0()
3537      : ClassDecoder() {}
3538   virtual RegisterList defs(Instruction inst) const;
3539   virtual SafetyLevel safety(Instruction i) const;
3540   virtual RegisterList uses(Instruction i) const;
3541  private:
3542   NACL_DISALLOW_COPY_AND_ASSIGN(
3543       VORR_immediate_1111001i1d000mmmddddcccc0q01mmmm_case_0);
3544 };
3545 
3546 // VORR_register_or_VMOV_register_A1_111100100d10nnnndddd0001nqm1mmmm_case_0:
3547 //
3548 //   {D: D(22),
3549 //    M: M(5),
3550 //    N: N(7),
3551 //    Q: Q(6),
3552 //    U: U(24),
3553 //    Vd: Vd(15:12),
3554 //    Vm: Vm(3:0),
3555 //    Vn: Vn(19:16),
3556 //    arch: ASIMD,
3557 //    d: D:Vd,
3558 //    defs: {},
3559 //    fields: [U(24),
3560 //      D(22),
3561 //      size(21:20),
3562 //      Vn(19:16),
3563 //      Vd(15:12),
3564 //      op(9),
3565 //      N(7),
3566 //      Q(6),
3567 //      M(5),
3568 //      Vm(3:0)],
3569 //    m: M:Vm,
3570 //    n: N:Vn,
3571 //    op: op(9),
3572 //    pattern: 111100100d10nnnndddd0001nqm1mmmm,
3573 //    regs: 1
3574 //         if Q(6)=0
3575 //         else 2,
3576 //    rule: VORR_register_or_VMOV_register_A1,
3577 //    safety: [Q(6)=1 &&
3578 //         (Vd(0)=1 ||
3579 //         Vn(0)=1 ||
3580 //         Vm(0)=1) => UNDEFINED],
3581 //    size: size(21:20),
3582 //    uses: {}}
3583 class VORR_register_or_VMOV_register_A1_111100100d10nnnndddd0001nqm1mmmm_case_0
3584      : public ClassDecoder {
3585  public:
VORR_register_or_VMOV_register_A1_111100100d10nnnndddd0001nqm1mmmm_case_0()3586   VORR_register_or_VMOV_register_A1_111100100d10nnnndddd0001nqm1mmmm_case_0()
3587      : ClassDecoder() {}
3588   virtual RegisterList defs(Instruction inst) const;
3589   virtual SafetyLevel safety(Instruction i) const;
3590   virtual RegisterList uses(Instruction i) const;
3591  private:
3592   NACL_DISALLOW_COPY_AND_ASSIGN(
3593       VORR_register_or_VMOV_register_A1_111100100d10nnnndddd0001nqm1mmmm_case_0);
3594 };
3595 
3596 // VPADAL_111100111d11ss00dddd0110pqm0mmmm_case_0:
3597 //
3598 //   {D: D(22),
3599 //    F: F(10),
3600 //    M: M(5),
3601 //    Q: Q(6),
3602 //    Vd: Vd(15:12),
3603 //    Vm: Vm(3:0),
3604 //    arch: ASIMD,
3605 //    d: D:Vd,
3606 //    defs: {},
3607 //    elements: 64 / esize,
3608 //    esize: 8 << size,
3609 //    fields: [D(22),
3610 //      size(19:18),
3611 //      Vd(15:12),
3612 //      F(10),
3613 //      op(8:7),
3614 //      Q(6),
3615 //      M(5),
3616 //      Vm(3:0)],
3617 //    m: M:Vm,
3618 //    op: op(8:7),
3619 //    pattern: 111100111d11ss00dddd0110pqm0mmmm,
3620 //    regs: 1
3621 //         if Q(6)=0
3622 //         else 2,
3623 //    rule: VPADAL,
3624 //    safety: [size(19:18)=11 => UNDEFINED,
3625 //      Q(6)=1 &&
3626 //         (Vd(0)=1 ||
3627 //         Vm(0)=1) => UNDEFINED],
3628 //    size: size(19:18),
3629 //    unsigned: (op(0)=1),
3630 //    uses: {}}
3631 class VPADAL_111100111d11ss00dddd0110pqm0mmmm_case_0
3632      : public ClassDecoder {
3633  public:
VPADAL_111100111d11ss00dddd0110pqm0mmmm_case_0()3634   VPADAL_111100111d11ss00dddd0110pqm0mmmm_case_0()
3635      : ClassDecoder() {}
3636   virtual RegisterList defs(Instruction inst) const;
3637   virtual SafetyLevel safety(Instruction i) const;
3638   virtual RegisterList uses(Instruction i) const;
3639  private:
3640   NACL_DISALLOW_COPY_AND_ASSIGN(
3641       VPADAL_111100111d11ss00dddd0110pqm0mmmm_case_0);
3642 };
3643 
3644 // VPADDL_111100111d11ss00dddd0010pqm0mmmm_case_0:
3645 //
3646 //   {D: D(22),
3647 //    F: F(10),
3648 //    M: M(5),
3649 //    Q: Q(6),
3650 //    Vd: Vd(15:12),
3651 //    Vm: Vm(3:0),
3652 //    arch: ASIMD,
3653 //    d: D:Vd,
3654 //    defs: {},
3655 //    elements: 64 / esize,
3656 //    esize: 8 << size,
3657 //    fields: [D(22),
3658 //      size(19:18),
3659 //      Vd(15:12),
3660 //      F(10),
3661 //      op(8:7),
3662 //      Q(6),
3663 //      M(5),
3664 //      Vm(3:0)],
3665 //    m: M:Vm,
3666 //    op: op(8:7),
3667 //    pattern: 111100111d11ss00dddd0010pqm0mmmm,
3668 //    regs: 1
3669 //         if Q(6)=0
3670 //         else 2,
3671 //    rule: VPADDL,
3672 //    safety: [size(19:18)=11 => UNDEFINED,
3673 //      Q(6)=1 &&
3674 //         (Vd(0)=1 ||
3675 //         Vm(0)=1) => UNDEFINED],
3676 //    size: size(19:18),
3677 //    unsigned: (op(0)=1),
3678 //    uses: {}}
3679 class VPADDL_111100111d11ss00dddd0010pqm0mmmm_case_0
3680      : public ClassDecoder {
3681  public:
VPADDL_111100111d11ss00dddd0010pqm0mmmm_case_0()3682   VPADDL_111100111d11ss00dddd0010pqm0mmmm_case_0()
3683      : ClassDecoder() {}
3684   virtual RegisterList defs(Instruction inst) const;
3685   virtual SafetyLevel safety(Instruction i) const;
3686   virtual RegisterList uses(Instruction i) const;
3687  private:
3688   NACL_DISALLOW_COPY_AND_ASSIGN(
3689       VPADDL_111100111d11ss00dddd0010pqm0mmmm_case_0);
3690 };
3691 
3692 // VPADD_floating_point_111100110d0snnnndddd1101nqm0mmmm_case_0:
3693 //
3694 //   {D: D(22),
3695 //    M: M(5),
3696 //    N: N(7),
3697 //    Q: Q(6),
3698 //    U: U(24),
3699 //    Vd: Vd(15:12),
3700 //    Vm: Vm(3:0),
3701 //    Vn: Vn(19:16),
3702 //    arch: ASIMD,
3703 //    d: D:Vd,
3704 //    defs: {},
3705 //    elements: 2,
3706 //    esize: 32,
3707 //    fields: [U(24),
3708 //      D(22),
3709 //      size(21:20),
3710 //      Vn(19:16),
3711 //      Vd(15:12),
3712 //      op(9),
3713 //      N(7),
3714 //      Q(6),
3715 //      M(5),
3716 //      Vm(3:0)],
3717 //    m: M:Vm,
3718 //    n: N:Vn,
3719 //    op: op(9),
3720 //    op1_neg: size(1),
3721 //    pattern: 111100110d0snnnndddd1101nqm0mmmm,
3722 //    rule: VPADD_floating_point,
3723 //    safety: [size(0)=1 ||
3724 //         Q(6)=1 => UNDEFINED],
3725 //    size: size(21:20),
3726 //    sz: size(0),
3727 //    uses: {}}
3728 class VPADD_floating_point_111100110d0snnnndddd1101nqm0mmmm_case_0
3729      : public ClassDecoder {
3730  public:
VPADD_floating_point_111100110d0snnnndddd1101nqm0mmmm_case_0()3731   VPADD_floating_point_111100110d0snnnndddd1101nqm0mmmm_case_0()
3732      : ClassDecoder() {}
3733   virtual RegisterList defs(Instruction inst) const;
3734   virtual SafetyLevel safety(Instruction i) const;
3735   virtual RegisterList uses(Instruction i) const;
3736  private:
3737   NACL_DISALLOW_COPY_AND_ASSIGN(
3738       VPADD_floating_point_111100110d0snnnndddd1101nqm0mmmm_case_0);
3739 };
3740 
3741 // VPADD_integer_111100100dssnnnndddd1011n0m1mmmm_case_0:
3742 //
3743 //   {D: D(22),
3744 //    M: M(5),
3745 //    N: N(7),
3746 //    Q: Q(6),
3747 //    U: U(24),
3748 //    Vd: Vd(15:12),
3749 //    Vm: Vm(3:0),
3750 //    Vn: Vn(19:16),
3751 //    arch: ASIMD,
3752 //    d: D:Vd,
3753 //    defs: {},
3754 //    elements: 64 / esize,
3755 //    esize: 8 << size,
3756 //    fields: [U(24),
3757 //      D(22),
3758 //      size(21:20),
3759 //      Vn(19:16),
3760 //      Vd(15:12),
3761 //      op(9),
3762 //      N(7),
3763 //      Q(6),
3764 //      M(5),
3765 //      Vm(3:0)],
3766 //    m: M:Vm,
3767 //    n: N:Vn,
3768 //    op: op(9),
3769 //    pattern: 111100100dssnnnndddd1011n0m1mmmm,
3770 //    rule: VPADD_integer,
3771 //    safety: [size(21:20)=11 => UNDEFINED, Q(6)=1 => UNDEFINED],
3772 //    size: size(21:20),
3773 //    unsigned: U(24)=1,
3774 //    uses: {}}
3775 class VPADD_integer_111100100dssnnnndddd1011n0m1mmmm_case_0
3776      : public ClassDecoder {
3777  public:
VPADD_integer_111100100dssnnnndddd1011n0m1mmmm_case_0()3778   VPADD_integer_111100100dssnnnndddd1011n0m1mmmm_case_0()
3779      : ClassDecoder() {}
3780   virtual RegisterList defs(Instruction inst) const;
3781   virtual SafetyLevel safety(Instruction i) const;
3782   virtual RegisterList uses(Instruction i) const;
3783  private:
3784   NACL_DISALLOW_COPY_AND_ASSIGN(
3785       VPADD_integer_111100100dssnnnndddd1011n0m1mmmm_case_0);
3786 };
3787 
3788 // VPMAX_111100110dssnnnndddd1111nqm0mmmm_case_0:
3789 //
3790 //   {D: D(22),
3791 //    M: M(5),
3792 //    N: N(7),
3793 //    Q: Q(6),
3794 //    U: U(24),
3795 //    Vd: Vd(15:12),
3796 //    Vm: Vm(3:0),
3797 //    Vn: Vn(19:16),
3798 //    arch: ASIMD,
3799 //    d: D:Vd,
3800 //    defs: {},
3801 //    elements: 2,
3802 //    esize: 32,
3803 //    fields: [U(24),
3804 //      D(22),
3805 //      size(21:20),
3806 //      Vn(19:16),
3807 //      Vd(15:12),
3808 //      op(9),
3809 //      N(7),
3810 //      Q(6),
3811 //      M(5),
3812 //      Vm(3:0)],
3813 //    m: M:Vm,
3814 //    n: N:Vn,
3815 //    op: op(9),
3816 //    op1_neg: size(1),
3817 //    pattern: 111100110dssnnnndddd1111nqm0mmmm,
3818 //    rule: VPMAX,
3819 //    safety: [size(0)=1 ||
3820 //         Q(6)=1 => UNDEFINED],
3821 //    size: size(21:20),
3822 //    sz: size(0),
3823 //    uses: {}}
3824 class VPMAX_111100110dssnnnndddd1111nqm0mmmm_case_0
3825      : public ClassDecoder {
3826  public:
VPMAX_111100110dssnnnndddd1111nqm0mmmm_case_0()3827   VPMAX_111100110dssnnnndddd1111nqm0mmmm_case_0()
3828      : ClassDecoder() {}
3829   virtual RegisterList defs(Instruction inst) const;
3830   virtual SafetyLevel safety(Instruction i) const;
3831   virtual RegisterList uses(Instruction i) const;
3832  private:
3833   NACL_DISALLOW_COPY_AND_ASSIGN(
3834       VPMAX_111100110dssnnnndddd1111nqm0mmmm_case_0);
3835 };
3836 
3837 // VPMAX_1111001u0dssnnnndddd1010n0m0mmmm_case_0:
3838 //
3839 //   {D: D(22),
3840 //    M: M(5),
3841 //    N: N(7),
3842 //    Q: Q(6),
3843 //    U: U(24),
3844 //    Vd: Vd(15:12),
3845 //    Vm: Vm(3:0),
3846 //    Vn: Vn(19:16),
3847 //    arch: ASIMD,
3848 //    d: D:Vd,
3849 //    defs: {},
3850 //    elements: 64 / esize,
3851 //    esize: 8 << size,
3852 //    fields: [U(24),
3853 //      D(22),
3854 //      size(21:20),
3855 //      Vn(19:16),
3856 //      Vd(15:12),
3857 //      op(9),
3858 //      N(7),
3859 //      Q(6),
3860 //      M(5),
3861 //      Vm(3:0)],
3862 //    m: M:Vm,
3863 //    n: N:Vn,
3864 //    op: op(9),
3865 //    pattern: 1111001u0dssnnnndddd1010n0m0mmmm,
3866 //    rule: VPMAX,
3867 //    safety: [size(21:20)=11 => UNDEFINED, Q(6)=1 => UNDEFINED],
3868 //    size: size(21:20),
3869 //    unsigned: U(24)=1,
3870 //    uses: {}}
3871 class VPMAX_1111001u0dssnnnndddd1010n0m0mmmm_case_0
3872      : public ClassDecoder {
3873  public:
VPMAX_1111001u0dssnnnndddd1010n0m0mmmm_case_0()3874   VPMAX_1111001u0dssnnnndddd1010n0m0mmmm_case_0()
3875      : ClassDecoder() {}
3876   virtual RegisterList defs(Instruction inst) const;
3877   virtual SafetyLevel safety(Instruction i) const;
3878   virtual RegisterList uses(Instruction i) const;
3879  private:
3880   NACL_DISALLOW_COPY_AND_ASSIGN(
3881       VPMAX_1111001u0dssnnnndddd1010n0m0mmmm_case_0);
3882 };
3883 
3884 // VPMIN_111100110dssnnnndddd1111nqm0mmmm_case_0:
3885 //
3886 //   {D: D(22),
3887 //    M: M(5),
3888 //    N: N(7),
3889 //    Q: Q(6),
3890 //    U: U(24),
3891 //    Vd: Vd(15:12),
3892 //    Vm: Vm(3:0),
3893 //    Vn: Vn(19:16),
3894 //    arch: ASIMD,
3895 //    d: D:Vd,
3896 //    defs: {},
3897 //    elements: 2,
3898 //    esize: 32,
3899 //    fields: [U(24),
3900 //      D(22),
3901 //      size(21:20),
3902 //      Vn(19:16),
3903 //      Vd(15:12),
3904 //      op(9),
3905 //      N(7),
3906 //      Q(6),
3907 //      M(5),
3908 //      Vm(3:0)],
3909 //    m: M:Vm,
3910 //    n: N:Vn,
3911 //    op: op(9),
3912 //    op1_neg: size(1),
3913 //    pattern: 111100110dssnnnndddd1111nqm0mmmm,
3914 //    rule: VPMIN,
3915 //    safety: [size(0)=1 ||
3916 //         Q(6)=1 => UNDEFINED],
3917 //    size: size(21:20),
3918 //    sz: size(0),
3919 //    uses: {}}
3920 class VPMIN_111100110dssnnnndddd1111nqm0mmmm_case_0
3921      : public ClassDecoder {
3922  public:
VPMIN_111100110dssnnnndddd1111nqm0mmmm_case_0()3923   VPMIN_111100110dssnnnndddd1111nqm0mmmm_case_0()
3924      : ClassDecoder() {}
3925   virtual RegisterList defs(Instruction inst) const;
3926   virtual SafetyLevel safety(Instruction i) const;
3927   virtual RegisterList uses(Instruction i) const;
3928  private:
3929   NACL_DISALLOW_COPY_AND_ASSIGN(
3930       VPMIN_111100110dssnnnndddd1111nqm0mmmm_case_0);
3931 };
3932 
3933 // VPMIN_1111001u0dssnnnndddd1010n0m1mmmm_case_0:
3934 //
3935 //   {D: D(22),
3936 //    M: M(5),
3937 //    N: N(7),
3938 //    Q: Q(6),
3939 //    U: U(24),
3940 //    Vd: Vd(15:12),
3941 //    Vm: Vm(3:0),
3942 //    Vn: Vn(19:16),
3943 //    arch: ASIMD,
3944 //    d: D:Vd,
3945 //    defs: {},
3946 //    elements: 64 / esize,
3947 //    esize: 8 << size,
3948 //    fields: [U(24),
3949 //      D(22),
3950 //      size(21:20),
3951 //      Vn(19:16),
3952 //      Vd(15:12),
3953 //      op(9),
3954 //      N(7),
3955 //      Q(6),
3956 //      M(5),
3957 //      Vm(3:0)],
3958 //    m: M:Vm,
3959 //    n: N:Vn,
3960 //    op: op(9),
3961 //    pattern: 1111001u0dssnnnndddd1010n0m1mmmm,
3962 //    rule: VPMIN,
3963 //    safety: [size(21:20)=11 => UNDEFINED, Q(6)=1 => UNDEFINED],
3964 //    size: size(21:20),
3965 //    unsigned: U(24)=1,
3966 //    uses: {}}
3967 class VPMIN_1111001u0dssnnnndddd1010n0m1mmmm_case_0
3968      : public ClassDecoder {
3969  public:
VPMIN_1111001u0dssnnnndddd1010n0m1mmmm_case_0()3970   VPMIN_1111001u0dssnnnndddd1010n0m1mmmm_case_0()
3971      : ClassDecoder() {}
3972   virtual RegisterList defs(Instruction inst) const;
3973   virtual SafetyLevel safety(Instruction i) const;
3974   virtual RegisterList uses(Instruction i) const;
3975  private:
3976   NACL_DISALLOW_COPY_AND_ASSIGN(
3977       VPMIN_1111001u0dssnnnndddd1010n0m1mmmm_case_0);
3978 };
3979 
3980 // VPOP_cccc11001d111101dddd1010iiiiiiii_case_0:
3981 //
3982 //   {D: D(22),
3983 //    Sp: 13,
3984 //    Vd: Vd(15:12),
3985 //    arch: VFPv2,
3986 //    base: Sp,
3987 //    cond: cond(31:28),
3988 //    d: Vd:D,
3989 //    defs: {Sp},
3990 //    fields: [cond(31:28), D(22), Vd(15:12), imm8(7:0)],
3991 //    imm32: ZeroExtend(imm8:'00'(1:0), 32),
3992 //    imm8: imm8(7:0),
3993 //    pattern: cccc11001d111101dddd1010iiiiiiii,
3994 //    regs: imm8,
3995 //    rule: VPOP,
3996 //    safety: [regs  ==
3997 //            0 ||
3998 //         d + regs  >
3999 //            32 => UNPREDICTABLE],
4000 //    single_regs: true,
4001 //    small_imm_base_wb: true,
4002 //    true: true,
4003 //    uses: {Sp},
4004 //    violations: [implied by 'base']}
4005 class VPOP_cccc11001d111101dddd1010iiiiiiii_case_0
4006      : public ClassDecoder {
4007  public:
VPOP_cccc11001d111101dddd1010iiiiiiii_case_0()4008   VPOP_cccc11001d111101dddd1010iiiiiiii_case_0()
4009      : ClassDecoder() {}
4010   virtual Register base_address_register(Instruction i) const;
4011   virtual RegisterList defs(Instruction inst) const;
4012   virtual SafetyLevel safety(Instruction i) const;
4013   virtual bool base_address_register_writeback_small_immediate(
4014       Instruction i) const;
4015   virtual RegisterList uses(Instruction i) const;
4016   virtual ViolationSet get_violations(
4017       const nacl_arm_val::DecodedInstruction& first,
4018       const nacl_arm_val::DecodedInstruction& second,
4019       const nacl_arm_val::SfiValidator& sfi,
4020       nacl_arm_val::AddressSet* branches,
4021       nacl_arm_val::AddressSet* critical,
4022       uint32_t* next_inst_addr) const;
4023  private:
4024   NACL_DISALLOW_COPY_AND_ASSIGN(
4025       VPOP_cccc11001d111101dddd1010iiiiiiii_case_0);
4026 };
4027 
4028 // VPOP_cccc11001d111101dddd1011iiiiiiii_case_0:
4029 //
4030 //   {D: D(22),
4031 //    Sp: 13,
4032 //    Vd: Vd(15:12),
4033 //    arch: ['VFPv2', 'AdvSIMD'],
4034 //    base: Sp,
4035 //    cond: cond(31:28),
4036 //    d: D:Vd,
4037 //    defs: {Sp},
4038 //    false: false,
4039 //    fields: [cond(31:28), D(22), Vd(15:12), imm8(7:0)],
4040 //    imm32: ZeroExtend(imm8:'00'(1:0), 32),
4041 //    imm8: imm8(7:0),
4042 //    pattern: cccc11001d111101dddd1011iiiiiiii,
4043 //    regs: imm8 / 2,
4044 //    rule: VPOP,
4045 //    safety: [regs  ==
4046 //            0 ||
4047 //         regs  >
4048 //            16 ||
4049 //         d + regs  >
4050 //            32 => UNPREDICTABLE,
4051 //      VFPSmallRegisterBank() &&
4052 //         d + regs  >
4053 //            16 => UNPREDICTABLE,
4054 //      imm8(0)  ==
4055 //            1 => DEPRECATED],
4056 //    single_regs: false,
4057 //    small_imm_base_wb: true,
4058 //    true: true,
4059 //    uses: {Sp},
4060 //    violations: [implied by 'base']}
4061 class VPOP_cccc11001d111101dddd1011iiiiiiii_case_0
4062      : public ClassDecoder {
4063  public:
VPOP_cccc11001d111101dddd1011iiiiiiii_case_0()4064   VPOP_cccc11001d111101dddd1011iiiiiiii_case_0()
4065      : ClassDecoder() {}
4066   virtual Register base_address_register(Instruction i) const;
4067   virtual RegisterList defs(Instruction inst) const;
4068   virtual SafetyLevel safety(Instruction i) const;
4069   virtual bool base_address_register_writeback_small_immediate(
4070       Instruction i) const;
4071   virtual RegisterList uses(Instruction i) const;
4072   virtual ViolationSet get_violations(
4073       const nacl_arm_val::DecodedInstruction& first,
4074       const nacl_arm_val::DecodedInstruction& second,
4075       const nacl_arm_val::SfiValidator& sfi,
4076       nacl_arm_val::AddressSet* branches,
4077       nacl_arm_val::AddressSet* critical,
4078       uint32_t* next_inst_addr) const;
4079  private:
4080   NACL_DISALLOW_COPY_AND_ASSIGN(
4081       VPOP_cccc11001d111101dddd1011iiiiiiii_case_0);
4082 };
4083 
4084 // VPUSH_cccc11010d101101dddd1010iiiiiiii_case_0:
4085 //
4086 //   {D: D(22),
4087 //    Sp: 13,
4088 //    Vd: Vd(15:12),
4089 //    arch: VFPv2,
4090 //    base: Sp,
4091 //    cond: cond(31:28),
4092 //    d: Vd:D,
4093 //    defs: {Sp},
4094 //    fields: [cond(31:28), D(22), Vd(15:12), imm8(7:0)],
4095 //    imm32: ZeroExtend(imm8:'00'(1:0), 32),
4096 //    imm8: imm8(7:0),
4097 //    pattern: cccc11010d101101dddd1010iiiiiiii,
4098 //    regs: imm8,
4099 //    rule: VPUSH,
4100 //    safety: [regs  ==
4101 //            0 ||
4102 //         d + regs  >
4103 //            32 => UNPREDICTABLE],
4104 //    single_regs: true,
4105 //    small_imm_base_wb: true,
4106 //    true: true,
4107 //    uses: {Sp},
4108 //    violations: [implied by 'base']}
4109 class VPUSH_cccc11010d101101dddd1010iiiiiiii_case_0
4110      : public ClassDecoder {
4111  public:
VPUSH_cccc11010d101101dddd1010iiiiiiii_case_0()4112   VPUSH_cccc11010d101101dddd1010iiiiiiii_case_0()
4113      : ClassDecoder() {}
4114   virtual Register base_address_register(Instruction i) const;
4115   virtual RegisterList defs(Instruction inst) const;
4116   virtual SafetyLevel safety(Instruction i) const;
4117   virtual bool base_address_register_writeback_small_immediate(
4118       Instruction i) const;
4119   virtual RegisterList uses(Instruction i) const;
4120   virtual ViolationSet get_violations(
4121       const nacl_arm_val::DecodedInstruction& first,
4122       const nacl_arm_val::DecodedInstruction& second,
4123       const nacl_arm_val::SfiValidator& sfi,
4124       nacl_arm_val::AddressSet* branches,
4125       nacl_arm_val::AddressSet* critical,
4126       uint32_t* next_inst_addr) const;
4127  private:
4128   NACL_DISALLOW_COPY_AND_ASSIGN(
4129       VPUSH_cccc11010d101101dddd1010iiiiiiii_case_0);
4130 };
4131 
4132 // VPUSH_cccc11010d101101dddd1011iiiiiiii_case_0:
4133 //
4134 //   {D: D(22),
4135 //    Sp: 13,
4136 //    Vd: Vd(15:12),
4137 //    arch: ['VFPv2', 'AdvSIMD'],
4138 //    base: Sp,
4139 //    cond: cond(31:28),
4140 //    d: D:Vd,
4141 //    defs: {Sp},
4142 //    false: false,
4143 //    fields: [cond(31:28), D(22), Vd(15:12), imm8(7:0)],
4144 //    imm32: ZeroExtend(imm8:'00'(1:0), 32),
4145 //    imm8: imm8(7:0),
4146 //    pattern: cccc11010d101101dddd1011iiiiiiii,
4147 //    regs: imm8 / 2,
4148 //    rule: VPUSH,
4149 //    safety: [regs  ==
4150 //            0 ||
4151 //         regs  >
4152 //            16 ||
4153 //         d + regs  >
4154 //            32 => UNPREDICTABLE,
4155 //      VFPSmallRegisterBank() &&
4156 //         d + regs  >
4157 //            16 => UNPREDICTABLE,
4158 //      imm8(0)  ==
4159 //            1 => DEPRECATED],
4160 //    single_regs: false,
4161 //    small_imm_base_wb: true,
4162 //    true: true,
4163 //    uses: {Sp},
4164 //    violations: [implied by 'base']}
4165 class VPUSH_cccc11010d101101dddd1011iiiiiiii_case_0
4166      : public ClassDecoder {
4167  public:
VPUSH_cccc11010d101101dddd1011iiiiiiii_case_0()4168   VPUSH_cccc11010d101101dddd1011iiiiiiii_case_0()
4169      : ClassDecoder() {}
4170   virtual Register base_address_register(Instruction i) const;
4171   virtual RegisterList defs(Instruction inst) const;
4172   virtual SafetyLevel safety(Instruction i) const;
4173   virtual bool base_address_register_writeback_small_immediate(
4174       Instruction i) const;
4175   virtual RegisterList uses(Instruction i) const;
4176   virtual ViolationSet get_violations(
4177       const nacl_arm_val::DecodedInstruction& first,
4178       const nacl_arm_val::DecodedInstruction& second,
4179       const nacl_arm_val::SfiValidator& sfi,
4180       nacl_arm_val::AddressSet* branches,
4181       nacl_arm_val::AddressSet* critical,
4182       uint32_t* next_inst_addr) const;
4183  private:
4184   NACL_DISALLOW_COPY_AND_ASSIGN(
4185       VPUSH_cccc11010d101101dddd1011iiiiiiii_case_0);
4186 };
4187 
4188 // VQABS_111100111d11ss00dddd01110qm0mmmm_case_0:
4189 //
4190 //   {D: D(22),
4191 //    F: F(10),
4192 //    M: M(5),
4193 //    Q: Q(6),
4194 //    Vd: Vd(15:12),
4195 //    Vm: Vm(3:0),
4196 //    arch: ASIMD,
4197 //    d: D:Vd,
4198 //    defs: {},
4199 //    elements: 64 / esize,
4200 //    esize: 8 << size,
4201 //    fields: [D(22),
4202 //      size(19:18),
4203 //      Vd(15:12),
4204 //      F(10),
4205 //      op(8:7),
4206 //      Q(6),
4207 //      M(5),
4208 //      Vm(3:0)],
4209 //    m: M:Vm,
4210 //    op: op(8:7),
4211 //    pattern: 111100111d11ss00dddd01110qm0mmmm,
4212 //    regs: 1
4213 //         if Q(6)=0
4214 //         else 2,
4215 //    rule: VQABS,
4216 //    safety: [size(19:18)=11 => UNDEFINED,
4217 //      Q(6)=1 &&
4218 //         (Vd(0)=1 ||
4219 //         Vm(0)=1) => UNDEFINED],
4220 //    size: size(19:18),
4221 //    uses: {}}
4222 class VQABS_111100111d11ss00dddd01110qm0mmmm_case_0
4223      : public ClassDecoder {
4224  public:
VQABS_111100111d11ss00dddd01110qm0mmmm_case_0()4225   VQABS_111100111d11ss00dddd01110qm0mmmm_case_0()
4226      : ClassDecoder() {}
4227   virtual RegisterList defs(Instruction inst) const;
4228   virtual SafetyLevel safety(Instruction i) const;
4229   virtual RegisterList uses(Instruction i) const;
4230  private:
4231   NACL_DISALLOW_COPY_AND_ASSIGN(
4232       VQABS_111100111d11ss00dddd01110qm0mmmm_case_0);
4233 };
4234 
4235 // VQADD_1111001u0dssnnnndddd0000nqm1mmmm_case_0:
4236 //
4237 //   {D: D(22),
4238 //    M: M(5),
4239 //    N: N(7),
4240 //    Q: Q(6),
4241 //    U: U(24),
4242 //    Vd: Vd(15:12),
4243 //    Vm: Vm(3:0),
4244 //    Vn: Vn(19:16),
4245 //    arch: ASIMD,
4246 //    d: D:Vd,
4247 //    defs: {},
4248 //    elements: 64 / esize,
4249 //    esize: 8 << size,
4250 //    fields: [U(24),
4251 //      D(22),
4252 //      size(21:20),
4253 //      Vn(19:16),
4254 //      Vd(15:12),
4255 //      op(9),
4256 //      N(7),
4257 //      Q(6),
4258 //      M(5),
4259 //      Vm(3:0)],
4260 //    m: M:Vm,
4261 //    n: N:Vn,
4262 //    op: op(9),
4263 //    pattern: 1111001u0dssnnnndddd0000nqm1mmmm,
4264 //    regs: 1
4265 //         if Q(6)=0
4266 //         else 2,
4267 //    rule: VQADD,
4268 //    safety: [Q(6)=1 &&
4269 //         (Vd(0)=1 ||
4270 //         Vn(0)=1 ||
4271 //         Vm(0)=1) => UNDEFINED],
4272 //    size: size(21:20),
4273 //    unsigned: U(24)=1,
4274 //    uses: {}}
4275 class VQADD_1111001u0dssnnnndddd0000nqm1mmmm_case_0
4276      : public ClassDecoder {
4277  public:
VQADD_1111001u0dssnnnndddd0000nqm1mmmm_case_0()4278   VQADD_1111001u0dssnnnndddd0000nqm1mmmm_case_0()
4279      : ClassDecoder() {}
4280   virtual RegisterList defs(Instruction inst) const;
4281   virtual SafetyLevel safety(Instruction i) const;
4282   virtual RegisterList uses(Instruction i) const;
4283  private:
4284   NACL_DISALLOW_COPY_AND_ASSIGN(
4285       VQADD_1111001u0dssnnnndddd0000nqm1mmmm_case_0);
4286 };
4287 
4288 // VQDMLAL_A1_111100101dssnnnndddd0p11n1m0mmmm_case_0:
4289 //
4290 //   {D: D(22),
4291 //    F: F(8),
4292 //    M: M(5),
4293 //    N: N(7),
4294 //    Q: Q(24),
4295 //    Vd: Vd(15:12),
4296 //    Vm: Vm(3:0),
4297 //    Vn: Vn(19:16),
4298 //    arch: ASIMD,
4299 //    d: D:Vd,
4300 //    defs: {},
4301 //    elements: 64 / esize,
4302 //    esize: 8 << size,
4303 //    fields: [Q(24),
4304 //      D(22),
4305 //      size(21:20),
4306 //      Vn(19:16),
4307 //      Vd(15:12),
4308 //      op(10),
4309 //      F(8),
4310 //      N(7),
4311 //      M(5),
4312 //      Vm(3:0)],
4313 //    index: M:Vm(3)
4314 //         if size(21:20)=01
4315 //         else M,
4316 //    m: Vm(2:0)
4317 //         if size(21:20)=01
4318 //         else Vm,
4319 //    n: N:Vn,
4320 //    op: op(10),
4321 //    pattern: 111100101dssnnnndddd0p11n1m0mmmm,
4322 //    regs: 1,
4323 //    rule: VQDMLAL_A1,
4324 //    safety: [size(21:20)=11 => DECODER_ERROR,
4325 //      (size(21:20)=00 ||
4326 //         Vd(0)=1) => UNDEFINED],
4327 //    size: size(21:20),
4328 //    unsigned: Q(24)=1,
4329 //    uses: {}}
4330 class VQDMLAL_A1_111100101dssnnnndddd0p11n1m0mmmm_case_0
4331      : public ClassDecoder {
4332  public:
VQDMLAL_A1_111100101dssnnnndddd0p11n1m0mmmm_case_0()4333   VQDMLAL_A1_111100101dssnnnndddd0p11n1m0mmmm_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       VQDMLAL_A1_111100101dssnnnndddd0p11n1m0mmmm_case_0);
4341 };
4342 
4343 // VQDMLAL_VQDMLSL_A1_111100101dssnnnndddd10p1n0m0mmmm_case_0:
4344 //
4345 //   {D: D(22),
4346 //    M: M(5),
4347 //    N: N(7),
4348 //    U: U(24),
4349 //    Vd: Vd(15:12),
4350 //    Vm: Vm(3:0),
4351 //    Vn: Vn(19:16),
4352 //    add: op(8)=0,
4353 //    d: D:Vd,
4354 //    defs: {},
4355 //    elements: 64 / esize,
4356 //    esize: 8 << size,
4357 //    fields: [U(24),
4358 //      D(22),
4359 //      size(21:20),
4360 //      Vn(19:16),
4361 //      Vd(15:12),
4362 //      op(8),
4363 //      N(7),
4364 //      M(5),
4365 //      Vm(3:0)],
4366 //    m: Vm(2:0)
4367 //         if size(21:20)=01
4368 //         else Vm,
4369 //    n: N:Vn,
4370 //    op: op(8),
4371 //    pattern: 111100101dssnnnndddd10p1n0m0mmmm,
4372 //    rule: VQDMLAL_VQDMLSL_A1,
4373 //    safety: [size(21:20)=11 => DECODER_ERROR,
4374 //      size(21:20)=00 ||
4375 //         Vd(0)=1 => UNDEFINED],
4376 //    size: size(21:20),
4377 //    unsigned: U(24)=1,
4378 //    uses: {}}
4379 class VQDMLAL_VQDMLSL_A1_111100101dssnnnndddd10p1n0m0mmmm_case_0
4380      : public ClassDecoder {
4381  public:
VQDMLAL_VQDMLSL_A1_111100101dssnnnndddd10p1n0m0mmmm_case_0()4382   VQDMLAL_VQDMLSL_A1_111100101dssnnnndddd10p1n0m0mmmm_case_0()
4383      : ClassDecoder() {}
4384   virtual RegisterList defs(Instruction inst) const;
4385   virtual SafetyLevel safety(Instruction i) const;
4386   virtual RegisterList uses(Instruction i) const;
4387  private:
4388   NACL_DISALLOW_COPY_AND_ASSIGN(
4389       VQDMLAL_VQDMLSL_A1_111100101dssnnnndddd10p1n0m0mmmm_case_0);
4390 };
4391 
4392 // VQDMLSL_A1_111100101dssnnnndddd0p11n1m0mmmm_case_0:
4393 //
4394 //   {D: D(22),
4395 //    F: F(8),
4396 //    M: M(5),
4397 //    N: N(7),
4398 //    Q: Q(24),
4399 //    Vd: Vd(15:12),
4400 //    Vm: Vm(3:0),
4401 //    Vn: Vn(19:16),
4402 //    arch: ASIMD,
4403 //    d: D:Vd,
4404 //    defs: {},
4405 //    elements: 64 / esize,
4406 //    esize: 8 << size,
4407 //    fields: [Q(24),
4408 //      D(22),
4409 //      size(21:20),
4410 //      Vn(19:16),
4411 //      Vd(15:12),
4412 //      op(10),
4413 //      F(8),
4414 //      N(7),
4415 //      M(5),
4416 //      Vm(3:0)],
4417 //    index: M:Vm(3)
4418 //         if size(21:20)=01
4419 //         else M,
4420 //    m: Vm(2:0)
4421 //         if size(21:20)=01
4422 //         else Vm,
4423 //    n: N:Vn,
4424 //    op: op(10),
4425 //    pattern: 111100101dssnnnndddd0p11n1m0mmmm,
4426 //    regs: 1,
4427 //    rule: VQDMLSL_A1,
4428 //    safety: [size(21:20)=11 => DECODER_ERROR,
4429 //      (size(21:20)=00 ||
4430 //         Vd(0)=1) => UNDEFINED],
4431 //    size: size(21:20),
4432 //    unsigned: Q(24)=1,
4433 //    uses: {}}
4434 class VQDMLSL_A1_111100101dssnnnndddd0p11n1m0mmmm_case_0
4435      : public ClassDecoder {
4436  public:
VQDMLSL_A1_111100101dssnnnndddd0p11n1m0mmmm_case_0()4437   VQDMLSL_A1_111100101dssnnnndddd0p11n1m0mmmm_case_0()
4438      : ClassDecoder() {}
4439   virtual RegisterList defs(Instruction inst) const;
4440   virtual SafetyLevel safety(Instruction i) const;
4441   virtual RegisterList uses(Instruction i) const;
4442  private:
4443   NACL_DISALLOW_COPY_AND_ASSIGN(
4444       VQDMLSL_A1_111100101dssnnnndddd0p11n1m0mmmm_case_0);
4445 };
4446 
4447 // VQDMULH_A1_111100100dssnnnndddd1011nqm0mmmm_case_0:
4448 //
4449 //   {D: D(22),
4450 //    M: M(5),
4451 //    N: N(7),
4452 //    Q: Q(6),
4453 //    U: U(24),
4454 //    Vd: Vd(15:12),
4455 //    Vm: Vm(3:0),
4456 //    Vn: Vn(19:16),
4457 //    arch: ASIMD,
4458 //    d: D:Vd,
4459 //    defs: {},
4460 //    elements: 64 / esize,
4461 //    esize: 8 << size,
4462 //    fields: [U(24),
4463 //      D(22),
4464 //      size(21:20),
4465 //      Vn(19:16),
4466 //      Vd(15:12),
4467 //      op(9),
4468 //      N(7),
4469 //      Q(6),
4470 //      M(5),
4471 //      Vm(3:0)],
4472 //    m: M:Vm,
4473 //    n: N:Vn,
4474 //    op: op(9),
4475 //    pattern: 111100100dssnnnndddd1011nqm0mmmm,
4476 //    regs: 1
4477 //         if Q(6)=0
4478 //         else 2,
4479 //    rule: VQDMULH_A1,
4480 //    safety: [Q(6)=1 &&
4481 //         (Vd(0)=1 ||
4482 //         Vn(0)=1 ||
4483 //         Vm(0)=1) => UNDEFINED,
4484 //      (size(21:20)=11 ||
4485 //         size(21:20)=00) => UNDEFINED],
4486 //    size: size(21:20),
4487 //    unsigned: U(24)=1,
4488 //    uses: {}}
4489 class VQDMULH_A1_111100100dssnnnndddd1011nqm0mmmm_case_0
4490      : public ClassDecoder {
4491  public:
VQDMULH_A1_111100100dssnnnndddd1011nqm0mmmm_case_0()4492   VQDMULH_A1_111100100dssnnnndddd1011nqm0mmmm_case_0()
4493      : ClassDecoder() {}
4494   virtual RegisterList defs(Instruction inst) const;
4495   virtual SafetyLevel safety(Instruction i) const;
4496   virtual RegisterList uses(Instruction i) const;
4497  private:
4498   NACL_DISALLOW_COPY_AND_ASSIGN(
4499       VQDMULH_A1_111100100dssnnnndddd1011nqm0mmmm_case_0);
4500 };
4501 
4502 // VQDMULH_A2_1111001q1dssnnnndddd1100n1m0mmmm_case_0:
4503 //
4504 //   {D: D(22),
4505 //    F: F(8),
4506 //    M: M(5),
4507 //    N: N(7),
4508 //    Q: Q(24),
4509 //    Vd: Vd(15:12),
4510 //    Vm: Vm(3:0),
4511 //    Vn: Vn(19:16),
4512 //    arch: ASIMD,
4513 //    d: D:Vd,
4514 //    defs: {},
4515 //    elements: 64 / esize,
4516 //    esize: 8 << size,
4517 //    fields: [Q(24),
4518 //      D(22),
4519 //      size(21:20),
4520 //      Vn(19:16),
4521 //      Vd(15:12),
4522 //      op(10),
4523 //      F(8),
4524 //      N(7),
4525 //      M(5),
4526 //      Vm(3:0)],
4527 //    index: M:Vm(3)
4528 //         if size(21:20)=01
4529 //         else M,
4530 //    m: Vm(2:0)
4531 //         if size(21:20)=01
4532 //         else Vm,
4533 //    n: N:Vn,
4534 //    op: op(10),
4535 //    pattern: 1111001q1dssnnnndddd1100n1m0mmmm,
4536 //    regs: 1
4537 //         if Q(24)=0
4538 //         else 2,
4539 //    rule: VQDMULH_A2,
4540 //    safety: [size(21:20)=11 => DECODER_ERROR,
4541 //      size(21:20)=00 => UNDEFINED,
4542 //      Q(24)=1 &&
4543 //         (Vd(0)=1 ||
4544 //         Vn(0)=1) => UNDEFINED],
4545 //    size: size(21:20),
4546 //    uses: {}}
4547 class VQDMULH_A2_1111001q1dssnnnndddd1100n1m0mmmm_case_0
4548      : public ClassDecoder {
4549  public:
VQDMULH_A2_1111001q1dssnnnndddd1100n1m0mmmm_case_0()4550   VQDMULH_A2_1111001q1dssnnnndddd1100n1m0mmmm_case_0()
4551      : ClassDecoder() {}
4552   virtual RegisterList defs(Instruction inst) const;
4553   virtual SafetyLevel safety(Instruction i) const;
4554   virtual RegisterList uses(Instruction i) const;
4555  private:
4556   NACL_DISALLOW_COPY_AND_ASSIGN(
4557       VQDMULH_A2_1111001q1dssnnnndddd1100n1m0mmmm_case_0);
4558 };
4559 
4560 // VQDMULL_A1_111100101dssnnnndddd1101n0m0mmmm_case_0:
4561 //
4562 //   {D: D(22),
4563 //    M: M(5),
4564 //    N: N(7),
4565 //    U: U(24),
4566 //    Vd: Vd(15:12),
4567 //    Vm: Vm(3:0),
4568 //    Vn: Vn(19:16),
4569 //    add: op(8)=0,
4570 //    d: D:Vd,
4571 //    defs: {},
4572 //    elements: 64 / esize,
4573 //    esize: 8 << size,
4574 //    fields: [U(24),
4575 //      D(22),
4576 //      size(21:20),
4577 //      Vn(19:16),
4578 //      Vd(15:12),
4579 //      op(8),
4580 //      N(7),
4581 //      M(5),
4582 //      Vm(3:0)],
4583 //    m: Vm(2:0)
4584 //         if size(21:20)=01
4585 //         else Vm,
4586 //    n: N:Vn,
4587 //    op: op(8),
4588 //    pattern: 111100101dssnnnndddd1101n0m0mmmm,
4589 //    rule: VQDMULL_A1,
4590 //    safety: [size(21:20)=11 => DECODER_ERROR,
4591 //      size(21:20)=00 ||
4592 //         Vd(0)=1 => UNDEFINED],
4593 //    size: size(21:20),
4594 //    unsigned: U(24)=1,
4595 //    uses: {}}
4596 class VQDMULL_A1_111100101dssnnnndddd1101n0m0mmmm_case_0
4597      : public ClassDecoder {
4598  public:
VQDMULL_A1_111100101dssnnnndddd1101n0m0mmmm_case_0()4599   VQDMULL_A1_111100101dssnnnndddd1101n0m0mmmm_case_0()
4600      : ClassDecoder() {}
4601   virtual RegisterList defs(Instruction inst) const;
4602   virtual SafetyLevel safety(Instruction i) const;
4603   virtual RegisterList uses(Instruction i) const;
4604  private:
4605   NACL_DISALLOW_COPY_AND_ASSIGN(
4606       VQDMULL_A1_111100101dssnnnndddd1101n0m0mmmm_case_0);
4607 };
4608 
4609 // VQDMULL_A2_111100101dssnnnndddd1011n1m0mmmm_case_0:
4610 //
4611 //   {D: D(22),
4612 //    F: F(8),
4613 //    M: M(5),
4614 //    N: N(7),
4615 //    Q: Q(24),
4616 //    Vd: Vd(15:12),
4617 //    Vm: Vm(3:0),
4618 //    Vn: Vn(19:16),
4619 //    arch: ASIMD,
4620 //    d: D:Vd,
4621 //    defs: {},
4622 //    elements: 64 / esize,
4623 //    esize: 8 << size,
4624 //    fields: [Q(24),
4625 //      D(22),
4626 //      size(21:20),
4627 //      Vn(19:16),
4628 //      Vd(15:12),
4629 //      op(10),
4630 //      F(8),
4631 //      N(7),
4632 //      M(5),
4633 //      Vm(3:0)],
4634 //    index: M:Vm(3)
4635 //         if size(21:20)=01
4636 //         else M,
4637 //    m: Vm(2:0)
4638 //         if size(21:20)=01
4639 //         else Vm,
4640 //    n: N:Vn,
4641 //    op: op(10),
4642 //    pattern: 111100101dssnnnndddd1011n1m0mmmm,
4643 //    regs: 1,
4644 //    rule: VQDMULL_A2,
4645 //    safety: [size(21:20)=11 => DECODER_ERROR,
4646 //      (size(21:20)=00 ||
4647 //         Vd(0)=1) => UNDEFINED],
4648 //    size: size(21:20),
4649 //    unsigned: Q(24)=1,
4650 //    uses: {}}
4651 class VQDMULL_A2_111100101dssnnnndddd1011n1m0mmmm_case_0
4652      : public ClassDecoder {
4653  public:
VQDMULL_A2_111100101dssnnnndddd1011n1m0mmmm_case_0()4654   VQDMULL_A2_111100101dssnnnndddd1011n1m0mmmm_case_0()
4655      : ClassDecoder() {}
4656   virtual RegisterList defs(Instruction inst) const;
4657   virtual SafetyLevel safety(Instruction i) const;
4658   virtual RegisterList uses(Instruction i) const;
4659  private:
4660   NACL_DISALLOW_COPY_AND_ASSIGN(
4661       VQDMULL_A2_111100101dssnnnndddd1011n1m0mmmm_case_0);
4662 };
4663 
4664 // VQMOVN_111100111d11ss10dddd0010ppm0mmmm_case_0:
4665 //
4666 //   {D: D(22),
4667 //    M: M(5),
4668 //    Vd: Vd(15:12),
4669 //    Vm: Vm(3:0),
4670 //    arch: ASIMD,
4671 //    d: D:Vd,
4672 //    defs: {},
4673 //    dest_unsigned: op(0)=1,
4674 //    fields: [D(22), size(19:18), Vd(15:12), op(7:6), M(5), Vm(3:0)],
4675 //    m: M:Vm,
4676 //    op: op(7:6),
4677 //    pattern: 111100111d11ss10dddd0010ppm0mmmm,
4678 //    rule: VQMOVN,
4679 //    safety: [op(7:6)=00 => DECODER_ERROR,
4680 //      size(19:18)=11 ||
4681 //         Vm(0)=1 => UNDEFINED],
4682 //    size: size(19:18),
4683 //    src_unsigned: op(7:6)=11,
4684 //    uses: {}}
4685 class VQMOVN_111100111d11ss10dddd0010ppm0mmmm_case_0
4686      : public ClassDecoder {
4687  public:
VQMOVN_111100111d11ss10dddd0010ppm0mmmm_case_0()4688   VQMOVN_111100111d11ss10dddd0010ppm0mmmm_case_0()
4689      : ClassDecoder() {}
4690   virtual RegisterList defs(Instruction inst) const;
4691   virtual SafetyLevel safety(Instruction i) const;
4692   virtual RegisterList uses(Instruction i) const;
4693  private:
4694   NACL_DISALLOW_COPY_AND_ASSIGN(
4695       VQMOVN_111100111d11ss10dddd0010ppm0mmmm_case_0);
4696 };
4697 
4698 // VQMOVUN_111100111d11ss10dddd0010ppm0mmmm_case_0:
4699 //
4700 //   {D: D(22),
4701 //    M: M(5),
4702 //    Vd: Vd(15:12),
4703 //    Vm: Vm(3:0),
4704 //    arch: ASIMD,
4705 //    d: D:Vd,
4706 //    defs: {},
4707 //    dest_unsigned: op(0)=1,
4708 //    fields: [D(22), size(19:18), Vd(15:12), op(7:6), M(5), Vm(3:0)],
4709 //    m: M:Vm,
4710 //    op: op(7:6),
4711 //    pattern: 111100111d11ss10dddd0010ppm0mmmm,
4712 //    rule: VQMOVUN,
4713 //    safety: [op(7:6)=00 => DECODER_ERROR,
4714 //      size(19:18)=11 ||
4715 //         Vm(0)=1 => UNDEFINED],
4716 //    size: size(19:18),
4717 //    src_unsigned: op(7:6)=11,
4718 //    uses: {}}
4719 class VQMOVUN_111100111d11ss10dddd0010ppm0mmmm_case_0
4720      : public ClassDecoder {
4721  public:
VQMOVUN_111100111d11ss10dddd0010ppm0mmmm_case_0()4722   VQMOVUN_111100111d11ss10dddd0010ppm0mmmm_case_0()
4723      : ClassDecoder() {}
4724   virtual RegisterList defs(Instruction inst) const;
4725   virtual SafetyLevel safety(Instruction i) const;
4726   virtual RegisterList uses(Instruction i) const;
4727  private:
4728   NACL_DISALLOW_COPY_AND_ASSIGN(
4729       VQMOVUN_111100111d11ss10dddd0010ppm0mmmm_case_0);
4730 };
4731 
4732 // VQNEG_111100111d11ss00dddd01111qm0mmmm_case_0:
4733 //
4734 //   {D: D(22),
4735 //    F: F(10),
4736 //    M: M(5),
4737 //    Q: Q(6),
4738 //    Vd: Vd(15:12),
4739 //    Vm: Vm(3:0),
4740 //    arch: ASIMD,
4741 //    d: D:Vd,
4742 //    defs: {},
4743 //    elements: 64 / esize,
4744 //    esize: 8 << size,
4745 //    fields: [D(22),
4746 //      size(19:18),
4747 //      Vd(15:12),
4748 //      F(10),
4749 //      op(8:7),
4750 //      Q(6),
4751 //      M(5),
4752 //      Vm(3:0)],
4753 //    m: M:Vm,
4754 //    op: op(8:7),
4755 //    pattern: 111100111d11ss00dddd01111qm0mmmm,
4756 //    regs: 1
4757 //         if Q(6)=0
4758 //         else 2,
4759 //    rule: VQNEG,
4760 //    safety: [size(19:18)=11 => UNDEFINED,
4761 //      Q(6)=1 &&
4762 //         (Vd(0)=1 ||
4763 //         Vm(0)=1) => UNDEFINED],
4764 //    size: size(19:18),
4765 //    uses: {}}
4766 class VQNEG_111100111d11ss00dddd01111qm0mmmm_case_0
4767      : public ClassDecoder {
4768  public:
VQNEG_111100111d11ss00dddd01111qm0mmmm_case_0()4769   VQNEG_111100111d11ss00dddd01111qm0mmmm_case_0()
4770      : ClassDecoder() {}
4771   virtual RegisterList defs(Instruction inst) const;
4772   virtual SafetyLevel safety(Instruction i) const;
4773   virtual RegisterList uses(Instruction i) const;
4774  private:
4775   NACL_DISALLOW_COPY_AND_ASSIGN(
4776       VQNEG_111100111d11ss00dddd01111qm0mmmm_case_0);
4777 };
4778 
4779 // VQRDMULH_1111001q1dssnnnndddd1101n1m0mmmm_case_0:
4780 //
4781 //   {D: D(22),
4782 //    F: F(8),
4783 //    M: M(5),
4784 //    N: N(7),
4785 //    Q: Q(24),
4786 //    Vd: Vd(15:12),
4787 //    Vm: Vm(3:0),
4788 //    Vn: Vn(19:16),
4789 //    arch: ASIMD,
4790 //    d: D:Vd,
4791 //    defs: {},
4792 //    elements: 64 / esize,
4793 //    esize: 8 << size,
4794 //    fields: [Q(24),
4795 //      D(22),
4796 //      size(21:20),
4797 //      Vn(19:16),
4798 //      Vd(15:12),
4799 //      op(10),
4800 //      F(8),
4801 //      N(7),
4802 //      M(5),
4803 //      Vm(3:0)],
4804 //    index: M:Vm(3)
4805 //         if size(21:20)=01
4806 //         else M,
4807 //    m: Vm(2:0)
4808 //         if size(21:20)=01
4809 //         else Vm,
4810 //    n: N:Vn,
4811 //    op: op(10),
4812 //    pattern: 1111001q1dssnnnndddd1101n1m0mmmm,
4813 //    regs: 1
4814 //         if Q(24)=0
4815 //         else 2,
4816 //    rule: VQRDMULH,
4817 //    safety: [size(21:20)=11 => DECODER_ERROR,
4818 //      size(21:20)=00 => UNDEFINED,
4819 //      Q(24)=1 &&
4820 //         (Vd(0)=1 ||
4821 //         Vn(0)=1) => UNDEFINED],
4822 //    size: size(21:20),
4823 //    uses: {}}
4824 class VQRDMULH_1111001q1dssnnnndddd1101n1m0mmmm_case_0
4825      : public ClassDecoder {
4826  public:
VQRDMULH_1111001q1dssnnnndddd1101n1m0mmmm_case_0()4827   VQRDMULH_1111001q1dssnnnndddd1101n1m0mmmm_case_0()
4828      : ClassDecoder() {}
4829   virtual RegisterList defs(Instruction inst) const;
4830   virtual SafetyLevel safety(Instruction i) const;
4831   virtual RegisterList uses(Instruction i) const;
4832  private:
4833   NACL_DISALLOW_COPY_AND_ASSIGN(
4834       VQRDMULH_1111001q1dssnnnndddd1101n1m0mmmm_case_0);
4835 };
4836 
4837 // VQRDMULH_A1_111100110dssnnnndddd1011nqm0mmmm_case_0:
4838 //
4839 //   {D: D(22),
4840 //    M: M(5),
4841 //    N: N(7),
4842 //    Q: Q(6),
4843 //    U: U(24),
4844 //    Vd: Vd(15:12),
4845 //    Vm: Vm(3:0),
4846 //    Vn: Vn(19:16),
4847 //    arch: ASIMD,
4848 //    d: D:Vd,
4849 //    defs: {},
4850 //    elements: 64 / esize,
4851 //    esize: 8 << size,
4852 //    fields: [U(24),
4853 //      D(22),
4854 //      size(21:20),
4855 //      Vn(19:16),
4856 //      Vd(15:12),
4857 //      op(9),
4858 //      N(7),
4859 //      Q(6),
4860 //      M(5),
4861 //      Vm(3:0)],
4862 //    m: M:Vm,
4863 //    n: N:Vn,
4864 //    op: op(9),
4865 //    pattern: 111100110dssnnnndddd1011nqm0mmmm,
4866 //    regs: 1
4867 //         if Q(6)=0
4868 //         else 2,
4869 //    rule: VQRDMULH_A1,
4870 //    safety: [Q(6)=1 &&
4871 //         (Vd(0)=1 ||
4872 //         Vn(0)=1 ||
4873 //         Vm(0)=1) => UNDEFINED,
4874 //      (size(21:20)=11 ||
4875 //         size(21:20)=00) => UNDEFINED],
4876 //    size: size(21:20),
4877 //    unsigned: U(24)=1,
4878 //    uses: {}}
4879 class VQRDMULH_A1_111100110dssnnnndddd1011nqm0mmmm_case_0
4880      : public ClassDecoder {
4881  public:
VQRDMULH_A1_111100110dssnnnndddd1011nqm0mmmm_case_0()4882   VQRDMULH_A1_111100110dssnnnndddd1011nqm0mmmm_case_0()
4883      : ClassDecoder() {}
4884   virtual RegisterList defs(Instruction inst) const;
4885   virtual SafetyLevel safety(Instruction i) const;
4886   virtual RegisterList uses(Instruction i) const;
4887  private:
4888   NACL_DISALLOW_COPY_AND_ASSIGN(
4889       VQRDMULH_A1_111100110dssnnnndddd1011nqm0mmmm_case_0);
4890 };
4891 
4892 // VQRSHL_1111001u0dssnnnndddd0101nqm1mmmm_case_0:
4893 //
4894 //   {D: D(22),
4895 //    M: M(5),
4896 //    N: N(7),
4897 //    Q: Q(6),
4898 //    U: U(24),
4899 //    Vd: Vd(15:12),
4900 //    Vm: Vm(3:0),
4901 //    Vn: Vn(19:16),
4902 //    arch: ASIMD,
4903 //    d: D:Vd,
4904 //    defs: {},
4905 //    elements: 64 / esize,
4906 //    esize: 8 << size,
4907 //    fields: [U(24),
4908 //      D(22),
4909 //      size(21:20),
4910 //      Vn(19:16),
4911 //      Vd(15:12),
4912 //      op(9),
4913 //      N(7),
4914 //      Q(6),
4915 //      M(5),
4916 //      Vm(3:0)],
4917 //    m: M:Vm,
4918 //    n: N:Vn,
4919 //    op: op(9),
4920 //    pattern: 1111001u0dssnnnndddd0101nqm1mmmm,
4921 //    regs: 1
4922 //         if Q(6)=0
4923 //         else 2,
4924 //    rule: VQRSHL,
4925 //    safety: [Q(6)=1 &&
4926 //         (Vd(0)=1 ||
4927 //         Vn(0)=1 ||
4928 //         Vm(0)=1) => UNDEFINED],
4929 //    size: size(21:20),
4930 //    unsigned: U(24)=1,
4931 //    uses: {}}
4932 class VQRSHL_1111001u0dssnnnndddd0101nqm1mmmm_case_0
4933      : public ClassDecoder {
4934  public:
VQRSHL_1111001u0dssnnnndddd0101nqm1mmmm_case_0()4935   VQRSHL_1111001u0dssnnnndddd0101nqm1mmmm_case_0()
4936      : ClassDecoder() {}
4937   virtual RegisterList defs(Instruction inst) const;
4938   virtual SafetyLevel safety(Instruction i) const;
4939   virtual RegisterList uses(Instruction i) const;
4940  private:
4941   NACL_DISALLOW_COPY_AND_ASSIGN(
4942       VQRSHL_1111001u0dssnnnndddd0101nqm1mmmm_case_0);
4943 };
4944 
4945 // VQRSHRN_1111001u1diiiiiidddd100p01m1mmmm_case_0:
4946 //
4947 //   {D: D(22),
4948 //    L: L(7),
4949 //    M: M(5),
4950 //    Q: Q(6),
4951 //    U: U(24),
4952 //    Vd: Vd(15:12),
4953 //    Vm: Vm(3:0),
4954 //    arch: ASIMD,
4955 //    d: D:Vd,
4956 //    defs: {},
4957 //    dest_unsigned: U(24)=1,
4958 //    elements: 8
4959 //         if imm6(21:16)=001xxx
4960 //         else 4
4961 //         if imm6(21:16)=01xxxx
4962 //         else 2
4963 //         if imm6(21:16)=1xxxxx
4964 //         else 0,
4965 //    esize: 8
4966 //         if imm6(21:16)=001xxx
4967 //         else 16
4968 //         if imm6(21:16)=01xxxx
4969 //         else 32
4970 //         if imm6(21:16)=1xxxxx
4971 //         else 0,
4972 //    fields: [U(24),
4973 //      D(22),
4974 //      imm6(21:16),
4975 //      Vd(15:12),
4976 //      op(8),
4977 //      L(7),
4978 //      Q(6),
4979 //      M(5),
4980 //      Vm(3:0)],
4981 //    imm6: imm6(21:16),
4982 //    n: M:Vm,
4983 //    op: op(8),
4984 //    pattern: 1111001u1diiiiiidddd100p01m1mmmm,
4985 //    regs: 1
4986 //         if Q(6)=0
4987 //         else 2,
4988 //    rule: VQRSHRN,
4989 //    safety: [imm6(21:16)=000xxx => DECODER_ERROR,
4990 //      Vm(0)=1 => UNDEFINED,
4991 //      U(24)=0 &&
4992 //         op(8)=0 => DECODER_ERROR],
4993 //    shift_amount: 16 - imm6
4994 //         if imm6(21:16)=001xxx
4995 //         else 32 - imm6
4996 //         if imm6(21:16)=01xxxx
4997 //         else 64 - imm6
4998 //         if imm6(21:16)=1xxxxx
4999 //         else 0,
5000 //    src_unsigned: U(24)=1 &&
5001 //         op(8)=1,
5002 //    uses: {}}
5003 class VQRSHRN_1111001u1diiiiiidddd100p01m1mmmm_case_0
5004      : public ClassDecoder {
5005  public:
VQRSHRN_1111001u1diiiiiidddd100p01m1mmmm_case_0()5006   VQRSHRN_1111001u1diiiiiidddd100p01m1mmmm_case_0()
5007      : ClassDecoder() {}
5008   virtual RegisterList defs(Instruction inst) const;
5009   virtual SafetyLevel safety(Instruction i) const;
5010   virtual RegisterList uses(Instruction i) const;
5011  private:
5012   NACL_DISALLOW_COPY_AND_ASSIGN(
5013       VQRSHRN_1111001u1diiiiiidddd100p01m1mmmm_case_0);
5014 };
5015 
5016 // VQRSHRUN_1111001u1diiiiiidddd100p00m1mmmm_case_0:
5017 //
5018 //   {D: D(22),
5019 //    L: L(7),
5020 //    M: M(5),
5021 //    Q: Q(6),
5022 //    U: U(24),
5023 //    Vd: Vd(15:12),
5024 //    Vm: Vm(3:0),
5025 //    arch: ASIMD,
5026 //    d: D:Vd,
5027 //    defs: {},
5028 //    dest_unsigned: U(24)=1,
5029 //    elements: 8
5030 //         if imm6(21:16)=001xxx
5031 //         else 4
5032 //         if imm6(21:16)=01xxxx
5033 //         else 2
5034 //         if imm6(21:16)=1xxxxx
5035 //         else 0,
5036 //    esize: 8
5037 //         if imm6(21:16)=001xxx
5038 //         else 16
5039 //         if imm6(21:16)=01xxxx
5040 //         else 32
5041 //         if imm6(21:16)=1xxxxx
5042 //         else 0,
5043 //    fields: [U(24),
5044 //      D(22),
5045 //      imm6(21:16),
5046 //      Vd(15:12),
5047 //      op(8),
5048 //      L(7),
5049 //      Q(6),
5050 //      M(5),
5051 //      Vm(3:0)],
5052 //    imm6: imm6(21:16),
5053 //    n: M:Vm,
5054 //    op: op(8),
5055 //    pattern: 1111001u1diiiiiidddd100p00m1mmmm,
5056 //    regs: 1
5057 //         if Q(6)=0
5058 //         else 2,
5059 //    rule: VQRSHRUN,
5060 //    safety: [imm6(21:16)=000xxx => DECODER_ERROR,
5061 //      Vm(0)=1 => UNDEFINED,
5062 //      U(24)=0 &&
5063 //         op(8)=0 => DECODER_ERROR],
5064 //    shift_amount: 16 - imm6
5065 //         if imm6(21:16)=001xxx
5066 //         else 32 - imm6
5067 //         if imm6(21:16)=01xxxx
5068 //         else 64 - imm6
5069 //         if imm6(21:16)=1xxxxx
5070 //         else 0,
5071 //    src_unsigned: U(24)=1 &&
5072 //         op(8)=1,
5073 //    uses: {}}
5074 class VQRSHRUN_1111001u1diiiiiidddd100p00m1mmmm_case_0
5075      : public ClassDecoder {
5076  public:
VQRSHRUN_1111001u1diiiiiidddd100p00m1mmmm_case_0()5077   VQRSHRUN_1111001u1diiiiiidddd100p00m1mmmm_case_0()
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       VQRSHRUN_1111001u1diiiiiidddd100p00m1mmmm_case_0);
5085 };
5086 
5087 // VQRSHRUN_1111001u1diiiiiidddd100p01m1mmmm_case_0:
5088 //
5089 //   {D: D(22),
5090 //    L: L(7),
5091 //    M: M(5),
5092 //    Q: Q(6),
5093 //    U: U(24),
5094 //    Vd: Vd(15:12),
5095 //    Vm: Vm(3:0),
5096 //    arch: ASIMD,
5097 //    d: D:Vd,
5098 //    defs: {},
5099 //    dest_unsigned: U(24)=1,
5100 //    elements: 8
5101 //         if imm6(21:16)=001xxx
5102 //         else 4
5103 //         if imm6(21:16)=01xxxx
5104 //         else 2
5105 //         if imm6(21:16)=1xxxxx
5106 //         else 0,
5107 //    esize: 8
5108 //         if imm6(21:16)=001xxx
5109 //         else 16
5110 //         if imm6(21:16)=01xxxx
5111 //         else 32
5112 //         if imm6(21:16)=1xxxxx
5113 //         else 0,
5114 //    fields: [U(24),
5115 //      D(22),
5116 //      imm6(21:16),
5117 //      Vd(15:12),
5118 //      op(8),
5119 //      L(7),
5120 //      Q(6),
5121 //      M(5),
5122 //      Vm(3:0)],
5123 //    imm6: imm6(21:16),
5124 //    n: M:Vm,
5125 //    op: op(8),
5126 //    pattern: 1111001u1diiiiiidddd100p01m1mmmm,
5127 //    regs: 1
5128 //         if Q(6)=0
5129 //         else 2,
5130 //    rule: VQRSHRUN,
5131 //    safety: [imm6(21:16)=000xxx => DECODER_ERROR,
5132 //      Vm(0)=1 => UNDEFINED,
5133 //      U(24)=0 &&
5134 //         op(8)=0 => DECODER_ERROR],
5135 //    shift_amount: 16 - imm6
5136 //         if imm6(21:16)=001xxx
5137 //         else 32 - imm6
5138 //         if imm6(21:16)=01xxxx
5139 //         else 64 - imm6
5140 //         if imm6(21:16)=1xxxxx
5141 //         else 0,
5142 //    src_unsigned: U(24)=1 &&
5143 //         op(8)=1,
5144 //    uses: {}}
5145 class VQRSHRUN_1111001u1diiiiiidddd100p01m1mmmm_case_0
5146      : public ClassDecoder {
5147  public:
VQRSHRUN_1111001u1diiiiiidddd100p01m1mmmm_case_0()5148   VQRSHRUN_1111001u1diiiiiidddd100p01m1mmmm_case_0()
5149      : ClassDecoder() {}
5150   virtual RegisterList defs(Instruction inst) const;
5151   virtual SafetyLevel safety(Instruction i) const;
5152   virtual RegisterList uses(Instruction i) const;
5153  private:
5154   NACL_DISALLOW_COPY_AND_ASSIGN(
5155       VQRSHRUN_1111001u1diiiiiidddd100p01m1mmmm_case_0);
5156 };
5157 
5158 // VQSHL_VQSHLU_immediate_1111001u1diiiiiidddd011plqm1mmmm_case_0:
5159 //
5160 //   {D: D(22),
5161 //    L: L(7),
5162 //    M: M(5),
5163 //    Q: Q(6),
5164 //    U: U(24),
5165 //    Vd: Vd(15:12),
5166 //    Vm: Vm(3:0),
5167 //    arch: ASIMD,
5168 //    d: D:Vd,
5169 //    defs: {},
5170 //    dest_unsigned: U(24)=1,
5171 //    elements: 8
5172 //         if L:imm6(6:0)=0001xxx
5173 //         else 4
5174 //         if L:imm6(6:0)=001xxxx
5175 //         else 2
5176 //         if L:imm6(6:0)=01xxxxx
5177 //         else 1
5178 //         if L:imm6(6:0)=1xxxxxx
5179 //         else 0,
5180 //    esize: 8
5181 //         if L:imm6(6:0)=0001xxx
5182 //         else 16
5183 //         if L:imm6(6:0)=001xxxx
5184 //         else 32
5185 //         if L:imm6(6:0)=01xxxxx
5186 //         else 64
5187 //         if L:imm6(6:0)=1xxxxxx
5188 //         else 0,
5189 //    fields: [U(24),
5190 //      D(22),
5191 //      imm6(21:16),
5192 //      Vd(15:12),
5193 //      op(8),
5194 //      L(7),
5195 //      Q(6),
5196 //      M(5),
5197 //      Vm(3:0)],
5198 //    imm6: imm6(21:16),
5199 //    n: M:Vm,
5200 //    op: op(8),
5201 //    pattern: 1111001u1diiiiiidddd011plqm1mmmm,
5202 //    regs: 1
5203 //         if Q(6)=0
5204 //         else 2,
5205 //    rule: VQSHL_VQSHLU_immediate,
5206 //    safety: [L:imm6(6:0)=0000xxx => DECODER_ERROR,
5207 //      Q(6)=1 &&
5208 //         (Vd(0)=1 ||
5209 //         Vm(0)=1) => UNDEFINED,
5210 //      U(24)=0 &&
5211 //         op(8)=0 => UNDEFINED],
5212 //    shift_amount: imm6 - 8
5213 //         if L:imm6(6:0)=0001xxx
5214 //         else imm6 - 16
5215 //         if L:imm6(6:0)=001xxxx
5216 //         else imm6 - 32
5217 //         if L:imm6(6:0)=01xxxxx
5218 //         else imm6
5219 //         if L:imm6(6:0)=1xxxxxx
5220 //         else 0,
5221 //    src_unsigned: U(24)=1 &&
5222 //         op(8)=1,
5223 //    unsigned: U(24)=1,
5224 //    uses: {}}
5225 class VQSHL_VQSHLU_immediate_1111001u1diiiiiidddd011plqm1mmmm_case_0
5226      : public ClassDecoder {
5227  public:
VQSHL_VQSHLU_immediate_1111001u1diiiiiidddd011plqm1mmmm_case_0()5228   VQSHL_VQSHLU_immediate_1111001u1diiiiiidddd011plqm1mmmm_case_0()
5229      : ClassDecoder() {}
5230   virtual RegisterList defs(Instruction inst) const;
5231   virtual SafetyLevel safety(Instruction i) const;
5232   virtual RegisterList uses(Instruction i) const;
5233  private:
5234   NACL_DISALLOW_COPY_AND_ASSIGN(
5235       VQSHL_VQSHLU_immediate_1111001u1diiiiiidddd011plqm1mmmm_case_0);
5236 };
5237 
5238 // VQSHL_register_1111001u0dssnnnndddd0100nqm1mmmm_case_0:
5239 //
5240 //   {D: D(22),
5241 //    M: M(5),
5242 //    N: N(7),
5243 //    Q: Q(6),
5244 //    U: U(24),
5245 //    Vd: Vd(15:12),
5246 //    Vm: Vm(3:0),
5247 //    Vn: Vn(19:16),
5248 //    arch: ASIMD,
5249 //    d: D:Vd,
5250 //    defs: {},
5251 //    elements: 64 / esize,
5252 //    esize: 8 << size,
5253 //    fields: [U(24),
5254 //      D(22),
5255 //      size(21:20),
5256 //      Vn(19:16),
5257 //      Vd(15:12),
5258 //      op(9),
5259 //      N(7),
5260 //      Q(6),
5261 //      M(5),
5262 //      Vm(3:0)],
5263 //    m: M:Vm,
5264 //    n: N:Vn,
5265 //    op: op(9),
5266 //    pattern: 1111001u0dssnnnndddd0100nqm1mmmm,
5267 //    regs: 1
5268 //         if Q(6)=0
5269 //         else 2,
5270 //    rule: VQSHL_register,
5271 //    safety: [Q(6)=1 &&
5272 //         (Vd(0)=1 ||
5273 //         Vn(0)=1 ||
5274 //         Vm(0)=1) => UNDEFINED],
5275 //    size: size(21:20),
5276 //    unsigned: U(24)=1,
5277 //    uses: {}}
5278 class VQSHL_register_1111001u0dssnnnndddd0100nqm1mmmm_case_0
5279      : public ClassDecoder {
5280  public:
VQSHL_register_1111001u0dssnnnndddd0100nqm1mmmm_case_0()5281   VQSHL_register_1111001u0dssnnnndddd0100nqm1mmmm_case_0()
5282      : ClassDecoder() {}
5283   virtual RegisterList defs(Instruction inst) const;
5284   virtual SafetyLevel safety(Instruction i) const;
5285   virtual RegisterList uses(Instruction i) const;
5286  private:
5287   NACL_DISALLOW_COPY_AND_ASSIGN(
5288       VQSHL_register_1111001u0dssnnnndddd0100nqm1mmmm_case_0);
5289 };
5290 
5291 // VQSHRN_1111001u1diiiiiidddd100p00m1mmmm_case_0:
5292 //
5293 //   {D: D(22),
5294 //    L: L(7),
5295 //    M: M(5),
5296 //    Q: Q(6),
5297 //    U: U(24),
5298 //    Vd: Vd(15:12),
5299 //    Vm: Vm(3:0),
5300 //    arch: ASIMD,
5301 //    d: D:Vd,
5302 //    defs: {},
5303 //    dest_unsigned: U(24)=1,
5304 //    elements: 8
5305 //         if imm6(21:16)=001xxx
5306 //         else 4
5307 //         if imm6(21:16)=01xxxx
5308 //         else 2
5309 //         if imm6(21:16)=1xxxxx
5310 //         else 0,
5311 //    esize: 8
5312 //         if imm6(21:16)=001xxx
5313 //         else 16
5314 //         if imm6(21:16)=01xxxx
5315 //         else 32
5316 //         if imm6(21:16)=1xxxxx
5317 //         else 0,
5318 //    fields: [U(24),
5319 //      D(22),
5320 //      imm6(21:16),
5321 //      Vd(15:12),
5322 //      op(8),
5323 //      L(7),
5324 //      Q(6),
5325 //      M(5),
5326 //      Vm(3:0)],
5327 //    imm6: imm6(21:16),
5328 //    n: M:Vm,
5329 //    op: op(8),
5330 //    pattern: 1111001u1diiiiiidddd100p00m1mmmm,
5331 //    regs: 1
5332 //         if Q(6)=0
5333 //         else 2,
5334 //    rule: VQSHRN,
5335 //    safety: [imm6(21:16)=000xxx => DECODER_ERROR,
5336 //      Vm(0)=1 => UNDEFINED,
5337 //      U(24)=0 &&
5338 //         op(8)=0 => DECODER_ERROR],
5339 //    shift_amount: 16 - imm6
5340 //         if imm6(21:16)=001xxx
5341 //         else 32 - imm6
5342 //         if imm6(21:16)=01xxxx
5343 //         else 64 - imm6
5344 //         if imm6(21:16)=1xxxxx
5345 //         else 0,
5346 //    src_unsigned: U(24)=1 &&
5347 //         op(8)=1,
5348 //    uses: {}}
5349 class VQSHRN_1111001u1diiiiiidddd100p00m1mmmm_case_0
5350      : public ClassDecoder {
5351  public:
VQSHRN_1111001u1diiiiiidddd100p00m1mmmm_case_0()5352   VQSHRN_1111001u1diiiiiidddd100p00m1mmmm_case_0()
5353      : ClassDecoder() {}
5354   virtual RegisterList defs(Instruction inst) const;
5355   virtual SafetyLevel safety(Instruction i) const;
5356   virtual RegisterList uses(Instruction i) const;
5357  private:
5358   NACL_DISALLOW_COPY_AND_ASSIGN(
5359       VQSHRN_1111001u1diiiiiidddd100p00m1mmmm_case_0);
5360 };
5361 
5362 // VQSHRUN_1111001u1diiiiiidddd100p00m1mmmm_case_0:
5363 //
5364 //   {D: D(22),
5365 //    L: L(7),
5366 //    M: M(5),
5367 //    Q: Q(6),
5368 //    U: U(24),
5369 //    Vd: Vd(15:12),
5370 //    Vm: Vm(3:0),
5371 //    arch: ASIMD,
5372 //    d: D:Vd,
5373 //    defs: {},
5374 //    dest_unsigned: U(24)=1,
5375 //    elements: 8
5376 //         if imm6(21:16)=001xxx
5377 //         else 4
5378 //         if imm6(21:16)=01xxxx
5379 //         else 2
5380 //         if imm6(21:16)=1xxxxx
5381 //         else 0,
5382 //    esize: 8
5383 //         if imm6(21:16)=001xxx
5384 //         else 16
5385 //         if imm6(21:16)=01xxxx
5386 //         else 32
5387 //         if imm6(21:16)=1xxxxx
5388 //         else 0,
5389 //    fields: [U(24),
5390 //      D(22),
5391 //      imm6(21:16),
5392 //      Vd(15:12),
5393 //      op(8),
5394 //      L(7),
5395 //      Q(6),
5396 //      M(5),
5397 //      Vm(3:0)],
5398 //    imm6: imm6(21:16),
5399 //    n: M:Vm,
5400 //    op: op(8),
5401 //    pattern: 1111001u1diiiiiidddd100p00m1mmmm,
5402 //    regs: 1
5403 //         if Q(6)=0
5404 //         else 2,
5405 //    rule: VQSHRUN,
5406 //    safety: [imm6(21:16)=000xxx => DECODER_ERROR,
5407 //      Vm(0)=1 => UNDEFINED,
5408 //      U(24)=0 &&
5409 //         op(8)=0 => DECODER_ERROR],
5410 //    shift_amount: 16 - imm6
5411 //         if imm6(21:16)=001xxx
5412 //         else 32 - imm6
5413 //         if imm6(21:16)=01xxxx
5414 //         else 64 - imm6
5415 //         if imm6(21:16)=1xxxxx
5416 //         else 0,
5417 //    src_unsigned: U(24)=1 &&
5418 //         op(8)=1,
5419 //    uses: {}}
5420 class VQSHRUN_1111001u1diiiiiidddd100p00m1mmmm_case_0
5421      : public ClassDecoder {
5422  public:
VQSHRUN_1111001u1diiiiiidddd100p00m1mmmm_case_0()5423   VQSHRUN_1111001u1diiiiiidddd100p00m1mmmm_case_0()
5424      : ClassDecoder() {}
5425   virtual RegisterList defs(Instruction inst) const;
5426   virtual SafetyLevel safety(Instruction i) const;
5427   virtual RegisterList uses(Instruction i) const;
5428  private:
5429   NACL_DISALLOW_COPY_AND_ASSIGN(
5430       VQSHRUN_1111001u1diiiiiidddd100p00m1mmmm_case_0);
5431 };
5432 
5433 // VQSUB_1111001u0dssnnnndddd0010nqm1mmmm_case_0:
5434 //
5435 //   {D: D(22),
5436 //    M: M(5),
5437 //    N: N(7),
5438 //    Q: Q(6),
5439 //    U: U(24),
5440 //    Vd: Vd(15:12),
5441 //    Vm: Vm(3:0),
5442 //    Vn: Vn(19:16),
5443 //    arch: ASIMD,
5444 //    d: D:Vd,
5445 //    defs: {},
5446 //    elements: 64 / esize,
5447 //    esize: 8 << size,
5448 //    fields: [U(24),
5449 //      D(22),
5450 //      size(21:20),
5451 //      Vn(19:16),
5452 //      Vd(15:12),
5453 //      op(9),
5454 //      N(7),
5455 //      Q(6),
5456 //      M(5),
5457 //      Vm(3:0)],
5458 //    m: M:Vm,
5459 //    n: N:Vn,
5460 //    op: op(9),
5461 //    pattern: 1111001u0dssnnnndddd0010nqm1mmmm,
5462 //    regs: 1
5463 //         if Q(6)=0
5464 //         else 2,
5465 //    rule: VQSUB,
5466 //    safety: [Q(6)=1 &&
5467 //         (Vd(0)=1 ||
5468 //         Vn(0)=1 ||
5469 //         Vm(0)=1) => UNDEFINED],
5470 //    size: size(21:20),
5471 //    unsigned: U(24)=1,
5472 //    uses: {}}
5473 class VQSUB_1111001u0dssnnnndddd0010nqm1mmmm_case_0
5474      : public ClassDecoder {
5475  public:
VQSUB_1111001u0dssnnnndddd0010nqm1mmmm_case_0()5476   VQSUB_1111001u0dssnnnndddd0010nqm1mmmm_case_0()
5477      : ClassDecoder() {}
5478   virtual RegisterList defs(Instruction inst) const;
5479   virtual SafetyLevel safety(Instruction i) const;
5480   virtual RegisterList uses(Instruction i) const;
5481  private:
5482   NACL_DISALLOW_COPY_AND_ASSIGN(
5483       VQSUB_1111001u0dssnnnndddd0010nqm1mmmm_case_0);
5484 };
5485 
5486 // VRADDHN_111100111dssnnnndddd0100n0m0mmmm_case_0:
5487 //
5488 //   {D: D(22),
5489 //    M: M(5),
5490 //    N: N(7),
5491 //    U: U(24),
5492 //    Vd: Vd(15:12),
5493 //    Vm: Vm(3:0),
5494 //    Vn: Vn(19:16),
5495 //    d: D:Vd,
5496 //    defs: {},
5497 //    elements: 64 / esize,
5498 //    esize: 8 << size,
5499 //    fields: [U(24),
5500 //      D(22),
5501 //      size(21:20),
5502 //      Vn(19:16),
5503 //      Vd(15:12),
5504 //      op(8),
5505 //      N(7),
5506 //      M(5),
5507 //      Vm(3:0)],
5508 //    m: M:Vm,
5509 //    n: N:Vn,
5510 //    op: op(8),
5511 //    pattern: 111100111dssnnnndddd0100n0m0mmmm,
5512 //    rule: VRADDHN,
5513 //    safety: [size(21:20)=11 => DECODER_ERROR,
5514 //      Vn(0)=1 ||
5515 //         Vm(0)=1 => UNDEFINED],
5516 //    size: size(21:20),
5517 //    unsigned: U(24)=1,
5518 //    uses: {}}
5519 class VRADDHN_111100111dssnnnndddd0100n0m0mmmm_case_0
5520      : public ClassDecoder {
5521  public:
VRADDHN_111100111dssnnnndddd0100n0m0mmmm_case_0()5522   VRADDHN_111100111dssnnnndddd0100n0m0mmmm_case_0()
5523      : ClassDecoder() {}
5524   virtual RegisterList defs(Instruction inst) const;
5525   virtual SafetyLevel safety(Instruction i) const;
5526   virtual RegisterList uses(Instruction i) const;
5527  private:
5528   NACL_DISALLOW_COPY_AND_ASSIGN(
5529       VRADDHN_111100111dssnnnndddd0100n0m0mmmm_case_0);
5530 };
5531 
5532 // VRECPE_111100111d11ss11dddd010f0qm0mmmm_case_0:
5533 //
5534 //   {D: D(22),
5535 //    F: F(10),
5536 //    M: M(5),
5537 //    Q: Q(6),
5538 //    Vd: Vd(15:12),
5539 //    Vm: Vm(3:0),
5540 //    arch: ASIMD,
5541 //    d: D:Vd,
5542 //    defs: {},
5543 //    elements: 64 / esize,
5544 //    esize: 8 << size,
5545 //    fields: [D(22),
5546 //      size(19:18),
5547 //      Vd(15:12),
5548 //      F(10),
5549 //      op(8:7),
5550 //      Q(6),
5551 //      M(5),
5552 //      Vm(3:0)],
5553 //    floating_point: F(10)=1,
5554 //    m: M:Vm,
5555 //    op: op(8:7),
5556 //    pattern: 111100111d11ss11dddd010f0qm0mmmm,
5557 //    regs: 1
5558 //         if Q(6)=0
5559 //         else 2,
5560 //    rule: VRECPE,
5561 //    safety: [Q(6)=1 &&
5562 //         (Vd(0)=1 ||
5563 //         Vm(0)=1) => UNDEFINED,
5564 //      size(19:18)=~10 => UNDEFINED],
5565 //    size: size(19:18),
5566 //    uses: {}}
5567 class VRECPE_111100111d11ss11dddd010f0qm0mmmm_case_0
5568      : public ClassDecoder {
5569  public:
VRECPE_111100111d11ss11dddd010f0qm0mmmm_case_0()5570   VRECPE_111100111d11ss11dddd010f0qm0mmmm_case_0()
5571      : ClassDecoder() {}
5572   virtual RegisterList defs(Instruction inst) const;
5573   virtual SafetyLevel safety(Instruction i) const;
5574   virtual RegisterList uses(Instruction i) const;
5575  private:
5576   NACL_DISALLOW_COPY_AND_ASSIGN(
5577       VRECPE_111100111d11ss11dddd010f0qm0mmmm_case_0);
5578 };
5579 
5580 // VRECPS_111100100d0snnnndddd1111nqm1mmmm_case_0:
5581 //
5582 //   {D: D(22),
5583 //    M: M(5),
5584 //    N: N(7),
5585 //    Q: Q(6),
5586 //    U: U(24),
5587 //    Vd: Vd(15:12),
5588 //    Vm: Vm(3:0),
5589 //    Vn: Vn(19:16),
5590 //    arch: ASIMD,
5591 //    d: D:Vd,
5592 //    defs: {},
5593 //    elements: 2,
5594 //    esize: 32,
5595 //    fields: [U(24),
5596 //      D(22),
5597 //      size(21:20),
5598 //      Vn(19:16),
5599 //      Vd(15:12),
5600 //      op(9),
5601 //      N(7),
5602 //      Q(6),
5603 //      M(5),
5604 //      Vm(3:0)],
5605 //    m: M:Vm,
5606 //    n: N:Vn,
5607 //    op: op(9),
5608 //    op1_neg: size(1),
5609 //    pattern: 111100100d0snnnndddd1111nqm1mmmm,
5610 //    rule: VRECPS,
5611 //    safety: [Q(6)=1 &&
5612 //         (Vd(0)=1 ||
5613 //         Vn(0)=1 ||
5614 //         Vm(0)=1) => UNDEFINED,
5615 //      size(0)=1 => UNDEFINED],
5616 //    size: size(21:20),
5617 //    sz: size(0),
5618 //    uses: {}}
5619 class VRECPS_111100100d0snnnndddd1111nqm1mmmm_case_0
5620      : public ClassDecoder {
5621  public:
VRECPS_111100100d0snnnndddd1111nqm1mmmm_case_0()5622   VRECPS_111100100d0snnnndddd1111nqm1mmmm_case_0()
5623      : ClassDecoder() {}
5624   virtual RegisterList defs(Instruction inst) const;
5625   virtual SafetyLevel safety(Instruction i) const;
5626   virtual RegisterList uses(Instruction i) const;
5627  private:
5628   NACL_DISALLOW_COPY_AND_ASSIGN(
5629       VRECPS_111100100d0snnnndddd1111nqm1mmmm_case_0);
5630 };
5631 
5632 // VREV16_111100111d11ss00dddd000ppqm0mmmm_case_0:
5633 //
5634 //   {D: D(22),
5635 //    F: F(10),
5636 //    M: M(5),
5637 //    Q: Q(6),
5638 //    Vd: Vd(15:12),
5639 //    Vm: Vm(3:0),
5640 //    arch: ASIMD,
5641 //    d: D:Vd,
5642 //    defs: {},
5643 //    elements: 64 / esize,
5644 //    esize: 8 << size,
5645 //    fields: [D(22),
5646 //      size(19:18),
5647 //      Vd(15:12),
5648 //      F(10),
5649 //      op(8:7),
5650 //      Q(6),
5651 //      M(5),
5652 //      Vm(3:0)],
5653 //    groupsize: rev_groupsize(op, size),
5654 //    m: M:Vm,
5655 //    op: op(8:7),
5656 //    pattern: 111100111d11ss00dddd000ppqm0mmmm,
5657 //    regs: 1
5658 //         if Q(6)=0
5659 //         else 2,
5660 //    reverse_mask: rev_mask(groupsize, esize),
5661 //    rule: VREV16,
5662 //    safety: [op + size  >=
5663 //            3 => UNDEFINED,
5664 //      Q(6)=1 &&
5665 //         (Vd(0)=1 ||
5666 //         Vm(0)=1) => UNDEFINED],
5667 //    size: size(19:18),
5668 //    uses: {}}
5669 class VREV16_111100111d11ss00dddd000ppqm0mmmm_case_0
5670      : public ClassDecoder {
5671  public:
VREV16_111100111d11ss00dddd000ppqm0mmmm_case_0()5672   VREV16_111100111d11ss00dddd000ppqm0mmmm_case_0()
5673      : ClassDecoder() {}
5674   virtual RegisterList defs(Instruction inst) const;
5675   virtual SafetyLevel safety(Instruction i) const;
5676   virtual RegisterList uses(Instruction i) const;
5677  private:
5678   NACL_DISALLOW_COPY_AND_ASSIGN(
5679       VREV16_111100111d11ss00dddd000ppqm0mmmm_case_0);
5680 };
5681 
5682 // VREV32_111100111d11ss00dddd000ppqm0mmmm_case_0:
5683 //
5684 //   {D: D(22),
5685 //    F: F(10),
5686 //    M: M(5),
5687 //    Q: Q(6),
5688 //    Vd: Vd(15:12),
5689 //    Vm: Vm(3:0),
5690 //    arch: ASIMD,
5691 //    d: D:Vd,
5692 //    defs: {},
5693 //    elements: 64 / esize,
5694 //    esize: 8 << size,
5695 //    fields: [D(22),
5696 //      size(19:18),
5697 //      Vd(15:12),
5698 //      F(10),
5699 //      op(8:7),
5700 //      Q(6),
5701 //      M(5),
5702 //      Vm(3:0)],
5703 //    groupsize: rev_groupsize(op, size),
5704 //    m: M:Vm,
5705 //    op: op(8:7),
5706 //    pattern: 111100111d11ss00dddd000ppqm0mmmm,
5707 //    regs: 1
5708 //         if Q(6)=0
5709 //         else 2,
5710 //    reverse_mask: rev_mask(groupsize, esize),
5711 //    rule: VREV32,
5712 //    safety: [op + size  >=
5713 //            3 => UNDEFINED,
5714 //      Q(6)=1 &&
5715 //         (Vd(0)=1 ||
5716 //         Vm(0)=1) => UNDEFINED],
5717 //    size: size(19:18),
5718 //    uses: {}}
5719 class VREV32_111100111d11ss00dddd000ppqm0mmmm_case_0
5720      : public ClassDecoder {
5721  public:
VREV32_111100111d11ss00dddd000ppqm0mmmm_case_0()5722   VREV32_111100111d11ss00dddd000ppqm0mmmm_case_0()
5723      : ClassDecoder() {}
5724   virtual RegisterList defs(Instruction inst) const;
5725   virtual SafetyLevel safety(Instruction i) const;
5726   virtual RegisterList uses(Instruction i) const;
5727  private:
5728   NACL_DISALLOW_COPY_AND_ASSIGN(
5729       VREV32_111100111d11ss00dddd000ppqm0mmmm_case_0);
5730 };
5731 
5732 // VREV64_111100111d11ss00dddd000ppqm0mmmm_case_0:
5733 //
5734 //   {D: D(22),
5735 //    F: F(10),
5736 //    M: M(5),
5737 //    Q: Q(6),
5738 //    Vd: Vd(15:12),
5739 //    Vm: Vm(3:0),
5740 //    arch: ASIMD,
5741 //    d: D:Vd,
5742 //    defs: {},
5743 //    elements: 64 / esize,
5744 //    esize: 8 << size,
5745 //    fields: [D(22),
5746 //      size(19:18),
5747 //      Vd(15:12),
5748 //      F(10),
5749 //      op(8:7),
5750 //      Q(6),
5751 //      M(5),
5752 //      Vm(3:0)],
5753 //    groupsize: rev_groupsize(op, size),
5754 //    m: M:Vm,
5755 //    op: op(8:7),
5756 //    pattern: 111100111d11ss00dddd000ppqm0mmmm,
5757 //    regs: 1
5758 //         if Q(6)=0
5759 //         else 2,
5760 //    reverse_mask: rev_mask(groupsize, esize),
5761 //    rule: VREV64,
5762 //    safety: [op + size  >=
5763 //            3 => UNDEFINED,
5764 //      Q(6)=1 &&
5765 //         (Vd(0)=1 ||
5766 //         Vm(0)=1) => UNDEFINED],
5767 //    size: size(19:18),
5768 //    uses: {}}
5769 class VREV64_111100111d11ss00dddd000ppqm0mmmm_case_0
5770      : public ClassDecoder {
5771  public:
VREV64_111100111d11ss00dddd000ppqm0mmmm_case_0()5772   VREV64_111100111d11ss00dddd000ppqm0mmmm_case_0()
5773      : ClassDecoder() {}
5774   virtual RegisterList defs(Instruction inst) const;
5775   virtual SafetyLevel safety(Instruction i) const;
5776   virtual RegisterList uses(Instruction i) const;
5777  private:
5778   NACL_DISALLOW_COPY_AND_ASSIGN(
5779       VREV64_111100111d11ss00dddd000ppqm0mmmm_case_0);
5780 };
5781 
5782 // VRHADD_1111001u0dssnnnndddd0001nqm0mmmm_case_0:
5783 //
5784 //   {D: D(22),
5785 //    M: M(5),
5786 //    N: N(7),
5787 //    Q: Q(6),
5788 //    U: U(24),
5789 //    Vd: Vd(15:12),
5790 //    Vm: Vm(3:0),
5791 //    Vn: Vn(19:16),
5792 //    arch: ASIMD,
5793 //    d: D:Vd,
5794 //    defs: {},
5795 //    elements: 64 / esize,
5796 //    esize: 8 << size,
5797 //    fields: [U(24),
5798 //      D(22),
5799 //      size(21:20),
5800 //      Vn(19:16),
5801 //      Vd(15:12),
5802 //      op(9),
5803 //      N(7),
5804 //      Q(6),
5805 //      M(5),
5806 //      Vm(3:0)],
5807 //    m: M:Vm,
5808 //    n: N:Vn,
5809 //    op: op(9),
5810 //    pattern: 1111001u0dssnnnndddd0001nqm0mmmm,
5811 //    regs: 1
5812 //         if Q(6)=0
5813 //         else 2,
5814 //    rule: VRHADD,
5815 //    safety: [Q(6)=1 &&
5816 //         (Vd(0)=1 ||
5817 //         Vn(0)=1 ||
5818 //         Vm(0)=1) => UNDEFINED,
5819 //      size(21:20)=11 => UNDEFINED],
5820 //    size: size(21:20),
5821 //    unsigned: U(24)=1,
5822 //    uses: {}}
5823 class VRHADD_1111001u0dssnnnndddd0001nqm0mmmm_case_0
5824      : public ClassDecoder {
5825  public:
VRHADD_1111001u0dssnnnndddd0001nqm0mmmm_case_0()5826   VRHADD_1111001u0dssnnnndddd0001nqm0mmmm_case_0()
5827      : ClassDecoder() {}
5828   virtual RegisterList defs(Instruction inst) const;
5829   virtual SafetyLevel safety(Instruction i) const;
5830   virtual RegisterList uses(Instruction i) const;
5831  private:
5832   NACL_DISALLOW_COPY_AND_ASSIGN(
5833       VRHADD_1111001u0dssnnnndddd0001nqm0mmmm_case_0);
5834 };
5835 
5836 // VRSHL_1111001u0dssnnnndddd0101nqm0mmmm_case_0:
5837 //
5838 //   {D: D(22),
5839 //    M: M(5),
5840 //    N: N(7),
5841 //    Q: Q(6),
5842 //    U: U(24),
5843 //    Vd: Vd(15:12),
5844 //    Vm: Vm(3:0),
5845 //    Vn: Vn(19:16),
5846 //    arch: ASIMD,
5847 //    d: D:Vd,
5848 //    defs: {},
5849 //    elements: 64 / esize,
5850 //    esize: 8 << size,
5851 //    fields: [U(24),
5852 //      D(22),
5853 //      size(21:20),
5854 //      Vn(19:16),
5855 //      Vd(15:12),
5856 //      op(9),
5857 //      N(7),
5858 //      Q(6),
5859 //      M(5),
5860 //      Vm(3:0)],
5861 //    m: M:Vm,
5862 //    n: N:Vn,
5863 //    op: op(9),
5864 //    pattern: 1111001u0dssnnnndddd0101nqm0mmmm,
5865 //    regs: 1
5866 //         if Q(6)=0
5867 //         else 2,
5868 //    rule: VRSHL,
5869 //    safety: [Q(6)=1 &&
5870 //         (Vd(0)=1 ||
5871 //         Vn(0)=1 ||
5872 //         Vm(0)=1) => UNDEFINED],
5873 //    size: size(21:20),
5874 //    unsigned: U(24)=1,
5875 //    uses: {}}
5876 class VRSHL_1111001u0dssnnnndddd0101nqm0mmmm_case_0
5877      : public ClassDecoder {
5878  public:
VRSHL_1111001u0dssnnnndddd0101nqm0mmmm_case_0()5879   VRSHL_1111001u0dssnnnndddd0101nqm0mmmm_case_0()
5880      : ClassDecoder() {}
5881   virtual RegisterList defs(Instruction inst) const;
5882   virtual SafetyLevel safety(Instruction i) const;
5883   virtual RegisterList uses(Instruction i) const;
5884  private:
5885   NACL_DISALLOW_COPY_AND_ASSIGN(
5886       VRSHL_1111001u0dssnnnndddd0101nqm0mmmm_case_0);
5887 };
5888 
5889 // VRSHRN_111100101diiiiiidddd100001m1mmmm_case_0:
5890 //
5891 //   {D: D(22),
5892 //    L: L(7),
5893 //    M: M(5),
5894 //    Q: Q(6),
5895 //    U: U(24),
5896 //    Vd: Vd(15:12),
5897 //    Vm: Vm(3:0),
5898 //    arch: ASIMD,
5899 //    d: D:Vd,
5900 //    defs: {},
5901 //    elements: 8
5902 //         if imm6(21:16)=001xxx
5903 //         else 4
5904 //         if imm6(21:16)=01xxxx
5905 //         else 2
5906 //         if imm6(21:16)=1xxxxx
5907 //         else 0,
5908 //    esize: 8
5909 //         if imm6(21:16)=001xxx
5910 //         else 16
5911 //         if imm6(21:16)=01xxxx
5912 //         else 32
5913 //         if imm6(21:16)=1xxxxx
5914 //         else 0,
5915 //    fields: [U(24),
5916 //      D(22),
5917 //      imm6(21:16),
5918 //      Vd(15:12),
5919 //      op(8),
5920 //      L(7),
5921 //      Q(6),
5922 //      M(5),
5923 //      Vm(3:0)],
5924 //    imm6: imm6(21:16),
5925 //    n: M:Vm,
5926 //    op: op(8),
5927 //    pattern: 111100101diiiiiidddd100001m1mmmm,
5928 //    regs: 1
5929 //         if Q(6)=0
5930 //         else 2,
5931 //    rule: VRSHRN,
5932 //    safety: [imm6(21:16)=000xxx => DECODER_ERROR, Vm(0)=1 => UNDEFINED],
5933 //    shift_amount: 16 - imm6
5934 //         if imm6(21:16)=001xxx
5935 //         else 32 - imm6
5936 //         if imm6(21:16)=01xxxx
5937 //         else 64 - imm6
5938 //         if imm6(21:16)=1xxxxx
5939 //         else 0,
5940 //    uses: {}}
5941 class VRSHRN_111100101diiiiiidddd100001m1mmmm_case_0
5942      : public ClassDecoder {
5943  public:
VRSHRN_111100101diiiiiidddd100001m1mmmm_case_0()5944   VRSHRN_111100101diiiiiidddd100001m1mmmm_case_0()
5945      : ClassDecoder() {}
5946   virtual RegisterList defs(Instruction inst) const;
5947   virtual SafetyLevel safety(Instruction i) const;
5948   virtual RegisterList uses(Instruction i) const;
5949  private:
5950   NACL_DISALLOW_COPY_AND_ASSIGN(
5951       VRSHRN_111100101diiiiiidddd100001m1mmmm_case_0);
5952 };
5953 
5954 // VRSHR_1111001u1diiiiiidddd0010lqm1mmmm_case_0:
5955 //
5956 //   {D: D(22),
5957 //    L: L(7),
5958 //    M: M(5),
5959 //    Q: Q(6),
5960 //    U: U(24),
5961 //    Vd: Vd(15:12),
5962 //    Vm: Vm(3:0),
5963 //    arch: ASIMD,
5964 //    d: D:Vd,
5965 //    defs: {},
5966 //    elements: 8
5967 //         if L:imm6(6:0)=0001xxx
5968 //         else 4
5969 //         if L:imm6(6:0)=001xxxx
5970 //         else 2
5971 //         if L:imm6(6:0)=01xxxxx
5972 //         else 1
5973 //         if L:imm6(6:0)=1xxxxxx
5974 //         else 0,
5975 //    esize: 8
5976 //         if L:imm6(6:0)=0001xxx
5977 //         else 16
5978 //         if L:imm6(6:0)=001xxxx
5979 //         else 32
5980 //         if L:imm6(6:0)=01xxxxx
5981 //         else 64
5982 //         if L:imm6(6:0)=1xxxxxx
5983 //         else 0,
5984 //    fields: [U(24),
5985 //      D(22),
5986 //      imm6(21:16),
5987 //      Vd(15:12),
5988 //      op(8),
5989 //      L(7),
5990 //      Q(6),
5991 //      M(5),
5992 //      Vm(3:0)],
5993 //    imm6: imm6(21:16),
5994 //    n: M:Vm,
5995 //    op: op(8),
5996 //    pattern: 1111001u1diiiiiidddd0010lqm1mmmm,
5997 //    regs: 1
5998 //         if Q(6)=0
5999 //         else 2,
6000 //    rule: VRSHR,
6001 //    safety: [L:imm6(6:0)=0000xxx => DECODER_ERROR,
6002 //      Q(6)=1 &&
6003 //         (Vd(0)=1 ||
6004 //         Vm(0)=1) => UNDEFINED],
6005 //    shift_amount: 16 - imm6
6006 //         if L:imm6(6:0)=0001xxx
6007 //         else 32 - imm6
6008 //         if L:imm6(6:0)=001xxxx
6009 //         else 64 - imm6,
6010 //    unsigned: U(24)=1,
6011 //    uses: {}}
6012 class VRSHR_1111001u1diiiiiidddd0010lqm1mmmm_case_0
6013      : public ClassDecoder {
6014  public:
VRSHR_1111001u1diiiiiidddd0010lqm1mmmm_case_0()6015   VRSHR_1111001u1diiiiiidddd0010lqm1mmmm_case_0()
6016      : ClassDecoder() {}
6017   virtual RegisterList defs(Instruction inst) const;
6018   virtual SafetyLevel safety(Instruction i) const;
6019   virtual RegisterList uses(Instruction i) const;
6020  private:
6021   NACL_DISALLOW_COPY_AND_ASSIGN(
6022       VRSHR_1111001u1diiiiiidddd0010lqm1mmmm_case_0);
6023 };
6024 
6025 // VRSQRTE_111100111d11ss11dddd010f1qm0mmmm_case_0:
6026 //
6027 //   {D: D(22),
6028 //    F: F(10),
6029 //    M: M(5),
6030 //    Q: Q(6),
6031 //    Vd: Vd(15:12),
6032 //    Vm: Vm(3:0),
6033 //    arch: ASIMD,
6034 //    d: D:Vd,
6035 //    defs: {},
6036 //    elements: 64 / esize,
6037 //    esize: 8 << size,
6038 //    fields: [D(22),
6039 //      size(19:18),
6040 //      Vd(15:12),
6041 //      F(10),
6042 //      op(8:7),
6043 //      Q(6),
6044 //      M(5),
6045 //      Vm(3:0)],
6046 //    floating_point: F(10)=1,
6047 //    m: M:Vm,
6048 //    op: op(8:7),
6049 //    pattern: 111100111d11ss11dddd010f1qm0mmmm,
6050 //    regs: 1
6051 //         if Q(6)=0
6052 //         else 2,
6053 //    rule: VRSQRTE,
6054 //    safety: [Q(6)=1 &&
6055 //         (Vd(0)=1 ||
6056 //         Vm(0)=1) => UNDEFINED,
6057 //      size(19:18)=~10 => UNDEFINED],
6058 //    size: size(19:18),
6059 //    uses: {}}
6060 class VRSQRTE_111100111d11ss11dddd010f1qm0mmmm_case_0
6061      : public ClassDecoder {
6062  public:
VRSQRTE_111100111d11ss11dddd010f1qm0mmmm_case_0()6063   VRSQRTE_111100111d11ss11dddd010f1qm0mmmm_case_0()
6064      : ClassDecoder() {}
6065   virtual RegisterList defs(Instruction inst) const;
6066   virtual SafetyLevel safety(Instruction i) const;
6067   virtual RegisterList uses(Instruction i) const;
6068  private:
6069   NACL_DISALLOW_COPY_AND_ASSIGN(
6070       VRSQRTE_111100111d11ss11dddd010f1qm0mmmm_case_0);
6071 };
6072 
6073 // VRSQRTS_111100100d1snnnndddd1111nqm1mmmm_case_0:
6074 //
6075 //   {D: D(22),
6076 //    M: M(5),
6077 //    N: N(7),
6078 //    Q: Q(6),
6079 //    U: U(24),
6080 //    Vd: Vd(15:12),
6081 //    Vm: Vm(3:0),
6082 //    Vn: Vn(19:16),
6083 //    arch: ASIMD,
6084 //    d: D:Vd,
6085 //    defs: {},
6086 //    elements: 2,
6087 //    esize: 32,
6088 //    fields: [U(24),
6089 //      D(22),
6090 //      size(21:20),
6091 //      Vn(19:16),
6092 //      Vd(15:12),
6093 //      op(9),
6094 //      N(7),
6095 //      Q(6),
6096 //      M(5),
6097 //      Vm(3:0)],
6098 //    m: M:Vm,
6099 //    n: N:Vn,
6100 //    op: op(9),
6101 //    op1_neg: size(1),
6102 //    pattern: 111100100d1snnnndddd1111nqm1mmmm,
6103 //    rule: VRSQRTS,
6104 //    safety: [Q(6)=1 &&
6105 //         (Vd(0)=1 ||
6106 //         Vn(0)=1 ||
6107 //         Vm(0)=1) => UNDEFINED,
6108 //      size(0)=1 => UNDEFINED],
6109 //    size: size(21:20),
6110 //    sz: size(0),
6111 //    uses: {}}
6112 class VRSQRTS_111100100d1snnnndddd1111nqm1mmmm_case_0
6113      : public ClassDecoder {
6114  public:
VRSQRTS_111100100d1snnnndddd1111nqm1mmmm_case_0()6115   VRSQRTS_111100100d1snnnndddd1111nqm1mmmm_case_0()
6116      : ClassDecoder() {}
6117   virtual RegisterList defs(Instruction inst) const;
6118   virtual SafetyLevel safety(Instruction i) const;
6119   virtual RegisterList uses(Instruction i) const;
6120  private:
6121   NACL_DISALLOW_COPY_AND_ASSIGN(
6122       VRSQRTS_111100100d1snnnndddd1111nqm1mmmm_case_0);
6123 };
6124 
6125 // VRSRA_1111001u1diiiiiidddd0011lqm1mmmm_case_0:
6126 //
6127 //   {D: D(22),
6128 //    L: L(7),
6129 //    M: M(5),
6130 //    Q: Q(6),
6131 //    U: U(24),
6132 //    Vd: Vd(15:12),
6133 //    Vm: Vm(3:0),
6134 //    arch: ASIMD,
6135 //    d: D:Vd,
6136 //    defs: {},
6137 //    elements: 8
6138 //         if L:imm6(6:0)=0001xxx
6139 //         else 4
6140 //         if L:imm6(6:0)=001xxxx
6141 //         else 2
6142 //         if L:imm6(6:0)=01xxxxx
6143 //         else 1
6144 //         if L:imm6(6:0)=1xxxxxx
6145 //         else 0,
6146 //    esize: 8
6147 //         if L:imm6(6:0)=0001xxx
6148 //         else 16
6149 //         if L:imm6(6:0)=001xxxx
6150 //         else 32
6151 //         if L:imm6(6:0)=01xxxxx
6152 //         else 64
6153 //         if L:imm6(6:0)=1xxxxxx
6154 //         else 0,
6155 //    fields: [U(24),
6156 //      D(22),
6157 //      imm6(21:16),
6158 //      Vd(15:12),
6159 //      op(8),
6160 //      L(7),
6161 //      Q(6),
6162 //      M(5),
6163 //      Vm(3:0)],
6164 //    imm6: imm6(21:16),
6165 //    n: M:Vm,
6166 //    op: op(8),
6167 //    pattern: 1111001u1diiiiiidddd0011lqm1mmmm,
6168 //    regs: 1
6169 //         if Q(6)=0
6170 //         else 2,
6171 //    rule: VRSRA,
6172 //    safety: [L:imm6(6:0)=0000xxx => DECODER_ERROR,
6173 //      Q(6)=1 &&
6174 //         (Vd(0)=1 ||
6175 //         Vm(0)=1) => UNDEFINED],
6176 //    shift_amount: 16 - imm6
6177 //         if L:imm6(6:0)=0001xxx
6178 //         else 32 - imm6
6179 //         if L:imm6(6:0)=001xxxx
6180 //         else 64 - imm6,
6181 //    unsigned: U(24)=1,
6182 //    uses: {}}
6183 class VRSRA_1111001u1diiiiiidddd0011lqm1mmmm_case_0
6184      : public ClassDecoder {
6185  public:
VRSRA_1111001u1diiiiiidddd0011lqm1mmmm_case_0()6186   VRSRA_1111001u1diiiiiidddd0011lqm1mmmm_case_0()
6187      : ClassDecoder() {}
6188   virtual RegisterList defs(Instruction inst) const;
6189   virtual SafetyLevel safety(Instruction i) const;
6190   virtual RegisterList uses(Instruction i) const;
6191  private:
6192   NACL_DISALLOW_COPY_AND_ASSIGN(
6193       VRSRA_1111001u1diiiiiidddd0011lqm1mmmm_case_0);
6194 };
6195 
6196 // VRSUBHN_111100111dssnnnndddd0110n0m0mmmm_case_0:
6197 //
6198 //   {D: D(22),
6199 //    M: M(5),
6200 //    N: N(7),
6201 //    U: U(24),
6202 //    Vd: Vd(15:12),
6203 //    Vm: Vm(3:0),
6204 //    Vn: Vn(19:16),
6205 //    d: D:Vd,
6206 //    defs: {},
6207 //    elements: 64 / esize,
6208 //    esize: 8 << size,
6209 //    fields: [U(24),
6210 //      D(22),
6211 //      size(21:20),
6212 //      Vn(19:16),
6213 //      Vd(15:12),
6214 //      op(8),
6215 //      N(7),
6216 //      M(5),
6217 //      Vm(3:0)],
6218 //    m: M:Vm,
6219 //    n: N:Vn,
6220 //    op: op(8),
6221 //    pattern: 111100111dssnnnndddd0110n0m0mmmm,
6222 //    rule: VRSUBHN,
6223 //    safety: [size(21:20)=11 => DECODER_ERROR,
6224 //      Vn(0)=1 ||
6225 //         Vm(0)=1 => UNDEFINED],
6226 //    size: size(21:20),
6227 //    unsigned: U(24)=1,
6228 //    uses: {}}
6229 class VRSUBHN_111100111dssnnnndddd0110n0m0mmmm_case_0
6230      : public ClassDecoder {
6231  public:
VRSUBHN_111100111dssnnnndddd0110n0m0mmmm_case_0()6232   VRSUBHN_111100111dssnnnndddd0110n0m0mmmm_case_0()
6233      : ClassDecoder() {}
6234   virtual RegisterList defs(Instruction inst) const;
6235   virtual SafetyLevel safety(Instruction i) const;
6236   virtual RegisterList uses(Instruction i) const;
6237  private:
6238   NACL_DISALLOW_COPY_AND_ASSIGN(
6239       VRSUBHN_111100111dssnnnndddd0110n0m0mmmm_case_0);
6240 };
6241 
6242 // VSHLL_A1_or_VMOVL_1111001u1diiiiiidddd101000m1mmmm_case_0:
6243 //
6244 //   {D: D(22),
6245 //    L: L(7),
6246 //    M: M(5),
6247 //    Q: Q(6),
6248 //    U: U(24),
6249 //    Vd: Vd(15:12),
6250 //    Vm: Vm(3:0),
6251 //    arch: ASIMD,
6252 //    d: D:Vd,
6253 //    defs: {},
6254 //    elements: 8
6255 //         if imm6(21:16)=001xxx
6256 //         else 4
6257 //         if imm6(21:16)=01xxxx
6258 //         else 2
6259 //         if imm6(21:16)=1xxxxx
6260 //         else 0,
6261 //    esize: 8
6262 //         if imm6(21:16)=001xxx
6263 //         else 16
6264 //         if imm6(21:16)=01xxxx
6265 //         else 32
6266 //         if imm6(21:16)=1xxxxx
6267 //         else 0,
6268 //    fields: [U(24),
6269 //      D(22),
6270 //      imm6(21:16),
6271 //      Vd(15:12),
6272 //      op(8),
6273 //      L(7),
6274 //      Q(6),
6275 //      M(5),
6276 //      Vm(3:0)],
6277 //    imm6: imm6(21:16),
6278 //    n: M:Vm,
6279 //    op: op(8),
6280 //    pattern: 1111001u1diiiiiidddd101000m1mmmm,
6281 //    regs: 1
6282 //         if Q(6)=0
6283 //         else 2,
6284 //    rule: VSHLL_A1_or_VMOVL,
6285 //    safety: [imm6(21:16)=000xxx => DECODER_ERROR, Vd(0)=1 => UNDEFINED],
6286 //    shift_amount: imm6 - 8
6287 //         if imm6(21:16)=001xxx
6288 //         else imm6 - 16
6289 //         if imm6(21:16)=01xxxx
6290 //         else imm6 - 32
6291 //         if imm6(21:16)=1xxxxx
6292 //         else 0,
6293 //    uses: {}}
6294 class VSHLL_A1_or_VMOVL_1111001u1diiiiiidddd101000m1mmmm_case_0
6295      : public ClassDecoder {
6296  public:
VSHLL_A1_or_VMOVL_1111001u1diiiiiidddd101000m1mmmm_case_0()6297   VSHLL_A1_or_VMOVL_1111001u1diiiiiidddd101000m1mmmm_case_0()
6298      : ClassDecoder() {}
6299   virtual RegisterList defs(Instruction inst) const;
6300   virtual SafetyLevel safety(Instruction i) const;
6301   virtual RegisterList uses(Instruction i) const;
6302  private:
6303   NACL_DISALLOW_COPY_AND_ASSIGN(
6304       VSHLL_A1_or_VMOVL_1111001u1diiiiiidddd101000m1mmmm_case_0);
6305 };
6306 
6307 // VSHLL_A2_111100111d11ss10dddd001100m0mmmm_case_0:
6308 //
6309 //   {D: D(22),
6310 //    F: F(10),
6311 //    M: M(5),
6312 //    Q: Q(6),
6313 //    Vd: Vd(15:12),
6314 //    Vm: Vm(3:0),
6315 //    arch: ASIMD,
6316 //    d: D:Vd,
6317 //    defs: {},
6318 //    elements: 64 / esize,
6319 //    esize: 8 << size,
6320 //    fields: [D(22),
6321 //      size(19:18),
6322 //      Vd(15:12),
6323 //      F(10),
6324 //      op(8:7),
6325 //      Q(6),
6326 //      M(5),
6327 //      Vm(3:0)],
6328 //    m: M:Vm,
6329 //    op: op(8:7),
6330 //    pattern: 111100111d11ss10dddd001100m0mmmm,
6331 //    regs: 1
6332 //         if Q(6)=0
6333 //         else 2,
6334 //    rule: VSHLL_A2,
6335 //    safety: [size(19:18)=11 ||
6336 //         Vd(0)=1 => UNDEFINED],
6337 //    shift_amount: esize,
6338 //    size: size(19:18),
6339 //    uses: {}}
6340 class VSHLL_A2_111100111d11ss10dddd001100m0mmmm_case_0
6341      : public ClassDecoder {
6342  public:
VSHLL_A2_111100111d11ss10dddd001100m0mmmm_case_0()6343   VSHLL_A2_111100111d11ss10dddd001100m0mmmm_case_0()
6344      : ClassDecoder() {}
6345   virtual RegisterList defs(Instruction inst) const;
6346   virtual SafetyLevel safety(Instruction i) const;
6347   virtual RegisterList uses(Instruction i) const;
6348  private:
6349   NACL_DISALLOW_COPY_AND_ASSIGN(
6350       VSHLL_A2_111100111d11ss10dddd001100m0mmmm_case_0);
6351 };
6352 
6353 // VSHL_immediate_111100101diiiiiidddd0101lqm1mmmm_case_0:
6354 //
6355 //   {D: D(22),
6356 //    L: L(7),
6357 //    M: M(5),
6358 //    Q: Q(6),
6359 //    U: U(24),
6360 //    Vd: Vd(15:12),
6361 //    Vm: Vm(3:0),
6362 //    arch: ASIMD,
6363 //    d: D:Vd,
6364 //    defs: {},
6365 //    elements: 8
6366 //         if L:imm6(6:0)=0001xxx
6367 //         else 4
6368 //         if L:imm6(6:0)=001xxxx
6369 //         else 2
6370 //         if L:imm6(6:0)=01xxxxx
6371 //         else 1
6372 //         if L:imm6(6:0)=1xxxxxx
6373 //         else 0,
6374 //    esize: 8
6375 //         if L:imm6(6:0)=0001xxx
6376 //         else 16
6377 //         if L:imm6(6:0)=001xxxx
6378 //         else 32
6379 //         if L:imm6(6:0)=01xxxxx
6380 //         else 64
6381 //         if L:imm6(6:0)=1xxxxxx
6382 //         else 0,
6383 //    fields: [U(24),
6384 //      D(22),
6385 //      imm6(21:16),
6386 //      Vd(15:12),
6387 //      op(8),
6388 //      L(7),
6389 //      Q(6),
6390 //      M(5),
6391 //      Vm(3:0)],
6392 //    imm6: imm6(21:16),
6393 //    n: M:Vm,
6394 //    op: op(8),
6395 //    pattern: 111100101diiiiiidddd0101lqm1mmmm,
6396 //    regs: 1
6397 //         if Q(6)=0
6398 //         else 2,
6399 //    rule: VSHL_immediate,
6400 //    safety: [L:imm6(6:0)=0000xxx => DECODER_ERROR,
6401 //      Q(6)=1 &&
6402 //         (Vd(0)=1 ||
6403 //         Vm(0)=1) => UNDEFINED],
6404 //    shift_amount: imm6 - 8
6405 //         if L:imm6(6:0)=0001xxx
6406 //         else imm6 - 16
6407 //         if L:imm6(6:0)=001xxxx
6408 //         else imm6 - 32
6409 //         if L:imm6(6:0)=01xxxxx
6410 //         else imm6
6411 //         if L:imm6(6:0)=1xxxxxx
6412 //         else 0,
6413 //    unsigned: U(24)=1,
6414 //    uses: {}}
6415 class VSHL_immediate_111100101diiiiiidddd0101lqm1mmmm_case_0
6416      : public ClassDecoder {
6417  public:
VSHL_immediate_111100101diiiiiidddd0101lqm1mmmm_case_0()6418   VSHL_immediate_111100101diiiiiidddd0101lqm1mmmm_case_0()
6419      : ClassDecoder() {}
6420   virtual RegisterList defs(Instruction inst) const;
6421   virtual SafetyLevel safety(Instruction i) const;
6422   virtual RegisterList uses(Instruction i) const;
6423  private:
6424   NACL_DISALLOW_COPY_AND_ASSIGN(
6425       VSHL_immediate_111100101diiiiiidddd0101lqm1mmmm_case_0);
6426 };
6427 
6428 // VSHL_register_1111001u0dssnnnndddd0100nqm0mmmm_case_0:
6429 //
6430 //   {D: D(22),
6431 //    M: M(5),
6432 //    N: N(7),
6433 //    Q: Q(6),
6434 //    U: U(24),
6435 //    Vd: Vd(15:12),
6436 //    Vm: Vm(3:0),
6437 //    Vn: Vn(19:16),
6438 //    arch: ASIMD,
6439 //    d: D:Vd,
6440 //    defs: {},
6441 //    elements: 64 / esize,
6442 //    esize: 8 << size,
6443 //    fields: [U(24),
6444 //      D(22),
6445 //      size(21:20),
6446 //      Vn(19:16),
6447 //      Vd(15:12),
6448 //      op(9),
6449 //      N(7),
6450 //      Q(6),
6451 //      M(5),
6452 //      Vm(3:0)],
6453 //    m: M:Vm,
6454 //    n: N:Vn,
6455 //    op: op(9),
6456 //    pattern: 1111001u0dssnnnndddd0100nqm0mmmm,
6457 //    regs: 1
6458 //         if Q(6)=0
6459 //         else 2,
6460 //    rule: VSHL_register,
6461 //    safety: [Q(6)=1 &&
6462 //         (Vd(0)=1 ||
6463 //         Vn(0)=1 ||
6464 //         Vm(0)=1) => UNDEFINED],
6465 //    size: size(21:20),
6466 //    unsigned: U(24)=1,
6467 //    uses: {}}
6468 class VSHL_register_1111001u0dssnnnndddd0100nqm0mmmm_case_0
6469      : public ClassDecoder {
6470  public:
VSHL_register_1111001u0dssnnnndddd0100nqm0mmmm_case_0()6471   VSHL_register_1111001u0dssnnnndddd0100nqm0mmmm_case_0()
6472      : ClassDecoder() {}
6473   virtual RegisterList defs(Instruction inst) const;
6474   virtual SafetyLevel safety(Instruction i) const;
6475   virtual RegisterList uses(Instruction i) const;
6476  private:
6477   NACL_DISALLOW_COPY_AND_ASSIGN(
6478       VSHL_register_1111001u0dssnnnndddd0100nqm0mmmm_case_0);
6479 };
6480 
6481 // VSHRN_111100101diiiiiidddd100000m1mmmm_case_0:
6482 //
6483 //   {D: D(22),
6484 //    L: L(7),
6485 //    M: M(5),
6486 //    Q: Q(6),
6487 //    U: U(24),
6488 //    Vd: Vd(15:12),
6489 //    Vm: Vm(3:0),
6490 //    arch: ASIMD,
6491 //    d: D:Vd,
6492 //    defs: {},
6493 //    elements: 8
6494 //         if imm6(21:16)=001xxx
6495 //         else 4
6496 //         if imm6(21:16)=01xxxx
6497 //         else 2
6498 //         if imm6(21:16)=1xxxxx
6499 //         else 0,
6500 //    esize: 8
6501 //         if imm6(21:16)=001xxx
6502 //         else 16
6503 //         if imm6(21:16)=01xxxx
6504 //         else 32
6505 //         if imm6(21:16)=1xxxxx
6506 //         else 0,
6507 //    fields: [U(24),
6508 //      D(22),
6509 //      imm6(21:16),
6510 //      Vd(15:12),
6511 //      op(8),
6512 //      L(7),
6513 //      Q(6),
6514 //      M(5),
6515 //      Vm(3:0)],
6516 //    imm6: imm6(21:16),
6517 //    n: M:Vm,
6518 //    op: op(8),
6519 //    pattern: 111100101diiiiiidddd100000m1mmmm,
6520 //    regs: 1
6521 //         if Q(6)=0
6522 //         else 2,
6523 //    rule: VSHRN,
6524 //    safety: [imm6(21:16)=000xxx => DECODER_ERROR, Vm(0)=1 => UNDEFINED],
6525 //    shift_amount: 16 - imm6
6526 //         if imm6(21:16)=001xxx
6527 //         else 32 - imm6
6528 //         if imm6(21:16)=01xxxx
6529 //         else 64 - imm6
6530 //         if imm6(21:16)=1xxxxx
6531 //         else 0,
6532 //    uses: {}}
6533 class VSHRN_111100101diiiiiidddd100000m1mmmm_case_0
6534      : public ClassDecoder {
6535  public:
VSHRN_111100101diiiiiidddd100000m1mmmm_case_0()6536   VSHRN_111100101diiiiiidddd100000m1mmmm_case_0()
6537      : ClassDecoder() {}
6538   virtual RegisterList defs(Instruction inst) const;
6539   virtual SafetyLevel safety(Instruction i) const;
6540   virtual RegisterList uses(Instruction i) const;
6541  private:
6542   NACL_DISALLOW_COPY_AND_ASSIGN(
6543       VSHRN_111100101diiiiiidddd100000m1mmmm_case_0);
6544 };
6545 
6546 // VSHR_1111001u1diiiiiidddd0000lqm1mmmm_case_0:
6547 //
6548 //   {D: D(22),
6549 //    L: L(7),
6550 //    M: M(5),
6551 //    Q: Q(6),
6552 //    U: U(24),
6553 //    Vd: Vd(15:12),
6554 //    Vm: Vm(3:0),
6555 //    arch: ASIMD,
6556 //    d: D:Vd,
6557 //    defs: {},
6558 //    elements: 8
6559 //         if L:imm6(6:0)=0001xxx
6560 //         else 4
6561 //         if L:imm6(6:0)=001xxxx
6562 //         else 2
6563 //         if L:imm6(6:0)=01xxxxx
6564 //         else 1
6565 //         if L:imm6(6:0)=1xxxxxx
6566 //         else 0,
6567 //    esize: 8
6568 //         if L:imm6(6:0)=0001xxx
6569 //         else 16
6570 //         if L:imm6(6:0)=001xxxx
6571 //         else 32
6572 //         if L:imm6(6:0)=01xxxxx
6573 //         else 64
6574 //         if L:imm6(6:0)=1xxxxxx
6575 //         else 0,
6576 //    fields: [U(24),
6577 //      D(22),
6578 //      imm6(21:16),
6579 //      Vd(15:12),
6580 //      op(8),
6581 //      L(7),
6582 //      Q(6),
6583 //      M(5),
6584 //      Vm(3:0)],
6585 //    imm6: imm6(21:16),
6586 //    n: M:Vm,
6587 //    op: op(8),
6588 //    pattern: 1111001u1diiiiiidddd0000lqm1mmmm,
6589 //    regs: 1
6590 //         if Q(6)=0
6591 //         else 2,
6592 //    rule: VSHR,
6593 //    safety: [L:imm6(6:0)=0000xxx => DECODER_ERROR,
6594 //      Q(6)=1 &&
6595 //         (Vd(0)=1 ||
6596 //         Vm(0)=1) => UNDEFINED],
6597 //    shift_amount: 16 - imm6
6598 //         if L:imm6(6:0)=0001xxx
6599 //         else 32 - imm6
6600 //         if L:imm6(6:0)=001xxxx
6601 //         else 64 - imm6,
6602 //    unsigned: U(24)=1,
6603 //    uses: {}}
6604 class VSHR_1111001u1diiiiiidddd0000lqm1mmmm_case_0
6605      : public ClassDecoder {
6606  public:
VSHR_1111001u1diiiiiidddd0000lqm1mmmm_case_0()6607   VSHR_1111001u1diiiiiidddd0000lqm1mmmm_case_0()
6608      : ClassDecoder() {}
6609   virtual RegisterList defs(Instruction inst) const;
6610   virtual SafetyLevel safety(Instruction i) const;
6611   virtual RegisterList uses(Instruction i) const;
6612  private:
6613   NACL_DISALLOW_COPY_AND_ASSIGN(
6614       VSHR_1111001u1diiiiiidddd0000lqm1mmmm_case_0);
6615 };
6616 
6617 // VSLI_111100111diiiiiidddd0101lqm1mmmm_case_0:
6618 //
6619 //   {D: D(22),
6620 //    L: L(7),
6621 //    M: M(5),
6622 //    Q: Q(6),
6623 //    U: U(24),
6624 //    Vd: Vd(15:12),
6625 //    Vm: Vm(3:0),
6626 //    arch: ASIMD,
6627 //    d: D:Vd,
6628 //    defs: {},
6629 //    elements: 8
6630 //         if L:imm6(6:0)=0001xxx
6631 //         else 4
6632 //         if L:imm6(6:0)=001xxxx
6633 //         else 2
6634 //         if L:imm6(6:0)=01xxxxx
6635 //         else 1
6636 //         if L:imm6(6:0)=1xxxxxx
6637 //         else 0,
6638 //    esize: 8
6639 //         if L:imm6(6:0)=0001xxx
6640 //         else 16
6641 //         if L:imm6(6:0)=001xxxx
6642 //         else 32
6643 //         if L:imm6(6:0)=01xxxxx
6644 //         else 64
6645 //         if L:imm6(6:0)=1xxxxxx
6646 //         else 0,
6647 //    fields: [U(24),
6648 //      D(22),
6649 //      imm6(21:16),
6650 //      Vd(15:12),
6651 //      op(8),
6652 //      L(7),
6653 //      Q(6),
6654 //      M(5),
6655 //      Vm(3:0)],
6656 //    imm6: imm6(21:16),
6657 //    n: M:Vm,
6658 //    op: op(8),
6659 //    pattern: 111100111diiiiiidddd0101lqm1mmmm,
6660 //    regs: 1
6661 //         if Q(6)=0
6662 //         else 2,
6663 //    rule: VSLI,
6664 //    safety: [L:imm6(6:0)=0000xxx => DECODER_ERROR,
6665 //      Q(6)=1 &&
6666 //         (Vd(0)=1 ||
6667 //         Vm(0)=1) => UNDEFINED],
6668 //    shift_amount: imm6 - 8
6669 //         if L:imm6(6:0)=0001xxx
6670 //         else imm6 - 16
6671 //         if L:imm6(6:0)=001xxxx
6672 //         else imm6 - 32
6673 //         if L:imm6(6:0)=01xxxxx
6674 //         else imm6
6675 //         if L:imm6(6:0)=1xxxxxx
6676 //         else 0,
6677 //    unsigned: U(24)=1,
6678 //    uses: {}}
6679 class VSLI_111100111diiiiiidddd0101lqm1mmmm_case_0
6680      : public ClassDecoder {
6681  public:
VSLI_111100111diiiiiidddd0101lqm1mmmm_case_0()6682   VSLI_111100111diiiiiidddd0101lqm1mmmm_case_0()
6683      : ClassDecoder() {}
6684   virtual RegisterList defs(Instruction inst) const;
6685   virtual SafetyLevel safety(Instruction i) const;
6686   virtual RegisterList uses(Instruction i) const;
6687  private:
6688   NACL_DISALLOW_COPY_AND_ASSIGN(
6689       VSLI_111100111diiiiiidddd0101lqm1mmmm_case_0);
6690 };
6691 
6692 // VSQRT_cccc11101d110001dddd101s11m0mmmm_case_0:
6693 //
6694 //   {D: D(22),
6695 //    M: M(5),
6696 //    Vd: Vd(15:12),
6697 //    Vm: Vm(3:0),
6698 //    advsimd: false,
6699 //    arch: VFPv2,
6700 //    cond: cond(31:28),
6701 //    d: Vd:D
6702 //         if sz(8)=0
6703 //         else D:Vd,
6704 //    defs: {},
6705 //    dp_operation: sz(8)=1,
6706 //    false: false,
6707 //    fields: [cond(31:28), D(22), Vd(15:12), sz(8), M(5), Vm(3:0)],
6708 //    m: Vm:D
6709 //         if sz(8)=0
6710 //         else M:Vm,
6711 //    pattern: cccc11101d110001dddd101s11m0mmmm,
6712 //    rule: VSQRT,
6713 //    safety: [true => MAY_BE_SAFE],
6714 //    sz: sz(8),
6715 //    true: true,
6716 //    uses: {}}
6717 class VSQRT_cccc11101d110001dddd101s11m0mmmm_case_0
6718      : public ClassDecoder {
6719  public:
VSQRT_cccc11101d110001dddd101s11m0mmmm_case_0()6720   VSQRT_cccc11101d110001dddd101s11m0mmmm_case_0()
6721      : ClassDecoder() {}
6722   virtual RegisterList defs(Instruction inst) const;
6723   virtual SafetyLevel safety(Instruction i) const;
6724   virtual RegisterList uses(Instruction i) const;
6725  private:
6726   NACL_DISALLOW_COPY_AND_ASSIGN(
6727       VSQRT_cccc11101d110001dddd101s11m0mmmm_case_0);
6728 };
6729 
6730 // VSRA_1111001u1diiiiiidddd0001lqm1mmmm_case_0:
6731 //
6732 //   {D: D(22),
6733 //    L: L(7),
6734 //    M: M(5),
6735 //    Q: Q(6),
6736 //    U: U(24),
6737 //    Vd: Vd(15:12),
6738 //    Vm: Vm(3:0),
6739 //    arch: ASIMD,
6740 //    d: D:Vd,
6741 //    defs: {},
6742 //    elements: 8
6743 //         if L:imm6(6:0)=0001xxx
6744 //         else 4
6745 //         if L:imm6(6:0)=001xxxx
6746 //         else 2
6747 //         if L:imm6(6:0)=01xxxxx
6748 //         else 1
6749 //         if L:imm6(6:0)=1xxxxxx
6750 //         else 0,
6751 //    esize: 8
6752 //         if L:imm6(6:0)=0001xxx
6753 //         else 16
6754 //         if L:imm6(6:0)=001xxxx
6755 //         else 32
6756 //         if L:imm6(6:0)=01xxxxx
6757 //         else 64
6758 //         if L:imm6(6:0)=1xxxxxx
6759 //         else 0,
6760 //    fields: [U(24),
6761 //      D(22),
6762 //      imm6(21:16),
6763 //      Vd(15:12),
6764 //      op(8),
6765 //      L(7),
6766 //      Q(6),
6767 //      M(5),
6768 //      Vm(3:0)],
6769 //    imm6: imm6(21:16),
6770 //    n: M:Vm,
6771 //    op: op(8),
6772 //    pattern: 1111001u1diiiiiidddd0001lqm1mmmm,
6773 //    regs: 1
6774 //         if Q(6)=0
6775 //         else 2,
6776 //    rule: VSRA,
6777 //    safety: [L:imm6(6:0)=0000xxx => DECODER_ERROR,
6778 //      Q(6)=1 &&
6779 //         (Vd(0)=1 ||
6780 //         Vm(0)=1) => UNDEFINED],
6781 //    shift_amount: 16 - imm6
6782 //         if L:imm6(6:0)=0001xxx
6783 //         else 32 - imm6
6784 //         if L:imm6(6:0)=001xxxx
6785 //         else 64 - imm6,
6786 //    unsigned: U(24)=1,
6787 //    uses: {}}
6788 class VSRA_1111001u1diiiiiidddd0001lqm1mmmm_case_0
6789      : public ClassDecoder {
6790  public:
VSRA_1111001u1diiiiiidddd0001lqm1mmmm_case_0()6791   VSRA_1111001u1diiiiiidddd0001lqm1mmmm_case_0()
6792      : ClassDecoder() {}
6793   virtual RegisterList defs(Instruction inst) const;
6794   virtual SafetyLevel safety(Instruction i) const;
6795   virtual RegisterList uses(Instruction i) const;
6796  private:
6797   NACL_DISALLOW_COPY_AND_ASSIGN(
6798       VSRA_1111001u1diiiiiidddd0001lqm1mmmm_case_0);
6799 };
6800 
6801 // VSRI_111100111diiiiiidddd0100lqm1mmmm_case_0:
6802 //
6803 //   {D: D(22),
6804 //    L: L(7),
6805 //    M: M(5),
6806 //    Q: Q(6),
6807 //    U: U(24),
6808 //    Vd: Vd(15:12),
6809 //    Vm: Vm(3:0),
6810 //    arch: ASIMD,
6811 //    d: D:Vd,
6812 //    defs: {},
6813 //    elements: 8
6814 //         if L:imm6(6:0)=0001xxx
6815 //         else 4
6816 //         if L:imm6(6:0)=001xxxx
6817 //         else 2
6818 //         if L:imm6(6:0)=01xxxxx
6819 //         else 1
6820 //         if L:imm6(6:0)=1xxxxxx
6821 //         else 0,
6822 //    esize: 8
6823 //         if L:imm6(6:0)=0001xxx
6824 //         else 16
6825 //         if L:imm6(6:0)=001xxxx
6826 //         else 32
6827 //         if L:imm6(6:0)=01xxxxx
6828 //         else 64
6829 //         if L:imm6(6:0)=1xxxxxx
6830 //         else 0,
6831 //    fields: [U(24),
6832 //      D(22),
6833 //      imm6(21:16),
6834 //      Vd(15:12),
6835 //      op(8),
6836 //      L(7),
6837 //      Q(6),
6838 //      M(5),
6839 //      Vm(3:0)],
6840 //    imm6: imm6(21:16),
6841 //    n: M:Vm,
6842 //    op: op(8),
6843 //    pattern: 111100111diiiiiidddd0100lqm1mmmm,
6844 //    regs: 1
6845 //         if Q(6)=0
6846 //         else 2,
6847 //    rule: VSRI,
6848 //    safety: [L:imm6(6:0)=0000xxx => DECODER_ERROR,
6849 //      Q(6)=1 &&
6850 //         (Vd(0)=1 ||
6851 //         Vm(0)=1) => UNDEFINED],
6852 //    shift_amount: 16 - imm6
6853 //         if L:imm6(6:0)=0001xxx
6854 //         else 32 - imm6
6855 //         if L:imm6(6:0)=001xxxx
6856 //         else 64 - imm6,
6857 //    unsigned: U(24)=1,
6858 //    uses: {}}
6859 class VSRI_111100111diiiiiidddd0100lqm1mmmm_case_0
6860      : public ClassDecoder {
6861  public:
VSRI_111100111diiiiiidddd0100lqm1mmmm_case_0()6862   VSRI_111100111diiiiiidddd0100lqm1mmmm_case_0()
6863      : ClassDecoder() {}
6864   virtual RegisterList defs(Instruction inst) const;
6865   virtual SafetyLevel safety(Instruction i) const;
6866   virtual RegisterList uses(Instruction i) const;
6867  private:
6868   NACL_DISALLOW_COPY_AND_ASSIGN(
6869       VSRI_111100111diiiiiidddd0100lqm1mmmm_case_0);
6870 };
6871 
6872 // VST1_multiple_single_elements_111101000d00nnnnddddttttssaammmm_case_0:
6873 //
6874 //   {D: D(22),
6875 //    None: 32,
6876 //    Pc: 15,
6877 //    Rm: Rm(3:0),
6878 //    Rn: Rn(19:16),
6879 //    Sp: 13,
6880 //    Vd: Vd(15:12),
6881 //    align: align(5:4),
6882 //    alignment: 1
6883 //         if align(5:4)=00
6884 //         else 4 << align,
6885 //    arch: ASIMD,
6886 //    base: n,
6887 //    d: D:Vd,
6888 //    defs: {base}
6889 //         if wback
6890 //         else {},
6891 //    ebytes: 1 << size,
6892 //    elements: 8 / ebytes,
6893 //    esize: 8 * ebytes,
6894 //    fields: [D(22),
6895 //      Rn(19:16),
6896 //      Vd(15:12),
6897 //      type(11:8),
6898 //      size(7:6),
6899 //      align(5:4),
6900 //      Rm(3:0)],
6901 //    m: Rm,
6902 //    n: Rn,
6903 //    pattern: 111101000d00nnnnddddttttssaammmm,
6904 //    register_index: (m  !=
6905 //            Pc &&
6906 //         m  !=
6907 //            Sp),
6908 //    regs: 1
6909 //         if type(11:8)=0111
6910 //         else 2
6911 //         if type(11:8)=1010
6912 //         else 3
6913 //         if type(11:8)=0110
6914 //         else 4
6915 //         if type(11:8)=0010
6916 //         else 0,
6917 //    rule: VST1_multiple_single_elements,
6918 //    safety: [type(11:8)=0111 &&
6919 //         align(1)=1 => UNDEFINED,
6920 //      type(11:8)=1010 &&
6921 //         align(5:4)=11 => UNDEFINED,
6922 //      type(11:8)=0110 &&
6923 //         align(1)=1 => UNDEFINED,
6924 //      not type in bitset {'0111', '1010', '0110', '0010'} => DECODER_ERROR,
6925 //      n  ==
6926 //            Pc ||
6927 //         d + regs  >
6928 //            32 => UNPREDICTABLE],
6929 //    size: size(7:6),
6930 //    small_imm_base_wb: wback &&
6931 //         not register_index,
6932 //    type: type(11:8),
6933 //    uses: {m
6934 //         if wback
6935 //         else None, n},
6936 //    violations: [implied by 'base'],
6937 //    wback: (m  !=
6938 //            Pc)}
6939 class VST1_multiple_single_elements_111101000d00nnnnddddttttssaammmm_case_0
6940      : public ClassDecoder {
6941  public:
VST1_multiple_single_elements_111101000d00nnnnddddttttssaammmm_case_0()6942   VST1_multiple_single_elements_111101000d00nnnnddddttttssaammmm_case_0()
6943      : ClassDecoder() {}
6944   virtual Register base_address_register(Instruction i) const;
6945   virtual RegisterList defs(Instruction inst) const;
6946   virtual SafetyLevel safety(Instruction i) const;
6947   virtual bool base_address_register_writeback_small_immediate(
6948       Instruction i) const;
6949   virtual RegisterList uses(Instruction i) const;
6950   virtual ViolationSet get_violations(
6951       const nacl_arm_val::DecodedInstruction& first,
6952       const nacl_arm_val::DecodedInstruction& second,
6953       const nacl_arm_val::SfiValidator& sfi,
6954       nacl_arm_val::AddressSet* branches,
6955       nacl_arm_val::AddressSet* critical,
6956       uint32_t* next_inst_addr) const;
6957  private:
6958   NACL_DISALLOW_COPY_AND_ASSIGN(
6959       VST1_multiple_single_elements_111101000d00nnnnddddttttssaammmm_case_0);
6960 };
6961 
6962 // VST1_single_element_from_one_lane_111101001d00nnnnddddss00aaaammmm_case_0:
6963 //
6964 //   {D: D(22),
6965 //    None: 32,
6966 //    Pc: 15,
6967 //    Rm: Rm(3:0),
6968 //    Rn: Rn(19:16),
6969 //    Sp: 13,
6970 //    Vd: Vd(15:12),
6971 //    alignment: 1
6972 //         if size(11:10)=00
6973 //         else (1
6974 //         if index_align(0)=0
6975 //         else 2)
6976 //         if size(11:10)=01
6977 //         else (1
6978 //         if index_align(1:0)=00
6979 //         else 4)
6980 //         if size(11:10)=10
6981 //         else 0,
6982 //    arch: ASIMD,
6983 //    base: n,
6984 //    d: D:Vd,
6985 //    defs: {base}
6986 //         if wback
6987 //         else {},
6988 //    ebytes: 1 << size,
6989 //    esize: 8 * ebytes,
6990 //    fields: [D(22),
6991 //      Rn(19:16),
6992 //      Vd(15:12),
6993 //      size(11:10),
6994 //      index_align(7:4),
6995 //      Rm(3:0)],
6996 //    inc: 1
6997 //         if size(11:10)=00
6998 //         else (1
6999 //         if index_align(1)=0
7000 //         else 2)
7001 //         if size(11:10)=01
7002 //         else (1
7003 //         if index_align(2)=0
7004 //         else 2)
7005 //         if size(11:10)=10
7006 //         else 0,
7007 //    index: index_align(3:1)
7008 //         if size(11:10)=00
7009 //         else index_align(3:2)
7010 //         if size(11:10)=01
7011 //         else index_align(3)
7012 //         if size(11:10)=10
7013 //         else 0,
7014 //    index_align: index_align(7:4),
7015 //    m: Rm,
7016 //    n: Rn,
7017 //    pattern: 111101001d00nnnnddddss00aaaammmm,
7018 //    register_index: (m  !=
7019 //            Pc &&
7020 //         m  !=
7021 //            Sp),
7022 //    rule: VST1_single_element_from_one_lane,
7023 //    safety: [size(11:10)=11 => UNDEFINED,
7024 //      size(11:10)=00 &&
7025 //         index_align(0)=~0 => UNDEFINED,
7026 //      size(11:10)=01 &&
7027 //         index_align(1)=~0 => UNDEFINED,
7028 //      size(11:10)=10 &&
7029 //         index_align(2)=~0 => UNDEFINED,
7030 //      size(11:10)=10 &&
7031 //         index_align(1:0)=~00 &&
7032 //         index_align(1:0)=~11 => UNDEFINED,
7033 //      n  ==
7034 //            Pc => UNPREDICTABLE],
7035 //    size: size(11:10),
7036 //    small_imm_base_wb: wback &&
7037 //         not register_index,
7038 //    uses: {m
7039 //         if wback
7040 //         else None, n},
7041 //    violations: [implied by 'base'],
7042 //    wback: (m  !=
7043 //            Pc)}
7044 class VST1_single_element_from_one_lane_111101001d00nnnnddddss00aaaammmm_case_0
7045      : public ClassDecoder {
7046  public:
VST1_single_element_from_one_lane_111101001d00nnnnddddss00aaaammmm_case_0()7047   VST1_single_element_from_one_lane_111101001d00nnnnddddss00aaaammmm_case_0()
7048      : ClassDecoder() {}
7049   virtual Register base_address_register(Instruction i) const;
7050   virtual RegisterList defs(Instruction inst) const;
7051   virtual SafetyLevel safety(Instruction i) const;
7052   virtual bool base_address_register_writeback_small_immediate(
7053       Instruction i) const;
7054   virtual RegisterList uses(Instruction i) const;
7055   virtual ViolationSet get_violations(
7056       const nacl_arm_val::DecodedInstruction& first,
7057       const nacl_arm_val::DecodedInstruction& second,
7058       const nacl_arm_val::SfiValidator& sfi,
7059       nacl_arm_val::AddressSet* branches,
7060       nacl_arm_val::AddressSet* critical,
7061       uint32_t* next_inst_addr) const;
7062  private:
7063   NACL_DISALLOW_COPY_AND_ASSIGN(
7064       VST1_single_element_from_one_lane_111101001d00nnnnddddss00aaaammmm_case_0);
7065 };
7066 
7067 // VST2_multiple_2_element_structures_111101000d00nnnnddddttttssaammmm_case_0:
7068 //
7069 //   {D: D(22),
7070 //    None: 32,
7071 //    Pc: 15,
7072 //    Rm: Rm(3:0),
7073 //    Rn: Rn(19:16),
7074 //    Sp: 13,
7075 //    Vd: Vd(15:12),
7076 //    align: align(5:4),
7077 //    alignment: 1
7078 //         if align(5:4)=00
7079 //         else 4 << align,
7080 //    arch: ASIMD,
7081 //    base: n,
7082 //    d: D:Vd,
7083 //    d2: d + inc,
7084 //    defs: {base}
7085 //         if wback
7086 //         else {},
7087 //    ebytes: 1 << size,
7088 //    elements: 8 / ebytes,
7089 //    esize: 8 * ebytes,
7090 //    fields: [D(22),
7091 //      Rn(19:16),
7092 //      Vd(15:12),
7093 //      type(11:8),
7094 //      size(7:6),
7095 //      align(5:4),
7096 //      Rm(3:0)],
7097 //    inc: 1
7098 //         if type(11:8)=1000
7099 //         else 2,
7100 //    m: Rm,
7101 //    n: Rn,
7102 //    pattern: 111101000d00nnnnddddttttssaammmm,
7103 //    register_index: (m  !=
7104 //            Pc &&
7105 //         m  !=
7106 //            Sp),
7107 //    regs: 1
7108 //         if type in bitset {'1000', '1001'}
7109 //         else 2,
7110 //    rule: VST2_multiple_2_element_structures,
7111 //    safety: [size(7:6)=11 => UNDEFINED,
7112 //      type in bitset {'1000', '1001'} &&
7113 //         align(5:4)=11 => UNDEFINED,
7114 //      not type in bitset {'1000', '1001', '0011'} => DECODER_ERROR,
7115 //      n  ==
7116 //            Pc ||
7117 //         d2 + regs  >
7118 //            32 => UNPREDICTABLE],
7119 //    size: size(7:6),
7120 //    small_imm_base_wb: wback &&
7121 //         not register_index,
7122 //    type: type(11:8),
7123 //    uses: {m
7124 //         if wback
7125 //         else None, n},
7126 //    violations: [implied by 'base'],
7127 //    wback: (m  !=
7128 //            Pc)}
7129 class VST2_multiple_2_element_structures_111101000d00nnnnddddttttssaammmm_case_0
7130      : public ClassDecoder {
7131  public:
VST2_multiple_2_element_structures_111101000d00nnnnddddttttssaammmm_case_0()7132   VST2_multiple_2_element_structures_111101000d00nnnnddddttttssaammmm_case_0()
7133      : ClassDecoder() {}
7134   virtual Register base_address_register(Instruction i) const;
7135   virtual RegisterList defs(Instruction inst) const;
7136   virtual SafetyLevel safety(Instruction i) const;
7137   virtual bool base_address_register_writeback_small_immediate(
7138       Instruction i) const;
7139   virtual RegisterList uses(Instruction i) const;
7140   virtual ViolationSet get_violations(
7141       const nacl_arm_val::DecodedInstruction& first,
7142       const nacl_arm_val::DecodedInstruction& second,
7143       const nacl_arm_val::SfiValidator& sfi,
7144       nacl_arm_val::AddressSet* branches,
7145       nacl_arm_val::AddressSet* critical,
7146       uint32_t* next_inst_addr) const;
7147  private:
7148   NACL_DISALLOW_COPY_AND_ASSIGN(
7149       VST2_multiple_2_element_structures_111101000d00nnnnddddttttssaammmm_case_0);
7150 };
7151 
7152 // VST2_single_2_element_structure_from_one_lane_111101001d00nnnnddddss01aaaammmm_case_0:
7153 //
7154 //   {D: D(22),
7155 //    None: 32,
7156 //    Pc: 15,
7157 //    Rm: Rm(3:0),
7158 //    Rn: Rn(19:16),
7159 //    Sp: 13,
7160 //    Vd: Vd(15:12),
7161 //    alignment: (1
7162 //         if index_align(0)=0
7163 //         else 2)
7164 //         if size(11:10)=00
7165 //         else (1
7166 //         if index_align(0)=0
7167 //         else 4)
7168 //         if size(11:10)=01
7169 //         else (1
7170 //         if index_align(0)=0
7171 //         else 8)
7172 //         if size(11:10)=10
7173 //         else 0,
7174 //    arch: ASIMD,
7175 //    base: n,
7176 //    d: D:Vd,
7177 //    d2: d + inc,
7178 //    defs: {base}
7179 //         if wback
7180 //         else {},
7181 //    ebytes: 1 << size,
7182 //    esize: 8 * ebytes,
7183 //    fields: [D(22),
7184 //      Rn(19:16),
7185 //      Vd(15:12),
7186 //      size(11:10),
7187 //      index_align(7:4),
7188 //      Rm(3:0)],
7189 //    inc: 1
7190 //         if size(11:10)=00
7191 //         else (1
7192 //         if index_align(1)=0
7193 //         else 2)
7194 //         if size(11:10)=01
7195 //         else (1
7196 //         if index_align(2)=0
7197 //         else 2)
7198 //         if size(11:10)=10
7199 //         else 0,
7200 //    index: index_align(3:1)
7201 //         if size(11:10)=00
7202 //         else index_align(3:2)
7203 //         if size(11:10)=01
7204 //         else index_align(3)
7205 //         if size(11:10)=10
7206 //         else 0,
7207 //    index_align: index_align(7:4),
7208 //    m: Rm,
7209 //    n: Rn,
7210 //    pattern: 111101001d00nnnnddddss01aaaammmm,
7211 //    register_index: (m  !=
7212 //            Pc &&
7213 //         m  !=
7214 //            Sp),
7215 //    rule: VST2_single_2_element_structure_from_one_lane,
7216 //    safety: [size(11:10)=11 => UNDEFINED,
7217 //      size(11:10)=10 &&
7218 //         index_align(1)=~0 => UNDEFINED,
7219 //      n  ==
7220 //            Pc ||
7221 //         d2  >
7222 //            31 => UNPREDICTABLE],
7223 //    size: size(11:10),
7224 //    small_imm_base_wb: wback &&
7225 //         not register_index,
7226 //    uses: {m
7227 //         if wback
7228 //         else None, n},
7229 //    violations: [implied by 'base'],
7230 //    wback: (m  !=
7231 //            Pc)}
7232 class VST2_single_2_element_structure_from_one_lane_111101001d00nnnnddddss01aaaammmm_case_0
7233      : public ClassDecoder {
7234  public:
VST2_single_2_element_structure_from_one_lane_111101001d00nnnnddddss01aaaammmm_case_0()7235   VST2_single_2_element_structure_from_one_lane_111101001d00nnnnddddss01aaaammmm_case_0()
7236      : ClassDecoder() {}
7237   virtual Register base_address_register(Instruction i) const;
7238   virtual RegisterList defs(Instruction inst) const;
7239   virtual SafetyLevel safety(Instruction i) const;
7240   virtual bool base_address_register_writeback_small_immediate(
7241       Instruction i) const;
7242   virtual RegisterList uses(Instruction i) const;
7243   virtual ViolationSet get_violations(
7244       const nacl_arm_val::DecodedInstruction& first,
7245       const nacl_arm_val::DecodedInstruction& second,
7246       const nacl_arm_val::SfiValidator& sfi,
7247       nacl_arm_val::AddressSet* branches,
7248       nacl_arm_val::AddressSet* critical,
7249       uint32_t* next_inst_addr) const;
7250  private:
7251   NACL_DISALLOW_COPY_AND_ASSIGN(
7252       VST2_single_2_element_structure_from_one_lane_111101001d00nnnnddddss01aaaammmm_case_0);
7253 };
7254 
7255 // VST3_multiple_3_element_structures_111101000d00nnnnddddttttssaammmm_case_0:
7256 //
7257 //   {D: D(22),
7258 //    None: 32,
7259 //    Pc: 15,
7260 //    Rm: Rm(3:0),
7261 //    Rn: Rn(19:16),
7262 //    Sp: 13,
7263 //    Vd: Vd(15:12),
7264 //    align: align(5:4),
7265 //    alignment: 1
7266 //         if align(0)=0
7267 //         else 8,
7268 //    arch: ASIMD,
7269 //    base: n,
7270 //    d: D:Vd,
7271 //    d2: d + inc,
7272 //    d3: d2 + inc,
7273 //    defs: {base}
7274 //         if wback
7275 //         else {},
7276 //    ebytes: 1 << size,
7277 //    elements: 8 / ebytes,
7278 //    esize: 8 * ebytes,
7279 //    fields: [D(22),
7280 //      Rn(19:16),
7281 //      Vd(15:12),
7282 //      type(11:8),
7283 //      size(7:6),
7284 //      align(5:4),
7285 //      Rm(3:0)],
7286 //    inc: 1
7287 //         if type(11:8)=0100
7288 //         else 2,
7289 //    m: Rm,
7290 //    n: Rn,
7291 //    pattern: 111101000d00nnnnddddttttssaammmm,
7292 //    register_index: (m  !=
7293 //            Pc &&
7294 //         m  !=
7295 //            Sp),
7296 //    rule: VST3_multiple_3_element_structures,
7297 //    safety: [size(7:6)=11 ||
7298 //         align(1)=1 => UNDEFINED,
7299 //      not type in bitset {'0100', '0101'} => DECODER_ERROR,
7300 //      n  ==
7301 //            Pc ||
7302 //         d3  >
7303 //            31 => UNPREDICTABLE],
7304 //    size: size(7:6),
7305 //    small_imm_base_wb: wback &&
7306 //         not register_index,
7307 //    type: type(11:8),
7308 //    uses: {m
7309 //         if wback
7310 //         else None, n},
7311 //    violations: [implied by 'base'],
7312 //    wback: (m  !=
7313 //            Pc)}
7314 class VST3_multiple_3_element_structures_111101000d00nnnnddddttttssaammmm_case_0
7315      : public ClassDecoder {
7316  public:
VST3_multiple_3_element_structures_111101000d00nnnnddddttttssaammmm_case_0()7317   VST3_multiple_3_element_structures_111101000d00nnnnddddttttssaammmm_case_0()
7318      : ClassDecoder() {}
7319   virtual Register base_address_register(Instruction i) const;
7320   virtual RegisterList defs(Instruction inst) const;
7321   virtual SafetyLevel safety(Instruction i) const;
7322   virtual bool base_address_register_writeback_small_immediate(
7323       Instruction i) const;
7324   virtual RegisterList uses(Instruction i) const;
7325   virtual ViolationSet get_violations(
7326       const nacl_arm_val::DecodedInstruction& first,
7327       const nacl_arm_val::DecodedInstruction& second,
7328       const nacl_arm_val::SfiValidator& sfi,
7329       nacl_arm_val::AddressSet* branches,
7330       nacl_arm_val::AddressSet* critical,
7331       uint32_t* next_inst_addr) const;
7332  private:
7333   NACL_DISALLOW_COPY_AND_ASSIGN(
7334       VST3_multiple_3_element_structures_111101000d00nnnnddddttttssaammmm_case_0);
7335 };
7336 
7337 // VST3_single_3_element_structure_from_one_lane_111101001d00nnnnddddss10aaaammmm_case_0:
7338 //
7339 //   {D: D(22),
7340 //    None: 32,
7341 //    Pc: 15,
7342 //    Rm: Rm(3:0),
7343 //    Rn: Rn(19:16),
7344 //    Sp: 13,
7345 //    Vd: Vd(15:12),
7346 //    alignment: 1,
7347 //    arch: ASIMD,
7348 //    base: n,
7349 //    d: D:Vd,
7350 //    d2: d + inc,
7351 //    d3: d2 + inc,
7352 //    defs: {base}
7353 //         if wback
7354 //         else {},
7355 //    ebytes: 1 << size,
7356 //    esize: 8 * ebytes,
7357 //    fields: [D(22),
7358 //      Rn(19:16),
7359 //      Vd(15:12),
7360 //      size(11:10),
7361 //      index_align(7:4),
7362 //      Rm(3:0)],
7363 //    inc: 1
7364 //         if size(11:10)=00
7365 //         else (1
7366 //         if index_align(1)=0
7367 //         else 2)
7368 //         if size(11:10)=01
7369 //         else (1
7370 //         if index_align(2)=0
7371 //         else 2)
7372 //         if size(11:10)=10
7373 //         else 0,
7374 //    index: index_align(3:1)
7375 //         if size(11:10)=00
7376 //         else index_align(3:2)
7377 //         if size(11:10)=01
7378 //         else index_align(3)
7379 //         if size(11:10)=10
7380 //         else 0,
7381 //    index_align: index_align(7:4),
7382 //    m: Rm,
7383 //    n: Rn,
7384 //    pattern: 111101001d00nnnnddddss10aaaammmm,
7385 //    register_index: (m  !=
7386 //            Pc &&
7387 //         m  !=
7388 //            Sp),
7389 //    rule: VST3_single_3_element_structure_from_one_lane,
7390 //    safety: [size(11:10)=11 => UNDEFINED,
7391 //      size(11:10)=00 &&
7392 //         index_align(0)=~0 => UNDEFINED,
7393 //      size(11:10)=01 &&
7394 //         index_align(0)=~0 => UNDEFINED,
7395 //      size(11:10)=10 &&
7396 //         index_align(1:0)=~00 => UNDEFINED,
7397 //      n  ==
7398 //            Pc ||
7399 //         d3  >
7400 //            31 => UNPREDICTABLE],
7401 //    size: size(11:10),
7402 //    small_imm_base_wb: wback &&
7403 //         not register_index,
7404 //    uses: {m
7405 //         if wback
7406 //         else None, n},
7407 //    violations: [implied by 'base'],
7408 //    wback: (m  !=
7409 //            Pc)}
7410 class VST3_single_3_element_structure_from_one_lane_111101001d00nnnnddddss10aaaammmm_case_0
7411      : public ClassDecoder {
7412  public:
VST3_single_3_element_structure_from_one_lane_111101001d00nnnnddddss10aaaammmm_case_0()7413   VST3_single_3_element_structure_from_one_lane_111101001d00nnnnddddss10aaaammmm_case_0()
7414      : ClassDecoder() {}
7415   virtual Register base_address_register(Instruction i) const;
7416   virtual RegisterList defs(Instruction inst) const;
7417   virtual SafetyLevel safety(Instruction i) const;
7418   virtual bool base_address_register_writeback_small_immediate(
7419       Instruction i) const;
7420   virtual RegisterList uses(Instruction i) const;
7421   virtual ViolationSet get_violations(
7422       const nacl_arm_val::DecodedInstruction& first,
7423       const nacl_arm_val::DecodedInstruction& second,
7424       const nacl_arm_val::SfiValidator& sfi,
7425       nacl_arm_val::AddressSet* branches,
7426       nacl_arm_val::AddressSet* critical,
7427       uint32_t* next_inst_addr) const;
7428  private:
7429   NACL_DISALLOW_COPY_AND_ASSIGN(
7430       VST3_single_3_element_structure_from_one_lane_111101001d00nnnnddddss10aaaammmm_case_0);
7431 };
7432 
7433 // VST4_multiple_4_element_structures_111101000d00nnnnddddttttssaammmm_case_0:
7434 //
7435 //   {D: D(22),
7436 //    None: 32,
7437 //    Pc: 15,
7438 //    Rm: Rm(3:0),
7439 //    Rn: Rn(19:16),
7440 //    Sp: 13,
7441 //    Vd: Vd(15:12),
7442 //    align: align(5:4),
7443 //    alignment: 1
7444 //         if align(5:4)=00
7445 //         else 4 << align,
7446 //    arch: ASIMD,
7447 //    base: n,
7448 //    d: D:Vd,
7449 //    d2: d + inc,
7450 //    d3: d2 + inc,
7451 //    d4: d3 + inc,
7452 //    defs: {base}
7453 //         if wback
7454 //         else {},
7455 //    ebytes: 1 << size,
7456 //    elements: 8 / ebytes,
7457 //    esize: 8 * ebytes,
7458 //    fields: [D(22),
7459 //      Rn(19:16),
7460 //      Vd(15:12),
7461 //      type(11:8),
7462 //      size(7:6),
7463 //      align(5:4),
7464 //      Rm(3:0)],
7465 //    inc: 1
7466 //         if type(11:8)=0000
7467 //         else 2,
7468 //    m: Rm,
7469 //    n: Rn,
7470 //    pattern: 111101000d00nnnnddddttttssaammmm,
7471 //    register_index: (m  !=
7472 //            Pc &&
7473 //         m  !=
7474 //            Sp),
7475 //    rule: VST4_multiple_4_element_structures,
7476 //    safety: [size(7:6)=11 => UNDEFINED,
7477 //      not type in bitset {'0000', '0001'} => DECODER_ERROR,
7478 //      n  ==
7479 //            Pc ||
7480 //         d4  >
7481 //            31 => UNPREDICTABLE],
7482 //    size: size(7:6),
7483 //    small_imm_base_wb: wback &&
7484 //         not register_index,
7485 //    type: type(11:8),
7486 //    uses: {m
7487 //         if wback
7488 //         else None, n},
7489 //    violations: [implied by 'base'],
7490 //    wback: (m  !=
7491 //            Pc)}
7492 class VST4_multiple_4_element_structures_111101000d00nnnnddddttttssaammmm_case_0
7493      : public ClassDecoder {
7494  public:
VST4_multiple_4_element_structures_111101000d00nnnnddddttttssaammmm_case_0()7495   VST4_multiple_4_element_structures_111101000d00nnnnddddttttssaammmm_case_0()
7496      : ClassDecoder() {}
7497   virtual Register base_address_register(Instruction i) const;
7498   virtual RegisterList defs(Instruction inst) const;
7499   virtual SafetyLevel safety(Instruction i) const;
7500   virtual bool base_address_register_writeback_small_immediate(
7501       Instruction i) const;
7502   virtual RegisterList uses(Instruction i) const;
7503   virtual ViolationSet get_violations(
7504       const nacl_arm_val::DecodedInstruction& first,
7505       const nacl_arm_val::DecodedInstruction& second,
7506       const nacl_arm_val::SfiValidator& sfi,
7507       nacl_arm_val::AddressSet* branches,
7508       nacl_arm_val::AddressSet* critical,
7509       uint32_t* next_inst_addr) const;
7510  private:
7511   NACL_DISALLOW_COPY_AND_ASSIGN(
7512       VST4_multiple_4_element_structures_111101000d00nnnnddddttttssaammmm_case_0);
7513 };
7514 
7515 // VST4_single_4_element_structure_form_one_lane_111101001d00nnnnddddss11aaaammmm_case_0:
7516 //
7517 //   {D: D(22),
7518 //    None: 32,
7519 //    Pc: 15,
7520 //    Rm: Rm(3:0),
7521 //    Rn: Rn(19:16),
7522 //    Sp: 13,
7523 //    Vd: Vd(15:12),
7524 //    alignment: (1
7525 //         if index_align(0)=0
7526 //         else 4)
7527 //         if size(11:10)=00
7528 //         else (1
7529 //         if index_align(0)=0
7530 //         else 8)
7531 //         if size(11:10)=01
7532 //         else (1
7533 //         if index_align(1:0)=00
7534 //         else 4 << index_align(1:0))
7535 //         if size(11:10)=10
7536 //         else 0,
7537 //    arch: ASIMD,
7538 //    base: n,
7539 //    d: D:Vd,
7540 //    d2: d + inc,
7541 //    d3: d2 + inc,
7542 //    d4: d3 + inc,
7543 //    defs: {base}
7544 //         if wback
7545 //         else {},
7546 //    ebytes: 1 << size,
7547 //    esize: 8 * ebytes,
7548 //    fields: [D(22),
7549 //      Rn(19:16),
7550 //      Vd(15:12),
7551 //      size(11:10),
7552 //      index_align(7:4),
7553 //      Rm(3:0)],
7554 //    inc: 1
7555 //         if size(11:10)=00
7556 //         else (1
7557 //         if index_align(1)=0
7558 //         else 2)
7559 //         if size(11:10)=01
7560 //         else (1
7561 //         if index_align(2)=0
7562 //         else 2)
7563 //         if size(11:10)=10
7564 //         else 0,
7565 //    index: index_align(3:1)
7566 //         if size(11:10)=00
7567 //         else index_align(3:2)
7568 //         if size(11:10)=01
7569 //         else index_align(3)
7570 //         if size(11:10)=10
7571 //         else 0,
7572 //    index_align: index_align(7:4),
7573 //    m: Rm,
7574 //    n: Rn,
7575 //    pattern: 111101001d00nnnnddddss11aaaammmm,
7576 //    register_index: (m  !=
7577 //            Pc &&
7578 //         m  !=
7579 //            Sp),
7580 //    rule: VST4_single_4_element_structure_form_one_lane,
7581 //    safety: [size(11:10)=11 => UNDEFINED,
7582 //      size(11:10)=10 &&
7583 //         index_align(1:0)=11 => UNDEFINED,
7584 //      n  ==
7585 //            Pc ||
7586 //         d4  >
7587 //            31 => UNPREDICTABLE],
7588 //    size: size(11:10),
7589 //    small_imm_base_wb: wback &&
7590 //         not register_index,
7591 //    uses: {m
7592 //         if wback
7593 //         else None, n},
7594 //    violations: [implied by 'base'],
7595 //    wback: (m  !=
7596 //            Pc)}
7597 class VST4_single_4_element_structure_form_one_lane_111101001d00nnnnddddss11aaaammmm_case_0
7598      : public ClassDecoder {
7599  public:
VST4_single_4_element_structure_form_one_lane_111101001d00nnnnddddss11aaaammmm_case_0()7600   VST4_single_4_element_structure_form_one_lane_111101001d00nnnnddddss11aaaammmm_case_0()
7601      : ClassDecoder() {}
7602   virtual Register base_address_register(Instruction i) const;
7603   virtual RegisterList defs(Instruction inst) const;
7604   virtual SafetyLevel safety(Instruction i) const;
7605   virtual bool base_address_register_writeback_small_immediate(
7606       Instruction i) const;
7607   virtual RegisterList uses(Instruction i) const;
7608   virtual ViolationSet get_violations(
7609       const nacl_arm_val::DecodedInstruction& first,
7610       const nacl_arm_val::DecodedInstruction& second,
7611       const nacl_arm_val::SfiValidator& sfi,
7612       nacl_arm_val::AddressSet* branches,
7613       nacl_arm_val::AddressSet* critical,
7614       uint32_t* next_inst_addr) const;
7615  private:
7616   NACL_DISALLOW_COPY_AND_ASSIGN(
7617       VST4_single_4_element_structure_form_one_lane_111101001d00nnnnddddss11aaaammmm_case_0);
7618 };
7619 
7620 // VSTM_cccc110pudw0nnnndddd1010iiiiiiii_case_0:
7621 //
7622 //   {D: D(22),
7623 //    None: 32,
7624 //    P: P(24),
7625 //    Pc: 15,
7626 //    Rn: Rn(19:16),
7627 //    Sp: 13,
7628 //    U: U(23),
7629 //    Vd: Vd(15:12),
7630 //    W: W(21),
7631 //    add: U(23)=1,
7632 //    arch: VFPv2,
7633 //    base: Rn,
7634 //    cond: cond(31:28),
7635 //    d: Vd:D,
7636 //    defs: {Rn
7637 //         if wback
7638 //         else None},
7639 //    fields: [cond(31:28),
7640 //      P(24),
7641 //      U(23),
7642 //      D(22),
7643 //      W(21),
7644 //      Rn(19:16),
7645 //      Vd(15:12),
7646 //      imm8(7:0)],
7647 //    imm32: ZeroExtend(imm8:'00'(1:0), 32),
7648 //    imm8: imm8(7:0),
7649 //    n: Rn,
7650 //    pattern: cccc110pudw0nnnndddd1010iiiiiiii,
7651 //    regs: imm8,
7652 //    rule: VSTM,
7653 //    safety: [P(24)=0 &&
7654 //         U(23)=0 &&
7655 //         W(21)=0 => DECODER_ERROR,
7656 //      P(24)=1 &&
7657 //         W(21)=0 => DECODER_ERROR,
7658 //      P  ==
7659 //            U &&
7660 //         W(21)=1 => UNDEFINED,
7661 //      n  ==
7662 //            Pc &&
7663 //         wback => UNPREDICTABLE,
7664 //      P(24)=1 &&
7665 //         U(23)=0 &&
7666 //         W(21)=1 &&
7667 //         Rn  ==
7668 //            Sp => DECODER_ERROR,
7669 //      Rn  ==
7670 //            Pc => FORBIDDEN_OPERANDS,
7671 //      regs  ==
7672 //            0 ||
7673 //         d + regs  >
7674 //            32 => UNPREDICTABLE],
7675 //    single_regs: true,
7676 //    small_imm_base_wb: wback,
7677 //    true: true,
7678 //    uses: {Rn},
7679 //    violations: [implied by 'base'],
7680 //    wback: W(21)=1}
7681 class VSTM_cccc110pudw0nnnndddd1010iiiiiiii_case_0
7682      : public ClassDecoder {
7683  public:
VSTM_cccc110pudw0nnnndddd1010iiiiiiii_case_0()7684   VSTM_cccc110pudw0nnnndddd1010iiiiiiii_case_0()
7685      : ClassDecoder() {}
7686   virtual Register base_address_register(Instruction i) const;
7687   virtual RegisterList defs(Instruction inst) const;
7688   virtual SafetyLevel safety(Instruction i) const;
7689   virtual bool base_address_register_writeback_small_immediate(
7690       Instruction i) const;
7691   virtual RegisterList uses(Instruction i) const;
7692   virtual ViolationSet get_violations(
7693       const nacl_arm_val::DecodedInstruction& first,
7694       const nacl_arm_val::DecodedInstruction& second,
7695       const nacl_arm_val::SfiValidator& sfi,
7696       nacl_arm_val::AddressSet* branches,
7697       nacl_arm_val::AddressSet* critical,
7698       uint32_t* next_inst_addr) const;
7699  private:
7700   NACL_DISALLOW_COPY_AND_ASSIGN(
7701       VSTM_cccc110pudw0nnnndddd1010iiiiiiii_case_0);
7702 };
7703 
7704 // VSTM_cccc110pudw0nnnndddd1011iiiiiiii_case_0:
7705 //
7706 //   {D: D(22),
7707 //    None: 32,
7708 //    P: P(24),
7709 //    Pc: 15,
7710 //    Rn: Rn(19:16),
7711 //    Sp: 13,
7712 //    U: U(23),
7713 //    Vd: Vd(15:12),
7714 //    W: W(21),
7715 //    add: U(23)=1,
7716 //    arch: ['VFPv2', 'AdvSIMD'],
7717 //    base: Rn,
7718 //    cond: cond(31:28),
7719 //    d: D:Vd,
7720 //    defs: {Rn
7721 //         if wback
7722 //         else None},
7723 //    false: false,
7724 //    fields: [cond(31:28),
7725 //      P(24),
7726 //      U(23),
7727 //      D(22),
7728 //      W(21),
7729 //      Rn(19:16),
7730 //      Vd(15:12),
7731 //      imm8(7:0)],
7732 //    imm32: ZeroExtend(imm8:'00'(1:0), 32),
7733 //    imm8: imm8(7:0),
7734 //    n: Rn,
7735 //    pattern: cccc110pudw0nnnndddd1011iiiiiiii,
7736 //    regs: imm8 / 2,
7737 //    rule: VSTM,
7738 //    safety: [P(24)=0 &&
7739 //         U(23)=0 &&
7740 //         W(21)=0 => DECODER_ERROR,
7741 //      P(24)=1 &&
7742 //         W(21)=0 => DECODER_ERROR,
7743 //      P  ==
7744 //            U &&
7745 //         W(21)=1 => UNDEFINED,
7746 //      n  ==
7747 //            Pc &&
7748 //         wback => UNPREDICTABLE,
7749 //      P(24)=1 &&
7750 //         U(23)=0 &&
7751 //         W(21)=1 &&
7752 //         Rn  ==
7753 //            Sp => DECODER_ERROR,
7754 //      Rn  ==
7755 //            Pc => FORBIDDEN_OPERANDS,
7756 //      regs  ==
7757 //            0 ||
7758 //         regs  >
7759 //            16 ||
7760 //         d + regs  >
7761 //            32 => UNPREDICTABLE,
7762 //      VFPSmallRegisterBank() &&
7763 //         d + regs  >
7764 //            16 => UNPREDICTABLE,
7765 //      imm8(0)  ==
7766 //            1 => DEPRECATED],
7767 //    single_regs: false,
7768 //    small_imm_base_wb: wback,
7769 //    uses: {Rn},
7770 //    violations: [implied by 'base'],
7771 //    wback: W(21)=1}
7772 class VSTM_cccc110pudw0nnnndddd1011iiiiiiii_case_0
7773      : public ClassDecoder {
7774  public:
VSTM_cccc110pudw0nnnndddd1011iiiiiiii_case_0()7775   VSTM_cccc110pudw0nnnndddd1011iiiiiiii_case_0()
7776      : ClassDecoder() {}
7777   virtual Register base_address_register(Instruction i) const;
7778   virtual RegisterList defs(Instruction inst) const;
7779   virtual SafetyLevel safety(Instruction i) const;
7780   virtual bool base_address_register_writeback_small_immediate(
7781       Instruction i) const;
7782   virtual RegisterList uses(Instruction i) const;
7783   virtual ViolationSet get_violations(
7784       const nacl_arm_val::DecodedInstruction& first,
7785       const nacl_arm_val::DecodedInstruction& second,
7786       const nacl_arm_val::SfiValidator& sfi,
7787       nacl_arm_val::AddressSet* branches,
7788       nacl_arm_val::AddressSet* critical,
7789       uint32_t* next_inst_addr) const;
7790  private:
7791   NACL_DISALLOW_COPY_AND_ASSIGN(
7792       VSTM_cccc110pudw0nnnndddd1011iiiiiiii_case_0);
7793 };
7794 
7795 // VSTR_cccc1101ud00nnnndddd1010iiiiiiii_case_0:
7796 //
7797 //   {D: D(22),
7798 //    Pc: 15,
7799 //    Rn: Rn(19:16),
7800 //    U: U(23),
7801 //    Vd: Vd(15:12),
7802 //    add: U(23)=1,
7803 //    arch: VFPv2,
7804 //    base: Rn,
7805 //    cond: cond(31:28),
7806 //    d: Vd:D,
7807 //    defs: {},
7808 //    fields: [cond(31:28), U(23), D(22), Rn(19:16), Vd(15:12), imm8(7:0)],
7809 //    imm32: ZeroExtend(imm8:'00'(1:0), 32),
7810 //    imm8: imm8(7:0),
7811 //    n: Rn,
7812 //    pattern: cccc1101ud00nnnndddd1010iiiiiiii,
7813 //    rule: VSTR,
7814 //    safety: [n  ==
7815 //            Pc => FORBIDDEN_OPERANDS],
7816 //    single_reg: true,
7817 //    true: true,
7818 //    uses: {Rn},
7819 //    violations: [implied by 'base']}
7820 class VSTR_cccc1101ud00nnnndddd1010iiiiiiii_case_0
7821      : public ClassDecoder {
7822  public:
VSTR_cccc1101ud00nnnndddd1010iiiiiiii_case_0()7823   VSTR_cccc1101ud00nnnndddd1010iiiiiiii_case_0()
7824      : ClassDecoder() {}
7825   virtual Register base_address_register(Instruction i) const;
7826   virtual RegisterList defs(Instruction inst) const;
7827   virtual SafetyLevel safety(Instruction i) const;
7828   virtual RegisterList uses(Instruction i) const;
7829   virtual ViolationSet get_violations(
7830       const nacl_arm_val::DecodedInstruction& first,
7831       const nacl_arm_val::DecodedInstruction& second,
7832       const nacl_arm_val::SfiValidator& sfi,
7833       nacl_arm_val::AddressSet* branches,
7834       nacl_arm_val::AddressSet* critical,
7835       uint32_t* next_inst_addr) const;
7836  private:
7837   NACL_DISALLOW_COPY_AND_ASSIGN(
7838       VSTR_cccc1101ud00nnnndddd1010iiiiiiii_case_0);
7839 };
7840 
7841 // VSTR_cccc1101ud00nnnndddd1011iiiiiiii_case_0:
7842 //
7843 //   {D: D(22),
7844 //    Pc: 15,
7845 //    Rn: Rn(19:16),
7846 //    U: U(23),
7847 //    Vd: Vd(15:12),
7848 //    add: U(23)=1,
7849 //    arch: ['VFPv2', 'AdvSIMD'],
7850 //    base: Rn,
7851 //    cond: cond(31:28),
7852 //    d: D:Vd,
7853 //    defs: {},
7854 //    false: false,
7855 //    fields: [cond(31:28), U(23), D(22), Rn(19:16), Vd(15:12), imm8(7:0)],
7856 //    imm32: ZeroExtend(imm8:'00'(1:0), 32),
7857 //    imm8: imm8(7:0),
7858 //    n: Rn,
7859 //    pattern: cccc1101ud00nnnndddd1011iiiiiiii,
7860 //    rule: VSTR,
7861 //    safety: [n  ==
7862 //            Pc => FORBIDDEN_OPERANDS],
7863 //    single_reg: false,
7864 //    uses: {Rn},
7865 //    violations: [implied by 'base']}
7866 class VSTR_cccc1101ud00nnnndddd1011iiiiiiii_case_0
7867      : public ClassDecoder {
7868  public:
VSTR_cccc1101ud00nnnndddd1011iiiiiiii_case_0()7869   VSTR_cccc1101ud00nnnndddd1011iiiiiiii_case_0()
7870      : ClassDecoder() {}
7871   virtual Register base_address_register(Instruction i) const;
7872   virtual RegisterList defs(Instruction inst) const;
7873   virtual SafetyLevel safety(Instruction i) const;
7874   virtual RegisterList uses(Instruction i) const;
7875   virtual ViolationSet get_violations(
7876       const nacl_arm_val::DecodedInstruction& first,
7877       const nacl_arm_val::DecodedInstruction& second,
7878       const nacl_arm_val::SfiValidator& sfi,
7879       nacl_arm_val::AddressSet* branches,
7880       nacl_arm_val::AddressSet* critical,
7881       uint32_t* next_inst_addr) const;
7882  private:
7883   NACL_DISALLOW_COPY_AND_ASSIGN(
7884       VSTR_cccc1101ud00nnnndddd1011iiiiiiii_case_0);
7885 };
7886 
7887 // VSUBHN_111100101dssnnnndddd0110n0m0mmmm_case_0:
7888 //
7889 //   {D: D(22),
7890 //    M: M(5),
7891 //    N: N(7),
7892 //    U: U(24),
7893 //    Vd: Vd(15:12),
7894 //    Vm: Vm(3:0),
7895 //    Vn: Vn(19:16),
7896 //    d: D:Vd,
7897 //    defs: {},
7898 //    elements: 64 / esize,
7899 //    esize: 8 << size,
7900 //    fields: [U(24),
7901 //      D(22),
7902 //      size(21:20),
7903 //      Vn(19:16),
7904 //      Vd(15:12),
7905 //      op(8),
7906 //      N(7),
7907 //      M(5),
7908 //      Vm(3:0)],
7909 //    m: M:Vm,
7910 //    n: N:Vn,
7911 //    op: op(8),
7912 //    pattern: 111100101dssnnnndddd0110n0m0mmmm,
7913 //    rule: VSUBHN,
7914 //    safety: [size(21:20)=11 => DECODER_ERROR,
7915 //      Vn(0)=1 ||
7916 //         Vm(0)=1 => UNDEFINED],
7917 //    size: size(21:20),
7918 //    unsigned: U(24)=1,
7919 //    uses: {}}
7920 class VSUBHN_111100101dssnnnndddd0110n0m0mmmm_case_0
7921      : public ClassDecoder {
7922  public:
VSUBHN_111100101dssnnnndddd0110n0m0mmmm_case_0()7923   VSUBHN_111100101dssnnnndddd0110n0m0mmmm_case_0()
7924      : ClassDecoder() {}
7925   virtual RegisterList defs(Instruction inst) const;
7926   virtual SafetyLevel safety(Instruction i) const;
7927   virtual RegisterList uses(Instruction i) const;
7928  private:
7929   NACL_DISALLOW_COPY_AND_ASSIGN(
7930       VSUBHN_111100101dssnnnndddd0110n0m0mmmm_case_0);
7931 };
7932 
7933 // VSUBL_VSUBW_1111001u1dssnnnndddd001pn0m0mmmm_case_0:
7934 //
7935 //   {D: D(22),
7936 //    M: M(5),
7937 //    N: N(7),
7938 //    U: U(24),
7939 //    Vd: Vd(15:12),
7940 //    Vm: Vm(3:0),
7941 //    Vn: Vn(19:16),
7942 //    d: D:Vd,
7943 //    defs: {},
7944 //    elements: 64 / esize,
7945 //    esize: 8 << size,
7946 //    fields: [U(24),
7947 //      D(22),
7948 //      size(21:20),
7949 //      Vn(19:16),
7950 //      Vd(15:12),
7951 //      op(8),
7952 //      N(7),
7953 //      M(5),
7954 //      Vm(3:0)],
7955 //    is_w: op(8)=1,
7956 //    m: M:Vm,
7957 //    n: N:Vn,
7958 //    op: op(8),
7959 //    pattern: 1111001u1dssnnnndddd001pn0m0mmmm,
7960 //    rule: VSUBL_VSUBW,
7961 //    safety: [size(21:20)=11 => DECODER_ERROR,
7962 //      Vd(0)=1 ||
7963 //         (op(8)=1 &&
7964 //         Vn(0)=1) => UNDEFINED],
7965 //    size: size(21:20),
7966 //    unsigned: U(24)=1,
7967 //    uses: {}}
7968 class VSUBL_VSUBW_1111001u1dssnnnndddd001pn0m0mmmm_case_0
7969      : public ClassDecoder {
7970  public:
VSUBL_VSUBW_1111001u1dssnnnndddd001pn0m0mmmm_case_0()7971   VSUBL_VSUBW_1111001u1dssnnnndddd001pn0m0mmmm_case_0()
7972      : ClassDecoder() {}
7973   virtual RegisterList defs(Instruction inst) const;
7974   virtual SafetyLevel safety(Instruction i) const;
7975   virtual RegisterList uses(Instruction i) const;
7976  private:
7977   NACL_DISALLOW_COPY_AND_ASSIGN(
7978       VSUBL_VSUBW_1111001u1dssnnnndddd001pn0m0mmmm_case_0);
7979 };
7980 
7981 // VSUB_floating_point_A1_111100100d1snnnndddd1101nqm0mmmm_case_0:
7982 //
7983 //   {D: D(22),
7984 //    M: M(5),
7985 //    N: N(7),
7986 //    Q: Q(6),
7987 //    U: U(24),
7988 //    Vd: Vd(15:12),
7989 //    Vm: Vm(3:0),
7990 //    Vn: Vn(19:16),
7991 //    arch: ASIMD,
7992 //    d: D:Vd,
7993 //    defs: {},
7994 //    elements: 2,
7995 //    esize: 32,
7996 //    fields: [U(24),
7997 //      D(22),
7998 //      size(21:20),
7999 //      Vn(19:16),
8000 //      Vd(15:12),
8001 //      op(9),
8002 //      N(7),
8003 //      Q(6),
8004 //      M(5),
8005 //      Vm(3:0)],
8006 //    m: M:Vm,
8007 //    n: N:Vn,
8008 //    op: op(9),
8009 //    op1_neg: size(1),
8010 //    pattern: 111100100d1snnnndddd1101nqm0mmmm,
8011 //    rule: VSUB_floating_point_A1,
8012 //    safety: [Q(6)=1 &&
8013 //         (Vd(0)=1 ||
8014 //         Vn(0)=1 ||
8015 //         Vm(0)=1) => UNDEFINED,
8016 //      size(0)=1 => UNDEFINED],
8017 //    size: size(21:20),
8018 //    sz: size(0),
8019 //    uses: {}}
8020 class VSUB_floating_point_A1_111100100d1snnnndddd1101nqm0mmmm_case_0
8021      : public ClassDecoder {
8022  public:
VSUB_floating_point_A1_111100100d1snnnndddd1101nqm0mmmm_case_0()8023   VSUB_floating_point_A1_111100100d1snnnndddd1101nqm0mmmm_case_0()
8024      : ClassDecoder() {}
8025   virtual RegisterList defs(Instruction inst) const;
8026   virtual SafetyLevel safety(Instruction i) const;
8027   virtual RegisterList uses(Instruction i) const;
8028  private:
8029   NACL_DISALLOW_COPY_AND_ASSIGN(
8030       VSUB_floating_point_A1_111100100d1snnnndddd1101nqm0mmmm_case_0);
8031 };
8032 
8033 // VSUB_floating_point_cccc11100d11nnnndddd101sn1m0mmmm_case_0:
8034 //
8035 //   {D: D(22),
8036 //    M: M(5),
8037 //    N: N(7),
8038 //    Vd: Vd(15:12),
8039 //    Vm: Vm(3:0),
8040 //    Vn: Vn(19:16),
8041 //    advsimd: false,
8042 //    arch: VFPv2,
8043 //    cond: cond(31:28),
8044 //    d: D:Vd
8045 //         if dp_operation
8046 //         else Vd:D,
8047 //    defs: {},
8048 //    dp_operation: sz(8)=1,
8049 //    false: false,
8050 //    fields: [cond(31:28),
8051 //      D(22),
8052 //      Vn(19:16),
8053 //      Vd(15:12),
8054 //      sz(8),
8055 //      N(7),
8056 //      M(5),
8057 //      Vm(3:0)],
8058 //    m: M:Vm
8059 //         if dp_operation
8060 //         else Vm:M,
8061 //    n: N:Vn
8062 //         if dp_operation
8063 //         else Vn:N,
8064 //    pattern: cccc11100d11nnnndddd101sn1m0mmmm,
8065 //    rule: VSUB_floating_point,
8066 //    safety: [cond(31:28)=1111 => DECODER_ERROR],
8067 //    sz: sz(8),
8068 //    uses: {}}
8069 class VSUB_floating_point_cccc11100d11nnnndddd101sn1m0mmmm_case_0
8070      : public ClassDecoder {
8071  public:
VSUB_floating_point_cccc11100d11nnnndddd101sn1m0mmmm_case_0()8072   VSUB_floating_point_cccc11100d11nnnndddd101sn1m0mmmm_case_0()
8073      : ClassDecoder() {}
8074   virtual RegisterList defs(Instruction inst) const;
8075   virtual SafetyLevel safety(Instruction i) const;
8076   virtual RegisterList uses(Instruction i) const;
8077  private:
8078   NACL_DISALLOW_COPY_AND_ASSIGN(
8079       VSUB_floating_point_cccc11100d11nnnndddd101sn1m0mmmm_case_0);
8080 };
8081 
8082 // VSUB_integer_111100110dssnnnndddd1000nqm0mmmm_case_0:
8083 //
8084 //   {D: D(22),
8085 //    M: M(5),
8086 //    N: N(7),
8087 //    Q: Q(6),
8088 //    U: U(24),
8089 //    Vd: Vd(15:12),
8090 //    Vm: Vm(3:0),
8091 //    Vn: Vn(19:16),
8092 //    arch: ASIMD,
8093 //    d: D:Vd,
8094 //    defs: {},
8095 //    elements: 64 / esize,
8096 //    esize: 8 << size,
8097 //    fields: [U(24),
8098 //      D(22),
8099 //      size(21:20),
8100 //      Vn(19:16),
8101 //      Vd(15:12),
8102 //      op(9),
8103 //      N(7),
8104 //      Q(6),
8105 //      M(5),
8106 //      Vm(3:0)],
8107 //    m: M:Vm,
8108 //    n: N:Vn,
8109 //    op: op(9),
8110 //    pattern: 111100110dssnnnndddd1000nqm0mmmm,
8111 //    regs: 1
8112 //         if Q(6)=0
8113 //         else 2,
8114 //    rule: VSUB_integer,
8115 //    safety: [Q(6)=1 &&
8116 //         (Vd(0)=1 ||
8117 //         Vn(0)=1 ||
8118 //         Vm(0)=1) => UNDEFINED],
8119 //    size: size(21:20),
8120 //    unsigned: U(24)=1,
8121 //    uses: {}}
8122 class VSUB_integer_111100110dssnnnndddd1000nqm0mmmm_case_0
8123      : public ClassDecoder {
8124  public:
VSUB_integer_111100110dssnnnndddd1000nqm0mmmm_case_0()8125   VSUB_integer_111100110dssnnnndddd1000nqm0mmmm_case_0()
8126      : ClassDecoder() {}
8127   virtual RegisterList defs(Instruction inst) const;
8128   virtual SafetyLevel safety(Instruction i) const;
8129   virtual RegisterList uses(Instruction i) const;
8130  private:
8131   NACL_DISALLOW_COPY_AND_ASSIGN(
8132       VSUB_integer_111100110dssnnnndddd1000nqm0mmmm_case_0);
8133 };
8134 
8135 // VSWP_111100111d11ss10dddd00000qm0mmmm_case_0:
8136 //
8137 //   {D: D(22),
8138 //    F: F(10),
8139 //    M: M(5),
8140 //    Q: Q(6),
8141 //    Vd: Vd(15:12),
8142 //    Vm: Vm(3:0),
8143 //    arch: ASIMD,
8144 //    d: D:Vd,
8145 //    defs: {},
8146 //    elements: 64 / esize,
8147 //    esize: 8 << size,
8148 //    fields: [D(22),
8149 //      size(19:18),
8150 //      Vd(15:12),
8151 //      F(10),
8152 //      op(8:7),
8153 //      Q(6),
8154 //      M(5),
8155 //      Vm(3:0)],
8156 //    m: M:Vm,
8157 //    op: op(8:7),
8158 //    pattern: 111100111d11ss10dddd00000qm0mmmm,
8159 //    regs: 1
8160 //         if Q(6)=0
8161 //         else 2,
8162 //    rule: VSWP,
8163 //    safety: [d  ==
8164 //            m => UNKNOWN,
8165 //      size(19:18)=~00 => UNDEFINED,
8166 //      Q(6)=1 &&
8167 //         (Vd(0)=1 ||
8168 //         Vm(0)=1) => UNDEFINED],
8169 //    size: size(19:18),
8170 //    uses: {}}
8171 class VSWP_111100111d11ss10dddd00000qm0mmmm_case_0
8172      : public ClassDecoder {
8173  public:
VSWP_111100111d11ss10dddd00000qm0mmmm_case_0()8174   VSWP_111100111d11ss10dddd00000qm0mmmm_case_0()
8175      : ClassDecoder() {}
8176   virtual RegisterList defs(Instruction inst) const;
8177   virtual SafetyLevel safety(Instruction i) const;
8178   virtual RegisterList uses(Instruction i) const;
8179  private:
8180   NACL_DISALLOW_COPY_AND_ASSIGN(
8181       VSWP_111100111d11ss10dddd00000qm0mmmm_case_0);
8182 };
8183 
8184 // VTBL_VTBX_111100111d11nnnndddd10ccnpm0mmmm_case_0:
8185 //
8186 //   {D: D(22),
8187 //    M: M(5),
8188 //    N: N(7),
8189 //    Vd: Vd(15:12),
8190 //    Vm: Vm(3:0),
8191 //    Vn: Vn(19:16),
8192 //    d: D:Vd,
8193 //    defs: {},
8194 //    fields: [D(22),
8195 //      Vn(19:16),
8196 //      Vd(15:12),
8197 //      len(9:8),
8198 //      N(7),
8199 //      op(6),
8200 //      M(5),
8201 //      Vm(3:0)],
8202 //    is_vtbl: op(6)=0,
8203 //    len: len(9:8),
8204 //    length: len + 1,
8205 //    m: M:Vm,
8206 //    n: N:Vn,
8207 //    op: op(6),
8208 //    pattern: 111100111d11nnnndddd10ccnpm0mmmm,
8209 //    rule: VTBL_VTBX,
8210 //    safety: [n + length  >
8211 //            32 => UNPREDICTABLE],
8212 //    uses: {}}
8213 class VTBL_VTBX_111100111d11nnnndddd10ccnpm0mmmm_case_0
8214      : public ClassDecoder {
8215  public:
VTBL_VTBX_111100111d11nnnndddd10ccnpm0mmmm_case_0()8216   VTBL_VTBX_111100111d11nnnndddd10ccnpm0mmmm_case_0()
8217      : ClassDecoder() {}
8218   virtual RegisterList defs(Instruction inst) const;
8219   virtual SafetyLevel safety(Instruction i) const;
8220   virtual RegisterList uses(Instruction i) const;
8221  private:
8222   NACL_DISALLOW_COPY_AND_ASSIGN(
8223       VTBL_VTBX_111100111d11nnnndddd10ccnpm0mmmm_case_0);
8224 };
8225 
8226 // VTRN_111100111d11ss10dddd00001qm0mmmm_case_0:
8227 //
8228 //   {D: D(22),
8229 //    F: F(10),
8230 //    M: M(5),
8231 //    Q: Q(6),
8232 //    Vd: Vd(15:12),
8233 //    Vm: Vm(3:0),
8234 //    arch: ASIMD,
8235 //    d: D:Vd,
8236 //    defs: {},
8237 //    elements: 64 / esize,
8238 //    esize: 8 << size,
8239 //    fields: [D(22),
8240 //      size(19:18),
8241 //      Vd(15:12),
8242 //      F(10),
8243 //      op(8:7),
8244 //      Q(6),
8245 //      M(5),
8246 //      Vm(3:0)],
8247 //    m: M:Vm,
8248 //    op: op(8:7),
8249 //    pattern: 111100111d11ss10dddd00001qm0mmmm,
8250 //    quadword_operation: Q(6)=1,
8251 //    regs: 1
8252 //         if Q(6)=0
8253 //         else 2,
8254 //    rule: VTRN,
8255 //    safety: [d  ==
8256 //            m => UNKNOWN,
8257 //      size(19:18)=11 => UNDEFINED,
8258 //      Q(6)=1 &&
8259 //         (Vd(0)=1 ||
8260 //         Vm(0)=1) => UNDEFINED],
8261 //    size: size(19:18),
8262 //    uses: {}}
8263 class VTRN_111100111d11ss10dddd00001qm0mmmm_case_0
8264      : public ClassDecoder {
8265  public:
VTRN_111100111d11ss10dddd00001qm0mmmm_case_0()8266   VTRN_111100111d11ss10dddd00001qm0mmmm_case_0()
8267      : ClassDecoder() {}
8268   virtual RegisterList defs(Instruction inst) const;
8269   virtual SafetyLevel safety(Instruction i) const;
8270   virtual RegisterList uses(Instruction i) const;
8271  private:
8272   NACL_DISALLOW_COPY_AND_ASSIGN(
8273       VTRN_111100111d11ss10dddd00001qm0mmmm_case_0);
8274 };
8275 
8276 // VTST_111100100dssnnnndddd1000nqm1mmmm_case_0:
8277 //
8278 //   {D: D(22),
8279 //    M: M(5),
8280 //    N: N(7),
8281 //    Q: Q(6),
8282 //    U: U(24),
8283 //    Vd: Vd(15:12),
8284 //    Vm: Vm(3:0),
8285 //    Vn: Vn(19:16),
8286 //    arch: ASIMD,
8287 //    d: D:Vd,
8288 //    defs: {},
8289 //    elements: 64 / esize,
8290 //    esize: 8 << size,
8291 //    fields: [U(24),
8292 //      D(22),
8293 //      size(21:20),
8294 //      Vn(19:16),
8295 //      Vd(15:12),
8296 //      op(9),
8297 //      N(7),
8298 //      Q(6),
8299 //      M(5),
8300 //      Vm(3:0)],
8301 //    m: M:Vm,
8302 //    n: N:Vn,
8303 //    op: op(9),
8304 //    pattern: 111100100dssnnnndddd1000nqm1mmmm,
8305 //    regs: 1
8306 //         if Q(6)=0
8307 //         else 2,
8308 //    rule: VTST,
8309 //    safety: [Q(6)=1 &&
8310 //         (Vd(0)=1 ||
8311 //         Vn(0)=1 ||
8312 //         Vm(0)=1) => UNDEFINED,
8313 //      size(21:20)=11 => UNDEFINED],
8314 //    size: size(21:20),
8315 //    unsigned: U(24)=1,
8316 //    uses: {}}
8317 class VTST_111100100dssnnnndddd1000nqm1mmmm_case_0
8318      : public ClassDecoder {
8319  public:
VTST_111100100dssnnnndddd1000nqm1mmmm_case_0()8320   VTST_111100100dssnnnndddd1000nqm1mmmm_case_0()
8321      : ClassDecoder() {}
8322   virtual RegisterList defs(Instruction inst) const;
8323   virtual SafetyLevel safety(Instruction i) const;
8324   virtual RegisterList uses(Instruction i) const;
8325  private:
8326   NACL_DISALLOW_COPY_AND_ASSIGN(
8327       VTST_111100100dssnnnndddd1000nqm1mmmm_case_0);
8328 };
8329 
8330 // VUZP_111100111d11ss10dddd00010qm0mmmm_case_0:
8331 //
8332 //   {D: D(22),
8333 //    F: F(10),
8334 //    M: M(5),
8335 //    Q: Q(6),
8336 //    Vd: Vd(15:12),
8337 //    Vm: Vm(3:0),
8338 //    arch: ASIMD,
8339 //    d: D:Vd,
8340 //    defs: {},
8341 //    elements: 64 / esize,
8342 //    esize: 8 << size,
8343 //    fields: [D(22),
8344 //      size(19:18),
8345 //      Vd(15:12),
8346 //      F(10),
8347 //      op(8:7),
8348 //      Q(6),
8349 //      M(5),
8350 //      Vm(3:0)],
8351 //    m: M:Vm,
8352 //    op: op(8:7),
8353 //    pattern: 111100111d11ss10dddd00010qm0mmmm,
8354 //    quadword_operation: Q(6)=1,
8355 //    regs: 1
8356 //         if Q(6)=0
8357 //         else 2,
8358 //    rule: VUZP,
8359 //    safety: [d  ==
8360 //            m => UNKNOWN,
8361 //      size(19:18)=11 ||
8362 //         (Q(6)=0 &&
8363 //         size(19:18)=10) => UNDEFINED,
8364 //      Q(6)=1 &&
8365 //         (Vd(0)=1 ||
8366 //         Vm(0)=1) => UNDEFINED],
8367 //    size: size(19:18),
8368 //    uses: {}}
8369 class VUZP_111100111d11ss10dddd00010qm0mmmm_case_0
8370      : public ClassDecoder {
8371  public:
VUZP_111100111d11ss10dddd00010qm0mmmm_case_0()8372   VUZP_111100111d11ss10dddd00010qm0mmmm_case_0()
8373      : ClassDecoder() {}
8374   virtual RegisterList defs(Instruction inst) const;
8375   virtual SafetyLevel safety(Instruction i) const;
8376   virtual RegisterList uses(Instruction i) const;
8377  private:
8378   NACL_DISALLOW_COPY_AND_ASSIGN(
8379       VUZP_111100111d11ss10dddd00010qm0mmmm_case_0);
8380 };
8381 
8382 // VZIP_111100111d11ss10dddd00011qm0mmmm_case_0:
8383 //
8384 //   {D: D(22),
8385 //    F: F(10),
8386 //    M: M(5),
8387 //    Q: Q(6),
8388 //    Vd: Vd(15:12),
8389 //    Vm: Vm(3:0),
8390 //    arch: ASIMD,
8391 //    d: D:Vd,
8392 //    defs: {},
8393 //    elements: 64 / esize,
8394 //    esize: 8 << size,
8395 //    fields: [D(22),
8396 //      size(19:18),
8397 //      Vd(15:12),
8398 //      F(10),
8399 //      op(8:7),
8400 //      Q(6),
8401 //      M(5),
8402 //      Vm(3:0)],
8403 //    m: M:Vm,
8404 //    op: op(8:7),
8405 //    pattern: 111100111d11ss10dddd00011qm0mmmm,
8406 //    quadword_operation: Q(6)=1,
8407 //    regs: 1
8408 //         if Q(6)=0
8409 //         else 2,
8410 //    rule: VZIP,
8411 //    safety: [d  ==
8412 //            m => UNKNOWN,
8413 //      size(19:18)=11 ||
8414 //         (Q(6)=0 &&
8415 //         size(19:18)=10) => UNDEFINED,
8416 //      Q(6)=1 &&
8417 //         (Vd(0)=1 ||
8418 //         Vm(0)=1) => UNDEFINED],
8419 //    size: size(19:18),
8420 //    uses: {}}
8421 class VZIP_111100111d11ss10dddd00011qm0mmmm_case_0
8422      : public ClassDecoder {
8423  public:
VZIP_111100111d11ss10dddd00011qm0mmmm_case_0()8424   VZIP_111100111d11ss10dddd00011qm0mmmm_case_0()
8425      : ClassDecoder() {}
8426   virtual RegisterList defs(Instruction inst) const;
8427   virtual SafetyLevel safety(Instruction i) const;
8428   virtual RegisterList uses(Instruction i) const;
8429  private:
8430   NACL_DISALLOW_COPY_AND_ASSIGN(
8431       VZIP_111100111d11ss10dddd00011qm0mmmm_case_0);
8432 };
8433 
8434 // WFE_cccc0011001000001111000000000010_case_0:
8435 //
8436 //   {arch: v6K,
8437 //    defs: {},
8438 //    pattern: cccc0011001000001111000000000010,
8439 //    rule: WFE,
8440 //    safety: [true => FORBIDDEN],
8441 //    true: true,
8442 //    uses: {}}
8443 class WFE_cccc0011001000001111000000000010_case_0
8444      : public ClassDecoder {
8445  public:
WFE_cccc0011001000001111000000000010_case_0()8446   WFE_cccc0011001000001111000000000010_case_0()
8447      : ClassDecoder() {}
8448   virtual RegisterList defs(Instruction inst) const;
8449   virtual SafetyLevel safety(Instruction i) const;
8450   virtual RegisterList uses(Instruction i) const;
8451  private:
8452   NACL_DISALLOW_COPY_AND_ASSIGN(
8453       WFE_cccc0011001000001111000000000010_case_0);
8454 };
8455 
8456 // WFI_cccc0011001000001111000000000011_case_0:
8457 //
8458 //   {arch: v6K,
8459 //    defs: {},
8460 //    pattern: cccc0011001000001111000000000011,
8461 //    rule: WFI,
8462 //    safety: [true => FORBIDDEN],
8463 //    true: true,
8464 //    uses: {}}
8465 class WFI_cccc0011001000001111000000000011_case_0
8466      : public ClassDecoder {
8467  public:
WFI_cccc0011001000001111000000000011_case_0()8468   WFI_cccc0011001000001111000000000011_case_0()
8469      : ClassDecoder() {}
8470   virtual RegisterList defs(Instruction inst) const;
8471   virtual SafetyLevel safety(Instruction i) const;
8472   virtual RegisterList uses(Instruction i) const;
8473  private:
8474   NACL_DISALLOW_COPY_AND_ASSIGN(
8475       WFI_cccc0011001000001111000000000011_case_0);
8476 };
8477 
8478 // YIELD_cccc0011001000001111000000000001_case_0:
8479 //
8480 //   {arch: v6K,
8481 //    defs: {},
8482 //    pattern: cccc0011001000001111000000000001,
8483 //    rule: YIELD,
8484 //    uses: {}}
8485 class YIELD_cccc0011001000001111000000000001_case_0
8486      : public ClassDecoder {
8487  public:
YIELD_cccc0011001000001111000000000001_case_0()8488   YIELD_cccc0011001000001111000000000001_case_0()
8489      : ClassDecoder() {}
8490   virtual RegisterList defs(Instruction inst) const;
8491   virtual SafetyLevel safety(Instruction i) const;
8492   virtual RegisterList uses(Instruction i) const;
8493  private:
8494   NACL_DISALLOW_COPY_AND_ASSIGN(
8495       YIELD_cccc0011001000001111000000000001_case_0);
8496 };
8497 
8498 // extra_load_store_instructions_unpriviledged_cccc0000xx1xxxxxxxxxxxxx1xx1xxxx_case_0:
8499 //
8500 //   {defs: {},
8501 //    pattern: cccc0000xx1xxxxxxxxxxxxx1xx1xxxx,
8502 //    rule: extra_load_store_instructions_unpriviledged,
8503 //    safety: [true => FORBIDDEN],
8504 //    true: true,
8505 //    uses: {}}
8506 class extra_load_store_instructions_unpriviledged_cccc0000xx1xxxxxxxxxxxxx1xx1xxxx_case_0
8507      : public ClassDecoder {
8508  public:
extra_load_store_instructions_unpriviledged_cccc0000xx1xxxxxxxxxxxxx1xx1xxxx_case_0()8509   extra_load_store_instructions_unpriviledged_cccc0000xx1xxxxxxxxxxxxx1xx1xxxx_case_0()
8510      : ClassDecoder() {}
8511   virtual RegisterList defs(Instruction inst) const;
8512   virtual SafetyLevel safety(Instruction i) const;
8513   virtual RegisterList uses(Instruction i) const;
8514  private:
8515   NACL_DISALLOW_COPY_AND_ASSIGN(
8516       extra_load_store_instructions_unpriviledged_cccc0000xx1xxxxxxxxxxxxx1xx1xxxx_case_0);
8517 };
8518 
8519 } // namespace nacl_arm_test
8520 
8521 #endif  // NATIVE_CLIENT_SRC_TRUSTED_VALIDATOR_ARM_GEN_ARM32_DECODE_BASELINES_3_H_
8522