operators.exp revision 1.5
1# Copyright 2010-2015 Free Software Foundation, Inc.
2
3# This program is free software; you can redistribute it and/or modify
4# it under the terms of the GNU General Public License as published by
5# the Free Software Foundation; either version 3 of the License, or
6# (at your option) any later version.
7#
8# This program is distributed in the hope that it will be useful,
9# but WITHOUT ANY WARRANTY; without even the implied warranty of
10# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11# GNU General Public License for more details.
12#
13# You should have received a copy of the GNU General Public License
14# along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
15#
16# Contributed by Ken Werner <ken.werner@de.ibm.com>.
17#
18# Tests GDBs support for OpenCL operators.
19
20load_lib opencl.exp
21
22if { [skip_opencl_tests] } {
23    return 0
24}
25
26set testfile "operators"
27set clprogram [remote_download target ${srcdir}/${subdir}/${testfile}.cl]
28
29# Compile the generic OpenCL host app
30if { [gdb_compile_opencl_hostapp "${clprogram}" "${testfile}" "" ] != "" } {
31    untested ${testfile}.exp
32    return -1
33}
34
35# Load the OpenCL app
36clean_restart ${testfile}
37
38# Set breakpoint at the OpenCL kernel
39gdb_test "tbreak testkernel" \
40    "" \
41    "Set pending breakpoint" \
42    ".*Function \"testkernel\" not defined.*Make breakpoint pending.*y or \\\[n\\\]. $" \
43    "y"
44
45gdb_run_cmd
46gdb_test "" ".*reakpoint.*1.*testkernel.*" "run"
47
48# Continue to the marker
49gdb_breakpoint [gdb_get_line_number "marker" "${clprogram}"]
50gdb_continue_to_breakpoint "marker"
51
52# Retrieve some information about availability of OpenCL extensions
53set have_cl_khr_fp64 [get_integer_valueof "have_cl_khr_fp64" 0]
54set have_cl_khr_fp16 [get_integer_valueof "have_cl_khr_fp16" 0]
55
56proc check_basic { name type isfloat } {
57  gdb_test "print/d ${name}a" " = 2"
58  gdb_test "print/d ${name}b" " = 1"
59  gdb_test "print/d ${name}4a" " = \\{2, 4, 8, 16\\}"
60  gdb_test "print/d ${name}4b" " = \\{1, 2, 8, 4\\}"
61
62  gdb_test "ptype ${name}a" "type = ${type}"
63  gdb_test "ptype ${name}b" "type = ${type}"
64  gdb_test "ptype ${name}4a" "type = ${type}4"
65  gdb_test "ptype ${name}4b" "type = ${type}4"
66
67  if { ! ${isfloat} } {
68    gdb_test "print/d u${name}a" " = 2"
69    gdb_test "print/d u${name}b" " = 1"
70    gdb_test "print/d u${name}4a" " = \\{2, 4, 8, 16\\}"
71    gdb_test "print/d u${name}4b" " = \\{1, 2, 8, 4\\}"
72    gdb_test "ptype u${name}a" "type = (unsigned ${type}|u${type})"
73    gdb_test "ptype u${name}b" "type = (unsigned ${type}|u${type})"
74    gdb_test "ptype u${name}4a" "type = u${type}4"
75    gdb_test "ptype u${name}4b" "type = u${type}4"
76  }
77}
78
79# Arithmetic operators
80proc check_arithmetic_ops { name type isfloat size } {
81  # scalar with scalar
82  gdb_test "print/d ${name}a + ${name}b" " = 3"
83  gdb_test "print/d ${name}a - ${name}b" " = 1"
84  gdb_test "print/d ${name}a * ${name}b" " = 2"
85  gdb_test "print/d ${name}a / ${name}b" " = 2"
86  # scalar with vector
87  gdb_test "print/d ${name}a + ${name}4b" " = \\{3, 4, 10, 6\\}"
88  gdb_test "print/d ${name}4a - ${name}b" " = \\{1, 3, 7, 15\\}"
89  gdb_test "print/d ${name}4a * ${name}b" " = \\{2, 4, 8, 16\\}"
90  gdb_test "print/d ${name}a / ${name}4b" " = \\{2, 1, 0, 0\\}"
91  # vector with vector
92  gdb_test "print/d ${name}4a + ${name}4b" " = \\{3, 6, 16, 20\\}"
93  gdb_test "print/d ${name}4a - ${name}4b" " = \\{1, 2, 0, 12\\}"
94  gdb_test "print/d ${name}4a * ${name}4b" " = \\{2, 8, 64, 64\\}"
95  gdb_test "print/d ${name}4a / ${name}4b" " = \\{2, 2, 1, 4\\}"
96
97  # scalar
98  gdb_test "print/d ${name}a++" " = 2"
99  gdb_test "print/d ++${name}a" " = 4"
100  gdb_test "print/d ${name}a--" " = 4"
101  gdb_test "print/d --${name}a" " = 2"
102  gdb_test "print/d +${name}a" " = 2"
103  gdb_test "print/d -${name}a" " = -2"
104  # vector
105  gdb_test "print/d ${name}4a++" " = \\{2, 4, 8, 16\\}"
106  gdb_test "print/d ++${name}4a" " = \\{4, 6, 10, 18\\}"
107  gdb_test "print/d ${name}4a--" " = \\{4, 6, 10, 18\\}"
108  gdb_test "print/d --${name}4a" " = \\{2, 4, 8, 16\\}"
109  gdb_test "print/d +${name}4a" " = \\{2, 4, 8, 16\\}"
110  gdb_test "print/d -${name}4a" " = \\{-2, -4, -8, -16\\}"
111
112  # scalar with vector
113  gdb_test "ptype ${name}a + ${name}4b" "type = ${type}4"
114  gdb_test "ptype ${name}4a - ${name}b" "type = ${type}4"
115  gdb_test "ptype ${name}a * ${name}4b" "type = ${type}4"
116  gdb_test "ptype ${name}4a / ${name}b" "type = ${type}4"
117  # vector with vector
118  gdb_test "ptype ${name}4a + ${name}4b" "type = ${type}4"
119  gdb_test "ptype ${name}4a - ${name}4b" "type = ${type}4"
120  gdb_test "ptype ${name}4a * ${name}4b" "type = ${type}4"
121  gdb_test "ptype ${name}4a / ${name}4b" "type = ${type}4"
122
123  # scalar
124  gdb_test "ptype ${name}a++" "type = ${type}"
125  gdb_test "ptype ++${name}a" "type = ${type}"
126  gdb_test "ptype ${name}a--" "type = ${type}"
127  gdb_test "ptype --${name}a" "type = ${type}"
128  # vector
129  gdb_test "ptype ${name}4a++" "type = ${type}4"
130  gdb_test "ptype ++${name}4a" "type = ${type}4"
131  gdb_test "ptype ${name}4a--" "type = ${type}4"
132  gdb_test "ptype --${name}4a" "type = ${type}4"
133  gdb_test "ptype +${name}4a" "type = ${type}4"
134  gdb_test "ptype -${name}4a" "type = ${type}4"
135
136  if { ${isfloat} } {
137    # scalar with scalar
138    gdb_test "ptype ${name}a + ${name}b" "type = ${type}"
139    gdb_test "ptype ${name}a - ${name}b" "type = ${type}"
140    gdb_test "ptype ${name}a * ${name}b" "type = ${type}"
141    gdb_test "ptype ${name}a / ${name}b" "type = ${type}"
142    # scalar
143    gdb_test "ptype +${name}a" "type = ${type}"
144    gdb_test "ptype -${name}a" "type = ${type}"
145  } else {
146    # scalar with scalar
147    gdb_test "print/d ${name}a % ${name}b" " = 0"
148    # scalar with vector
149    gdb_test "print/d ${name}4a % ${name}b" " = \\{0, 0, 0, 0\\}"
150    # vector with vector
151    gdb_test "print/d ${name}4a % ${name}b" " = \\{0, 0, 0, 0\\}"
152
153    # scalar with scalar
154    gdb_test "print/d u${name}a + u${name}b" " = 3"
155    gdb_test "print/d u${name}a - u${name}b" " = 1"
156    gdb_test "print/d u${name}a * u${name}b" " = 2"
157    gdb_test "print/d u${name}a / u${name}b" " = 2"
158    gdb_test "print/d u${name}a % u${name}b" " = 0"
159    # scalar with vector
160    gdb_test "print/d u${name}a + u${name}4b" " = \\{3, 4, 10, 6\\}"
161    gdb_test "print/d u${name}4a - u${name}b" " = \\{1, 3, 7, 15\\}"
162    gdb_test "print/d u${name}4a * u${name}b" " = \\{2, 4, 8, 16\\}"
163    gdb_test "print/d u${name}a / u${name}4b" " = \\{2, 1, 0, 0\\}"
164    gdb_test "print/d u${name}4a % u${name}b" " = \\{0, 0, 0, 0\\}"
165    # vector with vector
166    gdb_test "print/d u${name}4a + u${name}4b" " = \\{3, 6, 16, 20\\}"
167    gdb_test "print/d u${name}4a - u${name}4b" " = \\{1, 2, 0, 12\\}"
168    gdb_test "print/d u${name}4a * u${name}4b" " = \\{2, 8, 64, 64\\}"
169    gdb_test "print/d u${name}4a / u${name}4b" " = \\{2, 2, 1, 4\\}"
170    gdb_test "print/d u${name}4a % u${name}4b" " = \\{0, 0, 0, 0\\}"
171
172    # scalar
173    gdb_test "print/d u${name}a++" " = 2"
174    gdb_test "print/d ++u${name}a" " = 4"
175    gdb_test "print/d u${name}a--" " = 4"
176    gdb_test "print/d --u${name}a" " = 2"
177    gdb_test "print/d +u${name}a" " = 2"
178    gdb_test "print/x -u${name}a" " = 0x.*fe"
179    # vector
180    gdb_test "print/d u${name}4a++" " = \\{2, 4, 8, 16\\}"
181    gdb_test "print/d ++u${name}4a" " = \\{4, 6, 10, 18\\}"
182    gdb_test "print/d u${name}4a--" " = \\{4, 6, 10, 18\\}"
183    gdb_test "print/d --u${name}4a" " = \\{2, 4, 8, 16\\}"
184    gdb_test "print/d +u${name}4a" " = \\{2, 4, 8, 16\\}"
185    gdb_test "print/x -u${name}4a" " = \\{0x.*fe, 0x.*fc, 0x.*f8, 0x.*f0\\}"
186
187    # scalar with scalar
188    if { ${size} < 4 } {
189      gdb_test "ptype ${name}a + ${name}b" "type = int"
190      gdb_test "ptype ${name}a - ${name}b" "type = int"
191      gdb_test "ptype ${name}a * ${name}b" "type = int"
192      gdb_test "ptype ${name}a / ${name}b" "type = int"
193      gdb_test "ptype ${name}a % ${name}b" "type = int"
194      gdb_test "ptype +${name}a" "type = int"
195      gdb_test "ptype -${name}a" "type = int"
196      gdb_test "ptype u${name}a + u${name}b" "type = int"
197      gdb_test "ptype u${name}a - u${name}b" "type = int"
198      gdb_test "ptype u${name}a * u${name}b" "type = int"
199      gdb_test "ptype u${name}a / u${name}b" "type = int"
200      gdb_test "ptype u${name}a % u${name}b" "type = int"
201      gdb_test "ptype +u${name}a" "type = int"
202      gdb_test "ptype -u${name}a" "type = int"
203    } elseif { ${size} == 4 } {
204      gdb_test "ptype ${name}a + ${name}b" "type = int"
205      gdb_test "ptype ${name}a - ${name}b" "type = int"
206      gdb_test "ptype ${name}a * ${name}b" "type = int"
207      gdb_test "ptype ${name}a / ${name}b" "type = int"
208      gdb_test "ptype ${name}a % ${name}b" "type = int"
209      gdb_test "ptype +${name}a" "type = int"
210      gdb_test "ptype -${name}a" "type = int"
211      gdb_test "ptype u${name}a + u${name}b" "type = (unsigned int|uint)"
212      gdb_test "ptype u${name}a - u${name}b" "type = (unsigned int|uint)"
213      gdb_test "ptype u${name}a * u${name}b" "type = (unsigned int|uint)"
214      gdb_test "ptype u${name}a / u${name}b" "type = (unsigned int|uint)"
215      gdb_test "ptype u${name}a % u${name}b" "type = (unsigned int|uint)"
216      gdb_test "ptype +u${name}a" "type = (unsigned int|uint)"
217      gdb_test "ptype -u${name}a" "type = (unsigned int|uint)"
218    } else { # ${size} == 8
219      gdb_test "ptype ${name}a + ${name}b" "type = long"
220      gdb_test "ptype ${name}a - ${name}b" "type = long"
221      gdb_test "ptype ${name}a * ${name}b" "type = long"
222      gdb_test "ptype ${name}a / ${name}b" "type = long"
223      gdb_test "ptype ${name}a % ${name}b" "type = long"
224      gdb_test "ptype +${name}a" "type = long"
225      gdb_test "ptype -${name}a" "type = long"
226      gdb_test "ptype u${name}a + u${name}b" "type = (unsigned long|ulong)"
227      gdb_test "ptype u${name}a - u${name}b" "type = (unsigned long|ulong)"
228      gdb_test "ptype u${name}a * u${name}b" "type = (unsigned long|ulong)"
229      gdb_test "ptype u${name}a / u${name}b" "type = (unsigned long|ulong)"
230      gdb_test "ptype u${name}a % u${name}b" "type = (unsigned long|ulong)"
231      # scalar
232      gdb_test "ptype +u${name}a" "type = (unsigned long|ulong)"
233      gdb_test "ptype -u${name}a" "type = (unsigned long|ulong)"
234    }
235    gdb_test "ptype u${name}a++" "type = (unsigned ${type}|u${type})"
236    gdb_test "ptype ++u${name}a" "type = (unsigned ${type}|u${type})"
237    gdb_test "ptype u${name}a--" "type = (unsigned ${type}|u${type})"
238    gdb_test "ptype --u${name}a" "type = (unsigned ${type}|u${type})"
239    # scalar with vector
240    gdb_test "ptype ${name}a % ${name}4b" "type = ${type}4"
241    gdb_test "ptype u${name}a + u${name}4b" "type = u${type}4"
242    gdb_test "ptype u${name}4a - u${name}b" "type = u${type}4"
243    gdb_test "ptype u${name}a * u${name}4b" "type = u${type}4"
244    gdb_test "ptype u${name}4a / u${name}b" "type = u${type}4"
245    gdb_test "ptype u${name}a % u${name}4b" "type = u${type}4"
246    # vector with vector
247    gdb_test "ptype ${name}4a % ${name}4b" "type = ${type}4"
248    gdb_test "ptype u${name}4a + u${name}4b" "type = u${type}4"
249    gdb_test "ptype u${name}4a - u${name}4b" "type = u${type}4"
250    gdb_test "ptype u${name}4a * u${name}4b" "type = u${type}4"
251    gdb_test "ptype u${name}4a / u${name}4b" "type = u${type}4"
252    gdb_test "ptype u${name}4a % u${name}4b" "type = u${type}4"
253    gdb_test "ptype u${name}4a++" "type = u${type}4"
254    gdb_test "ptype ++u${name}4a" "type = u${type}4"
255    gdb_test "ptype u${name}4a--" "type = u${type}4"
256    gdb_test "ptype --u${name}4a" "type = u${type}4"
257    gdb_test "ptype +u${name}4a" "type = u${type}4"
258    gdb_test "ptype -u${name}4a" "type = u${type}4"
259  }
260}
261
262# Relational operators
263proc check_relational_ops { name type isfloat size } {
264  # scalar with scalar
265  gdb_test "print/d ${name}a > ${name}b" " = 1"
266  gdb_test "print/d ${name}b < ${name}a" " = 1"
267  gdb_test "print/d ${name}b >= ${name}a" " = 0"
268  gdb_test "print/d ${name}a <= ${name}b" " = 0"
269  # scalar with vector
270  gdb_test "print/d ${name}4a > ${name}b" " = \\{-1, -1, -1, -1\\}"
271  gdb_test "print/d ${name}a < ${name}4b" " = \\{0, 0, -1, -1\\}"
272  gdb_test "print/d ${name}4a >= ${name}b" " = \\{-1, -1, -1, -1\\}"
273  gdb_test "print/d ${name}a <= ${name}4b" " = \\{0, -1, -1, -1\\}"
274  # vector with vector
275  gdb_test "print/d ${name}4a > ${name}4b" " = \\{-1, -1, 0, -1\\}"
276  gdb_test "print/d ${name}4b < ${name}4a" " = \\{-1, -1, 0, -1\\}"
277  gdb_test "print/d ${name}4b >= ${name}4a" " = \\{0, 0, -1, 0\\}"
278  gdb_test "print/d ${name}4a <= ${name}4b" " = \\{0, 0, -1, 0\\}"
279
280  # result type should be int for scalars
281  gdb_test "ptype ${name}a < ${name}b" "type = int"
282  gdb_test "ptype ${name}a > ${name}b" "type = int"
283  gdb_test "ptype ${name}a <= ${name}b" "type = int"
284  gdb_test "ptype ${name}a >= ${name}b" "type = int"
285
286  if { ${isfloat} } {
287    if { ${size} == 2 } {
288      # result type should be short for half precision floating point vectors
289      # scalar with vector
290      gdb_test "ptype ${name}4a > ${name}b" "type = short4"
291      gdb_test "ptype ${name}a < ${name}4b" "type = short4"
292      gdb_test "ptype ${name}4a >= ${name}b" "type = short4"
293      gdb_test "ptype ${name}a <= ${name}4b" "type = short4"
294      # vector with vector
295      gdb_test "ptype ${name}4a > ${name}4b" "type = short4"
296      gdb_test "ptype ${name}4a < ${name}4b" "type = short4"
297      gdb_test "ptype ${name}4a >= ${name}4b" "type = short4"
298      gdb_test "ptype ${name}4a <= ${name}4b" "type = short4"
299    } elseif { ${size} == 4 } {
300      # result type should be int for single precision floating point vectors
301      # scalar with vector
302      gdb_test "ptype ${name}4a > ${name}b" "type = int4"
303      gdb_test "ptype ${name}a < ${name}4b" "type = int4"
304      gdb_test "ptype ${name}4a >= ${name}b" "type = int4"
305      gdb_test "ptype ${name}a <= ${name}4b" "type = int4"
306      # vector with vector
307      gdb_test "ptype ${name}4a > ${name}4b" "type = int4"
308      gdb_test "ptype ${name}4a < ${name}4b" "type = int4"
309      gdb_test "ptype ${name}4a >= ${name}4b" "type = int4"
310      gdb_test "ptype ${name}4a <= ${name}4b" "type = int4"
311    } else { # ${size} == 8
312      # result type should be long for double precision floating point vectors
313      # scalar with vector
314      gdb_test "ptype ${name}4a > ${name}b" "type = long4"
315      gdb_test "ptype ${name}a < ${name}4b" "type = long4"
316      gdb_test "ptype ${name}4a >= ${name}b" "type = long4"
317      gdb_test "ptype ${name}a <= ${name}4b" "type = long4"
318      # vector with vector
319      gdb_test "ptype ${name}4a > ${name}4b" "type = long4"
320      gdb_test "ptype ${name}4a < ${name}4b" "type = long4"
321      gdb_test "ptype ${name}4a >= ${name}4b" "type = long4"
322      gdb_test "ptype ${name}4a <= ${name}4b" "type = long4"
323    }
324  } else {
325    # scalar with scalar
326    gdb_test "print/d u${name}a > u${name}b" " = 1"
327    gdb_test "print/d u${name}b < u${name}a" " = 1"
328    gdb_test "print/d u${name}b >= u${name}a" " = 0"
329    gdb_test "print/d u${name}a <= u${name}b" " = 0"
330    # scalar with vector
331    gdb_test "print/d u${name}4a > u${name}b" " = \\{-1, -1, -1, -1\\}"
332    gdb_test "print/d u${name}a < u${name}4b" " = \\{0, 0, -1, -1\\}"
333    gdb_test "print/d u${name}4a >= u${name}b" " = \\{-1, -1, -1, -1\\}"
334    gdb_test "print/d u${name}a <= u${name}4b" " = \\{0, -1, -1, -1\\}"
335    # vector with vector
336    gdb_test "print/d u${name}4a > u${name}4b" " = \\{-1, -1, 0, -1\\}"
337    gdb_test "print/d u${name}4b < u${name}4a" " = \\{-1, -1, 0, -1\\}"
338    gdb_test "print/d u${name}4b >= u${name}4a" " = \\{0, 0, -1, 0\\}"
339    gdb_test "print/d u${name}4a <= u${name}4b" " = \\{0, 0, -1, 0\\}"
340
341    # result type for unsigned operands is signed
342    # scalar with scalar
343    gdb_test "ptype u${name}a < u${name}b" "type = int"
344    gdb_test "ptype u${name}a > u${name}b" "type = int"
345    gdb_test "ptype u${name}a <= u${name}b" "type = int"
346    gdb_test "ptype u${name}a >= u${name}b" "type = int"
347    # scalar with vector
348    gdb_test "ptype u${name}4a > u${name}b" "type = ${type}4"
349    gdb_test "ptype u${name}a < u${name}4b" "type = ${type}4"
350    gdb_test "ptype u${name}4a >= u${name}b" "type = ${type}4"
351    gdb_test "ptype u${name}a <= u${name}4b" "type = ${type}4"
352    # vector with vector
353    gdb_test "ptype u${name}4a > u${name}4b" "type = ${type}4"
354    gdb_test "ptype u${name}4a < u${name}4b" "type = ${type}4"
355    gdb_test "ptype u${name}4a >= u${name}4b" "type = ${type}4"
356    gdb_test "ptype u${name}4a <= u${name}4b" "type = ${type}4"
357  }
358}
359
360# Equality operators
361proc check_equality_ops { name type isfloat size } {
362  # scalar with scalar
363  gdb_test "print/d ${name}a == ${name}b" " = 0"
364  gdb_test "print/d ${name}a != ${name}b" " = 1"
365  # scalar with vector
366  gdb_test "print/d ${name}4a == ${name}b" " = \\{0, 0, 0, 0\\}"
367  gdb_test "print/d ${name}a != ${name}4b" " = \\{-1, 0, -1, -1\\}"
368  # vector with vector
369  gdb_test "print/d ${name}4a == ${name}4b" " = \\{0, 0, -1, 0\\}"
370  gdb_test "print/d ${name}4a != ${name}4b" " = \\{-1, -1, 0, -1\\}"
371
372  # scalar with scalar
373  gdb_test "ptype ${name}a == ${name}b" "type = int"
374  gdb_test "ptype ${name}a != ${name}b" "type = int"
375
376  if { ${isfloat} } {
377    if { ${size} == 2 } {
378      # result type should be short for half precision floating point vectors
379      # scalar with vector
380      gdb_test "ptype ${name}4a == ${name}b" "type = short4"
381      gdb_test "ptype ${name}a != ${name}4b" "type = short4"
382      # vector with vector
383      gdb_test "ptype ${name}4a == ${name}4b" "type = short4"
384      gdb_test "ptype ${name}4a != ${name}4b" "type = short4"
385    } elseif { ${size} == 4 } {
386      # result type should be int for single precision floating point vectors
387      # scalar with vector
388      gdb_test "ptype ${name}4a == ${name}b" "type = int4"
389      gdb_test "ptype ${name}a != ${name}4b" "type = int4"
390      # vector with vector
391      gdb_test "ptype ${name}4a == ${name}4b" "type = int4"
392      gdb_test "ptype ${name}4a != ${name}4b" "type = int4"
393    } else { # ${size} == 8
394      # result type should be long for double precision floating point vectors
395      # scalar with vector
396      gdb_test "ptype ${name}4a == ${name}b" "type = long4"
397      gdb_test "ptype ${name}a != ${name}4b" "type = long4"
398      # vector with vector
399      gdb_test "ptype ${name}4a == ${name}4b" "type = long4"
400      gdb_test "ptype ${name}4a != ${name}4b" "type = long4"
401    }
402  } else {
403    # scalar with scalar
404    gdb_test "print/d u${name}a == u${name}b" " = 0"
405    gdb_test "print/d u${name}a != u${name}b" " = 1"
406    # scalar with vector
407    gdb_test "print/d u${name}4a == u${name}b" " = \\{0, 0, 0, 0\\}"
408    gdb_test "print/d u${name}a != u${name}4b" " = \\{-1, 0, -1, -1\\}"
409    # vector with vector
410    gdb_test "print/d u${name}4a == u${name}4b" " = \\{0, 0, -1, 0\\}"
411    gdb_test "print/d u${name}4b != u${name}4a" " = \\{-1, -1, 0, -1\\}"
412
413    # result type for unsigned operands is signed
414    # scalar with scalar
415    gdb_test "ptype u${name}a == u${name}b" "type = int"
416    gdb_test "ptype u${name}a != u${name}b" "type = int"
417    # scalar with vector
418    gdb_test "ptype u${name}4a == u${name}b" "type = ${type}4"
419    gdb_test "ptype u${name}a != u${name}4b" "type = ${type}4"
420    # vector with vector
421    gdb_test "ptype u${name}4a == u${name}4b" "type = ${type}4"
422    gdb_test "ptype u${name}4a != u${name}4b" "type = ${type}4"
423  }
424}
425
426# Shift operators
427proc check_shift_ops { name type size } {
428  # scalar with scalar
429  gdb_test "print/d ${name}a << ${name}b" " = 4"
430  gdb_test "print/d ${name}a >> ${name}b" " = 1"
431  gdb_test "print/d u${name}a << u${name}b" " = 4"
432  gdb_test "print/d u${name}a >> u${name}b" " = 1"
433  # scalar with vector
434  gdb_test "print/d ${name}4a << ${name}b" " = \\{4, 8, 16, 32\\}"
435  gdb_test "print/d ${name}4a >> ${name}b" " = \\{1, 2, 4, 8\\}"
436  gdb_test "print/d u${name}4a << u${name}b" " = \\{4, 8, 16, 32\\}"
437  gdb_test "print/d u${name}4a >> u${name}b" " = \\{1, 2, 4, 8\\}"
438  # vector with vector
439  if { ${size} == 1 } {
440    gdb_test "print/d ${name}4a << ${name}4b" " = \\{4, 16, 0, 0\\}"
441    gdb_test "print/d u${name}4a << u${name}4b" " = \\{4, 16, 0, 0\\}"
442  } else {
443    gdb_test "print/d ${name}4a << ${name}4b" " = \\{4, 16, 2048, 256\\}"
444    gdb_test "print/d u${name}4a << u${name}4b" " = \\{4, 16, 2048, 256\\}"
445  }
446  gdb_test "print/d ${name}4a >> ${name}4b" " = \\{1, 1, 0, 1\\}"
447  gdb_test "print/d u${name}4a >> u${name}4b" " = \\{1, 1, 0, 1\\}"
448
449  # scalar with scalar
450  if { ${size} < 4 } {
451    gdb_test "ptype ${name}a << ${name}b" "type = int"
452    gdb_test "ptype ${name}a >> ${name}b" "type = int"
453    gdb_test "ptype u${name}a << u${name}b" "type = int"
454    gdb_test "ptype u${name}a >> u${name}b" "type = int"
455  } elseif { ${size} == 4 } {
456    gdb_test "ptype ${name}a << ${name}b" "type = int"
457    gdb_test "ptype ${name}a >> ${name}b" "type = int"
458    gdb_test "ptype u${name}a << u${name}b" "type = (unsigned int|uint)"
459    gdb_test "ptype u${name}a >> u${name}b" "type = (unsigned int|uint)"
460  } else { # ${size} == 8
461    gdb_test "ptype ${name}a << ${name}b" "type = long"
462    gdb_test "ptype ${name}a >> ${name}b" "type = long"
463    gdb_test "ptype u${name}a << u${name}b" "type = (unsigned long|ulong)"
464    gdb_test "ptype u${name}a >> u${name}b" "type = (unsigned long|ulong)"
465  }
466  # scalar with vector
467  gdb_test "ptype ${name}4a << ${name}b" "type = ${type}4"
468  gdb_test "ptype ${name}4a >> ${name}b" "type = ${type}4"
469  gdb_test "ptype u${name}4a << u${name}b" "type = u${type}4"
470  gdb_test "ptype u${name}4a >> u${name}b" "type = u${type}4"
471  # vector with vector
472  gdb_test "ptype ${name}4a << ${name}4b" "type = ${type}4"
473  gdb_test "ptype ${name}4a >> ${name}4b" "type = ${type}4"
474  gdb_test "ptype u${name}4a << u${name}4b" "type = u${type}4"
475  gdb_test "ptype u${name}4a >> u${name}4b" "type = u${type}4"
476}
477
478# Bitwise operators
479proc check_bitwise_ops { name type size } {
480  # scalar with scalar
481  gdb_test "print/d ${name}a & ${name}b" " = 0"
482  gdb_test "print/d ${name}a | ${name}b" " = 3"
483  gdb_test "print/d ${name}a ^ ${name}b" " = 3"
484  gdb_test "print/d u${name}a & u${name}b" " = 0"
485  gdb_test "print/d u${name}a | u${name}b" " = 3"
486  gdb_test "print/d u${name}a ^ u${name}b" " = 3"
487  # scalar with vector
488  gdb_test "print/d ${name}4a & ${name}b" " = \\{0, 0, 0, 0\\}"
489  gdb_test "print/d ${name}a | ${name}4b" " = \\{3, 2, 10, 6\\}"
490  gdb_test "print/d ${name}4a ^ ${name}b" " = \\{3, 5, 9, 17\\}"
491  gdb_test "print/d u${name}4a & u${name}b" " = \\{0, 0, 0, 0\\}"
492  gdb_test "print/d u${name}a | u${name}4b" " = \\{3, 2, 10, 6\\}"
493  gdb_test "print/d u${name}4a ^ u${name}b" " = \\{3, 5, 9, 17\\}"
494  # vector with vector
495  gdb_test "print/d ${name}4a & ${name}4b" " = \\{0, 0, 8, 0\\}"
496  gdb_test "print/d ${name}4a | ${name}4b" " = \\{3, 6, 8, 20\\}"
497  gdb_test "print/d ${name}4a ^ ${name}4b" " = \\{3, 6, 0, 20\\}"
498  gdb_test "print/d u${name}4a & u${name}4b" " = \\{0, 0, 8, 0\\}"
499  gdb_test "print/d u${name}4a | u${name}4b" " = \\{3, 6, 8, 20\\}"
500  gdb_test "print/d u${name}4a ^ u${name}4b" " = \\{3, 6, 0, 20\\}"
501
502  # scalar with scalar
503  if { ${size} < 4 } {
504    gdb_test "ptype ${name}a & ${name}b" "type = int"
505    gdb_test "ptype ${name}a | ${name}b" "type = int"
506    gdb_test "ptype ${name}a ^ ${name}b" "type = int"
507    gdb_test "ptype u${name}a & u${name}b" "type = int"
508    gdb_test "ptype u${name}a | u${name}b" "type = int"
509    gdb_test "ptype u${name}a ^ u${name}b" "type = int"
510  } elseif { ${size} == 4 } {
511    gdb_test "ptype ${name}a & ${name}b" "type = int"
512    gdb_test "ptype ${name}a | ${name}b" "type = int"
513    gdb_test "ptype ${name}a ^ ${name}b" "type = int"
514    gdb_test "ptype u${name}a & u${name}b" "type = (unsigned int|uint)"
515    gdb_test "ptype u${name}a | u${name}b" "type = (unsigned int|uint)"
516    gdb_test "ptype u${name}a ^ u${name}b" "type = (unsigned int|uint)"
517  } else { # ${size} == 8
518    gdb_test "ptype ${name}a & ${name}b" "type = long"
519    gdb_test "ptype ${name}a | ${name}b" "type = long"
520    gdb_test "ptype ${name}a ^ ${name}b" "type = long"
521    gdb_test "ptype u${name}a & u${name}b" "type = (unsigned long|ulong)"
522    gdb_test "ptype u${name}a | u${name}b" "type = (unsigned long|ulong)"
523    gdb_test "ptype u${name}a ^ u${name}b" "type = (unsigned long|ulong)"
524  }
525  # scalar with vector
526  gdb_test "ptype ${name}4a & ${name}b" "type = ${type}4"
527  gdb_test "ptype ${name}a | ${name}4b" "type = ${type}4"
528  gdb_test "ptype ${name}4a ^ ${name}b" "type = ${type}4"
529  gdb_test "ptype u${name}4a & u${name}b" "type = u${type}4"
530  gdb_test "ptype u${name}a | u${name}4b" "type = u${type}4"
531  gdb_test "ptype u${name}4a ^ u${name}b" "type = u${type}4"
532  # vector with vector
533  gdb_test "ptype ${name}4a & ${name}4b" "type = ${type}4"
534  gdb_test "ptype ${name}4a | ${name}4b" "type = ${type}4"
535  gdb_test "ptype ${name}4a ^ ${name}4b" "type = ${type}4"
536  gdb_test "ptype u${name}4a & u${name}4b" "type = u${type}4"
537  gdb_test "ptype u${name}4a | u${name}4b" "type = u${type}4"
538  gdb_test "ptype u${name}4a ^ u${name}4b" "type = u${type}4"
539
540  # scalar
541  if { ${size} < 8 } {
542    gdb_test "print/x ~${name}a" " = 0xfffffffd"
543    gdb_test "print/x ~u${name}a" " = 0xfffffffd"
544  } else {
545    gdb_test "print/x ~${name}a" " = 0xfffffffffffffffd"
546    gdb_test "print/x ~u${name}a" " = 0xfffffffffffffffd"
547  }
548  # vector
549  if { ${size} == 1 } {
550    gdb_test "print/x ~${name}4a" " = \\{0xfd, 0xfb, 0xf7, 0xef\\}"
551    gdb_test "print/x ~u${name}4a" " = \\{0xfd, 0xfb, 0xf7, 0xef\\}"
552  } elseif { ${size} == 2 } {
553    gdb_test "print/x ~${name}4a" " = \\{0xfffd, 0xfffb, 0xfff7, 0xffef\\}"
554    gdb_test "print/x ~u${name}4a" " = \\{0xfffd, 0xfffb, 0xfff7, 0xffef\\}"
555  } elseif { ${size} == 4 } {
556    gdb_test "print/x ~${name}4a" " = \\{0xfffffffd, 0xfffffffb, 0xfffffff7, 0xffffffef\\}"
557    gdb_test "print/x ~u${name}4a" " = \\{0xfffffffd, 0xfffffffb, 0xfffffff7, 0xffffffef\\}"
558  } else { # ${size} == 8
559    gdb_test "print/x ~${name}4a" " = \\{0xfffffffffffffffd, 0xfffffffffffffffb, 0xfffffffffffffff7, 0xffffffffffffffef\\}"
560    gdb_test "print/x ~u${name}4a" " = \\{0xfffffffffffffffd, 0xfffffffffffffffb, 0xfffffffffffffff7, 0xffffffffffffffef\\}"
561  }
562  # scalar
563  if { ${size} < 4 } {
564    gdb_test "ptype ~${name}a" "type = int"
565    gdb_test "ptype ~u${name}a" "type = int"
566  } elseif { ${size} == 4 } {
567    gdb_test "ptype ~${name}a" "type = int"
568    gdb_test "ptype ~u${name}a" "type = (unsigned int|uint)"
569  } else { # ${size} == 8
570    gdb_test "ptype ~${name}a" "type = long"
571    gdb_test "ptype ~u${name}a" "type = (unsigned long|ulong)"
572  }
573  # vector
574  gdb_test "ptype ~${name}4a" "type = ${type}4"
575  gdb_test "ptype ~u${name}4a" "type = u${type}4"
576}
577
578# Logical operators
579proc check_logical_ops { name type isfloat size } {
580  # scalar
581  gdb_test "print/d !${name}a " " = 0"
582  gdb_test "print/d !!${name}a " " = 1"
583  # vector
584  gdb_test "print/d !${name}4a " " = \\{0, 0, 0, 0\\}"
585  gdb_test "print/d !!${name}4a " " = \\{-1, -1, -1, -1\\}"
586
587  # scalar with scalar
588  gdb_test "print/d ${name}a && ${name}b" " = 1"
589  gdb_test "print/d ${name}a && !${name}b" " = 0"
590  gdb_test "print/d ${name}a || ${name}b" " = 1"
591  gdb_test "print/d ${name}a || !${name}b" " = 1"
592  gdb_test "print/d !${name}a || !${name}b" " = 0"
593
594  # scalar with vector
595  gdb_test "print/d ${name}4a && ${name}b" " = \\{-1, -1, -1, -1\\}"
596  gdb_test "print/d ${name}4a && !${name}b" " = \\{0, 0, 0, 0\\}"
597  gdb_test "print/d ${name}a || ${name}4b" " = \\{-1, -1, -1, -1\\}"
598  gdb_test "print/d ${name}a || !${name}4b" " = \\{-1, -1, -1, -1\\}"
599  gdb_test "print/d !${name}4a || !${name}b" " = \\{0, 0, 0, 0\\}"
600  # vector with vector
601  gdb_test "print/d ${name}4a && ${name}4b" " = \\{-1, -1, -1, -1\\}"
602  gdb_test "print/d ${name}4a || ${name}4b" " = \\{-1, -1, -1, -1\\}"
603
604  # result type should be int for scalars
605  gdb_test "ptype !${name}a" "type = int"
606  gdb_test "ptype ${name}a && ${name}b" "type = int"
607  gdb_test "ptype ${name}a || ${name}b" "type = int"
608
609  if { ${isfloat} } {
610    if { ${size} == 2 } {
611      # result type should be short for half precision floating point vectors
612      # scalar with vector
613      gdb_test "ptype ${name}4a && ${name}b" "type = short4"
614      gdb_test "ptype ${name}a || ${name}4b" "type = short4"
615      # vector with vector
616      gdb_test "ptype !${name}4a" "type = short4"
617      gdb_test "ptype ${name}4a && ${name}4b" "type = short4"
618      gdb_test "ptype ${name}4a || ${name}4b" "type = short4"
619    } elseif { ${size} == 4 } {
620      # result type should be int for single precision floating point vectors
621      # scalar with vector
622      gdb_test "ptype ${name}4a && ${name}b" "type = int4"
623      gdb_test "ptype ${name}a || ${name}4b" "type = int4"
624      # vector with vector
625      gdb_test "ptype !${name}4a" "type = int4"
626      gdb_test "ptype ${name}4a && ${name}4b" "type = int4"
627      gdb_test "ptype ${name}4a || ${name}4b" "type = int4"
628    } else { # ${size} == 8
629      # result type should be long for double precision floating point vectors
630      # scalar with vector
631      gdb_test "ptype ${name}4a && ${name}b" "type = long4"
632      gdb_test "ptype ${name}a || ${name}4b" "type = long4"
633      # vector with vector
634      gdb_test "ptype !${name}4a" "type = long4"
635      gdb_test "ptype ${name}4a && ${name}4b" "type = long4"
636      gdb_test "ptype ${name}4a || ${name}4b" "type = long4"
637    }
638  } else {
639    # unsigned scalar
640    gdb_test "print/d !u${name}a " " = 0"
641    gdb_test "print/d !!u${name}a " " = 1"
642    # unsigned vector
643    gdb_test "print/d !u${name}4a " " = \\{0, 0, 0, 0\\}"
644    gdb_test "print/d !!u${name}4a " " = \\{-1, -1, -1, -1\\}"
645
646    # scalar with scalar
647    gdb_test "print/d u${name}a && u${name}b" " = 1"
648    gdb_test "print/d u${name}a || u${name}b" " = 1"
649    # scalar with vector
650    gdb_test "print/d u${name}4a && u${name}b" " = \\{-1, -1, -1, -1\\}"
651    gdb_test "print/d u${name}a || u${name}4b" " = \\{-1, -1, -1, -1\\}"
652    # vector with vector
653    gdb_test "print/d u${name}4a && u${name}4b" " = \\{-1, -1, -1, -1\\}"
654    gdb_test "print/d u${name}4a || u${name}4b" " = \\{-1, -1, -1, -1\\}"
655
656    # scalar
657    gdb_test "ptype !u${name}a" "type = int"
658    # vector
659    gdb_test "ptype !${name}4a" "type = ${type}4"
660    gdb_test "ptype !u${name}4a" "type = ${type}4"
661
662    # scalar with vector
663    gdb_test "ptype ${name}4a && ${name}b" "type = ${type}4"
664    gdb_test "ptype ${name}a || ${name}4b" "type = ${type}4"
665    # result type for unsigned vector operand is signed
666    gdb_test "ptype u${name}4a && u${name}b" "type = ${type}4"
667    gdb_test "ptype u${name}a || u${name}4b" "type = ${type}4"
668    # vector with vector
669    gdb_test "ptype ${name}4a && ${name}4b" "type = ${type}4"
670    gdb_test "ptype ${name}4a || ${name}4b" "type = ${type}4"
671    # result type for unsigned vector operand is signed
672    gdb_test "ptype u${name}4a && u${name}4b" "type = ${type}4"
673    gdb_test "ptype u${name}4a || u${name}4b" "type = ${type}4"
674  }
675}
676
677# Conditional operator
678proc check_conditional_op { name type isfloat } {
679  # scalar with scalar
680  gdb_test "print/d ${name}a ? ${name}b : ${name}a" " = 1"
681  gdb_test "print/d !${name}a ? ${name}b : ${name}a" " = 2"
682  # scalar with vector
683  gdb_test "print/d ${name}4a ? ${name}4b : ${name}a" " = \\{1, 2, 8, 4\\}"
684  gdb_test "print/d ${name}4a ? ${name}b : ${name}4a" " = \\{1, 1, 1, 1\\}"
685  gdb_test "print/d ${name}4a > 4 ? 1 : ${name}4a" " = \\{2, 4, 1, 1\\}"
686  gdb_test "print/d ${name}4a > 4 ? ${name}4b : ${name}a" " = \\{2, 2, 8, 4\\}"
687  # vector with vector
688  gdb_test "print/d ${name}4a ? ${name}4b : ${name}4a" " = \\{1, 2, 8, 4\\}"
689  gdb_test "print/d ${name}4a > 4 ? ${name}4b : ${name}4a" " = \\{2, 4, 8, 4\\}"
690
691  # scalar with scalar
692  gdb_test "ptype ${name}a ? ${name}b : ${name}a" "type = ${type}"
693  # scalar with vector
694  gdb_test "ptype ${name}4a ? ${name}4b : ${name}a" "type = ${type}4"
695  gdb_test "ptype ${name}4a ? ${name}b : ${name}4a" "type = ${type}4"
696  # vector with vector
697  gdb_test "ptype ${name}4a ? ${name}4b : ${name}4a" "type = ${type}4"
698
699  if { !${isfloat} } {
700    # scalar with scalar
701    gdb_test "print/d u${name}a ? u${name}b : u${name}a" " = 1"
702    gdb_test "print/d !u${name}a ? u${name}b : u${name}a" " = 2"
703    # scalar with vector
704    gdb_test "print/d u${name}4a ? u${name}4b : u${name}a" " = \\{1, 2, 8, 4\\}"
705    gdb_test "print/d u${name}4a ? u${name}b : u${name}4a" " = \\{1, 1, 1, 1\\}"
706    gdb_test "print/d u${name}4a > 4 ? 1 : u${name}4a" " = \\{2, 4, 1, 1\\}"
707    gdb_test "print/d u${name}4a > 4 ? u${name}4b : u${name}a" " = \\{2, 2, 8, 4\\}"
708    # vector with vector
709    gdb_test "print/d u${name}4a ? u${name}4b : u${name}4a" " = \\{1, 2, 8, 4\\}"
710    gdb_test "print/d u${name}4a > 4 ? u${name}4b : u${name}4a" " = \\{2, 4, 8, 4\\}"
711
712    # scalar with scalar
713    gdb_test "ptype u${name}a ? u${name}b : u${name}a" "type = (unsigned ${type}|u${type})"
714    # scalar with vector
715    gdb_test "ptype u${name}4a ? u${name}4b : u${name}a" "type = u${type}4"
716    gdb_test "ptype u${name}4a ? u${name}b : u${name}4a" "type = u${type}4"
717    # vector with vector
718    gdb_test "ptype u${name}4a ? u${name}4b : u${name}4a" "type = u${type}4"
719  }
720}
721
722# Assignment operators
723proc check_assignment_ops { name type isfloat size } {
724  # scalar with scalar
725  gdb_test "print/d ${name}a = ${name}b" " = 1"
726  gdb_test "print/d ${name}a = 2" " = 2"
727  gdb_test "print/d ${name}a += ${name}b" " = 3"
728  gdb_test "print/d ${name}a -= ${name}b" " = 2"
729  gdb_test "print/d ${name}b *= ${name}a" " = 2"
730  gdb_test "print/d ${name}b /= ${name}a" " = 1"
731  # scalar with vector
732  gdb_test "print/d ${name}4a = ${name}b" " = \\{1, 1, 1, 1\\}"
733  gdb_test "print/d ${name}4a = \{2, 4, 8, 16\}" " = \\{2, 4, 8, 16\\}"
734  gdb_test "print/d ${name}4a += ${name}b" " = \\{3, 5, 9, 17\\}"
735  gdb_test "print/d ${name}4a -= ${name}b" " = \\{2, 4, 8, 16\\}"
736  gdb_test "print/d ${name}4b *= ${name}a" " = \\{2, 4, 16, 8\\}"
737  gdb_test "print/d ${name}4b /= ${name}a" " = \\{1, 2, 8, 4\\}"
738  # vector with vector
739  gdb_test "print/d ${name}4a = ${name}4b" " = \\{1, 2, 8, 4\\}"
740  gdb_test "print/d ${name}4a = \{2, 4, 8, 16\}" " = \\{2, 4, 8, 16\\}"
741  gdb_test "print/d ${name}4a += ${name}4b" " = \\{3, 6, 16, 20\\}"
742  gdb_test "print/d ${name}4a -= ${name}4b" " = \\{2, 4, 8, 16\\}"
743  gdb_test "print/d ${name}4b *= ${name}4a" " = \\{2, 8, 64, 64\\}"
744  gdb_test "print/d ${name}4b /= ${name}4a" " = \\{1, 2, 8, 4\\}"
745
746  # scalar with scalar
747  gdb_test "ptype ${name}a = ${name}b" "type = ${type}"
748  gdb_test "ptype ${name}a += ${name}b" "type = ${type}"
749  gdb_test "ptype ${name}a -= ${name}b" "type = ${type}"
750  gdb_test "ptype ${name}a *= ${name}b" "type = ${type}"
751  gdb_test "ptype ${name}a /= ${name}b" "type = ${type}"
752  # scalar with vector
753  gdb_test "ptype ${name}4a = ${name}b" "type = ${type}4"
754  gdb_test "ptype ${name}4a += ${name}b" "type = ${type}4"
755  gdb_test "ptype ${name}4a -= ${name}b" "type = ${type}4"
756  gdb_test "ptype ${name}4b *= ${name}a" "type = ${type}4"
757  gdb_test "ptype ${name}4b /= ${name}a" "type = ${type}4"
758  # vector with vector
759  gdb_test "ptype ${name}4a = ${name}4b" "type = ${type}4"
760  gdb_test "ptype ${name}4a += ${name}4b" "type = ${type}4"
761  gdb_test "ptype ${name}4a -= ${name}4b" "type = ${type}4"
762  gdb_test "ptype ${name}4b *= ${name}4a" "type = ${type}4"
763  gdb_test "ptype ${name}4b /= ${name}4a" "type = ${type}4"
764
765  if { !${isfloat} } {
766    # scalar with scalar
767    gdb_test "print/d ${name}a %= ${name}b" " = 0"
768    gdb_test "print/d ${name}a = 2" " = 2"
769    gdb_test "print/d ${name}a <<= ${name}b" " = 4"
770    gdb_test "print/d ${name}a = 2" " = 2"
771    gdb_test "print/d ${name}a >>= ${name}b" " = 1"
772    gdb_test "print/d ${name}a = 2" " = 2"
773    gdb_test "print/d ${name}a &= ${name}b" " = 0"
774    gdb_test "print/d ${name}a = 2" " = 2"
775    gdb_test "print/d ${name}a |= ${name}b" " = 3"
776    gdb_test "print/d ${name}a = 2" " = 2"
777    gdb_test "print/d ${name}a ^= ${name}b" " = 3"
778    gdb_test "print/d ${name}a = 2" " = 2"
779    # scalar with vector
780    gdb_test "print/d ${name}4b %= ${name}a" " = \\{1, 0, 0, 0\\}"
781    gdb_test "print/d ${name}4b = \{1, 2, 8, 4\}" " = \\{1, 2, 8, 4\\}"
782    gdb_test "print/d ${name}4a <<= ${name}b" " = \\{4, 8, 16, 32\\}"
783    gdb_test "print/d ${name}4a >>= ${name}b" " = \\{2, 4, 8, 16\\}"
784    gdb_test "print/d ${name}4a &= ${name}b" " = \\{0, 0, 0, 0\\}"
785    gdb_test "print/d ${name}4a = \{2, 4, 8, 16\}" " = \\{2, 4, 8, 16\\}"
786    gdb_test "print/d ${name}4a |= ${name}b" " = \\{3, 5, 9, 17\\}"
787    gdb_test "print/d ${name}4a = \{2, 4, 8, 16\}" " = \\{2, 4, 8, 16\\}"
788    gdb_test "print/d ${name}4a ^= ${name}b" " = \\{3, 5, 9, 17\\}"
789    gdb_test "print/d ${name}4a = \{2, 4, 8, 16\}" " = \\{2, 4, 8, 16\\}"
790    # vector with vector
791    gdb_test "print/d ${name}4b %= ${name}4a" " = \\{1, 2, 0, 4\\}"
792    gdb_test "print/d ${name}4b = \{1, 2, 8, 4\}" " = \\{1, 2, 8, 4\\}"
793    if { ${size} == 1 } {
794      gdb_test "print/d ${name}4a <<= ${name}4b" " = \\{4, 16, 0, 0\\}"
795      gdb_test "print/d ${name}4a >>= ${name}4b" " = \\{2, 4, 0, 0\\}"
796      gdb_test "print/d ${name}4a = \{2, 4, 8, 16\}" " = \\{2, 4, 8, 16\\}"
797    } else {
798      gdb_test "print/d ${name}4a <<= ${name}4b" " = \\{4, 16, 2048, 256\\}"
799      gdb_test "print/d ${name}4a >>= ${name}4b" " = \\{2, 4, 8, 16\\}"
800    }
801    gdb_test "print/d ${name}4a &= ${name}4b" " = \\{0, 0, 8, 0\\}"
802    gdb_test "print/d ${name}4a = \{2, 4, 8, 16\}" " = \\{2, 4, 8, 16\\}"
803    gdb_test "print/d ${name}4a |= ${name}4b" " = \\{3, 6, 8, 20\\}"
804    gdb_test "print/d ${name}4a = \{2, 4, 8, 16\}" " = \\{2, 4, 8, 16\\}"
805    gdb_test "print/d ${name}4a ^= ${name}4b" " = \\{3, 6, 0, 20\\}"
806    gdb_test "print/d ${name}4a = \{2, 4, 8, 16\}" " = \\{2, 4, 8, 16\\}"
807
808    # scalar with scalar
809    gdb_test "ptype ${name}a %= ${name}b" "type = ${type}"
810    gdb_test "ptype ${name}a <<= ${name}b" "type = ${type}"
811    gdb_test "ptype ${name}a >>= ${name}b" "type = ${type}"
812    gdb_test "ptype ${name}a &= ${name}b" "type = ${type}"
813    gdb_test "ptype ${name}a |= ${name}b" "type = ${type}"
814    gdb_test "ptype ${name}a ^= ${name}b" "type = ${type}"
815    # scalar with vector
816    gdb_test "ptype ${name}4a %= ${name}b" "type = ${type}4"
817    gdb_test "ptype ${name}4a <<= ${name}b" "type = ${type}4"
818    gdb_test "ptype ${name}4a >>= ${name}b" "type = ${type}4"
819    gdb_test "ptype ${name}4a &= ${name}b" "type = ${type}4"
820    gdb_test "ptype ${name}4a |= ${name}b" "type = ${type}4"
821    gdb_test "ptype ${name}4a ^= ${name}b" "type = ${type}4"
822    # vector with vector
823    gdb_test "ptype ${name}4a %= ${name}4b" "type = ${type}4"
824    gdb_test "ptype ${name}4a <<= ${name}4b" "type = ${type}4"
825    gdb_test "ptype ${name}4a >>= ${name}4b" "type = ${type}4"
826    gdb_test "ptype ${name}4a &= ${name}4b" "type = ${type}4"
827    gdb_test "ptype ${name}4a |= ${name}4b" "type = ${type}4"
828    gdb_test "ptype ${name}4a ^= ${name}4b" "type = ${type}4"
829
830    # scalar with scalar
831    gdb_test "print/d u${name}a = u${name}b" " = 1"
832    gdb_test "print/d u${name}a = 2" " = 2"
833    gdb_test "print/d u${name}a += u${name}b" " = 3"
834    gdb_test "print/d u${name}a -= u${name}b" " = 2"
835    gdb_test "print/d u${name}b *= u${name}a" " = 2"
836    gdb_test "print/d u${name}b /= u${name}a" " = 1"
837    gdb_test "print/d u${name}a %= u${name}b" " = 0"
838    gdb_test "print/d u${name}a = 2" " = 2"
839    gdb_test "print/d u${name}a <<= u${name}b" " = 4"
840    gdb_test "print/d u${name}a = 2" " = 2"
841    gdb_test "print/d u${name}a >>= u${name}b" " = 1"
842    gdb_test "print/d u${name}a = 2" " = 2"
843    gdb_test "print/d u${name}a &= u${name}b" " = 0"
844    gdb_test "print/d u${name}a = 2" " = 2"
845    gdb_test "print/d u${name}a |= u${name}b" " = 3"
846    gdb_test "print/d u${name}a = 2" " = 2"
847    gdb_test "print/d u${name}a ^= u${name}b" " = 3"
848    gdb_test "print/d u${name}a = 2" " = 2"
849    # scalar with vector
850    gdb_test "print/d u${name}4a = u${name}b" " = \\{1, 1, 1, 1\\}"
851    gdb_test "print/d u${name}4a = \{2, 4, 8, 16\}" " = \\{2, 4, 8, 16\\}"
852    gdb_test "print/d u${name}4a += u${name}b" " = \\{3, 5, 9, 17\\}"
853    gdb_test "print/d u${name}4a -= u${name}b" " = \\{2, 4, 8, 16\\}"
854    gdb_test "print/d u${name}4b *= u${name}a" " = \\{2, 4, 16, 8\\}"
855    gdb_test "print/d u${name}4b /= u${name}a" " = \\{1, 2, 8, 4\\}"
856    gdb_test "print/d u${name}4b %= u${name}a" " = \\{1, 0, 0, 0\\}"
857    gdb_test "print/d u${name}4b = \{1, 2, 8, 4\}" " = \\{1, 2, 8, 4\\}"
858    gdb_test "print/d u${name}4a <<= u${name}b" " = \\{4, 8, 16, 32\\}"
859    gdb_test "print/d u${name}4a >>= u${name}b" " = \\{2, 4, 8, 16\\}"
860    gdb_test "print/d u${name}4a &= u${name}b" " = \\{0, 0, 0, 0\\}"
861    gdb_test "print/d u${name}4a = \{2, 4, 8, 16\}" " = \\{2, 4, 8, 16\\}"
862    gdb_test "print/d u${name}4a |= u${name}b" " = \\{3, 5, 9, 17\\}"
863    gdb_test "print/d u${name}4a = \{2, 4, 8, 16\}" " = \\{2, 4, 8, 16\\}"
864    gdb_test "print/d u${name}4a ^= u${name}b" " = \\{3, 5, 9, 17\\}"
865    gdb_test "print/d u${name}4a = \{2, 4, 8, 16\}" " = \\{2, 4, 8, 16\\}"
866    # vector with vector
867    gdb_test "print/d u${name}4a = u${name}4b" " = \\{1, 2, 8, 4\\}"
868    gdb_test "print/d u${name}4a = \{2, 4, 8, 16\}" " = \\{2, 4, 8, 16\\}"
869    gdb_test "print/d u${name}4a += u${name}4b" " = \\{3, 6, 16, 20\\}"
870    gdb_test "print/d u${name}4a -= u${name}4b" " = \\{2, 4, 8, 16\\}"
871    gdb_test "print/d u${name}4b *= u${name}4a" " = \\{2, 8, 64, 64\\}"
872    gdb_test "print/d u${name}4b /= u${name}4a" " = \\{1, 2, 8, 4\\}"
873    gdb_test "print/d u${name}4b %= u${name}4a" " = \\{1, 2, 0, 4\\}"
874    gdb_test "print/d u${name}4b = \{1, 2, 8, 4\}" " = \\{1, 2, 8, 4\\}"
875    if { ${size} == 1 } {
876      gdb_test "print/d u${name}4a <<= u${name}4b" " = \\{4, 16, 0, 0\\}"
877      gdb_test "print/d u${name}4a >>= u${name}4b" " = \\{2, 4, 0, 0\\}"
878      gdb_test "print/d u${name}4a = \{2, 4, 8, 16\}" " = \\{2, 4, 8, 16\\}"
879    } else {
880      gdb_test "print/d u${name}4a <<= u${name}4b" " = \\{4, 16, 2048, 256\\}"
881      gdb_test "print/d u${name}4a >>= u${name}4b" " = \\{2, 4, 8, 16\\}"
882    }
883    gdb_test "print/d u${name}4a &= u${name}4b" " = \\{0, 0, 8, 0\\}"
884    gdb_test "print/d u${name}4a = \{2, 4, 8, 16\}" " = \\{2, 4, 8, 16\\}"
885    gdb_test "print/d u${name}4a |= u${name}4b" " = \\{3, 6, 8, 20\\}"
886    gdb_test "print/d u${name}4a = \{2, 4, 8, 16\}" " = \\{2, 4, 8, 16\\}"
887    gdb_test "print/d u${name}4a ^= u${name}4b" " = \\{3, 6, 0, 20\\}"
888    gdb_test "print/d u${name}4a = \{2, 4, 8, 16\}" " = \\{2, 4, 8, 16\\}"
889
890    # scalar with scalar
891    gdb_test "ptype u${name}a = u${name}b" "type = (unsigned ${type}|u${type})"
892    gdb_test "ptype u${name}a += u${name}b" "type = (unsigned ${type}|u${type})"
893    gdb_test "ptype u${name}a -= u${name}b" "type = (unsigned ${type}|u${type})"
894    gdb_test "ptype u${name}a *= u${name}b" "type = (unsigned ${type}|u${type})"
895    gdb_test "ptype u${name}a /= u${name}b" "type = (unsigned ${type}|u${type})"
896    gdb_test "ptype u${name}a %= u${name}b" "type = (unsigned ${type}|u${type})"
897    gdb_test "ptype u${name}a <<= u${name}b" "type = (unsigned ${type}|u${type})"
898    gdb_test "ptype u${name}a >>= u${name}b" "type = (unsigned ${type}|u${type})"
899    gdb_test "ptype u${name}a &= u${name}b" "type = (unsigned ${type}|u${type})"
900    gdb_test "ptype u${name}a |= u${name}b" "type = (unsigned ${type}|u${type})"
901    gdb_test "ptype u${name}a ^= u${name}b" "type = (unsigned ${type}|u${type})"
902    # scalar with vector
903    gdb_test "ptype u${name}4a = u${name}b" "type = u${type}4"
904    gdb_test "ptype u${name}4a += u${name}b" "type = u${type}4"
905    gdb_test "ptype u${name}4a -= u${name}b" "type = u${type}4"
906    gdb_test "ptype u${name}4b *= u${name}a" "type = u${type}4"
907    gdb_test "ptype u${name}4b /= u${name}a" "type = u${type}4"
908    gdb_test "ptype u${name}4a %= u${name}b" "type = u${type}4"
909    gdb_test "ptype u${name}4a <<= u${name}b" "type = u${type}4"
910    gdb_test "ptype u${name}4a >>= u${name}b" "type = u${type}4"
911    gdb_test "ptype u${name}4a &= u${name}b" "type = u${type}4"
912    gdb_test "ptype u${name}4a |= u${name}b" "type = u${type}4"
913    gdb_test "ptype u${name}4a ^= u${name}b" "type = u${type}4"
914    # vector with vector
915    gdb_test "ptype u${name}4a = u${name}4b" "type = u${type}4"
916    gdb_test "ptype u${name}4a += u${name}4b" "type = u${type}4"
917    gdb_test "ptype u${name}4a -= u${name}4b" "type = u${type}4"
918    gdb_test "ptype u${name}4b *= u${name}4a" "type = u${type}4"
919    gdb_test "ptype u${name}4b /= u${name}4a" "type = u${type}4"
920    gdb_test "ptype u${name}4a %= u${name}4b" "type = u${type}4"
921    gdb_test "ptype u${name}4a <<= u${name}4b" "type = u${type}4"
922    gdb_test "ptype u${name}4a >>= u${name}4b" "type = u${type}4"
923    gdb_test "ptype u${name}4a &= u${name}4b" "type = u${type}4"
924    gdb_test "ptype u${name}4a |= u${name}4b" "type = u${type}4"
925    gdb_test "ptype u${name}4a ^= u${name}4b" "type = u${type}4"
926  }
927}
928
929proc do_check { name type isfloat size } {
930  check_basic ${name} ${type} ${isfloat}
931  check_arithmetic_ops ${name} ${type} ${isfloat} ${size}
932  check_relational_ops ${name} ${type} ${isfloat} ${size}
933  check_equality_ops ${name} ${type} ${isfloat} ${size}
934  if { !${isfloat} } {
935    check_shift_ops ${name} ${type} ${size}
936    check_bitwise_ops ${name} ${type} ${size}
937  }
938  check_logical_ops ${name} ${type} ${isfloat} ${size}
939  check_conditional_op ${name} ${type} ${isfloat}
940  check_assignment_ops ${name} ${type} ${isfloat} ${size}
941}
942
943do_check "c" "char" 0 1
944do_check "s" "short" 0 2
945do_check "i" "int" 0 4
946do_check "l" "long" 0 8
947if { ${have_cl_khr_fp16} } {
948  do_check "h" "half" 1 2
949}
950do_check "f" "float" 1 4
951if { ${have_cl_khr_fp64} } {
952  do_check "d" "double" 1 8
953}
954# Delete the OpenCL program source
955remote_file target delete ${clprogram}
956