diff options
author | Kyrylo Tkachov <kyrylo.tkachov@arm.com> | 2012-12-06 09:55:45 +0000 |
---|---|---|
committer | Kyrylo Tkachov <ktkachov@gcc.gnu.org> | 2012-12-06 09:55:45 +0000 |
commit | 7973996540f699588bb2db60c795e3179869620a (patch) | |
tree | daedc57000ad7479db77d42a69cda072fb3bddbe | |
parent | 4f2b3dc2b49e5b375738e32966615e9ef4e5ced7 (diff) | |
download | gcc-7973996540f699588bb2db60c795e3179869620a.zip gcc-7973996540f699588bb2db60c795e3179869620a.tar.gz gcc-7973996540f699588bb2db60c795e3179869620a.tar.bz2 |
arm.c (neon_itype): Define NEON_RINT enum element.
2012-12-06 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
* config/arm/arm.c (neon_itype): Define NEON_RINT enum element.
(neon_builtin_data): Register vrintn, vrinta, vrintp, vrintm,
vrintz, vrintx neon builtins.
(arm_init_neon_builtins): Handle NEON_RINT.
(arm_expand_neon_builtin): Likewise.
* config/arm/unspecs.md: New file.
* config/arm/arm.md ("unspec"): Move to unspecs.md.
* config/arm/iterators.md (NEON_VRINT): New int iterator.
(nvrint_variant): New int attribute.
* config/arm/neon.md
(neon_vrint<NEON_VRINT:nvrint_variant><VCVTF:mode>): New pattern.
("unspec"): Move to unspecs.md.
* config/arm/iwmmxt2.md ("unspec"): Move to unspecs.md.
From-SVN: r194244
-rw-r--r-- | gcc/ChangeLog | 16 | ||||
-rw-r--r-- | gcc/config/arm/arm.c | 9 | ||||
-rw-r--r-- | gcc/config/arm/arm.md | 111 | ||||
-rw-r--r-- | gcc/config/arm/iterators.md | 7 | ||||
-rw-r--r-- | gcc/config/arm/iwmmxt2.md | 15 | ||||
-rw-r--r-- | gcc/config/arm/neon.md | 144 | ||||
-rw-r--r-- | gcc/config/arm/unspecs.md | 260 |
7 files changed, 310 insertions, 252 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f10efac..f5ca6e4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,19 @@ +2012-12-06 Kyrylo Tkachov <kyrylo.tkachov@arm.com> + + * config/arm/arm.c (neon_itype): Define NEON_RINT enum element. + (neon_builtin_data): Register vrintn, vrinta, vrintp, vrintm, + vrintz, vrintx neon builtins. + (arm_init_neon_builtins): Handle NEON_RINT. + (arm_expand_neon_builtin): Likewise. + * config/arm/unspecs.md: New file. + * config/arm/arm.md ("unspec"): Move to unspecs.md. + * config/arm/iterators.md (NEON_VRINT): New int iterator. + (nvrint_variant): New int attribute. + * config/arm/neon.md + (neon_vrint<NEON_VRINT:nvrint_variant><VCVTF:mode>): New pattern. + ("unspec"): Move to unspecs.md. + * config/arm/iwmmxt2.md ("unspec"): Move to unspecs.md. + 2012-12-05 John David Anglin <dave.anglin@nrc-cnrc.gc.ca> * config/pa/pa.md: Use "const_int 0" instead of match_test to simplify diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index 286a6c5..84ce56f 100644 --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -19060,6 +19060,7 @@ typedef enum { NEON_GETLANE, NEON_SETLANE, NEON_CREATE, + NEON_RINT, NEON_DUP, NEON_DUPLANE, NEON_COMBINE, @@ -19259,6 +19260,12 @@ static neon_builtin_datum neon_builtin_data[] = VAR4 (FIXCONV, vcvt_n, v2si, v2sf, v4si, v4sf), VAR10 (SELECT, vbsl, v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di), + VAR2 (RINT, vrintn, v2sf, v4sf), + VAR2 (RINT, vrinta, v2sf, v4sf), + VAR2 (RINT, vrintp, v2sf, v4sf), + VAR2 (RINT, vrintm, v2sf, v4sf), + VAR2 (RINT, vrintz, v2sf, v4sf), + VAR2 (RINT, vrintx, v2sf, v4sf), VAR1 (VTBL, vtbl1, v8qi), VAR1 (VTBL, vtbl2, v8qi), VAR1 (VTBL, vtbl3, v8qi), @@ -19886,6 +19893,7 @@ arm_init_neon_builtins (void) is_store = 1; /* Fall through. */ case NEON_UNOP: + case NEON_RINT: case NEON_BINOP: case NEON_LOGICBINOP: case NEON_SHIFTINSERT: @@ -21073,6 +21081,7 @@ arm_expand_neon_builtin (int fcode, tree exp, rtx target) NEON_ARG_COPY_TO_REG, NEON_ARG_STOP); case NEON_DUP: + case NEON_RINT: case NEON_SPLIT: case NEON_REINTERP: return arm_expand_neon_args (target, icode, 1, type_mode, exp, fcode, diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md index a9f6da3..7f38816 100644 --- a/gcc/config/arm/arm.md +++ b/gcc/config/arm/arm.md @@ -58,112 +58,6 @@ ] ) -;; UNSPEC Usage: -;; Note: sin and cos are no-longer used. -;; Unspec enumerators for Neon are defined in neon.md. -;; Unspec enumerators for iwmmxt2 are defined in iwmmxt2.md - -(define_c_enum "unspec" [ - UNSPEC_PUSH_MULT ; `push multiple' operation: - ; operand 0 is the first register, - ; subsequent registers are in parallel (use ...) - ; expressions. - UNSPEC_PIC_SYM ; A symbol that has been treated properly for pic - ; usage, that is, we will add the pic_register - ; value to it before trying to dereference it. - UNSPEC_PIC_BASE ; Add PC and all but the last operand together, - ; The last operand is the number of a PIC_LABEL - ; that points at the containing instruction. - UNSPEC_PRLG_STK ; A special barrier that prevents frame accesses - ; being scheduled before the stack adjustment insn. - UNSPEC_REGISTER_USE ; As USE insns are not meaningful after reload, - ; this unspec is used to prevent the deletion of - ; instructions setting registers for EH handling - ; and stack frame generation. Operand 0 is the - ; register to "use". - UNSPEC_CHECK_ARCH ; Set CCs to indicate 26-bit or 32-bit mode. - UNSPEC_WSHUFH ; Used by the intrinsic form of the iWMMXt WSHUFH instruction. - UNSPEC_WACC ; Used by the intrinsic form of the iWMMXt WACC instruction. - UNSPEC_TMOVMSK ; Used by the intrinsic form of the iWMMXt TMOVMSK instruction. - UNSPEC_WSAD ; Used by the intrinsic form of the iWMMXt WSAD instruction. - UNSPEC_WSADZ ; Used by the intrinsic form of the iWMMXt WSADZ instruction. - UNSPEC_WMACS ; Used by the intrinsic form of the iWMMXt WMACS instruction. - UNSPEC_WMACU ; Used by the intrinsic form of the iWMMXt WMACU instruction. - UNSPEC_WMACSZ ; Used by the intrinsic form of the iWMMXt WMACSZ instruction. - UNSPEC_WMACUZ ; Used by the intrinsic form of the iWMMXt WMACUZ instruction. - UNSPEC_CLRDI ; Used by the intrinsic form of the iWMMXt CLRDI instruction. - UNSPEC_WALIGNI ; Used by the intrinsic form of the iWMMXt WALIGN instruction. - UNSPEC_TLS ; A symbol that has been treated properly for TLS usage. - UNSPEC_PIC_LABEL ; A label used for PIC access that does not appear in the - ; instruction stream. - UNSPEC_PIC_OFFSET ; A symbolic 12-bit OFFSET that has been treated - ; correctly for PIC usage. - UNSPEC_GOTSYM_OFF ; The offset of the start of the GOT from a - ; a given symbolic address. - UNSPEC_THUMB1_CASESI ; A Thumb1 compressed dispatch-table call. - UNSPEC_RBIT ; rbit operation. - UNSPEC_SYMBOL_OFFSET ; The offset of the start of the symbol from - ; another symbolic address. - UNSPEC_MEMORY_BARRIER ; Represent a memory barrier. - UNSPEC_UNALIGNED_LOAD ; Used to represent ldr/ldrh instructions that access - ; unaligned locations, on architectures which support - ; that. - UNSPEC_UNALIGNED_STORE ; Same for str/strh. - UNSPEC_PIC_UNIFIED ; Create a common pic addressing form. - UNSPEC_LL ; Represent an unpaired load-register-exclusive. - UNSPEC_VRINTZ ; Represent a float to integral float rounding - ; towards zero. - UNSPEC_VRINTP ; Represent a float to integral float rounding - ; towards +Inf. - UNSPEC_VRINTM ; Represent a float to integral float rounding - ; towards -Inf. - UNSPEC_VRINTR ; Represent a float to integral float rounding - ; FPSCR rounding mode. - UNSPEC_VRINTX ; Represent a float to integral float rounding - ; FPSCR rounding mode and signal inexactness. - UNSPEC_VRINTA ; Represent a float to integral float rounding - ; towards nearest, ties away from zero. -]) - -;; UNSPEC_VOLATILE Usage: - -(define_c_enum "unspecv" [ - VUNSPEC_BLOCKAGE ; `blockage' insn to prevent scheduling across an - ; insn in the code. - VUNSPEC_EPILOGUE ; `epilogue' insn, used to represent any part of the - ; instruction epilogue sequence that isn't expanded - ; into normal RTL. Used for both normal and sibcall - ; epilogues. - VUNSPEC_THUMB1_INTERWORK ; `prologue_thumb1_interwork' insn, used to swap - ; modes from arm to thumb. - VUNSPEC_ALIGN ; `align' insn. Used at the head of a minipool table - ; for inlined constants. - VUNSPEC_POOL_END ; `end-of-table'. Used to mark the end of a minipool - ; table. - VUNSPEC_POOL_1 ; `pool-entry(1)'. An entry in the constant pool for - ; an 8-bit object. - VUNSPEC_POOL_2 ; `pool-entry(2)'. An entry in the constant pool for - ; a 16-bit object. - VUNSPEC_POOL_4 ; `pool-entry(4)'. An entry in the constant pool for - ; a 32-bit object. - VUNSPEC_POOL_8 ; `pool-entry(8)'. An entry in the constant pool for - ; a 64-bit object. - VUNSPEC_POOL_16 ; `pool-entry(16)'. An entry in the constant pool for - ; a 128-bit object. - VUNSPEC_TMRC ; Used by the iWMMXt TMRC instruction. - VUNSPEC_TMCR ; Used by the iWMMXt TMCR instruction. - VUNSPEC_ALIGN8 ; 8-byte alignment version of VUNSPEC_ALIGN - VUNSPEC_WCMP_EQ ; Used by the iWMMXt WCMPEQ instructions - VUNSPEC_WCMP_GTU ; Used by the iWMMXt WCMPGTU instructions - VUNSPEC_WCMP_GT ; Used by the iwMMXT WCMPGT instructions - VUNSPEC_EH_RETURN ; Use to override the return address for exception - ; handling. - VUNSPEC_ATOMIC_CAS ; Represent an atomic compare swap. - VUNSPEC_ATOMIC_XCHG ; Represent an atomic exchange. - VUNSPEC_ATOMIC_OP ; Represent an atomic operation. - VUNSPEC_LL ; Represent a load-register-exclusive. - VUNSPEC_SC ; Represent a store-register-exclusive. -]) ;;--------------------------------------------------------------------------- ;; Attributes @@ -574,6 +468,11 @@ (define_attr "ce_count" "" (const_int 1)) ;;--------------------------------------------------------------------------- +;; Unspecs + +(include "unspecs.md") + +;;--------------------------------------------------------------------------- ;; Mode iterators (include "iterators.md") diff --git a/gcc/config/arm/iterators.md b/gcc/config/arm/iterators.md index fe5eb52..5ae1aefe 100644 --- a/gcc/config/arm/iterators.md +++ b/gcc/config/arm/iterators.md @@ -198,6 +198,9 @@ (define_int_iterator VRINT [UNSPEC_VRINTZ UNSPEC_VRINTP UNSPEC_VRINTM UNSPEC_VRINTR UNSPEC_VRINTX UNSPEC_VRINTA]) +(define_int_iterator NEON_VRINT [UNSPEC_NVRINTP UNSPEC_NVRINTZ UNSPEC_NVRINTM + UNSPEC_NVRINTX UNSPEC_NVRINTA UNSPEC_NVRINTN]) + ;;---------------------------------------------------------------------------- ;; Mode attributes ;;---------------------------------------------------------------------------- @@ -483,3 +486,7 @@ (define_int_attr vrint_predicable [(UNSPEC_VRINTZ "yes") (UNSPEC_VRINTP "no") (UNSPEC_VRINTA "no") (UNSPEC_VRINTM "no") (UNSPEC_VRINTR "yes") (UNSPEC_VRINTX "yes")]) + +(define_int_attr nvrint_variant [(UNSPEC_NVRINTZ "z") (UNSPEC_NVRINTP "p") + (UNSPEC_NVRINTA "a") (UNSPEC_NVRINTM "m") + (UNSPEC_NVRINTX "x") (UNSPEC_NVRINTN "n")]) diff --git a/gcc/config/arm/iwmmxt2.md b/gcc/config/arm/iwmmxt2.md index c06fece..61628bc 100644 --- a/gcc/config/arm/iwmmxt2.md +++ b/gcc/config/arm/iwmmxt2.md @@ -18,21 +18,6 @@ ;; along with GCC; see the file COPYING3. If not see ;; <http://www.gnu.org/licenses/>. -(define_c_enum "unspec" [ - UNSPEC_WADDC ; Used by the intrinsic form of the iWMMXt WADDC instruction. - UNSPEC_WABS ; Used by the intrinsic form of the iWMMXt WABS instruction. - UNSPEC_WQMULWMR ; Used by the intrinsic form of the iWMMXt WQMULWMR instruction. - UNSPEC_WQMULMR ; Used by the intrinsic form of the iWMMXt WQMULMR instruction. - UNSPEC_WQMULWM ; Used by the intrinsic form of the iWMMXt WQMULWM instruction. - UNSPEC_WQMULM ; Used by the intrinsic form of the iWMMXt WQMULM instruction. - UNSPEC_WQMIAxyn ; Used by the intrinsic form of the iWMMXt WMIAxyn instruction. - UNSPEC_WQMIAxy ; Used by the intrinsic form of the iWMMXt WMIAxy instruction. - UNSPEC_TANDC ; Used by the intrinsic form of the iWMMXt TANDC instruction. - UNSPEC_TORC ; Used by the intrinsic form of the iWMMXt TORC instruction. - UNSPEC_TORVSC ; Used by the intrinsic form of the iWMMXt TORVSC instruction. - UNSPEC_TEXTRC ; Used by the intrinsic form of the iWMMXt TEXTRC instruction. -]) - (define_insn "iwmmxt_wabs<mode>3" [(set (match_operand:VMMX 0 "register_operand" "=y") (unspec:VMMX [(match_operand:VMMX 1 "register_operand" "y")] UNSPEC_WABS))] diff --git a/gcc/config/arm/neon.md b/gcc/config/arm/neon.md index 01562d4..fc38269 100644 --- a/gcc/config/arm/neon.md +++ b/gcc/config/arm/neon.md @@ -19,137 +19,6 @@ ;; along with GCC; see the file COPYING3. If not see ;; <http://www.gnu.org/licenses/>. -;; Enumerators for unspecs. -(define_c_enum "unspec" [ - UNSPEC_ASHIFT_SIGNED - UNSPEC_ASHIFT_UNSIGNED - UNSPEC_LOAD_COUNT - UNSPEC_VABD - UNSPEC_VABDL - UNSPEC_VADD - UNSPEC_VADDHN - UNSPEC_VADDL - UNSPEC_VADDW - UNSPEC_VBSL - UNSPEC_VCAGE - UNSPEC_VCAGT - UNSPEC_VCEQ - UNSPEC_VCGE - UNSPEC_VCGEU - UNSPEC_VCGT - UNSPEC_VCGTU - UNSPEC_VCLS - UNSPEC_VCONCAT - UNSPEC_VCVT - UNSPEC_VCVT_N - UNSPEC_VEXT - UNSPEC_VHADD - UNSPEC_VHSUB - UNSPEC_VLD1 - UNSPEC_VLD1_LANE - UNSPEC_VLD2 - UNSPEC_VLD2_DUP - UNSPEC_VLD2_LANE - UNSPEC_VLD3 - UNSPEC_VLD3A - UNSPEC_VLD3B - UNSPEC_VLD3_DUP - UNSPEC_VLD3_LANE - UNSPEC_VLD4 - UNSPEC_VLD4A - UNSPEC_VLD4B - UNSPEC_VLD4_DUP - UNSPEC_VLD4_LANE - UNSPEC_VMAX - UNSPEC_VMIN - UNSPEC_VMLA - UNSPEC_VMLAL - UNSPEC_VMLA_LANE - UNSPEC_VMLAL_LANE - UNSPEC_VMLS - UNSPEC_VMLSL - UNSPEC_VMLS_LANE - UNSPEC_VMLSL_LANE - UNSPEC_VMOVL - UNSPEC_VMOVN - UNSPEC_VMUL - UNSPEC_VMULL - UNSPEC_VMUL_LANE - UNSPEC_VMULL_LANE - UNSPEC_VPADAL - UNSPEC_VPADD - UNSPEC_VPADDL - UNSPEC_VPMAX - UNSPEC_VPMIN - UNSPEC_VPSMAX - UNSPEC_VPSMIN - UNSPEC_VPUMAX - UNSPEC_VPUMIN - UNSPEC_VQABS - UNSPEC_VQADD - UNSPEC_VQDMLAL - UNSPEC_VQDMLAL_LANE - UNSPEC_VQDMLSL - UNSPEC_VQDMLSL_LANE - UNSPEC_VQDMULH - UNSPEC_VQDMULH_LANE - UNSPEC_VQDMULL - UNSPEC_VQDMULL_LANE - UNSPEC_VQMOVN - UNSPEC_VQMOVUN - UNSPEC_VQNEG - UNSPEC_VQSHL - UNSPEC_VQSHL_N - UNSPEC_VQSHLU_N - UNSPEC_VQSHRN_N - UNSPEC_VQSHRUN_N - UNSPEC_VQSUB - UNSPEC_VRECPE - UNSPEC_VRECPS - UNSPEC_VREV16 - UNSPEC_VREV32 - UNSPEC_VREV64 - UNSPEC_VRSQRTE - UNSPEC_VRSQRTS - UNSPEC_VSHL - UNSPEC_VSHLL_N - UNSPEC_VSHL_N - UNSPEC_VSHR_N - UNSPEC_VSHRN_N - UNSPEC_VSLI - UNSPEC_VSRA_N - UNSPEC_VSRI - UNSPEC_VST1 - UNSPEC_VST1_LANE - UNSPEC_VST2 - UNSPEC_VST2_LANE - UNSPEC_VST3 - UNSPEC_VST3A - UNSPEC_VST3B - UNSPEC_VST3_LANE - UNSPEC_VST4 - UNSPEC_VST4A - UNSPEC_VST4B - UNSPEC_VST4_LANE - UNSPEC_VSTRUCTDUMMY - UNSPEC_VSUB - UNSPEC_VSUBHN - UNSPEC_VSUBL - UNSPEC_VSUBW - UNSPEC_VTBL - UNSPEC_VTBX - UNSPEC_VTRN1 - UNSPEC_VTRN2 - UNSPEC_VTST - UNSPEC_VUZP1 - UNSPEC_VUZP2 - UNSPEC_VZIP1 - UNSPEC_VZIP2 - UNSPEC_MISALIGNED_ACCESS - UNSPEC_VCLE - UNSPEC_VCLT -]) - ;; Attribute used to permit string comparisons against <VQH_mnem> in ;; neon_type attribute definitions. @@ -781,6 +650,19 @@ (const_string "neon_fp_vmla_qqq")))] ) +(define_insn "neon_vrint<NEON_VRINT:nvrint_variant><VCVTF:mode>" + [(set (match_operand:VCVTF 0 "s_register_operand" "=w") + (unspec:VCVTF [(match_operand:VCVTF 1 + "s_register_operand" "w")] + NEON_VRINT))] + "TARGET_NEON && TARGET_FPU_ARMV8" + "vrint<nvrint_variant>%?.f32\\t%<V_reg>0, %<V_reg>1" + [(set (attr "neon_type") + (if_then_else (match_test "<Is_d_reg>") + (const_string "neon_fp_vadd_ddd_vabs_dd") + (const_string "neon_fp_vadd_qqq_vabs_qq")))] +) + (define_insn "ior<mode>3" [(set (match_operand:VDQ 0 "s_register_operand" "=w,w") (ior:VDQ (match_operand:VDQ 1 "s_register_operand" "w,0") diff --git a/gcc/config/arm/unspecs.md b/gcc/config/arm/unspecs.md new file mode 100644 index 0000000..5537a87 --- /dev/null +++ b/gcc/config/arm/unspecs.md @@ -0,0 +1,260 @@ +;; UNSPEC Usage: +;; Note: sin and cos are no-longer used. +;; Unspec enumerators for Neon are defined in neon.md. +;; Unspec enumerators for iwmmxt2 are defined in iwmmxt2.md + +(define_c_enum "unspec" [ + UNSPEC_PUSH_MULT ; `push multiple' operation: + ; operand 0 is the first register, + ; subsequent registers are in parallel (use ...) + ; expressions. + UNSPEC_PIC_SYM ; A symbol that has been treated properly for pic + ; usage, that is, we will add the pic_register + ; value to it before trying to dereference it. + UNSPEC_PIC_BASE ; Add PC and all but the last operand together, + ; The last operand is the number of a PIC_LABEL + ; that points at the containing instruction. + UNSPEC_PRLG_STK ; A special barrier that prevents frame accesses + ; being scheduled before the stack adjustment insn. + UNSPEC_REGISTER_USE ; As USE insns are not meaningful after reload, + ; this unspec is used to prevent the deletion of + ; instructions setting registers for EH handling + ; and stack frame generation. Operand 0 is the + ; register to "use". + UNSPEC_CHECK_ARCH ; Set CCs to indicate 26-bit or 32-bit mode. + UNSPEC_WSHUFH ; Used by the intrinsic form of the iWMMXt WSHUFH instruction. + UNSPEC_WACC ; Used by the intrinsic form of the iWMMXt WACC instruction. + UNSPEC_TMOVMSK ; Used by the intrinsic form of the iWMMXt TMOVMSK instruction. + UNSPEC_WSAD ; Used by the intrinsic form of the iWMMXt WSAD instruction. + UNSPEC_WSADZ ; Used by the intrinsic form of the iWMMXt WSADZ instruction. + UNSPEC_WMACS ; Used by the intrinsic form of the iWMMXt WMACS instruction. + UNSPEC_WMACU ; Used by the intrinsic form of the iWMMXt WMACU instruction. + UNSPEC_WMACSZ ; Used by the intrinsic form of the iWMMXt WMACSZ instruction. + UNSPEC_WMACUZ ; Used by the intrinsic form of the iWMMXt WMACUZ instruction. + UNSPEC_CLRDI ; Used by the intrinsic form of the iWMMXt CLRDI instruction. + UNSPEC_WALIGNI ; Used by the intrinsic form of the iWMMXt WALIGN instruction. + UNSPEC_TLS ; A symbol that has been treated properly for TLS usage. + UNSPEC_PIC_LABEL ; A label used for PIC access that does not appear in the + ; instruction stream. + UNSPEC_PIC_OFFSET ; A symbolic 12-bit OFFSET that has been treated + ; correctly for PIC usage. + UNSPEC_GOTSYM_OFF ; The offset of the start of the GOT from a + ; a given symbolic address. + UNSPEC_THUMB1_CASESI ; A Thumb1 compressed dispatch-table call. + UNSPEC_RBIT ; rbit operation. + UNSPEC_SYMBOL_OFFSET ; The offset of the start of the symbol from + ; another symbolic address. + UNSPEC_MEMORY_BARRIER ; Represent a memory barrier. + UNSPEC_UNALIGNED_LOAD ; Used to represent ldr/ldrh instructions that access + ; unaligned locations, on architectures which support + ; that. + UNSPEC_UNALIGNED_STORE ; Same for str/strh. + UNSPEC_PIC_UNIFIED ; Create a common pic addressing form. + UNSPEC_LL ; Represent an unpaired load-register-exclusive. + UNSPEC_VRINTZ ; Represent a float to integral float rounding + ; towards zero. + UNSPEC_VRINTP ; Represent a float to integral float rounding + ; towards +Inf. + UNSPEC_VRINTM ; Represent a float to integral float rounding + ; towards -Inf. + UNSPEC_VRINTR ; Represent a float to integral float rounding + ; FPSCR rounding mode. + UNSPEC_VRINTX ; Represent a float to integral float rounding + ; FPSCR rounding mode and signal inexactness. + UNSPEC_VRINTA ; Represent a float to integral float rounding + ; towards nearest, ties away from zero. +]) + +(define_c_enum "unspec" [ + UNSPEC_WADDC ; Used by the intrinsic form of the iWMMXt WADDC instruction. + UNSPEC_WABS ; Used by the intrinsic form of the iWMMXt WABS instruction. + UNSPEC_WQMULWMR ; Used by the intrinsic form of the iWMMXt WQMULWMR instruction. + UNSPEC_WQMULMR ; Used by the intrinsic form of the iWMMXt WQMULMR instruction. + UNSPEC_WQMULWM ; Used by the intrinsic form of the iWMMXt WQMULWM instruction. + UNSPEC_WQMULM ; Used by the intrinsic form of the iWMMXt WQMULM instruction. + UNSPEC_WQMIAxyn ; Used by the intrinsic form of the iWMMXt WMIAxyn instruction. + UNSPEC_WQMIAxy ; Used by the intrinsic form of the iWMMXt WMIAxy instruction. + UNSPEC_TANDC ; Used by the intrinsic form of the iWMMXt TANDC instruction. + UNSPEC_TORC ; Used by the intrinsic form of the iWMMXt TORC instruction. + UNSPEC_TORVSC ; Used by the intrinsic form of the iWMMXt TORVSC instruction. + UNSPEC_TEXTRC ; Used by the intrinsic form of the iWMMXt TEXTRC instruction. +]) + + +;; UNSPEC_VOLATILE Usage: + +(define_c_enum "unspecv" [ + VUNSPEC_BLOCKAGE ; `blockage' insn to prevent scheduling across an + ; insn in the code. + VUNSPEC_EPILOGUE ; `epilogue' insn, used to represent any part of the + ; instruction epilogue sequence that isn't expanded + ; into normal RTL. Used for both normal and sibcall + ; epilogues. + VUNSPEC_THUMB1_INTERWORK ; `prologue_thumb1_interwork' insn, used to swap + ; modes from arm to thumb. + VUNSPEC_ALIGN ; `align' insn. Used at the head of a minipool table + ; for inlined constants. + VUNSPEC_POOL_END ; `end-of-table'. Used to mark the end of a minipool + ; table. + VUNSPEC_POOL_1 ; `pool-entry(1)'. An entry in the constant pool for + ; an 8-bit object. + VUNSPEC_POOL_2 ; `pool-entry(2)'. An entry in the constant pool for + ; a 16-bit object. + VUNSPEC_POOL_4 ; `pool-entry(4)'. An entry in the constant pool for + ; a 32-bit object. + VUNSPEC_POOL_8 ; `pool-entry(8)'. An entry in the constant pool for + ; a 64-bit object. + VUNSPEC_POOL_16 ; `pool-entry(16)'. An entry in the constant pool for + ; a 128-bit object. + VUNSPEC_TMRC ; Used by the iWMMXt TMRC instruction. + VUNSPEC_TMCR ; Used by the iWMMXt TMCR instruction. + VUNSPEC_ALIGN8 ; 8-byte alignment version of VUNSPEC_ALIGN + VUNSPEC_WCMP_EQ ; Used by the iWMMXt WCMPEQ instructions + VUNSPEC_WCMP_GTU ; Used by the iWMMXt WCMPGTU instructions + VUNSPEC_WCMP_GT ; Used by the iwMMXT WCMPGT instructions + VUNSPEC_EH_RETURN ; Use to override the return address for exception + ; handling. + VUNSPEC_ATOMIC_CAS ; Represent an atomic compare swap. + VUNSPEC_ATOMIC_XCHG ; Represent an atomic exchange. + VUNSPEC_ATOMIC_OP ; Represent an atomic operation. + VUNSPEC_LL ; Represent a load-register-exclusive. + VUNSPEC_SC ; Represent a store-register-exclusive. +]) + +;; Enumerators for NEON unspecs. +(define_c_enum "unspec" [ + UNSPEC_ASHIFT_SIGNED + UNSPEC_ASHIFT_UNSIGNED + UNSPEC_LOAD_COUNT + UNSPEC_VABD + UNSPEC_VABDL + UNSPEC_VADD + UNSPEC_VADDHN + UNSPEC_VADDL + UNSPEC_VADDW + UNSPEC_VBSL + UNSPEC_VCAGE + UNSPEC_VCAGT + UNSPEC_VCEQ + UNSPEC_VCGE + UNSPEC_VCGEU + UNSPEC_VCGT + UNSPEC_VCGTU + UNSPEC_VCLS + UNSPEC_VCONCAT + UNSPEC_VCVT + UNSPEC_VCVT_N + UNSPEC_VEXT + UNSPEC_VHADD + UNSPEC_VHSUB + UNSPEC_VLD1 + UNSPEC_VLD1_LANE + UNSPEC_VLD2 + UNSPEC_VLD2_DUP + UNSPEC_VLD2_LANE + UNSPEC_VLD3 + UNSPEC_VLD3A + UNSPEC_VLD3B + UNSPEC_VLD3_DUP + UNSPEC_VLD3_LANE + UNSPEC_VLD4 + UNSPEC_VLD4A + UNSPEC_VLD4B + UNSPEC_VLD4_DUP + UNSPEC_VLD4_LANE + UNSPEC_VMAX + UNSPEC_VMIN + UNSPEC_VMLA + UNSPEC_VMLAL + UNSPEC_VMLA_LANE + UNSPEC_VMLAL_LANE + UNSPEC_VMLS + UNSPEC_VMLSL + UNSPEC_VMLS_LANE + UNSPEC_VMLSL_LANE + UNSPEC_VMOVL + UNSPEC_VMOVN + UNSPEC_VMUL + UNSPEC_VMULL + UNSPEC_VMUL_LANE + UNSPEC_VMULL_LANE + UNSPEC_VPADAL + UNSPEC_VPADD + UNSPEC_VPADDL + UNSPEC_VPMAX + UNSPEC_VPMIN + UNSPEC_VPSMAX + UNSPEC_VPSMIN + UNSPEC_VPUMAX + UNSPEC_VPUMIN + UNSPEC_VQABS + UNSPEC_VQADD + UNSPEC_VQDMLAL + UNSPEC_VQDMLAL_LANE + UNSPEC_VQDMLSL + UNSPEC_VQDMLSL_LANE + UNSPEC_VQDMULH + UNSPEC_VQDMULH_LANE + UNSPEC_VQDMULL + UNSPEC_VQDMULL_LANE + UNSPEC_VQMOVN + UNSPEC_VQMOVUN + UNSPEC_VQNEG + UNSPEC_VQSHL + UNSPEC_VQSHL_N + UNSPEC_VQSHLU_N + UNSPEC_VQSHRN_N + UNSPEC_VQSHRUN_N + UNSPEC_VQSUB + UNSPEC_VRECPE + UNSPEC_VRECPS + UNSPEC_VREV16 + UNSPEC_VREV32 + UNSPEC_VREV64 + UNSPEC_VRSQRTE + UNSPEC_VRSQRTS + UNSPEC_VSHL + UNSPEC_VSHLL_N + UNSPEC_VSHL_N + UNSPEC_VSHR_N + UNSPEC_VSHRN_N + UNSPEC_VSLI + UNSPEC_VSRA_N + UNSPEC_VSRI + UNSPEC_VST1 + UNSPEC_VST1_LANE + UNSPEC_VST2 + UNSPEC_VST2_LANE + UNSPEC_VST3 + UNSPEC_VST3A + UNSPEC_VST3B + UNSPEC_VST3_LANE + UNSPEC_VST4 + UNSPEC_VST4A + UNSPEC_VST4B + UNSPEC_VST4_LANE + UNSPEC_VSTRUCTDUMMY + UNSPEC_VSUB + UNSPEC_VSUBHN + UNSPEC_VSUBL + UNSPEC_VSUBW + UNSPEC_VTBL + UNSPEC_VTBX + UNSPEC_VTRN1 + UNSPEC_VTRN2 + UNSPEC_VTST + UNSPEC_VUZP1 + UNSPEC_VUZP2 + UNSPEC_VZIP1 + UNSPEC_VZIP2 + UNSPEC_MISALIGNED_ACCESS + UNSPEC_VCLE + UNSPEC_VCLT + UNSPEC_NVRINTZ + UNSPEC_NVRINTP + UNSPEC_NVRINTM + UNSPEC_NVRINTX + UNSPEC_NVRINTA + UNSPEC_NVRINTN +]) + |