aboutsummaryrefslogtreecommitdiff
path: root/llvm/test/CodeGen/AArch64/complex-deinterleaving-add-mull-fixed-contract.ll
blob: 09672d1be21613690efc8b362bcba43051be516a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc < %s --mattr=+complxnum,+neon -o - | FileCheck %s

target triple = "aarch64"

; a * b + c
define <4 x double> @mull_add(<4 x double> %a, <4 x double> %b, <4 x double> %c) {
; CHECK-LABEL: mull_add:
; CHECK:       // %bb.0: // %entry
; CHECK-NEXT:    zip2 v4.2d, v2.2d, v3.2d
; CHECK-NEXT:    zip2 v5.2d, v0.2d, v1.2d
; CHECK-NEXT:    zip1 v0.2d, v0.2d, v1.2d
; CHECK-NEXT:    zip1 v2.2d, v2.2d, v3.2d
; CHECK-NEXT:    fmul v1.2d, v5.2d, v4.2d
; CHECK-NEXT:    fmul v3.2d, v0.2d, v4.2d
; CHECK-NEXT:    fneg v1.2d, v1.2d
; CHECK-NEXT:    fmla v3.2d, v2.2d, v5.2d
; CHECK-NEXT:    fmla v1.2d, v2.2d, v0.2d
; CHECK-NEXT:    fadd v1.2d, v2.2d, v1.2d
; CHECK-NEXT:    fadd v2.2d, v3.2d, v4.2d
; CHECK-NEXT:    zip1 v0.2d, v1.2d, v2.2d
; CHECK-NEXT:    zip2 v1.2d, v1.2d, v2.2d
; CHECK-NEXT:    ret
entry:
  %strided.vec = shufflevector <4 x double> %a, <4 x double> poison, <2 x i32> <i32 0, i32 2>
  %strided.vec28 = shufflevector <4 x double> %a, <4 x double> poison, <2 x i32> <i32 1, i32 3>
  %strided.vec30 = shufflevector <4 x double> %b, <4 x double> poison, <2 x i32> <i32 0, i32 2>
  %strided.vec31 = shufflevector <4 x double> %b, <4 x double> poison, <2 x i32> <i32 1, i32 3>
  %0 = fmul contract <2 x double> %strided.vec, %strided.vec31
  %1 = fmul contract <2 x double> %strided.vec28, %strided.vec30
  %2 = fadd contract <2 x double> %1, %0
  %3 = fmul contract <2 x double> %strided.vec, %strided.vec30
  %4 = fmul contract <2 x double> %strided.vec28, %strided.vec31
  %5 = fsub contract <2 x double> %3, %4
  %strided.vec33 = shufflevector <4 x double> %b, <4 x double> poison, <2 x i32> <i32 0, i32 2>
  %strided.vec34 = shufflevector <4 x double> %b, <4 x double> poison, <2 x i32> <i32 1, i32 3>
  %6 = fadd contract <2 x double> %strided.vec33, %5
  %7 = fadd contract <2 x double> %2, %strided.vec34
  %interleaved.vec = shufflevector <2 x double> %6, <2 x double> %7, <4 x i32> <i32 0, i32 2, i32 1, i32 3>
  ret <4 x double> %interleaved.vec
}

