r_aclipa.s 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. //
  2. // r_aliasa.s
  3. // x86 assembly-language Alias model transform and project code.
  4. //
  5. #include "qasm.h"
  6. #include "d_ifacea.h"
  7. #if id386
  8. .data
  9. Ltemp0: .long 0
  10. Ltemp1: .long 0
  11. .text
  12. #define pfv0 8+4
  13. #define pfv1 8+8
  14. #define out 8+12
  15. .globl C(R_Alias_clip_bottom)
  16. C(R_Alias_clip_bottom):
  17. pushl %esi
  18. pushl %edi
  19. movl pfv0(%esp),%esi
  20. movl pfv1(%esp),%edi
  21. movl C(r_refdef)+rd_aliasvrectbottom,%eax
  22. LDoForwardOrBackward:
  23. movl fv_v+4(%esi),%edx
  24. movl fv_v+4(%edi),%ecx
  25. cmpl %ecx,%edx
  26. jl LDoForward
  27. movl fv_v+4(%esi),%ecx
  28. movl fv_v+4(%edi),%edx
  29. movl pfv0(%esp),%edi
  30. movl pfv1(%esp),%esi
  31. LDoForward:
  32. subl %edx,%ecx
  33. subl %edx,%eax
  34. movl %ecx,Ltemp1
  35. movl %eax,Ltemp0
  36. fildl Ltemp1
  37. fildl Ltemp0
  38. movl out(%esp),%edx
  39. movl $2,%eax
  40. fdivp %st(0),%st(1) // scale
  41. LDo3Forward:
  42. fildl fv_v+0(%esi) // fv0v0 | scale
  43. fildl fv_v+0(%edi) // fv1v0 | fv0v0 | scale
  44. fildl fv_v+4(%esi) // fv0v1 | fv1v0 | fv0v0 | scale
  45. fildl fv_v+4(%edi) // fv1v1 | fv0v1 | fv1v0 | fv0v0 | scale
  46. fildl fv_v+8(%esi) // fv0v2 | fv1v1 | fv0v1 | fv1v0 | fv0v0 | scale
  47. fildl fv_v+8(%edi) // fv1v2 | fv0v2 | fv1v1 | fv0v1 | fv1v0 | fv0v0 |
  48. // scale
  49. fxch %st(5) // fv0v0 | fv0v2 | fv1v1 | fv0v1 | fv1v0 | fv1v2 |
  50. // scale
  51. fsubr %st(0),%st(4) // fv0v0 | fv0v2 | fv1v1 | fv0v1 | fv1v0-fv0v0 |
  52. // fv1v2 | scale
  53. fxch %st(3) // fv0v1 | fv0v2 | fv1v1 | fv0v0 | fv1v0-fv0v0 |
  54. // fv1v2 | scale
  55. fsubr %st(0),%st(2) // fv0v1 | fv0v2 | fv1v1-fv0v1 | fv0v0 |
  56. // fv1v0-fv0v0 | fv1v2 | scale
  57. fxch %st(1) // fv0v2 | fv0v1 | fv1v1-fv0v1 | fv0v0 |
  58. // fv1v0-fv0v0 | fv1v2 | scale
  59. fsubr %st(0),%st(5) // fv0v2 | fv0v1 | fv1v1-fv0v1 | fv0v0 |
  60. // fv1v0-fv0v0 | fv1v2-fv0v2 | scale
  61. fxch %st(6) // scale | fv0v1 | fv1v1-fv0v1 | fv0v0 |
  62. // fv1v0-fv0v0 | fv1v2-fv0v2 | fv0v2
  63. fmul %st(0),%st(4) // scale | fv0v1 | fv1v1-fv0v1 | fv0v0 |
  64. // (fv1v0-fv0v0)*scale | fv1v2-fv0v2 | fv0v2
  65. addl $12,%edi
  66. fmul %st(0),%st(2) // scale | fv0v1 | (fv1v1-fv0v1)*scale | fv0v0 |
  67. // (fv1v0-fv0v0)*scale | fv1v2-fv0v2 | fv0v2
  68. addl $12,%esi
  69. addl $12,%edx
  70. fmul %st(0),%st(5) // scale | fv0v1 | (fv1v1-fv0v1)*scale | fv0v0 |
  71. // (fv1v0-fv0v0)*scale | (fv1v2-fv0v2)*scale |
  72. // fv0v2
  73. fxch %st(3) // fv0v0 | fv0v1 | (fv1v1-fv0v1)*scale | scale |
  74. // (fv1v0-fv0v0)*scale | (fv1v2-fv0v2)*scale |
  75. // fv0v2
  76. faddp %st(0),%st(4) // fv0v1 | (fv1v1-fv0v1)*scale | scale |
  77. // fv0v0+(fv1v0-fv0v0)*scale |
  78. // (fv1v2-fv0v2)*scale | fv0v2
  79. faddp %st(0),%st(1) // fv0v1+(fv1v1-fv0v1)*scale | scale |
  80. // fv0v0+(fv1v0-fv0v0)*scale |
  81. // (fv1v2-fv0v2)*scale | fv0v2
  82. fxch %st(4) // fv0v2 | scale | fv0v0+(fv1v0-fv0v0)*scale |
  83. // (fv1v2-fv0v2)*scale | fv0v1+(fv1v1-fv0v1)*scale
  84. faddp %st(0),%st(3) // scale | fv0v0+(fv1v0-fv0v0)*scale |
  85. // fv0v2+(fv1v2-fv0v2)*scale |
  86. // fv0v1+(fv1v1-fv0v1)*scale
  87. fxch %st(1) // fv0v0+(fv1v0-fv0v0)*scale | scale |
  88. // fv0v2+(fv1v2-fv0v2)*scale |
  89. // fv0v1+(fv1v1-fv0v1)*scale
  90. fadds float_point5
  91. fxch %st(3) // fv0v1+(fv1v1-fv0v1)*scale | scale |
  92. // fv0v2+(fv1v2-fv0v2)*scale |
  93. // fv0v0+(fv1v0-fv0v0)*scale
  94. fadds float_point5
  95. fxch %st(2) // fv0v2+(fv1v2-fv0v2)*scale | scale |
  96. // fv0v1+(fv1v1-fv0v1)*scale |
  97. // fv0v0+(fv1v0-fv0v0)*scale
  98. fadds float_point5
  99. fxch %st(3) // fv0v0+(fv1v0-fv0v0)*scale | scale |
  100. // fv0v1+(fv1v1-fv0v1)*scale |
  101. // fv0v2+(fv1v2-fv0v2)*scale
  102. fistpl fv_v+0-12(%edx) // scale | fv0v1+(fv1v1-fv0v1)*scale |
  103. // fv0v2+(fv1v2-fv0v2)*scale
  104. fxch %st(1) // fv0v1+(fv1v1-fv0v1)*scale | scale |
  105. // fv0v2+(fv1v2-fv0v2)*scale | scale
  106. fistpl fv_v+4-12(%edx) // scale | fv0v2+(fv1v2-fv0v2)*scale
  107. fxch %st(1) // fv0v2+(fv1v2-fv0v2)*sc | scale
  108. fistpl fv_v+8-12(%edx) // scale
  109. decl %eax
  110. jnz LDo3Forward
  111. fstp %st(0)
  112. popl %edi
  113. popl %esi
  114. ret
  115. .globl C(R_Alias_clip_top)
  116. C(R_Alias_clip_top):
  117. pushl %esi
  118. pushl %edi
  119. movl pfv0(%esp),%esi
  120. movl pfv1(%esp),%edi
  121. movl C(r_refdef)+rd_aliasvrect+4,%eax
  122. jmp LDoForwardOrBackward
  123. .globl C(R_Alias_clip_right)
  124. C(R_Alias_clip_right):
  125. pushl %esi
  126. pushl %edi
  127. movl pfv0(%esp),%esi
  128. movl pfv1(%esp),%edi
  129. movl C(r_refdef)+rd_aliasvrectright,%eax
  130. LRightLeftEntry:
  131. movl fv_v+4(%esi),%edx
  132. movl fv_v+4(%edi),%ecx
  133. cmpl %ecx,%edx
  134. movl fv_v+0(%esi),%edx
  135. movl fv_v+0(%edi),%ecx
  136. jl LDoForward2
  137. movl fv_v+0(%esi),%ecx
  138. movl fv_v+0(%edi),%edx
  139. movl pfv0(%esp),%edi
  140. movl pfv1(%esp),%esi
  141. LDoForward2:
  142. jmp LDoForward
  143. .globl C(R_Alias_clip_left)
  144. C(R_Alias_clip_left):
  145. pushl %esi
  146. pushl %edi
  147. movl pfv0(%esp),%esi
  148. movl pfv1(%esp),%edi
  149. movl C(r_refdef)+rd_aliasvrect+0,%eax
  150. jmp LRightLeftEntry
  151. #endif // id386