Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1.  
  2. /*
  3.  * Mesa 3-D graphics library
  4.  *
  5.  * Copyright (C) 1999-2001  Brian Paul   All Rights Reserved.
  6.  *
  7.  * Permission is hereby granted, free of charge, to any person obtaining a
  8.  * copy of this software and associated documentation files (the "Software"),
  9.  * to deal in the Software without restriction, including without limitation
  10.  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  11.  * and/or sell copies of the Software, and to permit persons to whom the
  12.  * Software is furnished to do so, subject to the following conditions:
  13.  *
  14.  * The above copyright notice and this permission notice shall be included
  15.  * in all copies or substantial portions of the Software.
  16.  *
  17.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  18.  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  19.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  20.  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
  21.  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  22.  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  23.  * OTHER DEALINGS IN THE SOFTWARE.
  24.  */
  25.  
  26. #ifdef USE_3DNOW_ASM
  27. #include "assyntax.h"
  28. #include "matypes.h"
  29. #include "xform_args.h"
  30.  
  31.     SEG_TEXT
  32.  
  33. #define FRAME_OFFSET    4
  34.  
  35.  
  36. ALIGNTEXT16
  37. GLOBL GLNAME( _mesa_3dnow_transform_points1_general )
  38. HIDDEN(_mesa_3dnow_transform_points1_general)
  39. GLNAME( _mesa_3dnow_transform_points1_general ):
  40.  
  41.     PUSH_L    ( ESI )
  42.  
  43.     MOV_L     ( ARG_DEST, ECX )
  44.     MOV_L     ( ARG_MATRIX, ESI )
  45.     MOV_L     ( ARG_SOURCE, EAX )
  46.     MOV_L     ( CONST(4), REGOFF(V4F_SIZE, ECX) )
  47.     OR_B      ( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, ECX) )
  48.     MOV_L     ( REGOFF(V4F_COUNT, EAX), EDX )
  49.     MOV_L     ( EDX, REGOFF(V4F_COUNT, ECX) )
  50.  
  51.     PUSH_L    ( EDI )
  52.  
  53.     MOV_L     ( REGOFF(4, ECX), EDX )
  54.     MOV_L     ( ESI, ECX )
  55.     MOV_L     ( REGOFF(V4F_COUNT, EAX), ESI )
  56.     MOV_L     ( REGOFF(V4F_STRIDE, EAX), EDI )
  57.     MOV_L     ( REGOFF(V4F_START, EAX), EAX )
  58.  
  59.     TEST_L    ( ESI, ESI )
  60.     JZ        ( LLBL( G3TPGR_3 ) )
  61.  
  62.     MOVQ      ( REGIND(ECX), MM0 )      /* m01             | m00             */
  63.     MOVQ      ( REGOFF(8, ECX), MM1 )   /* m03             | m02             */
  64.  
  65.     MOVQ      ( REGOFF(48, ECX), MM2 )  /* m31             | m30             */
  66.     MOVQ      ( REGOFF(56, ECX), MM3 )  /* m33             | m32             */
  67.  
  68. ALIGNTEXT16
  69. LLBL( G3TPGR_2 ):
  70.  
  71.     MOVD      ( REGIND(EAX), MM4 )      /*                 | x0              */
  72.     PUNPCKLDQ ( MM4, MM4 )              /* x0              | x0              */
  73.  
  74.     MOVQ      ( MM4, MM5 )              /* x0              | x0              */
  75.     PFMUL     ( MM0, MM4 )              /* x0*m01          | x0*m00          */
  76.  
  77.     PFMUL     ( MM1, MM5 )              /* x0*m03          | x0*m02          */
  78.     PFADD     ( MM2, MM4 )              /* x0*m01+m31      | x0*m00+m30      */
  79.  
  80.     PFADD     ( MM3, MM5 )              /* x0*m03+m33      | x0*m02+m32      */
  81.     MOVQ      ( MM4, REGIND(EDX) )      /* write r1, r0                      */
  82.  
  83.     MOVQ      ( MM5, REGOFF(8, EDX) )   /* write r3, r2                      */
  84.     ADD_L     ( EDI, EAX )              /* next vertex                       */
  85.  
  86.     ADD_L     ( CONST(16), EDX )        /* next r                            */
  87.     DEC_L     ( ESI )                   /* decrement vertex counter          */
  88.  
  89.     JNZ       ( LLBL( G3TPGR_2 ) )      /* cnt > 0 ? -> process next vertex  */
  90.  
  91. LLBL( G3TPGR_3 ):
  92.  
  93.     FEMMS
  94.     POP_L     ( EDI )
  95.     POP_L     ( ESI )
  96.     RET
  97.  
  98.  
  99.  
  100.  
  101. ALIGNTEXT16
  102. GLOBL GLNAME( _mesa_3dnow_transform_points1_identity )
  103. HIDDEN(_mesa_3dnow_transform_points1_identity)
  104. GLNAME( _mesa_3dnow_transform_points1_identity ):
  105.  
  106.     PUSH_L    ( ESI )
  107.  
  108.     MOV_L     ( ARG_DEST, ECX )
  109.     MOV_L     ( ARG_MATRIX, ESI )
  110.     MOV_L     ( ARG_SOURCE, EAX )
  111.     MOV_L     ( CONST(1), REGOFF(V4F_SIZE, ECX) )
  112.     OR_B      ( CONST(VEC_SIZE_1), REGOFF(V4F_FLAGS, ECX) )
  113.     MOV_L     ( REGOFF(V4F_COUNT, EAX), EDX )
  114.     MOV_L     ( EDX, REGOFF(V4F_COUNT, ECX) )
  115.  
  116.     PUSH_L    ( EDI )
  117.  
  118.     MOV_L     ( REGOFF(4, ECX), EDX )
  119.     MOV_L     ( ESI, ECX )
  120.     MOV_L     ( REGOFF(V4F_COUNT, EAX), ESI )
  121.     MOV_L     ( REGOFF(V4F_STRIDE, EAX), EDI )
  122.     MOV_L     ( REGOFF(V4F_START, EAX), EAX )
  123.  
  124.     TEST_L    ( ESI, ESI )
  125.     JZ        ( LLBL( G3TPIR_4) )
  126.  
  127. ALIGNTEXT16
  128. LLBL( G3TPIR_3 ):
  129.  
  130.     MOVD      ( REGIND(EAX), MM0 )      /*                 | x0              */
  131.     ADD_L     ( EDI, EAX )              /* next vertex                       */
  132.  
  133.     MOVD      ( MM0, REGIND(EDX) )      /*                 | r0              */
  134.     ADD_L     ( CONST(16), EDX )        /* next r                            */
  135.  
  136.     DEC_L     ( ESI )                   /* decrement vertex counter          */
  137.     JNZ       ( LLBL( G3TPIR_3 ) )      /* cnt > 0 ? -> process next vertex  */
  138.  
  139. LLBL( G3TPIR_4 ):
  140.  
  141.     FEMMS
  142.     POP_L     ( EDI )
  143.     POP_L     ( ESI )
  144.     RET
  145.  
  146.  
  147.  
  148.  
  149. ALIGNTEXT16
  150. GLOBL GLNAME( _mesa_3dnow_transform_points1_3d_no_rot )
  151. HIDDEN(_mesa_3dnow_transform_points1_3d_no_rot)
  152. GLNAME( _mesa_3dnow_transform_points1_3d_no_rot ):
  153.  
  154.     PUSH_L    ( ESI )
  155.  
  156.     MOV_L     ( ARG_DEST, ECX )
  157.     MOV_L     ( ARG_MATRIX, ESI )
  158.     MOV_L     ( ARG_SOURCE, EAX )
  159.     MOV_L     ( CONST(3), REGOFF(V4F_SIZE, ECX) )
  160.     OR_B      ( CONST(VEC_SIZE_3), REGOFF(V4F_FLAGS, ECX) )
  161.     MOV_L     ( REGOFF(V4F_COUNT, EAX), EDX )
  162.     MOV_L     ( EDX, REGOFF(V4F_COUNT, ECX) )
  163.  
  164.     PUSH_L    ( EDI )
  165.  
  166.     MOV_L     ( REGOFF(4, ECX), EDX )
  167.     MOV_L     ( ESI, ECX )
  168.     MOV_L     ( REGOFF(V4F_COUNT, EAX), ESI )
  169.     MOV_L     ( REGOFF(V4F_STRIDE, EAX), EDI )
  170.     MOV_L     ( REGOFF(V4F_START, EAX), EAX )
  171.  
  172.     TEST_L    ( ESI, ESI )
  173.     JZ        ( LLBL( G3TP3NRR_3 ) )
  174.  
  175.     MOVD      ( REGIND(ECX), MM0 )      /*                 | m00             */
  176.     MOVQ      ( REGOFF(48, ECX), MM2 )  /* m31             | m30             */
  177.  
  178.     MOVD      ( REGOFF(56, ECX), MM3 )  /*                 | m32             */
  179.  
  180. ALIGNTEXT16
  181. LLBL( G3TP3NRR_2 ):
  182.  
  183.     MOVD      ( REGIND(EAX), MM4 )      /*                 | x0              */
  184.     PFMUL     ( MM0, MM4 )              /*                 | x0*m00          */
  185.  
  186.     PFADD     ( MM2, MM4 )              /* m31             | x0*m00+m30      */
  187.     MOVQ      ( MM4, REGIND(EDX) )      /* write r1, r0                      */
  188.  
  189.     MOVD      ( MM3, REGOFF(8, EDX) )   /* write r2                          */
  190.     ADD_L     ( EDI, EAX )              /* next vertex                       */
  191.  
  192.     ADD_L     ( CONST(16), EDX )        /* next r                            */
  193.     DEC_L     ( ESI )                   /* decrement vertex counter          */
  194.  
  195.     JNZ       ( LLBL( G3TP3NRR_2 ) )    /* cnt > 0 ? -> process next vertex  */
  196.  
  197. LLBL( G3TP3NRR_3 ):
  198.  
  199.     FEMMS
  200.     POP_L     ( EDI )
  201.     POP_L     ( ESI )
  202.     RET
  203.  
  204.  
  205.  
  206.  
  207. ALIGNTEXT16
  208. GLOBL GLNAME( _mesa_3dnow_transform_points1_perspective )
  209. HIDDEN(_mesa_3dnow_transform_points1_perspective)
  210. GLNAME( _mesa_3dnow_transform_points1_perspective ):
  211.  
  212.     PUSH_L    ( ESI )
  213.  
  214.     MOV_L     ( ARG_DEST, ECX )
  215.     MOV_L     ( ARG_MATRIX, ESI )
  216.     MOV_L     ( ARG_SOURCE, EAX )
  217.     MOV_L     ( CONST(4), REGOFF(V4F_SIZE, ECX) )
  218.     OR_B      ( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, ECX) )
  219.     MOV_L     ( REGOFF(V4F_COUNT, EAX), EDX )
  220.     MOV_L     ( EDX, REGOFF(V4F_COUNT, ECX) )
  221.  
  222.     PUSH_L    ( EDI )
  223.  
  224.     MOV_L     ( REGOFF(4, ECX), EDX )
  225.     MOV_L     ( ESI, ECX )
  226.     MOV_L     ( REGOFF(V4F_COUNT, EAX), ESI )
  227.     MOV_L     ( REGOFF(V4F_STRIDE, EAX), EDI )
  228.     MOV_L     ( REGOFF(V4F_START, EAX), EAX )
  229.  
  230.     TEST_L    ( ESI, ESI )
  231.     JZ        ( LLBL( G3TPPR_3 ) )
  232.  
  233.     MOVD      ( REGIND(ECX), MM0 )      /*                 | m00             */
  234.     MOVD      ( REGOFF(56, ECX), MM3 )  /*                 | m32             */
  235.  
  236. ALIGNTEXT16
  237. LLBL( G3TPPR_2 ):
  238.  
  239.     MOVD      ( REGIND(EAX), MM4 )      /* 0               | x0              */
  240.     PFMUL     ( MM0, MM4 )              /* 0               | x0*m00          */
  241.  
  242.     MOVQ      ( MM4, REGIND(EDX) )      /* write r1, r0                      */
  243.     MOVQ      ( MM3, REGOFF(8, EDX) )   /* write r2  (=m32), r3 (=0)         */
  244.  
  245.     ADD_L     ( EDI, EAX )              /* next vertex                       */
  246.     ADD_L     ( CONST(16), EDX )        /* next r                            */
  247.  
  248.     DEC_L     ( ESI )                   /* decrement vertex counter          */
  249.     JNZ       ( LLBL( G3TPPR_2 ) )      /* cnt > 0 ? -> process next vertex  */
  250.  
  251. LLBL( G3TPPR_3 ):
  252.  
  253.     FEMMS
  254.     POP_L     ( EDI )
  255.     POP_L     ( ESI )
  256.     RET
  257.  
  258.  
  259.  
  260.  
  261. ALIGNTEXT16
  262. GLOBL GLNAME( _mesa_3dnow_transform_points1_2d )
  263. HIDDEN(_mesa_3dnow_transform_points1_2d)
  264. GLNAME( _mesa_3dnow_transform_points1_2d ):
  265.  
  266.     PUSH_L    ( ESI )
  267.  
  268.     MOV_L     ( ARG_DEST, ECX )
  269.     MOV_L     ( ARG_MATRIX, ESI )
  270.     MOV_L     ( ARG_SOURCE, EAX )
  271.     MOV_L     ( CONST(2), REGOFF(V4F_SIZE, ECX) )
  272.     OR_B      ( CONST(VEC_SIZE_2), REGOFF(V4F_FLAGS, ECX) )
  273.     MOV_L     ( REGOFF(V4F_COUNT, EAX), EDX )
  274.     MOV_L     ( EDX, REGOFF(V4F_COUNT, ECX) )
  275.  
  276.     PUSH_L    ( EDI )
  277.  
  278.     MOV_L     ( REGOFF(4, ECX), EDX )
  279.     MOV_L     ( ESI, ECX )
  280.     MOV_L     ( REGOFF(V4F_COUNT, EAX), ESI )
  281.     MOV_L     ( REGOFF(V4F_STRIDE, EAX), EDI )
  282.     MOV_L     ( REGOFF(V4F_START, EAX), EAX )
  283.  
  284.     TEST_L    ( ESI, ESI )
  285.     JZ        ( LLBL( G3TP2R_3 ) )
  286.  
  287.     MOVQ      ( REGIND(ECX), MM0 )      /* m01             | m00             */
  288.     MOVQ      ( REGOFF(48, ECX), MM2 )  /* m31             | m30             */
  289.  
  290. ALIGNTEXT16
  291. LLBL( G3TP2R_2 ):
  292.  
  293.     MOVD      ( REGIND(EAX), MM4 )      /*                 | x0              */
  294.     PUNPCKLDQ ( MM4, MM4 )              /* x0              | x0              */
  295.  
  296.     PFMUL     ( MM0, MM4 )              /* x0*m01          | x0*m00          */
  297.     PFADD     ( MM2, MM4 )              /* x0*m01+m31      | x0*m00+m30      */
  298.  
  299.     MOVQ      ( MM4, REGIND(EDX) )      /* write r1, r0                      */
  300.     ADD_L     ( EDI, EAX )              /* next vertex                       */
  301.  
  302.     ADD_L     ( CONST(16), EDX )        /* next r                            */
  303.     DEC_L     ( ESI )                   /* decrement vertex counter          */
  304.  
  305.     JNZ       ( LLBL( G3TP2R_2 ) )      /* cnt > 0 ? -> process next vertex  */
  306.  
  307. LLBL( G3TP2R_3 ):
  308.  
  309.     FEMMS
  310.     POP_L     ( EDI )
  311.     POP_L     ( ESI )
  312.     RET
  313.  
  314.  
  315.  
  316.  
  317. ALIGNTEXT16
  318. GLOBL GLNAME( _mesa_3dnow_transform_points1_2d_no_rot )
  319. HIDDEN(_mesa_3dnow_transform_points1_2d_no_rot)
  320. GLNAME( _mesa_3dnow_transform_points1_2d_no_rot ):
  321.  
  322.     PUSH_L    ( ESI )
  323.  
  324.     MOV_L     ( ARG_DEST, ECX )
  325.     MOV_L     ( ARG_MATRIX, ESI )
  326.     MOV_L     ( ARG_SOURCE, EAX )
  327.     MOV_L     ( CONST(2), REGOFF(V4F_SIZE, ECX) )
  328.     OR_B      ( CONST(VEC_SIZE_2), REGOFF(V4F_FLAGS, ECX) )
  329.     MOV_L     ( REGOFF(V4F_COUNT, EAX), EDX )
  330.     MOV_L     ( EDX, REGOFF(V4F_COUNT, ECX) )
  331.  
  332.     PUSH_L    ( EDI )
  333.  
  334.     MOV_L     ( REGOFF(4, ECX), EDX )
  335.     MOV_L     ( ESI, ECX )
  336.     MOV_L     ( REGOFF(V4F_COUNT, EAX), ESI )
  337.     MOV_L     ( REGOFF(V4F_STRIDE, EAX), EDI )
  338.     MOV_L     ( REGOFF(V4F_START, EAX), EAX )
  339.  
  340.     TEST_L    ( ESI, ESI )
  341.     JZ        ( LLBL( G3TP2NRR_3 ) )
  342.  
  343.     MOVD      ( REGIND(ECX), MM0 )      /*                 | m00             */
  344.     MOVQ      ( REGOFF(48, ECX), MM2 )  /* m31             | m30             */
  345.  
  346. ALIGNTEXT16
  347. LLBL( G3TP2NRR_2 ):
  348.  
  349.     MOVD      ( REGIND(EAX), MM4 )      /*                 | x0              */
  350.     ADD_L     ( EDI, EAX )              /* next vertex                       */
  351.  
  352.     PFMUL     ( MM0, MM4 )              /*                 | x0*m00          */
  353.     PFADD     ( MM2, MM4 )              /* m31             | x0*m00+m30      */
  354.  
  355.     MOVQ      ( MM4, REGIND(EDX) )      /* write r1, r0                      */
  356.     ADD_L     ( CONST(16), EDX )        /* next r                            */
  357.  
  358.     DEC_L     ( ESI )                   /* decrement vertex counter          */
  359.     JNZ       ( LLBL( G3TP2NRR_2 ) )    /* cnt > 0 ? -> process next vertex  */
  360.  
  361. LLBL( G3TP2NRR_3 ):
  362.  
  363.     FEMMS
  364.     POP_L     ( EDI )
  365.     POP_L     ( ESI )
  366.     RET
  367.  
  368.  
  369.  
  370.  
  371. ALIGNTEXT16
  372. GLOBL GLNAME( _mesa_3dnow_transform_points1_3d )
  373. HIDDEN(_mesa_3dnow_transform_points1_3d)
  374. GLNAME( _mesa_3dnow_transform_points1_3d ):
  375.  
  376.     PUSH_L    ( ESI )
  377.  
  378.     MOV_L     ( ARG_DEST, ECX )
  379.     MOV_L     ( ARG_MATRIX, ESI )
  380.     MOV_L     ( ARG_SOURCE, EAX )
  381.     MOV_L     ( CONST(3), REGOFF(V4F_SIZE, ECX) )
  382.     OR_B      ( CONST(VEC_SIZE_3), REGOFF(V4F_FLAGS, ECX) )
  383.     MOV_L     ( REGOFF(V4F_COUNT, EAX), EDX )
  384.     MOV_L     ( EDX, REGOFF(V4F_COUNT, ECX) )
  385.  
  386.     PUSH_L    ( EDI )
  387.  
  388.     MOV_L     ( REGOFF(4, ECX), EDX )
  389.     MOV_L     ( ESI, ECX )
  390.     MOV_L     ( REGOFF(V4F_COUNT, EAX), ESI )
  391.     MOV_L     ( REGOFF(V4F_STRIDE, EAX), EDI )
  392.     MOV_L     ( REGOFF(V4F_START, EAX), EAX )
  393.  
  394.     TEST_L    ( ESI, ESI )
  395.     JZ        ( LLBL( G3TP3R_3 ) )
  396.  
  397.     MOVQ      ( REGIND(ECX), MM0 )      /* m01             | m00             */
  398.     MOVD      ( REGOFF(8, ECX), MM1 )   /*                 | m02             */
  399.  
  400.     MOVQ      ( REGOFF(48, ECX), MM2 )  /* m31             | m30             */
  401.     MOVD      ( REGOFF(56, ECX), MM3 )  /*                 | m32             */
  402.  
  403. ALIGNTEXT16
  404. LLBL( G3TP3R_2 ):
  405.  
  406.     MOVD      ( REGIND(EAX), MM4 )      /*                 | x0              */
  407.     PUNPCKLDQ ( MM4, MM4 )              /* x0              | x0              */
  408.  
  409.     MOVQ      ( MM4, MM5 )              /*                 | x0              */
  410.     PFMUL     ( MM0, MM4 )              /* x0*m01          | x0*m00          */
  411.  
  412.     PFMUL     ( MM1, MM5 )              /*                 | x0*m02          */
  413.     PFADD     ( MM2, MM4 )              /* x0*m01+m31      | x0*m00+m30      */
  414.  
  415.     PFADD     ( MM3, MM5 )              /*                 | x0*m02+m32      */
  416.     MOVQ      ( MM4, REGIND(EDX) )      /* write r1, r0                      */
  417.  
  418.     MOVD      ( MM5, REGOFF(8, EDX) )   /* write r2                          */
  419.     ADD_L     ( EDI, EAX )              /* next vertex                       */
  420.  
  421.     ADD_L     ( CONST(16), EDX )        /* next r                            */
  422.     DEC_L     ( ESI )                   /* decrement vertex counter          */
  423.  
  424.     JNZ       ( LLBL( G3TP3R_2 ) )      /* cnt > 0 ? -> process next vertex  */
  425.  
  426. LLBL( G3TP3R_3 ):
  427.  
  428.     FEMMS
  429.     POP_L     ( EDI )
  430.     POP_L     ( ESI )
  431.     RET
  432.  
  433. #endif
  434.        
  435. #if defined (__ELF__) && defined (__linux__)
  436.         .section .note.GNU-stack,"",%progbits
  437. #endif
  438.