1 
   2 
   3 
   4 
   5 
   6 
   7 
   8 
   9 
  10 
  11 
  12 
  13 
  14 
  15 
  16 
  17 
  18 
  19 
  20 
  21 
  22 
  23 
  24 
  25         .file   "polynomial_Xsig.S"
  26 
  27 #include "fpu_emu.h"
  28 
  29 
  30 #define TERM_SIZE       $8
  31 #define SUM_MS          -20(%ebp)       
  32 #define SUM_MIDDLE      -24(%ebp)       
  33 #define SUM_LS          -28(%ebp)       
  34 #define ACCUM_MS        -4(%ebp)        
  35 #define ACCUM_MIDDLE    -8(%ebp)        
  36 #define ACCUM_LS        -12(%ebp)       
  37 #define OVERFLOWED      -16(%ebp)       
  38 
  39 .text
  40 ENTRY(polynomial_Xsig)
  41         pushl   %ebp
  42         movl    %esp,%ebp
  43         subl    $32,%esp
  44         pushl   %esi
  45         pushl   %edi
  46         pushl   %ebx
  47 
  48         movl    PARAM2,%esi             
  49         movl    PARAM3,%edi             
  50 
  51         movl    TERM_SIZE,%eax
  52         mull    PARAM4                  
  53         addl    %eax,%edi
  54 
  55         movl    4(%edi),%edx            
  56         movl    %edx,SUM_MS
  57         movl    (%edi),%edx             
  58         movl    %edx,SUM_MIDDLE
  59         xor     %eax,%eax
  60         movl    %eax,SUM_LS
  61         movb    %al,OVERFLOWED
  62 
  63         subl    TERM_SIZE,%edi
  64         decl    PARAM4
  65         js      L_accum_done
  66 
  67 L_accum_loop:
  68         xor     %eax,%eax
  69         movl    %eax,ACCUM_MS
  70         movl    %eax,ACCUM_MIDDLE
  71 
  72         movl    SUM_MIDDLE,%eax
  73         mull    (%esi)                  
  74         movl    %edx,ACCUM_LS
  75 
  76         movl    SUM_MIDDLE,%eax
  77         mull    4(%esi)                 
  78         addl    %eax,ACCUM_LS
  79         adcl    %edx,ACCUM_MIDDLE
  80         adcl    $0,ACCUM_MS
  81 
  82         movl    SUM_MS,%eax
  83         mull    (%esi)                  
  84         addl    %eax,ACCUM_LS
  85         adcl    %edx,ACCUM_MIDDLE
  86         adcl    $0,ACCUM_MS
  87 
  88         movl    SUM_MS,%eax
  89         mull    4(%esi)                 
  90         addl    %eax,ACCUM_MIDDLE
  91         adcl    %edx,ACCUM_MS
  92 
  93         testb   $0xff,OVERFLOWED
  94         jz      L_no_overflow
  95 
  96         movl    (%esi),%eax
  97         addl    %eax,ACCUM_MIDDLE
  98         movl    4(%esi),%eax
  99         adcl    %eax,ACCUM_MS           
 100 
 101 L_no_overflow:
 102 
 103 
 104 
 105 
 106 
 107         movl    ACCUM_LS,%eax
 108         addl    (%edi),%eax             
 109         movl    %eax,SUM_LS
 110         movl    ACCUM_MIDDLE,%eax
 111         adcl    (%edi),%eax             
 112         movl    %eax,SUM_MIDDLE
 113         movl    ACCUM_MS,%eax
 114         adcl    4(%edi),%eax            
 115         movl    %eax,SUM_MS
 116         sbbb    %al,%al
 117         movb    %al,OVERFLOWED          
 118 
 119         subl    TERM_SIZE,%edi
 120         decl    PARAM4
 121         jns     L_accum_loop
 122 
 123 L_accum_done:
 124         movl    PARAM1,%edi             
 125         movl    SUM_LS,%eax
 126         addl    %eax,(%edi)
 127         movl    SUM_MIDDLE,%eax
 128         adcl    %eax,4(%edi)
 129         movl    SUM_MS,%eax
 130         adcl    %eax,8(%edi)
 131 
 132         popl    %ebx
 133         popl    %edi
 134         popl    %esi
 135         leave
 136         ret
 137 ENDPROC(polynomial_Xsig)