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