Theodore Dubois <tbl...@icloud.com> writes:
> ping http://patchwork.ozlabs.org/patch/786393/ Applied to tct-tests/next with another patch to work around enterq. Sorry for the delay. > > ~Theodore > >> On Jul 10, 2017, at 1:57 PM, Theodore Dubois <tbl...@icloud.com> wrote: >> >> Clang's assembler is slightly incompatible with GCC's assembler, which >> caused the program to not compile on Clang for these reasons: >> >> - The "q" constraint was specified for an argument to the set >> instruction, which didn't work because Clang chose the esi register, >> which has no 8-bit form on i386. >> - Clang doesn't support size suffixes on the loop instructions. >> - Clang requires a size suffix on the fist instruction. >> - Clang doesn't support specifying segment prefixes before the >> instruction, and requires specifying them on the address. >> - The arguments to the bound instruction are in the wrong order on >> Clang. https://bugs.llvm.org/show_bug.cgi?id=27653 >> >> Signed-off-by: Theodore Dubois <tbl...@icloud.com> >> --- >> tests/tcg/test-i386.c | 20 ++++++++++++++++---- >> 1 file changed, 16 insertions(+), 4 deletions(-) >> >> diff --git a/tests/tcg/test-i386.c b/tests/tcg/test-i386.c >> index 0f7b943b0c..dcb8e4876e 100644 >> --- a/tests/tcg/test-i386.c >> +++ b/tests/tcg/test-i386.c >> @@ -369,7 +369,7 @@ void test_lea(void) >> asm("movl $0, %0\n\t"\ >> "cmpl %2, %1\n\t"\ >> "set" JCC " %b0\n\t"\ >> - : "=r" (res)\ >> + : "=q" (res)\ >> : "r" (v1), "r" (v2));\ >> printf("%-10s %d\n", "set" JCC, res);\ >> if (TEST_CMOV) {\ >> @@ -491,15 +491,23 @@ void test_loop(void) >> >> #if !defined(__x86_64__) >> TEST_LOOP("jcxz"); >> +#if !defined(__clang__) >> TEST_LOOP("loopw"); >> TEST_LOOP("loopzw"); >> TEST_LOOP("loopnzw"); >> #endif >> +#endif >> >> TEST_LOOP("jecxz"); >> +#if !defined(__clang__) >> TEST_LOOP("loopl"); >> TEST_LOOP("loopzl"); >> TEST_LOOP("loopnzl"); >> +#else >> + TEST_LOOP("loop"); >> + TEST_LOOP("loopz"); >> + TEST_LOOP("loopnz"); >> +#endif >> } >> >> #undef CC_MASK >> @@ -867,7 +875,7 @@ void test_fcvt(double a) >> uint16_t val16; >> val16 = (fpuc & ~0x0c00) | (i << 10); >> asm volatile ("fldcw %0" : : "m" (val16)); >> - asm volatile ("fist %0" : "=m" (wa) : "t" (a)); >> + asm volatile ("fists %0" : "=m" (wa) : "t" (a)); >> asm volatile ("fistl %0" : "=m" (ia) : "t" (a)); >> asm volatile ("fistpll %0" : "=m" (lla) : "t" (a) : "st"); >> asm volatile ("frndint ; fstl %0" : "=m" (ra) : "t" (a)); >> @@ -1318,12 +1326,12 @@ void test_segs(void) >> seg_data1[1] = 0xaa; >> seg_data2[1] = 0x55; >> >> - asm volatile ("fs movzbl 0x1, %0" : "=r" (res)); >> + asm volatile ("movzbl %%fs:0x1, %0" : "=r" (res)); >> printf("FS[1] = %02x\n", res); >> >> asm volatile ("pushl %%gs\n" >> "movl %1, %%gs\n" >> - "gs movzbl 0x1, %0\n" >> + "movzbl %%gs:0x1, %0\n" >> "popl %%gs\n" >> : "=r" (res) >> : "r" (MK_SEL(2))); >> @@ -1764,7 +1772,11 @@ void test_exceptions(void) >> /* bound exception */ >> tab[0] = 1; >> tab[1] = 10; >> +#if defined(__clang__) >> + asm volatile ("bound %1, %0" : : "r" (11), "m" (tab[0])); >> +#else >> asm volatile ("bound %0, %1" : : "r" (11), "m" (tab[0])); >> +#endif >> } >> #endif >> >> -- >> 2.13.2 >> >> >> >> ~Theodore >> >> -- Alex Bennée