Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. /*
  2.         dct64_3dnow.s: Replacement of dct36() with AMD's 3DNow! SIMD operations support
  3.  
  4.         copyright ?-2006 by the mpg123 project - free software under the terms of the LGPL 2.1
  5.         see COPYING and AUTHORS files in distribution or http://mpg123.org
  6.         initially written by Syuuhei Kashiyama
  7.  
  8.         This code based 'dct36_3dnow.s' by Syuuhei Kashiyama
  9.         <squash@mb.kcom.ne.jp>,only two types of changes have been made:
  10.  
  11.         - remove PREFETCH instruction for speedup
  12.         - change function name for support 3DNow! automatic detect
  13.  
  14.         You can find Kashiyama's original 3dnow! support patch
  15.         (for mpg123-0.59o) at
  16.         http://user.ecc.u-tokyo.ac.jp/~g810370/linux-simd/ (Japanese).
  17.  
  18.         by KIMURA Takuhiro <kim@hannah.ipc.miyakyo-u.ac.jp> - until 31.Mar.1999
  19.                            <kim@comtec.co.jp>               - after  1.Apr.1999
  20.  
  21.         Replacement of dct36() with AMD's 3DNow! SIMD operations support
  22.  
  23.         Syuuhei Kashiyama <squash@mb.kcom.ne.jp>
  24.  
  25.         The author of this program disclaim whole expressed or implied
  26.         warranties with regard to this program, and in no event shall the
  27.         author of this program liable to whatever resulted from the use of
  28.         this program. Use it at your own risk.
  29. */
  30.  
  31. #include "mangle.h"
  32.  
  33.         .globl ASM_NAME(dct36_3dnow)
  34. /*      .type    ASM_NAME(dct36_3dnow),@function */
  35. ASM_NAME(dct36_3dnow):
  36.         pushl %ebp
  37.         movl %esp,%ebp
  38.         subl $120,%esp
  39.         pushl %esi
  40.         pushl %ebx
  41.         movl 8(%ebp),%eax
  42.         movl 12(%ebp),%esi
  43.         movl 16(%ebp),%ecx
  44.         movl 20(%ebp),%edx
  45.         movl 24(%ebp),%ebx
  46.         leal -128(%ebp),%esp
  47.  
  48.         femms
  49.         movq (%eax),%mm0
  50.         movq 4(%eax),%mm1
  51.         pfadd %mm1,%mm0
  52.         movq %mm0,4(%eax)
  53.         psrlq $32,%mm1
  54.         movq 12(%eax),%mm2
  55.         punpckldq %mm2,%mm1
  56.         pfadd %mm2,%mm1
  57.         movq %mm1,12(%eax)
  58.         psrlq $32,%mm2
  59.         movq 20(%eax),%mm3
  60.         punpckldq %mm3,%mm2
  61.         pfadd %mm3,%mm2
  62.         movq %mm2,20(%eax)
  63.         psrlq $32,%mm3
  64.         movq 28(%eax),%mm4
  65.         punpckldq %mm4,%mm3
  66.         pfadd %mm4,%mm3
  67.         movq %mm3,28(%eax)
  68.         psrlq $32,%mm4
  69.         movq 36(%eax),%mm5
  70.         punpckldq %mm5,%mm4
  71.         pfadd %mm5,%mm4
  72.         movq %mm4,36(%eax)
  73.         psrlq $32,%mm5
  74.         movq 44(%eax),%mm6
  75.         punpckldq %mm6,%mm5
  76.         pfadd %mm6,%mm5
  77.         movq %mm5,44(%eax)
  78.         psrlq $32,%mm6
  79.         movq 52(%eax),%mm7
  80.         punpckldq %mm7,%mm6
  81.         pfadd %mm7,%mm6
  82.         movq %mm6,52(%eax)
  83.         psrlq $32,%mm7
  84.         movq 60(%eax),%mm0
  85.         punpckldq %mm0,%mm7
  86.         pfadd %mm0,%mm7
  87.         movq %mm7,60(%eax)
  88.         psrlq $32,%mm0
  89.         movd 68(%eax),%mm1
  90.         pfadd %mm1,%mm0
  91.         movd %mm0,68(%eax)
  92.         movd 4(%eax),%mm0
  93.         movd 12(%eax),%mm1
  94.         punpckldq %mm1,%mm0
  95.         punpckldq 20(%eax),%mm1
  96.         pfadd %mm1,%mm0
  97.         movd %mm0,12(%eax)
  98.         psrlq $32,%mm0
  99.         movd %mm0,20(%eax)
  100.         psrlq $32,%mm1
  101.         movd 28(%eax),%mm2
  102.         punpckldq %mm2,%mm1
  103.         punpckldq 36(%eax),%mm2
  104.         pfadd %mm2,%mm1
  105.         movd %mm1,28(%eax)
  106.         psrlq $32,%mm1
  107.         movd %mm1,36(%eax)
  108.         psrlq $32,%mm2
  109.         movd 44(%eax),%mm3
  110.         punpckldq %mm3,%mm2
  111.         punpckldq 52(%eax),%mm3
  112.         pfadd %mm3,%mm2
  113.         movd %mm2,44(%eax)
  114.         psrlq $32,%mm2
  115.         movd %mm2,52(%eax)
  116.         psrlq $32,%mm3
  117.         movd 60(%eax),%mm4
  118.         punpckldq %mm4,%mm3
  119.         punpckldq 68(%eax),%mm4
  120.         pfadd %mm4,%mm3
  121.         movd %mm3,60(%eax)
  122.         psrlq $32,%mm3
  123.         movd %mm3,68(%eax)
  124.  
  125.         movq 24(%eax),%mm0
  126.         movq 48(%eax),%mm1
  127.         movd ASM_NAME(COS9)+12,%mm2
  128.         punpckldq %mm2,%mm2
  129.         movd ASM_NAME(COS9)+24,%mm3
  130.         punpckldq %mm3,%mm3
  131.         pfmul %mm2,%mm0
  132.         pfmul %mm3,%mm1
  133.         pushl %eax
  134.         movl $1,%eax
  135.         movd %eax,%mm7
  136.         pi2fd %mm7,%mm7
  137.         popl %eax
  138.         movq 8(%eax),%mm2
  139.         movd ASM_NAME(COS9)+4,%mm3
  140.         punpckldq %mm3,%mm3
  141.         pfmul %mm3,%mm2
  142.         pfadd %mm0,%mm2
  143.         movq 40(%eax),%mm3
  144.         movd ASM_NAME(COS9)+20,%mm4
  145.         punpckldq %mm4,%mm4
  146.         pfmul %mm4,%mm3
  147.         pfadd %mm3,%mm2
  148.         movq 56(%eax),%mm3
  149.         movd ASM_NAME(COS9)+28,%mm4
  150.         punpckldq %mm4,%mm4
  151.         pfmul %mm4,%mm3
  152.         pfadd %mm3,%mm2
  153.         movq (%eax),%mm3
  154.         movq 16(%eax),%mm4
  155.         movd ASM_NAME(COS9)+8,%mm5
  156.         punpckldq %mm5,%mm5
  157.         pfmul %mm5,%mm4
  158.         pfadd %mm4,%mm3
  159.         movq 32(%eax),%mm4
  160.         movd ASM_NAME(COS9)+16,%mm5
  161.         punpckldq %mm5,%mm5
  162.         pfmul %mm5,%mm4
  163.         pfadd %mm4,%mm3
  164.         pfadd %mm1,%mm3
  165.         movq 64(%eax),%mm4
  166.         movd ASM_NAME(COS9)+32,%mm5
  167.         punpckldq %mm5,%mm5
  168.         pfmul %mm5,%mm4
  169.         pfadd %mm4,%mm3
  170.         movq %mm2,%mm4
  171.         pfadd %mm3,%mm4
  172.         movq %mm7,%mm5
  173.         punpckldq ASM_NAME(tfcos36)+0,%mm5
  174.         pfmul %mm5,%mm4
  175.         movq %mm4,%mm5
  176.         pfacc %mm5,%mm5
  177.         movd 108(%edx),%mm6
  178.         punpckldq 104(%edx),%mm6
  179.         pfmul %mm6,%mm5
  180.         movd %mm5,36(%ecx)
  181.         psrlq $32,%mm5
  182.         movd %mm5,32(%ecx)
  183.         movq %mm4,%mm6
  184.         punpckldq %mm6,%mm5
  185.         pfsub %mm6,%mm5
  186.         punpckhdq %mm5,%mm5
  187.         movd 32(%edx),%mm6
  188.         punpckldq 36(%edx),%mm6
  189.         pfmul %mm6,%mm5
  190.         movd 32(%esi),%mm6
  191.         punpckldq 36(%esi),%mm6
  192.         pfadd %mm6,%mm5
  193.         movd %mm5,1024(%ebx)
  194.         psrlq $32,%mm5
  195.         movd %mm5,1152(%ebx)
  196.         movq %mm3,%mm4
  197.         pfsub %mm2,%mm4
  198.         movq %mm7,%mm5
  199.         punpckldq ASM_NAME(tfcos36)+32,%mm5
  200.         pfmul %mm5,%mm4
  201.         movq %mm4,%mm5
  202.         pfacc %mm5,%mm5
  203.         movd 140(%edx),%mm6
  204.         punpckldq 72(%edx),%mm6
  205.         pfmul %mm6,%mm5
  206.         movd %mm5,68(%ecx)
  207.         psrlq $32,%mm5
  208.         movd %mm5,0(%ecx)
  209.         movq %mm4,%mm6
  210.         punpckldq %mm6,%mm5
  211.         pfsub %mm6,%mm5
  212.         punpckhdq %mm5,%mm5
  213.         movd 0(%edx),%mm6
  214.         punpckldq 68(%edx),%mm6
  215.         pfmul %mm6,%mm5
  216.         movd 0(%esi),%mm6
  217.         punpckldq 68(%esi),%mm6
  218.         pfadd %mm6,%mm5
  219.         movd %mm5,0(%ebx)
  220.         psrlq $32,%mm5
  221.         movd %mm5,2176(%ebx)
  222.         movq 8(%eax),%mm2
  223.         movq 40(%eax),%mm3
  224.         pfsub %mm3,%mm2
  225.         movq 56(%eax),%mm3
  226.         pfsub %mm3,%mm2
  227.         movd ASM_NAME(COS9)+12,%mm3
  228.         punpckldq %mm3,%mm3
  229.         pfmul %mm3,%mm2
  230.         movq 16(%eax),%mm3
  231.         movq 32(%eax),%mm4
  232.         pfsub %mm4,%mm3
  233.         movq 64(%eax),%mm4
  234.         pfsub %mm4,%mm3
  235.         movd ASM_NAME(COS9)+24,%mm4
  236.         punpckldq %mm4,%mm4
  237.         pfmul %mm4,%mm3
  238.         movq 48(%eax),%mm4
  239.         pfsub %mm4,%mm3
  240.         movq (%eax),%mm4
  241.         pfadd %mm4,%mm3
  242.         movq %mm2,%mm4
  243.         pfadd %mm3,%mm4
  244.         movq %mm7,%mm5
  245.         punpckldq ASM_NAME(tfcos36)+4,%mm5
  246.         pfmul %mm5,%mm4
  247.         movq %mm4,%mm5
  248.         pfacc %mm5,%mm5
  249.         movd 112(%edx),%mm6
  250.         punpckldq 100(%edx),%mm6
  251.         pfmul %mm6,%mm5
  252.         movd %mm5,40(%ecx)
  253.         psrlq $32,%mm5
  254.         movd %mm5,28(%ecx)
  255.         movq %mm4,%mm6
  256.         punpckldq %mm6,%mm5
  257.         pfsub %mm6,%mm5
  258.         punpckhdq %mm5,%mm5
  259.         movd 28(%edx),%mm6
  260.         punpckldq 40(%edx),%mm6
  261.         pfmul %mm6,%mm5
  262.         movd 28(%esi),%mm6
  263.         punpckldq 40(%esi),%mm6
  264.         pfadd %mm6,%mm5
  265.         movd %mm5,896(%ebx)
  266.         psrlq $32,%mm5
  267.         movd %mm5,1280(%ebx)
  268.         movq %mm3,%mm4
  269.         pfsub %mm2,%mm4
  270.         movq %mm7,%mm5
  271.         punpckldq ASM_NAME(tfcos36)+28,%mm5
  272.         pfmul %mm5,%mm4
  273.         movq %mm4,%mm5
  274.         pfacc %mm5,%mm5
  275.         movd 136(%edx),%mm6
  276.         punpckldq 76(%edx),%mm6
  277.         pfmul %mm6,%mm5
  278.         movd %mm5,64(%ecx)
  279.         psrlq $32,%mm5
  280.         movd %mm5,4(%ecx)
  281.         movq %mm4,%mm6
  282.         punpckldq %mm6,%mm5
  283.         pfsub %mm6,%mm5
  284.         punpckhdq %mm5,%mm5
  285.         movd 4(%edx),%mm6
  286.         punpckldq 64(%edx),%mm6
  287.         pfmul %mm6,%mm5
  288.         movd 4(%esi),%mm6
  289.         punpckldq 64(%esi),%mm6
  290.         pfadd %mm6,%mm5
  291.         movd %mm5,128(%ebx)
  292.         psrlq $32,%mm5
  293.         movd %mm5,2048(%ebx)
  294.  
  295.         movq 8(%eax),%mm2
  296.         movd ASM_NAME(COS9)+20,%mm3
  297.         punpckldq %mm3,%mm3
  298.         pfmul %mm3,%mm2
  299.         pfsub %mm0,%mm2
  300.         movq 40(%eax),%mm3
  301.         movd ASM_NAME(COS9)+28,%mm4
  302.         punpckldq %mm4,%mm4
  303.         pfmul %mm4,%mm3
  304.         pfsub %mm3,%mm2
  305.         movq 56(%eax),%mm3
  306.         movd ASM_NAME(COS9)+4,%mm4
  307.         punpckldq %mm4,%mm4
  308.         pfmul %mm4,%mm3
  309.         pfadd %mm3,%mm2
  310.         movq (%eax),%mm3
  311.         movq 16(%eax),%mm4
  312.         movd ASM_NAME(COS9)+32,%mm5
  313.         punpckldq %mm5,%mm5
  314.         pfmul %mm5,%mm4
  315.         pfsub %mm4,%mm3
  316.         movq 32(%eax),%mm4
  317.         movd ASM_NAME(COS9)+8,%mm5
  318.         punpckldq %mm5,%mm5
  319.         pfmul %mm5,%mm4
  320.         pfsub %mm4,%mm3
  321.         pfadd %mm1,%mm3
  322.         movq 64(%eax),%mm4
  323.         movd ASM_NAME(COS9)+16,%mm5
  324.         punpckldq %mm5,%mm5
  325.         pfmul %mm5,%mm4
  326.         pfadd %mm4,%mm3
  327.         movq %mm2,%mm4
  328.         pfadd %mm3,%mm4
  329.         movq %mm7,%mm5
  330.         punpckldq ASM_NAME(tfcos36)+8,%mm5
  331.         pfmul %mm5,%mm4
  332.         movq %mm4,%mm5
  333.         pfacc %mm5,%mm5
  334.         movd 116(%edx),%mm6
  335.         punpckldq 96(%edx),%mm6
  336.         pfmul %mm6,%mm5
  337.         movd %mm5,44(%ecx)
  338.         psrlq $32,%mm5
  339.         movd %mm5,24(%ecx)
  340.         movq %mm4,%mm6
  341.         punpckldq %mm6,%mm5
  342.         pfsub %mm6,%mm5
  343.         punpckhdq %mm5,%mm5
  344.         movd 24(%edx),%mm6
  345.         punpckldq 44(%edx),%mm6
  346.         pfmul %mm6,%mm5
  347.         movd 24(%esi),%mm6
  348.         punpckldq 44(%esi),%mm6
  349.         pfadd %mm6,%mm5
  350.         movd %mm5,768(%ebx)
  351.         psrlq $32,%mm5
  352.         movd %mm5,1408(%ebx)
  353.         movq %mm3,%mm4
  354.         pfsub %mm2,%mm4
  355.         movq %mm7,%mm5
  356.         punpckldq ASM_NAME(tfcos36)+24,%mm5
  357.         pfmul %mm5,%mm4
  358.         movq %mm4,%mm5
  359.         pfacc %mm5,%mm5
  360.         movd 132(%edx),%mm6
  361.         punpckldq 80(%edx),%mm6
  362.         pfmul %mm6,%mm5
  363.         movd %mm5,60(%ecx)
  364.         psrlq $32,%mm5
  365.         movd %mm5,8(%ecx)
  366.         movq %mm4,%mm6
  367.         punpckldq %mm6,%mm5
  368.         pfsub %mm6,%mm5
  369.         punpckhdq %mm5,%mm5
  370.         movd 8(%edx),%mm6
  371.         punpckldq 60(%edx),%mm6
  372.         pfmul %mm6,%mm5
  373.         movd 8(%esi),%mm6
  374.         punpckldq 60(%esi),%mm6
  375.         pfadd %mm6,%mm5
  376.         movd %mm5,256(%ebx)
  377.         psrlq $32,%mm5
  378.         movd %mm5,1920(%ebx)
  379.         movq 8(%eax),%mm2
  380.         movd ASM_NAME(COS9)+28,%mm3
  381.         punpckldq %mm3,%mm3
  382.         pfmul %mm3,%mm2
  383.         pfsub %mm0,%mm2
  384.         movq 40(%eax),%mm3
  385.         movd ASM_NAME(COS9)+4,%mm4
  386.         punpckldq %mm4,%mm4
  387.         pfmul %mm4,%mm3
  388.         pfadd %mm3,%mm2
  389.         movq 56(%eax),%mm3
  390.         movd ASM_NAME(COS9)+20,%mm4
  391.         punpckldq %mm4,%mm4
  392.         pfmul %mm4,%mm3
  393.         pfsub %mm3,%mm2
  394.         movq (%eax),%mm3
  395.         movq 16(%eax),%mm4
  396.         movd ASM_NAME(COS9)+16,%mm5
  397.         punpckldq %mm5,%mm5
  398.         pfmul %mm5,%mm4
  399.         pfsub %mm4,%mm3
  400.         movq 32(%eax),%mm4
  401.         movd ASM_NAME(COS9)+32,%mm5
  402.         punpckldq %mm5,%mm5
  403.         pfmul %mm5,%mm4
  404.         pfadd %mm4,%mm3
  405.         pfadd %mm1,%mm3
  406.         movq 64(%eax),%mm4
  407.         movd ASM_NAME(COS9)+8,%mm5
  408.         punpckldq %mm5,%mm5
  409.         pfmul %mm5,%mm4
  410.         pfsub %mm4,%mm3
  411.         movq %mm2,%mm4
  412.         pfadd %mm3,%mm4
  413.         movq %mm7,%mm5
  414.         punpckldq ASM_NAME(tfcos36)+12,%mm5
  415.         pfmul %mm5,%mm4
  416.         movq %mm4,%mm5
  417.         pfacc %mm5,%mm5
  418.         movd 120(%edx),%mm6
  419.         punpckldq 92(%edx),%mm6
  420.         pfmul %mm6,%mm5
  421.         movd %mm5,48(%ecx)
  422.         psrlq $32,%mm5
  423.         movd %mm5,20(%ecx)
  424.         movq %mm4,%mm6
  425.         punpckldq %mm6,%mm5
  426.         pfsub %mm6,%mm5
  427.         punpckhdq %mm5,%mm5
  428.         movd 20(%edx),%mm6
  429.         punpckldq 48(%edx),%mm6
  430.         pfmul %mm6,%mm5
  431.         movd 20(%esi),%mm6
  432.         punpckldq 48(%esi),%mm6
  433.         pfadd %mm6,%mm5
  434.         movd %mm5,640(%ebx)
  435.         psrlq $32,%mm5
  436.         movd %mm5,1536(%ebx)
  437.         movq %mm3,%mm4
  438.         pfsub %mm2,%mm4
  439.         movq %mm7,%mm5
  440.         punpckldq ASM_NAME(tfcos36)+20,%mm5
  441.         pfmul %mm5,%mm4
  442.         movq %mm4,%mm5
  443.         pfacc %mm5,%mm5
  444.         movd 128(%edx),%mm6
  445.         punpckldq 84(%edx),%mm6
  446.         pfmul %mm6,%mm5
  447.         movd %mm5,56(%ecx)
  448.         psrlq $32,%mm5
  449.         movd %mm5,12(%ecx)
  450.         movq %mm4,%mm6
  451.         punpckldq %mm6,%mm5
  452.         pfsub %mm6,%mm5
  453.         punpckhdq %mm5,%mm5
  454.         movd 12(%edx),%mm6
  455.         punpckldq 56(%edx),%mm6
  456.         pfmul %mm6,%mm5
  457.         movd 12(%esi),%mm6
  458.         punpckldq 56(%esi),%mm6
  459.         pfadd %mm6,%mm5
  460.         movd %mm5,384(%ebx)
  461.         psrlq $32,%mm5
  462.         movd %mm5,1792(%ebx)
  463.  
  464.         movq (%eax),%mm4
  465.         movq 16(%eax),%mm3
  466.         pfsub %mm3,%mm4
  467.         movq 32(%eax),%mm3
  468.         pfadd %mm3,%mm4
  469.         movq 48(%eax),%mm3
  470.         pfsub %mm3,%mm4
  471.         movq 64(%eax),%mm3
  472.         pfadd %mm3,%mm4
  473.         movq %mm7,%mm5
  474.         punpckldq ASM_NAME(tfcos36)+16,%mm5
  475.         pfmul %mm5,%mm4
  476.         movq %mm4,%mm5
  477.         pfacc %mm5,%mm5
  478.         movd 124(%edx),%mm6
  479.         punpckldq 88(%edx),%mm6
  480.         pfmul %mm6,%mm5
  481.         movd %mm5,52(%ecx)
  482.         psrlq $32,%mm5
  483.         movd %mm5,16(%ecx)
  484.         movq %mm4,%mm6
  485.         punpckldq %mm6,%mm5
  486.         pfsub %mm6,%mm5
  487.         punpckhdq %mm5,%mm5
  488.         movd 16(%edx),%mm6
  489.         punpckldq 52(%edx),%mm6
  490.         pfmul %mm6,%mm5
  491.         movd 16(%esi),%mm6
  492.         punpckldq 52(%esi),%mm6
  493.         pfadd %mm6,%mm5
  494.         movd %mm5,512(%ebx)
  495.         psrlq $32,%mm5
  496.         movd %mm5,1664(%ebx)
  497.  
  498.         femms
  499.         popl %ebx
  500.         popl %esi
  501.         movl %ebp,%esp
  502.         popl %ebp
  503.         ret
  504.  
  505. NONEXEC_STACK
  506.