annotate gcc/config/gcn/gcn.md @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 1830386684a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1 ;; Copyright (C) 2016-2020 Free Software Foundation, Inc.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3 ;; This file is free software; you can redistribute it and/or modify it under
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
4 ;; the terms of the GNU General Public License as published by the Free
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
5 ;; Software Foundation; either version 3 of the License, or (at your option)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
6 ;; any later version.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
7
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
8 ;; This file is distributed in the hope that it will be useful, but WITHOUT
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
9 ;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
10 ;; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
11 ;; for more details.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
12
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
13 ;; You should have received a copy of the GNU General Public License
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
14 ;; along with GCC; see the file COPYING3. If not see
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
15 ;; <http://www.gnu.org/licenses/>.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
16
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
17 ;;- See file "rtl.def" for documentation on define_insn, match_*, et. al.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
18
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
19 (include "predicates.md")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
20 (include "constraints.md")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
21
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
22 ;; {{{ Constants and enums
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
23
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
24 ; Named registers
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
25 (define_constants
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
26 [(FIRST_SGPR_REG 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
27 (CC_SAVE_REG 22)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
28 (LAST_SGPR_REG 101)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
29 (FLAT_SCRATCH_REG 102)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
30 (FLAT_SCRATCH_LO_REG 102)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
31 (FLAT_SCRATCH_HI_REG 103)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
32 (XNACK_MASK_REG 104)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
33 (XNACK_MASK_LO_REG 104)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
34 (XNACK_MASK_HI_REG 105)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
35 (VCC_REG 106)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
36 (VCC_LO_REG 106)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
37 (VCC_HI_REG 107)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
38 (VCCZ_REG 108)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
39 (TBA_REG 109)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
40 (TBA_LO_REG 109)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
41 (TBA_HI_REG 110)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
42 (TMA_REG 111)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
43 (TMA_LO_REG 111)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
44 (TMA_HI_REG 112)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
45 (TTMP0_REG 113)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
46 (TTMP11_REG 124)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
47 (M0_REG 125)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
48 (EXEC_REG 126)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
49 (EXEC_LO_REG 126)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
50 (EXEC_HI_REG 127)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
51 (EXECZ_REG 128)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
52 (SCC_REG 129)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
53 (FIRST_VGPR_REG 160)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
54 (LAST_VGPR_REG 415)])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
55
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
56 (define_constants
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
57 [(SP_REGNUM 16)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
58 (LR_REGNUM 18)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
59 (AP_REGNUM 416)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
60 (FP_REGNUM 418)])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
61
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
62 (define_c_enum "unspecv" [
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
63 UNSPECV_PROLOGUE_USE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
64 UNSPECV_KERNEL_RETURN
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
65 UNSPECV_BARRIER
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
66 UNSPECV_ATOMIC
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
67 UNSPECV_ICACHE_INV])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
68
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
69 (define_c_enum "unspec" [
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
70 UNSPEC_VECTOR
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
71 UNSPEC_BPERMUTE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
72 UNSPEC_SGPRBASE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
73 UNSPEC_MEMORY_BARRIER
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
74 UNSPEC_SMIN_DPP_SHR UNSPEC_SMAX_DPP_SHR
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
75 UNSPEC_UMIN_DPP_SHR UNSPEC_UMAX_DPP_SHR
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
76 UNSPEC_PLUS_DPP_SHR
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
77 UNSPEC_PLUS_CARRY_DPP_SHR UNSPEC_PLUS_CARRY_IN_DPP_SHR
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
78 UNSPEC_AND_DPP_SHR UNSPEC_IOR_DPP_SHR UNSPEC_XOR_DPP_SHR
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
79 UNSPEC_MOV_FROM_LANE63
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
80 UNSPEC_GATHER
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
81 UNSPEC_SCATTER])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
82
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
83 ;; }}}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
84 ;; {{{ Attributes
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
85
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
86 ; Instruction type (encoding) as described in the ISA specification.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
87 ; The following table summarizes possible operands of individual instruction
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
88 ; types and corresponding constraints.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
89 ;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
90 ; sop2 - scalar, two inputs, one output
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
91 ; ssrc0/ssrc1: sgpr 0-102; flat_scratch,xnack,vcc,tba,tma,ttmp0-11,exec
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
92 ; vccz,execz,scc,inline immedate,fp inline immediate
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
93 ; sdst: sgpr 0-102; flat_scratch,xnack,vcc,tba,tma,ttmp0-11,exec
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
94 ;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
95 ; Constraints "=SD, SD", "SSA,SSB","SSB,SSA"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
96 ;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
97 ; sopk - scalar, inline constant input, one output
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
98 ; simm16: 16bit inline constant
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
99 ; sdst: same as sop2/ssrc0
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
100 ;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
101 ; Constraints "=SD", "J"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
102 ;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
103 ; sop1 - scalar, one input, one output
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
104 ; ssrc0: same as sop2/ssrc0. FIXME: manual omit VCCZ
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
105 ; sdst: same as sop2/sdst
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
106 ;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
107 ; Constraints "=SD", "SSA"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
108 ;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
109 ; sopc - scalar, two inputs, one comparsion
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
110 ; ssrc0: same as sop2/ssc0.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
111 ;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
112 ; Constraints "SSI,SSA","SSA,SSI"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
113 ;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
114 ; sopp - scalar, one constant input, one special
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
115 ; simm16
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
116 ;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
117 ; smem - scalar memory
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
118 ; sbase: aligned pair of sgprs. Specify {size[15:0], base[47:0]} in
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
119 ; dwords
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
120 ; sdata: sgpr0-102, flat_scratch, xnack, vcc, tba, tma
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
121 ; offset: sgpr or 20bit unsigned byte offset
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
122 ;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
123 ; vop2 - vector, two inputs, one output
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
124 ; vsrc0: sgpr0-102,flat_scratch,xnack,vcc,tba,ttmp0-11,m0,exec,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
125 ; inline constant -16 to -64, fp inline immediate, vccz, execz,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
126 ; scc, lds, literal constant, vgpr0-255
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
127 ; vsrc1: vgpr0-255
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
128 ; vdst: vgpr0-255
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
129 ; Limitations: At most one SGPR, at most one constant
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
130 ; if constant is used, SGPR must be M0
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
131 ; Only SRC0 can be LDS_DIRECT
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
132 ;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
133 ; constraints: "=v", "vBSv", "v"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
134 ;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
135 ; vop1 - vector, one input, one output
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
136 ; vsrc0: same as vop2/src0
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
137 ; vdst: vgpr0-255
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
138 ;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
139 ; constraints: "=v", "vBSv"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
140 ;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
141 ; vopc - vector, two inputs, one comparsion output;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
142 ; vsrc0: same as vop2/src0
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
143 ; vsrc1: vgpr0-255
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
144 ; vdst:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
145 ;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
146 ; constraints: "vASv", "v"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
147 ;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
148 ; vop3a - vector, three inputs, one output
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
149 ; vdst: vgpr0-255, for v_cmp sgpr or vcc
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
150 ; abs,clamp
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
151 ; vsrc0: sgpr0-102,vcc,tba,ttmp0-11,m0,exec,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
152 ; inline constant -16 to -64, fp inline immediate, vccz, execz,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
153 ; scc, lds_direct
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
154 ; FIXME: really missing 1/pi? really 104 SGPRs
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
155 ;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
156 ; vop3b - vector, three inputs, one vector output, one scalar output
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
157 ; vsrc0,vsrc1,vsrc2: same as vop3a vsrc0
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
158 ; vdst: vgpr0-255
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
159 ; sdst: sgpr0-103/vcc/tba/tma/ttmp0-11
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
160 ;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
161 ; vop_sdwa - second dword for vop1/vop2/vopc for specifying sub-dword address
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
162 ; src0: vgpr0-255
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
163 ; dst_sel: BYTE_0-3, WORD_0-1, DWORD
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
164 ; dst_unused: UNUSED_PAD, UNUSED_SEXT, UNUSED_PRESERVE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
165 ; clamp: true/false
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
166 ; src0_sel: BYTE_0-3, WORD_0-1, DWORD
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
167 ; flags: src0_sext, src0_neg, src0_abs, src1_sel, src1_sext, src1_neg,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
168 ; src1_abs
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
169 ;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
170 ; vop_dpp - second dword for vop1/vop2/vopc for specifying data-parallel ops
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
171 ; src0: vgpr0-255
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
172 ; dpp_ctrl: quad_perm, row_sl0-15, row_sr0-15, row_rr0-15, wf_sl1,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
173 ; wf_rl1, wf_sr1, wf_rr1, row_mirror, row_half_mirror,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
174 ; bcast15, bcast31
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
175 ; flags: src0_neg, src0_abs, src1_neg, src1_abs
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
176 ; bank_mask: 4-bit mask
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
177 ; row_mask: 4-bit mask
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
178 ;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
179 ; ds - Local and global data share instructions.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
180 ; offset0: 8-bit constant
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
181 ; offset1: 8-bit constant
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
182 ; flag: gds
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
183 ; addr: vgpr0-255
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
184 ; data0: vgpr0-255
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
185 ; data1: vgpr0-255
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
186 ; vdst: vgpr0-255
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
187 ;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
188 ; mubuf - Untyped memory buffer operation. First word with LDS, second word
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
189 ; non-LDS.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
190 ; offset: 12-bit constant
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
191 ; vaddr: vgpr0-255
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
192 ; vdata: vgpr0-255
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
193 ; srsrc: sgpr0-102
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
194 ; soffset: sgpr0-102
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
195 ; flags: offen, idxen, glc, lds, slc, tfe
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
196 ;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
197 ; mtbuf - Typed memory buffer operation. Two words
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
198 ; offset: 12-bit constant
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
199 ; dfmt: 4-bit constant
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
200 ; nfmt: 3-bit constant
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
201 ; vaddr: vgpr0-255
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
202 ; vdata: vgpr0-255
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
203 ; srsrc: sgpr0-102
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
204 ; soffset: sgpr0-102
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
205 ; flags: offen, idxen, glc, lds, slc, tfe
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
206 ;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
207 ; flat - flat or global memory operations
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
208 ; flags: glc, slc
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
209 ; addr: vgpr0-255
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
210 ; data: vgpr0-255
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
211 ; vdst: vgpr0-255
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
212 ;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
213 ; mult - expands to multiple instructions (pseudo encoding)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
214 ;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
215 ; vmult - as mult, when a vector instruction is used.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
216
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
217 (define_attr "type"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
218 "unknown,sop1,sop2,sopk,sopc,sopp,smem,ds,vop2,vop1,vopc,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
219 vop3a,vop3b,vop_sdwa,vop_dpp,mubuf,mtbuf,flat,mult,vmult"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
220 (const_string "unknown"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
221
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
222 ; Set if instruction is executed in scalar or vector unit
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
223
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
224 (define_attr "unit" "unknown,scalar,vector"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
225 (cond [(eq_attr "type" "sop1,sop2,sopk,sopc,sopp,smem,mult")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
226 (const_string "scalar")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
227 (eq_attr "type" "vop2,vop1,vopc,vop3a,vop3b,ds,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
228 vop_sdwa,vop_dpp,flat,vmult")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
229 (const_string "vector")]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
230 (const_string "unknown")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
231
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
232 ; All vector instructions run as 64 threads as predicated by the EXEC
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
233 ; register. Scalar operations in vector register require a single lane
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
234 ; enabled, vector moves require a full set of lanes enabled, and most vector
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
235 ; operations handle the lane masking themselves.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
236 ; The md_reorg pass is responsible for ensuring that EXEC is set appropriately
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
237 ; according to the following settings:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
238 ; auto - md_reorg will inspect def/use to determine what to do.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
239 ; none - exec is not needed.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
240 ; single - disable all but lane zero.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
241 ; full - enable all lanes.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
242
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
243 (define_attr "exec" "auto,none,single,full"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
244 (const_string "auto"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
245
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
246 ; Infer the (worst-case) length from the instruction type by default. Many
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
247 ; types can have an optional immediate word following, which we include here.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
248 ; "Multiple" types are counted as two 64-bit instructions. This is just a
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
249 ; default fallback: it can be overridden per-alternative in insn patterns for
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
250 ; greater accuracy.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
251
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
252 (define_attr "length" ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
253 (cond [(eq_attr "type" "sop1") (const_int 8)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
254 (eq_attr "type" "sop2") (const_int 8)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
255 (eq_attr "type" "sopk") (const_int 8)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
256 (eq_attr "type" "sopc") (const_int 8)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
257 (eq_attr "type" "sopp") (const_int 4)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
258 (eq_attr "type" "smem") (const_int 8)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
259 (eq_attr "type" "ds") (const_int 8)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
260 (eq_attr "type" "vop1") (const_int 8)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
261 (eq_attr "type" "vop2") (const_int 8)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
262 (eq_attr "type" "vopc") (const_int 8)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
263 (eq_attr "type" "vop3a") (const_int 8)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
264 (eq_attr "type" "vop3b") (const_int 8)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
265 (eq_attr "type" "vop_sdwa") (const_int 8)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
266 (eq_attr "type" "vop_dpp") (const_int 8)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
267 (eq_attr "type" "flat") (const_int 8)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
268 (eq_attr "type" "mult") (const_int 16)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
269 (eq_attr "type" "vmult") (const_int 16)]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
270 (const_int 4)))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
271
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
272 ; Disable alternatives that only apply to specific ISA variants.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
273
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
274 (define_attr "gcn_version" "gcn3,gcn5" (const_string "gcn3"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
275
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
276 (define_attr "enabled" ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
277 (cond [(eq_attr "gcn_version" "gcn3") (const_int 1)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
278 (and (eq_attr "gcn_version" "gcn5")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
279 (ne (symbol_ref "TARGET_GCN5_PLUS") (const_int 0)))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
280 (const_int 1)]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
281 (const_int 0)))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
282
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
283 ; We need to be able to identify v_readlane and v_writelane with
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
284 ; SGPR lane selection in order to handle "Manually Inserted Wait States".
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
285
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
286 (define_attr "laneselect" "yes,no" (const_string "no"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
287
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
288 ; Identify instructions that require a "Manually Inserted Wait State" if
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
289 ; their inputs are overwritten by subsequent instructions.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
290
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
291 (define_attr "delayeduse" "yes,no" (const_string "no"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
292
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
293 ;; }}}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
294 ;; {{{ Iterators useful across the wole machine description
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
295
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
296 (define_mode_iterator SIDI [SI DI])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
297 (define_mode_iterator SFDF [SF DF])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
298 (define_mode_iterator SISF [SI SF])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
299 (define_mode_iterator QIHI [QI HI])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
300 (define_mode_iterator DIDF [DI DF])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
301
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
302 ;; }}}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
303 ;; {{{ Attributes.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
304
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
305 ; Translate RTX code into GCN instruction mnemonics with and without
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
306 ; suffixes such as _b32, etc.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
307
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
308 (define_code_attr mnemonic
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
309 [(minus "sub%i")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
310 (plus "add%i")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
311 (ashift "lshl%b")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
312 (lshiftrt "lshr%b")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
313 (ashiftrt "ashr%i")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
314 (and "and%B")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
315 (ior "or%B")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
316 (xor "xor%B")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
317 (mult "mul%i")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
318 (smin "min%i")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
319 (smax "max%i")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
320 (umin "min%u")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
321 (umax "max%u")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
322 (not "not%b")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
323 (popcount "bcnt_u32%b")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
324
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
325 (define_code_attr bare_mnemonic
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
326 [(plus "add")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
327 (minus "sub")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
328 (and "and")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
329 (ior "or")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
330 (xor "xor")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
331
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
332 (define_code_attr s_mnemonic
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
333 [(not "not%b")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
334 (popcount "bcnt1_i32%b")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
335 (clz "flbit_i32%b")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
336 (ctz "ff1_i32%b")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
337
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
338 (define_code_attr revmnemonic
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
339 [(minus "subrev%i")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
340 (ashift "lshlrev%b")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
341 (lshiftrt "lshrrev%b")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
342 (ashiftrt "ashrrev%i")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
343
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
344 ; Translate RTX code into corresponding expander name.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
345
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
346 (define_code_attr expander
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
347 [(and "and")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
348 (ior "ior")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
349 (xor "xor")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
350 (plus "add")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
351 (minus "sub")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
352 (ashift "ashl")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
353 (lshiftrt "lshr")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
354 (ashiftrt "ashr")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
355 (mult "mul")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
356 (smin "smin")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
357 (smax "smax")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
358 (umin "umin")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
359 (umax "umax")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
360 (not "one_cmpl")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
361 (popcount "popcount")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
362 (clz "clz")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
363 (ctz "ctz")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
364 (sign_extend "extend")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
365 (zero_extend "zero_extend")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
366
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
367 ;; }}}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
368 ;; {{{ Miscellaneous instructions
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
369
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
370 (define_insn "nop"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
371 [(const_int 0)]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
372 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
373 "s_nop\t0x0"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
374 [(set_attr "type" "sopp")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
375
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
376 ; FIXME: What should the value of the immediate be? Zero is disallowed, so
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
377 ; pick 1 for now.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
378 (define_insn "trap"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
379 [(trap_if (const_int 1) (const_int 0))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
380 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
381 "s_trap\t1"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
382 [(set_attr "type" "sopp")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
383
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
384 ;; }}}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
385 ;; {{{ Moves
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
386
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
387 ;; All scalar modes we support moves in.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
388 (define_mode_iterator MOV_MODE [BI QI HI SI DI TI SF DF])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
389
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
390 ; This is the entry point for creating all kinds of scalar moves,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
391 ; including reloads and symbols.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
392
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
393 (define_expand "mov<mode>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
394 [(set (match_operand:MOV_MODE 0 "nonimmediate_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
395 (match_operand:MOV_MODE 1 "general_operand"))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
396 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
397 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
398 if (MEM_P (operands[0]))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
399 operands[1] = force_reg (<MODE>mode, operands[1]);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
400
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
401 if (!lra_in_progress && !reload_completed
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
402 && !gcn_valid_move_p (<MODE>mode, operands[0], operands[1]))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
403 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
404 /* Something is probably trying to generate a move
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
405 which can only work indirectly.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
406 E.g. Move from LDS memory to SGPR hardreg
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
407 or MEM:QI to SGPR. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
408 rtx tmpreg = gen_reg_rtx (<MODE>mode);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
409 emit_insn (gen_mov<mode> (tmpreg, operands[1]));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
410 emit_insn (gen_mov<mode> (operands[0], tmpreg));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
411 DONE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
412 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
413
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
414 if (<MODE>mode == DImode
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
415 && (GET_CODE (operands[1]) == SYMBOL_REF
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
416 || GET_CODE (operands[1]) == LABEL_REF))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
417 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
418 if (lra_in_progress)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
419 emit_insn (gen_movdi_symbol_save_scc (operands[0], operands[1]));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
420 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
421 emit_insn (gen_movdi_symbol (operands[0], operands[1]));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
422 DONE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
423 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
424 })
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
425
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
426 ; Split invalid moves into two valid moves
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
427
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
428 (define_split
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
429 [(set (match_operand:MOV_MODE 0 "nonimmediate_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
430 (match_operand:MOV_MODE 1 "general_operand"))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
431 "!reload_completed && !lra_in_progress
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
432 && !gcn_valid_move_p (<MODE>mode, operands[0], operands[1])"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
433 [(set (match_dup 2) (match_dup 1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
434 (set (match_dup 0) (match_dup 2))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
435 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
436 operands[2] = gen_reg_rtx(<MODE>mode);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
437 })
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
438
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
439 ; We need BImode move so we can reload flags registers.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
440
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
441 (define_insn "*movbi"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
442 [(set (match_operand:BI 0 "nonimmediate_operand"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
443 "=Sg, v,Sg,cs,cV,cV,Sm,RS, v,RF, v,RM")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
444 (match_operand:BI 1 "gcn_load_operand"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
445 "SSA,vSvA, v,SS, v,SS,RS,Sm,RF, v,RM, v"))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
446 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
447 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
448 /* SCC as an operand is currently not accepted by the LLVM assembler, so
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
449 we emit bytes directly as a workaround. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
450 switch (which_alternative) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
451 case 0:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
452 if (REG_P (operands[1]) && REGNO (operands[1]) == SCC_REG)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
453 return "; s_mov_b32\t%0,%1 is not supported by the assembler.\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
454 ".byte\t0xfd\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
455 ".byte\t0x0\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
456 ".byte\t0x80|%R0\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
457 ".byte\t0xbe";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
458 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
459 return "s_mov_b32\t%0, %1";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
460 case 1:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
461 if (REG_P (operands[1]) && REGNO (operands[1]) == SCC_REG)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
462 return "; v_mov_b32\t%0, %1\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
463 ".byte\t0xfd\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
464 ".byte\t0x2\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
465 ".byte\t((%V0<<1)&0xff)\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
466 ".byte\t0x7e|(%V0>>7)";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
467 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
468 return "v_mov_b32\t%0, %1";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
469 case 2:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
470 return "v_readlane_b32\t%0, %1, 0";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
471 case 3:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
472 return "s_cmpk_lg_u32\t%1, 0";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
473 case 4:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
474 return "v_cmp_ne_u32\tvcc, 0, %1";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
475 case 5:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
476 if (REGNO (operands[1]) == SCC_REG)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
477 return "; s_mov_b32\t%0, %1 is not supported by the assembler.\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
478 ".byte\t0xfd\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
479 ".byte\t0x0\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
480 ".byte\t0xea\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
481 ".byte\t0xbe\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
482 "s_mov_b32\tvcc_hi, 0";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
483 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
484 return "s_mov_b32\tvcc_lo, %1\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
485 "s_mov_b32\tvcc_hi, 0";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
486 case 6:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
487 return "s_load_dword\t%0, %A1\;s_waitcnt\tlgkmcnt(0)";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
488 case 7:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
489 return "s_store_dword\t%1, %A0";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
490 case 8:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
491 return "flat_load_dword\t%0, %A1%O1%g1\;s_waitcnt\t0";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
492 case 9:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
493 return "flat_store_dword\t%A0, %1%O0%g0";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
494 case 10:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
495 return "global_load_dword\t%0, %A1%O1%g1\;s_waitcnt\tvmcnt(0)";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
496 case 11:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
497 return "global_store_dword\t%A0, %1%O0%g0";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
498 default:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
499 gcc_unreachable ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
500 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
501 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
502 [(set_attr "type" "sop1,vop1,vop3a,sopk,vopc,mult,smem,smem,flat,flat,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
503 flat,flat")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
504 (set_attr "exec" "*,*,none,*,*,*,*,*,*,*,*,*")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
505 (set_attr "length" "4,4,4,4,4,8,12,12,12,12,12,12")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
506
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
507 ; 32bit move pattern
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
508
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
509 (define_insn "*mov<mode>_insn"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
510 [(set (match_operand:SISF 0 "nonimmediate_operand"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
511 "=SD,SD,SD,SD,RB,Sm,RS,v,Sg, v, v,RF,v,RLRG, v,SD, v,RM")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
512 (match_operand:SISF 1 "gcn_load_operand"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
513 "SSA, J, B,RB,Sm,RS,Sm,v, v,Sv,RF, v,B, v,RLRG, Y,RM, v"))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
514 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
515 "@
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
516 s_mov_b32\t%0, %1
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
517 s_movk_i32\t%0, %1
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
518 s_mov_b32\t%0, %1
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
519 s_buffer_load%s0\t%0, s[0:3], %1\;s_waitcnt\tlgkmcnt(0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
520 s_buffer_store%s1\t%1, s[0:3], %0
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
521 s_load_dword\t%0, %A1\;s_waitcnt\tlgkmcnt(0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
522 s_store_dword\t%1, %A0
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
523 v_mov_b32\t%0, %1
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
524 v_readlane_b32\t%0, %1, 0
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
525 v_writelane_b32\t%0, %1, 0
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
526 flat_load_dword\t%0, %A1%O1%g1\;s_waitcnt\t0
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
527 flat_store_dword\t%A0, %1%O0%g0
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
528 v_mov_b32\t%0, %1
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
529 ds_write_b32\t%A0, %1%O0
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
530 ds_read_b32\t%0, %A1%O1\;s_waitcnt\tlgkmcnt(0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
531 s_mov_b32\t%0, %1
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
532 global_load_dword\t%0, %A1%O1%g1\;s_waitcnt\tvmcnt(0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
533 global_store_dword\t%A0, %1%O0%g0"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
534 [(set_attr "type" "sop1,sopk,sop1,smem,smem,smem,smem,vop1,vop3a,vop3a,flat,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
535 flat,vop1,ds,ds,sop1,flat,flat")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
536 (set_attr "exec" "*,*,*,*,*,*,*,*,none,none,*,*,*,*,*,*,*,*")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
537 (set_attr "length" "4,4,8,12,12,12,12,4,8,8,12,12,8,12,12,8,12,12")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
538
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
539 ; 8/16bit move pattern
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
540
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
541 (define_insn "*mov<mode>_insn"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
542 [(set (match_operand:QIHI 0 "nonimmediate_operand"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
543 "=SD,SD,SD,v,Sg, v, v,RF,v,RLRG, v, v,RM")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
544 (match_operand:QIHI 1 "gcn_load_operand"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
545 "SSA, J, B,v, v,Sv,RF, v,B, v,RLRG,RM, v"))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
546 "gcn_valid_move_p (<MODE>mode, operands[0], operands[1])"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
547 "@
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
548 s_mov_b32\t%0, %1
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
549 s_movk_i32\t%0, %1
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
550 s_mov_b32\t%0, %1
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
551 v_mov_b32\t%0, %1
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
552 v_readlane_b32\t%0, %1, 0
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
553 v_writelane_b32\t%0, %1, 0
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
554 flat_load%o1\t%0, %A1%O1%g1\;s_waitcnt\t0
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
555 flat_store%s0\t%A0, %1%O0%g0
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
556 v_mov_b32\t%0, %1
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
557 ds_write%b0\t%A0, %1%O0
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
558 ds_read%u1\t%0, %A1%O1\;s_waitcnt\tlgkmcnt(0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
559 global_load%o1\t%0, %A1%O1%g1\;s_waitcnt\tvmcnt(0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
560 global_store%s0\t%A0, %1%O0%g0"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
561 [(set_attr "type"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
562 "sop1,sopk,sop1,vop1,vop3a,vop3a,flat,flat,vop1,ds,ds,flat,flat")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
563 (set_attr "exec" "*,*,*,*,none,none,*,*,*,*,*,*,*")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
564 (set_attr "length" "4,4,8,4,4,4,12,12,8,12,12,12,12")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
565
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
566 ; 64bit move pattern
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
567
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
568 (define_insn_and_split "*mov<mode>_insn"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
569 [(set (match_operand:DIDF 0 "nonimmediate_operand"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
570 "=SD,SD,SD,RS,Sm,v, v,Sg, v, v,RF,RLRG, v, v,RM")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
571 (match_operand:DIDF 1 "general_operand"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
572 "SSA, C,DB,Sm,RS,v,DB, v,Sv,RF, v, v,RLRG,RM, v"))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
573 "GET_CODE(operands[1]) != SYMBOL_REF"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
574 "@
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
575 s_mov_b64\t%0, %1
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
576 s_mov_b64\t%0, %1
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
577 #
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
578 s_store_dwordx2\t%1, %A0
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
579 s_load_dwordx2\t%0, %A1\;s_waitcnt\tlgkmcnt(0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
580 #
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
581 #
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
582 #
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
583 #
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
584 flat_load_dwordx2\t%0, %A1%O1%g1\;s_waitcnt\t0
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
585 flat_store_dwordx2\t%A0, %1%O0%g0
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
586 ds_write_b64\t%A0, %1%O0
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
587 ds_read_b64\t%0, %A1%O1\;s_waitcnt\tlgkmcnt(0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
588 global_load_dwordx2\t%0, %A1%O1%g1\;s_waitcnt\tvmcnt(0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
589 global_store_dwordx2\t%A0, %1%O0%g0"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
590 "(reload_completed && !MEM_P (operands[0]) && !MEM_P (operands[1])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
591 && !gcn_sgpr_move_p (operands[0], operands[1]))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
592 || (GET_CODE (operands[1]) == CONST_INT && !gcn_constant64_p (operands[1]))"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
593 [(set (match_dup 0) (match_dup 1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
594 (set (match_dup 2) (match_dup 3))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
595 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
596 rtx inlo = gen_lowpart (SImode, operands[1]);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
597 rtx inhi = gen_highpart_mode (SImode, <MODE>mode, operands[1]);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
598 rtx outlo = gen_lowpart (SImode, operands[0]);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
599 rtx outhi = gen_highpart_mode (SImode, <MODE>mode, operands[0]);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
600
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
601 /* Ensure that overlapping registers aren't corrupted. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
602 if (REGNO (outlo) == REGNO (inhi))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
603 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
604 operands[0] = outhi;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
605 operands[1] = inhi;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
606 operands[2] = outlo;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
607 operands[3] = inlo;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
608 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
609 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
610 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
611 operands[0] = outlo;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
612 operands[1] = inlo;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
613 operands[2] = outhi;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
614 operands[3] = inhi;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
615 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
616 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
617 [(set_attr "type" "sop1,sop1,mult,smem,smem,vmult,vmult,vmult,vmult,flat,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
618 flat,ds,ds,flat,flat")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
619 (set_attr "length" "4,8,*,12,12,*,*,*,*,12,12,12,12,12,12")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
620
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
621 ; 128-bit move.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
622
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
623 (define_insn_and_split "*movti_insn"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
624 [(set (match_operand:TI 0 "nonimmediate_operand"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
625 "=SD,RS,Sm,RF, v,v, v,SD,RM, v,RL, v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
626 (match_operand:TI 1 "general_operand"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
627 "SSB,Sm,RS, v,RF,v,Sv, v, v,RM, v,RL"))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
628 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
629 "@
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
630 #
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
631 s_store_dwordx4\t%1, %A0
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
632 s_load_dwordx4\t%0, %A1\;s_waitcnt\tlgkmcnt(0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
633 flat_store_dwordx4\t%A0, %1%O0%g0
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
634 flat_load_dwordx4\t%0, %A1%O1%g1\;s_waitcnt\t0
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
635 #
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
636 #
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
637 #
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
638 global_store_dwordx4\t%A0, %1%O0%g0
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
639 global_load_dwordx4\t%0, %A1%O1%g1\;s_waitcnt\tvmcnt(0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
640 ds_write_b128\t%A0, %1%O0
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
641 ds_read_b128\t%0, %A1%O1\;s_waitcnt\tlgkmcnt(0)"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
642 "reload_completed
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
643 && REG_P (operands[0])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
644 && (REG_P (operands[1]) || GET_CODE (operands[1]) == CONST_INT)"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
645 [(set (match_dup 0) (match_dup 1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
646 (set (match_dup 2) (match_dup 3))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
647 (set (match_dup 4) (match_dup 5))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
648 (set (match_dup 6) (match_dup 7))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
649 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
650 operands[6] = gcn_operand_part (TImode, operands[0], 3);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
651 operands[7] = gcn_operand_part (TImode, operands[1], 3);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
652 operands[4] = gcn_operand_part (TImode, operands[0], 2);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
653 operands[5] = gcn_operand_part (TImode, operands[1], 2);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
654 operands[2] = gcn_operand_part (TImode, operands[0], 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
655 operands[3] = gcn_operand_part (TImode, operands[1], 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
656 operands[0] = gcn_operand_part (TImode, operands[0], 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
657 operands[1] = gcn_operand_part (TImode, operands[1], 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
658 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
659 [(set_attr "type" "mult,smem,smem,flat,flat,vmult,vmult,vmult,flat,flat,\
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
660 ds,ds")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
661 (set_attr "delayeduse" "*,*,yes,*,*,*,*,*,yes,*,*,*")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
662 (set_attr "length" "*,12,12,12,12,*,*,*,12,12,12,12")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
663
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
664 ;; }}}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
665 ;; {{{ Prologue/Epilogue
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
666
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
667 (define_insn "prologue_use"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
668 [(unspec_volatile [(match_operand 0)] UNSPECV_PROLOGUE_USE)]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
669 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
670 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
671 [(set_attr "length" "0")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
672
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
673 (define_expand "prologue"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
674 [(const_int 0)]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
675 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
676 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
677 gcn_expand_prologue ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
678 DONE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
679 })
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
680
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
681 (define_expand "epilogue"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
682 [(const_int 0)]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
683 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
684 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
685 gcn_expand_epilogue ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
686 DONE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
687 })
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
688
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
689 ;; }}}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
690 ;; {{{ Control flow
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
691
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
692 ; This pattern must satisfy simplejump_p, which means it cannot be a parallel
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
693 ; that clobbers SCC. Thus, we must preserve SCC if we're generating a long
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
694 ; branch sequence.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
695
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
696 (define_insn "jump"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
697 [(set (pc)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
698 (label_ref (match_operand 0)))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
699 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
700 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
701 if (get_attr_length (insn) == 4)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
702 return "s_branch\t%0";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
703 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
704 /* !!! This sequence clobbers EXEC_SAVE_REG and CC_SAVE_REG. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
705 return "; s_mov_b32\ts22, scc is not supported by the assembler.\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
706 ".long\t0xbe9600fd\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
707 "s_getpc_b64\ts[20:21]\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
708 "s_add_u32\ts20, s20, %0@rel32@lo+4\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
709 "s_addc_u32\ts21, s21, %0@rel32@hi+4\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
710 "s_cmpk_lg_u32\ts22, 0\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
711 "s_setpc_b64\ts[20:21]";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
712 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
713 [(set_attr "type" "sopp")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
714 (set (attr "length")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
715 (if_then_else (and (ge (minus (match_dup 0) (pc))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
716 (const_int -131072))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
717 (lt (minus (match_dup 0) (pc))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
718 (const_int 131072)))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
719 (const_int 4)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
720 (const_int 32)))])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
721
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
722 (define_insn "indirect_jump"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
723 [(set (pc)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
724 (match_operand:DI 0 "register_operand" "Sg"))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
725 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
726 "s_setpc_b64\t%0"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
727 [(set_attr "type" "sop1")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
728 (set_attr "length" "4")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
729
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
730 (define_insn "cjump"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
731 [(set (pc)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
732 (if_then_else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
733 (match_operator:BI 1 "gcn_conditional_operator"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
734 [(match_operand:BI 2 "gcn_conditional_register_operand" "ca,cV")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
735 (const_int 0)])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
736 (label_ref (match_operand 0))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
737 (pc)))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
738 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
739 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
740 if (get_attr_length (insn) == 4)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
741 return "s_cbranch%C1\t%0";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
742 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
743 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
744 /* !!! This sequence clobbers EXEC_SAVE_REG and CC_SAVE_REG but
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
745 restores SCC. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
746 if (REGNO (operands[2]) == SCC_REG)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
747 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
748 if (GET_CODE (operands[1]) == EQ)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
749 return "s_cbranch%c1\t.Lskip%=\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
750 "s_getpc_b64\ts[20:21]\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
751 "s_add_u32\ts20, s20, %0@rel32@lo+4\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
752 "s_addc_u32\ts21, s21, %0@rel32@hi+4\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
753 "s_cmp_lg_u32\t0, 0\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
754 "s_setpc_b64\ts[20:21]\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
755 ".Lskip%=:";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
756 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
757 return "s_cbranch%c1\t.Lskip%=\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
758 "s_getpc_b64\ts[20:21]\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
759 "s_add_u32\ts20, s20, %0@rel32@lo+4\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
760 "s_addc_u32\ts21, s21, %0@rel32@hi+4\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
761 "s_cmp_eq_u32\t0, 0\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
762 "s_setpc_b64\ts[20:21]\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
763 ".Lskip%=:";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
764 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
765 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
766 return "s_cbranch%c1\t.Lskip%=\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
767 "; s_mov_b32\ts22, scc is not supported by the assembler.\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
768 ".byte\t0xfd\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
769 ".byte\t0x0\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
770 ".byte\t0x80|22\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
771 ".byte\t0xbe\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
772 "s_getpc_b64\ts[20:21]\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
773 "s_add_u32\ts20, s20, %0@rel32@lo+4\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
774 "s_addc_u32\ts21, s21, %0@rel32@hi+4\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
775 "s_cmpk_lg_u32\ts22, 0\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
776 "s_setpc_b64\ts[20:21]\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
777 ".Lskip%=:";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
778 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
779 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
780 [(set_attr "type" "sopp")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
781 (set (attr "length")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
782 (if_then_else (and (ge (minus (match_dup 0) (pc))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
783 (const_int -131072))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
784 (lt (minus (match_dup 0) (pc))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
785 (const_int 131072)))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
786 (const_int 4)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
787 (const_int 36)))])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
788
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
789 ; Returning from a normal function is different to returning from a
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
790 ; kernel function.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
791
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
792 (define_insn "gcn_return"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
793 [(return)]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
794 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
795 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
796 if (cfun && cfun->machine && cfun->machine->normal_function)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
797 return "s_setpc_b64\ts[18:19]";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
798 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
799 return "s_waitcnt\tlgkmcnt(0)\;s_dcache_wb\;s_endpgm";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
800 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
801 [(set_attr "type" "sop1")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
802 (set_attr "length" "12")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
803
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
804 (define_expand "call"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
805 [(parallel [(call (match_operand 0 "")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
806 (match_operand 1 ""))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
807 (clobber (reg:DI LR_REGNUM))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
808 (clobber (match_scratch:DI 2))])]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
809 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
810 {})
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
811
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
812 (define_insn "gcn_simple_call"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
813 [(call (mem (match_operand 0 "immediate_operand" "Y,B"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
814 (match_operand 1 "const_int_operand"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
815 (clobber (reg:DI LR_REGNUM))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
816 (clobber (match_scratch:DI 2 "=&Sg,X"))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
817 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
818 "@
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
819 s_getpc_b64\t%2\;s_add_u32\t%L2, %L2, %0@rel32@lo+4\;s_addc_u32\t%H2, %H2, %0@rel32@hi+4\;s_swappc_b64\ts[18:19], %2
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
820 s_swappc_b64\ts[18:19], %0"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
821 [(set_attr "type" "mult,sop1")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
822 (set_attr "length" "24,4")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
823
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
824 (define_insn "movdi_symbol"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
825 [(set (match_operand:DI 0 "nonimmediate_operand" "=Sg")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
826 (match_operand:DI 1 "general_operand" "Y"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
827 (clobber (reg:BI SCC_REG))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
828 "GET_CODE (operands[1]) == SYMBOL_REF || GET_CODE (operands[1]) == LABEL_REF"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
829 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
830 if (SYMBOL_REF_P (operands[1])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
831 && SYMBOL_REF_WEAK (operands[1]))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
832 return "s_getpc_b64\t%0\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
833 "s_add_u32\t%L0, %L0, %1@gotpcrel32@lo+4\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
834 "s_addc_u32\t%H0, %H0, %1@gotpcrel32@hi+4\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
835 "s_load_dwordx2\t%0, %0\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
836 "s_waitcnt\tlgkmcnt(0)";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
837
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
838 return "s_getpc_b64\t%0\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
839 "s_add_u32\t%L0, %L0, %1@rel32@lo+4\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
840 "s_addc_u32\t%H0, %H0, %1@rel32@hi+4";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
841 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
842 [(set_attr "type" "mult")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
843 (set_attr "length" "32")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
844
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
845 (define_insn "movdi_symbol_save_scc"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
846 [(set (match_operand:DI 0 "nonimmediate_operand" "=Sg")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
847 (match_operand:DI 1 "general_operand" "Y"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
848 (clobber (reg:BI CC_SAVE_REG))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
849 "(GET_CODE (operands[1]) == SYMBOL_REF || GET_CODE (operands[1]) == LABEL_REF)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
850 && (lra_in_progress || reload_completed)"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
851 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
852 /* !!! These sequences clobber CC_SAVE_REG. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
853
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
854 if (SYMBOL_REF_P (operands[1])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
855 && SYMBOL_REF_WEAK (operands[1]))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
856 return "; s_mov_b32\ts22, scc is not supported by the assembler.\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
857 ".long\t0xbe9600fd\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
858 "s_getpc_b64\t%0\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
859 "s_add_u32\t%L0, %L0, %1@gotpcrel32@lo+4\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
860 "s_addc_u32\t%H0, %H0, %1@gotpcrel32@hi+4\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
861 "s_load_dwordx2\t%0, %0\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
862 "s_cmpk_lg_u32\ts22, 0\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
863 "s_waitcnt\tlgkmcnt(0)";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
864
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
865 return "; s_mov_b32\ts22, scc is not supported by the assembler.\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
866 ".long\t0xbe9600fd\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
867 "s_getpc_b64\t%0\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
868 "s_add_u32\t%L0, %L0, %1@rel32@lo+4\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
869 "s_addc_u32\t%H0, %H0, %1@rel32@hi+4\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
870 "s_cmpk_lg_u32\ts22, 0";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
871 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
872 [(set_attr "type" "mult")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
873 (set_attr "length" "40")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
874
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
875
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
876 (define_insn "gcn_indirect_call"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
877 [(call (mem (match_operand:DI 0 "register_operand" "Sg"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
878 (match_operand 1 "" ""))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
879 (clobber (reg:DI LR_REGNUM))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
880 (clobber (match_scratch:DI 2 "=X"))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
881 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
882 "s_swappc_b64\ts[18:19], %0"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
883 [(set_attr "type" "sop1")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
884 (set_attr "length" "4")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
885
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
886 (define_expand "call_value"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
887 [(parallel [(set (match_operand 0 "")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
888 (call (match_operand 1 "")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
889 (match_operand 2 "")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
890 (clobber (reg:DI LR_REGNUM))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
891 (clobber (match_scratch:DI 3))])]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
892 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
893 {})
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
894
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
895 (define_insn "gcn_call_value"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
896 [(set (match_operand 0 "register_operand" "=Sg,Sg")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
897 (call (mem (match_operand 1 "immediate_operand" "Y,B"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
898 (match_operand 2 "const_int_operand")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
899 (clobber (reg:DI LR_REGNUM))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
900 (clobber (match_scratch:DI 3 "=&Sg,X"))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
901 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
902 "@
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
903 s_getpc_b64\t%3\;s_add_u32\t%L3, %L3, %1@rel32@lo+4\;s_addc_u32\t%H3, %H3, %1@rel32@hi+4\;s_swappc_b64\ts[18:19], %3
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
904 s_swappc_b64\ts[18:19], %1"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
905 [(set_attr "type" "sop1")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
906 (set_attr "length" "24")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
907
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
908 (define_insn "gcn_call_value_indirect"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
909 [(set (match_operand 0 "register_operand" "=Sg")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
910 (call (mem (match_operand:DI 1 "register_operand" "Sg"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
911 (match_operand 2 "" "")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
912 (clobber (reg:DI LR_REGNUM))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
913 (clobber (match_scratch:DI 3 "=X"))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
914 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
915 "s_swappc_b64\ts[18:19], %1"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
916 [(set_attr "type" "sop1")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
917 (set_attr "length" "4")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
918
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
919 ; GCN does not have an instruction to clear only part of the instruction
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
920 ; cache, so the operands are ignored.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
921
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
922 (define_insn "clear_icache"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
923 [(unspec_volatile
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
924 [(match_operand 0 "") (match_operand 1 "")]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
925 UNSPECV_ICACHE_INV)]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
926 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
927 "s_icache_inv"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
928 [(set_attr "type" "sopp")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
929 (set_attr "length" "4")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
930
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
931 ;; }}}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
932 ;; {{{ Conditionals
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
933
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
934 ; 32-bit compare, scalar unit only
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
935
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
936 (define_insn "cstoresi4"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
937 [(set (match_operand:BI 0 "gcn_conditional_register_operand"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
938 "=cs, cs, cs, cs")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
939 (match_operator:BI 1 "gcn_compare_operator"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
940 [(match_operand:SI 2 "gcn_alu_operand" "SSA,SSA,SSB, SS")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
941 (match_operand:SI 3 "gcn_alu_operand" "SSA,SSL, SS,SSB")]))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
942 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
943 "@
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
944 s_cmp%D1\t%2, %3
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
945 s_cmpk%D1\t%2, %3
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
946 s_cmp%D1\t%2, %3
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
947 s_cmp%D1\t%2, %3"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
948 [(set_attr "type" "sopc,sopk,sopk,sopk")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
949 (set_attr "length" "4,4,8,8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
950
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
951 (define_expand "cbranchsi4"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
952 [(match_operator 0 "gcn_compare_operator"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
953 [(match_operand:SI 1 "gcn_alu_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
954 (match_operand:SI 2 "gcn_alu_operand")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
955 (match_operand 3)]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
956 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
957 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
958 rtx cc = gen_reg_rtx (BImode);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
959 emit_insn (gen_cstoresi4 (cc, operands[0], operands[1], operands[2]));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
960 emit_jump_insn (gen_cjump (operands[3],
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
961 gen_rtx_NE (BImode, cc, const0_rtx), cc));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
962 DONE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
963 })
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
964
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
965 ; 64-bit compare; either unit, but scalar allows limited operators
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
966
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
967 (define_expand "cstoredi4"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
968 [(set (match_operand:BI 0 "gcn_conditional_register_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
969 (match_operator:BI 1 "gcn_compare_operator"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
970 [(match_operand:DI 2 "gcn_alu_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
971 (match_operand:DI 3 "gcn_alu_operand")]))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
972 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
973 {})
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
974
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
975 (define_insn "cstoredi4_vec_and_scalar"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
976 [(set (match_operand:BI 0 "gcn_conditional_register_operand" "= cs, cV")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
977 (match_operator:BI 1 "gcn_compare_64bit_operator"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
978 [(match_operand:DI 2 "gcn_alu_operand" "%SSA,vSvC")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
979 (match_operand:DI 3 "gcn_alu_operand" " SSC, v")]))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
980 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
981 "@
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
982 s_cmp%D1\t%2, %3
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
983 v_cmp%E1\tvcc, %2, %3"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
984 [(set_attr "type" "sopc,vopc")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
985 (set_attr "length" "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
986
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
987 (define_insn "cstoredi4_vector"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
988 [(set (match_operand:BI 0 "gcn_conditional_register_operand" "= cV")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
989 (match_operator:BI 1 "gcn_compare_operator"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
990 [(match_operand:DI 2 "gcn_alu_operand" "vSvB")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
991 (match_operand:DI 3 "gcn_alu_operand" " v")]))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
992 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
993 "v_cmp%E1\tvcc, %2, %3"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
994 [(set_attr "type" "vopc")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
995 (set_attr "length" "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
996
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
997 (define_expand "cbranchdi4"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
998 [(match_operator 0 "gcn_compare_operator"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
999 [(match_operand:DI 1 "gcn_alu_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1000 (match_operand:DI 2 "gcn_alu_operand")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1001 (match_operand 3)]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1002 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1003 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1004 rtx cc = gen_reg_rtx (BImode);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1005 emit_insn (gen_cstoredi4 (cc, operands[0], operands[1], operands[2]));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1006 emit_jump_insn (gen_cjump (operands[3],
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1007 gen_rtx_NE (BImode, cc, const0_rtx), cc));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1008 DONE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1009 })
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1010
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1011 ; FP compare; vector unit only
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1012
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1013 (define_insn "cstore<mode>4"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1014 [(set (match_operand:BI 0 "gcn_conditional_register_operand" "=cV")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1015 (match_operator:BI 1 "gcn_fp_compare_operator"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1016 [(match_operand:SFDF 2 "gcn_alu_operand" "vB")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1017 (match_operand:SFDF 3 "gcn_alu_operand" "v")]))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1018 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1019 "v_cmp%E1\tvcc, %2, %3"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1020 [(set_attr "type" "vopc")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1021 (set_attr "length" "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1022
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1023 (define_expand "cbranch<mode>4"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1024 [(match_operator 0 "gcn_fp_compare_operator"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1025 [(match_operand:SFDF 1 "gcn_alu_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1026 (match_operand:SFDF 2 "gcn_alu_operand")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1027 (match_operand 3)]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1028 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1029 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1030 rtx cc = gen_reg_rtx (BImode);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1031 emit_insn (gen_cstore<mode>4 (cc, operands[0], operands[1], operands[2]));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1032 emit_jump_insn (gen_cjump (operands[3],
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1033 gen_rtx_NE (BImode, cc, const0_rtx), cc));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1034 DONE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1035 })
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1036
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1037 ;; }}}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1038 ;; {{{ ALU special cases: Plus
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1039
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1040 (define_insn "addsi3"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1041 [(set (match_operand:SI 0 "register_operand" "= Sg, Sg, Sg, v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1042 (plus:SI (match_operand:SI 1 "gcn_alu_operand" "%SgA, 0,SgA, v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1043 (match_operand:SI 2 "gcn_alu_operand" " SgA,SgJ, B,vBSv")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1044 (clobber (match_scratch:BI 3 "= cs, cs, cs, X"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1045 (clobber (match_scratch:DI 4 "= X, X, X, cV"))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1046 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1047 "@
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1048 s_add_i32\t%0, %1, %2
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1049 s_addk_i32\t%0, %2
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1050 s_add_i32\t%0, %1, %2
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1051 v_add%^_u32\t%0, vcc, %2, %1"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1052 [(set_attr "type" "sop2,sopk,sop2,vop2")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1053 (set_attr "length" "4,4,8,8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1054
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1055 (define_expand "addsi3_scc"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1056 [(parallel [(set (match_operand:SI 0 "register_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1057 (plus:SI (match_operand:SI 1 "gcn_alu_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1058 (match_operand:SI 2 "gcn_alu_operand")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1059 (clobber (reg:BI SCC_REG))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1060 (clobber (scratch:DI))])]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1061 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1062 {})
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1063
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1064 ; Having this as an insn_and_split allows us to keep together DImode adds
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1065 ; through some RTL optimisation passes, and means the CC reg we set isn't
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1066 ; dependent on the constraint alternative (which doesn't seem to work well).
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1067
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1068 ; There's an early clobber in the case where "v[0:1]=v[1:2]+?" but
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1069 ; "v[0:1]=v[0:1]+?" is fine (as is "v[1:2]=v[0:1]+?", but that's trickier).
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1070
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1071 ; If v_addc_u32 is used to add with carry, a 32-bit literal constant cannot be
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1072 ; used as an operand due to the read of VCC, so we restrict constants to the
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1073 ; inlinable range for that alternative.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1074
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1075 (define_insn_and_split "adddi3"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1076 [(set (match_operand:DI 0 "register_operand"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1077 "=&Sg,&Sg,&Sg,&Sg,&v,&v,&v,&v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1078 (plus:DI (match_operand:DI 1 "register_operand"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1079 " Sg, 0, 0, Sg, v, 0, 0, v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1080 (match_operand:DI 2 "nonmemory_operand"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1081 " 0,SgB, 0,SgB, 0,vA, 0,vA")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1082 (clobber (match_scratch:BI 3 "= cs, cs, cs, cs, X, X, X, X"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1083 (clobber (match_scratch:DI 4 "= X, X, X, X,cV,cV,cV,cV"))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1084 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1085 "#"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1086 "&& reload_completed"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1087 [(const_int 0)]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1088 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1089 rtx cc = gen_rtx_REG (BImode, gcn_vgpr_register_operand (operands[1],
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1090 DImode)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1091 ? VCC_REG : SCC_REG);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1092
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1093 emit_insn (gen_addsi3_scalar_carry
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1094 (gcn_operand_part (DImode, operands[0], 0),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1095 gcn_operand_part (DImode, operands[1], 0),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1096 gcn_operand_part (DImode, operands[2], 0),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1097 cc));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1098 rtx val = gcn_operand_part (DImode, operands[2], 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1099 if (val != const0_rtx)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1100 emit_insn (gen_addcsi3_scalar
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1101 (gcn_operand_part (DImode, operands[0], 1),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1102 gcn_operand_part (DImode, operands[1], 1),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1103 gcn_operand_part (DImode, operands[2], 1),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1104 cc, cc));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1105 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1106 emit_insn (gen_addcsi3_scalar_zero
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1107 (gcn_operand_part (DImode, operands[0], 1),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1108 gcn_operand_part (DImode, operands[1], 1),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1109 cc));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1110 DONE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1111 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1112 [(set_attr "type" "mult,mult,mult,mult,vmult,vmult,vmult,vmult")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1113 (set_attr "length" "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1114
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1115 (define_expand "adddi3_scc"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1116 [(parallel [(set (match_operand:DI 0 "register_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1117 (plus:DI (match_operand:DI 1 "register_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1118 (match_operand:DI 2 "nonmemory_operand")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1119 (clobber (reg:BI SCC_REG))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1120 (clobber (scratch:DI))])]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1121 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1122 {})
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1123
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1124 ;; Add with carry.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1125
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1126 (define_insn "addsi3_scalar_carry"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1127 [(set (match_operand:SI 0 "register_operand" "= Sg, v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1128 (plus:SI (match_operand:SI 1 "gcn_alu_operand" "%SgA, v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1129 (match_operand:SI 2 "gcn_alu_operand" " SgB,vB")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1130 (set (match_operand:BI 3 "register_operand" "= cs,cV")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1131 (ltu:BI (plus:SI (match_dup 1)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1132 (match_dup 2))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1133 (match_dup 1)))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1134 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1135 "@
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1136 s_add_u32\t%0, %1, %2
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1137 v_add%^_u32\t%0, vcc, %2, %1"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1138 [(set_attr "type" "sop2,vop2")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1139 (set_attr "length" "8,8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1140
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1141 (define_insn "addsi3_scalar_carry_cst"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1142 [(set (match_operand:SI 0 "register_operand" "=Sg, v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1143 (plus:SI (match_operand:SI 1 "gcn_alu_operand" "SgA, v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1144 (match_operand:SI 2 "const_int_operand" " n, n")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1145 (set (match_operand:BI 4 "register_operand" "=cs,cV")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1146 (geu:BI (plus:SI (match_dup 1)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1147 (match_dup 2))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1148 (match_operand:SI 3 "const_int_operand" " n, n")))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1149 "INTVAL (operands[2]) == -INTVAL (operands[3])"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1150 "@
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1151 s_add_u32\t%0, %1, %2
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1152 v_add%^_u32\t%0, vcc, %2, %1"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1153 [(set_attr "type" "sop2,vop2")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1154 (set_attr "length" "4")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1155
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1156 (define_insn "addcsi3_scalar"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1157 [(set (match_operand:SI 0 "register_operand" "= Sg, v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1158 (plus:SI (plus:SI (zero_extend:SI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1159 (match_operand:BI 3 "register_operand" "= cs,cV"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1160 (match_operand:SI 1 "gcn_alu_operand" "%SgA, v"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1161 (match_operand:SI 2 "gcn_alu_operand" " SgB,vA")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1162 (set (match_operand:BI 4 "register_operand" "= 3, 3")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1163 (ior:BI (ltu:BI (plus:SI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1164 (plus:SI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1165 (zero_extend:SI (match_dup 3))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1166 (match_dup 1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1167 (match_dup 2))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1168 (match_dup 2))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1169 (ltu:BI (plus:SI (zero_extend:SI (match_dup 3)) (match_dup 1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1170 (match_dup 1))))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1171 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1172 "@
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1173 s_addc_u32\t%0, %1, %2
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1174 v_addc%^_u32\t%0, vcc, %2, %1, vcc"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1175 [(set_attr "type" "sop2,vop2")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1176 (set_attr "length" "8,4")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1177
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1178 (define_insn "addcsi3_scalar_zero"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1179 [(set (match_operand:SI 0 "register_operand" "=Sg, v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1180 (plus:SI (zero_extend:SI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1181 (match_operand:BI 2 "register_operand" "=cs,cV"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1182 (match_operand:SI 1 "gcn_alu_operand" "SgA, v")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1183 (set (match_dup 2)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1184 (ltu:BI (plus:SI (zero_extend:SI (match_dup 2))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1185 (match_dup 1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1186 (match_dup 1)))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1187 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1188 "@
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1189 s_addc_u32\t%0, %1, 0
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1190 v_addc%^_u32\t%0, vcc, 0, %1, vcc"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1191 [(set_attr "type" "sop2,vop2")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1192 (set_attr "length" "4")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1193
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1194 ; "addptr" is the same as "add" except that it must not write to VCC or SCC
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1195 ; as a side-effect. Unfortunately GCN does not have a suitable instruction
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1196 ; for this, so we use a custom VOP3 add with CC_SAVE_REG as a temp.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1197 ; Note that it is not safe to save/clobber/restore SCC because doing so will
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1198 ; break data-flow analysis, so this must use vector registers.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1199
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1200 (define_insn "addptrdi3"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1201 [(set (match_operand:DI 0 "register_operand" "= &v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1202 (plus:DI (match_operand:DI 1 "register_operand" " v0")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1203 (match_operand:DI 2 "nonmemory_operand" "vDA0")))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1204 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1205 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1206 rtx new_operands[4] = { operands[0], operands[1], operands[2],
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1207 gen_rtx_REG (DImode, CC_SAVE_REG) };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1208
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1209 output_asm_insn ("v_add%^_u32 %L0, %3, %L2, %L1", new_operands);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1210 output_asm_insn ("v_addc%^_u32 %H0, %3, %H2, %H1, %3", new_operands);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1211
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1212 return "";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1213 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1214 [(set_attr "type" "vmult")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1215 (set_attr "length" "16")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1216
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1217 ;; }}}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1218 ;; {{{ ALU special cases: Minus
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1219
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1220 (define_insn "subsi3"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1221 [(set (match_operand:SI 0 "register_operand" "=Sg, Sg, v, v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1222 (minus:SI (match_operand:SI 1 "gcn_alu_operand" "SgA,SgA, v,vBSv")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1223 (match_operand:SI 2 "gcn_alu_operand" "SgA, B, vBSv, v")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1224 (clobber (match_scratch:BI 3 "=cs, cs, X, X"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1225 (clobber (match_scratch:DI 4 "= X, X, cV, cV"))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1226 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1227 "@
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1228 s_sub_i32\t%0, %1, %2
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1229 s_sub_i32\t%0, %1, %2
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1230 v_subrev%^_u32\t%0, vcc, %2, %1
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1231 v_sub%^_u32\t%0, vcc, %1, %2"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1232 [(set_attr "type" "sop2,sop2,vop2,vop2")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1233 (set_attr "length" "4,8,8,8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1234
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1235 (define_insn_and_split "subdi3"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1236 [(set (match_operand:DI 0 "register_operand" "=Sg, Sg")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1237 (minus:DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1238 (match_operand:DI 1 "gcn_alu_operand" "SgA,SgB")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1239 (match_operand:DI 2 "gcn_alu_operand" "SgB,SgA")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1240 (clobber (reg:BI SCC_REG))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1241 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1242 "#"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1243 "reload_completed"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1244 [(const_int 0)]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1245 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1246 emit_insn (gen_subsi3_scalar_carry
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1247 (gcn_operand_part (DImode, operands[0], 0),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1248 gcn_operand_part (DImode, operands[1], 0),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1249 gcn_operand_part (DImode, operands[2], 0)));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1250 rtx val = gcn_operand_part (DImode, operands[2], 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1251 if (val != const0_rtx)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1252 emit_insn (gen_subcsi3_scalar
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1253 (gcn_operand_part (DImode, operands[0], 1),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1254 gcn_operand_part (DImode, operands[1], 1),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1255 gcn_operand_part (DImode, operands[2], 1)));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1256 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1257 emit_insn (gen_subcsi3_scalar_zero
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1258 (gcn_operand_part (DImode, operands[0], 1),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1259 gcn_operand_part (DImode, operands[1], 1)));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1260 DONE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1261 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1262 [(set_attr "length" "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1263
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1264 (define_insn "subsi3_scalar_carry"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1265 [(set (match_operand:SI 0 "register_operand" "=Sg, Sg")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1266 (minus:SI (match_operand:SI 1 "gcn_alu_operand" "SgA,SgB")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1267 (match_operand:SI 2 "gcn_alu_operand" "SgB,SgA")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1268 (set (reg:BI SCC_REG)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1269 (gtu:BI (minus:SI (match_dup 1)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1270 (match_dup 2))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1271 (match_dup 1)))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1272 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1273 "s_sub_u32\t%0, %1, %2"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1274 [(set_attr "type" "sop2")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1275 (set_attr "length" "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1276
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1277 (define_insn "subsi3_scalar_carry_cst"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1278 [(set (match_operand:SI 0 "register_operand" "=Sg")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1279 (minus:SI (match_operand:SI 1 "gcn_alu_operand" "SgA")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1280 (match_operand:SI 2 "const_int_operand" " n")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1281 (set (reg:BI SCC_REG)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1282 (leu:BI (minus:SI (match_dup 1)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1283 (match_dup 2))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1284 (match_operand:SI 3 "const_int_operand" " n")))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1285 "INTVAL (operands[2]) == -INTVAL (operands[3])"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1286 "s_sub_u32\t%0, %1, %2"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1287 [(set_attr "type" "sop2")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1288 (set_attr "length" "4")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1289
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1290 (define_insn "subcsi3_scalar"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1291 [(set (match_operand:SI 0 "register_operand" "=Sg, Sg")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1292 (minus:SI (minus:SI (zero_extend:SI (reg:BI SCC_REG))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1293 (match_operand:SI 1 "gcn_alu_operand" "SgA,SgB"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1294 (match_operand:SI 2 "gcn_alu_operand" "SgB,SgA")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1295 (set (reg:BI SCC_REG)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1296 (ior:BI (gtu:BI (minus:SI (minus:SI (zero_extend:SI (reg:BI SCC_REG))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1297 (match_dup 1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1298 (match_dup 2))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1299 (match_dup 1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1300 (gtu:BI (minus:SI (zero_extend:SI (reg:BI SCC_REG))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1301 (match_dup 1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1302 (match_dup 1))))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1303 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1304 "s_subb_u32\t%0, %1, %2"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1305 [(set_attr "type" "sop2")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1306 (set_attr "length" "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1307
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1308 (define_insn "subcsi3_scalar_zero"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1309 [(set (match_operand:SI 0 "register_operand" "=Sg")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1310 (minus:SI (zero_extend:SI (reg:BI SCC_REG))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1311 (match_operand:SI 1 "gcn_alu_operand" "SgA")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1312 (set (reg:BI SCC_REG)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1313 (gtu:BI (minus:SI (zero_extend:SI (reg:BI SCC_REG)) (match_dup 1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1314 (match_dup 1)))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1315 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1316 "s_subb_u32\t%0, %1, 0"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1317 [(set_attr "type" "sop2")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1318 (set_attr "length" "4")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1319
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1320 ;; }}}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1321 ;; {{{ ALU: mult
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1322
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1323 ; Vector multiply has vop3a encoding, but no corresponding vop2a, so no long
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1324 ; immediate.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1325 (define_insn "mulsi3"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1326 [(set (match_operand:SI 0 "register_operand" "= Sg,Sg, Sg, v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1327 (mult:SI (match_operand:SI 1 "gcn_alu_operand" "%SgA, 0,SgA, v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1328 (match_operand:SI 2 "gcn_alu_operand" " SgA, J, B,vASv")))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1329 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1330 "@
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1331 s_mul_i32\t%0, %1, %2
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1332 s_mulk_i32\t%0, %2
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1333 s_mul_i32\t%0, %1, %2
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1334 v_mul_lo_i32\t%0, %1, %2"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1335 [(set_attr "type" "sop2,sopk,sop2,vop3a")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1336 (set_attr "length" "4,4,8,4")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1337
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1338 (define_code_iterator any_extend [sign_extend zero_extend])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1339 (define_code_attr sgnsuffix [(sign_extend "%i") (zero_extend "%u")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1340 (define_code_attr su [(sign_extend "s") (zero_extend "u")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1341 (define_code_attr u [(sign_extend "") (zero_extend "u")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1342 (define_code_attr iu [(sign_extend "i") (zero_extend "u")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1343 (define_code_attr e [(sign_extend "e") (zero_extend "")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1344
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1345 (define_insn "<su>mulsi3_highpart"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1346 [(set (match_operand:SI 0 "register_operand" "= v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1347 (truncate:SI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1348 (lshiftrt:DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1349 (mult:DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1350 (any_extend:DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1351 (match_operand:SI 1 "register_operand" "% v"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1352 (any_extend:DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1353 (match_operand:SI 2 "register_operand" "vSv")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1354 (const_int 32))))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1355 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1356 "v_mul_hi<sgnsuffix>0\t%0, %2, %1"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1357 [(set_attr "type" "vop3a")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1358 (set_attr "length" "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1359
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1360 (define_insn "<u>mulhisi3"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1361 [(set (match_operand:SI 0 "register_operand" "=v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1362 (mult:SI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1363 (any_extend:SI (match_operand:HI 1 "register_operand" "%v"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1364 (any_extend:SI (match_operand:HI 2 "register_operand" " v"))))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1365 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1366 "v_mul_<iu>32_<iu>24_sdwa\t%0, %<e>1, %<e>2 src0_sel:WORD_0 src1_sel:WORD_0"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1367 [(set_attr "type" "vop_sdwa")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1368 (set_attr "length" "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1369
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1370 (define_insn "<u>mulqihi3_scalar"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1371 [(set (match_operand:HI 0 "register_operand" "=v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1372 (mult:HI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1373 (any_extend:HI (match_operand:QI 1 "register_operand" "%v"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1374 (any_extend:HI (match_operand:QI 2 "register_operand" " v"))))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1375 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1376 "v_mul_<iu>32_<iu>24_sdwa\t%0, %<e>1, %<e>2 src0_sel:BYTE_0 src1_sel:BYTE_0"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1377 [(set_attr "type" "vop_sdwa")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1378 (set_attr "length" "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1379
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1380 ;; }}}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1381 ;; {{{ ALU: generic 32-bit unop
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1382
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1383 (define_code_iterator bitunop [not popcount])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1384 (define_code_attr popcount_extra_op [(not "") (popcount ", 0")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1385
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1386 (define_insn "<expander>si2"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1387 [(set (match_operand:SI 0 "register_operand" "=Sg, v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1388 (bitunop:SI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1389 (match_operand:SI 1 "gcn_alu_operand" "SgB,vSvB")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1390 (clobber (match_scratch:BI 2 "=cs, X"))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1391 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1392 "@
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1393 s_<s_mnemonic>0\t%0, %1
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1394 v_<mnemonic>0\t%0, %1<popcount_extra_op>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1395 [(set_attr "type" "sop1,vop1")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1396 (set_attr "length" "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1397
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1398 (define_code_iterator countzeros [clz ctz])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1399
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1400 (define_insn "<expander>si2"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1401 [(set (match_operand:SI 0 "register_operand" "=Sg,Sg")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1402 (countzeros:SI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1403 (match_operand:SI 1 "gcn_alu_operand" "SgA, B")))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1404 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1405 "s_<s_mnemonic>1\t%0, %1"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1406 [(set_attr "type" "sop1")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1407 (set_attr "length" "4,8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1408
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1409 ; The truncate ensures that a constant passed to operand 1 is treated as DImode
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1410 (define_insn "<expander>di2"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1411 [(set (match_operand:SI 0 "register_operand" "=Sg,Sg")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1412 (truncate:SI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1413 (countzeros:DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1414 (match_operand:DI 1 "gcn_alu_operand" "SgA, B"))))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1415 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1416 "s_<s_mnemonic>1\t%0, %1"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1417 [(set_attr "type" "sop1")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1418 (set_attr "length" "4,8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1419
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1420 ;; }}}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1421 ;; {{{ ALU: generic 32-bit binop
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1422
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1423 ; No plus and mult - they have variant with 16bit immediate
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1424 ; and thus are defined later.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1425 (define_code_iterator binop [and ior xor smin smax umin umax
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1426 ashift lshiftrt ashiftrt])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1427 (define_code_iterator vec_and_scalar_com [and ior xor smin smax umin umax])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1428 (define_code_iterator vec_and_scalar_nocom [ashift lshiftrt ashiftrt])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1429
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1430 (define_insn "<expander>si3"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1431 [(set (match_operand:SI 0 "gcn_valu_dst_operand" "= Sg, v,RD")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1432 (vec_and_scalar_com:SI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1433 (match_operand:SI 1 "gcn_valu_src0_operand" "%SgA,vSvB, 0")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1434 (match_operand:SI 2 "gcn_alu_operand" " SgB, v, v")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1435 (clobber (match_scratch:BI 3 "= cs, X, X"))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1436 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1437 "@
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1438 s_<mnemonic>0\t%0, %1, %2
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1439 v_<mnemonic>0\t%0, %1, %2
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1440 ds_<mnemonic>0\t%A0, %2%O0"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1441 [(set_attr "type" "sop2,vop2,ds")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1442 (set_attr "length" "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1443
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1444 (define_insn "<expander>si3"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1445 [(set (match_operand:SI 0 "register_operand" "=Sg, Sg, v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1446 (vec_and_scalar_nocom:SI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1447 (match_operand:SI 1 "gcn_alu_operand" "SgB,SgA, v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1448 (match_operand:SI 2 "gcn_alu_operand" "SgA,SgB,vSvB")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1449 (clobber (match_scratch:BI 3 "=cs, cs, X"))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1450 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1451 "@
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1452 s_<mnemonic>0\t%0, %1, %2
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1453 s_<mnemonic>0\t%0, %1, %2
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1454 v_<revmnemonic>0\t%0, %2, %1"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1455 [(set_attr "type" "sop2,sop2,vop2")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1456 (set_attr "length" "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1457
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1458 (define_expand "<expander>si3_scc"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1459 [(parallel [(set (match_operand:SI 0 "gcn_valu_dst_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1460 (binop:SI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1461 (match_operand:SI 1 "gcn_valu_src0_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1462 (match_operand:SI 2 "gcn_alu_operand")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1463 (clobber (reg:BI SCC_REG))])]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1464 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1465 {})
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1466
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1467 ;; }}}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1468 ;; {{{ ALU: generic 64-bit
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1469
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1470 (define_code_iterator vec_and_scalar64_com [and ior xor])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1471
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1472 (define_insn_and_split "<expander>di3"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1473 [(set (match_operand:DI 0 "register_operand" "= Sg, &v, &v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1474 (vec_and_scalar64_com:DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1475 (match_operand:DI 1 "gcn_alu_operand" "%SgA,vSvDB,vSvDB")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1476 (match_operand:DI 2 "gcn_alu_operand" " SgC, v, 0")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1477 (clobber (match_scratch:BI 3 "= cs, X, X"))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1478 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1479 "@
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1480 s_<mnemonic>0\t%0, %1, %2
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1481 #
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1482 #"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1483 "reload_completed && gcn_vgpr_register_operand (operands[0], DImode)"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1484 [(parallel [(set (match_dup 4)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1485 (vec_and_scalar64_com:SI (match_dup 5) (match_dup 6)))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1486 (clobber (match_dup 3))])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1487 (parallel [(set (match_dup 7)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1488 (vec_and_scalar64_com:SI (match_dup 8) (match_dup 9)))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1489 (clobber (match_dup 3))])]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1490 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1491 operands[4] = gcn_operand_part (DImode, operands[0], 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1492 operands[5] = gcn_operand_part (DImode, operands[1], 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1493 operands[6] = gcn_operand_part (DImode, operands[2], 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1494 operands[7] = gcn_operand_part (DImode, operands[0], 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1495 operands[8] = gcn_operand_part (DImode, operands[1], 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1496 operands[9] = gcn_operand_part (DImode, operands[2], 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1497 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1498 [(set_attr "type" "sop2,vop2,vop2")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1499 (set_attr "length" "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1500
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1501 (define_insn "<expander>di3"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1502 [(set (match_operand:DI 0 "register_operand" "=Sg, Sg, v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1503 (vec_and_scalar_nocom:DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1504 (match_operand:DI 1 "gcn_alu_operand" "SgC,SgA, v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1505 (match_operand:SI 2 "gcn_alu_operand" "SgA,SgC,vSvC")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1506 (clobber (match_scratch:BI 3 "=cs, cs, X"))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1507 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1508 "@
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1509 s_<mnemonic>0\t%0, %1, %2
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1510 s_<mnemonic>0\t%0, %1, %2
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1511 v_<revmnemonic>0\t%0, %2, %1"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1512 [(set_attr "type" "sop2,sop2,vop2")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1513 (set_attr "length" "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1514
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1515 ;; }}}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1516 ;; {{{ Atomics
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1517
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1518 ; Each compute unit has it's own L1 cache. The L2 cache is shared between
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1519 ; all the compute units. Any load or store instruction can skip L1 and
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1520 ; access L2 directly using the "glc" flag. Atomic instructions also skip
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1521 ; L1. The L1 cache can be flushed and invalidated using instructions.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1522 ;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1523 ; Therefore, in order for "acquire" and "release" atomic modes to work
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1524 ; correctly across compute units we must flush before each "release"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1525 ; and invalidate the cache after each "acquire". It might seem like
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1526 ; invalidation could be safely done before an "acquire", but since each
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1527 ; compute unit can run up to 40 threads simultaneously, all reading values
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1528 ; into the L1 cache, this is not actually safe.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1529 ;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1530 ; Additionally, scalar flat instructions access L2 via a different cache
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1531 ; (the "constant cache"), so they have separate constrol instructions. We
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1532 ; do not attempt to invalidate both caches at once; instead, atomics
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1533 ; operating on scalar flat pointers will flush the constant cache, and
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1534 ; atomics operating on flat or global pointers will flush L1. It is up to
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1535 ; the programmer to get this right.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1536
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1537 (define_code_iterator atomicops [plus minus and ior xor])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1538 (define_mode_attr X [(SI "") (DI "_X2")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1539
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1540 ;; TODO compare_and_swap test_and_set inc dec
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1541 ;; Hardware also supports min and max, but GCC does not.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1542
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1543 (define_expand "memory_barrier"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1544 [(set (match_dup 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1545 (unspec:BLK [(match_dup 0)] UNSPEC_MEMORY_BARRIER))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1546 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1547 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1548 operands[0] = gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (Pmode));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1549 MEM_VOLATILE_P (operands[0]) = 1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1550 })
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1551
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1552 (define_insn "*memory_barrier"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1553 [(set (match_operand:BLK 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1554 (unspec:BLK [(match_dup 0)] UNSPEC_MEMORY_BARRIER))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1555 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1556 "buffer_wbinvl1_vol"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1557 [(set_attr "type" "mubuf")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1558 (set_attr "length" "4")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1559
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1560 ; FIXME: These patterns have been disabled as they do not seem to work
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1561 ; reliably - they can cause hangs or incorrect results.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1562 ; TODO: flush caches according to memory model
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1563 (define_insn "atomic_fetch_<bare_mnemonic><mode>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1564 [(set (match_operand:SIDI 0 "register_operand" "=Sm, v, v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1565 (match_operand:SIDI 1 "memory_operand" "+RS,RF,RM"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1566 (set (match_dup 1)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1567 (unspec_volatile:SIDI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1568 [(atomicops:SIDI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1569 (match_dup 1)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1570 (match_operand:SIDI 2 "register_operand" " Sm, v, v"))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1571 UNSPECV_ATOMIC))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1572 (use (match_operand 3 "const_int_operand"))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1573 "0 /* Disabled. */"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1574 "@
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1575 s_atomic_<bare_mnemonic><X>\t%0, %1, %2 glc\;s_waitcnt\tlgkmcnt(0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1576 flat_atomic_<bare_mnemonic><X>\t%0, %1, %2 glc\;s_waitcnt\t0
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1577 global_atomic_<bare_mnemonic><X>\t%0, %A1, %2%O1 glc\;s_waitcnt\tvmcnt(0)"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1578 [(set_attr "type" "smem,flat,flat")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1579 (set_attr "length" "12")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1580 (set_attr "gcn_version" "gcn5,*,gcn5")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1581
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1582 ; FIXME: These patterns are disabled because the instructions don't
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1583 ; seem to work as advertised. Specifically, OMP "team distribute"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1584 ; reductions apparently "lose" some of the writes, similar to what
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1585 ; you might expect from a concurrent non-atomic read-modify-write.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1586 ; TODO: flush caches according to memory model
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1587 (define_insn "atomic_<bare_mnemonic><mode>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1588 [(set (match_operand:SIDI 0 "memory_operand" "+RS,RF,RM")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1589 (unspec_volatile:SIDI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1590 [(atomicops:SIDI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1591 (match_dup 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1592 (match_operand:SIDI 1 "register_operand" " Sm, v, v"))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1593 UNSPECV_ATOMIC))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1594 (use (match_operand 2 "const_int_operand"))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1595 "0 /* Disabled. */"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1596 "@
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1597 s_atomic_<bare_mnemonic><X>\t%0, %1\;s_waitcnt\tlgkmcnt(0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1598 flat_atomic_<bare_mnemonic><X>\t%0, %1\;s_waitcnt\t0
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1599 global_atomic_<bare_mnemonic><X>\t%A0, %1%O0\;s_waitcnt\tvmcnt(0)"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1600 [(set_attr "type" "smem,flat,flat")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1601 (set_attr "length" "12")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1602 (set_attr "gcn_version" "gcn5,*,gcn5")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1603
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1604 (define_mode_attr x2 [(SI "DI") (DI "TI")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1605 (define_mode_attr size [(SI "4") (DI "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1606 (define_mode_attr bitsize [(SI "32") (DI "64")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1607
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1608 (define_expand "sync_compare_and_swap<mode>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1609 [(match_operand:SIDI 0 "register_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1610 (match_operand:SIDI 1 "memory_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1611 (match_operand:SIDI 2 "register_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1612 (match_operand:SIDI 3 "register_operand")]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1613 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1614 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1615 if (MEM_ADDR_SPACE (operands[1]) == ADDR_SPACE_LDS)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1616 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1617 emit_insn (gen_sync_compare_and_swap<mode>_lds_insn (operands[0],
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1618 operands[1],
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1619 operands[2],
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1620 operands[3]));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1621 DONE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1622 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1623
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1624 /* Operands 2 and 3 must be placed in consecutive registers, and passed
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1625 as a combined value. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1626 rtx src_cmp = gen_reg_rtx (<x2>mode);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1627 emit_move_insn (gen_rtx_SUBREG (<MODE>mode, src_cmp, 0), operands[3]);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1628 emit_move_insn (gen_rtx_SUBREG (<MODE>mode, src_cmp, <size>), operands[2]);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1629 emit_insn (gen_sync_compare_and_swap<mode>_insn (operands[0],
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1630 operands[1],
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1631 src_cmp));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1632 DONE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1633 })
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1634
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1635 (define_insn "sync_compare_and_swap<mode>_insn"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1636 [(set (match_operand:SIDI 0 "register_operand" "=Sm, v, v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1637 (match_operand:SIDI 1 "memory_operand" "+RS,RF,RM"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1638 (set (match_dup 1)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1639 (unspec_volatile:SIDI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1640 [(match_operand:<x2> 2 "register_operand" " Sm, v, v")]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1641 UNSPECV_ATOMIC))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1642 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1643 "@
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1644 s_atomic_cmpswap<X>\t%0, %1, %2 glc\;s_waitcnt\tlgkmcnt(0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1645 flat_atomic_cmpswap<X>\t%0, %1, %2 glc\;s_waitcnt\t0
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1646 global_atomic_cmpswap<X>\t%0, %A1, %2%O1 glc\;s_waitcnt\tvmcnt(0)"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1647 [(set_attr "type" "smem,flat,flat")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1648 (set_attr "length" "12")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1649 (set_attr "gcn_version" "gcn5,*,gcn5")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1650 (set_attr "delayeduse" "*,yes,yes")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1651
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1652 (define_insn "sync_compare_and_swap<mode>_lds_insn"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1653 [(set (match_operand:SIDI 0 "register_operand" "= v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1654 (unspec_volatile:SIDI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1655 [(match_operand:SIDI 1 "memory_operand" "+RL")]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1656 UNSPECV_ATOMIC))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1657 (set (match_dup 1)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1658 (unspec_volatile:SIDI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1659 [(match_operand:SIDI 2 "register_operand" " v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1660 (match_operand:SIDI 3 "register_operand" " v")]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1661 UNSPECV_ATOMIC))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1662 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1663 "ds_cmpst_rtn_b<bitsize> %0, %1, %2, %3\;s_waitcnt\tlgkmcnt(0)"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1664 [(set_attr "type" "ds")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1665 (set_attr "length" "12")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1666
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1667 (define_insn "atomic_load<mode>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1668 [(set (match_operand:SIDI 0 "register_operand" "=Sm, v, v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1669 (unspec_volatile:SIDI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1670 [(match_operand:SIDI 1 "memory_operand" " RS,RF,RM")]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1671 UNSPECV_ATOMIC))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1672 (use (match_operand:SIDI 2 "immediate_operand" " i, i, i"))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1673 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1674 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1675 switch (INTVAL (operands[2]))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1676 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1677 case MEMMODEL_RELAXED:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1678 switch (which_alternative)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1679 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1680 case 0:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1681 return "s_load%o0\t%0, %A1 glc\;s_waitcnt\tlgkmcnt(0)";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1682 case 1:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1683 return "flat_load%o0\t%0, %A1%O1 glc\;s_waitcnt\t0";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1684 case 2:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1685 return "global_load%o0\t%0, %A1%O1 glc\;s_waitcnt\tvmcnt(0)";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1686 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1687 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1688 case MEMMODEL_CONSUME:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1689 case MEMMODEL_ACQUIRE:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1690 case MEMMODEL_SYNC_ACQUIRE:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1691 switch (which_alternative)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1692 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1693 case 0:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1694 return "s_load%o0\t%0, %A1 glc\;s_waitcnt\tlgkmcnt(0)\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1695 "s_dcache_wb_vol";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1696 case 1:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1697 return "flat_load%o0\t%0, %A1%O1 glc\;s_waitcnt\t0\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1698 "buffer_wbinvl1_vol";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1699 case 2:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1700 return "global_load%o0\t%0, %A1%O1 glc\;s_waitcnt\tvmcnt(0)\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1701 "buffer_wbinvl1_vol";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1702 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1703 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1704 case MEMMODEL_ACQ_REL:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1705 case MEMMODEL_SEQ_CST:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1706 case MEMMODEL_SYNC_SEQ_CST:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1707 switch (which_alternative)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1708 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1709 case 0:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1710 return "s_dcache_wb_vol\;s_load%o0\t%0, %A1 glc\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1711 "s_waitcnt\tlgkmcnt(0)\;s_dcache_inv_vol";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1712 case 1:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1713 return "buffer_wbinvl1_vol\;flat_load%o0\t%0, %A1%O1 glc\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1714 "s_waitcnt\t0\;buffer_wbinvl1_vol";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1715 case 2:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1716 return "buffer_wbinvl1_vol\;global_load%o0\t%0, %A1%O1 glc\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1717 "s_waitcnt\tvmcnt(0)\;buffer_wbinvl1_vol";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1718 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1719 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1720 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1721 gcc_unreachable ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1722 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1723 [(set_attr "type" "smem,flat,flat")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1724 (set_attr "length" "20")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1725 (set_attr "gcn_version" "gcn5,*,gcn5")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1726
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1727 (define_insn "atomic_store<mode>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1728 [(set (match_operand:SIDI 0 "memory_operand" "=RS,RF,RM")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1729 (unspec_volatile:SIDI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1730 [(match_operand:SIDI 1 "register_operand" " Sm, v, v")]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1731 UNSPECV_ATOMIC))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1732 (use (match_operand:SIDI 2 "immediate_operand" " i, i, i"))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1733 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1734 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1735 switch (INTVAL (operands[2]))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1736 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1737 case MEMMODEL_RELAXED:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1738 switch (which_alternative)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1739 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1740 case 0:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1741 return "s_store%o1\t%1, %A0 glc\;s_waitcnt\tlgkmcnt(0)";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1742 case 1:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1743 return "flat_store%o1\t%A0, %1%O0 glc\;s_waitcnt\t0";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1744 case 2:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1745 return "global_store%o1\t%A0, %1%O0 glc\;s_waitcnt\tvmcnt(0)";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1746 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1747 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1748 case MEMMODEL_RELEASE:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1749 case MEMMODEL_SYNC_RELEASE:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1750 switch (which_alternative)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1751 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1752 case 0:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1753 return "s_dcache_wb_vol\;s_store%o1\t%1, %A0 glc";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1754 case 1:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1755 return "buffer_wbinvl1_vol\;flat_store%o1\t%A0, %1%O0 glc";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1756 case 2:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1757 return "buffer_wbinvl1_vol\;global_store%o1\t%A0, %1%O0 glc";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1758 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1759 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1760 case MEMMODEL_ACQ_REL:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1761 case MEMMODEL_SEQ_CST:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1762 case MEMMODEL_SYNC_SEQ_CST:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1763 switch (which_alternative)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1764 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1765 case 0:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1766 return "s_dcache_wb_vol\;s_store%o1\t%1, %A0 glc\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1767 "s_waitcnt\tlgkmcnt(0)\;s_dcache_inv_vol";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1768 case 1:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1769 return "buffer_wbinvl1_vol\;flat_store%o1\t%A0, %1%O0 glc\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1770 "s_waitcnt\t0\;buffer_wbinvl1_vol";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1771 case 2:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1772 return "buffer_wbinvl1_vol\;global_store%o1\t%A0, %1%O0 glc\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1773 "s_waitcnt\tvmcnt(0)\;buffer_wbinvl1_vol";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1774 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1775 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1776 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1777 gcc_unreachable ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1778 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1779 [(set_attr "type" "smem,flat,flat")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1780 (set_attr "length" "20")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1781 (set_attr "gcn_version" "gcn5,*,gcn5")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1782
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1783 (define_insn "atomic_exchange<mode>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1784 [(set (match_operand:SIDI 0 "register_operand" "=Sm, v, v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1785 (match_operand:SIDI 1 "memory_operand" "+RS,RF,RM"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1786 (set (match_dup 1)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1787 (unspec_volatile:SIDI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1788 [(match_operand:SIDI 2 "register_operand" " Sm, v, v")]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1789 UNSPECV_ATOMIC))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1790 (use (match_operand 3 "immediate_operand"))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1791 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1792 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1793 switch (INTVAL (operands[3]))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1794 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1795 case MEMMODEL_RELAXED:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1796 switch (which_alternative)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1797 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1798 case 0:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1799 return "s_atomic_swap<X>\t%0, %1, %2 glc\;s_waitcnt\tlgkmcnt(0)";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1800 case 1:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1801 return "flat_atomic_swap<X>\t%0, %1, %2 glc\;s_waitcnt\t0";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1802 case 2:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1803 return "global_atomic_swap<X>\t%0, %A1, %2%O1 glc\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1804 "s_waitcnt\tvmcnt(0)";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1805 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1806 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1807 case MEMMODEL_CONSUME:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1808 case MEMMODEL_ACQUIRE:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1809 case MEMMODEL_SYNC_ACQUIRE:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1810 switch (which_alternative)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1811 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1812 case 0:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1813 return "s_atomic_swap<X>\t%0, %1, %2 glc\;s_waitcnt\tlgkmcnt(0)\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1814 "s_dcache_wb_vol\;s_dcache_inv_vol";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1815 case 1:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1816 return "flat_atomic_swap<X>\t%0, %1, %2 glc\;s_waitcnt\t0\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1817 "buffer_wbinvl1_vol";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1818 case 2:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1819 return "global_atomic_swap<X>\t%0, %A1, %2%O1 glc\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1820 "s_waitcnt\tvmcnt(0)\;buffer_wbinvl1_vol";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1821 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1822 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1823 case MEMMODEL_RELEASE:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1824 case MEMMODEL_SYNC_RELEASE:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1825 switch (which_alternative)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1826 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1827 case 0:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1828 return "s_dcache_wb_vol\;s_atomic_swap<X>\t%0, %1, %2 glc\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1829 "s_waitcnt\tlgkmcnt(0)";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1830 case 1:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1831 return "buffer_wbinvl1_vol\;flat_atomic_swap<X>\t%0, %1, %2 glc\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1832 "s_waitcnt\t0";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1833 case 2:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1834 return "buffer_wbinvl1_vol\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1835 "global_atomic_swap<X>\t%0, %A1, %2%O1 glc\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1836 "s_waitcnt\tvmcnt(0)";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1837 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1838 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1839 case MEMMODEL_ACQ_REL:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1840 case MEMMODEL_SEQ_CST:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1841 case MEMMODEL_SYNC_SEQ_CST:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1842 switch (which_alternative)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1843 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1844 case 0:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1845 return "s_dcache_wb_vol\;s_atomic_swap<X>\t%0, %1, %2 glc\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1846 "s_waitcnt\tlgkmcnt(0)\;s_dcache_inv_vol";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1847 case 1:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1848 return "buffer_wbinvl1_vol\;flat_atomic_swap<X>\t%0, %1, %2 glc\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1849 "s_waitcnt\t0\;buffer_wbinvl1_vol";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1850 case 2:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1851 return "buffer_wbinvl1_vol\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1852 "global_atomic_swap<X>\t%0, %A1, %2%O1 glc\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1853 "s_waitcnt\tvmcnt(0)\;buffer_wbinvl1_vol";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1854 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1855 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1856 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1857 gcc_unreachable ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1858 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1859 [(set_attr "type" "smem,flat,flat")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1860 (set_attr "length" "20")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1861 (set_attr "gcn_version" "gcn5,*,gcn5")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1862
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1863 ;; }}}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1864 ;; {{{ OpenACC / OpenMP
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1865
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1866 (define_expand "oacc_dim_size"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1867 [(match_operand:SI 0 "register_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1868 (match_operand:SI 1 "const_int_operand")]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1869 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1870 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1871 rtx tmp = gcn_oacc_dim_size (INTVAL (operands[1]));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1872 emit_move_insn (operands[0], gen_lowpart (SImode, tmp));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1873 DONE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1874 })
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1875
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1876 (define_expand "oacc_dim_pos"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1877 [(match_operand:SI 0 "register_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1878 (match_operand:SI 1 "const_int_operand")]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1879 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1880 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1881 emit_move_insn (operands[0], gcn_oacc_dim_pos (INTVAL (operands[1])));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1882 DONE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1883 })
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1884
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1885 (define_expand "gcn_wavefront_barrier"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1886 [(set (match_dup 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1887 (unspec_volatile:BLK [(match_dup 0)] UNSPECV_BARRIER))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1888 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1889 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1890 operands[0] = gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (Pmode));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1891 MEM_VOLATILE_P (operands[0]) = 1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1892 })
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1893
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1894 (define_insn "*gcn_wavefront_barrier"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1895 [(set (match_operand:BLK 0 "")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1896 (unspec_volatile:BLK [(match_dup 0)] UNSPECV_BARRIER))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1897 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1898 "s_barrier"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1899 [(set_attr "type" "sopp")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1900
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1901 (define_expand "oacc_fork"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1902 [(set (match_operand:SI 0 "")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1903 (match_operand:SI 1 ""))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1904 (use (match_operand:SI 2 ""))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1905 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1906 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1907 /* We need to have oacc_fork/oacc_join named patterns as a pair,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1908 but the fork isn't actually used. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1909 gcc_unreachable ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1910 })
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1911
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1912 (define_expand "oacc_join"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1913 [(set (match_operand:SI 0 "")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1914 (match_operand:SI 1 ""))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1915 (use (match_operand:SI 2 ""))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1916 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1917 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1918 emit_insn (gen_gcn_wavefront_barrier ());
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1919 DONE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1920 })
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1921
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1922 ;; }}}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1923
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1924 (include "gcn-valu.md")