aboutsummaryrefslogtreecommitdiff
path: root/libtcc1.c
diff options
context:
space:
mode:
authorShinichiro Hamaji <shinichiro.hamaji _at_ gmail.com>2008-12-02 03:19:25 +0900
committergrischka <grischka>2008-12-02 02:30:47 +0100
commit0a9873aa22731077fad295a4aad2fc1f390c8ac7 (patch)
tree95294fbf05ff654ad927276a72dd4f0779a9bba2 /libtcc1.c
parentfb0ac27691c1a027d3322c2e1d2d0876163314a1 (diff)
downloadtinycc-0a9873aa22731077fad295a4aad2fc1f390c8ac7.tar.gz
tinycc-0a9873aa22731077fad295a4aad2fc1f390c8ac7.tar.bz2
Add support of x86-64.
Most change was done in #ifdef TCC_TARGET_X86_64. So, nothing should be broken by this change. Summary of current status of x86-64 support: - produces x86-64 object files and executables. - the x86-64 code generator is based on x86's. -- for long long integers, we use 64bit registers instead of tcc's generic implementation. -- for float or double, we use SSE. SSE registers are not utilized well (we only use xmm0 and xmm1). -- for long double, we use x87 FPU. - passes make test. - passes ./libtcc_test. - can compile tcc.c. The compiled tcc can compile tcc.c, too. (there should be some bugs since the binary size of tcc2 and tcc3 is differ where tcc tcc.c -o tcc2 and tcc2 tcc.c -o tcc3) - can compile links browser. It seems working. - not tested well. I tested this work only on my linux box with few programs. - calling convention of long-double-integer or struct is not exactly the same as GCC's x86-64 ABI. - implementation of tcc -run is naive (tcc -run tcctest.c works, but tcc -run tcc.c doesn't work). Relocating 64bit addresses seems to be not as simple as 32bit environments. - shared object support isn't unimplemented - no bounds checker support - some builtin functions such as __divdi3 aren't supported
Diffstat (limited to 'libtcc1.c')
-rw-r--r--libtcc1.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/libtcc1.c b/libtcc1.c
index 96bf22c..b079477 100644
--- a/libtcc1.c
+++ b/libtcc1.c
@@ -106,6 +106,9 @@ union float_long {
long l;
};
+/* XXX: we don't support several builtin supports for now */
+#ifndef __x86_64__
+
/* XXX: use gcc/tcc intrinsic ? */
#if defined(__i386__)
#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
@@ -482,6 +485,8 @@ unsigned short __tcc_fpu_control = 0x137f;
unsigned short __tcc_int_fpu_control = 0x137f | 0x0c00;
#endif
+#endif /* !__x86_64__ */
+
/* XXX: fix tcc's code generator to do this instead */
float __floatundisf(unsigned long long a)
{