1/* 2 tabinit_mmx: make_decode_tables_mmx 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 the mysterious higway (apparently) 7 8 See synth_mmx.S about license history. 9*/ 10 11#include "mangle.h" 12 13.data 14 ALIGN32 15.globl ASM_NAME(costab_mmxsse) 16ASM_NAME(costab_mmxsse): 17 .long 1056974725 18 .long 1057056395 19 .long 1057223771 20 .long 1057485416 21 .long 1057855544 22 .long 1058356026 23 .long 1059019886 24 .long 1059897405 25 .long 1061067246 26 .long 1062657950 27 .long 1064892987 28 .long 1066774581 29 .long 1069414683 30 .long 1073984175 31 .long 1079645762 32 .long 1092815430 33 .long 1057005197 34 .long 1057342072 35 .long 1058087743 36 .long 1059427869 37 .long 1061799040 38 .long 1065862217 39 .long 1071413542 40 .long 1084439708 41 .long 1057128951 42 .long 1058664893 43 .long 1063675095 44 .long 1076102863 45 .long 1057655764 46 .long 1067924853 47 .long 1060439283 48 ALIGN32 49intwinbase: 50 .short 0, -1, -1, -1, -1, -1, -1, -2 51 .short -2, -2, -2, -3, -3, -4, -4, -5 52 .short -5, -6, -7, -7, -8, -9, -10, -11 53 .short -13, -14, -16, -17, -19, -21, -24, -26 54 .short -29, -31, -35, -38, -41, -45, -49, -53 55 .short -58, -63, -68, -73, -79, -85, -91, -97 56 .short -104, -111, -117, -125, -132, -139, -147, -154 57 .short -161, -169, -176, -183, -190, -196, -202, -208 58 .short -213, -218, -222, -225, -227, -228, -228, -227 59 .short -224, -221, -215, -208, -200, -189, -177, -163 60 .short -146, -127, -106, -83, -57, -29, 2, 36 61 .short 72, 111, 153, 197, 244, 294, 347, 401 62 .short 459, 519, 581, 645, 711, 779, 848, 919 63 .short 991, 1064, 1137, 1210, 1283, 1356, 1428, 1498 64 .short 1567, 1634, 1698, 1759, 1817, 1870, 1919, 1962 65 .short 2001, 2032, 2057, 2075, 2085, 2087, 2080, 2063 66 .short 2037, 2000, 1952, 1893, 1822, 1739, 1644, 1535 67 .short 1414, 1280, 1131, 970, 794, 605, 402, 185 68 .short -45, -288, -545, -814, -1095, -1388, -1692, -2006 69 .short -2330, -2663, -3004, -3351, -3705, -4063, -4425, -4788 70 .short -5153, -5517, -5879, -6237, -6589, -6935, -7271, -7597 71 .short -7910, -8209, -8491, -8755, -8998, -9219, -9416, -9585 72 .short -9727, -9838, -9916, -9959, -9966, -9935, -9863, -9750 73 .short -9592, -9389, -9139, -8840, -8492, -8092, -7640, -7134 74 .short -6574, -5959, -5288, -4561, -3776, -2935, -2037, -1082 75 .short -70, 998, 2122, 3300, 4533, 5818, 7154, 8540 76 .short 9975, 11455, 12980, 14548, 16155, 17799, 19478, 21189 77 .short 22929, 24694, 26482, 28289, 30112, 31947,-26209,-24360 78 .short -22511,-20664,-18824,-16994,-15179,-13383,-11610, -9863 79 .short -8147, -6466, -4822, -3222, -1667, -162, 1289, 2684 80 .short 4019, 5290, 6494, 7629, 8692, 9679, 10590, 11420 81 .short 12169, 12835, 13415, 13908, 14313, 14630, 14856, 14992 82 .short 15038 83 84intwindiv: 85 .long 0x47800000 # 65536.0 86.text 87 ALIGN32 88/* void make_decode_tables_mmx_asm(long scaleval, float* decwin_mmx, float *decwins); */ 89.globl ASM_NAME(make_decode_tables_mmx_asm) 90ASM_NAME(make_decode_tables_mmx_asm): 91 pushl %ebp 92 mov %esp,%ebp 93 sub $12,%esp 94 pushl %edi 95 pushl %esi 96 pushl %ebx 97 98 GET_GOT 99 lea LOCAL_VAR(intwinbase),%edi 100 mov LOCAL_VAR(intwindiv),%ecx 101 mov %edi,-4(%ebp) 102 lea 444(%edi),%eax 103 mov %eax,-8(%ebp) 104 mov %ecx,-12(%ebp) 105 106/* stack: -12(%ebp)=*intwindiv, -8(%ebp)=intwinbase+444, -4(%ebp)=intwinbase, ... , 107 4(%ebp)=back, 8(%ebp)=scaleval, 12(%ebp)=decwin_mmx, 16(%ebp)=decwins */ 108#define INTWINDIV -12(%ebp) 109#define INTWINBASE_PLUS_444 -8(%ebp) 110#define INTWINBASE -4(%ebp) 111#define SCALEVAL 8(%ebp) 112#define DECWIN_MMX 12(%ebp) 113#define DECWINS 16(%ebp) 114 115 xorl %ecx,%ecx 116 xorl %ebx,%ebx 117 movl $32,%esi 118 119 negl SCALEVAL /* scaleval */ 120 pushl $2 /* intwinbase step */ 121.L00: 122 cmpl $528,%ecx 123 jnc .L02 124 movswl (%edi),%eax 125 cmpl INTWINBASE_PLUS_444,%edi 126 jc .L01 127 addl $60000,%eax 128.L01: 129 pushl %eax 130 fildl (%esp) 131 fdivs INTWINDIV 132 fimull SCALEVAL /* scaleval */ 133/* eax used to be popped the line before... I'll just use it here a bit */ 134 movl DECWIN_MMX,%eax /* decwin_mmx */ 135 fsts (%eax,%ecx,4) 136 fstps 64(%eax,%ecx,4) 137 popl %eax 138.L02: 139 leal -1(%esi),%edx 140 andl %ebx,%edx 141 cmpl $31,%edx 142 jnz .L03 143 addl $-1023,%ecx 144 testl %esi,%ebx 145 jz .L03 146 negl SCALEVAL 147.L03: 148 addl %esi,%ecx 149 addl (%esp),%edi 150 incl %ebx 151 cmpl INTWINBASE,%edi 152 jz .L04 153 cmpl $256,%ebx 154 jnz .L00 155 negl (%esp) 156 jmp .L00 157.L04: 158 popl %eax 159 160 xorl %ecx,%ecx 161 xorl %ebx,%ebx 162 pushl $2 /* paired with popl above */ 163.L05: 164 cmpl $528,%ecx 165 jnc .L11 166 movswl (%edi),%eax 167 cmpl INTWINBASE_PLUS_444,%edi 168 jc .L06 169 addl $60000,%eax 170.L06: 171 cltd 172 imull SCALEVAL 173 shrdl $17,%edx,%eax 174 cmpl $32767,%eax 175 movl $1055,%edx 176 jle .L07 177 movl $32767,%eax 178 jmp .L08 179.L07: 180 cmpl $-32767,%eax 181 jge .L08 182 movl $-32767,%eax 183.L08: 184/* going to use ebx for decwins, watch the jumps */ 185 pushl %ebx 186 movl DECWINS,%ebx 187 cmpl $512,%ecx 188 jnc .L09 189 subl %ecx,%edx 190 movw %ax,(%ebx,%edx,2) /* decwins */ 191 movw %ax,-32(%ebx,%edx,2) 192.L09: 193 testl $1,%ecx 194 jnz .L10 195 negl %eax 196.L10: 197 movw %ax,(%ebx,%ecx,2) 198 movw %ax,32(%ebx,%ecx,2) 199 popl %ebx /* that has to match the pushl before */ 200.L11: 201 leal -1(%esi),%edx 202 andl %ebx,%edx 203 cmpl $31,%edx 204 jnz .L12 205 addl $-1023,%ecx 206 testl %esi,%ebx 207 jz .L12 208 negl SCALEVAL 209.L12: 210 addl %esi,%ecx 211 addl (%esp),%edi 212 incl %ebx 213 cmpl INTWINBASE,%edi 214 jz .L13 215 cmpl $256,%ebx 216 jnz .L05 217 negl (%esp) 218 jmp .L05 219.L13: 220 popl %eax 221 222 popl %ebx 223 popl %esi 224 popl %edi 225 mov %ebp,%esp 226 pop %ebp 227 ret 228 229NONEXEC_STACK 230