@@ -17,110 +17,164 @@ public static void TestPredicateInstructions()
17
17
{
18
18
if ( Sve . IsSupported )
19
19
{
20
- ZipLow ( ) ;
21
- ZipHigh ( ) ;
22
- UnzipOdd ( ) ;
23
- UnzipEven ( ) ;
24
- TransposeOdd ( ) ;
25
- TransposeEven ( ) ;
26
- ReverseElement ( ) ;
27
- And ( ) ;
28
- BitwiseClear ( ) ;
29
- Xor ( ) ;
30
- Or ( ) ;
31
- ConditionalSelect ( ) ;
20
+ Vector < sbyte > vecsb = Vector . Create < sbyte > ( 2 ) ;
21
+ Vector < short > vecs = Vector . Create < short > ( 2 ) ;
22
+ Vector < ushort > vecus = Vector . Create < ushort > ( 2 ) ;
23
+ Vector < int > veci = Vector . Create < int > ( 3 ) ;
24
+ Vector < uint > vecui = Vector . Create < uint > ( 5 ) ;
25
+ Vector < long > vecl = Vector . Create < long > ( 7 ) ;
26
+
27
+ ZipLowMask ( vecs , vecs ) ;
28
+ ZipHighMask ( vecui , vecui ) ;
29
+ UnzipOddMask ( vecs , vecs ) ;
30
+ UnzipEvenMask ( vecsb , vecsb ) ;
31
+ TransposeEvenMask ( vecl , vecl ) ;
32
+ TransposeOddMask ( vecs , vecs ) ;
33
+ ReverseElementMask ( vecs , vecs ) ;
34
+ AndMask ( vecs , vecs ) ;
35
+ BitwiseClearMask ( vecs , vecs ) ;
36
+ XorMask ( veci , veci ) ;
37
+ OrMask ( vecs , vecs ) ;
38
+ ConditionalSelectMask ( veci , veci , veci ) ;
39
+
40
+ UnzipEvenZipLowMask ( vecs , vecs ) ;
41
+ TransposeEvenAndMask ( vecs , vecs , vecs ) ;
42
+
32
43
}
33
44
}
34
45
46
+ // These should use the predicate variants.
47
+ // Sve intrinsics that return masks (Compare) or use mask arguments (CreateBreakAfterMask) are used
48
+ // to ensure masks are used.
49
+
50
+
35
51
[ MethodImpl ( MethodImplOptions . NoInlining ) ]
36
- static Vector < short > ZipLow ( )
52
+ static Vector < short > ZipLowMask ( Vector < short > a , Vector < short > b )
37
53
{
38
- return Sve . ZipLow ( Vector < short > . Zero , Sve . CreateTrueMaskInt16 ( ) ) ;
54
+ //ARM64-FULL-LINE: zip1 {{p[0-9]+}}.h, {{p[0-9]+}}.h, {{p[0-9]+}}.h
55
+ return Sve . ZipLow ( Sve . CompareGreaterThan ( a , b ) , Sve . CompareEqual ( a , b ) ) ;
39
56
}
40
57
41
58
[ MethodImpl ( MethodImplOptions . NoInlining ) ]
42
- static Vector < uint > ZipHigh ( )
59
+ static Vector < uint > ZipHighMask ( Vector < uint > a , Vector < uint > b )
43
60
{
44
- return Sve . ZipHigh ( Sve . CreateTrueMaskUInt32 ( ) , Sve . CreateTrueMaskUInt32 ( ) ) ;
61
+ //ARM64-FULL-LINE: zip2 {{p[0-9]+}}.s, {{p[0-9]+}}.s, {{p[0-9]+}}.s
62
+ return Sve . CreateBreakAfterMask ( Sve . ZipHigh ( Sve . CompareGreaterThan ( a , b ) , Sve . CompareEqual ( a , b ) ) , Sve . CreateTrueMaskUInt32 ( ) ) ;
45
63
}
46
64
47
65
[ MethodImpl ( MethodImplOptions . NoInlining ) ]
48
- static Vector < sbyte > UnzipEven ( )
66
+ static Vector < sbyte > UnzipEvenMask ( Vector < sbyte > a , Vector < sbyte > b )
49
67
{
50
- return Sve . UnzipEven ( Sve . CreateTrueMaskSByte ( ) , Vector < sbyte > . Zero ) ;
68
+ //ARM64-FULL-LINE: uzp1 {{p[0-9]+}}.b, {{p[0-9]+}}.b, {{p[0-9]+}}.b
69
+ return Sve . UnzipEven ( Sve . CompareGreaterThan ( a , b ) , Sve . CompareEqual ( a , b ) ) ;
51
70
}
52
71
53
72
[ MethodImpl ( MethodImplOptions . NoInlining ) ]
54
- static Vector < short > UnzipOdd ( )
73
+ static Vector < short > UnzipOddMask ( Vector < short > a , Vector < short > b )
55
74
{
56
- return Sve . UnzipOdd ( Sve . CreateTrueMaskInt16 ( ) , Sve . CreateFalseMaskInt16 ( ) ) ;
75
+ //ARM64-FULL-LINE: uzp2 {{p[0-9]+}}.h, {{p[0-9]+}}.h, {{p[0-9]+}}.h
76
+ return Sve . CreateBreakAfterMask ( Sve . UnzipOdd ( Sve . CompareGreaterThan ( a , b ) , Sve . CompareEqual ( a , b ) ) , Sve . CreateTrueMaskInt16 ( ) ) ;
57
77
}
58
78
59
79
[ MethodImpl ( MethodImplOptions . NoInlining ) ]
60
- static Vector < long > TransposeEven ( )
80
+ static Vector < long > TransposeEvenMask ( Vector < long > a , Vector < long > b )
61
81
{
62
- return Sve . TransposeEven ( Sve . CreateFalseMaskInt64 ( ) , Sve . CreateTrueMaskInt64 ( ) ) ;
82
+ //ARM64-FULL-LINE: trn1 {{p[0-9]+}}.d, {{p[0-9]+}}.d, {{p[0-9]+}}.d
83
+ return Sve . CreateBreakAfterMask ( Sve . TransposeEven ( Sve . CompareGreaterThan ( a , b ) , Sve . CompareEqual ( a , b ) ) , Sve . CreateFalseMaskInt64 ( ) ) ;
63
84
}
64
85
65
86
[ MethodImpl ( MethodImplOptions . NoInlining ) ]
66
- static Vector < short > TransposeOdd ( )
87
+ static Vector < short > TransposeOddMask ( Vector < short > a , Vector < short > b )
67
88
{
68
- return Sve . TransposeOdd ( Vector < short > . Zero , Sve . CreateTrueMaskInt16 ( ) ) ;
89
+ //ARM64-FULL-LINE: trn2 {{p[0-9]+}}.h, {{p[0-9]+}}.h, {{p[0-9]+}}.h
90
+ return Sve . TransposeOdd ( Sve . CompareGreaterThan ( a , b ) , Sve . CompareEqual ( a , b ) ) ;
69
91
}
70
92
71
93
[ MethodImpl ( MethodImplOptions . NoInlining ) ]
72
- static Vector < short > ReverseElement ( )
94
+ static Vector < short > ReverseElementMask ( Vector < short > a , Vector < short > b )
73
95
{
74
- return Sve . ReverseElement ( Sve . CreateTrueMaskInt16 ( ) ) ;
96
+ //ARM64-FULL-LINE: rev {{p[0-9]+}}.h, {{p[0-9]+}}.h
97
+ return Sve . CreateBreakAfterMask ( Sve . ReverseElement ( Sve . CompareGreaterThan ( a , b ) ) , Sve . CreateFalseMaskInt16 ( ) ) ;
75
98
}
76
99
77
100
[ MethodImpl ( MethodImplOptions . NoInlining ) ]
78
- static Vector < short > And ( )
101
+ static Vector < short > AndMask ( Vector < short > a , Vector < short > b )
79
102
{
80
- return Sve . ConditionalSelect (
81
- Sve . CreateTrueMaskInt16 ( ) ,
82
- Sve . And ( Sve . CreateTrueMaskInt16 ( ) , Sve . CreateTrueMaskInt16 ( ) ) ,
83
- Vector < short > . Zero
84
- ) ;
103
+ //ARM64-FULL-LINE: and {{p[0-9]+}}.b, {{p[0-9]+}}/z, {{p[0-9]+}}.b, {{p[0-9]+}}.b
104
+ return Sve . CreateBreakAfterMask (
105
+ Sve . ConditionalSelect (
106
+ Sve . CreateTrueMaskInt16 ( ) ,
107
+ Sve . And ( Sve . CompareGreaterThan ( a , b ) , Sve . CompareEqual ( a , b ) ) ,
108
+ Vector < short > . Zero ) ,
109
+ Sve . CreateFalseMaskInt16 ( ) ) ;
85
110
}
86
111
87
112
[ MethodImpl ( MethodImplOptions . NoInlining ) ]
88
- static Vector < short > BitwiseClear ( )
113
+ static Vector < short > BitwiseClearMask ( Vector < short > a , Vector < short > b )
89
114
{
115
+ //ARM64-FULL-LINE: bic {{p[0-9]+}}.b, {{p[0-9]+}}/z, {{p[0-9]+}}.b, {{p[0-9]+}}.b
90
116
return Sve . ConditionalSelect (
91
- Sve . CreateFalseMaskInt16 ( ) ,
92
- Sve . BitwiseClear ( Sve . CreateTrueMaskInt16 ( ) , Sve . CreateTrueMaskInt16 ( ) ) ,
93
- Vector < short > . Zero
94
- ) ;
117
+ Sve . CreateTrueMaskInt16 ( ) ,
118
+ Sve . BitwiseClear ( Sve . CompareGreaterThan ( a , b ) , Sve . CompareEqual ( a , b ) ) ,
119
+ Vector < short > . Zero ) ;
95
120
}
96
121
97
122
[ MethodImpl ( MethodImplOptions . NoInlining ) ]
98
- static Vector < int > Xor ( )
123
+ static Vector < int > XorMask ( Vector < int > a , Vector < int > b )
99
124
{
100
- return Sve . ConditionalSelect (
101
- Sve . CreateTrueMaskInt32 ( ) ,
102
- Sve . Xor ( Sve . CreateTrueMaskInt32 ( ) , Sve . CreateTrueMaskInt32 ( ) ) ,
103
- Vector < int > . Zero
104
- ) ;
125
+ //ARM64-FULL-LINE: eor {{p[0-9]+}}.b, {{p[0-9]+}}/z, {{p[0-9]+}}.b, {{p[0-9]+}}.b
126
+ return Sve . CreateBreakAfterMask (
127
+ Sve . ConditionalSelect (
128
+ Sve . CreateTrueMaskInt32 ( ) ,
129
+ Sve . Xor ( Sve . CompareGreaterThan ( a , b ) , Sve . CompareEqual ( a , b ) ) ,
130
+ Vector < int > . Zero ) ,
131
+ Sve . CreateFalseMaskInt32 ( ) ) ;
105
132
}
106
133
107
134
[ MethodImpl ( MethodImplOptions . NoInlining ) ]
108
- static Vector < short > Or ( )
135
+ static Vector < short > OrMask ( Vector < short > a , Vector < short > b )
109
136
{
137
+ //ARM64-FULL-LINE: orr {{p[0-9]+}}.b, {{p[0-9]+}}/z, {{p[0-9]+}}.b, {{p[0-9]+}}.b
110
138
return Sve . ConditionalSelect (
111
- Sve . CreateTrueMaskInt16 ( ) ,
112
- Sve . Or ( Sve . CreateTrueMaskInt16 ( ) , Sve . CreateTrueMaskInt16 ( ) ) ,
113
- Vector < short > . Zero
114
- ) ;
139
+ Sve . CreateTrueMaskInt16 ( ) ,
140
+ Sve . Or ( Sve . CompareGreaterThan ( a , b ) , Sve . CompareEqual ( a , b ) ) ,
141
+ Vector < short > . Zero ) ;
115
142
}
116
143
117
144
[ MethodImpl ( MethodImplOptions . NoInlining ) ]
118
- static Vector < int > ConditionalSelect ( )
145
+ static Vector < int > ConditionalSelectMask ( Vector < int > v , Vector < int > a , Vector < int > b )
119
146
{
120
- return Sve . ConditionalSelect (
121
- Vector < int > . Zero ,
122
- Sve . CreateFalseMaskInt32 ( ) ,
123
- Sve . CreateTrueMaskInt32 ( )
124
- ) ;
147
+ // Use a passed in vector for the mask to prevent optimising away the select
148
+ //ARM64-FULL-LINE: sel {{p[0-9]+}}.b, {{p[0-9]+}}, {{p[0-9]+}}.b, {{p[0-9]+}}.b
149
+ return Sve . CreateBreakAfterMask (
150
+ Sve . ConditionalSelect ( v , Sve . CompareGreaterThan ( a , b ) , Sve . CompareEqual ( a , b ) ) ,
151
+ Sve . CreateFalseMaskInt32 ( ) ) ;
152
+ }
153
+
154
+ // These have multiple uses of the predicate variants
155
+
156
+ [ MethodImpl ( MethodImplOptions . NoInlining ) ]
157
+ static Vector < short > UnzipEvenZipLowMask ( Vector < short > a , Vector < short > b )
158
+ {
159
+ //ARM64-FULL-LINE: zip1 {{p[0-9]+}}.h, {{p[0-9]+}}.h, {{p[0-9]+}}.h
160
+ //ARM64-FULL-LINE: uzp1 {{p[0-9]+}}.h, {{p[0-9]+}}.h, {{p[0-9]+}}.h
161
+ return Sve . CreateBreakAfterMask (
162
+ Sve . UnzipEven (
163
+ Sve . ZipLow ( Sve . CompareGreaterThan ( a , b ) , Sve . CompareEqual ( a , b ) ) ,
164
+ Sve . CompareLessThan ( a , b ) ) ,
165
+ Sve . CreateTrueMaskInt16 ( ) ) ;
166
+ }
167
+
168
+ [ MethodImpl ( MethodImplOptions . NoInlining ) ]
169
+ static Vector < short > TransposeEvenAndMask ( Vector < short > v , Vector < short > a , Vector < short > b )
170
+ {
171
+ //ARM64-FULL-LINE: and {{p[0-9]+}}.b, {{p[0-9]+}}/z, {{p[0-9]+}}.b, {{p[0-9]+}}.b
172
+ //ARM64-FULL-LINE: trn1 {{p[0-9]+}}.h, {{p[0-9]+}}.h, {{p[0-9]+}}.h
173
+ return Sve . TransposeEven (
174
+ Sve . CompareGreaterThan ( a , b ) ,
175
+ Sve . ConditionalSelect (
176
+ Sve . CreateTrueMaskInt16 ( ) ,
177
+ Sve . And ( Sve . CompareGreaterThan ( a , b ) , Sve . CompareEqual ( a , b ) ) ,
178
+ Sve . CompareLessThan ( a , b ) ) ) ;
125
179
}
126
- }
180
+ }
0 commit comments