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 14Ljmptab: .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) 26C(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]; 43Lcase0: 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]; 120Lcase1: 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]; 146Lcase2: 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]; 172Lcase3: 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]; 198Lcase4: 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]; 224Lcase5: 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]; 250Lcase6: 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]; 276Lcase7: 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 298LSetSides: 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 328Lerror: 329 call C(BOPS_Error) 330 331#endif // id386 332