1086
1132
void test_xchg(void)
1088
1134
#if defined(__x86_64__)
1089
TEST_XCHG(xchgq, "", "=q");
1135
TEST_XCHG(xchgq, "", "+q");
1091
TEST_XCHG(xchgl, "k", "=q");
1092
TEST_XCHG(xchgw, "w", "=q");
1093
TEST_XCHG(xchgb, "b", "=q");
1137
TEST_XCHG(xchgl, "k", "+q");
1138
TEST_XCHG(xchgw, "w", "+q");
1139
TEST_XCHG(xchgb, "b", "+q");
1095
1141
#if defined(__x86_64__)
1096
1142
TEST_XCHG(xchgq, "", "=m");
1098
TEST_XCHG(xchgl, "k", "=m");
1099
TEST_XCHG(xchgw, "w", "=m");
1100
TEST_XCHG(xchgb, "b", "=m");
1144
TEST_XCHG(xchgl, "k", "+m");
1145
TEST_XCHG(xchgw, "w", "+m");
1146
TEST_XCHG(xchgb, "b", "+m");
1102
1148
#if defined(__x86_64__)
1103
TEST_XCHG(xaddq, "", "=q");
1149
TEST_XCHG(xaddq, "", "+q");
1105
TEST_XCHG(xaddl, "k", "=q");
1106
TEST_XCHG(xaddw, "w", "=q");
1107
TEST_XCHG(xaddb, "b", "=q");
1151
TEST_XCHG(xaddl, "k", "+q");
1152
TEST_XCHG(xaddw, "w", "+q");
1153
TEST_XCHG(xaddb, "b", "+q");
1116
1162
#if defined(__x86_64__)
1117
TEST_XCHG(xaddq, "", "=m");
1119
TEST_XCHG(xaddl, "k", "=m");
1120
TEST_XCHG(xaddw, "w", "=m");
1121
TEST_XCHG(xaddb, "b", "=m");
1123
#if defined(__x86_64__)
1124
TEST_CMPXCHG(cmpxchgq, "", "=q", 0xfbca7654);
1126
TEST_CMPXCHG(cmpxchgl, "k", "=q", 0xfbca7654);
1127
TEST_CMPXCHG(cmpxchgw, "w", "=q", 0xfbca7654);
1128
TEST_CMPXCHG(cmpxchgb, "b", "=q", 0xfbca7654);
1130
#if defined(__x86_64__)
1131
TEST_CMPXCHG(cmpxchgq, "", "=q", 0xfffefdfc);
1133
TEST_CMPXCHG(cmpxchgl, "k", "=q", 0xfffefdfc);
1134
TEST_CMPXCHG(cmpxchgw, "w", "=q", 0xfffefdfc);
1135
TEST_CMPXCHG(cmpxchgb, "b", "=q", 0xfffefdfc);
1137
#if defined(__x86_64__)
1138
TEST_CMPXCHG(cmpxchgq, "", "=m", 0xfbca7654);
1140
TEST_CMPXCHG(cmpxchgl, "k", "=m", 0xfbca7654);
1141
TEST_CMPXCHG(cmpxchgw, "w", "=m", 0xfbca7654);
1142
TEST_CMPXCHG(cmpxchgb, "b", "=m", 0xfbca7654);
1144
#if defined(__x86_64__)
1145
TEST_CMPXCHG(cmpxchgq, "", "=m", 0xfffefdfc);
1147
TEST_CMPXCHG(cmpxchgl, "k", "=m", 0xfffefdfc);
1148
TEST_CMPXCHG(cmpxchgw, "w", "=m", 0xfffefdfc);
1149
TEST_CMPXCHG(cmpxchgb, "b", "=m", 0xfffefdfc);
1163
TEST_XCHG(xaddq, "", "+m");
1165
TEST_XCHG(xaddl, "k", "+m");
1166
TEST_XCHG(xaddw, "w", "+m");
1167
TEST_XCHG(xaddb, "b", "+m");
1169
#if defined(__x86_64__)
1170
TEST_CMPXCHG(cmpxchgq, "", "+q", 0xfbca7654);
1172
TEST_CMPXCHG(cmpxchgl, "k", "+q", 0xfbca7654);
1173
TEST_CMPXCHG(cmpxchgw, "w", "+q", 0xfbca7654);
1174
TEST_CMPXCHG(cmpxchgb, "b", "+q", 0xfbca7654);
1176
#if defined(__x86_64__)
1177
TEST_CMPXCHG(cmpxchgq, "", "+q", 0xfffefdfc);
1179
TEST_CMPXCHG(cmpxchgl, "k", "+q", 0xfffefdfc);
1180
TEST_CMPXCHG(cmpxchgw, "w", "+q", 0xfffefdfc);
1181
TEST_CMPXCHG(cmpxchgb, "b", "+q", 0xfffefdfc);
1183
#if defined(__x86_64__)
1184
TEST_CMPXCHG(cmpxchgq, "", "+m", 0xfbca7654);
1186
TEST_CMPXCHG(cmpxchgl, "k", "+m", 0xfbca7654);
1187
TEST_CMPXCHG(cmpxchgw, "w", "+m", 0xfbca7654);
1188
TEST_CMPXCHG(cmpxchgb, "b", "+m", 0xfbca7654);
1190
#if defined(__x86_64__)
1191
TEST_CMPXCHG(cmpxchgq, "", "+m", 0xfffefdfc);
1193
TEST_CMPXCHG(cmpxchgl, "k", "+m", 0xfffefdfc);
1194
TEST_CMPXCHG(cmpxchgw, "w", "+m", 0xfffefdfc);
1195
TEST_CMPXCHG(cmpxchgb, "b", "+m", 0xfffefdfc);
1152
1198
uint64_t op0, op1, op2;
1153
1200
long i, eflags;
1155
1202
for(i = 0; i < 2; i++) {
1156
1203
op0 = 0x123456789abcdLL;
1204
eax = i2l(op0 & 0xffffffff);
1205
edx = i2l(op0 >> 32);
1158
1207
op1 = 0xfbca765423456LL;
1161
1210
op2 = 0x6532432432434LL;
1162
asm("cmpxchg8b %1\n"
1211
asm("cmpxchg8b %2\n"
1165
: "=A" (op0), "=m" (op1), "=g" (eflags)
1166
: "0" (op0), "m" (op1), "b" ((int)op2), "c" ((int)(op2 >> 32)));
1167
printf("cmpxchg8b: op0=" FMT64X " op1=" FMT64X " CC=%02lx\n",
1168
op0, op1, eflags & CC_Z);
1214
: "=a" (eax), "=d" (edx), "=m" (op1), "=g" (eflags)
1215
: "0" (eax), "1" (edx), "m" (op1), "b" ((int)op2), "c" ((int)(op2 >> 32)));
1216
printf("cmpxchg8b: eax=" FMTLX " edx=" FMTLX " op1=" FMT64X " CC=%02lx\n",
1217
eax, edx, op1, eflags & CC_Z);
1196
1245
#define TEST_LR(op, size, seg, mask)\
1198
1247
int res, res2;\
1248
uint16_t mseg = seg;\
1199
1249
res = 0x12345678;\
1200
1250
asm (op " %" size "2, %" size "0\n" \
1201
1251
"movl $0, %1\n"\
1203
1253
"movl $1, %1\n"\
1205
: "=r" (res), "=r" (res2) : "m" (seg), "0" (res));\
1255
: "=r" (res), "=r" (res2) : "m" (mseg), "0" (res));\
1206
1256
printf(op ": Z=%d %08x\n", res2, res & ~(mask));\
1259
#define TEST_ARPL(op, size, op1, op2)\
1264
asm volatile(op " %" size "3, %" size "0\n"\
1269
: "=r" (a), "=r" (c) : "0" (a), "r" (b)); \
1270
printf(op size " A=" FMTLX " B=" FMTLX " R=" FMTLX " z=%ld\n",\
1271
(long)(op1), (long)(op2), a, c);\
1209
1274
/* NOTE: we use Linux modify_ldt syscall */
1210
1275
void test_segs(void)