math.s 8.1 KB

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