xref: /aosp_15_r20/external/clang/test/CodeGenOpenCL/logical-ops.cl (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li// RUN: %clang_cc1 %s -emit-llvm -o - -cl-std=CL1.2 -O1 -triple x86_64-unknown-linux-gnu | FileCheck %s
2*67e74705SXin Li
3*67e74705SXin Li#pragma OPENCL EXTENSION cl_khr_fp64 : enable
4*67e74705SXin Li
5*67e74705SXin Litypedef int int4 __attribute((ext_vector_type(4)));
6*67e74705SXin Litypedef long long4 __attribute((ext_vector_type(4)));
7*67e74705SXin Litypedef float float4 __attribute((ext_vector_type(4)));
8*67e74705SXin Litypedef double double4 __attribute((ext_vector_type(4)));
9*67e74705SXin Li
10*67e74705SXin Li// CHECK: floatops
11*67e74705SXin Likernel void floatops(global int4 *out, global float4 *fout) {
12*67e74705SXin Li  // CHECK: store <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>
13*67e74705SXin Li  out[0] = (float4)(1, 1, 1, 1) && 1.0f;
14*67e74705SXin Li  // CHECK: store <4 x i32> zeroinitializer
15*67e74705SXin Li  out[1] = (float4)(0, 0, 0, 0) && (float4)(0, 0, 0, 0);
16*67e74705SXin Li
17*67e74705SXin Li  // CHECK: store <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>
18*67e74705SXin Li  out[2] = (float4)(0, 0, 0, 0) || (float4)(1, 1, 1, 1);
19*67e74705SXin Li  // CHECK: store <4 x i32> zeroinitializer
20*67e74705SXin Li  out[3] = (float4)(0, 0, 0, 0) || 0.0f;
21*67e74705SXin Li
22*67e74705SXin Li  // CHECK: store <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>
23*67e74705SXin Li  out[4] = !(float4)(0, 0, 0, 0);
24*67e74705SXin Li  // CHECK: store <4 x i32> zeroinitializer
25*67e74705SXin Li  out[5] = !(float4)(1, 2, 3, 4);
26*67e74705SXin Li  // CHECK: store <4 x i32> <i32 -1, i32 0, i32 -1, i32 0>
27*67e74705SXin Li  out[6] = !(float4)(0, 1, 0, 1);
28*67e74705SXin Li  // CHECK: store <4 x float> <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00>
29*67e74705SXin Li  fout[0] = (float4)(!0.0f);
30*67e74705SXin Li  // CHECK: store <4 x float> zeroinitializer
31*67e74705SXin Li  fout[1] = (float4)(!1.0f);
32*67e74705SXin Li}
33*67e74705SXin Li
34*67e74705SXin Li// CHECK: doubleops
35*67e74705SXin Likernel void doubleops(global long4 *out, global double4 *dout) {
36*67e74705SXin Li  // CHECK: store <4 x i64> <i64 -1, i64 -1, i64 -1, i64 -1>
37*67e74705SXin Li  out[0] = (double4)(1, 1, 1, 1) && 1.0;
38*67e74705SXin Li  // CHECK: store <4 x i64> zeroinitializer
39*67e74705SXin Li  out[1] = (double4)(0, 0, 0, 0) && (double4)(0, 0, 0, 0);
40*67e74705SXin Li
41*67e74705SXin Li  // CHECK: store <4 x i64> <i64 -1, i64 -1, i64 -1, i64 -1>
42*67e74705SXin Li  out[2] = (double4)(0, 0, 0, 0) || (double4)(1, 1, 1, 1);
43*67e74705SXin Li  // CHECK: store <4 x i64> zeroinitializer
44*67e74705SXin Li  out[3] = (double4)(0, 0, 0, 0) || 0.0f;
45*67e74705SXin Li
46*67e74705SXin Li  // CHECK: store <4 x i64> <i64 -1, i64 -1, i64 -1, i64 -1>
47*67e74705SXin Li  out[4] = !(double4)(0, 0, 0, 0);
48*67e74705SXin Li  // CHECK: store <4 x i64> zeroinitializer
49*67e74705SXin Li  out[5] = !(double4)(1, 2, 3, 4);
50*67e74705SXin Li  // CHECK: store <4 x i64> <i64 -1, i64 0, i64 -1, i64 0>
51*67e74705SXin Li  out[6] = !(double4)(0, 1, 0, 1);
52*67e74705SXin Li  // CHECK: store <4 x double> <double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00>
53*67e74705SXin Li  dout[0] = (double4)(!0.0f);
54*67e74705SXin Li  // CHECK: store <4 x double> zeroinitializer
55*67e74705SXin Li  dout[1] = (double4)(!1.0f);
56*67e74705SXin Li}
57