Index: gcc/gcc/testsuite/lib/target-supports.exp |
diff --git a/gcc/gcc/testsuite/lib/target-supports.exp b/gcc/gcc/testsuite/lib/target-supports.exp |
index fdef5af2ade6c37daf244d653198f9c9df2a676d..5fbad4df1e42ebdcd045b53e2d76a6bc7288d2ff 100644 |
--- a/gcc/gcc/testsuite/lib/target-supports.exp |
+++ b/gcc/gcc/testsuite/lib/target-supports.exp |
@@ -1,4 +1,4 @@ |
-# Copyright (C) 1999, 2001, 2003, 2004, 2005, 2006, 2007, 2008, 2009 |
+# Copyright (C) 1999, 2001, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 |
# Free Software Foundation, Inc. |
# This program is free software; you can redistribute it and/or modify |
@@ -29,10 +29,17 @@ |
# If ARGS is not empty, its first element is a string that |
# should be added to the command line. |
# |
-# Assume by default that CONTENTS is C code. C++ code should contain |
-# "// C++" and Fortran code should contain "! Fortran". |
+# Assume by default that CONTENTS is C code. |
+# Otherwise, code should contain: |
+# "// C++" for c++, |
+# "! Fortran" for Fortran code, |
+# "/* ObjC", for ObjC |
+# and "// ObjC++" for ObjC++ |
+# If the tool is ObjC/ObjC++ then we overide the extension to .m/.mm to |
+# allow for ObjC/ObjC++ specific flags. |
proc check_compile {basename type contents args} { |
global tool |
+ verbose "check_compile tool: $tool for $basename" |
if { [llength $args] > 0 } { |
set options [list "additional_flags=[lindex $args 0]"] |
@@ -42,8 +49,17 @@ proc check_compile {basename type contents args} { |
switch -glob -- $contents { |
"*! Fortran*" { set src ${basename}[pid].f90 } |
"*// C++*" { set src ${basename}[pid].cc } |
- default { set src ${basename}[pid].c } |
+ "*// ObjC++*" { set src ${basename}[pid].mm } |
+ "*/* ObjC*" { set src ${basename}[pid].m } |
+ default { |
+ switch -- $tool { |
+ "objc" { set src ${basename}[pid].m } |
+ "obj-c++" { set src ${basename}[pid].mm } |
+ default { set src ${basename}[pid].c } |
+ } |
+ } |
} |
+ |
set compile_type $type |
switch -glob $type { |
assembly { set output ${basename}[pid].s } |
@@ -385,7 +401,7 @@ proc check_gc_sections_available { } { |
# Check if the ld used by gcc supports --gc-sections. |
set gcc_spec [${tool}_target_compile "-dumpspecs" "" "none" ""] |
- regsub ".*\n\*linker:\[ \t\]*\n(\[^ \t\n\]*).*" "$gcc_spec" {\1} linker |
+ regsub ".*\n\\*linker:\[ \t\]*\n(\[^ \t\n\]*).*" "$gcc_spec" {\1} linker |
set gcc_ld [lindex [${tool}_target_compile "-print-prog-name=$linker" "" "none" ""] 0] |
set ld_output [remote_exec host "$gcc_ld" "--help"] |
if { [ string first "--gc-sections" $ld_output ] >= 0 } { |
@@ -491,14 +507,19 @@ proc check_profiling_available { test_what } { |
|| [istarget avr-*-*] |
|| [istarget bfin-*-*] |
|| [istarget powerpc-*-eabi*] |
+ || [istarget powerpc-*-elf] |
|| [istarget cris-*-*] |
|| [istarget crisv32-*-*] |
|| [istarget fido-*-elf] |
|| [istarget h8300-*-*] |
- || [istarget m32c-*-elf] |
+ || [istarget lm32-*-*] |
+ || [istarget m32c-*-elf] |
|| [istarget m68k-*-elf] |
|| [istarget m68k-*-uclinux*] |
+ || [istarget mep-*-elf] |
|| [istarget mips*-*-elf*] |
+ || [istarget moxie-*-elf*] |
+ || [istarget rx-*-*] |
|| [istarget xstormy16-*] |
|| [istarget xtensa*-*-elf] |
|| [istarget *-*-rtems*] |
@@ -611,6 +632,18 @@ proc check_effective_target_pthread {} { |
} "-pthread"] |
} |
+# Return 1 if compilation with -mpe-aligned-commons is error-free |
+# for trivial code, 0 otherwise. |
+ |
+proc check_effective_target_pe_aligned_commons {} { |
+ if { [istarget *-*-cygwin*] || [istarget *-*-mingw*] } { |
+ return [check_no_compiler_messages pe_aligned_commons object { |
+ int foo; |
+ } "-mpe-aligned-commons"] |
+ } |
+ return 0 |
+} |
+ |
# Return 1 if the target supports -static |
proc check_effective_target_static {} { |
return [check_no_compiler_messages static executable { |
@@ -672,6 +705,18 @@ proc check_effective_target_hard_float { } { |
}] |
} |
+ # This proc is actually checking the availabilty of FPU |
+ # support for doubles, so on the RX we must fail if the |
+ # 64-bit double multilib has been selected. |
+ if { [istarget rx-*-*] } { |
+ return 0 |
+ # return [check_no_compiler_messages hard_float assembly { |
+ #if defined __RX_64_BIT_DOUBLES__ |
+ #error FOO |
+ #endif |
+ # }] |
+ } |
+ |
# The generic test equates hard_float with "no call for adding doubles". |
return [check_no_messages_and_pattern hard_float "!\\(call" rtl-expand { |
double a (double b, double c) { return b + c; } |
@@ -727,6 +772,15 @@ proc check_effective_target_mips16_attribute { } { |
} [add_options_for_mips16_attribute ""]] |
} |
+# Return 1 if the target supports long double larger than double when |
+# using the new ABI, 0 otherwise. |
+ |
+proc check_effective_target_mips_newabi_large_long_double { } { |
+ return [check_no_compiler_messages mips_newabi_large_long_double object { |
+ int dummy[sizeof(long double) > sizeof(double) ? 1 : -1]; |
+ } "-mabi=64"] |
+} |
+ |
# Return 1 if the current multilib does not generate PIC by default. |
proc check_effective_target_nonpic { } { |
@@ -856,6 +910,53 @@ proc check_750cl_hw_available { } { |
}] |
} |
+# Return 1 if the target OS supports running SSE executables, 0 |
+# otherwise. Cache the result. |
+ |
+proc check_sse_os_support_available { } { |
+ return [check_cached_effective_target sse_os_support_available { |
+ # If this is not the right target then we can skip the test. |
+ if { !([istarget x86_64-*-*] || [istarget i?86-*-*]) } { |
+ expr 0 |
+ } elseif { [istarget i?86-*-solaris2*] } { |
+ # The Solaris 2 kernel doesn't save and restore SSE registers |
+ # before Solaris 9 4/04. Before that, executables die with SIGILL. |
+ check_runtime_nocache sse_os_support_available { |
+ int main () |
+ { |
+ __asm__ volatile ("movss %xmm2,%xmm1"); |
+ return 0; |
+ } |
+ } "-msse" |
+ } else { |
+ expr 1 |
+ } |
+ }] |
+} |
+ |
+# Return 1 if the target supports executing SSE instructions, 0 |
+# otherwise. Cache the result. |
+ |
+proc check_sse_hw_available { } { |
+ return [check_cached_effective_target sse_hw_available { |
+ # If this is not the right target then we can skip the test. |
+ if { !([istarget x86_64-*-*] || [istarget i?86-*-*]) } { |
+ expr 0 |
+ } else { |
+ check_runtime_nocache sse_hw_available { |
+ #include "cpuid.h" |
+ int main () |
+ { |
+ unsigned int eax, ebx, ecx, edx = 0; |
+ if (__get_cpuid (1, &eax, &ebx, &ecx, &edx)) |
+ return !(edx & bit_SSE); |
+ return 1; |
+ } |
+ } "" |
+ } |
+ }] |
+} |
+ |
# Return 1 if the target supports executing SSE2 instructions, 0 |
# otherwise. Cache the result. |
@@ -879,6 +980,52 @@ proc check_sse2_hw_available { } { |
}] |
} |
+# Return 1 if the target supports running SSE executables, 0 otherwise. |
+ |
+proc check_effective_target_sse_runtime { } { |
+ if { [check_sse_hw_available] && [check_sse_os_support_available] } { |
+ return 1 |
+ } else { |
+ return 0 |
+ } |
+} |
+ |
+# Return 1 if the target supports running SSE2 executables, 0 otherwise. |
+ |
+proc check_effective_target_sse2_runtime { } { |
+ if { [check_sse2_hw_available] && [check_sse_os_support_available] } { |
+ return 1 |
+ } else { |
+ return 0 |
+ } |
+} |
+ |
+# Return 1 if the target supports executing VSX instructions, 0 |
+# otherwise. Cache the result. |
+ |
+proc check_vsx_hw_available { } { |
+ return [check_cached_effective_target vsx_hw_available { |
+ # Some simulators are known to not support VSX instructions. |
+ # For now, disable on Darwin |
+ if { [istarget powerpc-*-eabi] || [istarget powerpc*-*-eabispe] || [istarget *-*-darwin*]} { |
+ expr 0 |
+ } else { |
+ set options "-mvsx" |
+ check_runtime_nocache vsx_hw_available { |
+ int main() |
+ { |
+ #ifdef __MACH__ |
+ asm volatile ("xxlor vs0,vs0,vs0"); |
+ #else |
+ asm volatile ("xxlor 0,0,0"); |
+ #endif |
+ return 0; |
+ } |
+ } $options |
+ } |
+ }] |
+} |
+ |
# Return 1 if the target supports executing AltiVec instructions, 0 |
# otherwise. Cache the result. |
@@ -889,12 +1036,13 @@ proc check_vmx_hw_available { } { |
expr 0 |
} else { |
# Most targets don't require special flags for this test case, but |
- # Darwin does. |
+ # Darwin does. Just to be sure, make sure VSX is not enabled for |
+ # the altivec tests. |
if { [istarget *-*-darwin*] |
|| [istarget *-*-aix*] } { |
- set options "-maltivec" |
+ set options "-maltivec -mno-vsx" |
} else { |
- set options "" |
+ set options "-mno-vsx" |
} |
check_runtime_nocache vmx_hw_available { |
int main() |
@@ -1084,6 +1232,9 @@ proc check_cxa_atexit_available { } { |
if { [istarget "hppa*-*-hpux10*"] } { |
# HP-UX 10 doesn't have __cxa_atexit but subsequent test passes. |
expr 0 |
+ } elseif { [istarget "*-*-vxworks"] } { |
+ # vxworks doesn't have __cxa_atexit but subsequent test passes. |
+ expr 0 |
} else { |
check_runtime_nocache cxa_atexit_available { |
// C++ |
@@ -1120,6 +1271,25 @@ proc check_cxa_atexit_available { } { |
}] |
} |
+proc check_effective_target_objc2 { } { |
+ return [check_no_compiler_messages objc2 object { |
+ #ifdef __OBJC2__ |
+ int dummy[1]; |
+ #else |
+ #error |
+ #endif |
+ }] |
+} |
+ |
+proc check_effective_target_next_runtime { } { |
+ return [check_no_compiler_messages objc2 object { |
+ #ifdef __NEXT_RUNTIME__ |
+ int dummy[1]; |
+ #else |
+ #error |
+ #endif |
+ }] |
+} |
# Return 1 if we're generating 32-bit code using default options, 0 |
# otherwise. |
@@ -1200,6 +1370,33 @@ proc check_effective_target_large_long_double { } { |
}] |
} |
+# Return 1 if the target supports double larger than float, |
+# 0 otherwise. |
+ |
+proc check_effective_target_large_double { } { |
+ return [check_no_compiler_messages large_double object { |
+ int dummy[sizeof(double) > sizeof(float) ? 1 : -1]; |
+ }] |
+} |
+ |
+# Return 1 if the target supports double of 64 bits, |
+# 0 otherwise. |
+ |
+proc check_effective_target_double64 { } { |
+ return [check_no_compiler_messages double64 object { |
+ int dummy[sizeof(double) == 8 ? 1 : -1]; |
+ }] |
+} |
+ |
+# Return 1 if the target supports double of at least 64 bits, |
+# 0 otherwise. |
+ |
+proc check_effective_target_double64plus { } { |
+ return [check_no_compiler_messages double64plus object { |
+ int dummy[sizeof(double) >= 8 ? 1 : -1]; |
+ }] |
+} |
+ |
# Return 1 if the target supports compiling fixed-point, |
# 0 otherwise. |
@@ -1215,7 +1412,7 @@ proc check_effective_target_fixed_point { } { |
proc check_effective_target_dfp_nocache { } { |
verbose "check_effective_target_dfp_nocache: compiling source" 2 |
set ret [check_no_compiler_messages_nocache dfp object { |
- _Decimal32 x; _Decimal64 y; _Decimal128 z; |
+ float x __attribute__((mode(DD))); |
}] |
verbose "check_effective_target_dfp_nocache: returning $ret" 2 |
return $ret |
@@ -1223,7 +1420,8 @@ proc check_effective_target_dfp_nocache { } { |
proc check_effective_target_dfprt_nocache { } { |
return [check_runtime_nocache dfprt { |
- _Decimal32 x = 1.2df; _Decimal64 y = 2.3dd; _Decimal128 z; |
+ typedef float d64 __attribute__((mode(DD))); |
+ d64 x = 1.2df, y = 2.3dd, z; |
int main () { z = x + y; return 0; } |
}] |
} |
@@ -1240,7 +1438,7 @@ proc check_effective_target_dfp { } { |
} |
# Return 1 if the target supports linking and executing Decimal Floating |
-# Point, # 0 otherwise. |
+# Point, 0 otherwise. |
# |
# This won't change for different subtargets so cache the result. |
@@ -1250,6 +1448,32 @@ proc check_effective_target_dfprt { } { |
}] |
} |
+# Return 1 if the target supports compiling and assembling UCN, 0 otherwise. |
+ |
+proc check_effective_target_ucn_nocache { } { |
+ # -std=c99 is only valid for C |
+ if [check_effective_target_c] { |
+ set ucnopts "-std=c99" |
+ } |
+ append ucnopts " -fextended-identifiers" |
+ verbose "check_effective_target_ucn_nocache: compiling source" 2 |
+ set ret [check_no_compiler_messages_nocache ucn object { |
+ int \u00C0; |
+ } $ucnopts] |
+ verbose "check_effective_target_ucn_nocache: returning $ret" 2 |
+ return $ret |
+} |
+ |
+# Return 1 if the target supports compiling and assembling UCN, 0 otherwise. |
+# |
+# This won't change for different subtargets, so cache the result. |
+ |
+proc check_effective_target_ucn { } { |
+ return [check_cached_effective_target ucn { |
+ check_effective_target_ucn_nocache |
+ }] |
+} |
+ |
# Return 1 if the target needs a command line argument to enable a SIMD |
# instruction set. |
@@ -1354,8 +1578,10 @@ proc check_effective_target_vect_uintfloat_cvt { } { |
verbose "check_effective_target_vect_uintfloat_cvt: using cached result" 2 |
} else { |
set et_vect_uintfloat_cvt_saved 0 |
- if { ([istarget powerpc*-*-*] |
- && ![istarget powerpc-*-linux*paired*]) } { |
+ if { [istarget i?86-*-*] |
+ || ([istarget powerpc*-*-*] |
+ && ![istarget powerpc-*-linux*paired*]) |
+ || [istarget x86_64-*-*] } { |
set et_vect_uintfloat_cvt_saved 1 |
} |
} |
@@ -1430,6 +1656,20 @@ proc check_effective_target_arm_vfp_ok { } { |
} |
} |
+# Return 1 if this is an ARM target supporting -mfpu=vfp |
+# -mfloat-abi=hard. Some multilibs may be incompatible with these |
+# options. |
+ |
+proc check_effective_target_arm_hard_vfp_ok { } { |
+ if { [check_effective_target_arm32] } { |
+ return [check_no_compiler_messages arm_hard_vfp_ok executable { |
+ int main() { return 0;} |
+ } "-mfpu=vfp -mfloat-abi=hard"] |
+ } else { |
+ return 0 |
+ } |
+} |
+ |
# Return 1 if this is an ARM target supporting -mfpu=neon |
# -mfloat-abi=softfp. Some multilibs may be incompatible with these |
# options. |
@@ -1437,6 +1677,7 @@ proc check_effective_target_arm_vfp_ok { } { |
proc check_effective_target_arm_neon_ok { } { |
if { [check_effective_target_arm32] } { |
return [check_no_compiler_messages arm_neon_ok object { |
+ #include "arm_neon.h" |
int dummy; |
} "-mfpu=neon -mfloat-abi=softfp"] |
} else { |
@@ -1455,6 +1696,17 @@ proc check_effective_target_arm_thumb1_ok { } { |
} "-mthumb"] |
} |
+# Return 1 is this is an ARM target where -mthumb causes Thumb-2 to be |
+# used. |
+ |
+proc check_effective_target_arm_thumb2_ok { } { |
+ return [check_no_compiler_messages arm_thumb2_ok assembly { |
+ #if !defined(__thumb2__) |
+ #error FOO |
+ #endif |
+ } "-mthumb"] |
+} |
+ |
# Return 1 if the target supports executing NEON instructions, 0 |
# otherwise. Cache the result. |
@@ -1512,6 +1764,19 @@ proc check_effective_target_arm_eabi { } { |
}] |
} |
+# Return 1 if this is an ARM target supporting -mcpu=iwmmxt. |
+# Some multilibs may be incompatible with this option. |
+ |
+proc check_effective_target_arm_iwmmxt_ok { } { |
+ if { [check_effective_target_arm32] } { |
+ return [check_no_compiler_messages arm_iwmmxt_ok object { |
+ int dummy; |
+ } "-mcpu=iwmmxt"] |
+ } else { |
+ return 0 |
+ } |
+} |
+ |
# Return 1 if this is a PowerPC target with floating-point registers. |
proc check_effective_target_powerpc_fprs { } { |
@@ -1567,6 +1832,33 @@ proc check_effective_target_powerpc_altivec_ok { } { |
} |
} |
+# Return 1 if this is a PowerPC target supporting -mvsx |
+ |
+proc check_effective_target_powerpc_vsx_ok { } { |
+ if { ([istarget powerpc*-*-*] |
+ && ![istarget powerpc-*-linux*paired*]) |
+ || [istarget rs6000-*-*] } { |
+ # AltiVec is not supported on AIX before 5.3. |
+ if { [istarget powerpc*-*-aix4*] |
+ || [istarget powerpc*-*-aix5.1*] |
+ || [istarget powerpc*-*-aix5.2*] } { |
+ return 0 |
+ } |
+ return [check_no_compiler_messages powerpc_vsx_ok object { |
+ int main (void) { |
+#ifdef __MACH__ |
+ asm volatile ("xxlor vs0,vs0,vs0"); |
+#else |
+ asm volatile ("xxlor 0,0,0"); |
+#endif |
+ return 0; |
+ } |
+ } "-mvsx"] |
+ } else { |
+ return 0 |
+ } |
+} |
+ |
# Return 1 if this is a PowerPC target supporting -mcpu=cell. |
proc check_effective_target_powerpc_ppu_ok { } { |
@@ -2175,6 +2467,27 @@ proc check_effective_target_vect_no_align { } { |
return $et_vect_no_align_saved |
} |
+# Return 1 if the target supports a vector misalign access, 0 otherwise. |
+# |
+# This won't change for different subtargets so cache the result. |
+ |
+proc check_effective_target_vect_hw_misalign { } { |
+ global et_vect_hw_misalign_saved |
+ |
+ if [info exists et_vect_hw_misalign_saved] { |
+ verbose "check_effective_target_vect_hw_misalign: using cached result" 2 |
+ } else { |
+ set et_vect_hw_misalign_saved 0 |
+ if { ([istarget x86_64-*-*] |
+ || [istarget i?86-*-*]) } { |
+ set et_vect_hw_misalign_saved 1 |
+ } |
+ } |
+ verbose "check_effective_target_vect_hw_misalign: returning $et_vect_hw_misalign_saved" 2 |
+ return $et_vect_hw_misalign_saved |
+} |
+ |
+ |
# Return 1 if arrays are aligned to the vector alignment |
# boundary, 0 otherwise. |
# |
@@ -2335,8 +2648,8 @@ proc check_effective_target_vect_short_mult { } { |
if { [istarget ia64-*-*] |
|| [istarget spu-*-*] |
|| [istarget i?86-*-*] |
- || [istarget x86_64-*-*] |
- || [istarget powerpc*-*-*] |
+ || [istarget x86_64-*-*] |
+ || [istarget powerpc*-*-*] |
|| [check_effective_target_arm32] } { |
set et_vect_short_mult_saved 1 |
} |
@@ -2377,7 +2690,9 @@ proc check_effective_target_vect_extract_even_odd { } { |
verbose "check_effective_target_vect_extract_even_odd: using cached result" 2 |
} else { |
set et_vect_extract_even_odd_saved 0 |
- if { [istarget powerpc*-*-*] |
+ if { [istarget powerpc*-*-*] |
+ || [istarget i?86-*-*] |
+ || [istarget x86_64-*-*] |
|| [istarget spu-*-*] } { |
set et_vect_extract_even_odd_saved 1 |
} |
@@ -2476,7 +2791,8 @@ proc check_effective_target_section_anchors { } { |
verbose "check_effective_target_section_anchors: using cached result" 2 |
} else { |
set et_section_anchors_saved 0 |
- if { [istarget powerpc*-*-*] } { |
+ if { [istarget powerpc*-*-*] |
+ || [istarget arm*-*-*] } { |
set et_section_anchors_saved 1 |
} |
} |
@@ -2500,6 +2816,7 @@ proc check_effective_target_sync_int_long { } { |
|| [istarget i?86-*-*] |
|| [istarget x86_64-*-*] |
|| [istarget alpha*-*-*] |
+ || [istarget bfin*-*linux*] |
|| [istarget s390*-*-*] |
|| [istarget powerpc*-*-*] |
|| [istarget sparc64-*-*] |
@@ -2668,7 +2985,8 @@ proc check_effective_target_string_merging { } { |
} |
# Return 1 if target has the basic signed and unsigned types in |
-# <stdint.h>, 0 otherwise. |
+# <stdint.h>, 0 otherwise. This will be obsolete when GCC ensures a |
+# working <stdint.h> for all targets. |
proc check_effective_target_stdint_types { } { |
return [check_no_compiler_messages stdint_types assembly { |
@@ -2678,6 +2996,19 @@ proc check_effective_target_stdint_types { } { |
}] |
} |
+# Return 1 if target has the basic signed and unsigned types in |
+# <inttypes.h>, 0 otherwise. This is for tests that GCC's notions of |
+# these types agree with those in the header, as some systems have |
+# only <inttypes.h>. |
+ |
+proc check_effective_target_inttypes_types { } { |
+ return [check_no_compiler_messages inttypes_types assembly { |
+ #include <inttypes.h> |
+ int8_t a; int16_t b; int32_t c; int64_t d; |
+ uint8_t e; uint16_t f; uint32_t g; uint64_t h; |
+ }] |
+} |
+ |
# Return 1 if programs are intended to be run on a simulator |
# (i.e. slowly) rather than hardware (i.e. fast). |
@@ -2787,6 +3118,39 @@ proc add_options_for_c99_runtime { flags } { |
return $flags |
} |
+# Add to FLAGS all the target-specific flags needed to enable |
+# full IEEE compliance mode. |
+ |
+proc add_options_for_ieee { flags } { |
+ if { [istarget "alpha*-*-*"] |
+ || [istarget "sh*-*-*"] } { |
+ return "$flags -mieee" |
+ } |
+ return $flags |
+} |
+ |
+# Add to FLAGS the flags needed to enable functions to bind locally |
+# when using pic/PIC passes in the testsuite. |
+ |
+proc add_options_for_bind_pic_locally { flags } { |
+ if {[check_no_compiler_messages using_pic2 assembly { |
+ #if __PIC__ != 2 |
+ #error FOO |
+ #endif |
+ }]} { |
+ return "$flags -fPIE" |
+ } |
+ if {[check_no_compiler_messages using_pic1 assembly { |
+ #if __PIC__ != 1 |
+ #error FOO |
+ #endif |
+ }]} { |
+ return "$flags -fpie" |
+ } |
+ |
+ return $flags |
+} |
+ |
# Return 1 if the target provides a full C99 runtime. |
proc check_effective_target_c99_runtime { } { |
@@ -2836,6 +3200,29 @@ proc check_effective_target_avx { } { |
} "-O2 -mavx" ] |
} |
+# Return 1 if sse instructions can be compiled. |
+proc check_effective_target_sse { } { |
+ return [check_no_compiler_messages sse object { |
+ int main () |
+ { |
+ __builtin_ia32_stmxcsr (); |
+ return 0; |
+ } |
+ } "-O2 -msse" ] |
+} |
+ |
+# Return 1 if sse2 instructions can be compiled. |
+proc check_effective_target_sse2 { } { |
+ return [check_no_compiler_messages sse2 object { |
+ typedef long long __m128i __attribute__ ((__vector_size__ (16))); |
+ |
+ __m128i _mm_srli_si128 (__m128i __A, int __N) |
+ { |
+ return (__m128i)__builtin_ia32_psrldqi128 (__A, 8); |
+ } |
+ } "-O2 -msse2" ] |
+} |
+ |
# Return 1 if C wchar_t type is compatible with char16_t. |
proc check_effective_target_wchar_t_char16_t_compatible { } { |
@@ -2873,7 +3260,8 @@ proc check_effective_target_pow10 { } { |
proc check_effective_target_hard_dfp {} { |
return [check_no_messages_and_pattern hard_dfp "!adddd3" assembly { |
- _Decimal64 x, y, z; |
+ typedef float d64 __attribute__((mode(DD))); |
+ d64 x, y, z; |
void foo (void) { z = x + y; } |
}] |
} |
@@ -2895,6 +3283,36 @@ proc check_effective_target_correct_iso_cpp_string_wchar_protos { } { |
}] |
} |
+# Return 1 if GNU as is used. |
+ |
+proc check_effective_target_gas { } { |
+ global use_gas_saved |
+ global tool |
+ |
+ if {![info exists use_gas_saved]} { |
+ # Check if the as used by gcc is GNU as. |
+ set gcc_as [lindex [${tool}_target_compile "-print-prog-name=as" "" "none" ""] 0] |
+ # Provide /dev/null as input, otherwise gas times out reading from |
+ # stdin. |
+ set status [remote_exec host "$gcc_as" "-v /dev/null"] |
+ set as_output [lindex $status 1] |
+ if { [ string first "GNU" $as_output ] >= 0 } { |
+ set use_gas_saved 1 |
+ } else { |
+ set use_gas_saved 0 |
+ } |
+ } |
+ return $use_gas_saved |
+} |
+ |
+# Return 1 if the compiler has been configure with link-time optimization |
+# (LTO) support. |
+ |
+proc check_effective_target_lto { } { |
+ global ENABLE_LTO |
+ return [info exists ENABLE_LTO] |
+} |
+ |
# Return 1 if the language for the compiler under test is C. |
proc check_effective_target_c { } { |
@@ -2914,4 +3332,3 @@ proc check_effective_target_c++ { } { |
} |
return 0 |
} |
- |