cast.2uint.explicit.hlsl 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. // Run: %dxc -T ps_6_0 -E main
  2. // CHECK: [[v2uint_1_1:%\d+]] = OpConstantComposite %v2uint %uint_1 %uint_1
  3. // CHECK: [[v2uint_0_0:%\d+]] = OpConstantComposite %v2uint %uint_0 %uint_0
  4. // CHECK: [[v2uint_2_3:%\d+]] = OpConstantComposite %v2uint %uint_2 %uint_3
  5. void main() {
  6. // CHECK-LABEL: %bb_entry = OpLabel
  7. uint i;
  8. int from1;
  9. bool from2;
  10. float from3;
  11. uint1 vi1;
  12. uint2 vi2;
  13. uint3 vi3;
  14. int1 vfrom1;
  15. bool2 vfrom2;
  16. float3 vfrom3;
  17. // C style cast
  18. // From constant (explicit)
  19. // CHECK: OpStore %i %uint_1
  20. i = (uint)true;
  21. // CHECK-NEXT: OpStore %i %uint_3
  22. i = (uint)3.0;
  23. // From constant expr
  24. // CHECK-NEXT: OpStore %i %uint_2
  25. i = (uint)(5.5 - 3.4);
  26. // From variable (explicit)
  27. // CHECK-NEXT: [[from1:%\d+]] = OpLoad %int %from1
  28. // CHECK-NEXT: [[c1:%\d+]] = OpBitcast %uint [[from1]]
  29. // CHECK-NEXT: OpStore %i [[c1]]
  30. i = (uint)from1;
  31. // CHECK-NEXT: [[from2:%\d+]] = OpLoad %bool %from2
  32. // CHECK-NEXT: [[c2:%\d+]] = OpSelect %uint [[from2]] %uint_1 %uint_0
  33. // CHECK-NEXT: OpStore %i [[c2]]
  34. i = (uint)from2;
  35. // CHECK-NEXT: [[from3:%\d+]] = OpLoad %float %from3
  36. // CHECK-NEXT: [[c3:%\d+]] = OpConvertFToU %uint [[from3]]
  37. // CHECK-NEXT: OpStore %i [[c3]]
  38. i = (uint)from3;
  39. // C++ function style cast
  40. // CHECK-NEXT: OpStore %i %uint_0
  41. i = uint(false);
  42. // CHECK-NEXT: OpStore %i %uint_3
  43. i = uint(3.5);
  44. // CHECK-NEXT: OpStore %i %uint_5
  45. i = uint(3.3 + 2.2);
  46. // CHECK-NEXT: [[from4:%\d+]] = OpLoad %int %from1
  47. // CHECK-NEXT: [[c4:%\d+]] = OpBitcast %uint [[from4]]
  48. // CHECK-NEXT: OpStore %i [[c4]]
  49. i = uint(from1);
  50. // CHECK-NEXT: [[from5:%\d+]] = OpLoad %bool %from2
  51. // CHECK-NEXT: [[c5:%\d+]] = OpSelect %uint [[from5]] %uint_1 %uint_0
  52. // CHECK-NEXT: OpStore %i [[c5]]
  53. i = uint(from2);
  54. // CHECK-NEXT: [[from6:%\d+]] = OpLoad %float %from3
  55. // CHECK-NEXT: [[c6:%\d+]] = OpConvertFToU %uint [[from6]]
  56. // CHECK-NEXT: OpStore %i [[c6]]
  57. i = uint(from3);
  58. // Vector cases
  59. // CHECK-NEXT: OpStore %vi1 %uint_3
  60. vi1 = (uint1)3.6;
  61. // CHECK-NEXT: [[vfrom1:%\d+]] = OpLoad %int %vfrom1
  62. // CHECK-NEXT: [[vc1:%\d+]] = OpBitcast %uint [[vfrom1]]
  63. // CHECK-NEXT: OpStore %vi1 [[vc1]]
  64. vi1 = (uint1)vfrom1;
  65. // CHECK-NEXT: [[vfrom2:%\d+]] = OpLoad %v2bool %vfrom2
  66. // CHECK-NEXT: [[vc2:%\d+]] = OpSelect %v2uint [[vfrom2]] [[v2uint_1_1]] [[v2uint_0_0]]
  67. // CHECK-NEXT: OpStore %vi2 [[vc2]]
  68. vi2 = (uint2)vfrom2;
  69. // CHECK-NEXT: [[vfrom3:%\d+]] = OpLoad %v3float %vfrom3
  70. // CHECK-NEXT: [[vc3:%\d+]] = OpConvertFToU %v3uint [[vfrom3]]
  71. // CHECK-NEXT: OpStore %vi3 [[vc3]]
  72. vi3 = (uint3)vfrom3;
  73. // CHECK-NEXT: OpStore %vi1 %uint_3
  74. vi1 = uint1(3.5);
  75. // CHECK-NEXT: OpStore %vi2 [[v2uint_2_3]]
  76. vi2 = uint2(1.1 + 1.2, 3);
  77. // CHECK-NEXT: [[vfrom4:%\d+]] = OpLoad %int %vfrom1
  78. // CHECK-NEXT: [[vc4:%\d+]] = OpBitcast %uint [[vfrom4]]
  79. // CHECK-NEXT: OpStore %vi1 [[vc4]]
  80. vi1 = uint1(vfrom1);
  81. // CHECK-NEXT: [[vfrom5:%\d+]] = OpLoad %v2bool %vfrom2
  82. // CHECK-NEXT: [[vc5:%\d+]] = OpSelect %v2uint [[vfrom5]] [[v2uint_1_1]] [[v2uint_0_0]]
  83. // CHECK-NEXT: OpStore %vi2 [[vc5]]
  84. vi2 = uint2(vfrom2);
  85. // CHECK-NEXT: [[vfrom6:%\d+]] = OpLoad %v3float %vfrom3
  86. // CHECK-NEXT: [[vc6:%\d+]] = OpConvertFToU %v3uint [[vfrom6]]
  87. // CHECK-NEXT: OpStore %vi3 [[vc6]]
  88. vi3 = uint3(vfrom3);
  89. }