aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>2003-03-16 20:34:20 +0000
committerbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>2003-03-16 20:34:20 +0000
commita300e69170319f9736b67cfcb9dc0c05cf175769 (patch)
tree3ddc57d0ee3b1b059c4aea956a740fd17a0a2fa4 /tests
parent1a9353d258aba69afd8a389bf5fb705caab12ce0 (diff)
downloadqemu-a300e69170319f9736b67cfcb9dc0c05cf175769.zip
qemu-a300e69170319f9736b67cfcb9dc0c05cf175769.tar.gz
qemu-a300e69170319f9736b67cfcb9dc0c05cf175769.tar.bz2
cmpxchg test
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@30 c046a42c-6fe2-441c-8c8c-71466251a162
Diffstat (limited to 'tests')
-rw-r--r--tests/test-i386.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/tests/test-i386.c b/tests/test-i386.c
index 4d68ae2..907c44e 100644
--- a/tests/test-i386.c
+++ b/tests/test-i386.c
@@ -701,6 +701,18 @@ void test_segs(void)
#op, op0, op1);\
}
+#define TEST_CMPXCHG(op, size, opconst, eax)\
+{\
+ int op0, op1;\
+ op0 = 0x12345678;\
+ op1 = 0xfbca7654;\
+ asm(#op " %" size "0, %" size "1" \
+ : "=q" (op0), opconst (op1) \
+ : "0" (op0), "1" (op1), "a" (eax));\
+ printf("%-10s EAX=%08x A=%08x C=%08x\n",\
+ #op, eax, op0, op1);\
+}
+
void test_xchg(void)
{
TEST_XCHG(xchgl, "", "=q");
@@ -718,6 +730,22 @@ void test_xchg(void)
TEST_XCHG(xaddl, "", "=m");
TEST_XCHG(xaddw, "w", "=m");
TEST_XCHG(xaddb, "b", "=m");
+
+ TEST_CMPXCHG(cmpxchgl, "", "=q", 0xfbca7654);
+ TEST_CMPXCHG(cmpxchgw, "w", "=q", 0xfbca7654);
+ TEST_CMPXCHG(cmpxchgb, "b", "=q", 0xfbca7654);
+
+ TEST_CMPXCHG(cmpxchgl, "", "=q", 0xfffefdfc);
+ TEST_CMPXCHG(cmpxchgw, "w", "=q", 0xfffefdfc);
+ TEST_CMPXCHG(cmpxchgb, "b", "=q", 0xfffefdfc);
+
+ TEST_CMPXCHG(cmpxchgl, "", "=m", 0xfbca7654);
+ TEST_CMPXCHG(cmpxchgw, "w", "=m", 0xfbca7654);
+ TEST_CMPXCHG(cmpxchgb, "b", "=m", 0xfbca7654);
+
+ TEST_CMPXCHG(cmpxchgl, "", "=m", 0xfffefdfc);
+ TEST_CMPXCHG(cmpxchgw, "w", "=m", 0xfffefdfc);
+ TEST_CMPXCHG(cmpxchgb, "b", "=m", 0xfffefdfc);
}
static void *call_end __init_call = NULL;