; a * b + c * d
define <4 x double> @mul_add_mull(<4 x double> %a, <4 x double> %b, <4 x double> %c, <4 x double> %d) {
; CHECK-LABEL: mul_add_mull:
; CHECK:       // %bb.0: // %entry
; CHECK-NEXT:    movi v16.2d, #0000000000000000
; CHECK-NEXT:    movi v17.2d, #0000000000000000
; CHECK-NEXT:    movi v18.2d, #0000000000000000
; CHECK-NEXT:    movi v19.2d, #0000000000000000
; CHECK-NEXT:    fcmla v16.2d, v2.2d, v0.2d, #0
; CHECK-NEXT:    fcmla v18.2d, v3.2d, v1.2d, #0
; CHECK-NEXT:    fcmla v17.2d, v7.2d, v5.2d, #0
; CHECK-NEXT:    fcmla v19.2d, v6.2d, v4.2d, #0
; CHECK-NEXT:    fcmla v16.2d, v2.2d, v0.2d, #90
; CHECK-NEXT:    fcmla v18.2d, v3.2d, v1.2d, #90
; CHECK-NEXT:    fcmla v17.2d, v7.2d, v5.2d, #90
; CHECK-NEXT:    fcmla v19.2d, v6.2d, v4.2d, #90
; CHECK-NEXT:    fadd v1.2d, v18.2d, v17.2d
; CHECK-NEXT:    fadd v0.2d, v16.2d, v19.2d
; CHECK-NEXT:    ret
entry:
  %strided.vec = shufflevector <4 x double> %a, <4 x double> poison, <2 x i32> <i32 0, i32 2>
  %strided.vec51 = shufflevector <4 x double> %a, <4 x double> poison, <2 x i32> <i32 1, i32 3>
  %strided.vec53 = shufflevector <4 x double> %b, <4 x double> poison, <2 x i32> <i32 0, i32 2>
  %strided.vec54 = shufflevector <4 x double> %b, <4 x double> poison, <2 x i32> <i32 1, i32 3>
  %0 = fmul contract <2 x double> %strided.vec, %strided.vec54
  %1 = fmul contract <2 x double> %strided.vec51, %strided.vec53
  %2 = fadd contract <2 x double> %1, %0
  %3 = fmul contract <2 x double> %strided.vec, %strided.vec53
  %4 = fmul contract <2 x double> %strided.vec51, %strided.vec54
  %5 = fsub contract <2 x double> %3, %4
  %strided.vec56 = shufflevector <4 x double> %c, <4 x double> poison, <2 x i32> <i32 0, i32 2>
  %strided.vec57 = shufflevector <4 x double> %c, <4 x double> poison, <2 x i32> <i32 1, i32 3>
  %strided.vec59 = shufflevector <4 x double> %d, <4 x double> poison, <2 x i32> <i32 0, i32 2>
  %strided.vec60 = shufflevector <4 x double> %d, <4 x double> poison, <2 x i32> <i32 1, i32 3>
  %6 = fmul contract <2 x double> %strided.vec56, %strided.vec60
  %7 = fmul contract <2 x double> %strided.vec57, %strided.vec59
  %8 = fadd contract <2 x double> %7, %6
  %9 = fmul contract <2 x double> %strided.vec56, %strided.vec59
  %10 = fmul contract <2 x double> %strided.vec57, %strided.vec60
  %11 = fsub contract <2 x double> %9, %10
  %12 = fadd contract <2 x double> %5, %11
  %13 = fadd contract <2 x double> %2, %8
  %interleaved.vec = shufflevector <2 x double> %12, <2 x double> %13, <4 x i32> <i32 0, i32 2, i32 1, i32 3>
  ret <4 x double> %interleaved.vec
}

