|
| 1 | +; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-vulkan %s -o - | FileCheck %s |
| 2 | +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan %s -o - -filetype=obj | spirv-val %} |
| 3 | + |
| 4 | +; CHECK-DAG: OpName %[[#test_int32_double_conversion:]] "test_int32_double_conversion" |
| 5 | +; CHECK-DAG: %[[#int:]] = OpTypeInt 32 0 |
| 6 | +; CHECK-DAG: %[[#v4i32:]] = OpTypeVector %[[#int]] 4 |
| 7 | +; CHECK-DAG: %[[#double:]] = OpTypeFloat 64 |
| 8 | +; CHECK-DAG: %[[#v4f64:]] = OpTypeVector %[[#double]] 4 |
| 9 | +; CHECK-DAG: %[[#v2i32:]] = OpTypeVector %[[#int]] 2 |
| 10 | +; CHECK-DAG: %[[#ptr_private_v4i32:]] = OpTypePointer Private %[[#v4i32]] |
| 11 | +; CHECK-DAG: %[[#ptr_private_v4f64:]] = OpTypePointer Private %[[#v4f64]] |
| 12 | +; CHECK-DAG: %[[#global_double:]] = OpVariable %[[#ptr_private_v4f64]] Private |
| 13 | + |
| 14 | +@G_16 = internal addrspace(10) global [16 x i32] zeroinitializer |
| 15 | +@G_4_double = internal addrspace(10) global <4 x double> zeroinitializer |
| 16 | +@G_4_int = internal addrspace(10) global <4 x i32> zeroinitializer |
| 17 | + |
| 18 | + |
| 19 | +; This is the way matrices will be represented in HLSL. The memory type will be |
| 20 | +; an array, but it will be loaded as a vector. |
| 21 | +; TODO: Legalization for loads and stores of long vectors is not implemented yet. │ |
| 22 | +;define spir_func void @test_load_store_global() { │ |
| 23 | +;entry: │ |
| 24 | +; %0 = load <16 x i32>, ptr addrspace(10) @G_16, align 64 │ |
| 25 | +; store <16 x i32> %0, ptr addrspace(10) @G_16, align 64 │ |
| 26 | +; ret void │ |
| 27 | +;} |
| 28 | + |
| 29 | +; This is the code pattern that can be generated from the `asuint` and `asdouble` |
| 30 | +; HLSL intrinsics. |
| 31 | + |
| 32 | +; TODO: This cods not the best because instruction selection is not folding an |
| 33 | +; extract from other intstruction. That needs to be handled. |
| 34 | +define spir_func void @test_int32_double_conversion() { |
| 35 | +; CHECK: %[[#test_int32_double_conversion]] = OpFunction |
| 36 | +entry: |
| 37 | + ; CHECK: %[[#LOAD:]] = OpLoad %[[#v4f64]] %[[#global_double]] |
| 38 | + ; CHECK: %[[#VEC_SHUF1:]] = OpVectorShuffle %{{[a-zA-Z0-9_]+}} %[[#LOAD]] %{{[a-zA-Z0-9_]+}} 0 1 |
| 39 | + ; CHECK: %[[#VEC_SHUF2:]] = OpVectorShuffle %{{[a-zA-Z0-9_]+}} %[[#LOAD]] %{{[a-zA-Z0-9_]+}} 2 3 |
| 40 | + ; CHECK: %[[#BITCAST1:]] = OpBitcast %[[#v4i32]] %[[#VEC_SHUF1]] |
| 41 | + ; CHECK: %[[#BITCAST2:]] = OpBitcast %[[#v4i32]] %[[#VEC_SHUF2]] |
| 42 | + ; CHECK: %[[#EXTRACT1:]] = OpCompositeExtract %[[#int]] %[[#BITCAST1]] 0 |
| 43 | + ; CHECK: %[[#EXTRACT2:]] = OpCompositeExtract %[[#int]] %[[#BITCAST1]] 2 |
| 44 | + ; CHECK: %[[#EXTRACT3:]] = OpCompositeExtract %[[#int]] %[[#BITCAST2]] 0 |
| 45 | + ; CHECK: %[[#EXTRACT4:]] = OpCompositeExtract %[[#int]] %[[#BITCAST2]] 2 |
| 46 | + ; CHECK: %[[#CONSTRUCT1:]] = OpCompositeConstruct %[[#v4i32]] %[[#EXTRACT1]] %[[#EXTRACT2]] %[[#EXTRACT3]] %[[#EXTRACT4]] |
| 47 | + ; CHECK: %[[#EXTRACT5:]] = OpCompositeExtract %[[#int]] %[[#BITCAST1]] 1 |
| 48 | + ; CHECK: %[[#EXTRACT6:]] = OpCompositeExtract %[[#int]] %[[#BITCAST1]] 3 |
| 49 | + ; CHECK: %[[#EXTRACT7:]] = OpCompositeExtract %[[#int]] %[[#BITCAST2]] 1 |
| 50 | + ; CHECK: %[[#EXTRACT8:]] = OpCompositeExtract %[[#int]] %[[#BITCAST2]] 3 |
| 51 | + ; CHECK: %[[#CONSTRUCT2:]] = OpCompositeConstruct %[[#v4i32]] %[[#EXTRACT5]] %[[#EXTRACT6]] %[[#EXTRACT7]] %[[#EXTRACT8]] |
| 52 | + ; CHECK: %[[#EXTRACT9:]] = OpCompositeExtract %[[#int]] %[[#CONSTRUCT1]] 0 |
| 53 | + ; CHECK: %[[#EXTRACT10:]] = OpCompositeExtract %[[#int]] %[[#CONSTRUCT2]] 0 |
| 54 | + ; CHECK: %[[#EXTRACT11:]] = OpCompositeExtract %[[#int]] %[[#CONSTRUCT1]] 1 |
| 55 | + ; CHECK: %[[#EXTRACT12:]] = OpCompositeExtract %[[#int]] %[[#CONSTRUCT2]] 1 |
| 56 | + ; CHECK: %[[#EXTRACT13:]] = OpCompositeExtract %[[#int]] %[[#CONSTRUCT1]] 2 |
| 57 | + ; CHECK: %[[#EXTRACT14:]] = OpCompositeExtract %[[#int]] %[[#CONSTRUCT2]] 2 |
| 58 | + ; CHECK: %[[#EXTRACT15:]] = OpCompositeExtract %[[#int]] %[[#CONSTRUCT1]] 3 |
| 59 | + ; CHECK: %[[#EXTRACT16:]] = OpCompositeExtract %[[#int]] %[[#CONSTRUCT2]] 3 |
| 60 | + ; CHECK: %[[#CONSTRUCT3:]] = OpCompositeConstruct %[[#v2i32]] %[[#EXTRACT9]] %[[#EXTRACT10]] |
| 61 | + ; CHECK: %[[#CONSTRUCT4:]] = OpCompositeConstruct %[[#v2i32]] %[[#EXTRACT11]] %[[#EXTRACT12]] |
| 62 | + ; CHECK: %[[#CONSTRUCT5:]] = OpCompositeConstruct %[[#v2i32]] %[[#EXTRACT13]] %[[#EXTRACT14]] |
| 63 | + ; CHECK: %[[#CONSTRUCT6:]] = OpCompositeConstruct %[[#v2i32]] %[[#EXTRACT15]] %[[#EXTRACT16]] |
| 64 | + ; CHECK: %[[#BITCAST3:]] = OpBitcast %[[#double]] %[[#CONSTRUCT3]] |
| 65 | + ; CHECK: %[[#BITCAST4:]] = OpBitcast %[[#double]] %[[#CONSTRUCT4]] |
| 66 | + ; CHECK: %[[#BITCAST5:]] = OpBitcast %[[#double]] %[[#CONSTRUCT5]] |
| 67 | + ; CHECK: %[[#BITCAST6:]] = OpBitcast %[[#double]] %[[#CONSTRUCT6]] |
| 68 | + ; CHECK: %[[#CONSTRUCT7:]] = OpCompositeConstruct %[[#v4f64]] %[[#BITCAST3]] %[[#BITCAST4]] %[[#BITCAST5]] %[[#BITCAST6]] |
| 69 | + ; CHECK: OpStore %[[#global_double]] %[[#CONSTRUCT7]] Aligned 32 |
| 70 | + |
| 71 | + %0 = load <8 x i32>, ptr addrspace(10) @G_4_double |
| 72 | + %1 = shufflevector <8 x i32> %0, <8 x i32> poison, <4 x i32> <i32 0, i32 2, i32 4, i32 6> |
| 73 | + %2 = shufflevector <8 x i32> %0, <8 x i32> poison, <4 x i32> <i32 1, i32 3, i32 5, i32 7> |
| 74 | + %3 = shufflevector <4 x i32> %1, <4 x i32> %2, <8 x i32> <i32 0, i32 4, i32 1, i32 5, i32 2, i32 6, i32 3, i32 7> |
| 75 | + store <8 x i32> %3, ptr addrspace(10) @G_4_double |
| 76 | + ret void |
| 77 | +} |
| 78 | + |
| 79 | +; Add a main function to make it a valid module for spirv-val |
| 80 | +define void @main() #1 { |
| 81 | + ret void |
| 82 | +} |
| 83 | + |
| 84 | +attributes #1 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" } |
0 commit comments