| /* neon-fp-cvt-ins.s Test file for AArch64 NEON |
| floating-point<->fixed-point conversion and |
| floating-point<->integer conversion instructions. |
| |
| Copyright 2011, 2012 Free Software Foundation, Inc. |
| Contributed by ARM Ltd. |
| |
| This file is part of GAS. |
| |
| GAS is free software; you can redistribute it and/or modify |
| it under the terms of the GNU General Public License as published by |
| the Free Software Foundation; either version 3 of the license, or |
| (at your option) any later version. |
| |
| GAS is distributed in the hope that it will be useful, |
| but WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| GNU General Public License for more details. |
| |
| You should have received a copy of the GNU General Public License |
| along with this program; see the file COPYING3. If not, |
| see <http://www.gnu.org/licenses/>. */ |
| |
| .macro do_cvt op, fbits, reg, reg_shape |
| .ifc \fbits, 0 |
| // Floating-point<->integer conversions |
| .ifc \reg, V |
| \op V7.\()\reg_shape, V7.\()\reg_shape |
| .else |
| \op \reg\()7, \reg\()7 |
| .endif |
| .else |
| // Floating-point<->fixed-point conversions |
| .ifc \reg, V |
| .ifle \fbits-32 |
| .ifc \reg_shape, 2S |
| \op V7.2S, V7.2S, #\fbits |
| .endif |
| .ifc \reg_shape, 4S |
| \op V7.4S, V7.4S, #\fbits |
| .endif |
| .endif |
| .ifc \reg_shape, 2D |
| \op V7.2D, V7.2D, #\fbits |
| .endif |
| .else |
| .ifc \reg, S |
| .ifle \fbits-32 |
| \op S7, S7, #\fbits |
| .endif |
| .endif |
| .ifc \reg, D |
| \op D7, D7, #\fbits |
| .endif |
| .endif |
| .endif |
| .endm |
| |
| .macro fcvts_with_fbits fbits |
| .ifc \fbits, 0 |
| // fp <-> int |
| // AdvSIMD |
| .irp reg_shape, 2S, 4S, 2D |
| do_cvt FCVTNS, \fbits, V, \reg_shape |
| do_cvt FCVTNU, \fbits, V, \reg_shape |
| do_cvt FCVTPS, \fbits, V, \reg_shape |
| do_cvt FCVTPU, \fbits, V, \reg_shape |
| do_cvt SCVTF, \fbits, V, \reg_shape |
| do_cvt UCVTF, \fbits, V, \reg_shape |
| do_cvt FCVTMS, \fbits, V, \reg_shape |
| do_cvt FCVTMU, \fbits, V, \reg_shape |
| do_cvt FCVTZS, \fbits, V, \reg_shape |
| do_cvt FCVTZU, \fbits, V, \reg_shape |
| do_cvt FCVTAS, \fbits, V, \reg_shape |
| do_cvt FCVTAU, \fbits, V, \reg_shape |
| .endr |
| // AdvSISD |
| .irp reg, S, D |
| do_cvt FCVTNS, \fbits, \reg |
| do_cvt FCVTNU, \fbits, \reg |
| do_cvt FCVTPS, \fbits, \reg |
| do_cvt FCVTPU, \fbits, \reg |
| do_cvt SCVTF, \fbits, \reg |
| do_cvt UCVTF, \fbits, \reg |
| do_cvt FCVTMS, \fbits, \reg |
| do_cvt FCVTMU, \fbits, \reg |
| do_cvt FCVTZS, \fbits, \reg |
| do_cvt FCVTZU, \fbits, \reg |
| do_cvt FCVTAS, \fbits, \reg |
| do_cvt FCVTAU, \fbits, \reg |
| .endr |
| .else |
| // fp <-> fixed-point |
| // AdvSIMD |
| .irp reg_shape, 2S, 4S, 2D |
| do_cvt SCVTF, \fbits, V, \reg_shape |
| do_cvt UCVTF, \fbits, V, \reg_shape |
| do_cvt FCVTZS, \fbits, V, \reg_shape |
| do_cvt FCVTZU, \fbits, V, \reg_shape |
| .endr |
| // AdvSISD |
| .irp reg, S, D |
| do_cvt SCVTF, \fbits, \reg |
| do_cvt UCVTF, \fbits, \reg |
| do_cvt FCVTZS, \fbits, \reg |
| do_cvt FCVTZU, \fbits, \reg |
| .endr |
| .endif |
| .endm |
| |
| |
| .macro fcvts_with_fbits_wrapper from=0, to=64 |
| fcvts_with_fbits \from |
| .if \to-\from |
| fcvts_with_fbits_wrapper "(\from+1)", \to |
| .endif |
| .endm |
| |
| func: |
| // Generate fcvt instructions without fbits and |
| // with fbits from 1 to 64, also generate [us]cvtf |
| fcvts_with_fbits_wrapper from=0, to=64 |