; a * b - c * d
define <4 x double> @mul_sub_mull(<4 x double> %a, <4 x double> %b, <4 x double> %c, <4 x double> %d) {
; CHECK-LABEL: mul_sub_mull:
; CHECK:       // %bb.0: // %entry
; CHECK-NEXT:    movi v16.2d, #0000000000000000
; CHECK-NEXT:    movi v17.2d, #0000000000000000
; CHECK-NEXT:    movi v18.2d, #0000000000000000
; CHECK-NEXT:    movi v19.2d, #0000000000000000
; CHECK-NEXT:    fcmla v16.2d, v2.2d, v0.2d, #0
; CHECK-NEXT:    fcmla v18.2d, v3.2d, v1.2d, #0
; CHECK-NEXT:    fcmla v17.2d, v7.2d, v5.2d, #0
; CHECK-NEXT:    fcmla v19.2d, v6.2d, v4.2d, #0
; CHECK-NEXT:    fcmla v16.2d, v2.2d, v0.2d, #90
; CHECK-NEXT:    fcmla v18.2d, v3.2d, v1.2d, #90
; CHECK-NEXT:    fcmla v17.2d, v7.2d, v5.2d, #90
; CHECK-NEXT:    fcmla v19.2d, v6.2d, v4.2d, #90
; CHECK-NEXT:    fsub v1.2d, v18.2d, v17.2d
; CHECK-NEXT:    fsub v0.2d, v16.2d, v19.2d
; CHECK-NEXT:    ret
entry:
  %strided.vec = shufflevector <4 x double> %a, <4 x double> poison, <2 x i32> <i32 0, i32 2>
  %strided.vec51 = shufflevector <4 x double> %a, <4 x double> poison, <2 x i32> <i32 1, i32 3>
  %strided.vec53 = shufflevector <4 x double> %b, <4 x double> poison, <2 x i32> <i32 0, i32 2>
  %strided.vec54 = shufflevector <4 x double> %b, <4 x double> poison, <2 x i32> <i32 1, i32 3>
  %0 = fmul contract <2 x double> %strided.vec, %strided.vec54
  %1 = fmul contract <2 x double> %strided.vec51, %strided.vec53
  %2 = fadd contract <2 x double> %1, %0
  %3 = fmul contract <2 x double> %strided.vec, %strided.vec53
  %4 = fmul contract <2 x double> %strided.vec51, %strided.vec54
  %5 = fsub contract <2 x double> %3, %4
  %strided.vec56 = shufflevector <4 x double> %c, <4 x double> poison, <2 x i32> <i32 0, i32 2>
  %strided.vec57 = shufflevector <4 x double> %c, <4 x double> poison, <2 x i32> <i32 1, i32 3>
  %strided.vec59 = shufflevector <4 x double> %d, <4 x double> poison, <2 x i32> <i32 0, i32 2>
  %strided.vec60 = shufflevector <4 x double> %d, <4 x double> poison, <2 x i32> <i32 1, i32 3>
  %6 = fmul contract <2 x double> %strided.vec56, %strided.vec60
  %7 = fmul contract <2 x double> %strided.vec57, %strided.vec59
  %8 = fadd contract <2 x double> %7, %6
  %9 = fmul contract <2 x double> %strided.vec56, %strided.vec59
  %10 = fmul contract <2 x double> %strided.vec57, %strided.vec60
  %11 = fsub contract <2 x double> %9, %10
  %12 = fsub contract <2 x double> %5, %11
  %13 = fsub contract <2 x double> %2, %8
  %interleaved.vec = shufflevector <2 x double> %12, <2 x double> %13, <4 x i32> <i32 0, i32 2, i32 1, i32 3>
  ret <4 x double> %interleaved.vec
}

