1# AC_PROG_NASM
2# --------------------------
3# Check that NASM exists and determine flags
4AC_DEFUN([AC_PROG_NASM],[
5
6AC_CHECK_PROGS(NASM, [nasm nasmw yasm])
7test -z "$NASM" && AC_MSG_ERROR([no nasm (Netwide Assembler) found])
8
9AC_MSG_CHECKING([for object file format of host system])
10case "$host_os" in
11  cygwin* | mingw* | pw32* | interix*)
12    case "$host_cpu" in
13      x86_64)
14        objfmt='Win64-COFF'
15        ;;
16      *)
17        objfmt='Win32-COFF'
18        ;;
19    esac
20  ;;
21  msdosdjgpp* | go32*)
22    objfmt='COFF'
23  ;;
24  os2-emx*)			# not tested
25    objfmt='MSOMF'		# obj
26  ;;
27  linux*coff* | linux*oldld*)
28    objfmt='COFF'		# ???
29  ;;
30  linux*aout*)
31    objfmt='a.out'
32  ;;
33  linux*)
34    case "$host_cpu" in
35      x86_64)
36        objfmt='ELF64'
37        ;;
38      *)
39        objfmt='ELF'
40        ;;
41    esac
42  ;;
43  kfreebsd* | freebsd* | netbsd* | openbsd*)
44    if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
45      objfmt='BSD-a.out'
46    else
47      case "$host_cpu" in
48        x86_64 | amd64)
49          objfmt='ELF64'
50          ;;
51        *)
52          objfmt='ELF'
53          ;;
54      esac
55    fi
56  ;;
57  solaris* | sunos* | sysv* | sco*)
58    case "$host_cpu" in
59      x86_64)
60        objfmt='ELF64'
61        ;;
62      *)
63        objfmt='ELF'
64        ;;
65    esac
66  ;;
67  darwin* | rhapsody* | nextstep* | openstep* | macos*)
68    case "$host_cpu" in
69      x86_64)
70        objfmt='Mach-O64'
71        ;;
72      *)
73        objfmt='Mach-O'
74        ;;
75    esac
76  ;;
77  *)
78    objfmt='ELF ?'
79  ;;
80esac
81
82AC_MSG_RESULT([$objfmt])
83if test "$objfmt" = 'ELF ?'; then
84  objfmt='ELF'
85  AC_MSG_WARN([unexpected host system. assumed that the format is $objfmt.])
86fi
87
88AC_MSG_CHECKING([for object file format specifier (NAFLAGS) ])
89case "$objfmt" in
90  MSOMF)      NAFLAGS='-fobj -DOBJ32';;
91  Win32-COFF) NAFLAGS='-fwin32 -DWIN32';;
92  Win64-COFF) NAFLAGS='-fwin64 -DWIN64 -D__x86_64__';;
93  COFF)       NAFLAGS='-fcoff -DCOFF';;
94  a.out)      NAFLAGS='-faout -DAOUT';;
95  BSD-a.out)  NAFLAGS='-faoutb -DAOUT';;
96  ELF)        NAFLAGS='-felf -DELF';;
97  ELF64)      NAFLAGS='-felf64 -DELF -D__x86_64__';;
98  RDF)        NAFLAGS='-frdf -DRDF';;
99  Mach-O)     NAFLAGS='-fmacho -DMACHO';;
100  Mach-O64)   NAFLAGS='-fmacho64 -DMACHO -D__x86_64__';;
101esac
102AC_MSG_RESULT([$NAFLAGS])
103AC_SUBST([NAFLAGS])
104
105AC_MSG_CHECKING([whether the assembler ($NASM $NAFLAGS) works])
106cat > conftest.asm <<EOF
107[%line __oline__ "configure"
108        section .text
109        global  _main,main
110_main:
111main:   xor     eax,eax
112        ret
113]EOF
114try_nasm='$NASM $NAFLAGS -o conftest.o conftest.asm'
115if AC_TRY_EVAL(try_nasm) && test -s conftest.o; then
116  AC_MSG_RESULT(yes)
117else
118  echo "configure: failed program was:" >&AC_FD_CC
119  cat conftest.asm >&AC_FD_CC
120  rm -rf conftest*
121  AC_MSG_RESULT(no)
122  AC_MSG_ERROR([installation or configuration problem: assembler cannot create object files.])
123fi
124
125AC_MSG_CHECKING([whether the linker accepts assembler output])
126try_nasm='${CC-cc} -o conftest${ac_exeext} $LDFLAGS conftest.o $LIBS 1>&AC_FD_CC'
127if AC_TRY_EVAL(try_nasm) && test -s conftest${ac_exeext}; then
128  rm -rf conftest*
129  AC_MSG_RESULT(yes)
130else
131  rm -rf conftest*
132  AC_MSG_RESULT(no)
133  AC_MSG_ERROR([configuration problem: maybe object file format mismatch.])
134fi
135
136])
137
138# AC_CHECK_COMPATIBLE_ARM_ASSEMBLER_IFELSE
139# --------------------------
140# Test whether the assembler is suitable and supports NEON instructions
141AC_DEFUN([AC_CHECK_COMPATIBLE_ARM_ASSEMBLER_IFELSE],[
142  ac_good_gnu_arm_assembler=no
143  ac_save_CC="$CC"
144  ac_save_CFLAGS="$CFLAGS"
145  CFLAGS="$CCASFLAGS -x assembler-with-cpp"
146  CC="$CCAS"
147  AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
148    .text
149    .fpu neon
150    .arch armv7a
151    .object_arch armv4
152    .arm
153    pld [r0]
154    vmovn.u16 d0, q0]])], ac_good_gnu_arm_assembler=yes)
155
156  ac_use_gas_preprocessor=no
157  if test "x$ac_good_gnu_arm_assembler" = "xno" ; then
158    CC="gas-preprocessor.pl $CCAS"
159    AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
160      .text
161      .fpu neon
162      .arch armv7a
163      .object_arch armv4
164      .arm
165      pld [r0]
166      vmovn.u16 d0, q0]])], ac_use_gas_preprocessor=yes)
167  fi
168  CFLAGS="$ac_save_CFLAGS"
169  CC="$ac_save_CC"
170
171  if test "x$ac_use_gas_preprocessor" = "xyes" ; then
172    CCAS="gas-preprocessor.pl $CCAS"
173    AC_SUBST([CCAS])
174    ac_good_gnu_arm_assembler=yes
175  fi
176
177  if test "x$ac_good_gnu_arm_assembler" = "xyes" ; then
178    $1
179  else
180    $2
181  fi
182])
183
184# AC_CHECK_COMPATIBLE_MIPSEL_ASSEMBLER_IFELSE
185# --------------------------
186# Test whether the assembler is suitable and supports MIPS instructions
187AC_DEFUN([AC_CHECK_COMPATIBLE_MIPS_ASSEMBLER_IFELSE],[
188  have_mips_dspr2=no
189  ac_save_CFLAGS="$CFLAGS"
190  CFLAGS="$CCASFLAGS -mdspr2"
191
192  AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
193
194  int main ()
195  {
196    int c = 0, a = 0, b = 0;
197    __asm__ __volatile__ (
198        "precr.qb.ph %[c], %[a], %[b]          \n\t"
199        : [c] "=r" (c)
200        : [a] "r" (a), [b] "r" (b)
201    );
202    return c;
203  }
204  ]])], have_mips_dspr2=yes)
205  CFLAGS=$ac_save_CFLAGS
206
207  if test "x$have_mips_dspr2" = "xyes" ; then
208    $1
209  else
210    $2
211  fi
212])
213
214AC_DEFUN([AC_CHECK_COMPATIBLE_ARM64_ASSEMBLER_IFELSE],[
215  ac_good_gnu_arm_assembler=no
216  ac_save_CC="$CC"
217  ac_save_CFLAGS="$CFLAGS"
218  CFLAGS="$CCASFLAGS -x assembler-with-cpp"
219  CC="$CCAS"
220  AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
221    .text
222    movi v0.16b, #100]])], ac_good_gnu_arm_assembler=yes)
223
224  ac_use_gas_preprocessor=no
225  if test "x$ac_good_gnu_arm_assembler" = "xno" ; then
226    CC="gas-preprocessor.pl $CCAS"
227    AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
228      .text
229      movi v0.16b, #100]])], ac_use_gas_preprocessor=yes)
230  fi
231  CFLAGS="$ac_save_CFLAGS"
232  CC="$ac_save_CC"
233
234  if test "x$ac_use_gas_preprocessor" = "xyes" ; then
235    CCAS="gas-preprocessor.pl $CCAS"
236    AC_SUBST([CCAS])
237    ac_good_gnu_arm_assembler=yes
238  fi
239
240  if test "x$ac_good_gnu_arm_assembler" = "xyes" ; then
241    $1
242  else
243    $2
244  fi
245])
246