cast.bitwidth.hlsl 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. // Run: %dxc -T ps_6_2 -E main -enable-16bit-types
  2. void main() {
  3. // 32-bit uint to various 64-bit types.
  4. uint a;
  5. // CHECK: [[a:%\d+]] = OpLoad %uint %a
  6. // CHECK-NEXT: [[a_ulong:%\d+]] = OpUConvert %ulong [[a]]
  7. // CHECK-NEXT: OpStore %b [[a_ulong]]
  8. uint64_t b = a;
  9. // CHECK: [[a:%\d+]] = OpLoad %uint %a
  10. // CHECK-NEXT: [[a_ulong:%\d+]] = OpUConvert %ulong [[a]]
  11. // CHECK-NEXT:[[a_double:%\d+]] = OpConvertUToF %double [[a_ulong]]
  12. // CHECK-NEXT: OpStore %c [[a_double]]
  13. double c = a;
  14. // CHECK: [[a:%\d+]] = OpLoad %uint %a
  15. // CHECK-NEXT: [[a_ulong:%\d+]] = OpUConvert %ulong [[a]]
  16. // CHECK-NEXT: [[a_long:%\d+]] = OpBitcast %long [[a_ulong]]
  17. // CHECK-NEXT: OpStore %d [[a_long]]
  18. int64_t d = a;
  19. // 32-bit int to various 64-bit types.
  20. int aa;
  21. // CHECK: [[aa:%\d+]] = OpLoad %int %aa
  22. // CHECK-NEXT: [[aa_long:%\d+]] = OpSConvert %long [[aa]]
  23. // CHECK-NEXT: [[aa_ulong:%\d+]] = OpBitcast %ulong [[aa_long]]
  24. // CHECK-NEXT: OpStore %bb [[aa_ulong]]
  25. uint64_t bb = aa;
  26. // CHECK: [[aa:%\d+]] = OpLoad %int %aa
  27. // CHECK-NEXT: [[aa_long:%\d+]] = OpSConvert %long [[aa]]
  28. // CHECK-NEXT: [[aa_double:%\d+]] = OpConvertSToF %double [[aa_long]]
  29. // CHECK-NEXT: OpStore %cc [[aa_double]]
  30. double cc = aa;
  31. // CHECK: [[aa:%\d+]] = OpLoad %int %aa
  32. // CHECK-NEXT: [[aa_long:%\d+]] = OpSConvert %long [[aa]]
  33. // CHECK-NEXT: OpStore %dd [[aa_long]]
  34. int64_t dd = aa;
  35. // 32-bit float to various 64-bit types.
  36. float aaa;
  37. // CHECK: [[aaa:%\d+]] = OpLoad %float %aaa
  38. // CHECK-NEXT: [[aaa_double:%\d+]] = OpFConvert %double [[aaa]]
  39. // CHECK-NEXT: [[aaa_ulong:%\d+]] = OpConvertFToU %ulong [[aaa_double]]
  40. // CHECK-NEXT: OpStore %bbb [[aaa_ulong]]
  41. uint64_t bbb = aaa;
  42. // CHECK: [[aaa:%\d+]] = OpLoad %float %aaa
  43. // CHECK-NEXT: [[aaa_double:%\d+]] = OpFConvert %double [[aaa]]
  44. // CHECK-NEXT: OpStore %ccc [[aaa_double]]
  45. double ccc = aaa;
  46. // CHECK: [[aaa:%\d+]] = OpLoad %float %aaa
  47. // CHECK-NEXT: [[aaa_double:%\d+]] = OpFConvert %double [[aaa]]
  48. // CHECK-NEXT: [[aaa_long:%\d+]] = OpConvertFToS %long [[aaa_double]]
  49. // CHECK-NEXT: OpStore %ddd [[aaa_long]]
  50. int64_t ddd = aaa;
  51. // 64-bit uint to various 32-bit types.
  52. uint64_t e;
  53. // CHECK: [[e64:%\d+]] = OpLoad %ulong %e
  54. // CHECK-NEXT: [[e32:%\d+]] = OpUConvert %uint [[e64]]
  55. // CHECK-NEXT: OpStore %f [[e32]]
  56. uint f = e;
  57. // CHECK: [[e64:%\d+]] = OpLoad %ulong %e
  58. // CHECK-NEXT: [[e32:%\d+]] = OpUConvert %uint [[e64]]
  59. // CHECK-NEXT: [[e_float:%\d+]] = OpConvertUToF %float [[e32]]
  60. // CHECK-NEXT: OpStore %g [[e_float]]
  61. float g = e;
  62. // CHECK: [[e64:%\d+]] = OpLoad %ulong %e
  63. // CHECK-NEXT: [[e32:%\d+]] = OpUConvert %uint [[e64]]
  64. // CHECK-NEXT: [[e_int:%\d+]] = OpBitcast %int [[e32]]
  65. // CHECK-NEXT: OpStore %h [[e_int]]
  66. int h = e;
  67. // 64-bit int to various 32-bit types.
  68. int64_t ee;
  69. // CHECK: [[e:%\d+]] = OpLoad %long %ee
  70. // CHECK-NEXT: [[e_int:%\d+]] = OpSConvert %int [[e]]
  71. // CHECK-NEXT: [[e_uint:%\d+]] = OpBitcast %uint [[e_int]]
  72. // CHECK-NEXT: OpStore %ff [[e_uint]]
  73. uint ff = ee;
  74. // CHECK: [[e:%\d+]] = OpLoad %long %ee
  75. // CHECK-NEXT: [[e_int:%\d+]] = OpSConvert %int [[e]]
  76. // CHECK-NEXT: [[e_float:%\d+]] = OpConvertSToF %float [[e_int]]
  77. // CHECK-NEXT: OpStore %gg [[e_float]]
  78. float gg = ee;
  79. // CHECK: [[e:%\d+]] = OpLoad %long %ee
  80. // CHECK-NEXT: [[e_int:%\d+]] = OpSConvert %int [[e]]
  81. // CHECK-NEXT: OpStore %hh [[e_int]]
  82. int hh = ee;
  83. // 64-bit float to various 32-bit types.
  84. double eee;
  85. // CHECK: [[e64:%\d+]] = OpLoad %double %eee
  86. // CHECK-NEXT: [[e32:%\d+]] = OpFConvert %float [[e64]]
  87. // CHECK-NEXT: [[e_uint:%\d+]] = OpConvertFToU %uint [[e32]]
  88. // CHECK-NEXT: OpStore %fff [[e_uint]]
  89. uint fff = eee;
  90. // CHECK: [[e:%\d+]] = OpLoad %double %eee
  91. // CHECK-NEXT: [[e_float:%\d+]] = OpFConvert %float [[e]]
  92. // CHECK-NEXT: OpStore %ggg [[e_float]]
  93. float ggg = eee;
  94. // CHECK: [[e:%\d+]] = OpLoad %double %eee
  95. // CHECK-NEXT: [[e_float:%\d+]] = OpFConvert %float [[e]]
  96. // CHECK-NEXT: [[e_int:%\d+]] = OpConvertFToS %int [[e_float]]
  97. // CHECK-NEXT: OpStore %hhh [[e_int]]
  98. int hhh = eee;
  99. // Vector case: 64-bit float to various 32-bit types.
  100. double2 i;
  101. // CHECK: [[i_double:%\d+]] = OpLoad %v2double %i
  102. // CHECK-NEXT: [[i_float:%\d+]] = OpFConvert %v2float [[i_double]]
  103. // CHECK-NEXT: [[i_uint:%\d+]] = OpConvertFToU %v2uint [[i_float]]
  104. // CHECK-NEXT: OpStore %j [[i_uint]]
  105. uint2 j = i;
  106. // CHECK: [[i_double:%\d+]] = OpLoad %v2double %i
  107. // CHECK-NEXT: [[i_float:%\d+]] = OpFConvert %v2float [[i_double]]
  108. // CHECK-NEXT: [[i_int:%\d+]] = OpConvertFToS %v2int [[i_float]]
  109. // CHECK-NEXT: OpStore %k [[i_int]]
  110. int2 k = i;
  111. // CHECK: [[i_double:%\d+]] = OpLoad %v2double %i
  112. // CHECK-NEXT: [[i_float:%\d+]] = OpFConvert %v2float [[i_double]]
  113. // CHECK-NEXT: OpStore %l [[i_float]]
  114. float2 l = i;
  115. // 16-bit uint to various 32-bit types.
  116. uint16_t m;
  117. // CHECK: [[m_ushort:%\d+]] = OpLoad %ushort %m
  118. // CHECK-NEXT: [[m_uint:%\d+]] = OpUConvert %uint [[m_ushort]]
  119. // CHECK-NEXT: OpStore %n [[m_uint]]
  120. uint n = m;
  121. // CHECK: [[m_ushort:%\d+]] = OpLoad %ushort %m
  122. // CHECK-NEXT: [[m_uint:%\d+]] = OpUConvert %uint [[m_ushort]]
  123. // CHECK-NEXT: [[m_float:%\d+]] = OpConvertUToF %float [[m_uint]]
  124. // CHECK-NEXT: OpStore %o [[m_float]]
  125. float o = m;
  126. // CHECK: [[m_ushort:%\d+]] = OpLoad %ushort %m
  127. // CHECK-NEXT: [[m_uint:%\d+]] = OpUConvert %uint [[m_ushort]]
  128. // CHECK-NEXT: [[m_int:%\d+]] = OpBitcast %int [[m_uint]]
  129. // CHECK-NEXT: OpStore %p [[m_int]]
  130. int p = m;
  131. // 16-bit int to various 32-bit types.
  132. int16_t mm;
  133. // CHECK: [[mm_short:%\d+]] = OpLoad %short %mm
  134. // CHECK-NEXT: [[mm_int:%\d+]] = OpSConvert %int [[mm_short]]
  135. // CHECK-NEXT: [[mm_uint:%\d+]] = OpBitcast %uint [[mm_int]]
  136. // CHECK-NEXT: OpStore %nn [[mm_uint]]
  137. uint nn = mm;
  138. // CHECK: [[mm_short:%\d+]] = OpLoad %short %mm
  139. // CHECK-NEXT: [[mm_int:%\d+]] = OpSConvert %int [[mm_short]]
  140. // CHECK-NEXT: [[mm_float:%\d+]] = OpConvertSToF %float [[mm_int]]
  141. // CHECK-NEXT: OpStore %oo [[mm_float]]
  142. float oo = mm;
  143. // CHECK: [[mm_short:%\d+]] = OpLoad %short %mm
  144. // CHECK-NEXT: [[mm_int:%\d+]] = OpSConvert %int [[mm_short]]
  145. // CHECK-NEXT: OpStore %pp [[mm_int]]
  146. int pp = mm;
  147. }