From patchwork Wed Mar 30 08:58:03 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Sandiford X-Patchwork-Id: 837 Return-Path: Delivered-To: unknown Received: from imap.gmail.com (74.125.159.109) by localhost6.localdomain6 with IMAP4-SSL; 08 Jun 2011 14:46:19 -0000 Delivered-To: patches@linaro.org Received: by 10.42.161.68 with SMTP id s4cs28677icx; Wed, 30 Mar 2011 01:58:07 -0700 (PDT) Received: by 10.216.230.31 with SMTP id i31mr951518weq.7.1301475486812; Wed, 30 Mar 2011 01:58:06 -0700 (PDT) Received: from mail-wy0-f178.google.com (mail-wy0-f178.google.com [74.125.82.178]) by mx.google.com with ESMTPS id z1si10477285weq.97.2011.03.30.01.58.06 (version=TLSv1/SSLv3 cipher=OTHER); Wed, 30 Mar 2011 01:58:06 -0700 (PDT) Received-SPF: neutral (google.com: 74.125.82.178 is neither permitted nor denied by best guess record for domain of richard.sandiford@linaro.org) client-ip=74.125.82.178; Authentication-Results: mx.google.com; spf=neutral (google.com: 74.125.82.178 is neither permitted nor denied by best guess record for domain of richard.sandiford@linaro.org) smtp.mail=richard.sandiford@linaro.org Received: by mail-wy0-f178.google.com with SMTP id 33so1063032wyb.37 for ; Wed, 30 Mar 2011 01:58:06 -0700 (PDT) Received: by 10.216.142.165 with SMTP id i37mr851304wej.106.1301475486142; Wed, 30 Mar 2011 01:58:06 -0700 (PDT) Received: from richards-thinkpad (gbibp9ph1--blueice2n1.emea.ibm.com [195.212.29.75]) by mx.google.com with ESMTPS id c54sm2344175wer.6.2011.03.30.01.58.04 (version=TLSv1/SSLv3 cipher=OTHER); Wed, 30 Mar 2011 01:58:05 -0700 (PDT) From: Richard Sandiford To: patches@linaro.org Mail-Followup-To: patches@linaro.org, richard.sandiford@linaro.org Subject: [Richard Sandiford] [ARM] Define unspecs using define_c_enum Date: Wed, 30 Mar 2011 09:58:03 +0100 Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.1 (gnu/linux) MIME-Version: 1.0 Content-Disposition: inline This ARM patch allows *UNSPEC_* constants to be printed in dump files. It's very much a target decision whether this is worth doing, but just in case... ...tested on arm-linux-gnueabi. OK to install? Richard gcc/ * config/arm/neon.md: Use define_c_enum to define UNSPEC* and VUNSPEC* constants. * config/arm/arm.md: Likewise. Move the synchronization ones to... * config/arm/sync.md: ...here. Index: gcc/config/arm/neon.md =================================================================== --- gcc/config/arm/neon.md 2011-03-29 09:46:11.000000000 +0100 +++ gcc/config/arm/neon.md 2011-03-29 09:57:52.000000000 +0100 @@ -19,131 +19,131 @@ ;; . ;; Constants for unspecs. -(define_constants - [(UNSPEC_ASHIFT_SIGNED 65) - (UNSPEC_ASHIFT_UNSIGNED 66) - (UNSPEC_VABD 69) - (UNSPEC_VABDL 70) - (UNSPEC_VADD 72) - (UNSPEC_VADDHN 73) - (UNSPEC_VADDL 74) - (UNSPEC_VADDW 75) - (UNSPEC_VBSL 78) - (UNSPEC_VCAGE 79) - (UNSPEC_VCAGT 80) - (UNSPEC_VCEQ 81) - (UNSPEC_VCGE 82) - (UNSPEC_VCGT 83) - (UNSPEC_VCLS 84) - (UNSPEC_VCVT 88) - (UNSPEC_VCVT_N 89) - (UNSPEC_VEXT 93) - (UNSPEC_VHADD 97) - (UNSPEC_VHSUB 98) - (UNSPEC_VLD1 99) - (UNSPEC_VLD1_DUP 100) - (UNSPEC_VLD1_LANE 101) - (UNSPEC_VLD2 102) - (UNSPEC_VLD2_DUP 103) - (UNSPEC_VLD2_LANE 104) - (UNSPEC_VLD3 105) - (UNSPEC_VLD3A 106) - (UNSPEC_VLD3B 107) - (UNSPEC_VLD3_DUP 108) - (UNSPEC_VLD3_LANE 109) - (UNSPEC_VLD4 110) - (UNSPEC_VLD4A 111) - (UNSPEC_VLD4B 112) - (UNSPEC_VLD4_DUP 113) - (UNSPEC_VLD4_LANE 114) - (UNSPEC_VMAX 115) - (UNSPEC_VMIN 116) - (UNSPEC_VMLA 117) - (UNSPEC_VMLAL 118) - (UNSPEC_VMLA_LANE 119) - (UNSPEC_VMLAL_LANE 120) - (UNSPEC_VMLS 121) - (UNSPEC_VMLSL 122) - (UNSPEC_VMLS_LANE 123) - (UNSPEC_VMLSL_LANE 124) - (UNSPEC_VMOVL 125) - (UNSPEC_VMOVN 126) - (UNSPEC_VMUL 127) - (UNSPEC_VMULL 128) - (UNSPEC_VMUL_LANE 129) - (UNSPEC_VMULL_LANE 130) - (UNSPEC_VPADAL 135) - (UNSPEC_VPADD 136) - (UNSPEC_VPADDL 137) - (UNSPEC_VPMAX 138) - (UNSPEC_VPMIN 139) - (UNSPEC_VPSMAX 140) - (UNSPEC_VPSMIN 141) - (UNSPEC_VPUMAX 142) - (UNSPEC_VPUMIN 143) - (UNSPEC_VQABS 144) - (UNSPEC_VQADD 145) - (UNSPEC_VQDMLAL 146) - (UNSPEC_VQDMLAL_LANE 147) - (UNSPEC_VQDMLSL 148) - (UNSPEC_VQDMLSL_LANE 149) - (UNSPEC_VQDMULH 150) - (UNSPEC_VQDMULH_LANE 151) - (UNSPEC_VQDMULL 152) - (UNSPEC_VQDMULL_LANE 153) - (UNSPEC_VQMOVN 154) - (UNSPEC_VQMOVUN 155) - (UNSPEC_VQNEG 156) - (UNSPEC_VQSHL 157) - (UNSPEC_VQSHL_N 158) - (UNSPEC_VQSHLU_N 159) - (UNSPEC_VQSHRN_N 160) - (UNSPEC_VQSHRUN_N 161) - (UNSPEC_VQSUB 162) - (UNSPEC_VRECPE 163) - (UNSPEC_VRECPS 164) - (UNSPEC_VREV16 165) - (UNSPEC_VREV32 166) - (UNSPEC_VREV64 167) - (UNSPEC_VRSQRTE 168) - (UNSPEC_VRSQRTS 169) - (UNSPEC_VSHL 171) - (UNSPEC_VSHLL_N 172) - (UNSPEC_VSHL_N 173) - (UNSPEC_VSHR_N 174) - (UNSPEC_VSHRN_N 175) - (UNSPEC_VSLI 176) - (UNSPEC_VSRA_N 177) - (UNSPEC_VSRI 178) - (UNSPEC_VST1 179) - (UNSPEC_VST1_LANE 180) - (UNSPEC_VST2 181) - (UNSPEC_VST2_LANE 182) - (UNSPEC_VST3 183) - (UNSPEC_VST3A 184) - (UNSPEC_VST3B 185) - (UNSPEC_VST3_LANE 186) - (UNSPEC_VST4 187) - (UNSPEC_VST4A 188) - (UNSPEC_VST4B 189) - (UNSPEC_VST4_LANE 190) - (UNSPEC_VSTRUCTDUMMY 191) - (UNSPEC_VSUB 192) - (UNSPEC_VSUBHN 193) - (UNSPEC_VSUBL 194) - (UNSPEC_VSUBW 195) - (UNSPEC_VTBL 196) - (UNSPEC_VTBX 197) - (UNSPEC_VTRN1 198) - (UNSPEC_VTRN2 199) - (UNSPEC_VTST 200) - (UNSPEC_VUZP1 201) - (UNSPEC_VUZP2 202) - (UNSPEC_VZIP1 203) - (UNSPEC_VZIP2 204) - (UNSPEC_MISALIGNED_ACCESS 205) - (UNSPEC_VCLE 206) - (UNSPEC_VCLT 207)]) +(define_c_enum "unspec" + [UNSPEC_ASHIFT_SIGNED + UNSPEC_ASHIFT_UNSIGNED + UNSPEC_VABD + UNSPEC_VABDL + UNSPEC_VADD + UNSPEC_VADDHN + UNSPEC_VADDL + UNSPEC_VADDW + UNSPEC_VBSL + UNSPEC_VCAGE + UNSPEC_VCAGT + UNSPEC_VCEQ + UNSPEC_VCGE + UNSPEC_VCGT + UNSPEC_VCLS + UNSPEC_VCVT + UNSPEC_VCVT_N + UNSPEC_VEXT + UNSPEC_VHADD + UNSPEC_VHSUB + UNSPEC_VLD1 + UNSPEC_VLD1_DUP + 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 in Index: gcc/config/arm/arm.md =================================================================== --- gcc/config/arm/arm.md 2011-03-25 18:21:18.000000000 +0000 +++ gcc/config/arm/arm.md 2011-03-29 10:02:06.000000000 +0100 @@ -50,99 +50,88 @@ (define_constants ) ;; UNSPEC Usage: -;; Note: sin and cos are no-longer used. ;; Unspec constants for Neon are defined in neon.md. -(define_constants - [(UNSPEC_SIN 0) ; `sin' operation (MODE_FLOAT): - ; operand 0 is the result, - ; operand 1 the parameter. - (UNPSEC_COS 1) ; `cos' operation (MODE_FLOAT): - ; operand 0 is the result, - ; operand 1 the parameter. - (UNSPEC_PUSH_MULT 2) ; `push multiple' operation: +(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 3) ; A symbol that has been treated properly for pic + 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 4) ; Add PC and all but the last operand together, + 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 5) ; A special barrier that prevents frame accesses + UNSPEC_PRLG_STK ; A special barrier that prevents frame accesses ; being scheduled before the stack adjustment insn. - (UNSPEC_PROLOGUE_USE 6) ; As USE insns are not meaningful after reload, + UNSPEC_PROLOGUE_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 7); Set CCs to indicate 26-bit or 32-bit mode. - (UNSPEC_WSHUFH 8) ; Used by the intrinsic form of the iWMMXt WSHUFH instruction. - (UNSPEC_WACC 9) ; Used by the intrinsic form of the iWMMXt WACC instruction. - (UNSPEC_TMOVMSK 10) ; Used by the intrinsic form of the iWMMXt TMOVMSK instruction. - (UNSPEC_WSAD 11) ; Used by the intrinsic form of the iWMMXt WSAD instruction. - (UNSPEC_WSADZ 12) ; Used by the intrinsic form of the iWMMXt WSADZ instruction. - (UNSPEC_WMACS 13) ; Used by the intrinsic form of the iWMMXt WMACS instruction. - (UNSPEC_WMACU 14) ; Used by the intrinsic form of the iWMMXt WMACU instruction. - (UNSPEC_WMACSZ 15) ; Used by the intrinsic form of the iWMMXt WMACSZ instruction. - (UNSPEC_WMACUZ 16) ; Used by the intrinsic form of the iWMMXt WMACUZ instruction. - (UNSPEC_CLRDI 17) ; Used by the intrinsic form of the iWMMXt CLRDI instruction. - (UNSPEC_WMADDS 18) ; Used by the intrinsic form of the iWMMXt WMADDS instruction. - (UNSPEC_WMADDU 19) ; Used by the intrinsic form of the iWMMXt WMADDU instruction. - (UNSPEC_TLS 20) ; A symbol that has been treated properly for TLS usage. - (UNSPEC_PIC_LABEL 21) ; A label used for PIC access that does not appear in the - ; instruction stream. - (UNSPEC_STACK_ALIGN 22) ; Doubleword aligned stack pointer. Used to - ; generate correct unwind information. - (UNSPEC_PIC_OFFSET 23) ; A symbolic 12-bit OFFSET that has been treated - ; correctly for PIC usage. - (UNSPEC_GOTSYM_OFF 24) ; The offset of the start of the the GOT from a - ; a given symbolic address. - (UNSPEC_THUMB1_CASESI 25) ; A Thumb1 compressed dispatch-table call. - (UNSPEC_RBIT 26) ; rbit operation. - (UNSPEC_SYMBOL_OFFSET 27) ; The offset of the start of the symbol from - ; another symbolic address. - (UNSPEC_MEMORY_BARRIER 28) ; Represent a memory barrier. + 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_WMADDS ; Used by the intrinsic form of the iWMMXt WMADDS instruction. + UNSPEC_WMADDU ; Used by the intrinsic form of the iWMMXt WMADDU 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_STACK_ALIGN ; Doubleword aligned stack pointer. Used to + ; generate correct unwind information. + 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 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_VOLATILE Usage: +;; Unspec constants for synchronization primitives are defined in sync.md. -(define_constants - [(VUNSPEC_BLOCKAGE 0) ; `blockage' insn to prevent scheduling across an +(define_c_enum "unspecv" + [VUNSPEC_BLOCKAGE ; `blockage' insn to prevent scheduling across an ; insn in the code. - (VUNSPEC_EPILOGUE 1) ; `epilogue' insn, used to represent any part of the + 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_ALIGN 2) ; `align' insn. Used at the head of a minipool table + VUNSPEC_ALIGN ; `align' insn. Used at the head of a minipool table ; for inlined constants. - (VUNSPEC_POOL_END 3) ; `end-of-table'. Used to mark the end of a minipool + VUNSPEC_POOL_END ; `end-of-table'. Used to mark the end of a minipool ; table. - (VUNSPEC_POOL_1 4) ; `pool-entry(1)'. An entry in the constant pool for + VUNSPEC_POOL_1 ; `pool-entry(1)'. An entry in the constant pool for ; an 8-bit object. - (VUNSPEC_POOL_2 5) ; `pool-entry(2)'. An entry in the constant pool for + VUNSPEC_POOL_2 ; `pool-entry(2)'. An entry in the constant pool for ; a 16-bit object. - (VUNSPEC_POOL_4 6) ; `pool-entry(4)'. An entry in the constant pool for + VUNSPEC_POOL_4 ; `pool-entry(4)'. An entry in the constant pool for ; a 32-bit object. - (VUNSPEC_POOL_8 7) ; `pool-entry(8)'. An entry in the constant pool for + VUNSPEC_POOL_8 ; `pool-entry(8)'. An entry in the constant pool for ; a 64-bit object. - (VUNSPEC_POOL_16 8) ; `pool-entry(16)'. An entry in the constant pool for + VUNSPEC_POOL_16 ; `pool-entry(16)'. An entry in the constant pool for ; a 128-bit object. - (VUNSPEC_TMRC 9) ; Used by the iWMMXt TMRC instruction. - (VUNSPEC_TMCR 10) ; Used by the iWMMXt TMCR instruction. - (VUNSPEC_ALIGN8 11) ; 8-byte alignment version of VUNSPEC_ALIGN - (VUNSPEC_WCMP_EQ 12) ; Used by the iWMMXt WCMPEQ instructions - (VUNSPEC_WCMP_GTU 13) ; Used by the iWMMXt WCMPGTU instructions - (VUNSPEC_WCMP_GT 14) ; Used by the iwMMXT WCMPGT instructions - (VUNSPEC_EH_RETURN 20); Use to override the return address for exception - ; handling. - (VUNSPEC_SYNC_COMPARE_AND_SWAP 21) ; Represent an atomic compare swap. - (VUNSPEC_SYNC_LOCK 22) ; Represent a sync_lock_test_and_set. - (VUNSPEC_SYNC_OP 23) ; Represent a sync_ - (VUNSPEC_SYNC_NEW_OP 24) ; Represent a sync_new_ - (VUNSPEC_SYNC_OLD_OP 25) ; Represent a sync_old_ + 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. ] ) Index: gcc/config/arm/sync.md =================================================================== --- gcc/config/arm/sync.md 2011-01-05 15:12:07.000000000 +0000 +++ gcc/config/arm/sync.md 2011-03-29 09:55:52.000000000 +0100 @@ -24,6 +24,15 @@ ;; AND/OR sequences into the synchronization loop to mask out the ;; relevant component of an SI access. +(define_c_enum "unspecv" + [VUNSPEC_SYNC_COMPARE_AND_SWAP ; Represent an atomic compare swap. + VUNSPEC_SYNC_LOCK ; Represent a sync_lock_test_and_set. + VUNSPEC_SYNC_OP ; Represent a sync_ + VUNSPEC_SYNC_NEW_OP ; Represent a sync_new_ + VUNSPEC_SYNC_OLD_OP ; Represent a sync_old_ + ] +) + (define_expand "memory_barrier" [(set (match_dup 0) (unspec:BLK [(match_dup 0)] UNSPEC_MEMORY_BARRIER))]