Lines Matching refs:instr
35 void Decoder::DecodeInstruction(const Instruction* instr) { in DecodeInstruction() argument
36 if (instr->ExtractBits(28, 27) == 0) { in DecodeInstruction()
37 VisitUnallocated(instr); in DecodeInstruction()
39 switch (instr->ExtractBits(27, 24)) { in DecodeInstruction()
42 DecodePCRelAddressing(instr); in DecodeInstruction()
47 DecodeAddSubImmediate(instr); in DecodeInstruction()
62 DecodeDataProcessing(instr); in DecodeInstruction()
68 DecodeLogical(instr); in DecodeInstruction()
74 DecodeBitfieldExtract(instr); in DecodeInstruction()
89 DecodeBranchSystemException(instr); in DecodeInstruction()
107 DecodeLoadStore(instr); in DecodeInstruction()
123 DecodeFP(instr); in DecodeInstruction()
177 void Decoder::DecodePCRelAddressing(const Instruction* instr) { in DecodePCRelAddressing() argument
178 VIXL_ASSERT(instr->ExtractBits(27, 24) == 0x0); in DecodePCRelAddressing()
181 VIXL_ASSERT(instr->ExtractBit(28) == 0x1); in DecodePCRelAddressing()
182 VisitPCRelAddressing(instr); in DecodePCRelAddressing()
186 void Decoder::DecodeBranchSystemException(const Instruction* instr) { in DecodeBranchSystemException() argument
187 VIXL_ASSERT((instr->ExtractBits(27, 24) == 0x4) || in DecodeBranchSystemException()
188 (instr->ExtractBits(27, 24) == 0x5) || in DecodeBranchSystemException()
189 (instr->ExtractBits(27, 24) == 0x6) || in DecodeBranchSystemException()
190 (instr->ExtractBits(27, 24) == 0x7)); in DecodeBranchSystemException()
192 switch (instr->ExtractBits(31, 29)) { in DecodeBranchSystemException()
195 VisitUnconditionalBranch(instr); in DecodeBranchSystemException()
200 if (instr->ExtractBit(25) == 0) { in DecodeBranchSystemException()
201 VisitCompareBranch(instr); in DecodeBranchSystemException()
203 VisitTestBranch(instr); in DecodeBranchSystemException()
208 if (instr->ExtractBit(25) == 0) { in DecodeBranchSystemException()
209 if ((instr->ExtractBit(24) == 0x1) || in DecodeBranchSystemException()
210 (instr->Mask(0x01000010) == 0x00000010)) { in DecodeBranchSystemException()
211 VisitUnallocated(instr); in DecodeBranchSystemException()
213 VisitConditionalBranch(instr); in DecodeBranchSystemException()
216 VisitUnallocated(instr); in DecodeBranchSystemException()
221 if (instr->ExtractBit(25) == 0) { in DecodeBranchSystemException()
222 if (instr->ExtractBit(24) == 0) { in DecodeBranchSystemException()
223 if ((instr->ExtractBits(4, 2) != 0) || in DecodeBranchSystemException()
224 (instr->Mask(0x00E0001D) == 0x00200001) || in DecodeBranchSystemException()
225 (instr->Mask(0x00E0001D) == 0x00400001) || in DecodeBranchSystemException()
226 (instr->Mask(0x00E0001E) == 0x00200002) || in DecodeBranchSystemException()
227 (instr->Mask(0x00E0001E) == 0x00400002) || in DecodeBranchSystemException()
228 (instr->Mask(0x00E0001C) == 0x00600000) || in DecodeBranchSystemException()
229 (instr->Mask(0x00E0001C) == 0x00800000) || in DecodeBranchSystemException()
230 (instr->Mask(0x00E0001F) == 0x00A00000) || in DecodeBranchSystemException()
231 (instr->Mask(0x00C0001C) == 0x00C00000)) { in DecodeBranchSystemException()
232 VisitUnallocated(instr); in DecodeBranchSystemException()
234 VisitException(instr); in DecodeBranchSystemException()
237 if (instr->ExtractBits(23, 22) == 0) { in DecodeBranchSystemException()
238 const Instr masked_003FF0E0 = instr->Mask(0x003FF0E0); in DecodeBranchSystemException()
239 if ((instr->ExtractBits(21, 19) == 0x4) || in DecodeBranchSystemException()
244 (instr->Mask(0x00388000) == 0x00008000) || in DecodeBranchSystemException()
245 (instr->Mask(0x0038E000) == 0x00000000) || in DecodeBranchSystemException()
246 (instr->Mask(0x0039E000) == 0x00002000) || in DecodeBranchSystemException()
247 (instr->Mask(0x003AE000) == 0x00002000) || in DecodeBranchSystemException()
248 (instr->Mask(0x003CE000) == 0x00042000) || in DecodeBranchSystemException()
249 (instr->Mask(0x0038F000) == 0x00005000) || in DecodeBranchSystemException()
250 (instr->Mask(0x0038E000) == 0x00006000)) { in DecodeBranchSystemException()
251 VisitUnallocated(instr); in DecodeBranchSystemException()
253 VisitSystem(instr); in DecodeBranchSystemException()
256 VisitUnallocated(instr); in DecodeBranchSystemException()
260 if (((instr->ExtractBit(24) == 0x1) && in DecodeBranchSystemException()
261 (instr->ExtractBits(23, 21) > 0x1)) || in DecodeBranchSystemException()
262 (instr->ExtractBits(20, 16) != 0x1F) || in DecodeBranchSystemException()
263 (instr->ExtractBits(15, 10) == 0x1) || in DecodeBranchSystemException()
264 (instr->ExtractBits(15, 10) > 0x3) || in DecodeBranchSystemException()
265 (instr->ExtractBits(24, 21) == 0x3) || in DecodeBranchSystemException()
266 (instr->ExtractBits(24, 22) == 0x3)) { in DecodeBranchSystemException()
267 VisitUnallocated(instr); in DecodeBranchSystemException()
269 VisitUnconditionalBranchToRegister(instr); in DecodeBranchSystemException()
276 VisitUnallocated(instr); in DecodeBranchSystemException()
283 void Decoder::DecodeLoadStore(const Instruction* instr) { in DecodeLoadStore() argument
284 VIXL_ASSERT((instr->ExtractBits(27, 24) == 0x8) || in DecodeLoadStore()
285 (instr->ExtractBits(27, 24) == 0x9) || in DecodeLoadStore()
286 (instr->ExtractBits(27, 24) == 0xC) || in DecodeLoadStore()
287 (instr->ExtractBits(27, 24) == 0xD)); in DecodeLoadStore()
289 if ((instr->ExtractBit(28) == 0) && (instr->ExtractBit(29) == 0) && in DecodeLoadStore()
290 (instr->ExtractBit(26) == 1)) { in DecodeLoadStore()
291 DecodeNEONLoadStore(instr); in DecodeLoadStore()
295 if (instr->ExtractBit(24) == 0) { in DecodeLoadStore()
296 if (instr->ExtractBit(28) == 0) { in DecodeLoadStore()
297 if (instr->ExtractBit(29) == 0) { in DecodeLoadStore()
298 if (instr->ExtractBit(26) == 0) { in DecodeLoadStore()
299 VisitLoadStoreExclusive(instr); in DecodeLoadStore()
304 if ((instr->ExtractBits(31, 30) == 0x3) || in DecodeLoadStore()
305 (instr->Mask(0xC4400000) == 0x40000000)) { in DecodeLoadStore()
306 VisitUnallocated(instr); in DecodeLoadStore()
308 if (instr->ExtractBit(23) == 0) { in DecodeLoadStore()
309 if (instr->Mask(0xC4400000) == 0xC0400000) { in DecodeLoadStore()
310 VisitUnallocated(instr); in DecodeLoadStore()
312 VisitLoadStorePairNonTemporal(instr); in DecodeLoadStore()
315 VisitLoadStorePairPostIndex(instr); in DecodeLoadStore()
320 if (instr->ExtractBit(29) == 0) { in DecodeLoadStore()
321 if (instr->Mask(0xC4000000) == 0xC4000000) { in DecodeLoadStore()
322 VisitUnallocated(instr); in DecodeLoadStore()
324 VisitLoadLiteral(instr); in DecodeLoadStore()
327 if ((instr->Mask(0x44800000) == 0x44800000) || in DecodeLoadStore()
328 (instr->Mask(0x84800000) == 0x84800000)) { in DecodeLoadStore()
329 VisitUnallocated(instr); in DecodeLoadStore()
331 if (instr->ExtractBit(21) == 0) { in DecodeLoadStore()
332 switch (instr->ExtractBits(11, 10)) { in DecodeLoadStore()
334 VisitLoadStoreUnscaledOffset(instr); in DecodeLoadStore()
338 if (instr->Mask(0xC4C00000) == 0xC0800000) { in DecodeLoadStore()
339 VisitUnallocated(instr); in DecodeLoadStore()
341 VisitLoadStorePostIndex(instr); in DecodeLoadStore()
347 VisitUnimplemented(instr); in DecodeLoadStore()
351 if (instr->Mask(0xC4C00000) == 0xC0800000) { in DecodeLoadStore()
352 VisitUnallocated(instr); in DecodeLoadStore()
354 VisitLoadStorePreIndex(instr); in DecodeLoadStore()
360 if (instr->ExtractBits(11, 10) == 0x2) { in DecodeLoadStore()
361 if (instr->ExtractBit(14) == 0) { in DecodeLoadStore()
362 VisitUnallocated(instr); in DecodeLoadStore()
364 VisitLoadStoreRegisterOffset(instr); in DecodeLoadStore()
367 if (instr->ExtractBits(11, 10) == 0x0) { in DecodeLoadStore()
368 if (instr->ExtractBit(25) == 0) { in DecodeLoadStore()
369 if (instr->ExtractBit(26) == 0) { in DecodeLoadStore()
370 if ((instr->ExtractBit(15) == 1) && in DecodeLoadStore()
371 ((instr->ExtractBits(14, 12) == 0x1) || in DecodeLoadStore()
372 (instr->ExtractBit(13) == 1) || in DecodeLoadStore()
373 (instr->ExtractBits(14, 12) == 0x5) || in DecodeLoadStore()
374 ((instr->ExtractBits(14, 12) == 0x4) && in DecodeLoadStore()
375 ((instr->ExtractBit(23) == 0) || in DecodeLoadStore()
376 (instr->ExtractBits(23, 22) == 0x3))))) { in DecodeLoadStore()
377 VisitUnallocated(instr); in DecodeLoadStore()
379 VisitAtomicMemory(instr); in DecodeLoadStore()
382 VisitUnallocated(instr); in DecodeLoadStore()
385 VisitUnallocated(instr); in DecodeLoadStore()
388 VisitUnallocated(instr); in DecodeLoadStore()
396 if (instr->ExtractBit(28) == 0) { in DecodeLoadStore()
397 if (instr->ExtractBit(29) == 0) { in DecodeLoadStore()
398 VisitUnallocated(instr); in DecodeLoadStore()
400 if ((instr->ExtractBits(31, 30) == 0x3) || in DecodeLoadStore()
401 (instr->Mask(0xC4400000) == 0x40000000)) { in DecodeLoadStore()
402 VisitUnallocated(instr); in DecodeLoadStore()
404 if (instr->ExtractBit(23) == 0) { in DecodeLoadStore()
405 VisitLoadStorePairOffset(instr); in DecodeLoadStore()
407 VisitLoadStorePairPreIndex(instr); in DecodeLoadStore()
412 if (instr->ExtractBit(29) == 0) { in DecodeLoadStore()
413 VisitUnallocated(instr); in DecodeLoadStore()
415 if ((instr->Mask(0x84C00000) == 0x80C00000) || in DecodeLoadStore()
416 (instr->Mask(0x44800000) == 0x44800000) || in DecodeLoadStore()
417 (instr->Mask(0x84800000) == 0x84800000)) { in DecodeLoadStore()
418 VisitUnallocated(instr); in DecodeLoadStore()
420 VisitLoadStoreUnsignedOffset(instr); in DecodeLoadStore()
428 void Decoder::DecodeLogical(const Instruction* instr) { in DecodeLogical() argument
429 VIXL_ASSERT(instr->ExtractBits(27, 24) == 0x2); in DecodeLogical()
431 if (instr->Mask(0x80400000) == 0x00400000) { in DecodeLogical()
432 VisitUnallocated(instr); in DecodeLogical()
434 if (instr->ExtractBit(23) == 0) { in DecodeLogical()
435 VisitLogicalImmediate(instr); in DecodeLogical()
437 if (instr->ExtractBits(30, 29) == 0x1) { in DecodeLogical()
438 VisitUnallocated(instr); in DecodeLogical()
440 VisitMoveWideImmediate(instr); in DecodeLogical()
447 void Decoder::DecodeBitfieldExtract(const Instruction* instr) { in DecodeBitfieldExtract() argument
448 VIXL_ASSERT(instr->ExtractBits(27, 24) == 0x3); in DecodeBitfieldExtract()
450 if ((instr->Mask(0x80400000) == 0x80000000) || in DecodeBitfieldExtract()
451 (instr->Mask(0x80400000) == 0x00400000) || in DecodeBitfieldExtract()
452 (instr->Mask(0x80008000) == 0x00008000)) { in DecodeBitfieldExtract()
453 VisitUnallocated(instr); in DecodeBitfieldExtract()
454 } else if (instr->ExtractBit(23) == 0) { in DecodeBitfieldExtract()
455 if ((instr->Mask(0x80200000) == 0x00200000) || in DecodeBitfieldExtract()
456 (instr->Mask(0x60000000) == 0x60000000)) { in DecodeBitfieldExtract()
457 VisitUnallocated(instr); in DecodeBitfieldExtract()
459 VisitBitfield(instr); in DecodeBitfieldExtract()
462 if ((instr->Mask(0x60200000) == 0x00200000) || in DecodeBitfieldExtract()
463 (instr->Mask(0x60000000) != 0x00000000)) { in DecodeBitfieldExtract()
464 VisitUnallocated(instr); in DecodeBitfieldExtract()
466 VisitExtract(instr); in DecodeBitfieldExtract()
472 void Decoder::DecodeAddSubImmediate(const Instruction* instr) { in DecodeAddSubImmediate() argument
473 VIXL_ASSERT(instr->ExtractBits(27, 24) == 0x1); in DecodeAddSubImmediate()
474 if (instr->ExtractBit(23) == 1) { in DecodeAddSubImmediate()
475 VisitUnallocated(instr); in DecodeAddSubImmediate()
477 VisitAddSubImmediate(instr); in DecodeAddSubImmediate()
482 void Decoder::DecodeDataProcessing(const Instruction* instr) { in DecodeDataProcessing() argument
483 VIXL_ASSERT((instr->ExtractBits(27, 24) == 0xA) || in DecodeDataProcessing()
484 (instr->ExtractBits(27, 24) == 0xB)); in DecodeDataProcessing()
486 if (instr->ExtractBit(24) == 0) { in DecodeDataProcessing()
487 if (instr->ExtractBit(28) == 0) { in DecodeDataProcessing()
488 if (instr->Mask(0x80008000) == 0x00008000) { in DecodeDataProcessing()
489 VisitUnallocated(instr); in DecodeDataProcessing()
491 VisitLogicalShifted(instr); in DecodeDataProcessing()
494 switch (instr->ExtractBits(23, 21)) { in DecodeDataProcessing()
496 if (instr->Mask(0x0000FC00) != 0) { in DecodeDataProcessing()
497 VisitUnallocated(instr); in DecodeDataProcessing()
499 VisitAddSubWithCarry(instr); in DecodeDataProcessing()
504 if ((instr->ExtractBit(29) == 0) || (instr->Mask(0x00000410) != 0)) { in DecodeDataProcessing()
505 VisitUnallocated(instr); in DecodeDataProcessing()
507 if (instr->ExtractBit(11) == 0) { in DecodeDataProcessing()
508 VisitConditionalCompareRegister(instr); in DecodeDataProcessing()
510 VisitConditionalCompareImmediate(instr); in DecodeDataProcessing()
516 if (instr->Mask(0x20000800) != 0x00000000) { in DecodeDataProcessing()
517 VisitUnallocated(instr); in DecodeDataProcessing()
519 VisitConditionalSelect(instr); in DecodeDataProcessing()
524 if (instr->ExtractBit(29) == 0x1) { in DecodeDataProcessing()
525 VisitUnallocated(instr); in DecodeDataProcessing()
528 if (instr->ExtractBit(30) == 0) { in DecodeDataProcessing()
529 if ((instr->ExtractBit(15) == 0x1) || in DecodeDataProcessing()
530 (instr->ExtractBits(15, 11) == 0) || in DecodeDataProcessing()
531 (instr->ExtractBits(15, 12) == 0x1) || in DecodeDataProcessing()
532 ((instr->ExtractBits(15, 12) == 0x3) && in DecodeDataProcessing()
533 (instr->ExtractBit(31) == 0)) || in DecodeDataProcessing()
534 (instr->ExtractBits(15, 13) == 0x3) || in DecodeDataProcessing()
535 (instr->Mask(0x8000EC00) == 0x00004C00) || in DecodeDataProcessing()
536 (instr->Mask(0x8000E800) == 0x80004000) || in DecodeDataProcessing()
537 (instr->Mask(0x8000E400) == 0x80004000)) { in DecodeDataProcessing()
538 VisitUnallocated(instr); in DecodeDataProcessing()
540 VisitDataProcessing2Source(instr); in DecodeDataProcessing()
543 if ((instr->ExtractBits(20, 17) != 0) || in DecodeDataProcessing()
544 (instr->ExtractBit(15) == 1) || in DecodeDataProcessing()
545 ((instr->ExtractBit(16) == 1) && in DecodeDataProcessing()
546 ((instr->ExtractBits(14, 10) > 17) || in DecodeDataProcessing()
547 (instr->ExtractBit(31) == 0))) || in DecodeDataProcessing()
548 ((instr->ExtractBit(16) == 0) && in DecodeDataProcessing()
549 ((instr->ExtractBits(14, 13) != 0) || in DecodeDataProcessing()
550 (instr->Mask(0xA01FFC00) == 0x00000C00) || in DecodeDataProcessing()
551 (instr->Mask(0x201FF800) == 0x00001800)))) { in DecodeDataProcessing()
552 VisitUnallocated(instr); in DecodeDataProcessing()
554 VisitDataProcessing1Source(instr); in DecodeDataProcessing()
564 VisitUnallocated(instr); in DecodeDataProcessing()
569 if (instr->ExtractBit(28) == 0) { in DecodeDataProcessing()
570 if (instr->ExtractBit(21) == 0) { in DecodeDataProcessing()
571 if ((instr->ExtractBits(23, 22) == 0x3) || in DecodeDataProcessing()
572 (instr->Mask(0x80008000) == 0x00008000)) { in DecodeDataProcessing()
573 VisitUnallocated(instr); in DecodeDataProcessing()
575 VisitAddSubShifted(instr); in DecodeDataProcessing()
578 if ((instr->Mask(0x00C00000) != 0x00000000) || in DecodeDataProcessing()
579 (instr->Mask(0x00001400) == 0x00001400) || in DecodeDataProcessing()
580 (instr->Mask(0x00001800) == 0x00001800)) { in DecodeDataProcessing()
581 VisitUnallocated(instr); in DecodeDataProcessing()
583 VisitAddSubExtended(instr); in DecodeDataProcessing()
587 if ((instr->ExtractBit(30) == 0x1) || in DecodeDataProcessing()
588 (instr->ExtractBits(30, 29) == 0x1) || in DecodeDataProcessing()
589 (instr->Mask(0xE0600000) == 0x00200000) || in DecodeDataProcessing()
590 (instr->Mask(0xE0608000) == 0x00400000) || in DecodeDataProcessing()
591 (instr->Mask(0x60608000) == 0x00408000) || in DecodeDataProcessing()
592 (instr->Mask(0x60E00000) == 0x00E00000) || in DecodeDataProcessing()
593 (instr->Mask(0x60E00000) == 0x00800000) || in DecodeDataProcessing()
594 (instr->Mask(0x60E00000) == 0x00600000)) { in DecodeDataProcessing()
595 VisitUnallocated(instr); in DecodeDataProcessing()
597 VisitDataProcessing3Source(instr); in DecodeDataProcessing()
604 void Decoder::DecodeFP(const Instruction* instr) { in DecodeFP() argument
605 VIXL_ASSERT((instr->ExtractBits(27, 24) == 0xE) || in DecodeFP()
606 (instr->ExtractBits(27, 24) == 0xF)); in DecodeFP()
607 if (instr->ExtractBit(28) == 0) { in DecodeFP()
608 DecodeNEONVectorDataProcessing(instr); in DecodeFP()
610 if (instr->ExtractBits(31, 30) == 0x3) { in DecodeFP()
611 VisitUnallocated(instr); in DecodeFP()
612 } else if (instr->ExtractBits(31, 30) == 0x1) { in DecodeFP()
613 DecodeNEONScalarDataProcessing(instr); in DecodeFP()
615 if (instr->ExtractBit(29) == 0) { in DecodeFP()
616 if (instr->ExtractBit(24) == 0) { in DecodeFP()
617 if (instr->ExtractBit(21) == 0) { in DecodeFP()
618 if ((instr->ExtractBits(23, 22) == 0x2) || in DecodeFP()
619 (instr->ExtractBit(18) == 1) || in DecodeFP()
620 (instr->Mask(0x80008000) == 0x00000000) || in DecodeFP()
621 (instr->Mask(0x000E0000) == 0x00000000) || in DecodeFP()
622 (instr->Mask(0x000E0000) == 0x000A0000) || in DecodeFP()
623 (instr->Mask(0x00160000) == 0x00000000) || in DecodeFP()
624 (instr->Mask(0x00160000) == 0x00120000)) { in DecodeFP()
625 VisitUnallocated(instr); in DecodeFP()
627 VisitFPFixedPointConvert(instr); in DecodeFP()
630 if (instr->ExtractBits(15, 10) == 32) { in DecodeFP()
631 VisitUnallocated(instr); in DecodeFP()
632 } else if (instr->ExtractBits(15, 10) == 0) { in DecodeFP()
633 if ((instr->Mask(0x000E0000) == 0x000A0000) || in DecodeFP()
634 (instr->Mask(0x000E0000) == 0x000C0000) || in DecodeFP()
635 (instr->Mask(0x00160000) == 0x00120000) || in DecodeFP()
636 (instr->Mask(0x00160000) == 0x00140000) || in DecodeFP()
637 (instr->Mask(0x20C40000) == 0x00800000) || in DecodeFP()
638 (instr->Mask(0x20C60000) == 0x00840000) || in DecodeFP()
639 (instr->Mask(0xA0C60000) == 0x80060000) || in DecodeFP()
640 (instr->Mask(0xA0C60000) == 0x00860000) || in DecodeFP()
641 (instr->Mask(0xA0CE0000) == 0x80860000) || in DecodeFP()
642 (instr->Mask(0xA0CE0000) == 0x804E0000) || in DecodeFP()
643 (instr->Mask(0xA0CE0000) == 0x000E0000) || in DecodeFP()
644 (instr->Mask(0xA0D60000) == 0x00160000) || in DecodeFP()
645 (instr->Mask(0xA0D60000) == 0x80560000) || in DecodeFP()
646 (instr->Mask(0xA0D60000) == 0x80960000)) { in DecodeFP()
647 VisitUnallocated(instr); in DecodeFP()
649 VisitFPIntegerConvert(instr); in DecodeFP()
651 } else if (instr->ExtractBits(14, 10) == 16) { in DecodeFP()
652 const Instr masked_A0DF8000 = instr->Mask(0xA0DF8000); in DecodeFP()
653 if ((instr->Mask(0x80180000) != 0) || in DecodeFP()
660 (instr->Mask(0xA0D80000) == 0x00800000) || in DecodeFP()
661 (instr->Mask(0xA0DF0000) == 0x00C30000) || in DecodeFP()
662 (instr->Mask(0xA0DF8000) == 0x00C68000)) { in DecodeFP()
663 VisitUnallocated(instr); in DecodeFP()
665 VisitFPDataProcessing1Source(instr); in DecodeFP()
667 } else if (instr->ExtractBits(13, 10) == 8) { in DecodeFP()
668 if ((instr->ExtractBits(15, 14) != 0) || in DecodeFP()
669 (instr->ExtractBits(2, 0) != 0) || in DecodeFP()
670 (instr->ExtractBit(31) == 1) || in DecodeFP()
671 (instr->ExtractBits(23, 22) == 0x2)) { in DecodeFP()
672 VisitUnallocated(instr); in DecodeFP()
674 VisitFPCompare(instr); in DecodeFP()
676 } else if (instr->ExtractBits(12, 10) == 4) { in DecodeFP()
677 if ((instr->ExtractBits(9, 5) != 0) || in DecodeFP()
679 (instr->ExtractBits(23, 22) == 0x2) || in DecodeFP()
680 (instr->ExtractBit(31) == 1)) { in DecodeFP()
681 VisitUnallocated(instr); in DecodeFP()
683 VisitFPImmediate(instr); in DecodeFP()
686 if ((instr->ExtractBits(23, 22) == 0x2) || in DecodeFP()
687 (instr->ExtractBit(31) == 1)) { in DecodeFP()
688 VisitUnallocated(instr); in DecodeFP()
690 switch (instr->ExtractBits(11, 10)) { in DecodeFP()
692 VisitFPConditionalCompare(instr); in DecodeFP()
696 if (instr->ExtractBits(15, 12) > 0x8) { in DecodeFP()
697 VisitUnallocated(instr); in DecodeFP()
699 VisitFPDataProcessing2Source(instr); in DecodeFP()
704 VisitFPConditionalSelect(instr); in DecodeFP()
715 VIXL_ASSERT(instr->ExtractBit(30) == 0); in DecodeFP()
716 if ((instr->Mask(0xA0000000) != 0) || in DecodeFP()
717 (instr->ExtractBits(23, 22) == 0x2)) { in DecodeFP()
718 VisitUnallocated(instr); in DecodeFP()
720 VisitFPDataProcessing3Source(instr); in DecodeFP()
724 VisitUnallocated(instr); in DecodeFP()
731 void Decoder::DecodeNEONLoadStore(const Instruction* instr) { in DecodeNEONLoadStore() argument
732 VIXL_ASSERT(instr->ExtractBits(29, 25) == 0x6); in DecodeNEONLoadStore()
733 if (instr->ExtractBit(31) == 0) { in DecodeNEONLoadStore()
734 if ((instr->ExtractBit(24) == 0) && (instr->ExtractBit(21) == 1)) { in DecodeNEONLoadStore()
735 VisitUnallocated(instr); in DecodeNEONLoadStore()
739 if (instr->ExtractBit(23) == 0) { in DecodeNEONLoadStore()
740 if (instr->ExtractBits(20, 16) == 0) { in DecodeNEONLoadStore()
741 if (instr->ExtractBit(24) == 0) { in DecodeNEONLoadStore()
742 VisitNEONLoadStoreMultiStruct(instr); in DecodeNEONLoadStore()
744 VisitNEONLoadStoreSingleStruct(instr); in DecodeNEONLoadStore()
747 VisitUnallocated(instr); in DecodeNEONLoadStore()
750 if (instr->ExtractBit(24) == 0) { in DecodeNEONLoadStore()
751 VisitNEONLoadStoreMultiStructPostIndex(instr); in DecodeNEONLoadStore()
753 VisitNEONLoadStoreSingleStructPostIndex(instr); in DecodeNEONLoadStore()
757 VisitUnallocated(instr); in DecodeNEONLoadStore()
762 void Decoder::DecodeNEONVectorDataProcessing(const Instruction* instr) { in DecodeNEONVectorDataProcessing() argument
763 VIXL_ASSERT(instr->ExtractBits(28, 25) == 0x7); in DecodeNEONVectorDataProcessing()
764 if (instr->ExtractBit(31) == 0) { in DecodeNEONVectorDataProcessing()
765 if (instr->ExtractBit(24) == 0) { in DecodeNEONVectorDataProcessing()
766 if (instr->ExtractBit(21) == 0) { in DecodeNEONVectorDataProcessing()
767 if (instr->ExtractBit(15) == 0) { in DecodeNEONVectorDataProcessing()
768 if (instr->ExtractBit(10) == 0) { in DecodeNEONVectorDataProcessing()
769 if (instr->ExtractBit(29) == 0) { in DecodeNEONVectorDataProcessing()
770 if (instr->ExtractBit(11) == 0) { in DecodeNEONVectorDataProcessing()
771 VisitNEONTable(instr); in DecodeNEONVectorDataProcessing()
773 VisitNEONPerm(instr); in DecodeNEONVectorDataProcessing()
776 VisitNEONExtract(instr); in DecodeNEONVectorDataProcessing()
779 if (instr->ExtractBits(23, 22) == 0) { in DecodeNEONVectorDataProcessing()
780 VisitNEONCopy(instr); in DecodeNEONVectorDataProcessing()
781 } else if (instr->ExtractBit(14) == 0x0 && in DecodeNEONVectorDataProcessing()
782 instr->ExtractBit(22) == 0x1) { in DecodeNEONVectorDataProcessing()
785 (instr->ExtractBit(29) << 1) | instr->ExtractBit(23); in DecodeNEONVectorDataProcessing()
786 decode_field = (decode_field << 3) | instr->ExtractBits(13, 11); in DecodeNEONVectorDataProcessing()
796 VisitUnallocated(instr); in DecodeNEONVectorDataProcessing()
799 VisitNEON3SameFP16(instr); in DecodeNEONVectorDataProcessing()
803 VisitUnallocated(instr); in DecodeNEONVectorDataProcessing()
806 } else if (instr->ExtractBit(10) == 0) { in DecodeNEONVectorDataProcessing()
807 VisitUnallocated(instr); in DecodeNEONVectorDataProcessing()
808 } else if ((instr->ExtractBits(14, 11) == 0x3) || in DecodeNEONVectorDataProcessing()
809 (instr->ExtractBits(14, 13) == 0x1)) { in DecodeNEONVectorDataProcessing()
812 VisitUnallocated(instr); in DecodeNEONVectorDataProcessing()
813 } else if (instr->ExtractBit(29) == 0) { in DecodeNEONVectorDataProcessing()
815 if (instr->ExtractBits(14, 11) == 0x2) { in DecodeNEONVectorDataProcessing()
817 VisitNEON3SameExtra(instr); in DecodeNEONVectorDataProcessing()
819 VisitUnallocated(instr); in DecodeNEONVectorDataProcessing()
823 if ((instr->ExtractBits(14, 11) == 0xd) || in DecodeNEONVectorDataProcessing()
824 (instr->ExtractBits(14, 11) == 0xf)) { in DecodeNEONVectorDataProcessing()
826 VisitUnallocated(instr); in DecodeNEONVectorDataProcessing()
828 VisitNEON3SameExtra(instr); in DecodeNEONVectorDataProcessing()
832 if (instr->ExtractBit(10) == 0) { in DecodeNEONVectorDataProcessing()
833 if (instr->ExtractBit(11) == 0) { in DecodeNEONVectorDataProcessing()
834 VisitNEON3Different(instr); in DecodeNEONVectorDataProcessing()
836 if (instr->ExtractBits(18, 17) == 0) { in DecodeNEONVectorDataProcessing()
837 if (instr->ExtractBit(20) == 0) { in DecodeNEONVectorDataProcessing()
838 if (instr->ExtractBit(19) == 0) { in DecodeNEONVectorDataProcessing()
839 VisitNEON2RegMisc(instr); in DecodeNEONVectorDataProcessing()
841 if (instr->ExtractBits(30, 29) == 0x2) { in DecodeNEONVectorDataProcessing()
842 VisitCryptoAES(instr); in DecodeNEONVectorDataProcessing()
844 VisitUnallocated(instr); in DecodeNEONVectorDataProcessing()
848 if (instr->ExtractBit(19) == 0) { in DecodeNEONVectorDataProcessing()
849 VisitNEONAcrossLanes(instr); in DecodeNEONVectorDataProcessing()
851 if (instr->ExtractBit(22) == 0) { in DecodeNEONVectorDataProcessing()
852 VisitUnallocated(instr); in DecodeNEONVectorDataProcessing()
854 if ((instr->ExtractBits(16, 15) == 0x0) || in DecodeNEONVectorDataProcessing()
855 (instr->ExtractBits(16, 14) == 0x2) || in DecodeNEONVectorDataProcessing()
856 (instr->ExtractBits(16, 15) == 0x2) || in DecodeNEONVectorDataProcessing()
857 (instr->ExtractBits(16, 12) == 0x1e) || in DecodeNEONVectorDataProcessing()
858 ((instr->ExtractBit(23) == 0) && in DecodeNEONVectorDataProcessing()
859 ((instr->ExtractBits(16, 14) == 0x3) || in DecodeNEONVectorDataProcessing()
860 (instr->ExtractBits(16, 12) == 0x1f))) || in DecodeNEONVectorDataProcessing()
861 ((instr->ExtractBit(23) == 1) && in DecodeNEONVectorDataProcessing()
862 (instr->ExtractBits(16, 12) == 0x1c))) { in DecodeNEONVectorDataProcessing()
863 VisitUnallocated(instr); in DecodeNEONVectorDataProcessing()
865 VisitNEON2RegMiscFP16(instr); in DecodeNEONVectorDataProcessing()
871 VisitUnallocated(instr); in DecodeNEONVectorDataProcessing()
875 VisitNEON3Same(instr); in DecodeNEONVectorDataProcessing()
879 if (instr->ExtractBit(10) == 0) { in DecodeNEONVectorDataProcessing()
880 VisitNEONByIndexedElement(instr); in DecodeNEONVectorDataProcessing()
882 if (instr->ExtractBit(23) == 0) { in DecodeNEONVectorDataProcessing()
883 if (instr->ExtractBits(22, 19) == 0) { in DecodeNEONVectorDataProcessing()
884 VisitNEONModifiedImmediate(instr); in DecodeNEONVectorDataProcessing()
886 VisitNEONShiftImmediate(instr); in DecodeNEONVectorDataProcessing()
889 VisitUnallocated(instr); in DecodeNEONVectorDataProcessing()
894 VisitUnallocated(instr); in DecodeNEONVectorDataProcessing()
899 void Decoder::DecodeNEONScalarDataProcessing(const Instruction* instr) { in DecodeNEONScalarDataProcessing() argument
900 VIXL_ASSERT(instr->ExtractBits(28, 25) == 0xF); in DecodeNEONScalarDataProcessing()
901 if (instr->ExtractBit(24) == 0) { in DecodeNEONScalarDataProcessing()
902 if (instr->ExtractBit(21) == 0) { in DecodeNEONScalarDataProcessing()
903 if (instr->ExtractBit(15) == 0) { in DecodeNEONScalarDataProcessing()
904 if (instr->ExtractBit(10) == 0) { in DecodeNEONScalarDataProcessing()
905 if (instr->ExtractBit(29) == 0) { in DecodeNEONScalarDataProcessing()
906 if (instr->ExtractBit(11) == 0) { in DecodeNEONScalarDataProcessing()
907 VisitCrypto3RegSHA(instr); in DecodeNEONScalarDataProcessing()
909 VisitUnallocated(instr); in DecodeNEONScalarDataProcessing()
912 VisitUnallocated(instr); in DecodeNEONScalarDataProcessing()
915 if (instr->ExtractBits(23, 22) == 0) { in DecodeNEONScalarDataProcessing()
916 VisitNEONScalarCopy(instr); in DecodeNEONScalarDataProcessing()
918 if (instr->Mask(0x00404000) == 0x00400000) { in DecodeNEONScalarDataProcessing()
919 if ((instr->ExtractBits(13, 11) == 0x6) || in DecodeNEONScalarDataProcessing()
920 (instr->ExtractBits(13, 11) < 2) || in DecodeNEONScalarDataProcessing()
921 ((instr->Mask(0x20800000) == 0x00000000) && in DecodeNEONScalarDataProcessing()
922 ((instr->ExtractBits(13, 11) < 0x3) || in DecodeNEONScalarDataProcessing()
923 (instr->ExtractBits(13, 11) == 0x5))) || in DecodeNEONScalarDataProcessing()
924 ((instr->Mask(0x20800000) == 0x00800000) && in DecodeNEONScalarDataProcessing()
925 (instr->ExtractBits(13, 11) < 0x7)) || in DecodeNEONScalarDataProcessing()
926 ((instr->Mask(0x20800000) == 0x20000000) && in DecodeNEONScalarDataProcessing()
927 ((instr->ExtractBits(13, 11) < 0x4) || in DecodeNEONScalarDataProcessing()
928 (instr->ExtractBits(13, 11) == 0x7))) || in DecodeNEONScalarDataProcessing()
929 ((instr->Mask(0x20800000) == 0x20800000) && in DecodeNEONScalarDataProcessing()
930 (instr->ExtractBits(12, 11) == 0x3))) { in DecodeNEONScalarDataProcessing()
931 VisitUnallocated(instr); in DecodeNEONScalarDataProcessing()
933 VisitNEONScalar3SameFP16(instr); in DecodeNEONScalarDataProcessing()
936 VisitUnallocated(instr); in DecodeNEONScalarDataProcessing()
941 if (instr->ExtractBit(29) == 0) { in DecodeNEONScalarDataProcessing()
942 VisitUnallocated(instr); in DecodeNEONScalarDataProcessing()
944 if (instr->ExtractBit(10) == 0) { in DecodeNEONScalarDataProcessing()
945 VisitUnallocated(instr); in DecodeNEONScalarDataProcessing()
947 VisitNEONScalar3SameExtra(instr); in DecodeNEONScalarDataProcessing()
952 if (instr->ExtractBit(10) == 0) { in DecodeNEONScalarDataProcessing()
953 if (instr->ExtractBit(11) == 0) { in DecodeNEONScalarDataProcessing()
954 VisitNEONScalar3Diff(instr); in DecodeNEONScalarDataProcessing()
956 if (instr->ExtractBits(18, 17) == 0) { in DecodeNEONScalarDataProcessing()
957 if (instr->ExtractBit(20) == 0) { in DecodeNEONScalarDataProcessing()
958 if (instr->ExtractBit(19) == 0) { in DecodeNEONScalarDataProcessing()
959 VisitNEONScalar2RegMisc(instr); in DecodeNEONScalarDataProcessing()
961 if (instr->ExtractBit(29) == 0) { in DecodeNEONScalarDataProcessing()
962 VisitCrypto2RegSHA(instr); in DecodeNEONScalarDataProcessing()
964 VisitUnallocated(instr); in DecodeNEONScalarDataProcessing()
968 if (instr->ExtractBit(19) == 0) { in DecodeNEONScalarDataProcessing()
969 VisitNEONScalarPairwise(instr); in DecodeNEONScalarDataProcessing()
971 if (instr->ExtractBit(22) == 0) { in DecodeNEONScalarDataProcessing()
972 VisitUnallocated(instr); in DecodeNEONScalarDataProcessing()
974 if ((instr->ExtractBits(16, 15) == 0x0) || in DecodeNEONScalarDataProcessing()
975 (instr->ExtractBits(16, 14) == 0x2) || in DecodeNEONScalarDataProcessing()
976 (instr->ExtractBits(16, 15) == 0x2) || in DecodeNEONScalarDataProcessing()
977 (instr->ExtractBits(16, 13) == 0xc) || in DecodeNEONScalarDataProcessing()
978 (instr->ExtractBits(16, 12) == 0x1e) || in DecodeNEONScalarDataProcessing()
979 ((instr->ExtractBit(23) == 0) && in DecodeNEONScalarDataProcessing()
980 ((instr->ExtractBits(16, 14) == 0x3) || in DecodeNEONScalarDataProcessing()
981 (instr->ExtractBits(16, 12) == 0x1f))) || in DecodeNEONScalarDataProcessing()
982 ((instr->ExtractBit(23) == 1) && in DecodeNEONScalarDataProcessing()
983 ((instr->ExtractBits(16, 12) == 0xf) || in DecodeNEONScalarDataProcessing()
984 (instr->ExtractBits(16, 12) == 0x1c) || in DecodeNEONScalarDataProcessing()
985 ((instr->ExtractBit(29) == 1) && in DecodeNEONScalarDataProcessing()
986 ((instr->ExtractBits(16, 12) == 0xe) || in DecodeNEONScalarDataProcessing()
987 (instr->ExtractBits(16, 12) == 0x1f)))))) { in DecodeNEONScalarDataProcessing()
988 VisitUnallocated(instr); in DecodeNEONScalarDataProcessing()
990 VisitNEONScalar2RegMiscFP16(instr); in DecodeNEONScalarDataProcessing()
996 VisitUnallocated(instr); in DecodeNEONScalarDataProcessing()
1000 VisitNEONScalar3Same(instr); in DecodeNEONScalarDataProcessing()
1004 if (instr->ExtractBit(10) == 0) { in DecodeNEONScalarDataProcessing()
1005 VisitNEONScalarByIndexedElement(instr); in DecodeNEONScalarDataProcessing()
1007 if (instr->ExtractBit(23) == 0) { in DecodeNEONScalarDataProcessing()
1008 VisitNEONScalarShiftImmediate(instr); in DecodeNEONScalarDataProcessing()
1010 VisitUnallocated(instr); in DecodeNEONScalarDataProcessing()
1018 void Decoder::Visit##A(const Instruction* instr) { \
1020 (instr->Mask(A##FMask) == A##Fixed)); \
1023 (*it)->Visit##A(instr); \