From c2ad11ac70b9ae2010eb63d5eaf77ede0168ca41 Mon Sep 17 00:00:00 2001 From: grischka Date: Sun, 2 Oct 2016 01:38:22 +0200 Subject: [PATCH] tccgen: fix long long -> char/short cast This was causing assembler bugs in a tcc compiled by itself at i386-asm.c:352 when ExprValue.v was changed to uint64_t: if (op->e.v == (int8_t)op->e.v) op->type |= OP_IM8S; A general test case: #include int main(int argc, char **argv) { long long ll = 4000; int i = (char)ll; printf("%d\n", i); return 0; } Output was "4000", now "-96". Also: add "asmtest2" as asmtest with tcc compiled by itself --- tccgen.c | 5 ++++- tests/Makefile | 9 ++++++--- tests/asmtest.S | 2 ++ 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/tccgen.c b/tccgen.c index 2376848b..398e1659 100644 --- a/tccgen.c +++ b/tccgen.c @@ -1948,7 +1948,10 @@ static void force_charshort_cast(int t) vpushi((1 << bits) - 1); gen_op('&'); } else { - bits = 32 - bits; + if ((vtop->type.t & VT_BTYPE) == VT_LLONG) + bits = 64 - bits; + else + bits = 32 - bits; vpushi(bits); gen_op(TOK_SHL); /* result must be signed or the SAR is converted to an SHL diff --git a/tests/Makefile b/tests/Makefile index 78b56448..50b3a8cd 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -21,7 +21,7 @@ TESTS = \ BTESTS = test1b test3b btest # test4 -- problem with -static -# asmtest -- minor differences with gcc +# asmtest / asmtest2 -- minor differences with gcc # btest -- works on i386 (including win32) # bounds-checking is supported only on i386 @@ -173,12 +173,15 @@ asmtest.ref: asmtest.S $(CC) -Wa,-W -o asmtest.ref.o -c asmtest.S objdump -D asmtest.ref.o > asmtest.ref -asmtest: asmtest.ref +asmtest asmtest2: asmtest.ref @echo ------------ $@ ------------ - $(TCC) -c asmtest.S + $(TCC) $(MAYBE_RUN_TCC) -c asmtest.S objdump -D asmtest.o > asmtest.out @if diff -u --ignore-matching-lines="file format" asmtest.ref asmtest.out ; then echo "ASM Auto Test OK"; fi +# test assembler with tcc compiled by itself +asmtest2: MAYBE_RUN_TCC = $(RUN_TCC) + # Check that code generated by libtcc is binary compatible with # that generated by CC abitest-cc$(EXESUF): abitest.c $(LIBTCC) diff --git a/tests/asmtest.S b/tests/asmtest.S index fd0629cc..d7d68008 100644 --- a/tests/asmtest.S +++ b/tests/asmtest.S @@ -696,6 +696,7 @@ int $0x10 inc %eax #endif +#ifndef _WIN32 ft1: ft2: ft3: ft4: ft5: ft6: ft7: ft8: ft9: xor %eax, %eax ret @@ -708,6 +709,7 @@ ft1: ft2: ft3: ft4: ft5: ft6: ft7: ft8: ft9: .type ft6,@function .type ft7,%function .type ft8,"function" +#endif pause .rept 6