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