; a * b + conj(c) * d
define <4 x double> @mul_conj_mull(<4 x double> %a, <4 x double> %b, <4 x double> %c, <4 x double> %d) {
; CHECK-LABEL: mul_conj_mull:
; CHECK:       // %bb.0: // %entry
; CHECK-NEXT:    movi v16.2d, #0000000000000000
; CHECK-NEXT:    movi v17.2d, #0000000000000000
; CHECK-NEXT:    movi v18.2d, #0000000000000000
; CHECK-NEXT:    movi v19.2d, #0000000000000000
; CHECK-NEXT:    fcmla v16.2d, v2.2d, v0.2d, #0
; CHECK-NEXT:    fcmla v18.2d, v3.2d, v1.2d, #0
; CHECK-NEXT:    fcmla v17.2d, v5.2d, v7.2d, #0
; CHECK-NEXT:    fcmla v19.2d, v4.2d, v6.2d, #0
; CHECK-NEXT:    fcmla v16.2d, v2.2d, v0.2d, #90
; CHECK-NEXT:    fcmla v18.2d, v3.2d, v1.2d, #90
; CHECK-NEXT:    fcmla v17.2d, v5.2d, v7.2d, #270
; CHECK-NEXT:    fcmla v19.2d, v4.2d, v6.2d, #270
; CHECK-NEXT:    fadd v1.2d, v18.2d, v17.2d
; CHECK-NEXT:    fadd v0.2d, v16.2d, v19.2d
; CHECK-NEXT:    ret
entry:
  %strided.vec = shufflevector <4 x double> %a, <4 x double> poison, <2 x i32> <i32 0, i32 2>
  %strided.vec59 = shufflevector <4 x double> %a, <4 x double> poison, <2 x i32> <i32 1, i32 3>
  %strided.vec61 = shufflevector <4 x double> %b, <4 x double> poison, <2 x i32> <i32 0, i32 2>
  %strided.vec62 = shufflevector <4 x double> %b, <4 x double> poison, <2 x i32> <i32 1, i32 3>
  %0 = fmul contract <2 x double> %strided.vec, %strided.vec62
  %1 = fmul contract <2 x double> %strided.vec59, %strided.vec61
  %2 = fadd contract <2 x double> %1, %0
  %3 = fmul contract <2 x double> %strided.vec, %strided.vec61
  %4 = fmul contract <2 x double> %strided.vec59, %strided.vec62
  %5 = fsub contract <2 x double> %3, %4
  %strided.vec64 = shufflevector <4 x double> %c, <4 x double> poison, <2 x i32> <i32 0, i32 2>
  %strided.vec65 = shufflevector <4 x double> %c, <4 x double> poison, <2 x i32> <i32 1, i32 3>
  %strided.vec67 = shufflevector <4 x double> %d, <4 x double> poison, <2 x i32> <i32 0, i32 2>
  %strided.vec68 = shufflevector <4 x double> %d, <4 x double> poison, <2 x i32> <i32 1, i32 3>
  %6 = fmul contract <2 x double> %strided.vec64, %strided.vec68
  %7 = fmul contract <2 x double> %strided.vec65, %strided.vec67
  %8 = fsub contract <2 x double> %6, %7
  %9 = fmul contract <2 x double> %strided.vec64, %strided.vec67
  %10 = fmul contract <2 x double> %strided.vec65, %strided.vec68
  %11 = fadd contract <2 x double> %9, %10
  %12 = fadd contract <2 x double> %5, %11
  %13 = fadd contract <2 x double> %2, %8
  %interleaved.vec = shufflevector <2 x double> %12, <2 x double> %13, <4 x i32> <i32 0, i32 2, i32 1, i32 3>
  ret <4 x double> %interleaved.vec
}

