blob: 1ce7b7710d90e6c40ae9a29cbca8cca468eabb79 [file] [log] [blame]
Colin Cross7bb052a2015-02-03 12:59:37 -08001// Copyright 2012 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5#include "a.h"
6
7#ifndef __ARMEL__
8char *
9xgetgoarm(void)
10{
11 return "6";
12}
13#else
14static void useVFPv3(void);
15static void useVFPv1(void);
16
17char *
18xgetgoarm(void)
19{
20#if defined(__FreeBSD__)
21 // FreeBSD has broken VFP support
22 return "5";
23#endif
24 // NaCl always has VFP support.
25 if(streq(goos, "nacl") || xtryexecfunc(useVFPv3))
26 return "7";
27 else if(xtryexecfunc(useVFPv1))
28 return "6";
29 return "5";
30}
31
32static void
33useVFPv3(void)
34{
35 // try to run VFPv3-only "vmov.f64 d0, #112" instruction
36 // we can't use that instruction directly, because we
37 // might be compiling with a soft-float only toolchain.
38 //
39 // some newer toolchains are configured to use thumb
40 // by default, so we need to do some mode changing magic
41 // here.
42 // We can use "bx pc; nop" here, but GNU as(1) insists
43 // on warning us
44 // "use of r15 in bx in ARM mode is not really useful"
45 // so we workaround that by using "bx r0"
46 __asm__ __volatile__ ("mov r0, pc");
47 __asm__ __volatile__ ("bx r0");
48 __asm__ __volatile__ (".word 0xeeb70b00"); // vmov.f64 d0, #112
49 __asm__ __volatile__ (".word 0xe12fff1e"); // bx lr
50}
51
52static void
53useVFPv1(void)
54{
55 // try to run "vmov.f64 d0, d0" instruction
56 // we can't use that instruction directly, because we
57 // might be compiling with a soft-float only toolchain
58 //
59 // some newer toolchains are configured to use thumb
60 // by default, so we need to do some mode changing magic
61 // here.
62 // We can use "bx pc; nop" here, but GNU as(1) insists
63 // on warning us
64 // "use of r15 in bx in ARM mode is not really useful"
65 // so we workaround that by using "bx r0"
66 __asm__ __volatile__ ("mov r0, pc");
67 __asm__ __volatile__ ("bx r0");
68 __asm__ __volatile__ (".word 0xeeb00b40"); // vomv.f64 d0, d0
69 __asm__ __volatile__ (".word 0xe12fff1e"); // bx lr
70}
71
72#endif