From 39a4b859d4d4f76d2616b2c6e6a697dc261daa1a Mon Sep 17 00:00:00 2001 From: Shinichiro Hamaji Date: Fri, 17 Apr 2009 01:01:23 +0900 Subject: [PATCH] x86-64: Fix cast from integers to pointers. Now, ./tcc -run -DTCC_TARGET_X86_64 tcc.c -run tcctest.c works! --- tcc.c | 12 +++++++++--- tcctest.c | 4 ++++ 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/tcc.c b/tcc.c index 00fd3a07..3901b81a 100644 --- a/tcc.c +++ b/tcc.c @@ -6208,10 +6208,10 @@ static void gen_cast(CType *type) gen_cast(type); } } +#ifndef TCC_TARGET_X86_64 } else if ((dbt & VT_BTYPE) == VT_LLONG) { if ((sbt & VT_BTYPE) != VT_LLONG) { /* scalar to long long */ -#ifndef TCC_TARGET_X86_64 /* machine independent conversion */ gv(RC_INT); /* generate high word */ @@ -6231,15 +6231,21 @@ static void gen_cast(CType *type) /* patch second register */ vtop[-1].r2 = vtop->r; vpop(); + } #else + } else if ((dbt & VT_BTYPE) == VT_LLONG || + (dbt & VT_BTYPE) == VT_PTR) { + /* XXX: not sure if this is perfect... need more tests */ + if ((sbt & VT_BTYPE) != VT_LLONG) { int r = gv(RC_INT); - if (sbt != (VT_INT | VT_UNSIGNED) && sbt != VT_PTR) { + if (sbt != (VT_INT | VT_UNSIGNED) && + sbt != VT_PTR && sbt != VT_FUNC) { /* x86_64 specific: movslq */ o(0x6348); o(0xc0 + (REG_VALUE(r) << 3) + REG_VALUE(r)); } -#endif } +#endif } else if (dbt == VT_BOOL) { /* scalar to bool */ vpushi(0); diff --git a/tcctest.c b/tcctest.c index f8b3a351..cfbfe723 100644 --- a/tcctest.c +++ b/tcctest.c @@ -1158,6 +1158,10 @@ void cast_test() (int)p, (unsigned int)p, (long)p, (unsigned long)p, (long long)p, (unsigned long long)p); + + /* from integers to pointers */ + printf("%p %p %p %p\n", + (void *)a, (void *)b, (void *)c, (void *)d); } /* initializers tests */ -- 2.11.4.GIT