@@ -488,6 +488,18 @@ class EmulatorTest : public testing::Test {
488488 test_insn_mN_rN<N>(insn_name, tests, false );
489489 }
490490
491+ template <int N>
492+ void test_bt (const char * insn_name,
493+ const std::vector<test_alu_2op_t >& tests) {
494+ if (N == 64 && sizeof (void *) < 8 ) {
495+ return ;
496+ }
497+ test_insn_rN_rN<N>(insn_name, tests, false );
498+ test_insn_rN_iN<N>(insn_name, tests, false );
499+ test_insn_mN_iN<N>(insn_name, tests, false );
500+ test_insn_mN_rN<N>(insn_name, tests, false );
501+ }
502+
491503 template <int N>
492504 void test_test (const std::vector<test_alu_2op_t >& tests) {
493505 if (N == 64 && sizeof (void *) < 8 ) {
@@ -597,6 +609,90 @@ TEST_F(EmulatorTest, insn_bextr) {
597609 test_insn_rN_mN_rN<64 >(" bextr" , tests64);
598610}
599611
612+ TEST_F (EmulatorTest, insn_bt) {
613+ test_bt<16 >(" bt" , {
614+ { 0xFFFE , 0x00 , RFLAGS_CF,
615+ 0xFFFE , 0 },
616+ { 0x0200 , 0x09 , 0 ,
617+ 0x0200 , RFLAGS_CF },
618+ });
619+ test_bt<32 >(" bt" , {
620+ { 0xFF7FFFFF , 0x17 , 0 ,
621+ 0xFF7FFFFF , 0 },
622+ { 0xFFFF0000 , 0x3F , RFLAGS_CF,
623+ 0xFFFF0000 , RFLAGS_CF },
624+ });
625+ test_bt<64 >(" bt" , {
626+ { 0x00000000'FFFFFFFFULL , 0x20 , RFLAGS_CF,
627+ 0x00000000'FFFFFFFFULL , 0 },
628+ { 0x80000000'00000000ULL , 0x7F , 0 ,
629+ 0x80000000'00000000ULL , RFLAGS_CF },
630+ });
631+ }
632+
633+ TEST_F (EmulatorTest, insn_btc) {
634+ test_bt<16 >(" btc" , {
635+ { 0xFFFE , 0x00 , RFLAGS_CF,
636+ 0xFFFF , 0 },
637+ { 0x0200 , 0x09 , 0 ,
638+ 0x0000 , RFLAGS_CF },
639+ });
640+ test_bt<32 >(" btc" , {
641+ { 0xFF7FFFFF , 0x17 , 0 ,
642+ 0xFFFFFFFF , 0 },
643+ { 0xFFFF0000 , 0x3F , RFLAGS_CF,
644+ 0x7FFF0000 , RFLAGS_CF },
645+ });
646+ test_bt<64 >(" btc" , {
647+ { 0x00000000'FFFFFFFFULL , 0x20 , RFLAGS_CF,
648+ 0x00000001'FFFFFFFFULL , 0 },
649+ { 0x80000000'00000000ULL , 0x7F , 0 ,
650+ 0x00000000'00000000ULL , RFLAGS_CF },
651+ });
652+ }
653+
654+ TEST_F (EmulatorTest, insn_btr) {
655+ test_bt<16 >(" btr" , {
656+ { 0xFFFE , 0x00 , RFLAGS_CF,
657+ 0xFFFE , 0 },
658+ { 0x0200 , 0x09 , 0 ,
659+ 0x0000 , RFLAGS_CF },
660+ });
661+ test_bt<32 >(" btr" , {
662+ { 0xFF7FFFFF , 0x17 , 0 ,
663+ 0xFF7FFFFF , 0 },
664+ { 0xFFFF0000 , 0x3F , RFLAGS_CF,
665+ 0x7FFF0000 , RFLAGS_CF },
666+ });
667+ test_bt<64 >(" btr" , {
668+ { 0x00000000'FFFFFFFFULL , 0x20 , RFLAGS_CF,
669+ 0x00000000'FFFFFFFFULL , 0 },
670+ { 0x80000000'00000000ULL , 0x7F , 0 ,
671+ 0x00000000'00000000ULL , RFLAGS_CF },
672+ });
673+ }
674+
675+ TEST_F (EmulatorTest, insn_bts) {
676+ test_bt<16 >(" bts" , {
677+ { 0xFFFE , 0x00 , RFLAGS_CF,
678+ 0xFFFF , 0 },
679+ { 0x0200 , 0x09 , 0 ,
680+ 0x0200 , RFLAGS_CF },
681+ });
682+ test_bt<32 >(" bts" , {
683+ { 0xFF7FFFFF , 0x17 , 0 ,
684+ 0xFFFFFFFF , 0 },
685+ { 0xFFFF0000 , 0x3F , RFLAGS_CF,
686+ 0xFFFF0000 , RFLAGS_CF },
687+ });
688+ test_bt<64 >(" bts" , {
689+ { 0x00000000'FFFFFFFFULL , 0x20 , RFLAGS_CF,
690+ 0x00000001'FFFFFFFFULL , 0 },
691+ { 0x80000000'00000000ULL , 0x7F , 0 ,
692+ 0x80000000'00000000ULL , RFLAGS_CF },
693+ });
694+ }
695+
600696TEST_F (EmulatorTest, insn_movs) {
601697 test_cpu_t vcpu_original;
602698 test_cpu_t vcpu_expected;
0 commit comments