sse.cpp 34 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378
  1. #include "precompiled.h"
  2. #include "sse.h"
  3. //namespace sse
  4. //{
  5. // // some defines first
  6. // union ieee754_QNAN
  7. // {
  8. // const float f;
  9. // struct
  10. // {
  11. // const unsigned int mantissa:23, exp:8, sign:1;
  12. // };
  13. //
  14. // ieee754_QNAN() : f(0.0), mantissa(0x7FFFFF), exp(0xFF), sign(0x0) {}
  15. // };
  16. //
  17. // namespace detail
  18. // {
  19. // union ieee754
  20. // {
  21. // ieee754() :
  22. // f(0.0f)
  23. // {}
  24. //
  25. // ieee754(float f) :
  26. // f(f)
  27. // {}
  28. //
  29. // ieee754(unsigned int mantissa, unsigned int exp, unsigned int sign) :
  30. // mantissa(mantissa), exp(exp), sign(sign)
  31. // {}
  32. //
  33. // float f;
  34. // struct
  35. // {
  36. // unsigned int mantissa:23, exp:8, sign:1;
  37. // };
  38. // };
  39. //
  40. // _MM_ALIGN16 const ieee754 qnan(0x7FFFFF, 0xFF, 0x0);
  41. // }
  42. //
  43. // float load(unsigned int mantissa, unsigned int exp, unsigned int sign)
  44. // {
  45. // sse::detail::ieee754 value(mantissa, exp, sign);
  46. // return value.f;
  47. // }
  48. //
  49. // _MM_ALIGN16 const sse::detail::ieee754 qnan(0x7FFFFF, 0xFF, 0x0);
  50. //
  51. // _MM_ALIGN16 const ieee754_QNAN absMask;
  52. // //static const __m128 abs4Mask = _mm_load1_ps( &absMask.f);
  53. // static const __m128 abs4Mask = _mm_set_ps1(absMask.f);
  54. //
  55. // __m128 _mm_neg_ps(__m128 v)
  56. // {
  57. // return _mm_sub_ps(_mm_setzero_ps(), v);
  58. // }
  59. //
  60. // __m128 fast_pow(__m128 base, __m128 exponent)
  61. // {
  62. // __m128 denom = _mm_mul_ps( exponent, base);
  63. // denom = _mm_sub_ps( exponent, denom);
  64. // denom = _mm_add_ps( base, denom);
  65. // return _mm_mul_ps( base, _mm_rcp_ps(denom));
  66. // }
  67. //
  68. // static const __m128 zero = _mm_setzero_ps();
  69. // static const __m128 one = _mm_set_ps1(1.0f);
  70. // static const __m128 two = _mm_set_ps1(2.0f);
  71. // static const __m128 pi = _mm_set_ps1(3.1415926535897932384626433832795f);
  72. // static const __m128 hundred_eighty = _mm_set_ps1(180.f);
  73. // static const __m128 pi_over_hundred_eighty = _mm_set_ps1(0.017453292519943295769236907684886f);
  74. // static const __m128 hundred_eighty_over_pi = _mm_set_ps1(57.295779513082320876798154814105f);
  75. //
  76. // //vec4 radians(vec4 degrees)
  77. // //{
  78. // // const float pi = float(3.1415926535897932384626433832795);
  79. // // return degrees * (pi / 180.f);
  80. // //}
  81. // __m128 radians(__m128 degrees)
  82. // {
  83. // return _mm_mul_ps(degrees, pi_over_hundred_eighty);
  84. // }
  85. //
  86. // __m128 _mm_rad_ss(__m128 degrees)
  87. // {
  88. // return _mm_mul_ss(degrees, pi_over_hundred_eighty);
  89. // }
  90. //
  91. // __m128 _mm_rad_ps(__m128 degrees)
  92. // {
  93. // return _mm_mul_ps(degrees, pi_over_hundred_eighty);
  94. // }
  95. //
  96. // //vec4 degrees(vec4 radians)
  97. // //{
  98. // // const float pi = float(3.1415926535897932384626433832795);
  99. // // return radians * (180.f / pi);
  100. // //}
  101. // __m128 degrees(__m128 radians)
  102. // {
  103. // return _mm_mul_ps(radians, hundred_eighty_over_pi);
  104. // }
  105. //
  106. // __m128 _mm_deg_ss(__m128 radians)
  107. // {
  108. // return _mm_mul_ss(radians, hundred_eighty_over_pi);
  109. // }
  110. //
  111. // __m128 _mm_deg_ps(__m128 radians)
  112. // {
  113. // return _mm_mul_ps(radians, hundred_eighty_over_pi);
  114. // }
  115. //
  116. // //vec4 sqrt(vec4 v)
  117. // //{
  118. // // return vec4(sqrt(v.x), sqrt(v.y), sqrt(v.z), sqrt(v.w));
  119. // //}
  120. // __m128 sqrt(__m128 v)
  121. // {
  122. // return _mm_sqrt_ps(v);
  123. // }
  124. //
  125. // //vec4 inversesqrt(vec4 x)
  126. // //{
  127. // // return vec4(1.0f) / sqrt(x);
  128. // //}
  129. // __m128 inversesqrt(__m128 v)
  130. // {
  131. // return _mm_rsqrt_ps(v);
  132. // }
  133. //
  134. // //vec4 abs(vec4 x)
  135. // //{
  136. // // return x >= T(0) ? x : -x;
  137. // //}
  138. // __m128 abs(__m128 x)
  139. // {
  140. // return _mm_and_ps(abs4Mask, x);
  141. // }
  142. //
  143. // //__m128 _mm_abs_ss(__m128 x)
  144. // //{
  145. // // return _mm_and_ss(abs4Mask, x);
  146. // //}
  147. //
  148. // __m128 _mm_abs_ps(__m128 x)
  149. // {
  150. // return _mm_and_ps(abs4Mask, x);
  151. // }
  152. //
  153. // //vec4 sign(vec4 x)
  154. // //{
  155. // // vec4 result;
  156. // // if(x > vec4(0))
  157. // // result = vec4(1);
  158. // // else if(x < T(0))
  159. // // result = vec4(-1);
  160. // // else
  161. // // result = vec4(0);
  162. // // return result;
  163. // //}
  164. // __m128 sign(__m128 x)
  165. // {
  166. // __m128 result;
  167. // __m128 cmp0 = _mm_cmpeq_ps(x, zero);
  168. // if(_mm_movemask_ps(cmp0) == 0)
  169. // result = zero;
  170. // else
  171. // {
  172. // __m128 cmp1 = _mm_cmpge_ps(x, zero);
  173. // //__m128 cmp2 = _mm_cmple_ps(x, zero);
  174. // if(_mm_movemask_ps(cmp1) > 0)
  175. // result = one;
  176. // else //if(_mm_movemask_ps(cmp2) > 0)
  177. // result = minus_one;
  178. // }
  179. // return result;
  180. // }
  181. //
  182. // __m128 _mm_sgn_ss(__m128 x)
  183. // {
  184. // __m128 result;
  185. // __m128 cmp0 = _mm_cmpeq_ss(x, zero);
  186. // if(_mm_movemask_ss(cmp0) == 0)
  187. // result = zero;
  188. // else
  189. // {
  190. // __m128 cmp1 = _mm_cmpge_ss(x, zero);
  191. // //__m128 cmp2 = _mm_cmple_ss(x, zero);
  192. // if(_mm_movemask_ss(cmp1) > 0)
  193. // result = one;
  194. // else //if(_mm_movemask_ss(cmp2) > 0)
  195. // result = minus_one;
  196. // }
  197. // return result;
  198. // }
  199. //
  200. // __m128 _mm_sgn_ps(__m128 x)
  201. // {
  202. // __m128 cmp0 = _mm_cmpeq_ps(x, zero);
  203. // __m128 cmp1 = _mm_cmple_ps(x, zero);
  204. // __m128 cmp2 = _mm_cmpge_ps(x, zero)
  205. //
  206. // __m128 result;
  207. // __m128 cmp0 = _mm_cmpeq_ps(x, zero);
  208. // if(_mm_movemask_ps(cmp0) == 0)
  209. // result = zero;
  210. // else
  211. // {
  212. // __m128 cmp1 = _mm_cmpge_ps(x, zero);
  213. // //__m128 cmp2 = _mm_cmple_ps(x, zero);
  214. // if(_mm_movemask_ps(cmp1) > 0)
  215. // result = one;
  216. // else //if(_mm_movemask_ps(cmp2) > 0)
  217. // result = minus_one;
  218. // }
  219. // return result;
  220. // }
  221. //
  222. // //vec4 floor(vec4 x)
  223. // //{
  224. // // return ::std::floor(x);
  225. // //}
  226. //
  227. // __m128 floor(__m128 v)
  228. // {
  229. //
  230. // }
  231. //
  232. // __m128 _mm_flr_ss(__m128 v)
  233. // {
  234. //
  235. // }
  236. //
  237. // __m128 _mm_flr_ps(__m128 v)
  238. // {
  239. //
  240. // }
  241. //
  242. // //vec4 ceil(vec4 x)
  243. // //{
  244. // // return ::std::ceil(vec4);
  245. // //}
  246. //
  247. //
  248. //
  249. // //vec4 fract(vec4 x)
  250. // //{
  251. // // return x - floor(x);
  252. // //}
  253. // __m128 fract(__m128 x)
  254. // {
  255. // __m128 flr0 = floor(x);
  256. // __m128 sub0 = _mm_sub_ps(x, flr0);
  257. // return sub0;
  258. // }
  259. //
  260. // __m128 _mm_frc_ss(__m128 x)
  261. // {
  262. // __m128 flr0 = _mm_flr_ss(x);
  263. // __m128 sub0 = _mm_sub_ss(x, flr0);
  264. // return sub0;
  265. // }
  266. //
  267. // __m128 _mm_frc_ps(__m128 x)
  268. // {
  269. // __m128 flr0 = _mm_flr_ps(x);
  270. // __m128 sub0 = _mm_sub_ps(x, flr0);
  271. // return sub0;
  272. // }
  273. //
  274. // //vec4 mod(vec4 x, vec4 y)
  275. // //{
  276. // // return x - y * floor(x / y);
  277. // //}
  278. // __m128 mod(__m128 x, __m128 y)
  279. // {
  280. // __m128 div0 = _mm_div_ps(x, y);
  281. // __m128 flr0 = _mm_flr_ps(div0);
  282. // __m128 mul0 = _mm_mul_ps(y, flr0);
  283. // __m128 sub0 = _mm_sub_ps(x, mul0);
  284. // return sub0;
  285. // }
  286. //
  287. // __m128 _mm_mod_ss(__m128 x, __m128 y)
  288. // {
  289. // __m128 div0 = _mm_div_ss(x, y);
  290. // __m128 flr0 = _mm_flr_ss(div0);
  291. // __m128 mul0 = _mm_mul_ss(y, flr0);
  292. // __m128 sub0 = _mm_sub_ss(x, mul0);
  293. // return sub0;
  294. // }
  295. //
  296. // __m128 _mm_mod_ps(__m128 x, __m128 y)
  297. // {
  298. // __m128 div0 = _mm_div_ps(x, y);
  299. // __m128 flr0 = _mm_flr_ps(div0);
  300. // __m128 mul0 = _mm_mul_ps(y, flr0);
  301. // __m128 sub0 = _mm_sub_ps(x, mul0);
  302. // return sub0;
  303. // }
  304. //
  305. // //vec4 min(vec4 x, vec4 y)
  306. // //{
  307. // // return x < y ? x : y;
  308. // //}
  309. // __m128 min(__m128 v1, __m128 v2)
  310. // {
  311. // return _mm_min_ps(v1, v2);
  312. // }
  313. //
  314. // //vec4 max(vec4 x, vec4 y)
  315. // //{
  316. // // return x > y ? x : y;
  317. // //}
  318. // __m128 max(__m128 v1, __m128 v2)
  319. // {
  320. // return _mm_max_ps(v1, v2);
  321. // }
  322. //
  323. // //vec4 clamp(vec4 x, vec4 minVal, vec4 maxVal)
  324. // //{
  325. // // return max(min(v, maxVal), minVal);
  326. // //}
  327. // __m128 clamp(__m128 v, __m128 minVal, __m128 maxVal)
  328. // {
  329. // return _mm_max_ps(_mm_min_ps(v, maxVal), minVal);
  330. // }
  331. //
  332. // __m128 _mm_clp_ss(__m128 v, __m128 minVal, __m128 maxVal)
  333. // {
  334. // __m128 min0 = _mm_min_ss(v, maxVal);
  335. // __m128 max0 = _mm_max_ss(min0, minVal);
  336. // return max0;
  337. // }
  338. //
  339. // __m128 _mm_clp_ps(__m128 v, __m128 minVal, __m128 maxVal)
  340. // {
  341. // __m128 min0 = _mm_min_ps(v, maxVal);
  342. // __m128 max0 = _mm_max_ps(min0, minVal);
  343. // return max0;
  344. // }
  345. //
  346. // //vec4 mix(vec4 x, vec4 y, vec4 a)
  347. // //{
  348. // // return x * (vec4(1) - a) + y * a;
  349. // //}
  350. // __m128 mix(__m128 v1, __m128 v2, __m128 a)
  351. // {
  352. // __m128 sub0 = _mm_sub_ps(one, a);
  353. // __m128 mul0 = _mm_mul_ps(v1, sub0);
  354. // __m128 mul1 = _mm_mul_ps(v2, a);
  355. // __m128 add0 = _mm_add_ps(mul0, mul1);
  356. // return add0;
  357. // }
  358. //
  359. // __m128 _mm_lerp_ss(__m128 v1, __m128 v2, __m128 a)
  360. // {
  361. // __m128 sub0 = _mm_sub_ss(one, a);
  362. // __m128 mul0 = _mm_mul_ss(v1, sub0);
  363. // __m128 mul1 = _mm_mul_ss(v2, a);
  364. // __m128 add0 = _mm_add_ss(mul0, mul1);
  365. // return add0;
  366. // }
  367. //
  368. // __m128 _mm_lerp_ps(__m128 v1, __m128 v2, __m128 a)
  369. // {
  370. // __m128 sub0 = _mm_sub_ps(one, a);
  371. // __m128 mul0 = _mm_mul_ps(v1, sub0);
  372. // __m128 mul1 = _mm_mul_ps(v2, a);
  373. // __m128 add0 = _mm_add_ps(mul0, mul1);
  374. // return add0;
  375. // }
  376. //
  377. // //vec4 step(vec4 edge, vec4 x)
  378. // //{
  379. // // return x <= edge ? vec4(0) : vec4(1);
  380. // //}
  381. // __m128 step(__m128 edge, __m128 x)
  382. // {
  383. // __m128 cmp = _mm_cmple_ps(x, edge);
  384. // if(_mm_movemask_ps(cmp) == 0)
  385. // return one;
  386. // else
  387. // return zero;
  388. // }
  389. //
  390. // __m128 _mm_step_ss(__m128 edge, __m128 x)
  391. // {
  392. // __m128 cmp = _mm_cmple_ss(x, edge);
  393. // if(_mm_movemask_ss(cmp) == 0)
  394. // return one;
  395. // else
  396. // return zero;
  397. // }
  398. //
  399. // __m128 _mm_step_ps(__m128 edge, __m128 x)
  400. // {
  401. // __m128 cmp = _mm_cmple_ps(x, edge);
  402. // if(_mm_movemask_ps(cmp) == 0)
  403. // return one;
  404. // else
  405. // return zero;
  406. // }
  407. //
  408. // //vec4 smoothstep(vec4 edge0, vec4 edge1, vec4 x)
  409. // //{
  410. // // vec4 tmp = clamp((x - edge0) / (edge1 - edge0), vec4(0), vec4(1));
  411. // // return tmp * tmp * (vec4(3) - vec4(2) * tmp);
  412. // //}
  413. // __m128 smoothstep(__m128 edge0, __m128 edge1, __m128 x)
  414. // {
  415. // __m128 sub0 = _mm_sub_ps(x, edge0);
  416. // __m128 sub1 = _mm_sub_ps(edge1, edge0);
  417. // __m128 div0 = _mm_sub_ps(sub0, sub1);
  418. // __m128 clp0 = _mm_clp_ps(div0, zero, one);
  419. // __m128 mul0 = _mm_mul_ps(two, clp0);
  420. // __m128 sub2 = _mm_sub_ps(three, mul0);
  421. // __m128 mul1 = _mm_mul_ps(clp0, clp0);
  422. // __m128 mul2 = _mm_mul_ps(mul1, sub2);
  423. // return mul2;
  424. // }
  425. //
  426. // __m128 _mm_ssp_ss(__m128 edge0, __m128 edge1, __m128 x)
  427. // {
  428. // __m128 sub0 = _mm_sub_ss(x, edge0);
  429. // __m128 sub1 = _mm_sub_ss(edge1, edge0);
  430. // __m128 div0 = _mm_sub_ss(sub0, sub1);
  431. // __m128 clp0 = _mm_clp_ss(div0, zero, one);
  432. // __m128 mul0 = _mm_mul_ss(two, clp0);
  433. // __m128 sub2 = _mm_sub_ss(three, mul0);
  434. // __m128 mul1 = _mm_mul_ss(clp0, clp0);
  435. // __m128 mul2 = _mm_mul_ss(mul1, sub2);
  436. // return mul2;
  437. // }
  438. //
  439. // __m128 _mm_ssp_ps(__m128 edge0, __m128 edge1, __m128 x)
  440. // {
  441. // __m128 sub0 = _mm_sub_ps(x, edge0);
  442. // __m128 sub1 = _mm_sub_ps(edge1, edge0);
  443. // __m128 div0 = _mm_sub_ps(sub0, sub1);
  444. // __m128 clp0 = _mm_clp_ps(div0, zero, one);
  445. // __m128 mul0 = _mm_mul_ps(two, clp0);
  446. // __m128 sub2 = _mm_sub_ps(three, mul0);
  447. // __m128 mul1 = _mm_mul_ps(clp0, clp0);
  448. // __m128 mul2 = _mm_mul_ps(mul1, sub2);
  449. // return mul2;
  450. // }
  451. //
  452. // //float length(vec4 x)
  453. // //{
  454. // // float sqr = x.x * x.x + x.y * x.y + x.z * x.z + x.w * x.w;
  455. // // return sqrt(sqr);
  456. // //}
  457. // __m128 length(__m128 x)
  458. // {
  459. // __m128 dot0 = dot(x, x);
  460. // __m128 sqt0 = _mm_sqrt_ps(dot0);
  461. // return sqt0;
  462. // }
  463. //
  464. // __m128 _mm_len_ss(__m128 x)
  465. // {
  466. // __m128 dot0 = _mm_dot_ss(x, x);
  467. // __m128 sqt0 = _mm_sqrt_ss(dot0);
  468. // return sqt0;
  469. // }
  470. //
  471. // __m128 _mm_len_ps(__m128 x)
  472. // {
  473. // __m128 dot0 = _mm_dot_ps(x, x);
  474. // __m128 sqt0 = _mm_sqrt_ps(dot0);
  475. // return sqt0;
  476. // }
  477. //
  478. // //float distance(vec4 p0, vec4 p1)
  479. // //{
  480. // // return length(p1 - p0);
  481. // //}
  482. // __m128 distance(__m128 p0, __m128 p1)
  483. // {
  484. // __m128 sub0 = _mm_sub_ps(p0, p1);
  485. // __m128 len0 = _mm_len_ps(sub0);
  486. // return len0;
  487. // }
  488. //
  489. // __m128 _mm_dst_ss(__m128 p0, __m128 p1)
  490. // {
  491. // __m128 sub0 = _mm_sub_ps(p0, p1);
  492. // __m128 len0 = _mm_len_ps(sub0);
  493. // return len0;
  494. // }
  495. //
  496. // __m128 _mm_dst_ps(__m128 p0, __m128 p1)
  497. // {
  498. // __m128 sub0 = _mm_sub_ps(p0, p1);
  499. // __m128 len0 = _mm_len_ps(sub0);
  500. // return len0;
  501. // }
  502. //
  503. // //vec4 dot(vec4 x, vec4 y)
  504. // //{
  505. // // return vec4(x.x * y.x + x.y * y.y + x.z * y.z + x.w * y.w);
  506. // //}
  507. // __m128 dot(__m128 v1, __m128 v2)
  508. // {
  509. // __m128 mul0 = _mm_mul_ps(v1, v2);
  510. // __m128 swp0 = _mm_shuffle_ps(mul0, mul0, _MM_SHUFFLE(2, 3, 0, 1));
  511. // __m128 add0 = _mm_add_ps(mul0, swp0);
  512. // __m128 swp1 = _mm_shuffle_ps(add0, add0, _MM_SHUFFLE(0, 1, 2, 3));
  513. // __m128 add1 = _mm_add_ps(add0, swp1);
  514. // return add1;
  515. // }
  516. //
  517. // __m128 _mm_dot_ss(__m128 v1, __m128 v2)
  518. // {
  519. // __m128 mul0 = _mm_mul_ps(v1, v2);
  520. // __m128 swp0 = _mm_shuffle_ps(mul0, mul0, _MM_SHUFFLE(2, 3, 0, 1));
  521. // __m128 add0 = _mm_add_ps(mul0, swp0);
  522. // __m128 swp1 = _mm_shuffle_ps(add0, add0, _MM_SHUFFLE(0, 1, 2, 3));
  523. // __m128 add1 = _mm_add_ps(add0, swp1);
  524. // return add1;
  525. // }
  526. //
  527. // __m128 _mm_dot_ps(__m128 v1, __m128 v2)
  528. // {
  529. // __m128 mul0 = _mm_mul_ps(v1, v2);
  530. // __m128 swp0 = _mm_shuffle_ps(mul0, mul0, _MM_SHUFFLE(2, 3, 0, 1));
  531. // __m128 add0 = _mm_add_ps(mul0, swp0);
  532. // __m128 swp1 = _mm_shuffle_ps(add0, add0, _MM_SHUFFLE(0, 1, 2, 3));
  533. // __m128 add1 = _mm_add_ps(add0, swp1);
  534. // return add1;
  535. // }
  536. //
  537. // //vec3 cross(vec3 x, vec3 y)
  538. // //{
  539. // // return vec3(
  540. // // x.y * y.z - y.y * x.z,
  541. // // x.z * y.x - y.z * x.x,
  542. // // x.x * y.y - y.x * x.y);
  543. // //}
  544. // __m128 cross(__m128 v1, __m128 v2)
  545. // {
  546. // __m128 swp0 = _mm_shuffle_ps(v1, v1, _MM_SHUFFLE(3, 0, 2, 1));
  547. // __m128 swp1 = _mm_shuffle_ps(v1, v1, _MM_SHUFFLE(3, 1, 0, 2));
  548. // __m128 swp2 = _mm_shuffle_ps(v2, v2, _MM_SHUFFLE(3, 0, 2, 1));
  549. // __m128 swp3 = _mm_shuffle_ps(v2, v2, _MM_SHUFFLE(3, 1, 0, 2));
  550. // __m128 mul0 = _mm_mul_ps(swp0, swp3);
  551. // __m128 mul1 = _mm_mul_ps(swp1, swp2);
  552. // __m128 sub0 = _mm_sub_ps(mul0, mul1);
  553. // return sub0;
  554. // }
  555. //
  556. // __m128 _mm_xpd_ps(__m128 v1, __m128 v2)
  557. // {
  558. // __m128 swp0 = _mm_shuffle_ps(v1, v1, _MM_SHUFFLE(3, 0, 2, 1));
  559. // __m128 swp1 = _mm_shuffle_ps(v1, v1, _MM_SHUFFLE(3, 1, 0, 2));
  560. // __m128 swp2 = _mm_shuffle_ps(v2, v2, _MM_SHUFFLE(3, 0, 2, 1));
  561. // __m128 swp3 = _mm_shuffle_ps(v2, v2, _MM_SHUFFLE(3, 1, 0, 2));
  562. // __m128 mul0 = _mm_mul_ps(swp0, swp3);
  563. // __m128 mul1 = _mm_mul_ps(swp1, swp2);
  564. // __m128 sub0 = _mm_sub_ps(mul0, mul1);
  565. // return sub0;
  566. // }
  567. //
  568. // //vec4 normalize(vec4 x)
  569. // //{
  570. // // float sqr = x.x * x.x + x.y * x.y + x.z * x.z + x.w * x.w;
  571. // // return x * inversesqrt(sqr);
  572. // //}
  573. // __m128 normalize(__m128 v)
  574. // {
  575. // __m128 dot0 = dot(v, v);
  576. // __m128 isr0 = _mm_rsqrt_ps(dot0);
  577. // __m128 mul0 = _mm_mul_ps(v, isr0);
  578. // return mul0;
  579. // }
  580. //
  581. // __m128 _mm_nrm_ps(__m128 v)
  582. // {
  583. // __m128 dot0 = dot(v, v);
  584. // __m128 isr0 = _mm_rsqrt_ps(dot0);
  585. // __m128 mul0 = _mm_mul_ps(v, isr0);
  586. // return mul0;
  587. // }
  588. //
  589. // __m128 rcp(__m128 v)
  590. // {
  591. // return _mm_rcp_ps(v);
  592. // }
  593. //
  594. // //vec4 mad(vec4 v0, vec4 v1, vec4 v2)
  595. // //{
  596. // // return v0 * v1 + v2;
  597. // //}
  598. // __m128 mad(__m128 v0, __m128 v1, __m128 v2)
  599. // {
  600. // __m128 mul0 = _mm_mul_ps(v0, v1);
  601. // __m128 add0 = _mm_add_ps(mul0, v2);
  602. // return add0;
  603. // }
  604. //
  605. // __m128 _mm_mad_ss(__m128 v0, __m128 v1, __m128 v2)
  606. // {
  607. // __m128 mul0 = _mm_mul_ss(v0, v1);
  608. // __m128 add0 = _mm_add_ss(mul0, v2);
  609. // return add0;
  610. // }
  611. //
  612. // __m128 _mm_mad_ps(__m128 v0, __m128 v1, __m128 v2)
  613. // {
  614. // __m128 mul0 = _mm_mul_ps(v0, v1);
  615. // __m128 add0 = _mm_add_ps(mul0, v2);
  616. // return add0;
  617. // }
  618. //
  619. // //vec4 reflect(vec4 I, vec4 N)
  620. // //{
  621. // // return I - N * dot(N, I) * 2.0f;
  622. // //}
  623. // __m128 reflect(__m128 I, __m128 N)
  624. // {
  625. // __m128 dot0 = dot(N, I);
  626. // __m128 mul0 = _mm_mul_ps(N, I);
  627. // __m128 mul1 = _mm_mul_ps(mul0, two);
  628. // __m128 sub0 = _mm_sub_ps(I, mul1);
  629. // return sub0;
  630. // }
  631. //
  632. // __m128 _mm_rfe_ps(__m128 I, __m128 N)
  633. // {
  634. // __m128 dot0 = dot(N, I);
  635. // __m128 mul0 = _mm_mul_ps(N, I);
  636. // __m128 mul1 = _mm_mul_ps(mul0, two);
  637. // __m128 sub0 = _mm_sub_ps(I, mul1);
  638. // return sub0;
  639. // }
  640. //
  641. // //vec4 refract(vec4 I, vec4 N, T eta)
  642. // //{
  643. // // float dotValue = dot(N, I);
  644. // // float k = 1.0f - eta * eta * (1.0f - dotValue * dotValue);
  645. // // if(k < 0.0f)
  646. // // return vec4(0.0f);
  647. // // return eta * I - (eta * dotValue + sqrt(k)) * N;
  648. // //}
  649. // __m128 refract(__m128 I, __m128 N, __m128 eta)
  650. // {
  651. // __m128 dot0 = dot(N, I);
  652. // __m128 mul0 = _mm_mul_ps(eta, eta);
  653. // __m128 mul1 = _mm_mul_ps(dot0, dot0);
  654. // __m128 sub0 = _mm_sub_ps(one, mul0);
  655. // __m128 sub1 = _mm_sub_ps(one, mul1);
  656. // __m128 mul2 = _mm_mul_ps(sub0, sub1);
  657. //
  658. // if(_mm_movemask_ps(_mm_cmplt_ss(mul2, zero)) == 0)
  659. // return zero;
  660. //
  661. // __m128 sqt0 = _mm_sqrt_ps(mul2);
  662. // __m128 mul3 = _mm_mul_ps(eta, dot0);
  663. // __m128 add0 = _mm_add_ps(mul3, sqt0);
  664. // __m128 mul4 = _mm_mul_ps(add0, N);
  665. // __m128 mul5 = _mm_mul_ps(eta, I);
  666. // __m128 sub2 = _mm_sub_ps(mul5, mul4);
  667. //
  668. // return sub2;
  669. // }
  670. //
  671. // __m128 _mm_rfa_ps(__m128 I, __m128 N, __m128 eta)
  672. // {
  673. // __m128 dot0 = dot(N, I);
  674. // __m128 mul0 = _mm_mul_ps(eta, eta);
  675. // __m128 mul1 = _mm_mul_ps(dot0, dot0);
  676. // __m128 sub0 = _mm_sub_ps(one, mul0);
  677. // __m128 sub1 = _mm_sub_ps(one, mul1);
  678. // __m128 mul2 = _mm_mul_ps(sub0, sub1);
  679. //
  680. // if(_mm_movemask_ps(_mm_cmplt_ss(mul2, zero)) == 0)
  681. // return zero;
  682. //
  683. // __m128 sqt0 = _mm_sqrt_ps(mul2);
  684. // __m128 mul3 = _mm_mul_ps(eta, dot0);
  685. // __m128 add0 = _mm_add_ps(mul3, sqt0);
  686. // __m128 mul4 = _mm_mul_ps(add0, N);
  687. // __m128 mul5 = _mm_mul_ps(eta, I);
  688. // __m128 sub2 = _mm_sub_ps(mul5, mul4);
  689. //
  690. // return sub2;
  691. // }
  692. //
  693. //
  694. // struct vec4;
  695. // typedef const vec4& vec4_param;
  696. //
  697. // template <int N>
  698. // class comp
  699. // {
  700. // public:
  701. // comp(int i) :
  702. // index(i)
  703. // {
  704. // assert(i < N && i >= 0);
  705. // }
  706. //
  707. // operator const int() const{return index;}
  708. //
  709. // private:
  710. // int index;
  711. // };
  712. //
  713. // typedef comp<4> comp4_t;
  714. //
  715. // struct vec4
  716. // {
  717. // vec4();
  718. // vec4(float s);
  719. // vec4(float x, float y, float z, float w);
  720. // vec4(float v[4]);
  721. //
  722. // explicit vec4(__m128 data);
  723. //
  724. // vec4& operator= (vec4_param v);
  725. // vec4& operator+=(float s);
  726. // vec4& operator+=(vec4_param v);
  727. // vec4& operator-=(float s);
  728. // vec4& operator-=(vec4_param v);
  729. // vec4& operator*=(float s);
  730. // vec4& operator*=(vec4_param v);
  731. // vec4& operator/=(float s);
  732. // vec4& operator/=(vec4_param v);
  733. // vec4& operator++();
  734. // vec4& operator--();
  735. //
  736. // union
  737. // {
  738. // __m128 data;
  739. // struct{float x, y, z, w;};
  740. // float array[4];
  741. // };
  742. // };
  743. //
  744. // vec4::vec4() :
  745. // data(_mm_setzero_ps())
  746. // {}
  747. //
  748. // vec4::vec4(float s) :
  749. // data(_mm_load_ps1(&s))
  750. //// data(_mm_set_ps1(s))
  751. // {}
  752. //
  753. // vec4::vec4(float v[4]) :
  754. // data(_mm_load_ps(v))
  755. // {}
  756. //
  757. // vec4::vec4(float x, float y, float z, float w) :
  758. //// data(_mm_setr_ps(x, y, z, w))
  759. // data(_mm_set_ps(w, z, y, x))
  760. // {}
  761. //
  762. // vec4::vec4(__m128 data) :
  763. // data(data)
  764. // {}
  765. //
  766. // vec4& vec4::operator= (vec4_param v)
  767. // {
  768. // this->data = v.data;
  769. // return *this;
  770. // }
  771. //
  772. // vec4& vec4::operator+=(float s)
  773. // {
  774. // vec4 tmp(s);
  775. // this->data = _mm_add_ps(this->data , tmp.data);
  776. // return *this;
  777. // }
  778. //
  779. // vec4& vec4::operator+=(vec4_param v)
  780. // {
  781. // this->data = _mm_add_ps(this->data , v.data);
  782. // return *this;
  783. // }
  784. //
  785. // vec4& vec4::operator-=(float s)
  786. // {
  787. // vec4 tmp(s);
  788. // this->data = _mm_sub_ps(this->data , tmp.data);
  789. // return *this;
  790. // }
  791. //
  792. // vec4& vec4::operator-=(vec4_param v)
  793. // {
  794. // this->data = _mm_sub_ps(this->data , v.data);
  795. // return *this;
  796. // }
  797. //
  798. // vec4& vec4::operator*=(float s)
  799. // {
  800. // vec4 tmp(s);
  801. // this->data = _mm_mul_ps(this->data , tmp.data);
  802. // return *this;
  803. // }
  804. //
  805. // vec4& vec4::operator*=(vec4_param v)
  806. // {
  807. // this->data = _mm_mul_ps(this->data , v.data);
  808. // return *this;
  809. // }
  810. //
  811. // vec4& vec4::operator/=(float s)
  812. // {
  813. // vec4 tmp(s);
  814. // this->data = _mm_div_ps(this->data , tmp.data);
  815. // return *this;
  816. // }
  817. //
  818. // vec4& vec4::operator/=(vec4_param v)
  819. // {
  820. // this->data = _mm_div_ps(this->data , v.data);
  821. // return *this;
  822. // }
  823. //
  824. // vec4& vec4::operator++()
  825. // {
  826. // static __m128 inc = _mm_set_ps1(1.0f);
  827. // this->data = _mm_add_ps(this->data , inc);
  828. // return *this;
  829. // }
  830. //
  831. // vec4& vec4::operator--()
  832. // {
  833. // static __m128 inc = _mm_set_ps1(1.0f);
  834. // this->data = _mm_sub_ps(this->data , inc);
  835. // return *this;
  836. // }
  837. //
  838. // vec4 operator+ (const vec4& v1, const vec4& v2)
  839. // {
  840. // return vec4(_mm_add_ps(v1.data , v2.data));
  841. // }
  842. //
  843. // vec4 operator+ (const vec4& v1, const float s)
  844. // {
  845. // vec4 v2(s);
  846. // return vec4(_mm_add_ps(v1.data , v2.data));
  847. // }
  848. //
  849. // vec4 operator+ (const float s, const vec4& v2)
  850. // {
  851. // vec4 v1(s);
  852. // return vec4(_mm_add_ps(v1.data , v2.data));
  853. // }
  854. //
  855. // vec4 operator- (const vec4& v1, const vec4& v2)
  856. // {
  857. // return vec4(_mm_sub_ps(v1.data , v2.data));
  858. // }
  859. //
  860. // vec4 operator- (const vec4& v1, const float s)
  861. // {
  862. // vec4 v2(s);
  863. // return vec4(_mm_sub_ps(v1.data , v2.data));
  864. // }
  865. //
  866. // vec4 operator- (const float s, const vec4& v2)
  867. // {
  868. // vec4 v1(s);
  869. // return vec4(_mm_sub_ps(v1.data , v2.data));
  870. // }
  871. //
  872. // vec4 operator* (const vec4& v1, const vec4& v2)
  873. // {
  874. // return vec4(_mm_mul_ps(v1.data , v2.data));
  875. // }
  876. //
  877. // vec4 operator* (const vec4& v1, const float s)
  878. // {
  879. // vec4 v2(s);
  880. // return vec4(_mm_mul_ps(v1.data , v2.data));
  881. // }
  882. //
  883. // vec4 operator* (const float s, const vec4& v2)
  884. // {
  885. // vec4 v1(s);
  886. // return vec4(_mm_mul_ps(v1.data , v2.data));
  887. // }
  888. //
  889. // vec4 operator/ (const vec4& v1, const vec4& v2)
  890. // {
  891. // return vec4(_mm_div_ps(v1.data , v2.data));
  892. // }
  893. //
  894. // vec4 operator/ (const vec4& v1, const float s)
  895. // {
  896. // vec4 v2(s);
  897. // return vec4(_mm_div_ps(v1.data , v2.data));
  898. // }
  899. //
  900. // vec4 operator/ (const float s, const vec4& v2)
  901. // {
  902. // vec4 v1(s);
  903. // return vec4(_mm_div_ps(v1.data , v2.data));
  904. // }
  905. //
  906. // vec4 load(const vec4& v, const comp4_t component)
  907. // {
  908. // switch(component)
  909. // {
  910. // default:
  911. // case 3:
  912. // return vec4(_mm_shuffle_ps(v.data, v.data, _MM_SHUFFLE(0, 0, 0, 0)));
  913. // case 2:
  914. // return vec4(_mm_shuffle_ps(v.data, v.data, _MM_SHUFFLE(1, 1, 1, 1)));
  915. // case 1:
  916. // return vec4(_mm_shuffle_ps(v.data, v.data, _MM_SHUFFLE(2, 2, 2, 2)));
  917. // case 0:
  918. // return vec4(_mm_shuffle_ps(v.data, v.data, _MM_SHUFFLE(3, 3, 3, 3)));
  919. // }
  920. // }
  921. //
  922. // vec4 rcp(vec4_param v)
  923. // {
  924. // return vec4(_mm_rcp_ps(v.data));
  925. // }
  926. //
  927. // vec4 sqrt(vec4_param v)
  928. // {
  929. // return vec4(_mm_sqrt_ps(v.data));
  930. // }
  931. //
  932. // vec4 inversesqrt(vec4_param v)
  933. // {
  934. // return vec4(_mm_rsqrt_ps(v.data));
  935. // }
  936. //
  937. // vec4 min(vec4_param v1, vec4_param v2)
  938. // {
  939. // return vec4(_mm_min_ps(v1.data, v2.data));
  940. // }
  941. //
  942. // vec4 max(vec4_param v1, vec4_param v2)
  943. // {
  944. // return vec4(_mm_max_ps(v1.data, v2.data));
  945. // }
  946. //
  947. // vec4 clamp(vec4_param v, float minVal, float maxVal)
  948. // {
  949. // vec4 v1(minVal);
  950. // vec4 v2(maxVal);
  951. // return vec4(_mm_min_ps(_mm_max_ps(v.data, v2.data), v1.data));
  952. // }
  953. //
  954. // vec4 clamp(vec4_param v, vec4_param minVal, vec4_param maxVal)
  955. // {
  956. // return vec4(_mm_min_ps(_mm_max_ps(v.data, maxVal.data), minVal.data));
  957. // }
  958. //
  959. // vec4 mix(vec4_param x, vec4_param y, vec4_param a)
  960. // {
  961. // __m128 one = _mm_set_ps1(1.0f);
  962. // __m128 b = _mm_sub_ps(one, a.data);
  963. // __m128 mul1 = _mm_mul_ps(x.data, b);
  964. // __m128 mul2 = _mm_mul_ps(y.data, a.data);
  965. // __m128 addFinal = _mm_add_ps(mul1, mul2);
  966. // return vec4(addFinal);
  967. //
  968. //
  969. //// __m128 b = _mm_sub_ps(_mm_set_ps1(1.0f), a.data);
  970. //// return vec4(_mm_add_ps(_mm_mul_ps(x.data, b), _mm_mul_ps(y.data, a.data)));
  971. // }
  972. //
  973. // float dot(vec4_param x, vec4_param y)
  974. // {
  975. // float result = 0.0f;
  976. // _mm_store_ss(&result, dot(x.data, y.data));
  977. // return result;
  978. // }
  979. //
  980. // vec4 reflect(vec4_param I, vec4_param N)
  981. // {
  982. // __m128 Normal = N.data;
  983. // __m128 Inc = I.data;
  984. // __m128 Two = _mm_set_ps1(2.0f);
  985. // __m128 Mul = _mm_mul_ps(Normal, dot(Normal, Inc));
  986. // return vec4(_mm_sub_ps(Inc, _mm_mul_ps(Mul, Two)));
  987. // }
  988. //
  989. // vec4 refract(vec4_param I, vec4_param N, float eta)
  990. // {
  991. // __m128 zero = _mm_set_ps1(0.0f);
  992. // __m128 eta1 = _mm_set_ps1(eta);
  993. // __m128 eta2 = _mm_mul_ps(eta1, eta1);
  994. // __m128 one = _mm_set_ps1(1.0f);
  995. // __m128 dotValue = dot(I.data, N.data);
  996. // __m128 dotValue2 = _mm_mul_ps(dotValue, dotValue);
  997. // __m128 k = _mm_sub_ps(one, _mm_mul_ps(eta2, _mm_sub_ps(one, dotValue2)));
  998. // __m128 isnull = _mm_cmplt_ss(k, zero);
  999. // if(_mm_movemask_ps(isnull) == 0)
  1000. // return vec4(zero);
  1001. // else
  1002. // {
  1003. // __m128 temp0 = _mm_add_ps(_mm_mul_ps(eta1, dotValue), sqrt(k));
  1004. // __m128 temp1 = _mm_shuffle_ps(temp0, temp0, _MM_SHUFFLE(0, 0, 0, 0));
  1005. // __m128 temp2 = _mm_mul_ps(temp1, N.data);
  1006. // __m128 temp3 = _mm_mul_ps(eta1, I.data);
  1007. // return vec4(_mm_sub_ps(temp3, temp2));
  1008. // }
  1009. // }
  1010. //
  1011. //
  1012. //};
  1013. //
  1014. //namespace glm
  1015. //{
  1016. // glm::vec4 rcp(const glm::vec4& v)
  1017. // {
  1018. // return 1.0f / v;
  1019. // }
  1020. //}
  1021. //
  1022. //namespace cpu
  1023. //{
  1024. // void sincos(float a, float &s, float &c)
  1025. // {
  1026. // _asm
  1027. // {
  1028. // fld a
  1029. // fsincos
  1030. // mov ecx, c
  1031. // mov edx, s
  1032. // fstp dword ptr [ecx]
  1033. // fstp dword ptr [edx]
  1034. // }
  1035. // }
  1036. //
  1037. // void sincos(double a, double& s, double& c)
  1038. // {
  1039. // _asm
  1040. // {
  1041. // fld a
  1042. // fsincos
  1043. // mov ecx, c
  1044. // mov edx, s
  1045. // fstp qword ptr [ecx]
  1046. // fstp qword ptr [edx]
  1047. // }
  1048. // }
  1049. //
  1050. // float sin(float s)
  1051. // {
  1052. // float result = 0.0f;
  1053. // float* p = &result;
  1054. // _asm
  1055. // {
  1056. // fld s
  1057. // fsin
  1058. // mov ecx, p
  1059. // fstp dword ptr [ecx]
  1060. // }
  1061. // return result;
  1062. //
  1063. // //float result = 0.0f;
  1064. // //_asm
  1065. // //{
  1066. // // fld s
  1067. // // fsin
  1068. // // mov ecx, result
  1069. // // fstp dword ptr [ecx]
  1070. // //}
  1071. // //return result;
  1072. // }
  1073. //
  1074. // float abs(float s)
  1075. // {
  1076. // float result = 0.0f;
  1077. // float* p = &result;
  1078. // _asm
  1079. // {
  1080. // fld s
  1081. // fabs
  1082. // mov ecx, p
  1083. // fstp dword ptr [ecx]
  1084. // }
  1085. // return result;
  1086. //
  1087. // //float result = 0.0f;
  1088. // //_asm
  1089. // //{
  1090. // // fld s
  1091. // // fsin
  1092. // // mov ecx, result
  1093. // // fstp dword ptr [ecx]
  1094. // //}
  1095. // //return result;
  1096. // }
  1097. //
  1098. // float add(float s1, float s2)
  1099. // {
  1100. // float result = 0.0f;
  1101. // float* p = &result;
  1102. // _asm
  1103. // {
  1104. // fld s1
  1105. // fld s2
  1106. // fadd
  1107. // mov ecx, p
  1108. // fstp dword ptr [ecx]
  1109. // }
  1110. // return result;
  1111. // }
  1112. //
  1113. // float sub(float s1, float s2)
  1114. // {
  1115. // float result = 0.0f;
  1116. // float* p = &result;
  1117. // _asm
  1118. // {
  1119. // fld s1
  1120. // fld s2
  1121. // fsub
  1122. // mov ecx, p
  1123. // fstp dword ptr [ecx]
  1124. // }
  1125. // return result;
  1126. // }
  1127. //
  1128. // float mul(float s1, float s2)
  1129. // {
  1130. // float result = 0.0f;
  1131. // float* p = &result;
  1132. // _asm
  1133. // {
  1134. // fld s1
  1135. // fld s2
  1136. // fmul
  1137. // mov ecx, p
  1138. // fstp dword ptr [ecx]
  1139. // }
  1140. // return result;
  1141. // }
  1142. //
  1143. // float div(float s1, float s2)
  1144. // {
  1145. // float result = 0.0f;
  1146. // float* p = &result;
  1147. // _asm
  1148. // {
  1149. // fld s1
  1150. // fld s2
  1151. // fdiv
  1152. // mov ecx, p
  1153. // fstp dword ptr [ecx]
  1154. // }
  1155. // return result;
  1156. // }
  1157. //}
  1158. //
  1159. //void test_asm()
  1160. //{
  1161. // float sin0 = cpu::sin(1.0f);
  1162. // float sin1 = glm::sin(1.0f);
  1163. // float add0 = cpu::add(1.0f, 2.0f);
  1164. // float sub0 = cpu::sub(1.0f, 2.0f);
  1165. //
  1166. //
  1167. // float end = 1.0f;
  1168. //}
  1169. //
  1170. //void test_clamp()
  1171. //{
  1172. // sse::vec4 v(0.5f, 0.5f, 9.5f, 9.5f);
  1173. // sse::vec4 minVal(1.0f, 2.0f, 3.0f, 4.0f);
  1174. // sse::vec4 maxVal(5.0f, 6.0f, 7.0f, 8.0f);
  1175. //
  1176. // __m128 clamp0 = sse::clamp(
  1177. // v.data,
  1178. // minVal.data,
  1179. // maxVal.data);
  1180. //
  1181. // glm::vec4 clamp1 = glm::clamp(
  1182. // glm::vec4(0.5f, 0.5f, 9.5f, 9.5f),
  1183. // glm::vec4(1.0f, 2.0f, 3.0f, 4.0f),
  1184. // glm::vec4(5.0f, 6.0f, 7.0f, 8.0f));
  1185. //
  1186. // __m128 end = _mm_setzero_ps();
  1187. //}
  1188. //
  1189. //#define DECLARE_EPI32_CONST(name) \
  1190. // extern const _MM_ALIGN16 int _epi32_##name[4];
  1191. //#define IMPLEMENT_EPI32_CONST(name,x) \
  1192. // const _MM_ALIGN16 int _epi32_##name[4]={x,x,x,x};
  1193. //#define IMPLEMENT_EPI32_CONST4(name,x,y,z,w) \
  1194. // const _MM_ALIGN16 int _epi32_##name[4]={w,z,y,x};
  1195. //
  1196. //#define DECLARE_PS_CONST(name) \
  1197. // extern const _MM_ALIGN16 float _ps_##name[4];
  1198. //#define IMPLEMENT_PS_CONST(name,x) \
  1199. // const _MM_ALIGN16 float _ps_##name[4]={x,x,x,x};
  1200. //#define IMPLEMENT_PS_CONST4(name,x,y,z,w) \
  1201. // const _MM_ALIGN16 float _ps_##name[4]={w,z,y,x};
  1202. //
  1203. ////IMPLEMENT_PS_CONST(sincos_p0, 0.15707963267948963959e1f)
  1204. ////IMPLEMENT_PS_CONST(sincos_p1, -0.64596409750621907082e0f)
  1205. ////IMPLEMENT_PS_CONST(sincos_p2, 0.7969262624561800806e-1f)
  1206. ////IMPLEMENT_PS_CONST(sincos_p3, -0.468175413106023168e-2f)
  1207. //
  1208. //IMPLEMENT_EPI32_CONST(sign_mask,0x80000000)
  1209. //IMPLEMENT_EPI32_CONST(inv_sign_mask,0x7FFFFFFF)
  1210. //IMPLEMENT_EPI32_CONST(mant_mask,0x7F800000)
  1211. //IMPLEMENT_EPI32_CONST(inv_mant_mask,0x807FFFFF)
  1212. //IMPLEMENT_EPI32_CONST(min_norm_pos,0x00800000)
  1213. //IMPLEMENT_EPI32_CONST(1,1)
  1214. //IMPLEMENT_EPI32_CONST(2,2)
  1215. //IMPLEMENT_EPI32_CONST(7,7)
  1216. //IMPLEMENT_EPI32_CONST(127,127)
  1217. //IMPLEMENT_EPI32_CONST(ninf,0xFF800000)
  1218. //IMPLEMENT_EPI32_CONST(pinf,0x7F800000)
  1219. //
  1220. //IMPLEMENT_PS_CONST(1_3,0.33333333333333333333333333333333f)
  1221. //IMPLEMENT_PS_CONST(0p5,0.5f)
  1222. //IMPLEMENT_PS_CONST(1,1.0f)
  1223. //IMPLEMENT_PS_CONST(m1,-1.0f)
  1224. //IMPLEMENT_PS_CONST(2,2.0f)
  1225. //IMPLEMENT_PS_CONST(3,3.0f)
  1226. //IMPLEMENT_PS_CONST(127,127.0f)
  1227. //IMPLEMENT_PS_CONST(255,255.0f)
  1228. //IMPLEMENT_PS_CONST(2pow23,8388608.0f)
  1229. //
  1230. //IMPLEMENT_PS_CONST4(1_0_0_0,1.0f,0.0f,0.0f,0.0f)
  1231. //IMPLEMENT_PS_CONST4(0_1_0_0,0.0f,1.0f,0.0f,0.0f)
  1232. //IMPLEMENT_PS_CONST4(0_0_1_0,0.0f,0.0f,1.0f,0.0f)
  1233. //IMPLEMENT_PS_CONST4(0_0_0_1,0.0f,0.0f,0.0f,1.0f)
  1234. //
  1235. //IMPLEMENT_PS_CONST(pi, 3.1415926535897932384626433832795f)
  1236. //IMPLEMENT_PS_CONST(pi2, 6.283185307179586476925286766560f)
  1237. //IMPLEMENT_PS_CONST(2_pi, 0.63661977236758134307553505349006f)
  1238. //IMPLEMENT_PS_CONST(pi_2, 1.5707963267948966192313216916398f)
  1239. //IMPLEMENT_PS_CONST(4_pi, 1.2732395447351626861510701069801f)
  1240. //IMPLEMENT_PS_CONST(pi_4, 0.78539816339744830961566084581988f)
  1241. //
  1242. //IMPLEMENT_PS_CONST(sincos_p0, 0.15707963267948963959e1f)
  1243. //IMPLEMENT_PS_CONST(sincos_p1, -0.64596409750621907082e0f)
  1244. //IMPLEMENT_PS_CONST(sincos_p2, 0.7969262624561800806e-1f)
  1245. //IMPLEMENT_PS_CONST(sincos_p3, -0.468175413106023168e-2f)
  1246. //IMPLEMENT_PS_CONST(tan_p0, -1.79565251976484877988e7f)
  1247. //IMPLEMENT_PS_CONST(tan_p1, 1.15351664838587416140e6f)
  1248. //IMPLEMENT_PS_CONST(tan_p2, -1.30936939181383777646e4f)
  1249. //IMPLEMENT_PS_CONST(tan_q0, -5.38695755929454629881e7f)
  1250. //IMPLEMENT_PS_CONST(tan_q1, 2.50083801823357915839e7f)
  1251. //IMPLEMENT_PS_CONST(tan_q2, -1.32089234440210967447e6f)
  1252. //IMPLEMENT_PS_CONST(tan_q3, 1.36812963470692954678e4f)
  1253. //IMPLEMENT_PS_CONST(tan_poleval,3.68935e19f)
  1254. //IMPLEMENT_PS_CONST(atan_t0, -0.91646118527267623468e-1f)
  1255. //IMPLEMENT_PS_CONST(atan_t1, -0.13956945682312098640e1f)
  1256. //IMPLEMENT_PS_CONST(atan_t2, -0.94393926122725531747e2f)
  1257. //IMPLEMENT_PS_CONST(atan_t3, 0.12888383034157279340e2f)
  1258. //IMPLEMENT_PS_CONST(atan_s0, 0.12797564625607904396e1f)
  1259. //IMPLEMENT_PS_CONST(atan_s1, 0.21972168858277355914e1f)
  1260. //IMPLEMENT_PS_CONST(atan_s2, 0.68193064729268275701e1f)
  1261. //IMPLEMENT_PS_CONST(atan_s3, 0.28205206687035841409e2f)
  1262. //
  1263. //IMPLEMENT_PS_CONST(exp_hi, 88.3762626647949f)
  1264. //IMPLEMENT_PS_CONST(exp_lo, -88.3762626647949f)
  1265. //IMPLEMENT_PS_CONST(exp_rln2, 1.4426950408889634073599f)
  1266. //IMPLEMENT_PS_CONST(exp_p0, 1.26177193074810590878e-4f)
  1267. //IMPLEMENT_PS_CONST(exp_p1, 3.02994407707441961300e-2f)
  1268. //IMPLEMENT_PS_CONST(exp_q0, 3.00198505138664455042e-6f)
  1269. //IMPLEMENT_PS_CONST(exp_q1, 2.52448340349684104192e-3f)
  1270. //IMPLEMENT_PS_CONST(exp_q2, 2.27265548208155028766e-1f)
  1271. //IMPLEMENT_PS_CONST(exp_q3, 2.00000000000000000009e0f)
  1272. //IMPLEMENT_PS_CONST(exp_c1, 6.93145751953125e-1f)
  1273. //IMPLEMENT_PS_CONST(exp_c2, 1.42860682030941723212e-6f)
  1274. //IMPLEMENT_PS_CONST(exp2_hi, 127.4999961853f)
  1275. //IMPLEMENT_PS_CONST(exp2_lo, -127.4999961853f)
  1276. //IMPLEMENT_PS_CONST(exp2_p0, 2.30933477057345225087e-2f)
  1277. //IMPLEMENT_PS_CONST(exp2_p1, 2.02020656693165307700e1f)
  1278. //IMPLEMENT_PS_CONST(exp2_p2, 1.51390680115615096133e3f)
  1279. //IMPLEMENT_PS_CONST(exp2_q0, 2.33184211722314911771e2f)
  1280. //IMPLEMENT_PS_CONST(exp2_q1, 4.36821166879210612817e3f)
  1281. //IMPLEMENT_PS_CONST(log_p0, -7.89580278884799154124e-1f)
  1282. //IMPLEMENT_PS_CONST(log_p1, 1.63866645699558079767e1f)
  1283. //IMPLEMENT_PS_CONST(log_p2, -6.41409952958715622951e1f)
  1284. //IMPLEMENT_PS_CONST(log_q0, -3.56722798256324312549e1f)
  1285. //IMPLEMENT_PS_CONST(log_q1, 3.12093766372244180303e2f)
  1286. //IMPLEMENT_PS_CONST(log_q2, -7.69691943550460008604e2f)
  1287. //IMPLEMENT_PS_CONST(log_c0, 0.693147180559945f)
  1288. //IMPLEMENT_PS_CONST(log2_c0, 1.44269504088896340735992f)
  1289. //
  1290. //#define GLM_NAKED __declspec(naked) __cdecl
  1291. //
  1292. //__m128 GLM_NAKED _mm_cos_ps(__m128 x)
  1293. //{
  1294. // __asm
  1295. // {
  1296. // andps xmm0, _epi32_inv_sign_mask
  1297. // addps xmm0, _ps_pi_2
  1298. // mulps xmm0, _ps_2_pi
  1299. // pxor xmm3, xmm3
  1300. // movdqa xmm5, _epi32_1
  1301. // movaps xmm4, _ps_1
  1302. // cvttps2dq xmm2, xmm0
  1303. // pand xmm5, xmm2
  1304. // pcmpeqd xmm5, xmm3
  1305. // cvtdq2ps xmm6, xmm2
  1306. // pand xmm2, _epi32_2
  1307. // pslld xmm2, 30
  1308. // subps xmm0, xmm6
  1309. // minps xmm0, xmm4
  1310. // subps xmm4, xmm0
  1311. // andps xmm0, xmm5
  1312. // andnps xmm5, xmm4
  1313. // orps xmm0, xmm5
  1314. // movaps xmm1, xmm0
  1315. // mulps xmm0, xmm0
  1316. // orps xmm1, xmm2
  1317. // movaps xmm7, xmm0
  1318. // mulps xmm0, _ps_sincos_p3
  1319. // addps xmm0, _ps_sincos_p2
  1320. // mulps xmm0, xmm7
  1321. // addps xmm0, _ps_sincos_p1
  1322. // mulps xmm0, xmm7
  1323. // addps xmm0, _ps_sincos_p0
  1324. // mulps xmm0, xmm1
  1325. // ret
  1326. // }
  1327. //}
  1328. //
  1329. //void test_sse()
  1330. //{
  1331. // sse::vec4 v1(1.0f, 2.0f, 3.0f, 4.0f);
  1332. // sse::vec4 v2(5.0f, 6.0f, 7.0f, 8.0f);
  1333. // sse::vec4 v3(9.0f);
  1334. // sse::vec4 v4(0.5f, 0.5f, 0.5f, 0.5f);
  1335. // __m128 v5 = sse::mix(v1.data, v2.data, v4.data);
  1336. // __m128 dot0 = sse::dot(v1.data, v2.data);
  1337. // float dot1 = sse::dot(v1, v2);
  1338. // __m128 rcp0 = sse::rcp(v1.data);
  1339. // glm::vec4 rcp1 = rcp(glm::vec4(1.0f, 2.0f, 3.0f, 4.0f));
  1340. //
  1341. // // cross
  1342. // {
  1343. // sse::vec4 v1(4.0f, 2.0f, 2.0f, 0.0f);
  1344. // sse::vec4 v2(1.0f, 2.0f, 3.0f, 0.0f);
  1345. // __m128 crs0 = sse::cross(v1.data, v2.data);
  1346. //
  1347. // glm::vec3 v3(4.0f, 2.0f, 2.0f);
  1348. // glm::vec3 v4(1.0f, 2.0f, 3.0f);
  1349. // glm::vec3 crs1 = glm::cross(v3, v4);
  1350. //
  1351. // __m128 end = _mm_set_ps1(1.0f);
  1352. // }
  1353. //
  1354. // // ieee754
  1355. // {
  1356. // sse::detail::ieee754 one(1.f);
  1357. // float f = sse::load(one.mantissa, one.exp, one.sign);
  1358. //
  1359. // __m128 end = _mm_set_ps1(1.0f);
  1360. // }
  1361. //
  1362. // test_clamp();
  1363. // test_asm();
  1364. //
  1365. // __m128 cos0 = _mm_cos_ps(_mm_set_ps1(1.0f));
  1366. // glm::vec4 cos1 = glm::cos(glm::vec4(1.0f));
  1367. //
  1368. // float f = glm::dot(glm::vec4(1.0f, 2.0f, 3.0f, 4.0f), glm::vec4(5.0f, 6.0f, 7.0f, 8.0f));
  1369. // sse::vec4 end(9.0f);
  1370. //
  1371. // //sse::vec4 vComp = sse::load(sse::vec4(1.0f, 2.0f, 3.0f, 4.0f), 1);
  1372. // //vComp += sse::vec4(1.0f);
  1373. // //--vComp;
  1374. // //sse::vec4 vMixed = sse::mix(vComp, sse::vec4(-0.5f), sse::vec4(0.5f));
  1375. // //float sDot = sse::dot(sse::vec4(1.0f), sse::vec4(2.0f));
  1376. // //float cDot = glm::dot(glm::vec4(1.0f), glm::vec4(2.0f));
  1377. //}