llvm.org GIT mirror llvm / c1b7ca5
Fix #13138, a bug around ARM instruction DSB encoding and decoding issue. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@161161 91177308-0d34-0410-b5e6-96231b3b80d8 Jiangning Liu 8 years ago
7 changed file(s) with 316 addition(s) and 79 deletion(s). Raw diff Collapse all Expand all
32783278 parseMemBarrierOptOperand(SmallVectorImpl &Operands) {
32793279 SMLoc S = Parser.getTok().getLoc();
32803280 const AsmToken &Tok = Parser.getTok();
3281 if (!Tok.is(AsmToken::Identifier))
3282 return MatchOperand_NoMatch;
3283 StringRef OptStr = Tok.getString();
3284
3285 unsigned Opt = StringSwitch(OptStr.slice(0, OptStr.size()).lower())
3286 .Case("sy", ARM_MB::SY)
3287 .Case("st", ARM_MB::ST)
3288 .Case("sh", ARM_MB::ISH)
3289 .Case("ish", ARM_MB::ISH)
3290 .Case("shst", ARM_MB::ISHST)
3291 .Case("ishst", ARM_MB::ISHST)
3292 .Case("nsh", ARM_MB::NSH)
3293 .Case("un", ARM_MB::NSH)
3294 .Case("nshst", ARM_MB::NSHST)
3295 .Case("unst", ARM_MB::NSHST)
3296 .Case("osh", ARM_MB::OSH)
3297 .Case("oshst", ARM_MB::OSHST)
3298 .Default(~0U);
3299
3300 if (Opt == ~0U)
3301 return MatchOperand_NoMatch;
3302
3303 Parser.Lex(); // Eat identifier token.
3281 unsigned Opt;
3282
3283 if (Tok.is(AsmToken::Identifier)) {
3284 StringRef OptStr = Tok.getString();
3285
3286 Opt = StringSwitch(OptStr.slice(0, OptStr.size()).lower())
3287 .Case("sy", ARM_MB::SY)
3288 .Case("st", ARM_MB::ST)
3289 .Case("sh", ARM_MB::ISH)
3290 .Case("ish", ARM_MB::ISH)
3291 .Case("shst", ARM_MB::ISHST)
3292 .Case("ishst", ARM_MB::ISHST)
3293 .Case("nsh", ARM_MB::NSH)
3294 .Case("un", ARM_MB::NSH)
3295 .Case("nshst", ARM_MB::NSHST)
3296 .Case("unst", ARM_MB::NSHST)
3297 .Case("osh", ARM_MB::OSH)
3298 .Case("oshst", ARM_MB::OSHST)
3299 .Default(~0U);
3300
3301 if (Opt == ~0U)
3302 return MatchOperand_NoMatch;
3303
3304 Parser.Lex(); // Eat identifier token.
3305 } else if (Tok.is(AsmToken::Hash) ||
3306 Tok.is(AsmToken::Dollar) ||
3307 Tok.is(AsmToken::Integer)) {
3308 if (Parser.getTok().isNot(AsmToken::Integer))
3309 Parser.Lex(); // Eat the '#'.
3310 SMLoc Loc = Parser.getTok().getLoc();
3311
3312 const MCExpr *MemBarrierID;
3313 if (getParser().ParseExpression(MemBarrierID)) {
3314 Error(Loc, "illegal expression");
3315 return MatchOperand_ParseFail;
3316 }
3317
3318 const MCConstantExpr *CE = dyn_cast(MemBarrierID);
3319 if (!CE) {
3320 Error(Loc, "constant expression expected");
3321 return MatchOperand_ParseFail;
3322 }
3323
3324 int Val = CE->getValue();
3325 if (Val & ~0xf) {
3326 Error(Loc, "immediate value out of range");
3327 return MatchOperand_ParseFail;
3328 }
3329
3330 Opt = ARM_MB::RESERVED_0 + Val;
3331 } else
3332 return MatchOperand_ParseFail;
3333
33043334 Operands.push_back(ARMOperand::CreateMemBarrierOpt((ARM_MB::MemBOpt)Opt, S));
33053335 return MatchOperand_Success;
33063336 }
34933493
34943494 static DecodeStatus DecodeMemBarrierOption(MCInst &Inst, unsigned Val,
34953495 uint64_t Address, const void *Decoder) {
3496 switch (Val) {
3497 default:
3498 return MCDisassembler::Fail;
3499 case 0xF: // SY
3500 case 0xE: // ST
3501 case 0xB: // ISH
3502 case 0xA: // ISHST
3503 case 0x7: // NSH
3504 case 0x6: // NSHST
3505 case 0x3: // OSH
3506 case 0x2: // OSHST
3507 break;
3508 }
3496 if (Val & ~0xf)
3497 return MCDisassembler::Fail;
35093498
35103499 Inst.addOperand(MCOperand::CreateImm(Val));
35113500 return MCDisassembler::Success;
119119 // The Memory Barrier Option constants map directly to the 4-bit encoding of
120120 // the option field for memory barrier operations.
121121 enum MemBOpt {
122 SY = 15,
122 RESERVED_0 = 0,
123 RESERVED_1 = 1,
124 OSHST = 2,
125 OSH = 3,
126 RESERVED_4 = 4,
127 RESERVED_5 = 5,
128 NSHST = 6,
129 NSH = 7,
130 RESERVED_8 = 8,
131 RESERVED_9 = 9,
132 ISHST = 10,
133 ISH = 11,
134 RESERVED_12 = 12,
135 RESERVED_13 = 13,
123136 ST = 14,
124 ISH = 11,
125 ISHST = 10,
126 NSH = 7,
127 NSHST = 6,
128 OSH = 3,
129 OSHST = 2
137 SY = 15
130138 };
131139
132140 inline static const char *MemBOptToString(unsigned val) {
134142 default: llvm_unreachable("Unknown memory operation");
135143 case SY: return "sy";
136144 case ST: return "st";
145 case RESERVED_13: return "#0xd";
146 case RESERVED_12: return "#0xc";
137147 case ISH: return "ish";
138148 case ISHST: return "ishst";
149 case RESERVED_9: return "#0x9";
150 case RESERVED_8: return "#0x8";
139151 case NSH: return "nsh";
140152 case NSHST: return "nshst";
153 case RESERVED_5: return "#0x5";
154 case RESERVED_4: return "#0x4";
141155 case OSH: return "osh";
142156 case OSHST: return "oshst";
157 case RESERVED_1: return "#0x1";
158 case RESERVED_0: return "#0x0";
143159 }
144160 }
145161 } // namespace ARM_MB
566566 @------------------------------------------------------------------------------
567567 @ DMB
568568 @------------------------------------------------------------------------------
569 dmb #0xf
570 dmb #0xe
571 dmb #0xd
572 dmb #0xc
573 dmb #0xb
574 dmb #0xa
575 dmb #0x9
576 dmb #0x8
577 dmb #0x7
578 dmb #0x6
579 dmb #0x5
580 dmb #0x4
581 dmb #0x3
582 dmb #0x2
583 dmb #0x1
584 dmb #0x0
585
569586 dmb sy
570587 dmb st
571588 dmb sh
582599
583600 @ CHECK: dmb sy @ encoding: [0x5f,0xf0,0x7f,0xf5]
584601 @ CHECK: dmb st @ encoding: [0x5e,0xf0,0x7f,0xf5]
602 @ CHECK: dmb #0xd @ encoding: [0x5d,0xf0,0x7f,0xf5]
603 @ CHECK: dmb #0xc @ encoding: [0x5c,0xf0,0x7f,0xf5]
604 @ CHECK: dmb ish @ encoding: [0x5b,0xf0,0x7f,0xf5]
605 @ CHECK: dmb ishst @ encoding: [0x5a,0xf0,0x7f,0xf5]
606 @ CHECK: dmb #0x9 @ encoding: [0x59,0xf0,0x7f,0xf5]
607 @ CHECK: dmb #0x8 @ encoding: [0x58,0xf0,0x7f,0xf5]
608 @ CHECK: dmb nsh @ encoding: [0x57,0xf0,0x7f,0xf5]
609 @ CHECK: dmb nshst @ encoding: [0x56,0xf0,0x7f,0xf5]
610 @ CHECK: dmb #0x5 @ encoding: [0x55,0xf0,0x7f,0xf5]
611 @ CHECK: dmb #0x4 @ encoding: [0x54,0xf0,0x7f,0xf5]
612 @ CHECK: dmb osh @ encoding: [0x53,0xf0,0x7f,0xf5]
613 @ CHECK: dmb oshst @ encoding: [0x52,0xf0,0x7f,0xf5]
614 @ CHECK: dmb #0x1 @ encoding: [0x51,0xf0,0x7f,0xf5]
615 @ CHECK: dmb #0x0 @ encoding: [0x50,0xf0,0x7f,0xf5]
616
617 @ CHECK: dmb sy @ encoding: [0x5f,0xf0,0x7f,0xf5]
618 @ CHECK: dmb st @ encoding: [0x5e,0xf0,0x7f,0xf5]
585619 @ CHECK: dmb ish @ encoding: [0x5b,0xf0,0x7f,0xf5]
586620 @ CHECK: dmb ish @ encoding: [0x5b,0xf0,0x7f,0xf5]
587621 @ CHECK: dmb ishst @ encoding: [0x5a,0xf0,0x7f,0xf5]
597631 @------------------------------------------------------------------------------
598632 @ DSB
599633 @------------------------------------------------------------------------------
634 dsb #0xf
635 dsb #0xe
636 dsb #0xd
637 dsb #0xc
638 dsb #0xb
639 dsb #0xa
640 dsb #0x9
641 dsb #0x8
642 dsb #0x7
643 dsb #0x6
644 dsb #0x5
645 dsb #0x4
646 dsb #0x3
647 dsb #0x2
648 dsb #0x1
649 dsb #0x0
650
651 dsb 8
652 dsb 7
653
600654 dsb sy
601655 dsb st
602656 dsb sh
610664 dsb osh
611665 dsb oshst
612666 dsb
667
668 @ CHECK: dsb sy @ encoding: [0x4f,0xf0,0x7f,0xf5]
669 @ CHECK: dsb st @ encoding: [0x4e,0xf0,0x7f,0xf5]
670 @ CHECK: dsb #0xd @ encoding: [0x4d,0xf0,0x7f,0xf5]
671 @ CHECK: dsb #0xc @ encoding: [0x4c,0xf0,0x7f,0xf5]
672 @ CHECK: dsb ish @ encoding: [0x4b,0xf0,0x7f,0xf5]
673 @ CHECK: dsb ishst @ encoding: [0x4a,0xf0,0x7f,0xf5]
674 @ CHECK: dsb #0x9 @ encoding: [0x49,0xf0,0x7f,0xf5]
675 @ CHECK: dsb #0x8 @ encoding: [0x48,0xf0,0x7f,0xf5]
676 @ CHECK: dsb nsh @ encoding: [0x47,0xf0,0x7f,0xf5]
677 @ CHECK: dsb nshst @ encoding: [0x46,0xf0,0x7f,0xf5]
678 @ CHECK: dsb #0x5 @ encoding: [0x45,0xf0,0x7f,0xf5]
679 @ CHECK: dsb #0x4 @ encoding: [0x44,0xf0,0x7f,0xf5]
680 @ CHECK: dsb osh @ encoding: [0x43,0xf0,0x7f,0xf5]
681 @ CHECK: dsb oshst @ encoding: [0x42,0xf0,0x7f,0xf5]
682 @ CHECK: dsb #0x1 @ encoding: [0x41,0xf0,0x7f,0xf5]
683 @ CHECK: dsb #0x0 @ encoding: [0x40,0xf0,0x7f,0xf5]
684
685 @ CHECK: dsb #0x8 @ encoding: [0x48,0xf0,0x7f,0xf5]
686 @ CHECK: dsb nsh @ encoding: [0x47,0xf0,0x7f,0xf5]
613687
614688 @ CHECK: dsb sy @ encoding: [0x4f,0xf0,0x7f,0xf5]
615689 @ CHECK: dsb st @ encoding: [0x4e,0xf0,0x7f,0xf5]
416416 @------------------------------------------------------------------------------
417417 @ DMB
418418 @------------------------------------------------------------------------------
419 dmb #0xf
420 dmb #0xe
421 dmb #0xd
422 dmb #0xc
423 dmb #0xb
424 dmb #0xa
425 dmb #0x9
426 dmb #0x8
427 dmb #0x7
428 dmb #0x6
429 dmb #0x5
430 dmb #0x4
431 dmb #0x3
432 dmb #0x2
433 dmb #0x1
434 dmb #0x0
435
419436 dmb sy
420437 dmb st
421438 dmb sh
432449
433450 @ CHECK: dmb sy @ encoding: [0xbf,0xf3,0x5f,0x8f]
434451 @ CHECK: dmb st @ encoding: [0xbf,0xf3,0x5e,0x8f]
452 @ CHECK: dmb #0xd @ encoding: [0xbf,0xf3,0x5d,0x8f]
453 @ CHECK: dmb #0xc @ encoding: [0xbf,0xf3,0x5c,0x8f]
454 @ CHECK: dmb ish @ encoding: [0xbf,0xf3,0x5b,0x8f]
455 @ CHECK: dmb ishst @ encoding: [0xbf,0xf3,0x5a,0x8f]
456 @ CHECK: dmb #0x9 @ encoding: [0xbf,0xf3,0x59,0x8f]
457 @ CHECK: dmb #0x8 @ encoding: [0xbf,0xf3,0x58,0x8f]
458 @ CHECK: dmb nsh @ encoding: [0xbf,0xf3,0x57,0x8f]
459 @ CHECK: dmb nshst @ encoding: [0xbf,0xf3,0x56,0x8f]
460 @ CHECK: dmb #0x5 @ encoding: [0xbf,0xf3,0x55,0x8f]
461 @ CHECK: dmb #0x4 @ encoding: [0xbf,0xf3,0x54,0x8f]
462 @ CHECK: dmb osh @ encoding: [0xbf,0xf3,0x53,0x8f]
463 @ CHECK: dmb oshst @ encoding: [0xbf,0xf3,0x52,0x8f]
464 @ CHECK: dmb #0x1 @ encoding: [0xbf,0xf3,0x51,0x8f]
465 @ CHECK: dmb #0x0 @ encoding: [0xbf,0xf3,0x50,0x8f]
466
467 @ CHECK: dmb sy @ encoding: [0xbf,0xf3,0x5f,0x8f]
468 @ CHECK: dmb st @ encoding: [0xbf,0xf3,0x5e,0x8f]
435469 @ CHECK: dmb ish @ encoding: [0xbf,0xf3,0x5b,0x8f]
436470 @ CHECK: dmb ish @ encoding: [0xbf,0xf3,0x5b,0x8f]
437471 @ CHECK: dmb ishst @ encoding: [0xbf,0xf3,0x5a,0x8f]
448482 @------------------------------------------------------------------------------
449483 @ DSB
450484 @------------------------------------------------------------------------------
485 dsb #0xf
486 dsb #0xe
487 dsb #0xd
488 dsb #0xc
489 dsb #0xb
490 dsb #0xa
491 dsb #0x9
492 dsb #0x8
493 dsb #0x7
494 dsb #0x6
495 dsb #0x5
496 dsb #0x4
497 dsb #0x3
498 dsb #0x2
499 dsb #0x1
500 dsb #0x0
501
451502 dsb sy
452503 dsb st
453504 dsb sh
461512 dsb osh
462513 dsb oshst
463514 dsb
515
516 @ CHECK: dsb sy @ encoding: [0xbf,0xf3,0x4f,0x8f]
517 @ CHECK: dsb st @ encoding: [0xbf,0xf3,0x4e,0x8f]
518 @ CHECK: dsb #0xd @ encoding: [0xbf,0xf3,0x4d,0x8f]
519 @ CHECK: dsb #0xc @ encoding: [0xbf,0xf3,0x4c,0x8f]
520 @ CHECK: dsb ish @ encoding: [0xbf,0xf3,0x4b,0x8f]
521 @ CHECK: dsb ishst @ encoding: [0xbf,0xf3,0x4a,0x8f]
522 @ CHECK: dsb #0x9 @ encoding: [0xbf,0xf3,0x49,0x8f]
523 @ CHECK: dsb #0x8 @ encoding: [0xbf,0xf3,0x48,0x8f]
524 @ CHECK: dsb nsh @ encoding: [0xbf,0xf3,0x47,0x8f]
525 @ CHECK: dsb nshst @ encoding: [0xbf,0xf3,0x46,0x8f]
526 @ CHECK: dsb #0x5 @ encoding: [0xbf,0xf3,0x45,0x8f]
527 @ CHECK: dsb #0x4 @ encoding: [0xbf,0xf3,0x44,0x8f]
528 @ CHECK: dsb osh @ encoding: [0xbf,0xf3,0x43,0x8f]
529 @ CHECK: dsb oshst @ encoding: [0xbf,0xf3,0x42,0x8f]
530 @ CHECK: dsb #0x1 @ encoding: [0xbf,0xf3,0x41,0x8f]
531 @ CHECK: dsb #0x0 @ encoding: [0xbf,0xf3,0x40,0x8f]
464532
465533 @ CHECK: dsb sy @ encoding: [0xbf,0xf3,0x4f,0x8f]
466534 @ CHECK: dsb st @ encoding: [0xbf,0xf3,0x4e,0x8f]
474474 #------------------------------------------------------------------------------
475475 # DMB
476476 #------------------------------------------------------------------------------
477
478 # CHECK: dmb #0x0
479 # CHECK: dmb #0x1
480 # CHECK: dmb oshst
481 # CHECK: dmb osh
482 # CHECK: dmb #0x4
483 # CHECK: dmb #0x5
484 # CHECK: dmb nshst
485 # CHECK: dmb nsh
486 # CHECK: dmb #0x8
487 # CHECK: dmb #0x9
488 # CHECK: dmb ishst
489 # CHECK: dmb ish
490 # CHECK: dmb #0xc
491 # CHECK: dmb #0xd
492 # CHECK: dmb st
477493 # CHECK: dmb sy
478 # CHECK: dmb st
479 # CHECK: dmb ish
480 # CHECK: dmb ishst
481 # CHECK: dmb nsh
482 # CHECK: dmb nshst
483 # CHECK: dmb osh
484 # CHECK: dmb oshst
485 # CHECK: dmb
486
494
495 0x50 0xf0 0x7f 0xf5
496 0x51 0xf0 0x7f 0xf5
497 0x52 0xf0 0x7f 0xf5
498 0x53 0xf0 0x7f 0xf5
499 0x54 0xf0 0x7f 0xf5
500 0x55 0xf0 0x7f 0xf5
501 0x56 0xf0 0x7f 0xf5
502 0x57 0xf0 0x7f 0xf5
503 0x58 0xf0 0x7f 0xf5
504 0x59 0xf0 0x7f 0xf5
505 0x5a 0xf0 0x7f 0xf5
506 0x5b 0xf0 0x7f 0xf5
507 0x5c 0xf0 0x7f 0xf5
508 0x5d 0xf0 0x7f 0xf5
509 0x5e 0xf0 0x7f 0xf5
487510 0x5f 0xf0 0x7f 0xf5
488 0x5e 0xf0 0x7f 0xf5
489 0x5b 0xf0 0x7f 0xf5
490 0x5a 0xf0 0x7f 0xf5
491 0x57 0xf0 0x7f 0xf5
492 0x56 0xf0 0x7f 0xf5
493 0x53 0xf0 0x7f 0xf5
494 0x52 0xf0 0x7f 0xf5
495 0x5f 0xf0 0x7f 0xf5
496511
497512 #------------------------------------------------------------------------------
498513 # DSB
499514 #------------------------------------------------------------------------------
500 # CHECK: dsb sy
501 # CHECK: dsb st
502 # CHECK: dsb ish
503 # CHECK: dsb ishst
504 # CHECK: dsb nsh
505 # CHECK: dsb nshst
506 # CHECK: dsb osh
507 # CHECK: dsb oshst
508 # CHECK: dsb
509
510 0x4f 0xf0 0x7f 0xf5
515
516 # CHECK: dsb #0x0
517 # CHECK: dsb #0x1
518 # CHECK: dsb oshst
519 # CHECK: dsb osh
520 # CHECK: dsb #0x4
521 # CHECK: dsb #0x5
522 # CHECK: dsb nshst
523 # CHECK: dsb nsh
524 # CHECK: dsb #0x8
525 # CHECK: dsb #0x9
526 # CHECK: dsb ishst
527 # CHECK: dsb ish
528 # CHECK: dsb #0xc
529 # CHECK: dsb #0xd
530 # CHECK: dsb st
531 # CHECK: dsb sy
532
533 0x40 0xf0 0x7f 0xf5
534 0x41 0xf0 0x7f 0xf5
535 0x42 0xf0 0x7f 0xf5
536 0x43 0xf0 0x7f 0xf5
537 0x44 0xf0 0x7f 0xf5
538 0x45 0xf0 0x7f 0xf5
539 0x46 0xf0 0x7f 0xf5
540 0x47 0xf0 0x7f 0xf5
541 0x48 0xf0 0x7f 0xf5
542 0x49 0xf0 0x7f 0xf5
543 0x4a 0xf0 0x7f 0xf5
544 0x4b 0xf0 0x7f 0xf5
545 0x4c 0xf0 0x7f 0xf5
546 0x4d 0xf0 0x7f 0xf5
511547 0x4e 0xf0 0x7f 0xf5
512 0x4b 0xf0 0x7f 0xf5
513 0x4a 0xf0 0x7f 0xf5
514 0x47 0xf0 0x7f 0xf5
515 0x46 0xf0 0x7f 0xf5
516 0x43 0xf0 0x7f 0xf5
517 0x42 0xf0 0x7f 0xf5
518548 0x4f 0xf0 0x7f 0xf5
519549
520550 #------------------------------------------------------------------------------
345345 #------------------------------------------------------------------------------
346346 #CHECK: dmb sy
347347 #CHECK: dmb st
348 #CHECK: dmb #0xd
349 #CHECK: dmb #0xc
348350 #CHECK: dmb ish
349351 #CHECK: dmb ishst
352 #CHECK: dmb #0x9
353 #CHECK: dmb #0x8
350354 #CHECK: dmb nsh
351355 #CHECK: dmb nshst
356 #CHECK: dmb #0x5
357 #CHECK: dmb #0x4
352358 #CHECK: dmb osh
353359 #CHECK: dmb oshst
354 #CHECK: dmb
360 #CHECK: dmb #0x1
361 #CHECK: dmb #0x0
355362
356363 0xbf 0xf3 0x5f 0x8f
357364 0xbf 0xf3 0x5e 0x8f
365 0xbf 0xf3 0x5d 0x8f
366 0xbf 0xf3 0x5c 0x8f
358367 0xbf 0xf3 0x5b 0x8f
359368 0xbf 0xf3 0x5a 0x8f
369 0xbf 0xf3 0x59 0x8f
370 0xbf 0xf3 0x58 0x8f
360371 0xbf 0xf3 0x57 0x8f
361372 0xbf 0xf3 0x56 0x8f
373 0xbf 0xf3 0x55 0x8f
374 0xbf 0xf3 0x54 0x8f
362375 0xbf 0xf3 0x53 0x8f
363376 0xbf 0xf3 0x52 0x8f
364 0xbf 0xf3 0x5f 0x8f
377 0xbf 0xf3 0x51 0x8f
378 0xbf 0xf3 0x50 0x8f
365379
366380
367381 #------------------------------------------------------------------------------
369383 #------------------------------------------------------------------------------
370384 #CHECK: dsb sy
371385 #CHECK: dsb st
386 #CHECK: dsb #0xd
387 #CHECK: dsb #0xc
372388 #CHECK: dsb ish
373389 #CHECK: dsb ishst
390 #CHECK: dsb #0x9
391 #CHECK: dsb #0x8
374392 #CHECK: dsb nsh
375393 #CHECK: dsb nshst
394 #CHECK: dsb #0x5
395 #CHECK: dsb #0x4
376396 #CHECK: dsb osh
377397 #CHECK: dsb oshst
398 #CHECK: dsb #0x1
399 #CHECK: dsb #0x0
378400
379401 0xbf 0xf3 0x4f 0x8f
380402 0xbf 0xf3 0x4e 0x8f
403 0xbf 0xf3 0x4d 0x8f
404 0xbf 0xf3 0x4c 0x8f
381405 0xbf 0xf3 0x4b 0x8f
382406 0xbf 0xf3 0x4a 0x8f
407 0xbf 0xf3 0x49 0x8f
408 0xbf 0xf3 0x48 0x8f
383409 0xbf 0xf3 0x47 0x8f
384410 0xbf 0xf3 0x46 0x8f
411 0xbf 0xf3 0x45 0x8f
412 0xbf 0xf3 0x44 0x8f
385413 0xbf 0xf3 0x43 0x8f
386414 0xbf 0xf3 0x42 0x8f
415 0xbf 0xf3 0x41 0x8f
416 0xbf 0xf3 0x40 0x8f
387417
388418
389419 #------------------------------------------------------------------------------