Commit b379f8d8 by Ian Lance Taylor

re PR go/78789 (Error: no such instruction: `aesenc %xmm0,%xmm2' when compiling…

re PR go/78789 (Error: no such instruction: `aesenc %xmm0,%xmm2' when compiling libgo/runtime/aeshash.c)

	PR go/78789
    runtime: don't build aeshash.c if the assembler doesn't support it
    
    This is for CentOS 5, whose assembler does not know the aesinc
    instruction.
    
    Fixes GCC PR 78789.
    
    Patch by Uros Bizjak.
    
    Reviewed-on: https://go-review.googlesource.com/34796

From-SVN: r244031
parent d4eff95b
ebe9d824adca053066837b8b19461048ced34aff eac28020ee4b2532d4cd43f448fe612e84e0a108
The first line of this file holds the git revision number of the last The first line of this file holds the git revision number of the last
merge done from the gofrontend repository. merge done from the gofrontend repository.
...@@ -21,6 +21,9 @@ ...@@ -21,6 +21,9 @@
/* Define if your assembler supports unwind section type. */ /* Define if your assembler supports unwind section type. */
#undef HAVE_AS_X86_64_UNWIND_SECTION_TYPE #undef HAVE_AS_X86_64_UNWIND_SECTION_TYPE
/* Define if your assembler supports AES instructions. */
#undef HAVE_AS_X86_AES
/* Define if your assembler supports PC relative relocs. */ /* Define if your assembler supports PC relative relocs. */
#undef HAVE_AS_X86_PCREL #undef HAVE_AS_X86_PCREL
......
...@@ -15490,6 +15490,32 @@ $as_echo "#define HAVE_AS_X86_64_UNWIND_SECTION_TYPE 1" >>confdefs.h ...@@ -15490,6 +15490,32 @@ $as_echo "#define HAVE_AS_X86_64_UNWIND_SECTION_TYPE 1" >>confdefs.h
fi fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler supports AES instructions" >&5
$as_echo_n "checking assembler supports AES instructions... " >&6; }
if test "${libgo_cv_as_x86_aes+set}" = set; then :
$as_echo_n "(cached) " >&6
else
libgo_cv_as_x86_aes=yes
echo 'aesenc %xmm0, %xmm1' > conftest.s
CFLAGS_hold=$CFLAGS
if test "$libgo_cv_c_unused_arguments" = yes; then
CFLAGS="$CFLAGS -Qunused-arguments"
fi
if $CC $CFLAGS -c conftest.s 2>&1 | grep -i error > /dev/null; then
libgo_cv_as_x86_aes=no
fi
CFLAGS=$CFLAGS_hold
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libgo_cv_as_x86_aes" >&5
$as_echo "$libgo_cv_as_x86_aes" >&6; }
if test "x$libgo_cv_as_x86_aes" = xyes; then
$as_echo "#define HAVE_AS_X86_AES 1" >>confdefs.h
fi
cat >confcache <<\_ACEOF cat >confcache <<\_ACEOF
# This file is a shell script that caches the results of configure # This file is a shell script that caches the results of configure
# tests run on this system so they can be shared between configure # tests run on this system so they can be shared between configure
......
...@@ -934,6 +934,24 @@ if test "x$libgo_cv_as_x86_64_unwind_section_type" = xyes; then ...@@ -934,6 +934,24 @@ if test "x$libgo_cv_as_x86_64_unwind_section_type" = xyes; then
[Define if your assembler supports unwind section type.]) [Define if your assembler supports unwind section type.])
fi fi
AC_CACHE_CHECK([assembler supports AES instructions],
libgo_cv_as_x86_aes, [
libgo_cv_as_x86_aes=yes
echo 'aesenc %xmm0, %xmm1' > conftest.s
CFLAGS_hold=$CFLAGS
if test "$libgo_cv_c_unused_arguments" = yes; then
CFLAGS="$CFLAGS -Qunused-arguments"
fi
if $CC $CFLAGS -c conftest.s 2>&1 | grep -i error > /dev/null; then
libgo_cv_as_x86_aes=no
fi
CFLAGS=$CFLAGS_hold
])
if test "x$libgo_cv_as_x86_aes" = xyes; then
AC_DEFINE(HAVE_AS_X86_AES, 1,
[Define if your assembler supports AES instructions.])
fi
AC_CACHE_SAVE AC_CACHE_SAVE
if test ${multilib} = yes; then if test ${multilib} = yes; then
......
...@@ -233,6 +233,7 @@ func alginit() { ...@@ -233,6 +233,7 @@ func alginit() {
// Install aes hash algorithm if we have the instructions we need // Install aes hash algorithm if we have the instructions we need
if (GOARCH == "386" || GOARCH == "amd64") && if (GOARCH == "386" || GOARCH == "amd64") &&
GOOS != "nacl" && GOOS != "nacl" &&
support_aes &&
cpuid_ecx&(1<<25) != 0 && // aes (aesenc) cpuid_ecx&(1<<25) != 0 && // aes (aesenc)
cpuid_ecx&(1<<9) != 0 && // sse3 (pshufb) cpuid_ecx&(1<<9) != 0 && // sse3 (pshufb)
cpuid_ecx&(1<<19) != 0 { // sse4.1 (pinsr{d,q}) cpuid_ecx&(1<<19) != 0 { // sse4.1 (pinsr{d,q})
......
...@@ -772,6 +772,7 @@ var ( ...@@ -772,6 +772,7 @@ var (
// Information about what cpu features are available. // Information about what cpu features are available.
// Set on startup. // Set on startup.
cpuid_ecx uint32 cpuid_ecx uint32
support_aes bool
// cpuid_edx uint32 // cpuid_edx uint32
// cpuid_ebx7 uint32 // cpuid_ebx7 uint32
......
...@@ -272,6 +272,12 @@ func setCpuidECX(v uint32) { ...@@ -272,6 +272,12 @@ func setCpuidECX(v uint32) {
cpuid_ecx = v cpuid_ecx = v
} }
// For gccgo, to communicate from the C code to the Go code.
//go:linkname setSupportAES runtime.setSupportAES
func setSupportAES(v bool) {
support_aes = v
}
// typedmemmove copies a typed value. // typedmemmove copies a typed value.
// For gccgo for now. // For gccgo for now.
//go:nosplit //go:nosplit
......
...@@ -12,7 +12,7 @@ uintptr aeshashbody(void*, uintptr, uintptr, Slice) ...@@ -12,7 +12,7 @@ uintptr aeshashbody(void*, uintptr, uintptr, Slice)
uintptr aeshashbody(void*, uintptr, uintptr, Slice) uintptr aeshashbody(void*, uintptr, uintptr, Slice)
__attribute__((no_split_stack)); __attribute__((no_split_stack));
#if defined(__i386__) || defined(__x86_64__) #if (defined(__i386__) || defined(__x86_64__)) && defined(HAVE_AS_X86_AES)
#include <emmintrin.h> #include <emmintrin.h>
#include <tmmintrin.h> #include <tmmintrin.h>
...@@ -573,7 +573,7 @@ uintptr aeshashbody(void* p, uintptr seed, uintptr size, Slice aeskeysched) { ...@@ -573,7 +573,7 @@ uintptr aeshashbody(void* p, uintptr seed, uintptr size, Slice aeskeysched) {
#endif // !defined(__x86_64__) #endif // !defined(__x86_64__)
#else // !defined(__i386__) && !defined(__x86_64__) #else // !defined(__i386__) && !defined(__x86_64__) || !defined(HAVE_AS_X86_AES)
uintptr aeshashbody(void* p __attribute__((unused)), uintptr aeshashbody(void* p __attribute__((unused)),
uintptr seed __attribute__((unused)), uintptr seed __attribute__((unused)),
...@@ -583,4 +583,4 @@ uintptr aeshashbody(void* p __attribute__((unused)), ...@@ -583,4 +583,4 @@ uintptr aeshashbody(void* p __attribute__((unused)),
runtime_throw("impossible call to aeshashbody"); runtime_throw("impossible call to aeshashbody");
} }
#endif // !defined(__i386__) && !defined(__x86_64__) #endif // !defined(__i386__) && !defined(__x86_64__) || !defined(HAVE_AS_X86_AES)
...@@ -599,6 +599,8 @@ extern void setIsCgo(void) ...@@ -599,6 +599,8 @@ extern void setIsCgo(void)
__asm__ (GOSYM_PREFIX "runtime.setIsCgo"); __asm__ (GOSYM_PREFIX "runtime.setIsCgo");
extern void setCpuidECX(uint32) extern void setCpuidECX(uint32)
__asm__ (GOSYM_PREFIX "runtime.setCpuidECX"); __asm__ (GOSYM_PREFIX "runtime.setCpuidECX");
extern void setSupportAES(bool)
__asm__ (GOSYM_PREFIX "runtime.setSupportAES");
extern void makeMainInitDone(void) extern void makeMainInitDone(void)
__asm__ (GOSYM_PREFIX "runtime.makeMainInitDone"); __asm__ (GOSYM_PREFIX "runtime.makeMainInitDone");
extern void closeMainInitDone(void) extern void closeMainInitDone(void)
......
...@@ -190,5 +190,9 @@ runtime_cpuinit() ...@@ -190,5 +190,9 @@ runtime_cpuinit()
if (__get_cpuid(1, &eax, &ebx, &ecx, &edx)) { if (__get_cpuid(1, &eax, &ebx, &ecx, &edx)) {
setCpuidECX(ecx); setCpuidECX(ecx);
} }
#if defined(HAVE_AS_X86_AES)
setSupportAES(true);
#endif
#endif #endif
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment