1
- ; RUN: llc < %s -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr9 -verify-machineinstrs | FileCheck %s
2
- ; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr9 -verify-machineinstrs | FileCheck %s
3
- ; RUN: llc < %s -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr8 -verify-machineinstrs | FileCheck %s -check-prefix=CHECK-PWR8 -implicit-check-not vabsdu
1
+ ; RUN: llc < %s -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr9 -ppc-vsr-nums-as-vr -ppc-asm-full-reg-names - verify-machineinstrs | FileCheck %s
2
+ ; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr9 -ppc-vsr-nums-as-vr -ppc-asm-full-reg-names - verify-machineinstrs | FileCheck %s
3
+ ; RUN: llc < %s -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr8 -ppc-vsr-nums-as-vr -ppc-asm-full-reg-names - verify-machineinstrs | FileCheck %s -check-prefix=CHECK-PWR8 -implicit-check-not vabsdu
4
4
5
- ; Function Attrs: nounwind readnone
6
5
define <4 x i32 > @simple_absv_32 (<4 x i32 > %a ) local_unnamed_addr {
7
6
entry:
8
7
%sub.i = sub <4 x i32 > zeroinitializer , %a
9
8
%0 = tail call <4 x i32 > @llvm.ppc.altivec.vmaxsw (<4 x i32 > %a , <4 x i32 > %sub.i )
10
9
ret <4 x i32 > %0
11
10
; CHECK-LABEL: simple_absv_32
12
- ; CHECK-DAG: vxor {{[0-9]+}}, [[REG:[0-9]+]], [[REG]]
13
- ; CHECK-DAG: xvnegsp 34, 34
14
- ; CHECK-DAG: xvnegsp 35, {{[0-9]+}}
15
- ; CHECK-NEXT: vabsduw 2, 2, {{[0-9]+}}
11
+ ; CHECK-DAG: vxor v {{[0-9]+}}, v [[REG:[0-9]+]], v [[REG]]
12
+ ; CHECK-DAG: xvnegsp v2, v2
13
+ ; CHECK-DAG: xvnegsp v3, v {{[0-9]+}}
14
+ ; CHECK-NEXT: vabsduw v2, v2, v {{[0-9]+}}
16
15
; CHECK-NEXT: blr
17
16
; CHECK-PWR8-LABEL: simple_absv_32
18
17
; CHECK-PWR8: xxlxor
@@ -21,17 +20,16 @@ entry:
21
20
; CHECK-PWR8: blr
22
21
}
23
22
24
- ; Function Attrs: nounwind readnone
25
23
define <4 x i32 > @simple_absv_32_swap (<4 x i32 > %a ) local_unnamed_addr {
26
24
entry:
27
25
%sub.i = sub <4 x i32 > zeroinitializer , %a
28
26
%0 = tail call <4 x i32 > @llvm.ppc.altivec.vmaxsw (<4 x i32 > %sub.i , <4 x i32 > %a )
29
27
ret <4 x i32 > %0
30
28
; CHECK-LABEL: simple_absv_32_swap
31
- ; CHECK-DAG: vxor {{[0-9]+}}, [[REG:[0-9]+]], [[REG]]
32
- ; CHECK-DAG: xvnegsp 34, 34
33
- ; CHECK-DAG: xvnegsp 35, {{[0-9]+}}
34
- ; CHECK-NEXT: vabsduw 2, 2, {{[0-9]+}}
29
+ ; CHECK-DAG: vxor v {{[0-9]+}}, v [[REG:[0-9]+]], v [[REG]]
30
+ ; CHECK-DAG: xvnegsp v2, v2
31
+ ; CHECK-DAG: xvnegsp v3, v {{[0-9]+}}
32
+ ; CHECK-NEXT: vabsduw v2, v2, v {{[0-9]+}}
35
33
; CHECK-NEXT: blr
36
34
; CHECK-PWR8-LABEL: simple_absv_32_swap
37
35
; CHECK-PWR8: xxlxor
46
44
%0 = tail call <8 x i16 > @llvm.ppc.altivec.vmaxsh (<8 x i16 > %a , <8 x i16 > %sub.i )
47
45
ret <8 x i16 > %0
48
46
; CHECK-LABEL: simple_absv_16
49
- ; CHECK: mtvsrws {{[0-9]+}}, {{[0-9]+}}
50
- ; CHECK-NEXT: vadduhm 2, 2, [[IMM:[0-9]+]]
51
- ; CHECK-NEXT: vabsduh 2, 2, [[IMM]]
47
+ ; CHECK: mtvsrws v {{[0-9]+}}, r {{[0-9]+}}
48
+ ; CHECK-NEXT: vadduhm v2, v2, v [[IMM:[0-9]+]]
49
+ ; CHECK-NEXT: vabsduh v2, v2, v [[IMM]]
52
50
; CHECK-NEXT: blr
53
51
; CHECK-PWR8-LABEL: simple_absv_16
54
52
; CHECK-PWR8: xxlxor
@@ -57,16 +55,15 @@ entry:
57
55
; CHECK-PWR8: blr
58
56
}
59
57
60
- ; Function Attrs: nounwind readnone
61
58
define <16 x i8 > @simple_absv_8 (<16 x i8 > %a ) local_unnamed_addr {
62
59
entry:
63
60
%sub.i = sub <16 x i8 > zeroinitializer , %a
64
61
%0 = tail call <16 x i8 > @llvm.ppc.altivec.vmaxsb (<16 x i8 > %a , <16 x i8 > %sub.i )
65
62
ret <16 x i8 > %0
66
63
; CHECK-LABEL: simple_absv_8
67
- ; CHECK: xxspltib {{[0-9]+}}, 128
68
- ; CHECK-NEXT: vaddubm 2, 2, [[IMM:[0-9]+]]
69
- ; CHECK-NEXT: vabsdub 2, 2, [[IMM]]
64
+ ; CHECK: xxspltib v {{[0-9]+}}, 128
65
+ ; CHECK-NEXT: vaddubm v2, v2, v [[IMM:[0-9]+]]
66
+ ; CHECK-NEXT: vabsdub v2, v2, v [[IMM]]
70
67
; CHECK-NEXT: blr
71
68
; CHECK-PWR8-LABEL: simple_absv_8
72
69
; CHECK-PWR8: xxlxor
76
73
}
77
74
78
75
; The select pattern can only be detected for v4i32.
79
- ; Function Attrs: norecurse nounwind readnone
80
76
define <4 x i32 > @sub_absv_32 (<4 x i32 > %a , <4 x i32 > %b ) local_unnamed_addr {
81
77
entry:
82
78
%0 = sub nsw <4 x i32 > %a , %b
85
81
%3 = select <4 x i1 > %1 , <4 x i32 > %0 , <4 x i32 > %2
86
82
ret <4 x i32 > %3
87
83
; CHECK-LABEL: sub_absv_32
88
- ; CHECK-DAG: xvnegsp 34, 34
89
- ; CHECK-DAG: xvnegsp 35, 35
90
- ; CHECK-NEXT: vabsduw 2, 2, 3
84
+ ; CHECK-DAG: xvnegsp v3, v3
85
+ ; CHECK-DAG: xvnegsp v2, v2
86
+ ; CHECK-NEXT: vabsduw v2, v2, v3
91
87
; CHECK-NEXT: blr
92
88
; CHECK-PWR8-LABEL: sub_absv_32
93
89
; CHECK-PWR8: vsubuwm
@@ -100,7 +96,6 @@ entry:
100
96
; We do manage to find the word version of ABS but not the halfword.
101
97
; Threfore, we end up doing more work than is required with a pair of abs for word
102
98
; instead of just one for the halfword.
103
- ; Function Attrs: norecurse nounwind readnone
104
99
define <8 x i16 > @sub_absv_16 (<8 x i16 > %a , <8 x i16 > %b ) local_unnamed_addr {
105
100
entry:
106
101
%0 = sext <8 x i16 > %a to <8 x i32 >
@@ -303,15 +298,14 @@ entry:
303
298
; CHECK-PWR8: blr
304
299
}
305
300
306
- ; Function Attrs: nounwind readnone
307
301
define <4 x i32 > @sub_absv_vec_32 (<4 x i32 > %a , <4 x i32 > %b ) local_unnamed_addr {
308
302
entry:
309
303
%sub = sub <4 x i32 > %a , %b
310
304
%sub.i = sub <4 x i32 > zeroinitializer , %sub
311
305
%0 = tail call <4 x i32 > @llvm.ppc.altivec.vmaxsw (<4 x i32 > %sub , <4 x i32 > %sub.i )
312
306
ret <4 x i32 > %0
313
307
; CHECK-LABEL: sub_absv_vec_32
314
- ; CHECK: vabsduw 2, 2, 3
308
+ ; CHECK: vabsduw v2, v2, v3
315
309
; CHECK-NEXT: blr
316
310
; CHECK-PWR8-LABEL: sub_absv_vec_32
317
311
; CHECK-PWR8: xxlxor
@@ -320,15 +314,14 @@ entry:
320
314
; CHECK-PWR8: blr
321
315
}
322
316
323
- ; Function Attrs: nounwind readnone
324
317
define <8 x i16 > @sub_absv_vec_16 (<8 x i16 > %a , <8 x i16 > %b ) local_unnamed_addr {
325
318
entry:
326
319
%sub = sub <8 x i16 > %a , %b
327
320
%sub.i = sub <8 x i16 > zeroinitializer , %sub
328
321
%0 = tail call <8 x i16 > @llvm.ppc.altivec.vmaxsh (<8 x i16 > %sub , <8 x i16 > %sub.i )
329
322
ret <8 x i16 > %0
330
323
; CHECK-LABEL: sub_absv_vec_16
331
- ; CHECK: vabsduh 2, 2, 3
324
+ ; CHECK: vabsduh v2, v2, v3
332
325
; CHECK-NEXT: blr
333
326
; CHECK-PWR8-LABEL: sub_absv_vec_16
334
327
; CHECK-PWR8: xxlxor
@@ -337,15 +330,14 @@ entry:
337
330
; CHECK-PWR8: blr
338
331
}
339
332
340
- ; Function Attrs: nounwind readnone
341
333
define <16 x i8 > @sub_absv_vec_8 (<16 x i8 > %a , <16 x i8 > %b ) local_unnamed_addr {
342
334
entry:
343
335
%sub = sub <16 x i8 > %a , %b
344
336
%sub.i = sub <16 x i8 > zeroinitializer , %sub
345
337
%0 = tail call <16 x i8 > @llvm.ppc.altivec.vmaxsb (<16 x i8 > %sub , <16 x i8 > %sub.i )
346
338
ret <16 x i8 > %0
347
339
; CHECK-LABEL: sub_absv_vec_8
348
- ; CHECK: vabsdub 2, 2, 3
340
+ ; CHECK: vabsdub v2, v2, v3
349
341
; CHECK-NEXT: blr
350
342
; CHECK-PWR8-LABEL: sub_absv_vec_8
351
343
; CHECK-PWR8: xxlxor
@@ -355,12 +347,9 @@ entry:
355
347
}
356
348
357
349
358
- ; Function Attrs: nounwind readnone
359
350
declare <4 x i32 > @llvm.ppc.altivec.vmaxsw (<4 x i32 >, <4 x i32 >)
360
351
361
- ; Function Attrs: nounwind readnone
362
352
declare <8 x i16 > @llvm.ppc.altivec.vmaxsh (<8 x i16 >, <8 x i16 >)
363
353
364
- ; Function Attrs: nounwind readnone
365
354
declare <16 x i8 > @llvm.ppc.altivec.vmaxsb (<16 x i8 >, <16 x i8 >)
366
355
0 commit comments