i386: use __fixdfdi instead of __tcc_cvt_ftol
Variants __fixsfdi/__fixxfdi are not needed for now because the value is converted to double always. Also: - remove __tcc_fpinit for unix as it seems redundant by the __setfpucw call in the startup code - avoid reference to s->runtime_main in cross compilers - configure: fix --with-libgcc help - tcctok.h: cleanup
This commit is contained in:
		
							parent
							
								
									8efaa71190
								
							
						
					
					
						commit
						4ad186c5ef
					
				
					 6 changed files with 98 additions and 94 deletions
				
			
		
							
								
								
									
										2
									
								
								configure
									
										
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										2
									
								
								configure
									
										
									
									
										vendored
									
									
										
										
										Executable file → Normal file
									
								
							|  | @ -273,7 +273,7 @@ Advanced options (experts only): | ||||||
|   --strip-binaries         strip symbol tables from resulting binaries |   --strip-binaries         strip symbol tables from resulting binaries | ||||||
|   --disable-static         make libtcc.so instead of libtcc.a |   --disable-static         make libtcc.so instead of libtcc.a | ||||||
|   --disable-rpath          disable use of -rpath with the above |   --disable-rpath          disable use of -rpath with the above | ||||||
|   --with-libgcc            use libgcc_s.so.1 instead of libtcc.a in dynamic link |   --with-libgcc            use libgcc_s.so.1 instead of libtcc1.a in dynamic link | ||||||
|   --enable-mingw32         build windows version on linux with mingw32 |   --enable-mingw32         build windows version on linux with mingw32 | ||||||
|   --enable-cygwin          build windows version on windows with cygwin |   --enable-cygwin          build windows version on windows with cygwin | ||||||
|   --enable-cross           build cross compilers |   --enable-cross           build cross compilers | ||||||
|  |  | ||||||
							
								
								
									
										28
									
								
								i386-gen.c
									
										
									
									
									
								
							
							
						
						
									
										28
									
								
								i386-gen.c
									
										
									
									
									
								
							|  | @ -581,14 +581,6 @@ ST_FUNC void gfunc_prolog(CType *func_type) | ||||||
|         func_bound_offset = lbounds_section->data_offset; |         func_bound_offset = lbounds_section->data_offset; | ||||||
|     } |     } | ||||||
| #endif | #endif | ||||||
| 
 |  | ||||||
