aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShinichiro Hamaji <shinichiro.hamaji _at_ gmail.com>2009-04-17 01:01:23 +0900
committergrischka <grischka>2009-04-18 15:08:02 +0200
commit39a4b859d4d4f76d2616b2c6e6a697dc261daa1a (patch)
treee6bd21487847c461111fc2c1ee8133b9765dc7a6
parent51a7f163ad4a363953ae744afbc12cd7bd381097 (diff)
downloadtinycc-39a4b859d4d4f76d2616b2c6e6a697dc261daa1a.tar.gz
tinycc-39a4b859d4d4f76d2616b2c6e6a697dc261daa1a.tar.bz2
x86-64: Fix cast from integers to pointers.
Now, ./tcc -run -DTCC_TARGET_X86_64 tcc.c -run tcctest.c works!
-rw-r--r--tcc.c12
-rw-r--r--tcctest.c4
2 files changed, 13 insertions, 3 deletions
diff --git a/tcc.c b/tcc.c
index 00fd3a0..3901b81 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 f8b3a35..cfbfe72 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 */