/xbmc/visualizations/Goom/goom2k4-0/src/filter_test/px_py_calc.c

http://github.com/xbmc/xbmc · C · 94 lines · 56 code · 21 blank · 17 comment · 5 complexity · 714b611cb4f91d559d170df51f75cb17 MD5 · raw file

  1. #include "mmx.h"
  2. int testD [] = {0x1200, 0x2011, 0, 0x12, 0x5331, 0x8000};
  3. int testS [] = {0x1205, 0x11, 0x4210, 0x412, 0x121, 0x1211};
  4. int ratios [] = {0x8000, 0x4000, 0x1234, 0x6141, 0xffff, 0};
  5. int main () {
  6. int nbERROR = 0;
  7. int i,j;
  8. volatile mmx_t ratiox;
  9. volatile mmx_t sortie;
  10. /* creation des variables de test */
  11. volatile int buffratio = 0x8000;
  12. volatile int loop = 0;
  13. volatile int *buffS;
  14. volatile int *buffD;
  15. buffS = malloc (256);
  16. buffD = malloc (256);
  17. buffS = buffS + (unsigned)buffS % 64;
  18. buffD = buffD + (unsigned)buffD % 64;
  19. for (j=0;j<6;j++)
  20. for (i=0;i<3;i++) {
  21. buffratio = ratios[j];
  22. buffS[0] = testS[i<<1];
  23. buffS[1] = testS[(i<<1)+1];
  24. buffD[0] = testD[i*2];
  25. buffD[1] = testD[i*2+1];
  26. /* code */
  27. ratiox.d[0] = buffratio;
  28. ratiox.d[1] = buffratio;
  29. movq_m2r (ratiox, mm6);
  30. pslld_i2r (16,mm6);
  31. /* |0hhhhhhh|llllvvvv|
  32. x |00000000|bbbbbbbb|
  33. =================
  34. |.bl.high|..bl.low|
  35. + |..bh.low|00000000|
  36. =================
  37. result1
  38. */
  39. /*
  40. * pre : mm6 = [buffratio<<16|buffratio<<16]
  41. */
  42. movq_m2r (buffS[loop],mm0); /* mm0 = S */
  43. movq_m2r (buffD[loop],mm1); /* mm1 = D */
  44. psubd_r2r (mm0,mm1); /* mm1 = D - S */
  45. movq_r2r (mm1, mm2); /* mm2 = D - S */
  46. pslld_i2r (16,mm1);
  47. mmx_r2r (pmulhuw, mm6, mm1); /* mm1 = ?? */
  48. pmullw_r2r (mm6, mm2);
  49. paddd_r2r (mm2, mm1); /* mm1 = (D - S) * buffratio >> 16 */
  50. pslld_i2r (16,mm0);
  51. paddd_r2r (mm1, mm0); /* mm0 = S + mm1 */
  52. psrld_i2r (16, mm0);
  53. movq_r2m (mm0, sortie);
  54. /*
  55. * post : mm0 = S + ((D-S)*buffratio)>>16
  56. * modified = mm0,mm1,mm2
  57. */
  58. if (
  59. (buffS[0] + (((buffD[0]-buffS[0]) * buffratio)>>16) != sortie.d[0])
  60. | (buffS[1] + (((buffD[1]-buffS[1]) * buffratio)>>16) != sortie.d[1]))
  61. {
  62. nbERROR++;
  63. printf ("\ns : (0x%08x,0x%08x)\n", buffS[0], buffS[1]);
  64. printf ("d : (0x%08x,0x%08x)\n", buffD[0], buffD[1]);
  65. printf ("ratio : (0x%08x,0x%08x)\n", buffratio, buffratio);
  66. printf ("en mmx : (0x%08x,0x%08x)\n", sortie.d[0], sortie.d[1]);
  67. printf ("en c : (0x%08x,0x%08x)\n",
  68. buffS[0] + (((buffD[0]-buffS[0]) * buffratio)>>16),
  69. buffS[1] + (((buffD[1]-buffS[1]) * buffratio)>>16));
  70. }
  71. }
  72. printf ("%d errors\n",nbERROR);
  73. }