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
| ; Test vector logical shift right with scalar shift amount.
;
; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z13 | FileCheck %s
; Test a v16i8 shift by a variable.
define <16 x i8> @f1(<16 x i8> %dummy, <16 x i8> %val1, i32 %shift) {
; CHECK-LABEL: f1:
; CHECK: vesrlb %v24, %v26, 0(%r2)
; CHECK: br %r14
%truncshift = trunc i32 %shift to i8
%shiftvec = insertelement <16 x i8> undef, i8 %truncshift, i32 0
%val2 = shufflevector <16 x i8> %shiftvec, <16 x i8> undef,
<16 x i32> zeroinitializer
%ret = lshr <16 x i8> %val1, %val2
ret <16 x i8> %ret
}
; Test a v16i8 shift by the lowest useful constant.
define <16 x i8> @f2(<16 x i8> %dummy, <16 x i8> %val) {
; CHECK-LABEL: f2:
; CHECK: vesrlb %v24, %v26, 1
; CHECK: br %r14
%ret = lshr <16 x i8> %val, <i8 1, i8 1, i8 1, i8 1,
i8 1, i8 1, i8 1, i8 1,
i8 1, i8 1, i8 1, i8 1,
i8 1, i8 1, i8 1, i8 1>
ret <16 x i8> %ret
}
; Test a v16i8 shift by the highest useful constant.
define <16 x i8> @f3(<16 x i8> %dummy, <16 x i8> %val) {
; CHECK-LABEL: f3:
; CHECK: vesrlb %v24, %v26, 7
; CHECK: br %r14
%ret = lshr <16 x i8> %val, <i8 7, i8 7, i8 7, i8 7,
i8 7, i8 7, i8 7, i8 7,
i8 7, i8 7, i8 7, i8 7,
i8 7, i8 7, i8 7, i8 7>
ret <16 x i8> %ret
}
; Test a v8i16 shift by a variable.
define <8 x i16> @f4(<8 x i16> %dummy, <8 x i16> %val1, i32 %shift) {
; CHECK-LABEL: f4:
; CHECK: vesrlh %v24, %v26, 0(%r2)
; CHECK: br %r14
%truncshift = trunc i32 %shift to i16
%shiftvec = insertelement <8 x i16> undef, i16 %truncshift, i32 0
%val2 = shufflevector <8 x i16> %shiftvec, <8 x i16> undef,
<8 x i32> zeroinitializer
%ret = lshr <8 x i16> %val1, %val2
ret <8 x i16> %ret
}
; Test a v8i16 shift by the lowest useful constant.
define <8 x i16> @f5(<8 x i16> %dummy, <8 x i16> %val) {
; CHECK-LABEL: f5:
; CHECK: vesrlh %v24, %v26, 1
; CHECK: br %r14
%ret = lshr <8 x i16> %val, <i16 1, i16 1, i16 1, i16 1,
i16 1, i16 1, i16 1, i16 1>
ret <8 x i16> %ret
}
; Test a v8i16 shift by the highest useful constant.
define <8 x i16> @f6(<8 x i16> %dummy, <8 x i16> %val) {
; CHECK-LABEL: f6:
; CHECK: vesrlh %v24, %v26, 15
; CHECK: br %r14
%ret = lshr <8 x i16> %val, <i16 15, i16 15, i16 15, i16 15,
i16 15, i16 15, i16 15, i16 15>
ret <8 x i16> %ret
}
; Test a v4i32 shift by a variable.
define <4 x i32> @f7(<4 x i32> %dummy, <4 x i32> %val1, i32 %shift) {
; CHECK-LABEL: f7:
; CHECK: vesrlf %v24, %v26, 0(%r2)
; CHECK: br %r14
%shiftvec = insertelement <4 x i32> undef, i32 %shift, i32 0
%val2 = shufflevector <4 x i32> %shiftvec, <4 x i32> undef,
<4 x i32> zeroinitializer
%ret = lshr <4 x i32> %val1, %val2
ret <4 x i32> %ret
}
; Test a v4i32 shift by the lowest useful constant.
define <4 x i32> @f8(<4 x i32> %dummy, <4 x i32> %val) {
; CHECK-LABEL: f8:
; CHECK: vesrlf %v24, %v26, 1
; CHECK: br %r14
%ret = lshr <4 x i32> %val, <i32 1, i32 1, i32 1, i32 1>
ret <4 x i32> %ret
}
; Test a v4i32 shift by the highest useful constant.
define <4 x i32> @f9(<4 x i32> %dummy, <4 x i32> %val) {
; CHECK-LABEL: f9:
; CHECK: vesrlf %v24, %v26, 31
; CHECK: br %r14
%ret = lshr <4 x i32> %val, <i32 31, i32 31, i32 31, i32 31>
ret <4 x i32> %ret
}
; Test a v2i64 shift by a variable.
define <2 x i64> @f10(<2 x i64> %dummy, <2 x i64> %val1, i32 %shift) {
; CHECK-LABEL: f10:
; CHECK: vesrlg %v24, %v26, 0(%r2)
; CHECK: br %r14
%extshift = sext i32 %shift to i64
%shiftvec = insertelement <2 x i64> undef, i64 %extshift, i32 0
%val2 = shufflevector <2 x i64> %shiftvec, <2 x i64> undef,
<2 x i32> zeroinitializer
%ret = lshr <2 x i64> %val1, %val2
ret <2 x i64> %ret
}
; Test a v2i64 shift by the lowest useful constant.
define <2 x i64> @f11(<2 x i64> %dummy, <2 x i64> %val) {
; CHECK-LABEL: f11:
; CHECK: vesrlg %v24, %v26, 1
; CHECK: br %r14
%ret = lshr <2 x i64> %val, <i64 1, i64 1>
ret <2 x i64> %ret
}
; Test a v2i64 shift by the highest useful constant.
define <2 x i64> @f12(<2 x i64> %dummy, <2 x i64> %val) {
; CHECK-LABEL: f12:
; CHECK: vesrlg %v24, %v26, 63
; CHECK: br %r14
%ret = lshr <2 x i64> %val, <i64 63, i64 63>
ret <2 x i64> %ret
}
|