blob: 2650a11919d7b53973ddeb3f32b2632b0f5a0617 [file] [edit]
; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-vulkan %s -o - | FileCheck %s
; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan %s -o - -filetype=obj | spirv-val --target-env vulkan1.3 %}
; Vulkan/Shader does not allow the Vector16 capability, so an MxN HLSL matrix
; is represented as [M x <N x float>] in LLVM IR and elementwise atan2 is
; computed per-row as M OpExtInst Atan2 calls on <N x float> (and similarly
; for half). Matrices with N=3 exercise the legalizer's handling of
; non-power-of-2 vector widths (legal for shader via allShaderFloatVectors).
; CHECK-NOT: OpCapability Vector16
; CHECK-DAG: %[[#op_ext_glsl:]] = OpExtInstImport "GLSL.std.450"
; CHECK-DAG: %[[#void:]] = OpTypeVoid
; CHECK-DAG: %[[#float_32:]] = OpTypeFloat 32
; CHECK-DAG: %[[#float_16:]] = OpTypeFloat 16
; CHECK-DAG: %[[#vec4_float_32:]] = OpTypeVector %[[#float_32]] 4
; CHECK-DAG: %[[#vec4_float_16:]] = OpTypeVector %[[#float_16]] 4
; CHECK-DAG: %[[#vec3_float_32:]] = OpTypeVector %[[#float_32]] 3
; CHECK-DAG: %[[#vec3_float_16:]] = OpTypeVector %[[#float_16]] 3
; CHECK-DAG: %[[#vec2_float_32:]] = OpTypeVector %[[#float_32]] 2
; CHECK-DAG: %[[#vec2_float_16:]] = OpTypeVector %[[#float_16]] 2
; CHECK-DAG: %[[#int_32:]] = OpTypeInt 32 0
; CHECK-DAG: %[[#const_0:]] = OpConstant %[[#int_32]] 0
; CHECK-DAG: %[[#const_1:]] = OpConstant %[[#int_32]] 1
; CHECK-DAG: %[[#const_2:]] = OpConstant %[[#int_32]] 2
; CHECK-DAG: %[[#const_3:]] = OpConstant %[[#int_32]] 3
; CHECK-DAG: %[[#const_4:]] = OpConstant %[[#int_32]] 4
; CHECK-DAG: %[[#arr_f32:]] = OpTypeArray %[[#vec4_float_32]] %[[#const_4]]
; CHECK-DAG: %[[#arr_f16:]] = OpTypeArray %[[#vec4_float_16]] %[[#const_4]]
; CHECK-DAG: %[[#arr3_f32:]] = OpTypeArray %[[#vec3_float_32]] %[[#const_3]]
; CHECK-DAG: %[[#arr3_f16:]] = OpTypeArray %[[#vec3_float_16]] %[[#const_3]]
; CHECK-DAG: %[[#ptr_arr_f32:]] = OpTypePointer Private %[[#arr_f32]]
; CHECK-DAG: %[[#ptr_arr_f16:]] = OpTypePointer Private %[[#arr_f16]]
; CHECK-DAG: %[[#ptr_arr3_f32:]] = OpTypePointer Private %[[#arr3_f32]]
; CHECK-DAG: %[[#ptr_arr3_f16:]] = OpTypePointer Private %[[#arr3_f16]]
; CHECK-DAG: %[[#ptr_vec4_f32:]] = OpTypePointer Private %[[#vec4_float_32]]
; CHECK-DAG: %[[#ptr_vec4_f16:]] = OpTypePointer Private %[[#vec4_float_16]]
; CHECK-DAG: %[[#ptr_vec3_f32:]] = OpTypePointer Private %[[#vec3_float_32]]
; CHECK-DAG: %[[#ptr_vec3_f16:]] = OpTypePointer Private %[[#vec3_float_16]]
; CHECK-DAG: %[[#fn_f32:]] = OpTypeFunction %[[#void]] %[[#ptr_arr_f32]] %[[#ptr_arr_f32]] %[[#ptr_arr_f32]]
; CHECK-DAG: %[[#fn_f16:]] = OpTypeFunction %[[#void]] %[[#ptr_arr_f16]] %[[#ptr_arr_f16]] %[[#ptr_arr_f16]]
; CHECK-DAG: %[[#fn3_f32:]] = OpTypeFunction %[[#void]] %[[#ptr_arr3_f32]] %[[#ptr_arr3_f32]] %[[#ptr_arr3_f32]]
; CHECK-DAG: %[[#fn3_f16:]] = OpTypeFunction %[[#void]] %[[#ptr_arr3_f16]] %[[#ptr_arr3_f16]] %[[#ptr_arr3_f16]]
@wide_f32_6 = internal addrspace(10) global [6 x float] zeroinitializer
@wide_f16_6 = internal addrspace(10) global [6 x half] zeroinitializer
@wide_f32_8 = internal addrspace(10) global [8 x float] zeroinitializer
@wide_f16_8 = internal addrspace(10) global [8 x half] zeroinitializer
@wide_f32_9 = internal addrspace(10) global [9 x float] zeroinitializer
@wide_f16_9 = internal addrspace(10) global [9 x half] zeroinitializer
@wide_f32_12 = internal addrspace(10) global [12 x float] zeroinitializer
@wide_f16_12 = internal addrspace(10) global [12 x half] zeroinitializer
@wide_f32_16 = internal addrspace(10) global [16 x float] zeroinitializer
@wide_f16_16 = internal addrspace(10) global [16 x half] zeroinitializer
@shuffle_f32_4 = internal addrspace(10) global <4 x float> zeroinitializer
@mat_f32_4x4 = internal addrspace(10) global [4 x <4 x float>] zeroinitializer
@mat_f16_4x4 = internal addrspace(10) global [4 x <4 x half>] zeroinitializer
@mat_f32_3x3 = internal addrspace(10) global [3 x <3 x float>] zeroinitializer
@mat_f16_3x3 = internal addrspace(10) global [3 x <3 x half>] zeroinitializer
@mat_f32_2x2 = internal addrspace(10) global [2 x <2 x float>] zeroinitializer
@mat_f16_2x2 = internal addrspace(10) global [2 x <2 x half>] zeroinitializer
@mat_f32_2x3 = internal addrspace(10) global [2 x <3 x float>] zeroinitializer
@mat_f16_2x3 = internal addrspace(10) global [2 x <3 x half>] zeroinitializer
@mat_f32_3x2 = internal addrspace(10) global [3 x <2 x float>] zeroinitializer
@mat_f32_2x4 = internal addrspace(10) global [2 x <4 x float>] zeroinitializer
@mat_f32_4x2 = internal addrspace(10) global [4 x <2 x float>] zeroinitializer
@mat_f32_3x4 = internal addrspace(10) global [3 x <4 x float>] zeroinitializer
@mat_f16_3x4 = internal addrspace(10) global [3 x <4 x half>] zeroinitializer
@mat_f32_4x3 = internal addrspace(10) global [4 x <3 x float>] zeroinitializer
@mat_f16_4x3 = internal addrspace(10) global [4 x <3 x half>] zeroinitializer
define internal void @atan2_float4x4(ptr addrspace(10) %out, ptr addrspace(10) %a, ptr addrspace(10) %b) {
entry:
; CHECK: OpFunction %[[#void]] None %[[#fn_f32]]
; CHECK: %[[#out_f32:]] = OpFunctionParameter %[[#ptr_arr_f32]]
; CHECK: %[[#a_f32:]] = OpFunctionParameter %[[#ptr_arr_f32]]
; CHECK: %[[#b_f32:]] = OpFunctionParameter %[[#ptr_arr_f32]]
; CHECK: %[[#a0_ptr_f32:]] = OpAccessChain %[[#ptr_vec4_f32]] %[[#a_f32]] %[[#const_0]]
; CHECK: %[[#a1_ptr_f32:]] = OpAccessChain %[[#ptr_vec4_f32]] %[[#a_f32]] %[[#const_1]]
; CHECK: %[[#a2_ptr_f32:]] = OpAccessChain %[[#ptr_vec4_f32]] %[[#a_f32]] %[[#const_2]]
; CHECK: %[[#a3_ptr_f32:]] = OpAccessChain %[[#ptr_vec4_f32]] %[[#a_f32]] %[[#const_3]]
; CHECK: %[[#b0_ptr_f32:]] = OpAccessChain %[[#ptr_vec4_f32]] %[[#b_f32]] %[[#const_0]]
; CHECK: %[[#b1_ptr_f32:]] = OpAccessChain %[[#ptr_vec4_f32]] %[[#b_f32]] %[[#const_1]]
; CHECK: %[[#b2_ptr_f32:]] = OpAccessChain %[[#ptr_vec4_f32]] %[[#b_f32]] %[[#const_2]]
; CHECK: %[[#b3_ptr_f32:]] = OpAccessChain %[[#ptr_vec4_f32]] %[[#b_f32]] %[[#const_3]]
; CHECK: %[[#a0_f32:]] = OpLoad %[[#vec4_float_32]] %[[#a0_ptr_f32]]
; CHECK: %[[#a1_f32:]] = OpLoad %[[#vec4_float_32]] %[[#a1_ptr_f32]]
; CHECK: %[[#a2_f32:]] = OpLoad %[[#vec4_float_32]] %[[#a2_ptr_f32]]
; CHECK: %[[#a3_f32:]] = OpLoad %[[#vec4_float_32]] %[[#a3_ptr_f32]]
; CHECK: %[[#b0_f32:]] = OpLoad %[[#vec4_float_32]] %[[#b0_ptr_f32]]
; CHECK: %[[#b1_f32:]] = OpLoad %[[#vec4_float_32]] %[[#b1_ptr_f32]]
; CHECK: %[[#b2_f32:]] = OpLoad %[[#vec4_float_32]] %[[#b2_ptr_f32]]
; CHECK: %[[#b3_f32:]] = OpLoad %[[#vec4_float_32]] %[[#b3_ptr_f32]]
; CHECK: OpExtInst %[[#vec4_float_32]] %[[#op_ext_glsl]] Atan2 %[[#a0_f32]] %[[#b0_f32]]
; CHECK: OpExtInst %[[#vec4_float_32]] %[[#op_ext_glsl]] Atan2 %[[#a1_f32]] %[[#b1_f32]]
; CHECK: OpExtInst %[[#vec4_float_32]] %[[#op_ext_glsl]] Atan2 %[[#a2_f32]] %[[#b2_f32]]
; CHECK: OpExtInst %[[#vec4_float_32]] %[[#op_ext_glsl]] Atan2 %[[#a3_f32]] %[[#b3_f32]]
%a0 = getelementptr [4 x <4 x float>], ptr addrspace(10) %a, i32 0, i32 0
%a1 = getelementptr [4 x <4 x float>], ptr addrspace(10) %a, i32 0, i32 1
%a2 = getelementptr [4 x <4 x float>], ptr addrspace(10) %a, i32 0, i32 2
%a3 = getelementptr [4 x <4 x float>], ptr addrspace(10) %a, i32 0, i32 3
%b0 = getelementptr [4 x <4 x float>], ptr addrspace(10) %b, i32 0, i32 0
%b1 = getelementptr [4 x <4 x float>], ptr addrspace(10) %b, i32 0, i32 1
%b2 = getelementptr [4 x <4 x float>], ptr addrspace(10) %b, i32 0, i32 2
%b3 = getelementptr [4 x <4 x float>], ptr addrspace(10) %b, i32 0, i32 3
%va0 = load <4 x float>, ptr addrspace(10) %a0
%va1 = load <4 x float>, ptr addrspace(10) %a1
%va2 = load <4 x float>, ptr addrspace(10) %a2
%va3 = load <4 x float>, ptr addrspace(10) %a3
%vb0 = load <4 x float>, ptr addrspace(10) %b0
%vb1 = load <4 x float>, ptr addrspace(10) %b1
%vb2 = load <4 x float>, ptr addrspace(10) %b2
%vb3 = load <4 x float>, ptr addrspace(10) %b3
%r0 = call <4 x float> @llvm.atan2.v4f32(<4 x float> %va0, <4 x float> %vb0)
%r1 = call <4 x float> @llvm.atan2.v4f32(<4 x float> %va1, <4 x float> %vb1)
%r2 = call <4 x float> @llvm.atan2.v4f32(<4 x float> %va2, <4 x float> %vb2)
%r3 = call <4 x float> @llvm.atan2.v4f32(<4 x float> %va3, <4 x float> %vb3)
%out0 = getelementptr [4 x <4 x float>], ptr addrspace(10) %out, i32 0, i32 0
%out1 = getelementptr [4 x <4 x float>], ptr addrspace(10) %out, i32 0, i32 1
%out2 = getelementptr [4 x <4 x float>], ptr addrspace(10) %out, i32 0, i32 2
%out3 = getelementptr [4 x <4 x float>], ptr addrspace(10) %out, i32 0, i32 3
store <4 x float> %r0, ptr addrspace(10) %out0
store <4 x float> %r1, ptr addrspace(10) %out1
store <4 x float> %r2, ptr addrspace(10) %out2
store <4 x float> %r3, ptr addrspace(10) %out3
ret void
}
define internal void @atan2_half4x4(ptr addrspace(10) %out, ptr addrspace(10) %a, ptr addrspace(10) %b) {
entry:
; CHECK: OpFunction %[[#void]] None %[[#fn_f16]]
; CHECK: %[[#out_f16:]] = OpFunctionParameter %[[#ptr_arr_f16]]
; CHECK: %[[#a_f16:]] = OpFunctionParameter %[[#ptr_arr_f16]]
; CHECK: %[[#b_f16:]] = OpFunctionParameter %[[#ptr_arr_f16]]
; CHECK: %[[#a0_ptr_f16:]] = OpAccessChain %[[#ptr_vec4_f16]] %[[#a_f16]] %[[#const_0]]
; CHECK: %[[#a1_ptr_f16:]] = OpAccessChain %[[#ptr_vec4_f16]] %[[#a_f16]] %[[#const_1]]
; CHECK: %[[#a2_ptr_f16:]] = OpAccessChain %[[#ptr_vec4_f16]] %[[#a_f16]] %[[#const_2]]
; CHECK: %[[#a3_ptr_f16:]] = OpAccessChain %[[#ptr_vec4_f16]] %[[#a_f16]] %[[#const_3]]
; CHECK: %[[#b0_ptr_f16:]] = OpAccessChain %[[#ptr_vec4_f16]] %[[#b_f16]] %[[#const_0]]
; CHECK: %[[#b1_ptr_f16:]] = OpAccessChain %[[#ptr_vec4_f16]] %[[#b_f16]] %[[#const_1]]
; CHECK: %[[#b2_ptr_f16:]] = OpAccessChain %[[#ptr_vec4_f16]] %[[#b_f16]] %[[#const_2]]
; CHECK: %[[#b3_ptr_f16:]] = OpAccessChain %[[#ptr_vec4_f16]] %[[#b_f16]] %[[#const_3]]
; CHECK: %[[#a0_f16:]] = OpLoad %[[#vec4_float_16]] %[[#a0_ptr_f16]]
; CHECK: %[[#a1_f16:]] = OpLoad %[[#vec4_float_16]] %[[#a1_ptr_f16]]
; CHECK: %[[#a2_f16:]] = OpLoad %[[#vec4_float_16]] %[[#a2_ptr_f16]]
; CHECK: %[[#a3_f16:]] = OpLoad %[[#vec4_float_16]] %[[#a3_ptr_f16]]
; CHECK: %[[#b0_f16:]] = OpLoad %[[#vec4_float_16]] %[[#b0_ptr_f16]]
; CHECK: %[[#b1_f16:]] = OpLoad %[[#vec4_float_16]] %[[#b1_ptr_f16]]
; CHECK: %[[#b2_f16:]] = OpLoad %[[#vec4_float_16]] %[[#b2_ptr_f16]]
; CHECK: %[[#b3_f16:]] = OpLoad %[[#vec4_float_16]] %[[#b3_ptr_f16]]
; CHECK: OpExtInst %[[#vec4_float_16]] %[[#op_ext_glsl]] Atan2 %[[#a0_f16]] %[[#b0_f16]]
; CHECK: OpExtInst %[[#vec4_float_16]] %[[#op_ext_glsl]] Atan2 %[[#a1_f16]] %[[#b1_f16]]
; CHECK: OpExtInst %[[#vec4_float_16]] %[[#op_ext_glsl]] Atan2 %[[#a2_f16]] %[[#b2_f16]]
; CHECK: OpExtInst %[[#vec4_float_16]] %[[#op_ext_glsl]] Atan2 %[[#a3_f16]] %[[#b3_f16]]
%a0 = getelementptr [4 x <4 x half>], ptr addrspace(10) %a, i32 0, i32 0
%a1 = getelementptr [4 x <4 x half>], ptr addrspace(10) %a, i32 0, i32 1
%a2 = getelementptr [4 x <4 x half>], ptr addrspace(10) %a, i32 0, i32 2
%a3 = getelementptr [4 x <4 x half>], ptr addrspace(10) %a, i32 0, i32 3
%b0 = getelementptr [4 x <4 x half>], ptr addrspace(10) %b, i32 0, i32 0
%b1 = getelementptr [4 x <4 x half>], ptr addrspace(10) %b, i32 0, i32 1
%b2 = getelementptr [4 x <4 x half>], ptr addrspace(10) %b, i32 0, i32 2
%b3 = getelementptr [4 x <4 x half>], ptr addrspace(10) %b, i32 0, i32 3
%va0 = load <4 x half>, ptr addrspace(10) %a0
%va1 = load <4 x half>, ptr addrspace(10) %a1
%va2 = load <4 x half>, ptr addrspace(10) %a2
%va3 = load <4 x half>, ptr addrspace(10) %a3
%vb0 = load <4 x half>, ptr addrspace(10) %b0
%vb1 = load <4 x half>, ptr addrspace(10) %b1
%vb2 = load <4 x half>, ptr addrspace(10) %b2
%vb3 = load <4 x half>, ptr addrspace(10) %b3
%r0 = call <4 x half> @llvm.atan2.v4f16(<4 x half> %va0, <4 x half> %vb0)
%r1 = call <4 x half> @llvm.atan2.v4f16(<4 x half> %va1, <4 x half> %vb1)
%r2 = call <4 x half> @llvm.atan2.v4f16(<4 x half> %va2, <4 x half> %vb2)
%r3 = call <4 x half> @llvm.atan2.v4f16(<4 x half> %va3, <4 x half> %vb3)
%out0 = getelementptr [4 x <4 x half>], ptr addrspace(10) %out, i32 0, i32 0
%out1 = getelementptr [4 x <4 x half>], ptr addrspace(10) %out, i32 0, i32 1
%out2 = getelementptr [4 x <4 x half>], ptr addrspace(10) %out, i32 0, i32 2
%out3 = getelementptr [4 x <4 x half>], ptr addrspace(10) %out, i32 0, i32 3
store <4 x half> %r0, ptr addrspace(10) %out0
store <4 x half> %r1, ptr addrspace(10) %out1
store <4 x half> %r2, ptr addrspace(10) %out2
store <4 x half> %r3, ptr addrspace(10) %out3
ret void
}
define internal void @atan2_float3x3(ptr addrspace(10) %out, ptr addrspace(10) %a, ptr addrspace(10) %b) {
entry:
; CHECK: OpFunction %[[#void]] None %[[#fn3_f32]]
; CHECK: %[[#out3_f32:]] = OpFunctionParameter %[[#ptr_arr3_f32]]
; CHECK: %[[#a3v_f32:]] = OpFunctionParameter %[[#ptr_arr3_f32]]
; CHECK: %[[#b3v_f32:]] = OpFunctionParameter %[[#ptr_arr3_f32]]
; CHECK: %[[#a3v0_ptr_f32:]] = OpAccessChain %[[#ptr_vec3_f32]] %[[#a3v_f32]] %[[#const_0]]
; CHECK: %[[#a3v1_ptr_f32:]] = OpAccessChain %[[#ptr_vec3_f32]] %[[#a3v_f32]] %[[#const_1]]
; CHECK: %[[#a3v2_ptr_f32:]] = OpAccessChain %[[#ptr_vec3_f32]] %[[#a3v_f32]] %[[#const_2]]
; CHECK: %[[#b3v0_ptr_f32:]] = OpAccessChain %[[#ptr_vec3_f32]] %[[#b3v_f32]] %[[#const_0]]
; CHECK: %[[#b3v1_ptr_f32:]] = OpAccessChain %[[#ptr_vec3_f32]] %[[#b3v_f32]] %[[#const_1]]
; CHECK: %[[#b3v2_ptr_f32:]] = OpAccessChain %[[#ptr_vec3_f32]] %[[#b3v_f32]] %[[#const_2]]
; CHECK: %[[#a3v0_f32:]] = OpLoad %[[#vec3_float_32]] %[[#a3v0_ptr_f32]]
; CHECK: %[[#a3v1_f32:]] = OpLoad %[[#vec3_float_32]] %[[#a3v1_ptr_f32]]
; CHECK: %[[#a3v2_f32:]] = OpLoad %[[#vec3_float_32]] %[[#a3v2_ptr_f32]]
; CHECK: %[[#b3v0_f32:]] = OpLoad %[[#vec3_float_32]] %[[#b3v0_ptr_f32]]
; CHECK: %[[#b3v1_f32:]] = OpLoad %[[#vec3_float_32]] %[[#b3v1_ptr_f32]]
; CHECK: %[[#b3v2_f32:]] = OpLoad %[[#vec3_float_32]] %[[#b3v2_ptr_f32]]
; CHECK: OpExtInst %[[#vec3_float_32]] %[[#op_ext_glsl]] Atan2 %[[#a3v0_f32]] %[[#b3v0_f32]]
; CHECK: OpExtInst %[[#vec3_float_32]] %[[#op_ext_glsl]] Atan2 %[[#a3v1_f32]] %[[#b3v1_f32]]
; CHECK: OpExtInst %[[#vec3_float_32]] %[[#op_ext_glsl]] Atan2 %[[#a3v2_f32]] %[[#b3v2_f32]]
%a0 = getelementptr [3 x <3 x float>], ptr addrspace(10) %a, i32 0, i32 0
%a1 = getelementptr [3 x <3 x float>], ptr addrspace(10) %a, i32 0, i32 1
%a2 = getelementptr [3 x <3 x float>], ptr addrspace(10) %a, i32 0, i32 2
%b0 = getelementptr [3 x <3 x float>], ptr addrspace(10) %b, i32 0, i32 0
%b1 = getelementptr [3 x <3 x float>], ptr addrspace(10) %b, i32 0, i32 1
%b2 = getelementptr [3 x <3 x float>], ptr addrspace(10) %b, i32 0, i32 2
%va0 = load <3 x float>, ptr addrspace(10) %a0
%va1 = load <3 x float>, ptr addrspace(10) %a1
%va2 = load <3 x float>, ptr addrspace(10) %a2
%vb0 = load <3 x float>, ptr addrspace(10) %b0
%vb1 = load <3 x float>, ptr addrspace(10) %b1
%vb2 = load <3 x float>, ptr addrspace(10) %b2
%r0 = call <3 x float> @llvm.atan2.v3f32(<3 x float> %va0, <3 x float> %vb0)
%r1 = call <3 x float> @llvm.atan2.v3f32(<3 x float> %va1, <3 x float> %vb1)
%r2 = call <3 x float> @llvm.atan2.v3f32(<3 x float> %va2, <3 x float> %vb2)
%out0 = getelementptr [3 x <3 x float>], ptr addrspace(10) %out, i32 0, i32 0
%out1 = getelementptr [3 x <3 x float>], ptr addrspace(10) %out, i32 0, i32 1
%out2 = getelementptr [3 x <3 x float>], ptr addrspace(10) %out, i32 0, i32 2
store <3 x float> %r0, ptr addrspace(10) %out0
store <3 x float> %r1, ptr addrspace(10) %out1
store <3 x float> %r2, ptr addrspace(10) %out2
ret void
}
define internal void @atan2_half3x3(ptr addrspace(10) %out, ptr addrspace(10) %a, ptr addrspace(10) %b) {
entry:
; CHECK: OpFunction %[[#void]] None %[[#fn3_f16]]
; CHECK: %[[#out3_f16:]] = OpFunctionParameter %[[#ptr_arr3_f16]]
; CHECK: %[[#a3v_f16:]] = OpFunctionParameter %[[#ptr_arr3_f16]]
; CHECK: %[[#b3v_f16:]] = OpFunctionParameter %[[#ptr_arr3_f16]]
; CHECK: %[[#a3v0_ptr_f16:]] = OpAccessChain %[[#ptr_vec3_f16]] %[[#a3v_f16]] %[[#const_0]]
; CHECK: %[[#a3v1_ptr_f16:]] = OpAccessChain %[[#ptr_vec3_f16]] %[[#a3v_f16]] %[[#const_1]]
; CHECK: %[[#a3v2_ptr_f16:]] = OpAccessChain %[[#ptr_vec3_f16]] %[[#a3v_f16]] %[[#const_2]]
; CHECK: %[[#b3v0_ptr_f16:]] = OpAccessChain %[[#ptr_vec3_f16]] %[[#b3v_f16]] %[[#const_0]]
; CHECK: %[[#b3v1_ptr_f16:]] = OpAccessChain %[[#ptr_vec3_f16]] %[[#b3v_f16]] %[[#const_1]]
; CHECK: %[[#b3v2_ptr_f16:]] = OpAccessChain %[[#ptr_vec3_f16]] %[[#b3v_f16]] %[[#const_2]]
; CHECK: %[[#a3v0_f16:]] = OpLoad %[[#vec3_float_16]] %[[#a3v0_ptr_f16]]
; CHECK: %[[#a3v1_f16:]] = OpLoad %[[#vec3_float_16]] %[[#a3v1_ptr_f16]]
; CHECK: %[[#a3v2_f16:]] = OpLoad %[[#vec3_float_16]] %[[#a3v2_ptr_f16]]
; CHECK: %[[#b3v0_f16:]] = OpLoad %[[#vec3_float_16]] %[[#b3v0_ptr_f16]]
; CHECK: %[[#b3v1_f16:]] = OpLoad %[[#vec3_float_16]] %[[#b3v1_ptr_f16]]
; CHECK: %[[#b3v2_f16:]] = OpLoad %[[#vec3_float_16]] %[[#b3v2_ptr_f16]]
; CHECK: OpExtInst %[[#vec3_float_16]] %[[#op_ext_glsl]] Atan2 %[[#a3v0_f16]] %[[#b3v0_f16]]
; CHECK: OpExtInst %[[#vec3_float_16]] %[[#op_ext_glsl]] Atan2 %[[#a3v1_f16]] %[[#b3v1_f16]]
; CHECK: OpExtInst %[[#vec3_float_16]] %[[#op_ext_glsl]] Atan2 %[[#a3v2_f16]] %[[#b3v2_f16]]
%a0 = getelementptr [3 x <3 x half>], ptr addrspace(10) %a, i32 0, i32 0
%a1 = getelementptr [3 x <3 x half>], ptr addrspace(10) %a, i32 0, i32 1
%a2 = getelementptr [3 x <3 x half>], ptr addrspace(10) %a, i32 0, i32 2
%b0 = getelementptr [3 x <3 x half>], ptr addrspace(10) %b, i32 0, i32 0
%b1 = getelementptr [3 x <3 x half>], ptr addrspace(10) %b, i32 0, i32 1
%b2 = getelementptr [3 x <3 x half>], ptr addrspace(10) %b, i32 0, i32 2
%va0 = load <3 x half>, ptr addrspace(10) %a0
%va1 = load <3 x half>, ptr addrspace(10) %a1
%va2 = load <3 x half>, ptr addrspace(10) %a2
%vb0 = load <3 x half>, ptr addrspace(10) %b0
%vb1 = load <3 x half>, ptr addrspace(10) %b1
%vb2 = load <3 x half>, ptr addrspace(10) %b2
%r0 = call <3 x half> @llvm.atan2.v3f16(<3 x half> %va0, <3 x half> %vb0)
%r1 = call <3 x half> @llvm.atan2.v3f16(<3 x half> %va1, <3 x half> %vb1)
%r2 = call <3 x half> @llvm.atan2.v3f16(<3 x half> %va2, <3 x half> %vb2)
%out0 = getelementptr [3 x <3 x half>], ptr addrspace(10) %out, i32 0, i32 0
%out1 = getelementptr [3 x <3 x half>], ptr addrspace(10) %out, i32 0, i32 1
%out2 = getelementptr [3 x <3 x half>], ptr addrspace(10) %out, i32 0, i32 2
store <3 x half> %r0, ptr addrspace(10) %out0
store <3 x half> %r1, ptr addrspace(10) %out1
store <3 x half> %r2, ptr addrspace(10) %out2
ret void
}
define internal void @atan2_float2x2(ptr addrspace(10) %out, ptr addrspace(10) %a, ptr addrspace(10) %b) {
entry:
; CHECK: OpFunction %[[#void]] None
; CHECK-COUNT-2: OpExtInst %[[#vec2_float_32]] %[[#op_ext_glsl]] Atan2
%a0 = getelementptr [2 x <2 x float>], ptr addrspace(10) %a, i32 0, i32 0
%a1 = getelementptr [2 x <2 x float>], ptr addrspace(10) %a, i32 0, i32 1
%b0 = getelementptr [2 x <2 x float>], ptr addrspace(10) %b, i32 0, i32 0
%b1 = getelementptr [2 x <2 x float>], ptr addrspace(10) %b, i32 0, i32 1
%va0 = load <2 x float>, ptr addrspace(10) %a0
%va1 = load <2 x float>, ptr addrspace(10) %a1
%vb0 = load <2 x float>, ptr addrspace(10) %b0
%vb1 = load <2 x float>, ptr addrspace(10) %b1
%r0 = call <2 x float> @llvm.atan2.v2f32(<2 x float> %va0, <2 x float> %vb0)
%r1 = call <2 x float> @llvm.atan2.v2f32(<2 x float> %va1, <2 x float> %vb1)
%out0 = getelementptr [2 x <2 x float>], ptr addrspace(10) %out, i32 0, i32 0
%out1 = getelementptr [2 x <2 x float>], ptr addrspace(10) %out, i32 0, i32 1
store <2 x float> %r0, ptr addrspace(10) %out0
store <2 x float> %r1, ptr addrspace(10) %out1
ret void
}
define internal void @atan2_half2x2(ptr addrspace(10) %out, ptr addrspace(10) %a, ptr addrspace(10) %b) {
entry:
; CHECK: OpFunction %[[#void]] None
; CHECK-COUNT-2: OpExtInst %[[#vec2_float_16]] %[[#op_ext_glsl]] Atan2
%a0 = getelementptr [2 x <2 x half>], ptr addrspace(10) %a, i32 0, i32 0
%a1 = getelementptr [2 x <2 x half>], ptr addrspace(10) %a, i32 0, i32 1
%b0 = getelementptr [2 x <2 x half>], ptr addrspace(10) %b, i32 0, i32 0
%b1 = getelementptr [2 x <2 x half>], ptr addrspace(10) %b, i32 0, i32 1
%va0 = load <2 x half>, ptr addrspace(10) %a0
%va1 = load <2 x half>, ptr addrspace(10) %a1
%vb0 = load <2 x half>, ptr addrspace(10) %b0
%vb1 = load <2 x half>, ptr addrspace(10) %b1
%r0 = call <2 x half> @llvm.atan2.v2f16(<2 x half> %va0, <2 x half> %vb0)
%r1 = call <2 x half> @llvm.atan2.v2f16(<2 x half> %va1, <2 x half> %vb1)
%out0 = getelementptr [2 x <2 x half>], ptr addrspace(10) %out, i32 0, i32 0
%out1 = getelementptr [2 x <2 x half>], ptr addrspace(10) %out, i32 0, i32 1
store <2 x half> %r0, ptr addrspace(10) %out0
store <2 x half> %r1, ptr addrspace(10) %out1
ret void
}
; 2x3: 2 rows of <3 x float> — non-power-of-2 vector width.
define internal void @atan2_float2x3(ptr addrspace(10) %out, ptr addrspace(10) %a, ptr addrspace(10) %b) {
entry:
; CHECK: OpFunction %[[#void]] None
; CHECK-COUNT-2: OpExtInst %[[#vec3_float_32]] %[[#op_ext_glsl]] Atan2
%a0 = getelementptr [2 x <3 x float>], ptr addrspace(10) %a, i32 0, i32 0
%a1 = getelementptr [2 x <3 x float>], ptr addrspace(10) %a, i32 0, i32 1
%b0 = getelementptr [2 x <3 x float>], ptr addrspace(10) %b, i32 0, i32 0
%b1 = getelementptr [2 x <3 x float>], ptr addrspace(10) %b, i32 0, i32 1
%va0 = load <3 x float>, ptr addrspace(10) %a0
%va1 = load <3 x float>, ptr addrspace(10) %a1
%vb0 = load <3 x float>, ptr addrspace(10) %b0
%vb1 = load <3 x float>, ptr addrspace(10) %b1
%r0 = call <3 x float> @llvm.atan2.v3f32(<3 x float> %va0, <3 x float> %vb0)
%r1 = call <3 x float> @llvm.atan2.v3f32(<3 x float> %va1, <3 x float> %vb1)
%out0 = getelementptr [2 x <3 x float>], ptr addrspace(10) %out, i32 0, i32 0
%out1 = getelementptr [2 x <3 x float>], ptr addrspace(10) %out, i32 0, i32 1
store <3 x float> %r0, ptr addrspace(10) %out0
store <3 x float> %r1, ptr addrspace(10) %out1
ret void
}
define internal void @atan2_half2x3(ptr addrspace(10) %out, ptr addrspace(10) %a, ptr addrspace(10) %b) {
entry:
; CHECK: OpFunction %[[#void]] None
; CHECK-COUNT-2: OpExtInst %[[#vec3_float_16]] %[[#op_ext_glsl]] Atan2
%a0 = getelementptr [2 x <3 x half>], ptr addrspace(10) %a, i32 0, i32 0
%a1 = getelementptr [2 x <3 x half>], ptr addrspace(10) %a, i32 0, i32 1
%b0 = getelementptr [2 x <3 x half>], ptr addrspace(10) %b, i32 0, i32 0
%b1 = getelementptr [2 x <3 x half>], ptr addrspace(10) %b, i32 0, i32 1
%va0 = load <3 x half>, ptr addrspace(10) %a0
%va1 = load <3 x half>, ptr addrspace(10) %a1
%vb0 = load <3 x half>, ptr addrspace(10) %b0
%vb1 = load <3 x half>, ptr addrspace(10) %b1
%r0 = call <3 x half> @llvm.atan2.v3f16(<3 x half> %va0, <3 x half> %vb0)
%r1 = call <3 x half> @llvm.atan2.v3f16(<3 x half> %va1, <3 x half> %vb1)
%out0 = getelementptr [2 x <3 x half>], ptr addrspace(10) %out, i32 0, i32 0
%out1 = getelementptr [2 x <3 x half>], ptr addrspace(10) %out, i32 0, i32 1
store <3 x half> %r0, ptr addrspace(10) %out0
store <3 x half> %r1, ptr addrspace(10) %out1
ret void
}
define internal void @atan2_float3x2(ptr addrspace(10) %out, ptr addrspace(10) %a, ptr addrspace(10) %b) {
entry:
; CHECK: OpFunction %[[#void]] None
; CHECK-COUNT-3: OpExtInst %[[#vec2_float_32]] %[[#op_ext_glsl]] Atan2
%a0 = getelementptr [3 x <2 x float>], ptr addrspace(10) %a, i32 0, i32 0
%a1 = getelementptr [3 x <2 x float>], ptr addrspace(10) %a, i32 0, i32 1
%a2 = getelementptr [3 x <2 x float>], ptr addrspace(10) %a, i32 0, i32 2
%b0 = getelementptr [3 x <2 x float>], ptr addrspace(10) %b, i32 0, i32 0
%b1 = getelementptr [3 x <2 x float>], ptr addrspace(10) %b, i32 0, i32 1
%b2 = getelementptr [3 x <2 x float>], ptr addrspace(10) %b, i32 0, i32 2
%va0 = load <2 x float>, ptr addrspace(10) %a0
%va1 = load <2 x float>, ptr addrspace(10) %a1
%va2 = load <2 x float>, ptr addrspace(10) %a2
%vb0 = load <2 x float>, ptr addrspace(10) %b0
%vb1 = load <2 x float>, ptr addrspace(10) %b1
%vb2 = load <2 x float>, ptr addrspace(10) %b2
%r0 = call <2 x float> @llvm.atan2.v2f32(<2 x float> %va0, <2 x float> %vb0)
%r1 = call <2 x float> @llvm.atan2.v2f32(<2 x float> %va1, <2 x float> %vb1)
%r2 = call <2 x float> @llvm.atan2.v2f32(<2 x float> %va2, <2 x float> %vb2)
%out0 = getelementptr [3 x <2 x float>], ptr addrspace(10) %out, i32 0, i32 0
%out1 = getelementptr [3 x <2 x float>], ptr addrspace(10) %out, i32 0, i32 1
%out2 = getelementptr [3 x <2 x float>], ptr addrspace(10) %out, i32 0, i32 2
store <2 x float> %r0, ptr addrspace(10) %out0
store <2 x float> %r1, ptr addrspace(10) %out1
store <2 x float> %r2, ptr addrspace(10) %out2
ret void
}
define internal void @atan2_float2x4(ptr addrspace(10) %out, ptr addrspace(10) %a, ptr addrspace(10) %b) {
entry:
; CHECK: OpFunction %[[#void]] None
; CHECK-COUNT-2: OpExtInst %[[#vec4_float_32]] %[[#op_ext_glsl]] Atan2
%a0 = getelementptr [2 x <4 x float>], ptr addrspace(10) %a, i32 0, i32 0
%a1 = getelementptr [2 x <4 x float>], ptr addrspace(10) %a, i32 0, i32 1
%b0 = getelementptr [2 x <4 x float>], ptr addrspace(10) %b, i32 0, i32 0
%b1 = getelementptr [2 x <4 x float>], ptr addrspace(10) %b, i32 0, i32 1
%va0 = load <4 x float>, ptr addrspace(10) %a0
%va1 = load <4 x float>, ptr addrspace(10) %a1
%vb0 = load <4 x float>, ptr addrspace(10) %b0
%vb1 = load <4 x float>, ptr addrspace(10) %b1
%r0 = call <4 x float> @llvm.atan2.v4f32(<4 x float> %va0, <4 x float> %vb0)
%r1 = call <4 x float> @llvm.atan2.v4f32(<4 x float> %va1, <4 x float> %vb1)
%out0 = getelementptr [2 x <4 x float>], ptr addrspace(10) %out, i32 0, i32 0
%out1 = getelementptr [2 x <4 x float>], ptr addrspace(10) %out, i32 0, i32 1
store <4 x float> %r0, ptr addrspace(10) %out0
store <4 x float> %r1, ptr addrspace(10) %out1
ret void
}
define internal void @atan2_float4x2(ptr addrspace(10) %out, ptr addrspace(10) %a, ptr addrspace(10) %b) {
entry:
; CHECK: OpFunction %[[#void]] None
; CHECK-COUNT-4: OpExtInst %[[#vec2_float_32]] %[[#op_ext_glsl]] Atan2
%a0 = getelementptr [4 x <2 x float>], ptr addrspace(10) %a, i32 0, i32 0
%a1 = getelementptr [4 x <2 x float>], ptr addrspace(10) %a, i32 0, i32 1
%a2 = getelementptr [4 x <2 x float>], ptr addrspace(10) %a, i32 0, i32 2
%a3 = getelementptr [4 x <2 x float>], ptr addrspace(10) %a, i32 0, i32 3
%b0 = getelementptr [4 x <2 x float>], ptr addrspace(10) %b, i32 0, i32 0
%b1 = getelementptr [4 x <2 x float>], ptr addrspace(10) %b, i32 0, i32 1
%b2 = getelementptr [4 x <2 x float>], ptr addrspace(10) %b, i32 0, i32 2
%b3 = getelementptr [4 x <2 x float>], ptr addrspace(10) %b, i32 0, i32 3
%va0 = load <2 x float>, ptr addrspace(10) %a0
%va1 = load <2 x float>, ptr addrspace(10) %a1
%va2 = load <2 x float>, ptr addrspace(10) %a2
%va3 = load <2 x float>, ptr addrspace(10) %a3
%vb0 = load <2 x float>, ptr addrspace(10) %b0
%vb1 = load <2 x float>, ptr addrspace(10) %b1
%vb2 = load <2 x float>, ptr addrspace(10) %b2
%vb3 = load <2 x float>, ptr addrspace(10) %b3
%r0 = call <2 x float> @llvm.atan2.v2f32(<2 x float> %va0, <2 x float> %vb0)
%r1 = call <2 x float> @llvm.atan2.v2f32(<2 x float> %va1, <2 x float> %vb1)
%r2 = call <2 x float> @llvm.atan2.v2f32(<2 x float> %va2, <2 x float> %vb2)
%r3 = call <2 x float> @llvm.atan2.v2f32(<2 x float> %va3, <2 x float> %vb3)
%out0 = getelementptr [4 x <2 x float>], ptr addrspace(10) %out, i32 0, i32 0
%out1 = getelementptr [4 x <2 x float>], ptr addrspace(10) %out, i32 0, i32 1
%out2 = getelementptr [4 x <2 x float>], ptr addrspace(10) %out, i32 0, i32 2
%out3 = getelementptr [4 x <2 x float>], ptr addrspace(10) %out, i32 0, i32 3
store <2 x float> %r0, ptr addrspace(10) %out0
store <2 x float> %r1, ptr addrspace(10) %out1
store <2 x float> %r2, ptr addrspace(10) %out2
store <2 x float> %r3, ptr addrspace(10) %out3
ret void
}
; 3x4: 3 rows of <4 x float>.
define internal void @atan2_float3x4(ptr addrspace(10) %out, ptr addrspace(10) %a, ptr addrspace(10) %b) {
entry:
; CHECK: OpFunction %[[#void]] None
; CHECK-COUNT-3: OpExtInst %[[#vec4_float_32]] %[[#op_ext_glsl]] Atan2
%a0 = getelementptr [3 x <4 x float>], ptr addrspace(10) %a, i32 0, i32 0
%a1 = getelementptr [3 x <4 x float>], ptr addrspace(10) %a, i32 0, i32 1
%a2 = getelementptr [3 x <4 x float>], ptr addrspace(10) %a, i32 0, i32 2
%b0 = getelementptr [3 x <4 x float>], ptr addrspace(10) %b, i32 0, i32 0
%b1 = getelementptr [3 x <4 x float>], ptr addrspace(10) %b, i32 0, i32 1
%b2 = getelementptr [3 x <4 x float>], ptr addrspace(10) %b, i32 0, i32 2
%va0 = load <4 x float>, ptr addrspace(10) %a0
%va1 = load <4 x float>, ptr addrspace(10) %a1
%va2 = load <4 x float>, ptr addrspace(10) %a2
%vb0 = load <4 x float>, ptr addrspace(10) %b0
%vb1 = load <4 x float>, ptr addrspace(10) %b1
%vb2 = load <4 x float>, ptr addrspace(10) %b2
%r0 = call <4 x float> @llvm.atan2.v4f32(<4 x float> %va0, <4 x float> %vb0)
%r1 = call <4 x float> @llvm.atan2.v4f32(<4 x float> %va1, <4 x float> %vb1)
%r2 = call <4 x float> @llvm.atan2.v4f32(<4 x float> %va2, <4 x float> %vb2)
%out0 = getelementptr [3 x <4 x float>], ptr addrspace(10) %out, i32 0, i32 0
%out1 = getelementptr [3 x <4 x float>], ptr addrspace(10) %out, i32 0, i32 1
%out2 = getelementptr [3 x <4 x float>], ptr addrspace(10) %out, i32 0, i32 2
store <4 x float> %r0, ptr addrspace(10) %out0
store <4 x float> %r1, ptr addrspace(10) %out1
store <4 x float> %r2, ptr addrspace(10) %out2
ret void
}
define internal void @atan2_half3x4(ptr addrspace(10) %out, ptr addrspace(10) %a, ptr addrspace(10) %b) {
entry:
; CHECK: OpFunction %[[#void]] None
; CHECK-COUNT-3: OpExtInst %[[#vec4_float_16]] %[[#op_ext_glsl]] Atan2
%a0 = getelementptr [3 x <4 x half>], ptr addrspace(10) %a, i32 0, i32 0
%a1 = getelementptr [3 x <4 x half>], ptr addrspace(10) %a, i32 0, i32 1
%a2 = getelementptr [3 x <4 x half>], ptr addrspace(10) %a, i32 0, i32 2
%b0 = getelementptr [3 x <4 x half>], ptr addrspace(10) %b, i32 0, i32 0
%b1 = getelementptr [3 x <4 x half>], ptr addrspace(10) %b, i32 0, i32 1
%b2 = getelementptr [3 x <4 x half>], ptr addrspace(10) %b, i32 0, i32 2
%va0 = load <4 x half>, ptr addrspace(10) %a0
%va1 = load <4 x half>, ptr addrspace(10) %a1
%va2 = load <4 x half>, ptr addrspace(10) %a2
%vb0 = load <4 x half>, ptr addrspace(10) %b0
%vb1 = load <4 x half>, ptr addrspace(10) %b1
%vb2 = load <4 x half>, ptr addrspace(10) %b2
%r0 = call <4 x half> @llvm.atan2.v4f16(<4 x half> %va0, <4 x half> %vb0)
%r1 = call <4 x half> @llvm.atan2.v4f16(<4 x half> %va1, <4 x half> %vb1)
%r2 = call <4 x half> @llvm.atan2.v4f16(<4 x half> %va2, <4 x half> %vb2)
%out0 = getelementptr [3 x <4 x half>], ptr addrspace(10) %out, i32 0, i32 0
%out1 = getelementptr [3 x <4 x half>], ptr addrspace(10) %out, i32 0, i32 1
%out2 = getelementptr [3 x <4 x half>], ptr addrspace(10) %out, i32 0, i32 2
store <4 x half> %r0, ptr addrspace(10) %out0
store <4 x half> %r1, ptr addrspace(10) %out1
store <4 x half> %r2, ptr addrspace(10) %out2
ret void
}
; 4x3: 4 rows of <3 x float> — non-power-of-2 vector width.
define internal void @atan2_float4x3(ptr addrspace(10) %out, ptr addrspace(10) %a, ptr addrspace(10) %b) {
entry:
; CHECK: OpFunction %[[#void]] None
; CHECK-COUNT-4: OpExtInst %[[#vec3_float_32]] %[[#op_ext_glsl]] Atan2
%a0 = getelementptr [4 x <3 x float>], ptr addrspace(10) %a, i32 0, i32 0
%a1 = getelementptr [4 x <3 x float>], ptr addrspace(10) %a, i32 0, i32 1
%a2 = getelementptr [4 x <3 x float>], ptr addrspace(10) %a, i32 0, i32 2
%a3 = getelementptr [4 x <3 x float>], ptr addrspace(10) %a, i32 0, i32 3
%b0 = getelementptr [4 x <3 x float>], ptr addrspace(10) %b, i32 0, i32 0
%b1 = getelementptr [4 x <3 x float>], ptr addrspace(10) %b, i32 0, i32 1
%b2 = getelementptr [4 x <3 x float>], ptr addrspace(10) %b, i32 0, i32 2
%b3 = getelementptr [4 x <3 x float>], ptr addrspace(10) %b, i32 0, i32 3
%va0 = load <3 x float>, ptr addrspace(10) %a0
%va1 = load <3 x float>, ptr addrspace(10) %a1
%va2 = load <3 x float>, ptr addrspace(10) %a2
%va3 = load <3 x float>, ptr addrspace(10) %a3
%vb0 = load <3 x float>, ptr addrspace(10) %b0
%vb1 = load <3 x float>, ptr addrspace(10) %b1
%vb2 = load <3 x float>, ptr addrspace(10) %b2
%vb3 = load <3 x float>, ptr addrspace(10) %b3
%r0 = call <3 x float> @llvm.atan2.v3f32(<3 x float> %va0, <3 x float> %vb0)
%r1 = call <3 x float> @llvm.atan2.v3f32(<3 x float> %va1, <3 x float> %vb1)
%r2 = call <3 x float> @llvm.atan2.v3f32(<3 x float> %va2, <3 x float> %vb2)
%r3 = call <3 x float> @llvm.atan2.v3f32(<3 x float> %va3, <3 x float> %vb3)
%out0 = getelementptr [4 x <3 x float>], ptr addrspace(10) %out, i32 0, i32 0
%out1 = getelementptr [4 x <3 x float>], ptr addrspace(10) %out, i32 0, i32 1
%out2 = getelementptr [4 x <3 x float>], ptr addrspace(10) %out, i32 0, i32 2
%out3 = getelementptr [4 x <3 x float>], ptr addrspace(10) %out, i32 0, i32 3
store <3 x float> %r0, ptr addrspace(10) %out0
store <3 x float> %r1, ptr addrspace(10) %out1
store <3 x float> %r2, ptr addrspace(10) %out2
store <3 x float> %r3, ptr addrspace(10) %out3
ret void
}
define internal void @atan2_half4x3(ptr addrspace(10) %out, ptr addrspace(10) %a, ptr addrspace(10) %b) {
entry:
; CHECK: OpFunction %[[#void]] None
; CHECK-COUNT-4: OpExtInst %[[#vec3_float_16]] %[[#op_ext_glsl]] Atan2
%a0 = getelementptr [4 x <3 x half>], ptr addrspace(10) %a, i32 0, i32 0
%a1 = getelementptr [4 x <3 x half>], ptr addrspace(10) %a, i32 0, i32 1
%a2 = getelementptr [4 x <3 x half>], ptr addrspace(10) %a, i32 0, i32 2
%a3 = getelementptr [4 x <3 x half>], ptr addrspace(10) %a, i32 0, i32 3
%b0 = getelementptr [4 x <3 x half>], ptr addrspace(10) %b, i32 0, i32 0
%b1 = getelementptr [4 x <3 x half>], ptr addrspace(10) %b, i32 0, i32 1
%b2 = getelementptr [4 x <3 x half>], ptr addrspace(10) %b, i32 0, i32 2
%b3 = getelementptr [4 x <3 x half>], ptr addrspace(10) %b, i32 0, i32 3
%va0 = load <3 x half>, ptr addrspace(10) %a0
%va1 = load <3 x half>, ptr addrspace(10) %a1
%va2 = load <3 x half>, ptr addrspace(10) %a2
%va3 = load <3 x half>, ptr addrspace(10) %a3
%vb0 = load <3 x half>, ptr addrspace(10) %b0
%vb1 = load <3 x half>, ptr addrspace(10) %b1
%vb2 = load <3 x half>, ptr addrspace(10) %b2
%vb3 = load <3 x half>, ptr addrspace(10) %b3
%r0 = call <3 x half> @llvm.atan2.v3f16(<3 x half> %va0, <3 x half> %vb0)
%r1 = call <3 x half> @llvm.atan2.v3f16(<3 x half> %va1, <3 x half> %vb1)
%r2 = call <3 x half> @llvm.atan2.v3f16(<3 x half> %va2, <3 x half> %vb2)
%r3 = call <3 x half> @llvm.atan2.v3f16(<3 x half> %va3, <3 x half> %vb3)
%out0 = getelementptr [4 x <3 x half>], ptr addrspace(10) %out, i32 0, i32 0
%out1 = getelementptr [4 x <3 x half>], ptr addrspace(10) %out, i32 0, i32 1
%out2 = getelementptr [4 x <3 x half>], ptr addrspace(10) %out, i32 0, i32 2
%out3 = getelementptr [4 x <3 x half>], ptr addrspace(10) %out, i32 0, i32 3
store <3 x half> %r0, ptr addrspace(10) %out0
store <3 x half> %r1, ptr addrspace(10) %out1
store <3 x half> %r2, ptr addrspace(10) %out2
store <3 x half> %r3, ptr addrspace(10) %out3
ret void
}
define internal void @atan2_float6_from_shuffle() {
entry:
; CHECK: OpFunction %[[#void]] None
; CHECK: %[[#shuffle_f32:]] = OpLoad %[[#vec4_float_32]]
; CHECK: OpCompositeExtract %[[#float_32]] %[[#shuffle_f32]] 0
; CHECK-COUNT-2: OpExtInst {{%[0-9]+}} %[[#op_ext_glsl]] Atan2
; CHECK: OpFunctionEnd
%vec = load <4 x float>, ptr addrspace(10) @shuffle_f32_4
%va = shufflevector <4 x float> %vec, <4 x float> %vec,
<6 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5>
%r = call <6 x float> @llvm.atan2.v6f32(<6 x float> %va, <6 x float> %va)
store <6 x float> %r, ptr addrspace(10) @wide_f32_6
ret void
}
define internal void @atan2_half6() {
entry:
; CHECK: OpFunction %[[#void]] None
; CHECK-COUNT-2: OpExtInst {{%[0-9]+}} %[[#op_ext_glsl]] Atan2
; CHECK: OpFunctionEnd
%va = load <6 x half>, ptr addrspace(10) @wide_f16_6
%vb = load <6 x half>, ptr addrspace(10) @wide_f16_6
%r = call <6 x half> @llvm.atan2.v6f16(<6 x half> %va, <6 x half> %vb)
store <6 x half> %r, ptr addrspace(10) @wide_f16_6
ret void
}
define internal void @atan2_float8() {
entry:
; CHECK: OpFunction %[[#void]] None
; CHECK-COUNT-2: OpExtInst %[[#vec4_float_32]] %[[#op_ext_glsl]] Atan2
; CHECK: OpFunctionEnd
%va = load <8 x float>, ptr addrspace(10) @wide_f32_8
%vb = load <8 x float>, ptr addrspace(10) @wide_f32_8
%r = call <8 x float> @llvm.atan2.v8f32(<8 x float> %va, <8 x float> %vb)
store <8 x float> %r, ptr addrspace(10) @wide_f32_8
ret void
}
define internal void @atan2_half8() {
entry:
; CHECK: OpFunction %[[#void]] None
; CHECK-COUNT-2: OpExtInst %[[#vec4_float_16]] %[[#op_ext_glsl]] Atan2
; CHECK: OpFunctionEnd
%va = load <8 x half>, ptr addrspace(10) @wide_f16_8
%vb = load <8 x half>, ptr addrspace(10) @wide_f16_8
%r = call <8 x half> @llvm.atan2.v8f16(<8 x half> %va, <8 x half> %vb)
store <8 x half> %r, ptr addrspace(10) @wide_f16_8
ret void
}
define internal void @atan2_float9() {
entry:
; CHECK: OpFunction %[[#void]] None
; CHECK-COUNT-3: OpExtInst {{%[0-9]+}} %[[#op_ext_glsl]] Atan2
; CHECK: OpFunctionEnd
%va = load <9 x float>, ptr addrspace(10) @wide_f32_9
%vb = load <9 x float>, ptr addrspace(10) @wide_f32_9
%r = call <9 x float> @llvm.atan2.v9f32(<9 x float> %va, <9 x float> %vb)
store <9 x float> %r, ptr addrspace(10) @wide_f32_9
ret void
}
define internal void @atan2_half9() {
entry:
; CHECK: OpFunction %[[#void]] None
; CHECK-COUNT-3: OpExtInst {{%[0-9]+}} %[[#op_ext_glsl]] Atan2
; CHECK: OpFunctionEnd
%va = load <9 x half>, ptr addrspace(10) @wide_f16_9
%vb = load <9 x half>, ptr addrspace(10) @wide_f16_9
%r = call <9 x half> @llvm.atan2.v9f16(<9 x half> %va, <9 x half> %vb)
store <9 x half> %r, ptr addrspace(10) @wide_f16_9
ret void
}
define internal void @atan2_float12() {
entry:
; CHECK: OpFunction %[[#void]] None
; CHECK-COUNT-3: OpExtInst %[[#vec4_float_32]] %[[#op_ext_glsl]] Atan2
; CHECK: OpFunctionEnd
%va = load <12 x float>, ptr addrspace(10) @wide_f32_12
%vb = load <12 x float>, ptr addrspace(10) @wide_f32_12
%r = call <12 x float> @llvm.atan2.v12f32(<12 x float> %va, <12 x float> %vb)
store <12 x float> %r, ptr addrspace(10) @wide_f32_12
ret void
}
define internal void @atan2_half12() {
entry:
; CHECK: OpFunction %[[#void]] None
; CHECK-COUNT-3: OpExtInst %[[#vec4_float_16]] %[[#op_ext_glsl]] Atan2
; CHECK: OpFunctionEnd
%va = load <12 x half>, ptr addrspace(10) @wide_f16_12
%vb = load <12 x half>, ptr addrspace(10) @wide_f16_12
%r = call <12 x half> @llvm.atan2.v12f16(<12 x half> %va, <12 x half> %vb)
store <12 x half> %r, ptr addrspace(10) @wide_f16_12
ret void
}
define internal void @atan2_float16() {
entry:
; CHECK: OpFunction %[[#void]] None
; CHECK-COUNT-4: OpExtInst %[[#vec4_float_32]] %[[#op_ext_glsl]] Atan2
; CHECK: OpFunctionEnd
%va = load <16 x float>, ptr addrspace(10) @wide_f32_16
%vb = load <16 x float>, ptr addrspace(10) @wide_f32_16
%r = call <16 x float> @llvm.atan2.v16f32(<16 x float> %va, <16 x float> %vb)
store <16 x float> %r, ptr addrspace(10) @wide_f32_16
ret void
}
define internal void @atan2_half16() {
entry:
; CHECK: OpFunction %[[#void]] None
; CHECK-COUNT-4: OpExtInst %[[#vec4_float_16]] %[[#op_ext_glsl]] Atan2
; CHECK: OpFunctionEnd
%va = load <16 x half>, ptr addrspace(10) @wide_f16_16
%vb = load <16 x half>, ptr addrspace(10) @wide_f16_16
%r = call <16 x half> @llvm.atan2.v16f16(<16 x half> %va, <16 x half> %vb)
store <16 x half> %r, ptr addrspace(10) @wide_f16_16
ret void
}
define void @main() #0 {
entry:
call void @atan2_float4x4(ptr addrspace(10) @mat_f32_4x4, ptr addrspace(10) @mat_f32_4x4, ptr addrspace(10) @mat_f32_4x4)
call void @atan2_half4x4(ptr addrspace(10) @mat_f16_4x4, ptr addrspace(10) @mat_f16_4x4, ptr addrspace(10) @mat_f16_4x4)
call void @atan2_float3x3(ptr addrspace(10) @mat_f32_3x3, ptr addrspace(10) @mat_f32_3x3, ptr addrspace(10) @mat_f32_3x3)
call void @atan2_half3x3(ptr addrspace(10) @mat_f16_3x3, ptr addrspace(10) @mat_f16_3x3, ptr addrspace(10) @mat_f16_3x3)
call void @atan2_float2x2(ptr addrspace(10) @mat_f32_2x2, ptr addrspace(10) @mat_f32_2x2, ptr addrspace(10) @mat_f32_2x2)
call void @atan2_half2x2(ptr addrspace(10) @mat_f16_2x2, ptr addrspace(10) @mat_f16_2x2, ptr addrspace(10) @mat_f16_2x2)
call void @atan2_float2x3(ptr addrspace(10) @mat_f32_2x3, ptr addrspace(10) @mat_f32_2x3, ptr addrspace(10) @mat_f32_2x3)
call void @atan2_half2x3(ptr addrspace(10) @mat_f16_2x3, ptr addrspace(10) @mat_f16_2x3, ptr addrspace(10) @mat_f16_2x3)
call void @atan2_float3x2(ptr addrspace(10) @mat_f32_3x2, ptr addrspace(10) @mat_f32_3x2, ptr addrspace(10) @mat_f32_3x2)
call void @atan2_float2x4(ptr addrspace(10) @mat_f32_2x4, ptr addrspace(10) @mat_f32_2x4, ptr addrspace(10) @mat_f32_2x4)
call void @atan2_float4x2(ptr addrspace(10) @mat_f32_4x2, ptr addrspace(10) @mat_f32_4x2, ptr addrspace(10) @mat_f32_4x2)
call void @atan2_float3x4(ptr addrspace(10) @mat_f32_3x4, ptr addrspace(10) @mat_f32_3x4, ptr addrspace(10) @mat_f32_3x4)
call void @atan2_half3x4(ptr addrspace(10) @mat_f16_3x4, ptr addrspace(10) @mat_f16_3x4, ptr addrspace(10) @mat_f16_3x4)
call void @atan2_float4x3(ptr addrspace(10) @mat_f32_4x3, ptr addrspace(10) @mat_f32_4x3, ptr addrspace(10) @mat_f32_4x3)
call void @atan2_half4x3(ptr addrspace(10) @mat_f16_4x3, ptr addrspace(10) @mat_f16_4x3, ptr addrspace(10) @mat_f16_4x3)
call void @atan2_float6_from_shuffle()
call void @atan2_half6()
call void @atan2_float8()
call void @atan2_half8()
call void @atan2_float9()
call void @atan2_half9()
call void @atan2_float12()
call void @atan2_half12()
call void @atan2_float16()
call void @atan2_half16()
ret void
}
declare <4 x float> @llvm.atan2.v4f32(<4 x float>, <4 x float>)
declare <4 x half> @llvm.atan2.v4f16(<4 x half>, <4 x half>)
declare <3 x float> @llvm.atan2.v3f32(<3 x float>, <3 x float>)
declare <3 x half> @llvm.atan2.v3f16(<3 x half>, <3 x half>)
declare <2 x float> @llvm.atan2.v2f32(<2 x float>, <2 x float>)
declare <2 x half> @llvm.atan2.v2f16(<2 x half>, <2 x half>)
declare <6 x float> @llvm.atan2.v6f32(<6 x float>, <6 x float>)
declare <6 x half> @llvm.atan2.v6f16(<6 x half>, <6 x half>)
declare <8 x float> @llvm.atan2.v8f32(<8 x float>, <8 x float>)
declare <8 x half> @llvm.atan2.v8f16(<8 x half>, <8 x half>)
declare <9 x float> @llvm.atan2.v9f32(<9 x float>, <9 x float>)
declare <9 x half> @llvm.atan2.v9f16(<9 x half>, <9 x half>)
declare <12 x float> @llvm.atan2.v12f32(<12 x float>, <12 x float>)
declare <12 x half> @llvm.atan2.v12f16(<12 x half>, <12 x half>)
declare <16 x float> @llvm.atan2.v16f32(<16 x float>, <16 x float>)
declare <16 x half> @llvm.atan2.v16f16(<16 x half>, <16 x half>)
attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }