binary-op.arith-assign.vector.hlsl 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. // Run: %dxc -T vs_6_0 -E main
  2. // CHECK: [[v3i4:%\d+]] = OpConstantComposite %v3int %int_4 %int_4 %int_4
  3. void main() {
  4. // CHECK-LABEL: %bb_entry = OpLabel
  5. int1 a, b, c, d;
  6. int2 i, j;
  7. uint3 o, p;
  8. float4 x, y;
  9. // CHECK: [[a0:%\d+]] = OpLoad %int %a
  10. // CHECK-NEXT: [[b0:%\d+]] = OpLoad %int %b
  11. // CHECK-NEXT: [[add0:%\d+]] = OpIAdd %int [[b0]] [[a0]]
  12. // CHECK-NEXT: OpStore %b [[add0]]
  13. b += a;
  14. // CHECK-NEXT: [[i0:%\d+]] = OpLoad %v2int %i
  15. // CHECK-NEXT: [[j0:%\d+]] = OpLoad %v2int %j
  16. // CHECK-NEXT: [[add1:%\d+]] = OpIAdd %v2int [[j0]] [[i0]]
  17. // CHECK-NEXT: OpStore %j [[add1]]
  18. j += i;
  19. // CHECK-NEXT: [[o0:%\d+]] = OpLoad %v3uint %o
  20. // CHECK-NEXT: [[p0:%\d+]] = OpLoad %v3uint %p
  21. // CHECK-NEXT: [[add2:%\d+]] = OpIAdd %v3uint [[p0]] [[o0]]
  22. // CHECK-NEXT: OpStore %p [[add2]]
  23. p += o;
  24. // CHECK-NEXT: [[x0:%\d+]] = OpLoad %v4float %x
  25. // CHECK-NEXT: [[y0:%\d+]] = OpLoad %v4float %y
  26. // CHECK-NEXT: [[add3:%\d+]] = OpFAdd %v4float [[y0]] [[x0]]
  27. // CHECK-NEXT: OpStore %y [[add3]]
  28. y += x;
  29. // CHECK-NEXT: [[a1:%\d+]] = OpLoad %int %a
  30. // CHECK-NEXT: [[b1:%\d+]] = OpLoad %int %b
  31. // CHECK-NEXT: [[sub0:%\d+]] = OpISub %int [[b1]] [[a1]]
  32. // CHECK-NEXT: OpStore %b [[sub0]]
  33. b -= a;
  34. // CHECK-NEXT: [[i1:%\d+]] = OpLoad %v2int %i
  35. // CHECK-NEXT: [[j1:%\d+]] = OpLoad %v2int %j
  36. // CHECK-NEXT: [[sub1:%\d+]] = OpISub %v2int [[j1]] [[i1]]
  37. // CHECK-NEXT: OpStore %j [[sub1]]
  38. j -= i;
  39. // CHECK-NEXT: [[o1:%\d+]] = OpLoad %v3uint %o
  40. // CHECK-NEXT: [[p1:%\d+]] = OpLoad %v3uint %p
  41. // CHECK-NEXT: [[sub2:%\d+]] = OpISub %v3uint [[p1]] [[o1]]
  42. // CHECK-NEXT: OpStore %p [[sub2]]
  43. p -= o;
  44. // CHECK-NEXT: [[x1:%\d+]] = OpLoad %v4float %x
  45. // CHECK-NEXT: [[y1:%\d+]] = OpLoad %v4float %y
  46. // CHECK-NEXT: [[sub3:%\d+]] = OpFSub %v4float [[y1]] [[x1]]
  47. // CHECK-NEXT: OpStore %y [[sub3]]
  48. y -= x;
  49. // CHECK-NEXT: [[a2:%\d+]] = OpLoad %int %a
  50. // CHECK-NEXT: [[b2:%\d+]] = OpLoad %int %b
  51. // CHECK-NEXT: [[mul0:%\d+]] = OpIMul %int [[b2]] [[a2]]
  52. // CHECK-NEXT: OpStore %b [[mul0]]
  53. b *= a;
  54. // CHECK-NEXT: [[i2:%\d+]] = OpLoad %v2int %i
  55. // CHECK-NEXT: [[j2:%\d+]] = OpLoad %v2int %j
  56. // CHECK-NEXT: [[mul1:%\d+]] = OpIMul %v2int [[j2]] [[i2]]
  57. // CHECK-NEXT: OpStore %j [[mul1]]
  58. j *= i;
  59. // CHECK-NEXT: [[o2:%\d+]] = OpLoad %v3uint %o
  60. // CHECK-NEXT: [[p2:%\d+]] = OpLoad %v3uint %p
  61. // CHECK-NEXT: [[mul2:%\d+]] = OpIMul %v3uint [[p2]] [[o2]]
  62. // CHECK-NEXT: OpStore %p [[mul2]]
  63. p *= o;
  64. // CHECK-NEXT: [[x2:%\d+]] = OpLoad %v4float %x
  65. // CHECK-NEXT: [[y2:%\d+]] = OpLoad %v4float %y
  66. // CHECK-NEXT: [[mul3:%\d+]] = OpFMul %v4float [[y2]] [[x2]]
  67. // CHECK-NEXT: OpStore %y [[mul3]]
  68. y *= x;
  69. // CHECK-NEXT: [[a4:%\d+]] = OpLoad %int %a
  70. // CHECK-NEXT: [[b4:%\d+]] = OpLoad %int %b
  71. // CHECK-NEXT: [[div0:%\d+]] = OpSDiv %int [[b4]] [[a4]]
  72. // CHECK-NEXT: OpStore %b [[div0]]
  73. b /= a;
  74. // CHECK-NEXT: [[i4:%\d+]] = OpLoad %v2int %i
  75. // CHECK-NEXT: [[j4:%\d+]] = OpLoad %v2int %j
  76. // CHECK-NEXT: [[div1:%\d+]] = OpSDiv %v2int [[j4]] [[i4]]
  77. // CHECK-NEXT: OpStore %j [[div1]]
  78. j /= i;
  79. // CHECK-NEXT: [[o4:%\d+]] = OpLoad %v3uint %o
  80. // CHECK-NEXT: [[p4:%\d+]] = OpLoad %v3uint %p
  81. // CHECK-NEXT: [[div2:%\d+]] = OpUDiv %v3uint [[p4]] [[o4]]
  82. // CHECK-NEXT: OpStore %p [[div2]]
  83. p /= o;
  84. // CHECK-NEXT: [[x4:%\d+]] = OpLoad %v4float %x
  85. // CHECK-NEXT: [[y4:%\d+]] = OpLoad %v4float %y
  86. // CHECK-NEXT: [[div3:%\d+]] = OpFDiv %v4float [[y4]] [[x4]]
  87. // CHECK-NEXT: OpStore %y [[div3]]
  88. y /= x;
  89. // CHECK-NEXT: [[a5:%\d+]] = OpLoad %int %a
  90. // CHECK-NEXT: [[b5:%\d+]] = OpLoad %int %b
  91. // CHECK-NEXT: [[mod0:%\d+]] = OpSRem %int [[b5]] [[a5]]
  92. // CHECK-NEXT: OpStore %b [[mod0]]
  93. b %= a;
  94. // CHECK-NEXT: [[i5:%\d+]] = OpLoad %v2int %i
  95. // CHECK-NEXT: [[j5:%\d+]] = OpLoad %v2int %j
  96. // CHECK-NEXT: [[mod1:%\d+]] = OpSRem %v2int [[j5]] [[i5]]
  97. // CHECK-NEXT: OpStore %j [[mod1]]
  98. j %= i;
  99. // CHECK-NEXT: [[o5:%\d+]] = OpLoad %v3uint %o
  100. // CHECK-NEXT: [[p5:%\d+]] = OpLoad %v3uint %p
  101. // CHECK-NEXT: [[mod2:%\d+]] = OpUMod %v3uint [[p5]] [[o5]]
  102. // CHECK-NEXT: OpStore %p [[mod2]]
  103. p %= o;
  104. // CHECK-NEXT: [[x5:%\d+]] = OpLoad %v4float %x
  105. // CHECK-NEXT: [[y5:%\d+]] = OpLoad %v4float %y
  106. // CHECK-NEXT: [[mod3:%\d+]] = OpFRem %v4float [[y5]] [[x5]]
  107. // CHECK-NEXT: OpStore %y [[mod3]]
  108. y %= x;
  109. float3 v3f;
  110. float4 v4f;
  111. // Vector swizzle
  112. // CHECK-NEXT: [[ac0:%\d+]] = OpAccessChain %_ptr_Function_float %v3f %int_2
  113. // CHECK-NEXT: [[e0:%\d+]] = OpLoad %float [[ac0]]
  114. // CHECK-NEXT: [[ac1:%\d+]] = OpAccessChain %_ptr_Function_float %v4f %int_0
  115. // CHECK-NEXT: [[e1:%\d+]] = OpLoad %float [[ac1]]
  116. // CHECK-NEXT: [[mul4:%\d+]] = OpFMul %float [[e1]] [[e0]]
  117. // CHECK-NEXT: OpStore [[ac1]] [[mul4]]
  118. v4f.x *= v3f.z; // one element
  119. // CHECK-NEXT: [[v3f0:%\d+]] = OpLoad %v3float %v3f
  120. // CHECK-NEXT: [[vs0:%\d+]] = OpVectorShuffle %v2float [[v3f0]] [[v3f0]] 0 1
  121. // CHECK-NEXT: [[v4f0:%\d+]] = OpLoad %v4float %v4f
  122. // CHECK-NEXT: [[vs1:%\d+]] = OpVectorShuffle %v2float [[v4f0]] [[v4f0]] 2 3
  123. // CHECK-NEXT: [[mul5:%\d+]] = OpFMul %v2float [[vs1]] [[vs0]]
  124. // CHECK-NEXT: [[v4f1:%\d+]] = OpLoad %v4float %v4f
  125. // CHECK-NEXT: [[vs2:%\d+]] = OpVectorShuffle %v4float [[v4f1]] [[mul5]] 0 1 4 5
  126. // CHECK-NEXT: OpStore %v4f [[vs2]]
  127. v4f.zw *= v3f.xy; // two elements
  128. // CHECK-NEXT: [[v4f2:%\d+]] = OpLoad %v4float %v4f
  129. // CHECK-NEXT: [[vs3:%\d+]] = OpVectorShuffle %v3float [[v4f2]] [[v4f2]] 0 1 2
  130. // CHECK-NEXT: [[mul6:%\d+]] = OpVectorTimesScalar %v3float [[vs3]] %float_4
  131. // CHECK-NEXT: [[v4f3:%\d+]] = OpLoad %v4float %v4f
  132. // CHECK-NEXT: [[vs4:%\d+]] = OpVectorShuffle %v4float [[v4f3]] [[mul6]] 4 5 6 3
  133. // CHECK-NEXT: OpStore %v4f [[vs4]]
  134. v4f.xyz *= 4.0; // three elements (with scalar, should generate OpVectorTimesScalar)
  135. int4 v4i;
  136. // CHECK-NEXT: [[v4i0:%\d+]] = OpLoad %v4int %v4i
  137. // CHECK-NEXT: [[vs5:%\d+]] = OpVectorShuffle %v3int [[v4i0]] [[v4i0]] 0 1 2
  138. // CHECK-NEXT: [[mul7:%\d+]] = OpIMul %v3int [[vs5]] [[v3i4]]
  139. // CHECK-NEXT: [[v4i1:%\d+]] = OpLoad %v4int %v4i
  140. // CHECK-NEXT: [[vs6:%\d+]] = OpVectorShuffle %v4int [[v4i1]] [[mul7]] 4 5 6 3
  141. // CHECK-NEXT: OpStore %v4i [[vs6]]
  142. v4i.xyz *= 4; // three elements (with scalar, but should not generate OpVectorTimesScalar)
  143. }