From be43c8e0ed22faa6c89c6e551f2a07512673d60d Mon Sep 17 00:00:00 2001 From: Shinichiro Hamaji Date: Thu, 16 Apr 2009 01:32:16 +0900 Subject: [PATCH] x86-64: Cast from 64bit pointer to long long must not generate movslq. --- tcc.c | 2 +- tcctest.c | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/tcc.c b/tcc.c index ec5a47dd..1b0db21f 100644 --- a/tcc.c +++ b/tcc.c @@ -6228,7 +6228,7 @@ static void gen_cast(CType *type) vpop(); #else int r = gv(RC_INT); - if (sbt != (VT_INT | VT_UNSIGNED)) { + if (sbt != (VT_INT | VT_UNSIGNED) && sbt != VT_PTR) { /* x86_64 specific: movslq */ o(0x6348); o(0xc0 + (REG_VALUE(r) << 3) + REG_VALUE(r)); diff --git a/tcctest.c b/tcctest.c index be47c907..8ef322e2 100644 --- a/tcctest.c +++ b/tcctest.c @@ -1109,6 +1109,8 @@ void cast_test() char tab[10]; unsigned b,d; short s; + char *p = NULL; + p -= 0x700000000042; printf("cast_test:\n"); a = 0xfffff; @@ -1150,6 +1152,14 @@ void cast_test() printf("sizeof(+(char)'a') = %d\n", sizeof(+(char)'a')); printf("sizeof(-(char)'a') = %d\n", sizeof(-(char)'a')); printf("sizeof(~(char)'a') = %d\n", sizeof(-(char)'a')); + + /* from pointer to integer types */ + printf("%d %d %d %d %d %d %ld %ld %lld %lld\n", + (char)p, (unsigned char)p, + (short)p, (unsigned short)p, + (int)p, (unsigned int)p, + (long)p, (unsigned long)p, + (long long)p, (unsigned long long)p); } /* initializers tests */