home *** CD-ROM | disk | FTP | other *** search
/ Magazyn Amiga 14 / MA_Cover_14.iso / source / c / q1source_amy / qw / server / math.s < prev    next >
Encoding:
Text File  |  1996-07-12  |  8.1 KB  |  332 lines

  1. //
  2. // math.s
  3. // x86 assembly-language math routines.
  4.  
  5. #include "asm_i386.h"
  6. #include "quakeasm.h"
  7.  
  8.  
  9. #if id386
  10.  
  11.     .data
  12.  
  13.     .align    4
  14. Ljmptab:    .long    Lcase0, Lcase1, Lcase2, Lcase3
  15.             .long    Lcase4, Lcase5, Lcase6, Lcase7
  16.  
  17.     .text
  18.  
  19.  
  20. #define EMINS    4+4
  21. #define EMAXS    4+8
  22. #define P        4+12
  23.  
  24.     .align 2
  25. .globl C(BoxOnPlaneSide)
  26. C(BoxOnPlaneSide):
  27.     pushl    %ebx
  28.  
  29.     movl    P(%esp),%edx
  30.     movl    EMINS(%esp),%ecx
  31.     xorl    %eax,%eax
  32.     movl    EMAXS(%esp),%ebx
  33.     movb    pl_signbits(%edx),%al
  34.     cmpl    $8,%al
  35.     jge        Lerror
  36.     flds    pl_normal(%edx)        // p->normal[0]
  37.     fld        %st(0)                // p->normal[0] | p->normal[0]
  38.     jmp        *Ljmptab(,%eax,4)
  39.  
  40.  
  41. //dist1= p->normal[0]*emaxs[0] + p->normal[1]*emaxs[1] + p->normal[2]*emaxs[2];
  42. //dist2= p->normal[0]*emins[0] + p->normal[1]*emins[1] + p->normal[2]*emins[2];
  43. Lcase0:
  44.     fmuls    (%ebx)                // p->normal[0]*emaxs[0] | p->normal[0]
  45.     flds    pl_normal+4(%edx)    // p->normal[1] | p->normal[0]*emaxs[0] |
  46.                                 //  p->normal[0]
  47.     fxch    %st(2)                // p->normal[0] | p->normal[0]*emaxs[0] |
  48.                                 //  p->normal[1]
  49.     fmuls    (%ecx)                // p->normal[0]*emins[0] |
  50.                                 //  p->normal[0]*emaxs[0] | p->normal[1]
  51.     fxch    %st(2)                // p->normal[1] | p->normal[0]*emaxs[0] |
  52.                                 //  p->normal[0]*emins[0]
  53.     fld        %st(0)                // p->normal[1] | p->normal[1] |
  54.                                 //  p->normal[0]*emaxs[0] |
  55.                                 //  p->normal[0]*emins[0]
  56.     fmuls    4(%ebx)                // p->normal[1]*emaxs[1] | p->normal[1] |
  57.                                 //  p->normal[0]*emaxs[0] |
  58.                                 //  p->normal[0]*emins[0]
  59.     flds    pl_normal+8(%edx)    // p->normal[2] | p->normal[1]*emaxs[1] |
  60.                                 //  p->normal[1] | p->normal[0]*emaxs[0] |
  61.                                 //  p->normal[0]*emins[0]
  62.     fxch    %st(2)                // p->normal[1] | p->normal[1]*emaxs[1] |
  63.                                 //  p->normal[2] | p->normal[0]*emaxs[0] |
  64.                                 //  p->normal[0]*emins[0]
  65.     fmuls    4(%ecx)                // p->normal[1]*emins[1] |
  66.                                 //  p->normal[1]*emaxs[1] |
  67.                                 //  p->normal[2] | p->normal[0]*emaxs[0] |
  68.                                 //  p->normal[0]*emins[0]
  69.     fxch    %st(2)                // p->normal[2] | p->normal[1]*emaxs[1] |
  70.                                 //  p->normal[1]*emins[1] |
  71.                                 //  p->normal[0]*emaxs[0] |
  72.                                 //  p->normal[0]*emins[0]
  73.     fld        %st(0)                // p->normal[2] | p->normal[2] |
  74.                                 //  p->normal[1]*emaxs[1] |
  75.                                 //  p->normal[1]*emins[1] |
  76.                                 //  p->normal[0]*emaxs[0] |
  77.                                 //  p->normal[0]*emins[0]
  78.     fmuls    8(%ebx)                // p->normal[2]*emaxs[2] |
  79.                                 //  p->normal[2] |
  80.                                 //  p->normal[1]*emaxs[1] |
  81.                                 //  p->normal[1]*emins[1] |
  82.                                 //  p->normal[0]*emaxs[0] |
  83.                                 //  p->normal[0]*emins[0]
  84.     fxch    %st(5)                // p->normal[0]*emins[0] |
  85.                                 //  p->normal[2] |
  86.                                 //  p->normal[1]*emaxs[1] |
  87.                                 //  p->normal[1]*emins[1] |
  88.                                 //  p->normal[0]*emaxs[0] |
  89.                                 //  p->normal[2]*emaxs[2]
  90.     faddp    %st(0),%st(3)        //p->normal[2] |
  91.                                 // p->normal[1]*emaxs[1] |
  92.                                 // p->normal[1]*emins[1]+p->normal[0]*emins[0]|
  93.                                 // p->normal[0]*emaxs[0] |
  94.                                 // p->normal[2]*emaxs[2]
  95.     fmuls    8(%ecx)                //p->normal[2]*emins[2] |
  96.                                 // p->normal[1]*emaxs[1] |
  97.                                 // p->normal[1]*emins[1]+p->normal[0]*emins[0]|
  98.                                 // p->normal[0]*emaxs[0] |
  99.                                 // p->normal[2]*emaxs[2]
  100.     fxch    %st(1)                //p->normal[1]*emaxs[1] |
  101.                                 // p->normal[2]*emins[2] |
  102.                                 // p->normal[1]*emins[1]+p->normal[0]*emins[0]|
  103.                                 // p->normal[0]*emaxs[0] |
  104.                                 // p->normal[2]*emaxs[2]
  105.     faddp    %st(0),%st(3)        //p->normal[2]*emins[2] |
  106.                                 // p->normal[1]*emins[1]+p->normal[0]*emins[0]|
  107.                                 // p->normal[0]*emaxs[0]+p->normal[1]*emaxs[1]|
  108.                                 // p->normal[2]*emaxs[2]
  109.     fxch    %st(3)                //p->normal[2]*emaxs[2] +
  110.                                 // p->normal[1]*emins[1]+p->normal[0]*emins[0]|
  111.                                 // p->normal[0]*emaxs[0]+p->normal[1]*emaxs[1]|
  112.                                 // p->normal[2]*emins[2]
  113.     faddp    %st(0),%st(2)        //p->normal[1]*emins[1]+p->normal[0]*emins[0]|
  114.                                 // dist1 | p->normal[2]*emins[2]
  115.  
  116.     jmp        LSetSides
  117.  
  118. //dist1= p->normal[0]*emins[0] + p->normal[1]*emaxs[1] + p->normal[2]*emaxs[2];
  119. //dist2= p->normal[0]*emaxs[0] + p->normal[1]*emins[1] + p->normal[2]*emins[2];
  120. Lcase1:
  121.     fmuls    (%ecx)                // emins[0]
  122.     flds    pl_normal+4(%edx)
  123.     fxch    %st(2)
  124.     fmuls    (%ebx)                // emaxs[0]
  125.     fxch    %st(2)
  126.     fld        %st(0)
  127.     fmuls    4(%ebx)                // emaxs[1]
  128.     flds    pl_normal+8(%edx)
  129.     fxch    %st(2)
  130.     fmuls    4(%ecx)                // emins[1]
  131.     fxch    %st(2)
  132.     fld        %st(0)
  133.     fmuls    8(%ebx)                // emaxs[2]
  134.     fxch    %st(5)
  135.     faddp    %st(0),%st(3)
  136.     fmuls    8(%ecx)                // emins[2]
  137.     fxch    %st(1)
  138.     faddp    %st(0),%st(3)
  139.     fxch    %st(3)
  140.     faddp    %st(0),%st(2)
  141.  
  142.     jmp        LSetSides
  143.  
  144. //dist1= p->normal[0]*emaxs[0] + p->normal[1]*emins[1] + p->normal[2]*emaxs[2];
  145. //dist2= p->normal[0]*emins[0] + p->normal[1]*emaxs[1] + p->normal[2]*emins[2];
  146. Lcase2:
  147.     fmuls    (%ebx)                // emaxs[0]
  148.     flds    pl_normal+4(%edx)
  149.     fxch    %st(2)
  150.     fmuls    (%ecx)                // emins[0]
  151.     fxch    %st(2)
  152.     fld        %st(0)
  153.     fmuls    4(%ecx)                // emins[1]
  154.     flds    pl_normal+8(%edx)
  155.     fxch    %st(2)
  156.     fmuls    4(%ebx)                // emaxs[1]
  157.     fxch    %st(2)
  158.     fld        %st(0)
  159.     fmuls    8(%ebx)                // emaxs[2]
  160.     fxch    %st(5)
  161.     faddp    %st(0),%st(3)
  162.     fmuls    8(%ecx)                // emins[2]
  163.     fxch    %st(1)
  164.     faddp    %st(0),%st(3)
  165.     fxch    %st(3)
  166.     faddp    %st(0),%st(2)
  167.  
  168.     jmp        LSetSides
  169.  
  170. //dist1= p->normal[0]*emins[0] + p->normal[1]*emins[1] + p->normal[2]*emaxs[2];
  171. //dist2= p->normal[0]*emaxs[0] + p->normal[1]*emaxs[1] + p->normal[2]*emins[2];
  172. Lcase3:
  173.     fmuls    (%ecx)                // emins[0]
  174.     flds    pl_normal+4(%edx)
  175.     fxch    %st(2)
  176.     fmuls    (%ebx)                // emaxs[0]
  177.     fxch    %st(2)
  178.     fld        %st(0)
  179.     fmuls    4(%ecx)                // emins[1]
  180.     flds    pl_normal+8(%edx)
  181.     fxch    %st(2)
  182.     fmuls    4(%ebx)                // emaxs[1]
  183.     fxch    %st(2)
  184.     fld        %st(0)
  185.     fmuls    8(%ebx)                // emaxs[2]
  186.     fxch    %st(5)
  187.     faddp    %st(0),%st(3)
  188.     fmuls    8(%ecx)                // emins[2]
  189.     fxch    %st(1)
  190.     faddp    %st(0),%st(3)
  191.     fxch    %st(3)
  192.     faddp    %st(0),%st(2)
  193.  
  194.     jmp        LSetSides
  195.  
  196. //dist1= p->normal[0]*emaxs[0] + p->normal[1]*emaxs[1] + p->normal[2]*emins[2];
  197. //dist2= p->normal[0]*emins[0] + p->normal[1]*emins[1] + p->normal[2]*emaxs[2];
  198. Lcase4:
  199.     fmuls    (%ebx)                // emaxs[0]
  200.     flds    pl_normal+4(%edx)
  201.     fxch    %st(2)
  202.     fmuls    (%ecx)                // emins[0]
  203.     fxch    %st(2)
  204.     fld        %st(0)
  205.     fmuls    4(%ebx)                // emaxs[1]
  206.     flds    pl_normal+8(%edx)
  207.     fxch    %st(2)
  208.     fmuls    4(%ecx)                // emins[1]
  209.     fxch    %st(2)
  210.     fld        %st(0)
  211.     fmuls    8(%ecx)                // emins[2]
  212.     fxch    %st(5)
  213.     faddp    %st(0),%st(3)
  214.     fmuls    8(%ebx)                // emaxs[2]
  215.     fxch    %st(1)
  216.     faddp    %st(0),%st(3)
  217.     fxch    %st(3)
  218.     faddp    %st(0),%st(2)
  219.  
  220.     jmp        LSetSides
  221.  
  222. //dist1= p->normal[0]*emins[0] + p->normal[1]*emaxs[1] + p->normal[2]*emins[2];
  223. //dist2= p->normal[0]*emaxs[0] + p->normal[1]*emins[1] + p->normal[2]*emaxs[2];
  224. Lcase5:
  225.     fmuls    (%ecx)                // emins[0]
  226.     flds    pl_normal+4(%edx)
  227.     fxch    %st(2)
  228.     fmuls    (%ebx)                // emaxs[0]
  229.     fxch    %st(2)
  230.     fld        %st(0)
  231.     fmuls    4(%ebx)                // emaxs[1]
  232.     flds    pl_normal+8(%edx)
  233.     fxch    %st(2)
  234.     fmuls    4(%ecx)                // emins[1]
  235.     fxch    %st(2)
  236.     fld        %st(0)
  237.     fmuls    8(%ecx)                // emins[2]
  238.     fxch    %st(5)
  239.     faddp    %st(0),%st(3)
  240.     fmuls    8(%ebx)                // emaxs[2]
  241.     fxch    %st(1)
  242.     faddp    %st(0),%st(3)
  243.     fxch    %st(3)
  244.     faddp    %st(0),%st(2)
  245.  
  246.     jmp        LSetSides
  247.  
  248. //dist1= p->normal[0]*emaxs[0] + p->normal[1]*emins[1] + p->normal[2]*emins[2];
  249. //dist2= p->normal[0]*emins[0] + p->normal[1]*emaxs[1] + p->normal[2]*emaxs[2];
  250. Lcase6:
  251.     fmuls    (%ebx)                // emaxs[0]
  252.     flds    pl_normal+4(%edx)
  253.     fxch    %st(2)
  254.     fmuls    (%ecx)                // emins[0]
  255.     fxch    %st(2)
  256.     fld        %st(0)
  257.     fmuls    4(%ecx)                // emins[1]
  258.     flds    pl_normal+8(%edx)
  259.     fxch    %st(2)
  260.     fmuls    4(%ebx)                // emaxs[1]
  261.     fxch    %st(2)
  262.     fld        %st(0)
  263.     fmuls    8(%ecx)                // emins[2]
  264.     fxch    %st(5)
  265.     faddp    %st(0),%st(3)
  266.     fmuls    8(%ebx)                // emaxs[2]
  267.     fxch    %st(1)
  268.     faddp    %st(0),%st(3)
  269.     fxch    %st(3)
  270.     faddp    %st(0),%st(2)
  271.  
  272.     jmp        LSetSides
  273.  
  274. //dist1= p->normal[0]*emins[0] + p->normal[1]*emins[1] + p->normal[2]*emins[2];
  275. //dist2= p->normal[0]*emaxs[0] + p->normal[1]*emaxs[1] + p->normal[2]*emaxs[2];
  276. Lcase7:
  277.     fmuls    (%ecx)                // emins[0]
  278.     flds    pl_normal+4(%edx)
  279.     fxch    %st(2)
  280.     fmuls    (%ebx)                // emaxs[0]
  281.     fxch    %st(2)
  282.     fld        %st(0)
  283.     fmuls    4(%ecx)                // emins[1]
  284.     flds    pl_normal+8(%edx)
  285.     fxch    %st(2)
  286.     fmuls    4(%ebx)                // emaxs[1]
  287.     fxch    %st(2)
  288.     fld        %st(0)
  289.     fmuls    8(%ecx)                // emins[2]
  290.     fxch    %st(5)
  291.     faddp    %st(0),%st(3)
  292.     fmuls    8(%ebx)                // emaxs[2]
  293.     fxch    %st(1)
  294.     faddp    %st(0),%st(3)
  295.     fxch    %st(3)
  296.     faddp    %st(0),%st(2)
  297.  
  298. LSetSides:
  299.  
  300. //    sides = 0;
  301. //    if (dist1 >= p->dist)
  302. //        sides = 1;
  303. //    if (dist2 < p->dist)
  304. //        sides |= 2;
  305.  
  306.     faddp    %st(0),%st(2)        // dist1 | dist2
  307.     fcomps    pl_dist(%edx)
  308.     xorl    %ecx,%ecx
  309.     fnstsw    %ax
  310.     fcomps    pl_dist(%edx)
  311.     andb    $1,%ah
  312.     xorb    $1,%ah
  313.     addb    %ah,%cl
  314.  
  315.     fnstsw    %ax
  316.     andb    $1,%ah
  317.     addb    %ah,%ah
  318.     addb    %ah,%cl
  319.  
  320. //    return sides;
  321.  
  322.     popl    %ebx
  323.     movl    %ecx,%eax    // return status
  324.  
  325.     ret
  326.  
  327.  
  328. Lerror:
  329.     call    C(BOPS_Error)
  330.  
  331. #endif    // id386
  332.