| #ifndef CONFIG_USE_LIBGCC |  | ||||||
| #ifndef TCC_TARGET_PE |  | ||||||
|     if (0 == strcmp(funcname, "main")) |  | ||||||
|         gen_static_call(TOK___tcc_fpinit); |  | ||||||
| #endif |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* generate function epilog */ | /* generate function epilog */ | ||||||
|  | @ -988,16 +980,20 @@ ST_FUNC void gen_cvt_itof(int t) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* convert fp to int 't' type */ | /* convert fp to int 't' type */ | ||||||
| /* XXX: handle long long case */ |  | ||||||
| ST_FUNC void gen_cvt_ftoi(int t) | ST_FUNC void gen_cvt_ftoi(int t) | ||||||
| { | { | ||||||
|     gv(RC_FLOAT); |     int bt = vtop->type.t & VT_BTYPE; | ||||||
|     save_reg(TREG_EAX); |     if (bt == VT_FLOAT) | ||||||
|     save_reg(TREG_EDX); |         vpush_global_sym(&func_old_type, TOK___fixsfdi); | ||||||
|     gen_static_call(TOK___tcc_cvt_ftol); |     else if (bt == VT_LDOUBLE) | ||||||
|     vtop->r = TREG_EAX; /* mark reg as used */ |         vpush_global_sym(&func_old_type, TOK___fixxfdi); | ||||||
|     if (t == VT_LLONG) |     else | ||||||
|         vtop->r2 = TREG_EDX; |         vpush_global_sym(&func_old_type, TOK___fixdfdi); | ||||||
|  |     vswap(); | ||||||
|  |     gfunc_call(1); | ||||||
|  |     vpushi(0); | ||||||
|  |     vtop->r = REG_IRET; | ||||||
|  |     vtop->r2 = REG_LRET; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* convert from one floating point type to another */ | /* convert from one floating point type to another */ | ||||||
|  |  | ||||||
|  | @ -478,24 +478,6 @@ long long __ashldi3(long long a, int b) | ||||||
| #endif | #endif | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #ifndef _WIN32 |  | ||||||
| void __tcc_fpinit(void) |  | ||||||
| { |  | ||||||
|     unsigned c = 0x137F; |  | ||||||
|     __asm__ __volatile__ ("fldcw %0" : : "m" (c)); |  | ||||||
| } |  | ||||||
| #endif |  | ||||||
| long long __tcc_cvt_ftol(long double x) |  | ||||||
| { |  | ||||||
|     unsigned c0, c1; |  | ||||||
|     long long ret; |  | ||||||
|     __asm__ __volatile__ ("fnstcw %0" : "=m" (c0)); |  | ||||||
|     c1 = c0 | 0x0C00; |  | ||||||
|     __asm__ __volatile__ ("fldcw %0" : : "m" (c1)); |  | ||||||
|     __asm__ __volatile__ ("fistpll %0"  : "=m" (ret)); |  | ||||||
|     __asm__ __volatile__ ("fldcw %0" : : "m" (c0)); |  | ||||||
|     return ret; |  | ||||||
| } |  | ||||||
| #endif /* !__x86_64__ */ | #endif /* !__x86_64__ */ | ||||||
| 
 | 
 | ||||||
| /* XXX: fix tcc's code generator to do this instead */ | /* XXX: fix tcc's code generator to do this instead */ | ||||||
|  | @ -616,6 +598,27 @@ unsigned long long __fixunsxfdi (long double a1) | ||||||
|         return 0; |         return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | long long __fixsfdi (float a1) | ||||||
|  | { | ||||||
|  |     long long ret; int s; | ||||||
|  |     ret = __fixunssfdi((s = a1 >= 0) ? a1 : -a1); | ||||||
|  |     return s ? ret : -ret; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | long long __fixdfdi (double a1) | ||||||
|  | { | ||||||
|  |     long long ret; int s; | ||||||
|  |     ret = __fixunsdfdi((s = a1 >= 0) ? a1 : -a1); | ||||||
|  |     return s ? ret : -ret; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | long long __fixxfdi (long double a1) | ||||||
|  | { | ||||||
|  |     long long ret; int s; | ||||||
|  |     ret = __fixunsxfdi((s = a1 >= 0) ? a1 : -a1); | ||||||
|  |     return s ? ret : -ret; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| #if defined(__x86_64__) && !defined(_WIN64) | #if defined(__x86_64__) && !defined(_WIN64) | ||||||
| 
 | 
 | ||||||
| #ifndef __TINYC__ | #ifndef __TINYC__ | ||||||
|  |  | ||||||
							
								
								
									
										4
									
								
								tccelf.c
									
										
									
									
									
								
							
							
						
						
									
										4
									
								
								tccelf.c
									
										
									
									
									
								
							|  | @ -178,11 +178,11 @@ LIBTCCAPI void *tcc_get_symbol(TCCState *s, const char *name) | ||||||
|     return (void*)(uintptr_t)get_elf_sym_addr(s, name, 0); |     return (void*)(uintptr_t)get_elf_sym_addr(s, name, 0); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #ifdef TCC_IS_NATIVE | #if defined TCC_IS_NATIVE || defined TCC_TARGET_PE | ||||||
| /* return elf symbol value or error */ | /* return elf symbol value or error */ | ||||||
| ST_FUNC void* tcc_get_symbol_err(TCCState *s, const char *name) | ST_FUNC void* tcc_get_symbol_err(TCCState *s, const char *name) | ||||||
| { | { | ||||||
|     return (void*)get_elf_sym_addr(s, name, 1); |     return (void*)(uintptr_t)get_elf_sym_addr(s, name, 1); | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
							
								
								
									
										2
									
								
								tccpe.c
									
										
									
									
									
								
							
							
						
						
									
										2
									
								
								tccpe.c
									
										
									
									
									
								
							|  | @ -1800,7 +1800,9 @@ static void pe_add_runtime(TCCState *s1, struct pe_info *pe) | ||||||
| 
 | 
 | ||||||
|     if (TCC_OUTPUT_MEMORY == s1->output_type) { |     if (TCC_OUTPUT_MEMORY == s1->output_type) { | ||||||
|         pe_type = PE_RUN; |         pe_type = PE_RUN; | ||||||
|  | #ifdef TCC_IS_NATIVE | ||||||
|         s1->runtime_main = start_symbol; |         s1->runtime_main = start_symbol; | ||||||
|  | #endif | ||||||
|     } else { |     } else { | ||||||
|         pe->start_addr = (DWORD)tcc_get_symbol_err(s1, start_symbol); |         pe->start_addr = (DWORD)tcc_get_symbol_err(s1, start_symbol); | ||||||
|     } |     } | ||||||
|  |  | ||||||
							
								
								
									
										117
									
								
								tcctok.h
									
										
									
									
									
								
							
							
						
						
									
										117
									
								
								tcctok.h
									
										
									
									
									
								
							|  | @ -143,23 +143,34 @@ | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| /* builtin functions or variables */ | /* builtin functions or variables */ | ||||||
| #ifdef TCC_ARM_EABI | #ifndef TCC_ARM_EABI | ||||||
|      DEF(TOK_memcpy, "__aeabi_memcpy") |  | ||||||
|      DEF(TOK_memcpy4, "__aeabi_memcpy4") |  | ||||||
|      DEF(TOK_memcpy8, "__aeabi_memcpy8") |  | ||||||
|      DEF(TOK_memset, "__aeabi_memset") |  | ||||||
|      DEF(TOK___aeabi_ldivmod, "__aeabi_ldivmod") |  | ||||||
|      DEF(TOK___aeabi_uldivmod, "__aeabi_uldivmod") |  | ||||||
| #else |  | ||||||
|      DEF(TOK_memcpy, "memcpy") |      DEF(TOK_memcpy, "memcpy") | ||||||
|      DEF(TOK_memset, "memset") |      DEF(TOK_memset, "memset") | ||||||
|      DEF(TOK___divdi3, "__divdi3") |      DEF(TOK___divdi3, "__divdi3") | ||||||
|      DEF(TOK___moddi3, "__moddi3") |      DEF(TOK___moddi3, "__moddi3") | ||||||
|      DEF(TOK___udivdi3, "__udivdi3") |      DEF(TOK___udivdi3, "__udivdi3") | ||||||
|      DEF(TOK___umoddi3, "__umoddi3") |      DEF(TOK___umoddi3, "__umoddi3") | ||||||
|  |      DEF(TOK___ashrdi3, "__ashrdi3") | ||||||
|  |      DEF(TOK___lshrdi3, "__lshrdi3") | ||||||
|  |      DEF(TOK___ashldi3, "__ashldi3") | ||||||
|  |      DEF(TOK___floatundisf, "__floatundisf") | ||||||
|  |      DEF(TOK___floatundidf, "__floatundidf") | ||||||
|  | # ifndef TCC_ARM_VFP | ||||||
|  |      DEF(TOK___floatundixf, "__floatundixf") | ||||||
|  |      DEF(TOK___fixunsxfdi, "__fixunsxfdi") | ||||||
|  | # endif | ||||||
|  |      DEF(TOK___fixunssfdi, "__fixunssfdi") | ||||||
|  |      DEF(TOK___fixunsdfdi, "__fixunsdfdi") | ||||||
| #endif | #endif | ||||||
| #if defined(TCC_TARGET_ARM) | 
 | ||||||
| #ifdef TCC_ARM_EABI | #if defined TCC_TARGET_ARM | ||||||
|  | # ifdef TCC_ARM_EABI | ||||||
|  |      DEF(TOK_memcpy, "__aeabi_memcpy") | ||||||
|  |      DEF(TOK_memcpy4, "__aeabi_memcpy4") | ||||||
|  |      DEF(TOK_memcpy8, "__aeabi_memcpy8") | ||||||
|  |      DEF(TOK_memset, "__aeabi_memset") | ||||||
|  |      DEF(TOK___aeabi_ldivmod, "__aeabi_ldivmod") | ||||||
|  |      DEF(TOK___aeabi_uldivmod, "__aeabi_uldivmod") | ||||||
|      DEF(TOK___aeabi_idivmod, "__aeabi_idivmod") |      DEF(TOK___aeabi_idivmod, "__aeabi_idivmod") | ||||||
|      DEF(TOK___aeabi_uidivmod, "__aeabi_uidivmod") |      DEF(TOK___aeabi_uidivmod, "__aeabi_uidivmod") | ||||||
|      DEF(TOK___divsi3, "__aeabi_idiv") |      DEF(TOK___divsi3, "__aeabi_idiv") | ||||||
|  | @ -168,36 +179,6 @@ | ||||||
|      DEF(TOK___floatdidf, "__aeabi_l2d") |      DEF(TOK___floatdidf, "__aeabi_l2d") | ||||||
|      DEF(TOK___fixsfdi, "__aeabi_f2lz") |      DEF(TOK___fixsfdi, "__aeabi_f2lz") | ||||||
|      DEF(TOK___fixdfdi, "__aeabi_d2lz") |      DEF(TOK___fixdfdi, "__aeabi_d2lz") | ||||||
| #else |  | ||||||
|      DEF(TOK___modsi3, "__modsi3") |  | ||||||
|      DEF(TOK___umodsi3, "__umodsi3") |  | ||||||
|      DEF(TOK___divsi3, "__divsi3") |  | ||||||
|      DEF(TOK___udivsi3, "__udivsi3") |  | ||||||
|      DEF(TOK___floatdisf, "__floatdisf") |  | ||||||
|      DEF(TOK___floatdidf, "__floatdidf") |  | ||||||
| #ifndef TCC_ARM_VFP |  | ||||||
|      DEF(TOK___floatdixf, "__floatdixf") |  | ||||||
|      DEF(TOK___fixunssfsi, "__fixunssfsi") |  | ||||||
|      DEF(TOK___fixunsdfsi, "__fixunsdfsi") |  | ||||||
|      DEF(TOK___fixunsxfsi, "__fixunsxfsi") |  | ||||||
|      DEF(TOK___fixxfdi, "__fixxfdi") |  | ||||||
| #endif |  | ||||||
|      DEF(TOK___fixsfdi, "__fixsfdi") |  | ||||||
|      DEF(TOK___fixdfdi, "__fixdfdi") |  | ||||||
| #endif |  | ||||||
| #elif defined(TCC_TARGET_C67) |  | ||||||
|      DEF(TOK__divi, "_divi") |  | ||||||
|      DEF(TOK__divu, "_divu") |  | ||||||
|      DEF(TOK__divf, "_divf") |  | ||||||
|      DEF(TOK__divd, "_divd") |  | ||||||
|      DEF(TOK__remi, "_remi") |  | ||||||
|      DEF(TOK__remu, "_remu") |  | ||||||
| #endif |  | ||||||
| #ifdef TCC_TARGET_I386 |  | ||||||
|      DEF(TOK___tcc_fpinit, "__tcc_fpinit") |  | ||||||
|      DEF(TOK___tcc_cvt_ftol, "__tcc_cvt_ftol") |  | ||||||
| #endif |  | ||||||
| #ifdef TCC_ARM_EABI |  | ||||||
|      DEF(TOK___ashrdi3, "__aeabi_lasr") |      DEF(TOK___ashrdi3, "__aeabi_lasr") | ||||||
|      DEF(TOK___lshrdi3, "__aeabi_llsr") |      DEF(TOK___lshrdi3, "__aeabi_llsr") | ||||||
|      DEF(TOK___ashldi3, "__aeabi_llsl") |      DEF(TOK___ashldi3, "__aeabi_llsl") | ||||||
|  | @ -205,20 +186,45 @@ | ||||||
|      DEF(TOK___floatundidf, "__aeabi_ul2d") |      DEF(TOK___floatundidf, "__aeabi_ul2d") | ||||||
|      DEF(TOK___fixunssfdi, "__aeabi_f2ulz") |      DEF(TOK___fixunssfdi, "__aeabi_f2ulz") | ||||||
|      DEF(TOK___fixunsdfdi, "__aeabi_d2ulz") |      DEF(TOK___fixunsdfdi, "__aeabi_d2ulz") | ||||||
| #else | # else | ||||||
|      DEF(TOK___ashrdi3, "__ashrdi3") |      DEF(TOK___modsi3, "__modsi3") | ||||||
|      DEF(TOK___lshrdi3, "__lshrdi3") |      DEF(TOK___umodsi3, "__umodsi3") | ||||||
|      DEF(TOK___ashldi3, "__ashldi3") |      DEF(TOK___divsi3, "__divsi3") | ||||||
|      DEF(TOK___floatundisf, "__floatundisf") |      DEF(TOK___udivsi3, "__udivsi3") | ||||||
|      DEF(TOK___floatundidf, "__floatundidf") |      DEF(TOK___floatdisf, "__floatdisf") | ||||||
| #ifndef TCC_ARM_VFP |      DEF(TOK___floatdidf, "__floatdidf") | ||||||
|      DEF(TOK___floatundixf, "__floatundixf") | #  ifndef TCC_ARM_VFP | ||||||
|      DEF(TOK___fixunsxfdi, "__fixunsxfdi") |      DEF(TOK___floatdixf, "__floatdixf") | ||||||
|  |      DEF(TOK___fixunssfsi, "__fixunssfsi") | ||||||
|  |      DEF(TOK___fixunsdfsi, "__fixunsdfsi") | ||||||
|  |      DEF(TOK___fixunsxfsi, "__fixunsxfsi") | ||||||
|  |      DEF(TOK___fixxfdi, "__fixxfdi") | ||||||
|  | #  endif | ||||||
|  |      DEF(TOK___fixsfdi, "__fixsfdi") | ||||||
|  |      DEF(TOK___fixdfdi, "__fixdfdi") | ||||||
|  | # endif | ||||||
| #endif | #endif | ||||||
|      DEF(TOK___fixunssfdi, "__fixunssfdi") | 
 | ||||||
|      DEF(TOK___fixunsdfdi, "__fixunsdfdi") | #if defined TCC_TARGET_C67 | ||||||
|  |      DEF(TOK__divi, "_divi") | ||||||
|  |      DEF(TOK__divu, "_divu") | ||||||
|  |      DEF(TOK__divf, "_divf") | ||||||
|  |      DEF(TOK__divd, "_divd") | ||||||
|  |      DEF(TOK__remi, "_remi") | ||||||
|  |      DEF(TOK__remu, "_remu") | ||||||
| #endif | #endif | ||||||
| #ifdef TCC_TARGET_PE | 
 | ||||||
|  | #if defined TCC_TARGET_I386 | ||||||
|  |      DEF(TOK___fixsfdi, "__fixsfdi") | ||||||
|  |      DEF(TOK___fixdfdi, "__fixdfdi") | ||||||
|  |      DEF(TOK___fixxfdi, "__fixxfdi") | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #if defined TCC_TARGET_I386 || defined TCC_TARGET_X86_64 | ||||||
|  |      DEF(TOK_alloca, "alloca") | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #if defined TCC_TARGET_PE | ||||||
|      DEF(TOK___chkstk, "__chkstk") |      DEF(TOK___chkstk, "__chkstk") | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | @ -233,20 +239,17 @@ | ||||||
|      DEF(TOK___bound_ptr_indir16, "__bound_ptr_indir16") |      DEF(TOK___bound_ptr_indir16, "__bound_ptr_indir16") | ||||||
|      DEF(TOK___bound_local_new, "__bound_local_new") |      DEF(TOK___bound_local_new, "__bound_local_new") | ||||||
|      DEF(TOK___bound_local_delete, "__bound_local_delete") |      DEF(TOK___bound_local_delete, "__bound_local_delete") | ||||||
| #ifdef TCC_TARGET_PE | # ifdef TCC_TARGET_PE | ||||||
|      DEF(TOK_malloc, "malloc") |      DEF(TOK_malloc, "malloc") | ||||||
|      DEF(TOK_free, "free") |      DEF(TOK_free, "free") | ||||||
|      DEF(TOK_realloc, "realloc") |      DEF(TOK_realloc, "realloc") | ||||||
|      DEF(TOK_memalign, "memalign") |      DEF(TOK_memalign, "memalign") | ||||||
|      DEF(TOK_calloc, "calloc") |      DEF(TOK_calloc, "calloc") | ||||||
| #endif | # endif | ||||||
|      DEF(TOK_memmove, "memmove") |      DEF(TOK_memmove, "memmove") | ||||||
|      DEF(TOK_strlen, "strlen") |      DEF(TOK_strlen, "strlen") | ||||||
|      DEF(TOK_strcpy, "strcpy") |      DEF(TOK_strcpy, "strcpy") | ||||||
| #endif | #endif | ||||||
| #if defined TCC_TARGET_I386 || defined TCC_TARGET_X86_64 |  | ||||||
|      DEF(TOK_alloca, "alloca") |  | ||||||
| #endif |  | ||||||
| 
 | 
 | ||||||
| /* Tiny Assembler */ | /* Tiny Assembler */ | ||||||
|  DEF_ASM(byte) |  DEF_ASM(byte) | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue