Skip to content
This repository was archived by the owner on Jan 28, 2023. It is now read-only.

Commit eda0250

Browse files
authored
Merge pull request #124 from kryptoslogic/bt-tests
Added tests for BT/BTS/BTR/BTC instructions
2 parents 5e8b93c + f4884d4 commit eda0250

File tree

1 file changed

+119
-24
lines changed

1 file changed

+119
-24
lines changed

tests/test_emulator.cpp

Lines changed: 119 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -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-
588576
TEST_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+
624696
TEST_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+
706801
TEST_F(EmulatorTest, insn_xor) {
707802
test_alu_2op<8>("xor", {
708803
{ 0x0F, 0xF0, RFLAGS_CF,

0 commit comments

Comments
 (0)