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

Commit f4884d4

Browse files
committed
Added tests for BT/BTS/BTR/BTC instructions
Signed-off-by: Alexandro Sanchez Bach <[email protected]>
1 parent 09bb9eb commit f4884d4

File tree

1 file changed

+96
-0
lines changed

1 file changed

+96
-0
lines changed

tests/test_emulator.cpp

Lines changed: 96 additions & 0 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) {
@@ -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+
600696
TEST_F(EmulatorTest, insn_movs) {
601697
test_cpu_t vcpu_original;
602698
test_cpu_t vcpu_expected;

0 commit comments

Comments
 (0)