^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*---------------------------------------------------------------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) | mul_Xsig.S |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) | |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) | Multiply a 12 byte fixed point number by another fixed point number. |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) | |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) | Copyright (C) 1992,1994,1995 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) | W. Metzenthen, 22 Parker St, Ormond, Vic 3163, |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) | Australia. E-mail billm@jacobi.maths.monash.edu.au |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) | |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) | Call from C as: |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) | void mul32_Xsig(Xsig *x, unsigned b) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) | |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) | void mul64_Xsig(Xsig *x, unsigned long long *b) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) | |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) | void mul_Xsig_Xsig(Xsig *x, unsigned *b) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) | |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) | The result is neither rounded nor normalized, and the ls bit or so may |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) | be wrong. |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) | |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) +---------------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) .file "mul_Xsig.S"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #include "fpu_emu.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) .text
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) SYM_FUNC_START(mul32_Xsig)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) pushl %ebp
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) movl %esp,%ebp
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) subl $16,%esp
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) pushl %esi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) movl PARAM1,%esi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) movl PARAM2,%ecx
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) xor %eax,%eax
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) movl %eax,-4(%ebp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) movl %eax,-8(%ebp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) movl (%esi),%eax /* lsl of Xsig */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) mull %ecx /* msl of b */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) movl %edx,-12(%ebp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) movl 4(%esi),%eax /* midl of Xsig */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) mull %ecx /* msl of b */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) addl %eax,-12(%ebp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) adcl %edx,-8(%ebp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) adcl $0,-4(%ebp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) movl 8(%esi),%eax /* msl of Xsig */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) mull %ecx /* msl of b */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) addl %eax,-8(%ebp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) adcl %edx,-4(%ebp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) movl -12(%ebp),%eax
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) movl %eax,(%esi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) movl -8(%ebp),%eax
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) movl %eax,4(%esi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) movl -4(%ebp),%eax
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) movl %eax,8(%esi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) popl %esi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) leave
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) ret
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) SYM_FUNC_END(mul32_Xsig)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) SYM_FUNC_START(mul64_Xsig)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) pushl %ebp
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) movl %esp,%ebp
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) subl $16,%esp
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) pushl %esi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) movl PARAM1,%esi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) movl PARAM2,%ecx
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) xor %eax,%eax
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) movl %eax,-4(%ebp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) movl %eax,-8(%ebp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) movl (%esi),%eax /* lsl of Xsig */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) mull 4(%ecx) /* msl of b */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) movl %edx,-12(%ebp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) movl 4(%esi),%eax /* midl of Xsig */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) mull (%ecx) /* lsl of b */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) addl %edx,-12(%ebp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) adcl $0,-8(%ebp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) adcl $0,-4(%ebp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) movl 4(%esi),%eax /* midl of Xsig */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) mull 4(%ecx) /* msl of b */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) addl %eax,-12(%ebp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) adcl %edx,-8(%ebp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) adcl $0,-4(%ebp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) movl 8(%esi),%eax /* msl of Xsig */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) mull (%ecx) /* lsl of b */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) addl %eax,-12(%ebp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) adcl %edx,-8(%ebp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) adcl $0,-4(%ebp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) movl 8(%esi),%eax /* msl of Xsig */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) mull 4(%ecx) /* msl of b */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) addl %eax,-8(%ebp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) adcl %edx,-4(%ebp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) movl -12(%ebp),%eax
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) movl %eax,(%esi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) movl -8(%ebp),%eax
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) movl %eax,4(%esi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) movl -4(%ebp),%eax
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) movl %eax,8(%esi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) popl %esi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) leave
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) ret
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) SYM_FUNC_END(mul64_Xsig)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) SYM_FUNC_START(mul_Xsig_Xsig)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) pushl %ebp
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) movl %esp,%ebp
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) subl $16,%esp
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) pushl %esi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) movl PARAM1,%esi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) movl PARAM2,%ecx
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) xor %eax,%eax
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) movl %eax,-4(%ebp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) movl %eax,-8(%ebp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) movl (%esi),%eax /* lsl of Xsig */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) mull 8(%ecx) /* msl of b */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) movl %edx,-12(%ebp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) movl 4(%esi),%eax /* midl of Xsig */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) mull 4(%ecx) /* midl of b */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) addl %edx,-12(%ebp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) adcl $0,-8(%ebp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) adcl $0,-4(%ebp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) movl 8(%esi),%eax /* msl of Xsig */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) mull (%ecx) /* lsl of b */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) addl %edx,-12(%ebp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) adcl $0,-8(%ebp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) adcl $0,-4(%ebp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) movl 4(%esi),%eax /* midl of Xsig */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) mull 8(%ecx) /* msl of b */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) addl %eax,-12(%ebp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) adcl %edx,-8(%ebp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) adcl $0,-4(%ebp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) movl 8(%esi),%eax /* msl of Xsig */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) mull 4(%ecx) /* midl of b */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) addl %eax,-12(%ebp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) adcl %edx,-8(%ebp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) adcl $0,-4(%ebp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) movl 8(%esi),%eax /* msl of Xsig */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) mull 8(%ecx) /* msl of b */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) addl %eax,-8(%ebp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) adcl %edx,-4(%ebp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) movl -12(%ebp),%edx
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) movl %edx,(%esi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) movl -8(%ebp),%edx
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) movl %edx,4(%esi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) movl -4(%ebp),%edx
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) movl %edx,8(%esi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) popl %esi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) leave
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) ret
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) SYM_FUNC_END(mul_Xsig_Xsig)