@@ -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 ) {
@@ -561,30 +573,6 @@ TEST_F(EmulatorTest, insn_and) {
561573 });
562574}
563575
564- TEST_F (EmulatorTest, insn_test) {
565- test_test<8 >({
566- { 0x55 , 0xF0 , RFLAGS_CF,
567- 0x50 , RFLAGS_PF },
568- { 0xF0 , 0x0F , RFLAGS_OF,
569- 0x00 , RFLAGS_PF | RFLAGS_ZF },
570- });
571- test_test<16 >({
572- { 0x0001 , 0xF00F , RFLAGS_CF | RFLAGS_OF,
573- 0x0001 , 0 },
574- { 0xFF00 , 0xF0F0 , 0 ,
575- 0xF000 , RFLAGS_PF | RFLAGS_SF },
576- });
577- test_test<32 >({
578- { 0xFFFF0001 , 0xFFFF0001 , 0 ,
579- 0xFFFF0001 , RFLAGS_SF },
580- });
581- test_test<64 >({
582- { 0x0000FFFF'F0F0FFFFULL , 0xFFFF0000'0F0F0000ULL , 0 ,
583- 0x00000000'00000000ULL , RFLAGS_PF | RFLAGS_ZF },
584- });
585- }
586-
587-
588576TEST_F (EmulatorTest, insn_andn) {
589577 const std::vector<test_alu_3op_t > tests32 = {
590578 { 0x00000000'00000000 , 0xF0F0F0F0'F0F0F0F0 , 0xFF00FF00'FF00FF00 , 0 ,
@@ -621,6 +609,90 @@ TEST_F(EmulatorTest, insn_bextr) {
621609 test_insn_rN_mN_rN<64 >(" bextr" , tests64);
622610}
623611
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+
624696TEST_F (EmulatorTest, insn_movs) {
625697 test_cpu_t vcpu_original;
626698 test_cpu_t vcpu_expected;
@@ -703,6 +775,29 @@ TEST_F(EmulatorTest, insn_stos) {
703775 run (" stosb" , vcpu_original, vcpu_expected);
704776}
705777
778+ TEST_F (EmulatorTest, insn_test) {
779+ test_test<8 >({
780+ { 0x55 , 0xF0 , RFLAGS_CF,
781+ 0x50 , RFLAGS_PF },
782+ { 0xF0 , 0x0F , RFLAGS_OF,
783+ 0x00 , RFLAGS_PF | RFLAGS_ZF },
784+ });
785+ test_test<16 >({
786+ { 0x0001 , 0xF00F , RFLAGS_CF | RFLAGS_OF,
787+ 0x0001 , 0 },
788+ { 0xFF00 , 0xF0F0 , 0 ,
789+ 0xF000 , RFLAGS_PF | RFLAGS_SF },
790+ });
791+ test_test<32 >({
792+ { 0xFFFF0001 , 0xFFFF0001 , 0 ,
793+ 0xFFFF0001 , RFLAGS_SF },
794+ });
795+ test_test<64 >({
796+ { 0x0000FFFF'F0F0FFFFULL , 0xFFFF0000'0F0F0000ULL , 0 ,
797+ 0x00000000'00000000ULL , RFLAGS_PF | RFLAGS_ZF },
798+ });
799+ }
800+
706801TEST_F (EmulatorTest, insn_xor) {
707802 test_alu_2op<8 >(" xor" , {
708803 { 0x0F , 0xF0 , RFLAGS_CF,
0 commit comments