| 1 | |
| 2 | |
| 3 | |
| 4 | #pragma once |
| 5 | |
| 6 | #include "common.h" |
| 7 | |
| 8 | #if GLM_ARCH & GLM_ARCH_SSE2_BIT |
| 9 | |
| 10 | GLM_FUNC_DECL glm_vec4 glm_vec4_dot(glm_vec4 v1, glm_vec4 v2); |
| 11 | GLM_FUNC_DECL glm_vec4 glm_vec1_dot(glm_vec4 v1, glm_vec4 v2); |
| 12 | |
| 13 | GLM_FUNC_QUALIFIER glm_vec4 glm_vec4_length(glm_vec4 x) |
| 14 | { |
| 15 | glm_vec4 const dot0 = glm_vec4_dot(x, x); |
| 16 | glm_vec4 const sqt0 = _mm_sqrt_ps(dot0); |
| 17 | return sqt0; |
| 18 | } |
| 19 | |
| 20 | GLM_FUNC_QUALIFIER glm_vec4 glm_vec4_distance(glm_vec4 p0, glm_vec4 p1) |
| 21 | { |
| 22 | glm_vec4 const sub0 = _mm_sub_ps(p0, p1); |
| 23 | glm_vec4 const len0 = glm_vec4_length(sub0); |
| 24 | return len0; |
| 25 | } |
| 26 | |
| 27 | GLM_FUNC_QUALIFIER glm_vec4 glm_vec4_dot(glm_vec4 v1, glm_vec4 v2) |
| 28 | { |
| 29 | # if GLM_ARCH & GLM_ARCH_SSE41_BIT |
| 30 | return _mm_dp_ps(v1, v2, 0xff); |
| 31 | # elif GLM_ARCH & GLM_ARCH_SSE3_BIT |
| 32 | glm_vec4 const mul0 = _mm_mul_ps(v1, v2); |
| 33 | glm_vec4 const hadd0 = _mm_hadd_ps(mul0, mul0); |
| 34 | glm_vec4 const hadd1 = _mm_hadd_ps(hadd0, hadd0); |
| 35 | return hadd1; |
| 36 | # else |
| 37 | glm_vec4 const mul0 = _mm_mul_ps(v1, v2); |
| 38 | glm_vec4 const swp0 = _mm_shuffle_ps(mul0, mul0, _MM_SHUFFLE(2, 3, 0, 1)); |
| 39 | glm_vec4 const add0 = _mm_add_ps(mul0, swp0); |
| 40 | glm_vec4 const swp1 = _mm_shuffle_ps(add0, add0, _MM_SHUFFLE(0, 1, 2, 3)); |
| 41 | glm_vec4 const add1 = _mm_add_ps(add0, swp1); |
| 42 | return add1; |
| 43 | # endif |
| 44 | } |
| 45 | |
| 46 | GLM_FUNC_QUALIFIER glm_vec4 glm_vec3_dot(glm_vec4 v1, glm_vec4 v2) |
| 47 | { |
| 48 | # if GLM_ARCH & GLM_ARCH_SSE41_BIT |
| 49 | return _mm_dp_ps(v1, v2, 0x77); |
| 50 | # elif GLM_ARCH & GLM_ARCH_SSE3_BIT |
| 51 | glm_vec4 const constant0 = _mm_castsi128_ps(_mm_setr_epi32(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0)); |
| 52 | glm_vec4 const mul0 = _mm_mul_ps(v1, v2); |
| 53 | glm_vec4 const and0 = _mm_and_ps(mul0, constant0); |
| 54 | glm_vec4 const hadd0 = _mm_hadd_ps(and0, and0); |
| 55 | glm_vec4 const hadd1 = _mm_hadd_ps(hadd0, hadd0); |
| 56 | return hadd1; |
| 57 | # else |
| 58 | glm_vec4 const constant0 = _mm_castsi128_ps(_mm_setr_epi32(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0)); |
| 59 | glm_vec4 const mul0 = _mm_mul_ps(v1, v2); |
| 60 | glm_vec4 const and0 = _mm_and_ps(mul0, constant0); |
| 61 | glm_vec4 const swp0 = _mm_shuffle_ps(and0, and0, _MM_SHUFFLE(2, 3, 0, 1)); |
| 62 | glm_vec4 const add0 = _mm_add_ps(and0, swp0); |
| 63 | glm_vec4 const swp1 = _mm_shuffle_ps(add0, add0, _MM_SHUFFLE(0, 1, 2, 3)); |
| 64 | glm_vec4 const add1 = _mm_add_ps(add0, swp1); |
| 65 | return add1; |
| 66 | # endif |
| 67 | |
| 68 | } |
| 69 | |
| 70 | GLM_FUNC_QUALIFIER glm_vec4 glm_vec1_dot(glm_vec4 v1, glm_vec4 v2) |
| 71 | { |
| 72 | # if GLM_ARCH & GLM_ARCH_SSE41_BIT |
| 73 | return _mm_dp_ps(v1, v2, 0xff); |
| 74 | # elif GLM_ARCH & GLM_ARCH_SSE3_BIT |
| 75 | glm_vec4 const mul0 = _mm_mul_ps(v1, v2); |
| 76 | glm_vec4 const had0 = _mm_hadd_ps(mul0, mul0); |
| 77 | glm_vec4 const had1 = _mm_hadd_ps(had0, had0); |
| 78 | return had1; |
| 79 | # else |
| 80 | glm_vec4 const mul0 = _mm_mul_ps(v1, v2); |
| 81 | glm_vec4 const mov0 = _mm_movehl_ps(mul0, mul0); |
| 82 | glm_vec4 const add0 = _mm_add_ps(mov0, mul0); |
| 83 | glm_vec4 const swp1 = _mm_shuffle_ps(add0, add0, 1); |
| 84 | glm_vec4 const add1 = _mm_add_ss(add0, swp1); |
| 85 | return add1; |
| 86 | # endif |
| 87 | } |
| 88 | |
| 89 | GLM_FUNC_QUALIFIER glm_vec4 glm_vec4_cross(glm_vec4 v1, glm_vec4 v2) |
| 90 | { |
| 91 | glm_vec4 const swp0 = _mm_shuffle_ps(v1, v1, _MM_SHUFFLE(3, 0, 2, 1)); |
| 92 | glm_vec4 const swp1 = _mm_shuffle_ps(v1, v1, _MM_SHUFFLE(3, 1, 0, 2)); |
| 93 | glm_vec4 const swp2 = _mm_shuffle_ps(v2, v2, _MM_SHUFFLE(3, 0, 2, 1)); |
| 94 | glm_vec4 const swp3 = _mm_shuffle_ps(v2, v2, _MM_SHUFFLE(3, 1, 0, 2)); |
| 95 | glm_vec4 const mul0 = _mm_mul_ps(swp0, swp3); |
| 96 | glm_vec4 const mul1 = _mm_mul_ps(swp1, swp2); |
| 97 | glm_vec4 const sub0 = _mm_sub_ps(mul0, mul1); |
| 98 | return sub0; |
| 99 | } |
| 100 | |
| 101 | GLM_FUNC_QUALIFIER glm_vec4 glm_vec4_normalize_lowp(glm_vec4 v) |
| 102 | { |
| 103 | glm_vec4 const dot0 = glm_vec4_dot(v, v); |
| 104 | glm_vec4 const isr0 = _mm_rsqrt_ps(dot0); |
| 105 | glm_vec4 const mul0 = _mm_mul_ps(v, isr0); |
| 106 | return mul0; |
| 107 | } |
| 108 | |
| 109 | GLM_FUNC_QUALIFIER glm_vec4 glm_vec3_normalize_lowp(glm_vec4 v) |
| 110 | { |
| 111 | glm_vec4 const dot0 = glm_vec3_dot(v, v); |
| 112 | glm_vec4 const isr0 = _mm_rsqrt_ps(dot0); |
| 113 | glm_vec4 const mul0 = _mm_mul_ps(v, isr0); |
| 114 | return mul0; |
| 115 | } |
| 116 | |
| 117 | GLM_FUNC_QUALIFIER glm_vec4 glm_vec4_normalize(glm_vec4 v) |
| 118 | { |
| 119 | glm_vec4 const dot0 = glm_vec4_dot(v, v); |
| 120 | glm_vec4 const isr0 = _mm_rsqrt_ps(dot0); |
| 121 | |
| 122 | |
| 123 | glm_vec4 const mul0 = glm_vec4_mul(dot0, isr0); |
| 124 | glm_vec4 const fma0 = glm_vec4_fma(mul0, isr0, _mm_set1_ps(-3.0f)); |
| 125 | glm_vec4 const mul1 = glm_vec4_mul(isr0, _mm_set1_ps(-0.5f)); |
| 126 | |
| 127 | glm_vec4 const mul2 = glm_vec4_mul(mul1, v); |
| 128 | glm_vec4 const mul3 = glm_vec4_mul(mul2, fma0); |
| 129 | |
| 130 | return mul3; |
| 131 | } |
| 132 | |
| 133 | GLM_FUNC_QUALIFIER glm_vec4 glm_vec3_normalize(glm_vec4 v) |
| 134 | { |
| 135 | glm_vec4 const dot0 = glm_vec3_dot(v, v); |
| 136 | glm_vec4 const isr0 = _mm_rsqrt_ps(dot0); |
| 137 | |
| 138 | |
| 139 | glm_vec4 const mul0 = glm_vec4_mul(dot0, isr0); |
| 140 | glm_vec4 const fma0 = glm_vec4_fma(mul0, isr0, _mm_set1_ps(-3.0f)); |
| 141 | glm_vec4 const mul1 = glm_vec4_mul(isr0, _mm_set1_ps(-0.5f)); |
| 142 | |
| 143 | glm_vec4 const mul2 = glm_vec4_mul(mul1, v); |
| 144 | glm_vec4 const mul3 = glm_vec4_mul(mul2, fma0); |
| 145 | |
| 146 | return mul3; |
| 147 | } |
| 148 | |
| 149 | |
| 150 | GLM_FUNC_QUALIFIER glm_vec4 glm_vec4_faceforward(glm_vec4 N, glm_vec4 I, glm_vec4 Nref) |
| 151 | { |
| 152 | glm_vec4 const dot0 = glm_vec4_dot(Nref, I); |
| 153 | glm_vec4 const sgn0 = glm_vec4_sign(dot0); |
| 154 | glm_vec4 const mul0 = _mm_mul_ps(sgn0, _mm_set1_ps(-1.0f)); |
| 155 | glm_vec4 const mul1 = _mm_mul_ps(N, mul0); |
| 156 | return mul1; |
| 157 | } |
| 158 | |
| 159 | GLM_FUNC_QUALIFIER glm_vec4 glm_vec4_reflect(glm_vec4 I, glm_vec4 N) |
| 160 | { |
| 161 | glm_vec4 const dot0 = glm_vec4_dot(N, I); |
| 162 | glm_vec4 const mul0 = _mm_mul_ps(N, dot0); |
| 163 | glm_vec4 const mul1 = _mm_mul_ps(mul0, _mm_set1_ps(2.0f)); |
| 164 | glm_vec4 const sub0 = _mm_sub_ps(I, mul1); |
| 165 | return sub0; |
| 166 | } |
| 167 | |
| 168 | GLM_FUNC_QUALIFIER __m128 glm_vec4_refract(glm_vec4 I, glm_vec4 N, glm_vec4 eta) |
| 169 | { |
| 170 | |
| 171 | |
| 172 | |
| 173 | |
| 174 | |
| 175 | |
| 176 | glm_vec4 const dot0 = glm_vec4_dot(N, I); |
| 177 | glm_vec4 const mul0 = _mm_mul_ps(eta, eta); |
| 178 | glm_vec4 const mul1 = _mm_mul_ps(dot0, dot0); |
| 179 | glm_vec4 const sub1 = _mm_sub_ps(_mm_set1_ps(1.0f), mul1); |
| 180 | glm_vec4 const mul2 = _mm_mul_ps(mul0, sub1); |
| 181 | glm_vec4 const sub0 = _mm_sub_ps(_mm_set1_ps(1.0f), mul2); |
| 182 | |
| 183 | if(_mm_movemask_ps(_mm_cmplt_ss(sub0, _mm_set1_ps(0.0f))) == 0) |
| 184 | return _mm_set1_ps(0.0f); |
| 185 | |
| 186 | glm_vec4 const sqt0 = _mm_sqrt_ps(sub0); |
| 187 | glm_vec4 const mad0 = glm_vec4_fma(eta, dot0, sqt0); |
| 188 | glm_vec4 const mul4 = _mm_mul_ps(mad0, N); |
| 189 | glm_vec4 const mul5 = _mm_mul_ps(eta, I); |
| 190 | glm_vec4 const sub2 = _mm_sub_ps(mul5, mul4); |
| 191 | |
| 192 | return sub2; |
| 193 | } |
| 194 | |
| 195 | #endif |