--- go/src/cmd/dist/arm.c +++ go.fixed/src/cmd/dist/arm.c @@ -11,8 +11,8 @@ return "6"; } #else -static void useVFPv3(void); -static void useVFPv1(void); +void useVFPv3(void); +void useVFPv1(void); char * xgetgoarm(void) @@ -26,46 +26,6 @@ else if(xtryexecfunc(useVFPv1)) return "6"; return "5"; -} - -static void -useVFPv3(void) -{ - // try to run VFPv3-only "vmov.f64 d0, #112" instruction - // we can't use that instruction directly, because we - // might be compiling with a soft-float only toolchain. - // - // some newer toolchains are configured to use thumb - // by default, so we need to do some mode changing magic - // here. - // We can use "bx pc; nop" here, but GNU as(1) insists - // on warning us - // "use of r15 in bx in ARM mode is not really useful" - // so we workaround that by using "bx r0" - __asm__ __volatile__ ("mov r0, pc"); - __asm__ __volatile__ ("bx r0"); - __asm__ __volatile__ (".word 0xeeb70b00"); // vmov.f64 d0, #112 - __asm__ __volatile__ (".word 0xe12fff1e"); // bx lr -} - -static void -useVFPv1(void) -{ - // try to run "vmov.f64 d0, d0" instruction - // we can't use that instruction directly, because we - // might be compiling with a soft-float only toolchain - // - // some newer toolchains are configured to use thumb - // by default, so we need to do some mode changing magic - // here. - // We can use "bx pc; nop" here, but GNU as(1) insists - // on warning us - // "use of r15 in bx in ARM mode is not really useful" - // so we workaround that by using "bx r0" - __asm__ __volatile__ ("mov r0, pc"); - __asm__ __volatile__ ("bx r0"); - __asm__ __volatile__ (".word 0xeeb00b40"); // vomv.f64 d0, d0 - __asm__ __volatile__ (".word 0xe12fff1e"); // bx lr } #endif --- go/src/make.bash +++ go.fixed/src/make.bash @@ -129,7 +132,7 @@ if [ -z "$CC" -a -z "$(type -t gcc)" -a -n "$(type -t clang)" ]; then export CC=clang CXX=clang++ fi -${CC:-gcc} $mflag -O2 -Wall -Werror -o cmd/dist/dist -Icmd/dist "$DEFGOROOT" cmd/dist/*.c +${CC:-gcc} $mflag -O2 -Wall -Werror -o cmd/dist/dist -Icmd/dist "$DEFGOROOT" cmd/dist/*.c cmd/dist/*.S # -e doesn't propagate out of eval, so check success by hand. eval $(./cmd/dist/dist env -p || echo FAIL=true) --- /dev/null 2014-12-09 07:52:31.203329541 -0200 +++ go.fixed/src/cmd/dist/arm.S 2014-12-09 10:29:34.149969243 -0200 @@ -0,0 +1,24 @@ +#ifdef __ARMEL__ + +.text + +.global useVFPv3 +.hidden useVFPv3 +.type useVFPv3,%function +useVFPv3: + mov r0, pc + bx r0 + .word 0xeeb70b00 // vmov.f64 d0, #112 + .word 0xe12fff1e // bx lr + + +.global useVFPv1 +.hidden useVFPv1 +.type useVFPv1,%function +useVFPv1: + mov r0, pc + bx r0 + .word 0xeeb00b40 // vomv.f64 d0, d0 + .word 0xe12fff1e // bx lr + +#endif