1 // RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve2 -fallow-half-arguments-and-returns -S -O1 -Werror -Wall -emit-llvm -o - %s | FileCheck %s
2 // RUN: %clang_cc1 -DSVE_OVERLOADED_FORMS -triple aarch64-none-linux-gnu -target-feature +sve2 -fallow-half-arguments-and-returns -S -O1 -Werror -Wall -emit-llvm -o - %s | FileCheck %s
3 // RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve -fallow-half-arguments-and-returns -fsyntax-only -verify -verify-ignore-unexpected=error %s
4 // RUN: %clang_cc1 -DSVE_OVERLOADED_FORMS -triple aarch64-none-linux-gnu -target-feature +sve -fallow-half-arguments-and-returns -fsyntax-only -verify=overload -verify-ignore-unexpected=error %s
5
6 #include <arm_sve.h>
7
8 #ifdef SVE_OVERLOADED_FORMS
9 // A simple used,unused... macro, long enough to represent any SVE builtin.
10 #define SVE_ACLE_FUNC(A1,A2_UNUSED,A3,A4_UNUSED) A1##A3
11 #else
12 #define SVE_ACLE_FUNC(A1,A2,A3,A4) A1##A2##A3##A4
13 #endif
14
test_svaddp_s8_m(svbool_t pg,svint8_t op1,svint8_t op2)15 svint8_t test_svaddp_s8_m(svbool_t pg, svint8_t op1, svint8_t op2)
16 {
17 // CHECK-LABEL: test_svaddp_s8_m
18 // CHECK: %[[INTRINSIC:.*]] = call <vscale x 16 x i8> @llvm.aarch64.sve.addp.nxv16i8(<vscale x 16 x i1> %pg, <vscale x 16 x i8> %op1, <vscale x 16 x i8> %op2)
19 // CHECK: ret <vscale x 16 x i8> %[[INTRINSIC]]
20 // overload-warning@+2 {{implicit declaration of function 'svaddp_m'}}
21 // expected-warning@+1 {{implicit declaration of function 'svaddp_s8_m'}}
22 return SVE_ACLE_FUNC(svaddp,_s8,_m,)(pg, op1, op2);
23 }
24
test_svaddp_s16_m(svbool_t pg,svint16_t op1,svint16_t op2)25 svint16_t test_svaddp_s16_m(svbool_t pg, svint16_t op1, svint16_t op2)
26 {
27 // CHECK-LABEL: test_svaddp_s16_m
28 // CHECK: %[[PG:.*]] = call <vscale x 8 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv8i1(<vscale x 16 x i1> %pg)
29 // CHECK: %[[INTRINSIC:.*]] = call <vscale x 8 x i16> @llvm.aarch64.sve.addp.nxv8i16(<vscale x 8 x i1> %[[PG]], <vscale x 8 x i16> %op1, <vscale x 8 x i16> %op2)
30 // CHECK: ret <vscale x 8 x i16> %[[INTRINSIC]]
31 // overload-warning@+2 {{implicit declaration of function 'svaddp_m'}}
32 // expected-warning@+1 {{implicit declaration of function 'svaddp_s16_m'}}
33 return SVE_ACLE_FUNC(svaddp,_s16,_m,)(pg, op1, op2);
34 }
35
test_svaddp_s32_m(svbool_t pg,svint32_t op1,svint32_t op2)36 svint32_t test_svaddp_s32_m(svbool_t pg, svint32_t op1, svint32_t op2)
37 {
38 // CHECK-LABEL: test_svaddp_s32_m
39 // CHECK: %[[PG:.*]] = call <vscale x 4 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv4i1(<vscale x 16 x i1> %pg)
40 // CHECK: %[[INTRINSIC:.*]] = call <vscale x 4 x i32> @llvm.aarch64.sve.addp.nxv4i32(<vscale x 4 x i1> %[[PG]], <vscale x 4 x i32> %op1, <vscale x 4 x i32> %op2)
41 // CHECK: ret <vscale x 4 x i32> %[[INTRINSIC]]
42 // overload-warning@+2 {{implicit declaration of function 'svaddp_m'}}
43 // expected-warning@+1 {{implicit declaration of function 'svaddp_s32_m'}}
44 return SVE_ACLE_FUNC(svaddp,_s32,_m,)(pg, op1, op2);
45 }
46
test_svaddp_s64_m(svbool_t pg,svint64_t op1,svint64_t op2)47 svint64_t test_svaddp_s64_m(svbool_t pg, svint64_t op1, svint64_t op2)
48 {
49 // CHECK-LABEL: test_svaddp_s64_m
50 // CHECK: %[[PG:.*]] = call <vscale x 2 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv2i1(<vscale x 16 x i1> %pg)
51 // CHECK: %[[INTRINSIC:.*]] = call <vscale x 2 x i64> @llvm.aarch64.sve.addp.nxv2i64(<vscale x 2 x i1> %[[PG]], <vscale x 2 x i64> %op1, <vscale x 2 x i64> %op2)
52 // CHECK: ret <vscale x 2 x i64> %[[INTRINSIC]]
53 // overload-warning@+2 {{implicit declaration of function 'svaddp_m'}}
54 // expected-warning@+1 {{implicit declaration of function 'svaddp_s64_m'}}
55 return SVE_ACLE_FUNC(svaddp,_s64,_m,)(pg, op1, op2);
56 }
57
test_svaddp_u8_m(svbool_t pg,svuint8_t op1,svuint8_t op2)58 svuint8_t test_svaddp_u8_m(svbool_t pg, svuint8_t op1, svuint8_t op2)
59 {
60 // CHECK-LABEL: test_svaddp_u8_m
61 // CHECK: %[[INTRINSIC:.*]] = call <vscale x 16 x i8> @llvm.aarch64.sve.addp.nxv16i8(<vscale x 16 x i1> %pg, <vscale x 16 x i8> %op1, <vscale x 16 x i8> %op2)
62 // CHECK: ret <vscale x 16 x i8> %[[INTRINSIC]]
63 // overload-warning@+2 {{implicit declaration of function 'svaddp_m'}}
64 // expected-warning@+1 {{implicit declaration of function 'svaddp_u8_m'}}
65 return SVE_ACLE_FUNC(svaddp,_u8,_m,)(pg, op1, op2);
66 }
67
test_svaddp_u16_m(svbool_t pg,svuint16_t op1,svuint16_t op2)68 svuint16_t test_svaddp_u16_m(svbool_t pg, svuint16_t op1, svuint16_t op2)
69 {
70 // CHECK-LABEL: test_svaddp_u16_m
71 // CHECK: %[[PG:.*]] = call <vscale x 8 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv8i1(<vscale x 16 x i1> %pg)
72 // CHECK: %[[INTRINSIC:.*]] = call <vscale x 8 x i16> @llvm.aarch64.sve.addp.nxv8i16(<vscale x 8 x i1> %[[PG]], <vscale x 8 x i16> %op1, <vscale x 8 x i16> %op2)
73 // CHECK: ret <vscale x 8 x i16> %[[INTRINSIC]]
74 // overload-warning@+2 {{implicit declaration of function 'svaddp_m'}}
75 // expected-warning@+1 {{implicit declaration of function 'svaddp_u16_m'}}
76 return SVE_ACLE_FUNC(svaddp,_u16,_m,)(pg, op1, op2);
77 }
78
test_svaddp_u32_m(svbool_t pg,svuint32_t op1,svuint32_t op2)79 svuint32_t test_svaddp_u32_m(svbool_t pg, svuint32_t op1, svuint32_t op2)
80 {
81 // CHECK-LABEL: test_svaddp_u32_m
82 // CHECK: %[[PG:.*]] = call <vscale x 4 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv4i1(<vscale x 16 x i1> %pg)
83 // CHECK: %[[INTRINSIC:.*]] = call <vscale x 4 x i32> @llvm.aarch64.sve.addp.nxv4i32(<vscale x 4 x i1> %[[PG]], <vscale x 4 x i32> %op1, <vscale x 4 x i32> %op2)
84 // CHECK: ret <vscale x 4 x i32> %[[INTRINSIC]]
85 // overload-warning@+2 {{implicit declaration of function 'svaddp_m'}}
86 // expected-warning@+1 {{implicit declaration of function 'svaddp_u32_m'}}
87 return SVE_ACLE_FUNC(svaddp,_u32,_m,)(pg, op1, op2);
88 }
89
test_svaddp_u64_m(svbool_t pg,svuint64_t op1,svuint64_t op2)90 svuint64_t test_svaddp_u64_m(svbool_t pg, svuint64_t op1, svuint64_t op2)
91 {
92 // CHECK-LABEL: test_svaddp_u64_m
93 // CHECK: %[[PG:.*]] = call <vscale x 2 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv2i1(<vscale x 16 x i1> %pg)
94 // CHECK: %[[INTRINSIC:.*]] = call <vscale x 2 x i64> @llvm.aarch64.sve.addp.nxv2i64(<vscale x 2 x i1> %[[PG]], <vscale x 2 x i64> %op1, <vscale x 2 x i64> %op2)
95 // CHECK: ret <vscale x 2 x i64> %[[INTRINSIC]]
96 // overload-warning@+2 {{implicit declaration of function 'svaddp_m'}}
97 // expected-warning@+1 {{implicit declaration of function 'svaddp_u64_m'}}
98 return SVE_ACLE_FUNC(svaddp,_u64,_m,)(pg, op1, op2);
99 }
100
test_svaddp_s8_x(svbool_t pg,svint8_t op1,svint8_t op2)101 svint8_t test_svaddp_s8_x(svbool_t pg, svint8_t op1, svint8_t op2)
102 {
103 // CHECK-LABEL: test_svaddp_s8_x
104 // CHECK: %[[INTRINSIC:.*]] = call <vscale x 16 x i8> @llvm.aarch64.sve.addp.nxv16i8(<vscale x 16 x i1> %pg, <vscale x 16 x i8> %op1, <vscale x 16 x i8> %op2)
105 // CHECK: ret <vscale x 16 x i8> %[[INTRINSIC]]
106 // overload-warning@+2 {{implicit declaration of function 'svaddp_x'}}
107 // expected-warning@+1 {{implicit declaration of function 'svaddp_s8_x'}}
108 return SVE_ACLE_FUNC(svaddp,_s8,_x,)(pg, op1, op2);
109 }
110
test_svaddp_s16_x(svbool_t pg,svint16_t op1,svint16_t op2)111 svint16_t test_svaddp_s16_x(svbool_t pg, svint16_t op1, svint16_t op2)
112 {
113 // CHECK-LABEL: test_svaddp_s16_x
114 // CHECK: %[[PG:.*]] = call <vscale x 8 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv8i1(<vscale x 16 x i1> %pg)
115 // CHECK: %[[INTRINSIC:.*]] = call <vscale x 8 x i16> @llvm.aarch64.sve.addp.nxv8i16(<vscale x 8 x i1> %[[PG]], <vscale x 8 x i16> %op1, <vscale x 8 x i16> %op2)
116 // CHECK: ret <vscale x 8 x i16> %[[INTRINSIC]]
117 // overload-warning@+2 {{implicit declaration of function 'svaddp_x'}}
118 // expected-warning@+1 {{implicit declaration of function 'svaddp_s16_x'}}
119 return SVE_ACLE_FUNC(svaddp,_s16,_x,)(pg, op1, op2);
120 }
121
test_svaddp_s32_x(svbool_t pg,svint32_t op1,svint32_t op2)122 svint32_t test_svaddp_s32_x(svbool_t pg, svint32_t op1, svint32_t op2)
123 {
124 // CHECK-LABEL: test_svaddp_s32_x
125 // CHECK: %[[PG:.*]] = call <vscale x 4 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv4i1(<vscale x 16 x i1> %pg)
126 // CHECK: %[[INTRINSIC:.*]] = call <vscale x 4 x i32> @llvm.aarch64.sve.addp.nxv4i32(<vscale x 4 x i1> %[[PG]], <vscale x 4 x i32> %op1, <vscale x 4 x i32> %op2)
127 // CHECK: ret <vscale x 4 x i32> %[[INTRINSIC]]
128 // overload-warning@+2 {{implicit declaration of function 'svaddp_x'}}
129 // expected-warning@+1 {{implicit declaration of function 'svaddp_s32_x'}}
130 return SVE_ACLE_FUNC(svaddp,_s32,_x,)(pg, op1, op2);
131 }
132
test_svaddp_s64_x(svbool_t pg,svint64_t op1,svint64_t op2)133 svint64_t test_svaddp_s64_x(svbool_t pg, svint64_t op1, svint64_t op2)
134 {
135 // CHECK-LABEL: test_svaddp_s64_x
136 // CHECK: %[[PG:.*]] = call <vscale x 2 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv2i1(<vscale x 16 x i1> %pg)
137 // CHECK: %[[INTRINSIC:.*]] = call <vscale x 2 x i64> @llvm.aarch64.sve.addp.nxv2i64(<vscale x 2 x i1> %[[PG]], <vscale x 2 x i64> %op1, <vscale x 2 x i64> %op2)
138 // CHECK: ret <vscale x 2 x i64> %[[INTRINSIC]]
139 // overload-warning@+2 {{implicit declaration of function 'svaddp_x'}}
140 // expected-warning@+1 {{implicit declaration of function 'svaddp_s64_x'}}
141 return SVE_ACLE_FUNC(svaddp,_s64,_x,)(pg, op1, op2);
142 }
143
test_svaddp_u8_x(svbool_t pg,svuint8_t op1,svuint8_t op2)144 svuint8_t test_svaddp_u8_x(svbool_t pg, svuint8_t op1, svuint8_t op2)
145 {
146 // CHECK-LABEL: test_svaddp_u8_x
147 // CHECK: %[[INTRINSIC:.*]] = call <vscale x 16 x i8> @llvm.aarch64.sve.addp.nxv16i8(<vscale x 16 x i1> %pg, <vscale x 16 x i8> %op1, <vscale x 16 x i8> %op2)
148 // CHECK: ret <vscale x 16 x i8> %[[INTRINSIC]]
149 // overload-warning@+2 {{implicit declaration of function 'svaddp_x'}}
150 // expected-warning@+1 {{implicit declaration of function 'svaddp_u8_x'}}
151 return SVE_ACLE_FUNC(svaddp,_u8,_x,)(pg, op1, op2);
152 }
153
test_svaddp_u16_x(svbool_t pg,svuint16_t op1,svuint16_t op2)154 svuint16_t test_svaddp_u16_x(svbool_t pg, svuint16_t op1, svuint16_t op2)
155 {
156 // CHECK-LABEL: test_svaddp_u16_x
157 // CHECK: %[[PG:.*]] = call <vscale x 8 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv8i1(<vscale x 16 x i1> %pg)
158 // CHECK: %[[INTRINSIC:.*]] = call <vscale x 8 x i16> @llvm.aarch64.sve.addp.nxv8i16(<vscale x 8 x i1> %[[PG]], <vscale x 8 x i16> %op1, <vscale x 8 x i16> %op2)
159 // CHECK: ret <vscale x 8 x i16> %[[INTRINSIC]]
160 // overload-warning@+2 {{implicit declaration of function 'svaddp_x'}}
161 // expected-warning@+1 {{implicit declaration of function 'svaddp_u16_x'}}
162 return SVE_ACLE_FUNC(svaddp,_u16,_x,)(pg, op1, op2);
163 }
164
test_svaddp_u32_x(svbool_t pg,svuint32_t op1,svuint32_t op2)165 svuint32_t test_svaddp_u32_x(svbool_t pg, svuint32_t op1, svuint32_t op2)
166 {
167 // CHECK-LABEL: test_svaddp_u32_x
168 // CHECK: %[[PG:.*]] = call <vscale x 4 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv4i1(<vscale x 16 x i1> %pg)
169 // CHECK: %[[INTRINSIC:.*]] = call <vscale x 4 x i32> @llvm.aarch64.sve.addp.nxv4i32(<vscale x 4 x i1> %[[PG]], <vscale x 4 x i32> %op1, <vscale x 4 x i32> %op2)
170 // CHECK: ret <vscale x 4 x i32> %[[INTRINSIC]]
171 // overload-warning@+2 {{implicit declaration of function 'svaddp_x'}}
172 // expected-warning@+1 {{implicit declaration of function 'svaddp_u32_x'}}
173 return SVE_ACLE_FUNC(svaddp,_u32,_x,)(pg, op1, op2);
174 }
175
test_svaddp_u64_x(svbool_t pg,svuint64_t op1,svuint64_t op2)176 svuint64_t test_svaddp_u64_x(svbool_t pg, svuint64_t op1, svuint64_t op2)
177 {
178 // CHECK-LABEL: test_svaddp_u64_x
179 // CHECK: %[[PG:.*]] = call <vscale x 2 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv2i1(<vscale x 16 x i1> %pg)
180 // CHECK: %[[INTRINSIC:.*]] = call <vscale x 2 x i64> @llvm.aarch64.sve.addp.nxv2i64(<vscale x 2 x i1> %[[PG]], <vscale x 2 x i64> %op1, <vscale x 2 x i64> %op2)
181 // CHECK: ret <vscale x 2 x i64> %[[INTRINSIC]]
182 // overload-warning@+2 {{implicit declaration of function 'svaddp_x'}}
183 // expected-warning@+1 {{implicit declaration of function 'svaddp_u64_x'}}
184 return SVE_ACLE_FUNC(svaddp,_u64,_x,)(pg, op1, op2);
185 }
186
test_svaddp_f16_m(svbool_t pg,svfloat16_t op1,svfloat16_t op2)187 svfloat16_t test_svaddp_f16_m(svbool_t pg, svfloat16_t op1, svfloat16_t op2)
188 {
189 // CHECK-LABEL: test_svaddp_f16_m
190 // CHECK: %[[PG:.*]] = call <vscale x 8 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv8i1(<vscale x 16 x i1> %pg)
191 // CHECK: %[[INTRINSIC:.*]] = call <vscale x 8 x half> @llvm.aarch64.sve.faddp.nxv8f16(<vscale x 8 x i1> %[[PG]], <vscale x 8 x half> %op1, <vscale x 8 x half> %op2)
192 // CHECK: ret <vscale x 8 x half> %[[INTRINSIC]]
193 // overload-warning@+2 {{implicit declaration of function 'svaddp_m'}}
194 // expected-warning@+1 {{implicit declaration of function 'svaddp_f16_m'}}
195 return SVE_ACLE_FUNC(svaddp,_f16,_m,)(pg, op1, op2);
196 }
197
test_svaddp_f32_m(svbool_t pg,svfloat32_t op1,svfloat32_t op2)198 svfloat32_t test_svaddp_f32_m(svbool_t pg, svfloat32_t op1, svfloat32_t op2)
199 {
200 // CHECK-LABEL: test_svaddp_f32_m
201 // CHECK: %[[PG:.*]] = call <vscale x 4 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv4i1(<vscale x 16 x i1> %pg)
202 // CHECK: %[[INTRINSIC:.*]] = call <vscale x 4 x float> @llvm.aarch64.sve.faddp.nxv4f32(<vscale x 4 x i1> %[[PG]], <vscale x 4 x float> %op1, <vscale x 4 x float> %op2)
203 // CHECK: ret <vscale x 4 x float> %[[INTRINSIC]]
204 // overload-warning@+2 {{implicit declaration of function 'svaddp_m'}}
205 // expected-warning@+1 {{implicit declaration of function 'svaddp_f32_m'}}
206 return SVE_ACLE_FUNC(svaddp,_f32,_m,)(pg, op1, op2);
207 }
208
test_svaddp_f64_m(svbool_t pg,svfloat64_t op1,svfloat64_t op2)209 svfloat64_t test_svaddp_f64_m(svbool_t pg, svfloat64_t op1, svfloat64_t op2)
210 {
211 // CHECK-LABEL: test_svaddp_f64_m
212 // CHECK: %[[PG:.*]] = call <vscale x 2 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv2i1(<vscale x 16 x i1> %pg)
213 // CHECK: %[[INTRINSIC:.*]] = call <vscale x 2 x double> @llvm.aarch64.sve.faddp.nxv2f64(<vscale x 2 x i1> %[[PG]], <vscale x 2 x double> %op1, <vscale x 2 x double> %op2)
214 // CHECK: ret <vscale x 2 x double> %[[INTRINSIC]]
215 // overload-warning@+2 {{implicit declaration of function 'svaddp_m'}}
216 // expected-warning@+1 {{implicit declaration of function 'svaddp_f64_m'}}
217 return SVE_ACLE_FUNC(svaddp,_f64,_m,)(pg, op1, op2);
218 }
219
test_svaddp_f16_x(svbool_t pg,svfloat16_t op1,svfloat16_t op2)220 svfloat16_t test_svaddp_f16_x(svbool_t pg, svfloat16_t op1, svfloat16_t op2)
221 {
222 // CHECK-LABEL: test_svaddp_f16_x
223 // CHECK: %[[PG:.*]] = call <vscale x 8 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv8i1(<vscale x 16 x i1> %pg)
224 // CHECK: %[[INTRINSIC:.*]] = call <vscale x 8 x half> @llvm.aarch64.sve.faddp.nxv8f16(<vscale x 8 x i1> %[[PG]], <vscale x 8 x half> %op1, <vscale x 8 x half> %op2)
225 // CHECK: ret <vscale x 8 x half> %[[INTRINSIC]]
226 // overload-warning@+2 {{implicit declaration of function 'svaddp_x'}}
227 // expected-warning@+1 {{implicit declaration of function 'svaddp_f16_x'}}
228 return SVE_ACLE_FUNC(svaddp,_f16,_x,)(pg, op1, op2);
229 }
230
test_svaddp_f32_x(svbool_t pg,svfloat32_t op1,svfloat32_t op2)231 svfloat32_t test_svaddp_f32_x(svbool_t pg, svfloat32_t op1, svfloat32_t op2)
232 {
233 // CHECK-LABEL: test_svaddp_f32_x
234 // CHECK: %[[PG:.*]] = call <vscale x 4 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv4i1(<vscale x 16 x i1> %pg)
235 // CHECK: %[[INTRINSIC:.*]] = call <vscale x 4 x float> @llvm.aarch64.sve.faddp.nxv4f32(<vscale x 4 x i1> %[[PG]], <vscale x 4 x float> %op1, <vscale x 4 x float> %op2)
236 // CHECK: ret <vscale x 4 x float> %[[INTRINSIC]]
237 // overload-warning@+2 {{implicit declaration of function 'svaddp_x'}}
238 // expected-warning@+1 {{implicit declaration of function 'svaddp_f32_x'}}
239 return SVE_ACLE_FUNC(svaddp,_f32,_x,)(pg, op1, op2);
240 }
241
test_svaddp_f64_x(svbool_t pg,svfloat64_t op1,svfloat64_t op2)242 svfloat64_t test_svaddp_f64_x(svbool_t pg, svfloat64_t op1, svfloat64_t op2)
243 {
244 // CHECK-LABEL: test_svaddp_f64_x
245 // CHECK: %[[PG:.*]] = call <vscale x 2 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv2i1(<vscale x 16 x i1> %pg)
246 // CHECK: %[[INTRINSIC:.*]] = call <vscale x 2 x double> @llvm.aarch64.sve.faddp.nxv2f64(<vscale x 2 x i1> %[[PG]], <vscale x 2 x double> %op1, <vscale x 2 x double> %op2)
247 // CHECK: ret <vscale x 2 x double> %[[INTRINSIC]]
248 // overload-warning@+2 {{implicit declaration of function 'svaddp_x'}}
249 // expected-warning@+1 {{implicit declaration of function 'svaddp_f64_x'}}
250 return SVE_ACLE_FUNC(svaddp,_f64,_x,)(pg, op1, op2);
251 }
252