; a + b + 1i * c * d
define <4 x double> @mul_add_rot_mull(<4 x double> %a, <4 x double> %b, <4 x double> %c, <4 x double> %d) {
; CHECK-LABEL: mul_add_rot_mull:
; CHECK:       // %bb.0: // %entry
; CHECK-NEXT:    movi v16.2d, #0xffffffffffffffff
; CHECK-NEXT:    zip2 v17.2d, v4.2d, v5.2d
; CHECK-NEXT:    movi v18.2d, #0000000000000000
; CHECK-NEXT:    zip1 v4.2d, v4.2d, v5.2d
; CHECK-NEXT:    zip2 v19.2d, v0.2d, v1.2d
; CHECK-NEXT:    zip2 v20.2d, v2.2d, v3.2d
; CHECK-NEXT:    zip1 v0.2d, v0.2d, v1.2d
; CHECK-NEXT:    zip1 v2.2d, v2.2d, v3.2d
; CHECK-NEXT:    fneg v16.2d, v16.2d
; CHECK-NEXT:    fmul v1.2d, v19.2d, v20.2d
; CHECK-NEXT:    fmul v3.2d, v0.2d, v20.2d
; CHECK-NEXT:    mov v5.16b, v16.16b
; CHECK-NEXT:    bsl v16.16b, v18.16b, v4.16b
; CHECK-NEXT:    fneg v1.2d, v1.2d
; CHECK-NEXT:    fmla v3.2d, v2.2d, v19.2d
; CHECK-NEXT:    bsl v5.16b, v18.16b, v17.16b
; CHECK-NEXT:    fsub v16.2d, v16.2d, v17.2d
; CHECK-NEXT:    fmla v1.2d, v2.2d, v0.2d
; CHECK-NEXT:    fadd v4.2d, v4.2d, v5.2d
; CHECK-NEXT:    zip2 v5.2d, v6.2d, v7.2d
; CHECK-NEXT:    zip1 v6.2d, v6.2d, v7.2d
; CHECK-NEXT:    fmul v17.2d, v4.2d, v5.2d
; CHECK-NEXT:    fmul v5.2d, v16.2d, v5.2d
; CHECK-NEXT:    fneg v7.2d, v17.2d
; CHECK-NEXT:    fmla v5.2d, v4.2d, v6.2d
; CHECK-NEXT:    fmla v7.2d, v6.2d, v16.2d
; CHECK-NEXT:    fadd v2.2d, v3.2d, v5.2d
; CHECK-NEXT:    fadd v1.2d, v1.2d, v7.2d
; CHECK-NEXT:    zip1 v0.2d, v1.2d, v2.2d
; CHECK-NEXT:    zip2 v1.2d, v1.2d, v2.2d
; CHECK-NEXT:    ret
entry:
  %strided.vec = shufflevector <4 x double> %a, <4 x double> poison, <2 x i32> <i32 0, i32 2>
  %strided.vec77 = shufflevector <4 x double> %a, <4 x double> poison, <2 x i32> <i32 1, i32 3>
  %strided.vec79 = shufflevector <4 x double> %b, <4 x double> poison, <2 x i32> <i32 0, i32 2>
  %strided.vec80 = shufflevector <4 x double> %b, <4 x double> poison, <2 x i32> <i32 1, i32 3>
  %0 = fmul contract <2 x double> %strided.vec, %strided.vec80
  %1 = fmul contract <2 x double> %strided.vec77, %strided.vec79
  %2 = fadd contract <2 x double> %1, %0
  %3 = fmul contract <2 x double> %strided.vec, %strided.vec79
  %4 = fmul contract <2 x double> %strided.vec77, %strided.vec80
  %5 = fsub contract <2 x double> %3, %4
  %strided.vec82 = shufflevector <4 x double> %c, <4 x double> poison, <2 x i32> <i32 0, i32 2>
  %strided.vec83 = shufflevector <4 x double> %c, <4 x double> poison, <2 x i32> <i32 1, i32 3>
  %6 = tail call contract <2 x double> @llvm.copysign.v2f64(<2 x double> zeroinitializer, <2 x double> %strided.vec83)
  %7 = fadd contract <2 x double> %strided.vec82, %6
  %8 = tail call contract <2 x double> @llvm.copysign.v2f64(<2 x double> zeroinitializer, <2 x double> %strided.vec82)
  %9 = fsub contract <2 x double> %8, %strided.vec83
  %strided.vec85 = shufflevector <4 x double> %d, <4 x double> poison, <2 x i32> <i32 0, i32 2>
  %strided.vec86 = shufflevector <4 x double> %d, <4 x double> poison, <2 x i32> <i32 1, i32 3>
  %10 = fmul contract <2 x double> %9, %strided.vec86
  %11 = fmul contract <2 x double> %strided.vec85, %7
  %12 = fadd contract <2 x double> %11, %10
  %13 = fmul contract <2 x double> %9, %strided.vec85
  %14 = fmul contract <2 x double> %7, %strided.vec86
  %15 = fsub contract <2 x double> %13, %14
  %16 = fadd contract <2 x double> %5, %15
  %17 = fadd contract <2 x double> %2, %12
  %interleaved.vec = shufflevector <2 x double> %16, <2 x double> %17, <4 x i32> <i32 0, i32 2, i32 1, i32 3>
  ret <4 x double> %interleaved.vec
}

declare <2 x double> @llvm.copysign.v2f64(<2 x double>, <2 x double>)