cast.2fp.implicit.hlsl 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. // Run: %dxc -T ps_6_0 -E main
  2. // CHECK: [[v2float_1_0:%\d+]] = OpConstantComposite %v2float %float_1 %float_0
  3. // CHECK: [[v3float_0_4_n3:%\d+]] = OpConstantComposite %v3float %float_0 %float_4 %float_n3
  4. // CHECK: [[v3f1:%\d+]] = OpConstantComposite %v3float %float_1 %float_1 %float_1
  5. // CHECK: [[v3f0:%\d+]] = OpConstantComposite %v3float %float_0 %float_0 %float_0
  6. void main() {
  7. // CHECK-LABEL: %bb_entry = OpLabel
  8. float f;
  9. bool from1;
  10. uint from2;
  11. int from3;
  12. float1 vf1;
  13. float2 vf2;
  14. float3 vf3;
  15. bool1 vfrom1;
  16. uint2 vfrom2;
  17. int3 vfrom3;
  18. // From constant (implicit)
  19. // CHECK: OpStore %f %float_1
  20. f = true;
  21. // CHECK-NEXT: OpStore %f %float_3
  22. f = 3u;
  23. // From constant expr
  24. // CHECK-NEXT: OpStore %f %float_n1
  25. f = 5 - 6;
  26. // From variable (implicit)
  27. // CHECK-NEXT: [[from1:%\d+]] = OpLoad %bool %from1
  28. // CHECK-NEXT: [[c1:%\d+]] = OpSelect %float [[from1]] %float_1 %float_0
  29. // CHECK-NEXT: OpStore %f [[c1]]
  30. f = from1;
  31. // CHECK-NEXT: [[from2:%\d+]] = OpLoad %uint %from2
  32. // CHECK-NEXT: [[c2:%\d+]] = OpConvertUToF %float [[from2]]
  33. // CHECK-NEXT: OpStore %f [[c2]]
  34. f = from2;
  35. // CHECK-NEXT: [[from3:%\d+]] = OpLoad %int %from3
  36. // CHECK-NEXT: [[c3:%\d+]] = OpConvertSToF %float [[from3]]
  37. // CHECK-NEXT: OpStore %f [[c3]]
  38. f = from3;
  39. // Vector cases
  40. // CHECK: OpStore %vfc2 [[v2float_1_0]]
  41. // CHECK: OpStore %vfc3 [[v3float_0_4_n3]]
  42. float2 vfc2 = {true, false};
  43. float3 vfc3 = {false, 4u, -3}; // Mixed
  44. // CHECK-NEXT: [[vfrom1:%\d+]] = OpLoad %bool %vfrom1
  45. // CHECK-NEXT: [[vc1:%\d+]] = OpSelect %float [[vfrom1]] %float_1 %float_0
  46. // CHECK-NEXT: OpStore %vf1 [[vc1]]
  47. vf1 = vfrom1;
  48. // CHECK-NEXT: [[vfrom2:%\d+]] = OpLoad %v2uint %vfrom2
  49. // CHECK-NEXT: [[vc2:%\d+]] = OpConvertUToF %v2float [[vfrom2]]
  50. // CHECK-NEXT: OpStore %vf2 [[vc2]]
  51. vf2 = vfrom2;
  52. // CHECK-NEXT: [[vfrom3:%\d+]] = OpLoad %v3int %vfrom3
  53. // CHECK-NEXT: [[vc3:%\d+]] = OpConvertSToF %v3float [[vfrom3]]
  54. // CHECK-NEXT: OpStore %vf3 [[vc3]]
  55. vf3 = vfrom3;
  56. // CHECK: [[a:%\d+]] = OpLoad %bool %a
  57. // CHECK-NEXT: [[int_a:%\d+]] = OpSelect %int [[a]] %int_1 %int_0
  58. // CHECK-NEXT: [[zero_minus_a:%\d+]] = OpISub %int %int_0 [[int_a]]
  59. // CHECK-NEXT: {{%\d+}} = OpConvertSToF %float [[zero_minus_a]]
  60. bool a = false;
  61. float c = 0-a;
  62. int2x3 intMat;
  63. float2x3 floatMat;
  64. uint2x3 uintMat;
  65. bool2x3 boolMat;
  66. // CHECK: [[boolMat:%\d+]] = OpLoad %_arr_v3bool_uint_2 %boolMat
  67. // CHECK-NEXT: [[boolMat0:%\d+]] = OpCompositeExtract %v3bool [[boolMat]] 0
  68. // CHECK-NEXT: [[floatMat0:%\d+]] = OpSelect %v3float [[boolMat0]] [[v3f1]] [[v3f0]]
  69. // CHECK-NEXT: [[boolMat1:%\d+]] = OpCompositeExtract %v3bool [[boolMat]] 1
  70. // CHECK-NEXT: [[floatMat1:%\d+]] = OpSelect %v3float [[boolMat1]] [[v3f1]] [[v3f0]]
  71. // CHECK-NEXT: {{%\d+}} = OpCompositeConstruct %mat2v3float [[floatMat0]] [[floatMat1]]
  72. floatMat = boolMat;
  73. // CHECK: [[uintMat:%\d+]] = OpLoad %_arr_v3uint_uint_2 %uintMat
  74. // CHECK-NEXT: [[uintMat0:%\d+]] = OpCompositeExtract %v3uint [[uintMat]] 0
  75. // CHECK-NEXT: [[floatMat0:%\d+]] = OpConvertUToF %v3float [[uintMat0]]
  76. // CHECK-NEXT: [[uintMat1:%\d+]] = OpCompositeExtract %v3uint [[uintMat]] 1
  77. // CHECK-NEXT: [[floatMat1:%\d+]] = OpConvertUToF %v3float [[uintMat1]]
  78. // CHECK-NEXT: {{%\d+}} = OpCompositeConstruct %mat2v3float [[floatMat0]] [[floatMat1]]
  79. floatMat = uintMat;
  80. // CHECK: [[intMat:%\d+]] = OpLoad %_arr_v3int_uint_2 %intMat
  81. // CHECK-NEXT: [[intMat0:%\d+]] = OpCompositeExtract %v3int [[intMat]] 0
  82. // CHECK-NEXT: [[floatMat0:%\d+]] = OpConvertSToF %v3float [[intMat0]]
  83. // CHECK-NEXT: [[intMat1:%\d+]] = OpCompositeExtract %v3int [[intMat]] 1
  84. // CHECK-NEXT: [[floatMat1:%\d+]] = OpConvertSToF %v3float [[intMat1]]
  85. // CHECK-NEXT: {{%\d+}} = OpCompositeConstruct %mat2v3float [[floatMat0]] [[floatMat1]]
  86. floatMat = intMat;
  87. }