/* Machine description for AArch64 architecture. Copyright (C) 2012-2013 Free Software Foundation, Inc. Contributed by ARM Ltd. This file is part of GCC. GCC 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, or (at your option) any later version. GCC 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 GCC; see the file COPYING3. If not see . */ /* In the list below, the BUILTIN_ macros should correspond to the iterator used to construct the instruction's patterns in aarch64-simd.md. A helpful idiom to follow when adding new builtins is to add a line for each pattern in the md file. Thus, ADDP, which has one pattern defined for the VD_BHSI iterator, and one for DImode, has two entries below. */ BUILTIN_VD_RE (CREATE, create) BUILTIN_VQ_S (GETLANE, get_lane_signed) BUILTIN_VDQ (GETLANE, get_lane_unsigned) BUILTIN_VDQF (GETLANE, get_lane) VAR1 (GETLANE, get_lane, di) BUILTIN_VDC (COMBINE, combine) BUILTIN_VB (BINOP, pmul) BUILTIN_VDQF (UNOP, sqrt) BUILTIN_VD_BHSI (BINOP, addp) VAR1 (UNOP, addp, di) BUILTIN_VD_RE (REINTERP, reinterpretdi) BUILTIN_VDC (REINTERP, reinterpretv8qi) BUILTIN_VDC (REINTERP, reinterpretv4hi) BUILTIN_VDC (REINTERP, reinterpretv2si) BUILTIN_VDC (REINTERP, reinterpretv2sf) BUILTIN_VQ (REINTERP, reinterpretv16qi) BUILTIN_VQ (REINTERP, reinterpretv8hi) BUILTIN_VQ (REINTERP, reinterpretv4si) BUILTIN_VQ (REINTERP, reinterpretv4sf) BUILTIN_VQ (REINTERP, reinterpretv2di) BUILTIN_VQ (REINTERP, reinterpretv2df) BUILTIN_VDQ_I (BINOP, dup_lane) BUILTIN_SDQ_I (BINOP, dup_lane) /* Implemented by aarch64_qshl. */ BUILTIN_VSDQ_I (BINOP, sqshl) BUILTIN_VSDQ_I (BINOP, uqshl) BUILTIN_VSDQ_I (BINOP, sqrshl) BUILTIN_VSDQ_I (BINOP, uqrshl) /* Implemented by aarch64_. */ BUILTIN_VSDQ_I (BINOP, sqadd) BUILTIN_VSDQ_I (BINOP, uqadd) BUILTIN_VSDQ_I (BINOP, sqsub) BUILTIN_VSDQ_I (BINOP, uqsub) /* Implemented by aarch64_qadd. */ BUILTIN_VSDQ_I (BINOP, suqadd) BUILTIN_VSDQ_I (BINOP, usqadd) /* Implemented by aarch64_get_dreg. */ BUILTIN_VDC (GETLANE, get_dregoi) BUILTIN_VDC (GETLANE, get_dregci) BUILTIN_VDC (GETLANE, get_dregxi) /* Implemented by aarch64_get_qreg. */ BUILTIN_VQ (GETLANE, get_qregoi) BUILTIN_VQ (GETLANE, get_qregci) BUILTIN_VQ (GETLANE, get_qregxi) /* Implemented by aarch64_set_qreg. */ BUILTIN_VQ (SETLANE, set_qregoi) BUILTIN_VQ (SETLANE, set_qregci) BUILTIN_VQ (SETLANE, set_qregxi) /* Implemented by aarch64_ld. */ BUILTIN_VDC (LOADSTRUCT, ld2) BUILTIN_VDC (LOADSTRUCT, ld3) BUILTIN_VDC (LOADSTRUCT, ld4) /* Implemented by aarch64_ld. */ BUILTIN_VQ (LOADSTRUCT, ld2) BUILTIN_VQ (LOADSTRUCT, ld3) BUILTIN_VQ (LOADSTRUCT, ld4) /* Implemented by aarch64_st. */ BUILTIN_VDC (STORESTRUCT, st2) BUILTIN_VDC (STORESTRUCT, st3) BUILTIN_VDC (STORESTRUCT, st4) /* Implemented by aarch64_st. */ BUILTIN_VQ (STORESTRUCT, st2) BUILTIN_VQ (STORESTRUCT, st3) BUILTIN_VQ (STORESTRUCT, st4) BUILTIN_VQW (BINOP, saddl2) BUILTIN_VQW (BINOP, uaddl2) BUILTIN_VQW (BINOP, ssubl2) BUILTIN_VQW (BINOP, usubl2) BUILTIN_VQW (BINOP, saddw2) BUILTIN_VQW (BINOP, uaddw2) BUILTIN_VQW (BINOP, ssubw2) BUILTIN_VQW (BINOP, usubw2) /* Implemented by aarch64_l. */ BUILTIN_VDW (BINOP, saddl) BUILTIN_VDW (BINOP, uaddl) BUILTIN_VDW (BINOP, ssubl) BUILTIN_VDW (BINOP, usubl) /* Implemented by aarch64_w. */ BUILTIN_VDW (BINOP, saddw) BUILTIN_VDW (BINOP, uaddw) BUILTIN_VDW (BINOP, ssubw) BUILTIN_VDW (BINOP, usubw) /* Implemented by aarch64_h. */ BUILTIN_VQ_S (BINOP, shadd) BUILTIN_VQ_S (BINOP, uhadd) BUILTIN_VQ_S (BINOP, srhadd) BUILTIN_VQ_S (BINOP, urhadd) /* Implemented by aarch64_hn. */ BUILTIN_VQN (BINOP, addhn) BUILTIN_VQN (BINOP, raddhn) /* Implemented by aarch64_hn2. */ BUILTIN_VQN (TERNOP, addhn2) BUILTIN_VQN (TERNOP, raddhn2) BUILTIN_VSQN_HSDI (UNOP, sqmovun) /* Implemented by aarch64_qmovn. */ BUILTIN_VSQN_HSDI (UNOP, sqmovn) BUILTIN_VSQN_HSDI (UNOP, uqmovn) /* Implemented by aarch64_s. */ BUILTIN_VSDQ_I_BHSI (UNOP, sqabs) BUILTIN_VSDQ_I_BHSI (UNOP, sqneg) BUILTIN_VSD_HSI (QUADOP, sqdmlal_lane) BUILTIN_VSD_HSI (QUADOP, sqdmlsl_lane) BUILTIN_VSD_HSI (QUADOP, sqdmlal_laneq) BUILTIN_VSD_HSI (QUADOP, sqdmlsl_laneq) BUILTIN_VQ_HSI (TERNOP, sqdmlal2) BUILTIN_VQ_HSI (TERNOP, sqdmlsl2) BUILTIN_VQ_HSI (QUADOP, sqdmlal2_lane) BUILTIN_VQ_HSI (QUADOP, sqdmlsl2_lane) BUILTIN_VQ_HSI (QUADOP, sqdmlal2_laneq) BUILTIN_VQ_HSI (QUADOP, sqdmlsl2_laneq) BUILTIN_VQ_HSI (TERNOP, sqdmlal2_n) BUILTIN_VQ_HSI (TERNOP, sqdmlsl2_n) /* Implemented by aarch64_sqdmll. */ BUILTIN_VSD_HSI (TERNOP, sqdmlal) BUILTIN_VSD_HSI (TERNOP, sqdmlsl) /* Implemented by aarch64_sqdmll_n. */ BUILTIN_VD_HSI (TERNOP, sqdmlal_n) BUILTIN_VD_HSI (TERNOP, sqdmlsl_n) BUILTIN_VSD_HSI (BINOP, sqdmull) BUILTIN_VSD_HSI (TERNOP, sqdmull_lane) BUILTIN_VD_HSI (TERNOP, sqdmull_laneq) BUILTIN_VD_HSI (BINOP, sqdmull_n) BUILTIN_VQ_HSI (BINOP, sqdmull2) BUILTIN_VQ_HSI (TERNOP, sqdmull2_lane) BUILTIN_VQ_HSI (TERNOP, sqdmull2_laneq) BUILTIN_VQ_HSI (BINOP, sqdmull2_n) /* Implemented by aarch64_sqdmulh. */ BUILTIN_VSDQ_HSI (BINOP, sqdmulh) BUILTIN_VSDQ_HSI (BINOP, sqrdmulh) /* Implemented by aarch64_sqdmulh_lane. */ BUILTIN_VDQHS (TERNOP, sqdmulh_lane) BUILTIN_VDQHS (TERNOP, sqdmulh_laneq) BUILTIN_VDQHS (TERNOP, sqrdmulh_lane) BUILTIN_VDQHS (TERNOP, sqrdmulh_laneq) BUILTIN_SD_HSI (TERNOP, sqdmulh_lane) BUILTIN_SD_HSI (TERNOP, sqrdmulh_lane) BUILTIN_VSDQ_I_DI (BINOP, sshl_n) BUILTIN_VSDQ_I_DI (BINOP, ushl_n) /* Implemented by aarch64_shl. */ BUILTIN_VSDQ_I_DI (BINOP, sshl) BUILTIN_VSDQ_I_DI (BINOP, ushl) BUILTIN_VSDQ_I_DI (BINOP, srshl) BUILTIN_VSDQ_I_DI (BINOP, urshl) BUILTIN_VSDQ_I_DI (SHIFTIMM, sshr_n) BUILTIN_VSDQ_I_DI (SHIFTIMM, ushr_n) /* Implemented by aarch64_shr_n. */ BUILTIN_VSDQ_I_DI (SHIFTIMM, srshr_n) BUILTIN_VSDQ_I_DI (SHIFTIMM, urshr_n) /* Implemented by aarch64_sra_n. */ BUILTIN_VSDQ_I_DI (SHIFTACC, ssra_n) BUILTIN_VSDQ_I_DI (SHIFTACC, usra_n) BUILTIN_VSDQ_I_DI (SHIFTACC, srsra_n) BUILTIN_VSDQ_I_DI (SHIFTACC, ursra_n) /* Implemented by aarch64_shll_n. */ BUILTIN_VDW (SHIFTIMM, sshll_n) BUILTIN_VDW (SHIFTIMM, ushll_n) /* Implemented by aarch64_shll2_n. */ BUILTIN_VQW (SHIFTIMM, sshll2_n) BUILTIN_VQW (SHIFTIMM, ushll2_n) /* Implemented by aarch64_qshrn_n. */ BUILTIN_VSQN_HSDI (SHIFTIMM, sqshrun_n) BUILTIN_VSQN_HSDI (SHIFTIMM, sqrshrun_n) BUILTIN_VSQN_HSDI (SHIFTIMM, sqshrn_n) BUILTIN_VSQN_HSDI (SHIFTIMM, uqshrn_n) BUILTIN_VSQN_HSDI (SHIFTIMM, sqrshrn_n) BUILTIN_VSQN_HSDI (SHIFTIMM, uqrshrn_n) /* Implemented by aarch64_si_n. */ BUILTIN_VSDQ_I_DI (SHIFTINSERT, ssri_n) BUILTIN_VSDQ_I_DI (SHIFTINSERT, usri_n) BUILTIN_VSDQ_I_DI (SHIFTINSERT, ssli_n) BUILTIN_VSDQ_I_DI (SHIFTINSERT, usli_n) /* Implemented by aarch64_qshl_n. */ BUILTIN_VSDQ_I (SHIFTIMM, sqshlu_n) BUILTIN_VSDQ_I (SHIFTIMM, sqshl_n) BUILTIN_VSDQ_I (SHIFTIMM, uqshl_n) /* Implemented by aarch64_cm. */ BUILTIN_VSDQ_I_DI (BINOP, cmeq) BUILTIN_VSDQ_I_DI (BINOP, cmge) BUILTIN_VSDQ_I_DI (BINOP, cmgt) BUILTIN_VSDQ_I_DI (BINOP, cmle) BUILTIN_VSDQ_I_DI (BINOP, cmlt) /* Implemented by aarch64_cm. */ BUILTIN_VSDQ_I_DI (BINOP, cmhs) BUILTIN_VSDQ_I_DI (BINOP, cmhi) BUILTIN_VSDQ_I_DI (BINOP, cmtst) /* Implemented by aarch64_. */ BUILTIN_VDQF (BINOP, fmax) BUILTIN_VDQF (BINOP, fmin) /* Implemented by aarch64_. */ BUILTIN_VDQ_BHSI (BINOP, smax) BUILTIN_VDQ_BHSI (BINOP, smin) BUILTIN_VDQ_BHSI (BINOP, umax) BUILTIN_VDQ_BHSI (BINOP, umin) /* Implemented by aarch64_frint. */ BUILTIN_VDQF (UNOP, frintz) BUILTIN_VDQF (UNOP, frintp) BUILTIN_VDQF (UNOP, frintm) BUILTIN_VDQF (UNOP, frinti) BUILTIN_VDQF (UNOP, frintx) BUILTIN_VDQF (UNOP, frinta) /* Implemented by aarch64_fcvt. */ BUILTIN_VDQF (UNOP, fcvtzs) BUILTIN_VDQF (UNOP, fcvtzu) BUILTIN_VDQF (UNOP, fcvtas) BUILTIN_VDQF (UNOP, fcvtau) BUILTIN_VDQF (UNOP, fcvtps) BUILTIN_VDQF (UNOP, fcvtpu) BUILTIN_VDQF (UNOP, fcvtms) BUILTIN_VDQF (UNOP, fcvtmu) /* Implemented by aarch64_. */ BUILTIN_VALL (BINOP, zip1) BUILTIN_VALL (BINOP, zip2) BUILTIN_VALL (BINOP, uzp1) BUILTIN_VALL (BINOP, uzp2) BUILTIN_VALL (BINOP, trn1) BUILTIN_VALL (BINOP, trn2)