Commit 8aadfbf0d12f39ff06d757b6b4135a93c438c04a
1 parent
40293e58
compilation fixes - added bswap - comments
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3938 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
60 additions
and
41 deletions
tests/test-i386.c
@@ -1065,7 +1065,7 @@ void test_bcd(void) | @@ -1065,7 +1065,7 @@ void test_bcd(void) | ||
1065 | op1 = i2l(0xfbca7654);\ | 1065 | op1 = i2l(0xfbca7654);\ |
1066 | asm(#op " %" size "0, %" size "1" \ | 1066 | asm(#op " %" size "0, %" size "1" \ |
1067 | : "=q" (op0), opconst (op1) \ | 1067 | : "=q" (op0), opconst (op1) \ |
1068 | - : "0" (op0), "1" (op1));\ | 1068 | + : "0" (op0));\ |
1069 | printf("%-10s A=" FMTLX " B=" FMTLX "\n",\ | 1069 | printf("%-10s A=" FMTLX " B=" FMTLX "\n",\ |
1070 | #op, op0, op1);\ | 1070 | #op, op0, op1);\ |
1071 | } | 1071 | } |
@@ -1078,7 +1078,7 @@ void test_bcd(void) | @@ -1078,7 +1078,7 @@ void test_bcd(void) | ||
1078 | op2 = i2l(eax);\ | 1078 | op2 = i2l(eax);\ |
1079 | asm(#op " %" size "0, %" size "1" \ | 1079 | asm(#op " %" size "0, %" size "1" \ |
1080 | : "=q" (op0), opconst (op1) \ | 1080 | : "=q" (op0), opconst (op1) \ |
1081 | - : "0" (op0), "1" (op1), "a" (op2));\ | 1081 | + : "0" (op0), "a" (op2));\ |
1082 | printf("%-10s EAX=" FMTLX " A=" FMTLX " C=" FMTLX "\n",\ | 1082 | printf("%-10s EAX=" FMTLX " A=" FMTLX " C=" FMTLX "\n",\ |
1083 | #op, op2, op0, op1);\ | 1083 | #op, op2, op0, op1);\ |
1084 | } | 1084 | } |
@@ -1086,25 +1086,25 @@ void test_bcd(void) | @@ -1086,25 +1086,25 @@ void test_bcd(void) | ||
1086 | void test_xchg(void) | 1086 | void test_xchg(void) |
1087 | { | 1087 | { |
1088 | #if defined(__x86_64__) | 1088 | #if defined(__x86_64__) |
1089 | - TEST_XCHG(xchgq, "", "=q"); | 1089 | + TEST_XCHG(xchgq, "", "+q"); |
1090 | #endif | 1090 | #endif |
1091 | - TEST_XCHG(xchgl, "k", "=q"); | ||
1092 | - TEST_XCHG(xchgw, "w", "=q"); | ||
1093 | - TEST_XCHG(xchgb, "b", "=q"); | 1091 | + TEST_XCHG(xchgl, "k", "+q"); |
1092 | + TEST_XCHG(xchgw, "w", "+q"); | ||
1093 | + TEST_XCHG(xchgb, "b", "+q"); | ||
1094 | 1094 | ||
1095 | #if defined(__x86_64__) | 1095 | #if defined(__x86_64__) |
1096 | TEST_XCHG(xchgq, "", "=m"); | 1096 | TEST_XCHG(xchgq, "", "=m"); |
1097 | #endif | 1097 | #endif |
1098 | - TEST_XCHG(xchgl, "k", "=m"); | ||
1099 | - TEST_XCHG(xchgw, "w", "=m"); | ||
1100 | - TEST_XCHG(xchgb, "b", "=m"); | 1098 | + TEST_XCHG(xchgl, "k", "+m"); |
1099 | + TEST_XCHG(xchgw, "w", "+m"); | ||
1100 | + TEST_XCHG(xchgb, "b", "+m"); | ||
1101 | 1101 | ||
1102 | #if defined(__x86_64__) | 1102 | #if defined(__x86_64__) |
1103 | - TEST_XCHG(xaddq, "", "=q"); | 1103 | + TEST_XCHG(xaddq, "", "+q"); |
1104 | #endif | 1104 | #endif |
1105 | - TEST_XCHG(xaddl, "k", "=q"); | ||
1106 | - TEST_XCHG(xaddw, "w", "=q"); | ||
1107 | - TEST_XCHG(xaddb, "b", "=q"); | 1105 | + TEST_XCHG(xaddl, "k", "+q"); |
1106 | + TEST_XCHG(xaddw, "w", "+q"); | ||
1107 | + TEST_XCHG(xaddb, "b", "+q"); | ||
1108 | 1108 | ||
1109 | { | 1109 | { |
1110 | int res; | 1110 | int res; |
@@ -1114,39 +1114,39 @@ void test_xchg(void) | @@ -1114,39 +1114,39 @@ void test_xchg(void) | ||
1114 | } | 1114 | } |
1115 | 1115 | ||
1116 | #if defined(__x86_64__) | 1116 | #if defined(__x86_64__) |
1117 | - TEST_XCHG(xaddq, "", "=m"); | 1117 | + TEST_XCHG(xaddq, "", "+m"); |
1118 | #endif | 1118 | #endif |
1119 | - TEST_XCHG(xaddl, "k", "=m"); | ||
1120 | - TEST_XCHG(xaddw, "w", "=m"); | ||
1121 | - TEST_XCHG(xaddb, "b", "=m"); | 1119 | + TEST_XCHG(xaddl, "k", "+m"); |
1120 | + TEST_XCHG(xaddw, "w", "+m"); | ||
1121 | + TEST_XCHG(xaddb, "b", "+m"); | ||
1122 | 1122 | ||
1123 | #if defined(__x86_64__) | 1123 | #if defined(__x86_64__) |
1124 | - TEST_CMPXCHG(cmpxchgq, "", "=q", 0xfbca7654); | 1124 | + TEST_CMPXCHG(cmpxchgq, "", "+q", 0xfbca7654); |
1125 | #endif | 1125 | #endif |
1126 | - TEST_CMPXCHG(cmpxchgl, "k", "=q", 0xfbca7654); | ||
1127 | - TEST_CMPXCHG(cmpxchgw, "w", "=q", 0xfbca7654); | ||
1128 | - TEST_CMPXCHG(cmpxchgb, "b", "=q", 0xfbca7654); | 1126 | + TEST_CMPXCHG(cmpxchgl, "k", "+q", 0xfbca7654); |
1127 | + TEST_CMPXCHG(cmpxchgw, "w", "+q", 0xfbca7654); | ||
1128 | + TEST_CMPXCHG(cmpxchgb, "b", "+q", 0xfbca7654); | ||
1129 | 1129 | ||
1130 | #if defined(__x86_64__) | 1130 | #if defined(__x86_64__) |
1131 | - TEST_CMPXCHG(cmpxchgq, "", "=q", 0xfffefdfc); | 1131 | + TEST_CMPXCHG(cmpxchgq, "", "+q", 0xfffefdfc); |
1132 | #endif | 1132 | #endif |
1133 | - TEST_CMPXCHG(cmpxchgl, "k", "=q", 0xfffefdfc); | ||
1134 | - TEST_CMPXCHG(cmpxchgw, "w", "=q", 0xfffefdfc); | ||
1135 | - TEST_CMPXCHG(cmpxchgb, "b", "=q", 0xfffefdfc); | 1133 | + TEST_CMPXCHG(cmpxchgl, "k", "+q", 0xfffefdfc); |
1134 | + TEST_CMPXCHG(cmpxchgw, "w", "+q", 0xfffefdfc); | ||
1135 | + TEST_CMPXCHG(cmpxchgb, "b", "+q", 0xfffefdfc); | ||
1136 | 1136 | ||
1137 | #if defined(__x86_64__) | 1137 | #if defined(__x86_64__) |
1138 | - TEST_CMPXCHG(cmpxchgq, "", "=m", 0xfbca7654); | 1138 | + TEST_CMPXCHG(cmpxchgq, "", "+m", 0xfbca7654); |
1139 | #endif | 1139 | #endif |
1140 | - TEST_CMPXCHG(cmpxchgl, "k", "=m", 0xfbca7654); | ||
1141 | - TEST_CMPXCHG(cmpxchgw, "w", "=m", 0xfbca7654); | ||
1142 | - TEST_CMPXCHG(cmpxchgb, "b", "=m", 0xfbca7654); | 1140 | + TEST_CMPXCHG(cmpxchgl, "k", "+m", 0xfbca7654); |
1141 | + TEST_CMPXCHG(cmpxchgw, "w", "+m", 0xfbca7654); | ||
1142 | + TEST_CMPXCHG(cmpxchgb, "b", "+m", 0xfbca7654); | ||
1143 | 1143 | ||
1144 | #if defined(__x86_64__) | 1144 | #if defined(__x86_64__) |
1145 | - TEST_CMPXCHG(cmpxchgq, "", "=m", 0xfffefdfc); | 1145 | + TEST_CMPXCHG(cmpxchgq, "", "+m", 0xfffefdfc); |
1146 | #endif | 1146 | #endif |
1147 | - TEST_CMPXCHG(cmpxchgl, "k", "=m", 0xfffefdfc); | ||
1148 | - TEST_CMPXCHG(cmpxchgw, "w", "=m", 0xfffefdfc); | ||
1149 | - TEST_CMPXCHG(cmpxchgb, "b", "=m", 0xfffefdfc); | 1147 | + TEST_CMPXCHG(cmpxchgl, "k", "+m", 0xfffefdfc); |
1148 | + TEST_CMPXCHG(cmpxchgw, "w", "+m", 0xfffefdfc); | ||
1149 | + TEST_CMPXCHG(cmpxchgb, "b", "+m", 0xfffefdfc); | ||
1150 | 1150 | ||
1151 | { | 1151 | { |
1152 | uint64_t op0, op1, op2; | 1152 | uint64_t op0, op1, op2; |
@@ -1369,9 +1369,13 @@ void test_misc(void) | @@ -1369,9 +1369,13 @@ void test_misc(void) | ||
1369 | printf("xlat: EAX=" FMTLX "\n", res); | 1369 | printf("xlat: EAX=" FMTLX "\n", res); |
1370 | 1370 | ||
1371 | #if defined(__x86_64__) | 1371 | #if defined(__x86_64__) |
1372 | +#if 0 | ||
1372 | { | 1373 | { |
1374 | + /* XXX: see if Intel Core2 and AMD64 behavior really | ||
1375 | + differ. Here we implemented the Intel way which is not | ||
1376 | + compatible yet with QEMU. */ | ||
1373 | static struct __attribute__((packed)) { | 1377 | static struct __attribute__((packed)) { |
1374 | - uint32_t offset; | 1378 | + uint64_t offset; |
1375 | uint16_t seg; | 1379 | uint16_t seg; |
1376 | } desc; | 1380 | } desc; |
1377 | long cs_sel; | 1381 | long cs_sel; |
@@ -1384,27 +1388,27 @@ void test_misc(void) | @@ -1384,27 +1388,27 @@ void test_misc(void) | ||
1384 | : "r" (cs_sel) : "memory", "cc"); | 1388 | : "r" (cs_sel) : "memory", "cc"); |
1385 | printf("func_lret=" FMTLX "\n", res); | 1389 | printf("func_lret=" FMTLX "\n", res); |
1386 | 1390 | ||
1387 | - /* NOTE: we assume that &func_lret < 4GB */ | ||
1388 | desc.offset = (long)&func_lret; | 1391 | desc.offset = (long)&func_lret; |
1389 | desc.seg = cs_sel; | 1392 | desc.seg = cs_sel; |
1390 | 1393 | ||
1391 | asm volatile ("xor %%rax, %%rax\n" | 1394 | asm volatile ("xor %%rax, %%rax\n" |
1392 | - "rex64 lcall %1\n" | 1395 | + "rex64 lcall *(%%rcx)\n" |
1393 | : "=a" (res) | 1396 | : "=a" (res) |
1394 | - : "m" (desc) | 1397 | + : "c" (&desc) |
1395 | : "memory", "cc"); | 1398 | : "memory", "cc"); |
1396 | printf("func_lret2=" FMTLX "\n", res); | 1399 | printf("func_lret2=" FMTLX "\n", res); |
1397 | 1400 | ||
1398 | asm volatile ("push %2\n" | 1401 | asm volatile ("push %2\n" |
1399 | "mov $ 1f, %%rax\n" | 1402 | "mov $ 1f, %%rax\n" |
1400 | "push %%rax\n" | 1403 | "push %%rax\n" |
1401 | - "ljmp %1\n" | 1404 | + "rex64 ljmp *(%%rcx)\n" |
1402 | "1:\n" | 1405 | "1:\n" |
1403 | : "=a" (res) | 1406 | : "=a" (res) |
1404 | - : "m" (desc), "b" (cs_sel) | 1407 | + : "c" (&desc), "b" (cs_sel) |
1405 | : "memory", "cc"); | 1408 | : "memory", "cc"); |
1406 | printf("func_lret3=" FMTLX "\n", res); | 1409 | printf("func_lret3=" FMTLX "\n", res); |
1407 | } | 1410 | } |
1411 | +#endif | ||
1408 | #else | 1412 | #else |
1409 | asm volatile ("push %%cs ; call %1" | 1413 | asm volatile ("push %%cs ; call %1" |
1410 | : "=a" (res) | 1414 | : "=a" (res) |
@@ -2029,7 +2033,7 @@ static void test_enter(void) | @@ -2029,7 +2033,7 @@ static void test_enter(void) | ||
2029 | #ifdef TEST_SSE | 2033 | #ifdef TEST_SSE |
2030 | 2034 | ||
2031 | typedef int __m64 __attribute__ ((__mode__ (__V2SI__))); | 2035 | typedef int __m64 __attribute__ ((__mode__ (__V2SI__))); |
2032 | -typedef int __m128 __attribute__ ((__mode__(__V4SF__))); | 2036 | +typedef float __m128 __attribute__ ((__mode__(__V4SF__))); |
2033 | 2037 | ||
2034 | typedef union { | 2038 | typedef union { |
2035 | double d[2]; | 2039 | double d[2]; |
@@ -2619,6 +2623,21 @@ void test_conv(void) | @@ -2619,6 +2623,21 @@ void test_conv(void) | ||
2619 | #if defined(__x86_64__) | 2623 | #if defined(__x86_64__) |
2620 | TEST_CONV_RAX_RDX(cqo); | 2624 | TEST_CONV_RAX_RDX(cqo); |
2621 | #endif | 2625 | #endif |
2626 | + | ||
2627 | + { | ||
2628 | + unsigned long a, r; | ||
2629 | + a = i2l(0x12345678); | ||
2630 | + asm volatile("bswapl %k0" : "=r" (r) : "0" (a)); | ||
2631 | + printf("%-10s: A=" FMTLX " R=" FMTLX "\n", "bswapl", a, r); | ||
2632 | + } | ||
2633 | +#if defined(__x86_64__) | ||
2634 | + { | ||
2635 | + unsigned long a, r; | ||
2636 | + a = i2l(0x12345678); | ||
2637 | + asm volatile("bswapq %0" : "=r" (r) : "0" (a)); | ||
2638 | + printf("%-10s: A=" FMTLX " R=" FMTLX "\n", "bswapq", a, r); | ||
2639 | + } | ||
2640 | +#endif | ||
2622 | } | 2641 | } |
2623 | 2642 | ||
2624 | extern void *__start_initcall; | 2643 | extern void *__start_initcall; |
@@ -2653,8 +2672,8 @@ int main(int argc, char **argv) | @@ -2653,8 +2672,8 @@ int main(int argc, char **argv) | ||
2653 | #ifdef TEST_VM86 | 2672 | #ifdef TEST_VM86 |
2654 | test_vm86(); | 2673 | test_vm86(); |
2655 | #endif | 2674 | #endif |
2656 | - test_exceptions(); | ||
2657 | #if !defined(__x86_64__) | 2675 | #if !defined(__x86_64__) |
2676 | + test_exceptions(); | ||
2658 | test_self_modifying_code(); | 2677 | test_self_modifying_code(); |
2659 | test_single_step(); | 2678 | test_single_step(); |
2660 | #endif | 2679 | #endif |