arithmetic.hlsl 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. // RUN: %dxc -E main -T vs_6_0 %s | FileCheck %s
  2. // Tests the implementation of unary and binary matrix operators
  3. // Workaround for AppendStructuredBuffer<matrix>.Append bug
  4. #define Append(buf, val) buf[buf.IncrementCounter()] = (val)
  5. RWStructuredBuffer<int1x1> output_i;
  6. RWStructuredBuffer<uint1x1> output_u;
  7. RWStructuredBuffer<float1x1> output_f;
  8. RWStructuredBuffer<bool1x1> output_b;
  9. void main()
  10. {
  11. int1x1 i1 = int1x1(1);
  12. int1x1 i2 = int1x1(2);
  13. int1x1 i3 = int1x1(3);
  14. int1x1 im1 = int1x1(-1);
  15. int1x1 im3 = int1x1(-3);
  16. uint1x1 u1 = uint1x1(1);
  17. uint1x1 u2 = uint1x1(2);
  18. uint1x1 u3 = uint1x1(3);
  19. uint1x1 um1 = uint1x1((uint)(-1));
  20. float1x1 fm0_5 = float1x1(-0.5);
  21. float1x1 f0_5 = float1x1(0.5);
  22. float1x1 f1 = float1x1(1);
  23. float1x1 f1_5 = float1x1(1.5);
  24. float1x1 f2 = float1x1(2);
  25. // Unary operators, except pre/post inc/dec
  26. // CHECK: i32 3, i32 undef
  27. Append(output_i, +i3); // Plus
  28. // CHECK: i32 -3, i32 undef
  29. Append(output_i, -i3); // Minus
  30. // CHECK: i32 -4, i32 undef
  31. Append(output_i, ~i3); // Not
  32. // CHECK: i32 0, i32 undef
  33. Append(output_b, !i3); // LNot
  34. // CHECK: float 5.000000e-01, float undef
  35. Append(output_f, +f0_5); // Plus
  36. // CHECK: float -5.000000e-01, float undef
  37. Append(output_f, -f0_5); // Minus
  38. // CHECK: i32 0, i32 undef
  39. Append(output_b, !f0_5); // LNot
  40. // Binary operators
  41. // CHECK: i32 6, i32 undef
  42. Append(output_i, i3 * i2); // Mul
  43. // CHECK: i32 -1, i32 undef
  44. Append(output_i, im3 / i2); // Div
  45. // CHECK: i32 -1, i32 undef
  46. Append(output_i, im3 % i2); // Rem
  47. // CHECK: i32 3, i32 undef
  48. Append(output_i, i1 + i2); // Add
  49. // CHECK: i32 2, i32 undef
  50. Append(output_i, i3 - i1); // Sub
  51. // CHECK: float 1.000000e+00, float undef
  52. Append(output_f, f0_5 * f2); // Mul
  53. // CHECK: float 2.000000e+00, float undef
  54. Append(output_f, f1 / f0_5); // Div
  55. // CHECK: float 5.000000e-01, float undef
  56. Append(output_f, f2 % f1_5); // Rem
  57. // CHECK: float 2.000000e+00, float undef
  58. Append(output_f, f0_5 + f1_5); // Add
  59. // CHECK: float -1.000000e+00, float undef
  60. Append(output_f, f0_5 - f1_5); // Sub
  61. // CHECK: i32 6, i32 undef
  62. Append(output_i, i3 << i1); // Shl
  63. // CHECK: i32 -1, i32 undef
  64. Append(output_i, im1 >> i1); // Shr
  65. // CHECK: i32 2, i32 undef
  66. Append(output_i, i3 & i2); // And
  67. // CHECK: i32 2, i32 undef
  68. Append(output_i, i3 ^ i1); // Xor
  69. // CHECK: i32 3, i32 undef
  70. Append(output_i, i2 | i1); // Or
  71. // CHECK: i32 1, i32 undef
  72. Append(output_b, i3 && i2); // LAnd
  73. // CHECK: i32 1, i32 undef
  74. Append(output_b, i3 || i2); // LOr
  75. // CHECK: i32 1, i32 undef
  76. Append(output_b, f0_5 && f1_5); // LAnd
  77. // CHECK: i32 1, i32 undef
  78. Append(output_b, f0_5 || f1_5); // LOr
  79. // CHECK: i32 2147483647, i32 undef
  80. Append(output_u, um1 / u2); // UDiv
  81. // CHECK: i32 1, i32 undef
  82. Append(output_u, u3 % u2); // URem
  83. // CHECK: i32 2147483647, i32 undef
  84. Append(output_u, um1 >> u1); // UShr
  85. // CHECK: i32 1, i32 undef
  86. Append(output_b, im1 < i1); // LT
  87. // CHECK: i32 0, i32 undef
  88. Append(output_b, im1 > i1); // GT
  89. // CHECK: i32 1, i32 undef
  90. Append(output_b, im1 <= i1); // LE
  91. // CHECK: i32 0, i32 undef
  92. Append(output_b, im1 >= i1); // GE
  93. // CHECK: i32 0, i32 undef
  94. Append(output_b, im1 == i1); // EQ
  95. // CHECK: i32 1, i32 undef
  96. Append(output_b, im1 != i1); // NE
  97. // CHECK: i32 0, i32 undef
  98. Append(output_b, um1 < u1); // ULT
  99. // CHECK: i32 1, i32 undef
  100. Append(output_b, um1 > u1); // UGT
  101. // CHECK: i32 0, i32 undef
  102. Append(output_b, um1 <= u1); // ULE
  103. // CHECK: i32 1, i32 undef
  104. Append(output_b, um1 >= u1); // UGE
  105. // CHECK: i32 1, i32 undef
  106. Append(output_b, fm0_5 < f1_5); // LT
  107. // CHECK: i32 0, i32 undef
  108. Append(output_b, fm0_5 > f1_5); // GT
  109. // CHECK: i32 1, i32 undef
  110. Append(output_b, fm0_5 <= f1_5); // LE
  111. // CHECK: i32 0, i32 undef
  112. Append(output_b, fm0_5 >= f1_5); // GE
  113. // CHECK: i32 0, i32 undef
  114. Append(output_b, fm0_5 == f1_5); // EQ
  115. // CHECK: i32 1, i32 undef
  116. Append(output_b, fm0_5 != f1_5); // NE
  117. }