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 |