64-bit fixes.
[AROS-Contrib.git] / Games / Quake / r_aclipa.s
blobaee9837b8a0316cdd3fae6c9e9b71090fdb390eb
1 /*
2 Copyright (C) 1996-1997 Id Software, Inc.
4 This program is free software; you can redistribute it and/or
5 modify it under the terms of the GNU General Public License
6 as published by the Free Software Foundation; either version 2
7 of the License, or (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13 See the GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21 // r_aliasa.s
22 // x86 assembly-language Alias model transform and project code.
25 #include "asm_i386.h"
26 #include "quakeasm.h"
27 #include "asm_draw.h"
28 #include "d_ifacea.h"
30 #if id386
32 .data
33 Ltemp0: .long 0
34 Ltemp1: .long 0
36 .text
38 #define pfv0 8+4
39 #define pfv1 8+8
40 #define out 8+12
42 .globl C(R_Alias_clip_bottom)
43 C(R_Alias_clip_bottom):
44 pushl %esi
45 pushl %edi
47 movl pfv0(%esp),%esi
48 movl pfv1(%esp),%edi
50 movl C(r_refdef)+rd_aliasvrectbottom,%eax
52 LDoForwardOrBackward:
54 movl fv_v+4(%esi),%edx
55 movl fv_v+4(%edi),%ecx
57 cmpl %ecx,%edx
58 jl LDoForward
60 movl fv_v+4(%esi),%ecx
61 movl fv_v+4(%edi),%edx
62 movl pfv0(%esp),%edi
63 movl pfv1(%esp),%esi
65 LDoForward:
67 subl %edx,%ecx
68 subl %edx,%eax
69 movl %ecx,Ltemp1
70 movl %eax,Ltemp0
71 fildl Ltemp1
72 fildl Ltemp0
73 movl out(%esp),%edx
74 movl $2,%eax
76 fdivp %st(0),%st(1) // scale
78 LDo3Forward:
79 fildl fv_v+0(%esi) // fv0v0 | scale
80 fildl fv_v+0(%edi) // fv1v0 | fv0v0 | scale
81 fildl fv_v+4(%esi) // fv0v1 | fv1v0 | fv0v0 | scale
82 fildl fv_v+4(%edi) // fv1v1 | fv0v1 | fv1v0 | fv0v0 | scale
83 fildl fv_v+8(%esi) // fv0v2 | fv1v1 | fv0v1 | fv1v0 | fv0v0 | scale
84 fildl fv_v+8(%edi) // fv1v2 | fv0v2 | fv1v1 | fv0v1 | fv1v0 | fv0v0 |
85 // scale
86 fxch %st(5) // fv0v0 | fv0v2 | fv1v1 | fv0v1 | fv1v0 | fv1v2 |
87 // scale
88 fsubr %st(0),%st(4) // fv0v0 | fv0v2 | fv1v1 | fv0v1 | fv1v0-fv0v0 |
89 // fv1v2 | scale
90 fxch %st(3) // fv0v1 | fv0v2 | fv1v1 | fv0v0 | fv1v0-fv0v0 |
91 // fv1v2 | scale
92 fsubr %st(0),%st(2) // fv0v1 | fv0v2 | fv1v1-fv0v1 | fv0v0 |
93 // fv1v0-fv0v0 | fv1v2 | scale
94 fxch %st(1) // fv0v2 | fv0v1 | fv1v1-fv0v1 | fv0v0 |
95 // fv1v0-fv0v0 | fv1v2 | scale
96 fsubr %st(0),%st(5) // fv0v2 | fv0v1 | fv1v1-fv0v1 | fv0v0 |
97 // fv1v0-fv0v0 | fv1v2-fv0v2 | scale
98 fxch %st(6) // scale | fv0v1 | fv1v1-fv0v1 | fv0v0 |
99 // fv1v0-fv0v0 | fv1v2-fv0v2 | fv0v2
100 fmul %st(0),%st(4) // scale | fv0v1 | fv1v1-fv0v1 | fv0v0 |
101 // (fv1v0-fv0v0)*scale | fv1v2-fv0v2 | fv0v2
102 addl $12,%edi
103 fmul %st(0),%st(2) // scale | fv0v1 | (fv1v1-fv0v1)*scale | fv0v0 |
104 // (fv1v0-fv0v0)*scale | fv1v2-fv0v2 | fv0v2
105 addl $12,%esi
106 addl $12,%edx
107 fmul %st(0),%st(5) // scale | fv0v1 | (fv1v1-fv0v1)*scale | fv0v0 |
108 // (fv1v0-fv0v0)*scale | (fv1v2-fv0v2)*scale |
109 // fv0v2
110 fxch %st(3) // fv0v0 | fv0v1 | (fv1v1-fv0v1)*scale | scale |
111 // (fv1v0-fv0v0)*scale | (fv1v2-fv0v2)*scale |
112 // fv0v2
113 faddp %st(0),%st(4) // fv0v1 | (fv1v1-fv0v1)*scale | scale |
114 // fv0v0+(fv1v0-fv0v0)*scale |
115 // (fv1v2-fv0v2)*scale | fv0v2
116 faddp %st(0),%st(1) // fv0v1+(fv1v1-fv0v1)*scale | scale |
117 // fv0v0+(fv1v0-fv0v0)*scale |
118 // (fv1v2-fv0v2)*scale | fv0v2
119 fxch %st(4) // fv0v2 | scale | fv0v0+(fv1v0-fv0v0)*scale |
120 // (fv1v2-fv0v2)*scale | fv0v1+(fv1v1-fv0v1)*scale
121 faddp %st(0),%st(3) // scale | fv0v0+(fv1v0-fv0v0)*scale |
122 // fv0v2+(fv1v2-fv0v2)*scale |
123 // fv0v1+(fv1v1-fv0v1)*scale
124 fxch %st(1) // fv0v0+(fv1v0-fv0v0)*scale | scale |
125 // fv0v2+(fv1v2-fv0v2)*scale |
126 // fv0v1+(fv1v1-fv0v1)*scale
127 fadds float_point5
128 fxch %st(3) // fv0v1+(fv1v1-fv0v1)*scale | scale |
129 // fv0v2+(fv1v2-fv0v2)*scale |
130 // fv0v0+(fv1v0-fv0v0)*scale
131 fadds float_point5
132 fxch %st(2) // fv0v2+(fv1v2-fv0v2)*scale | scale |
133 // fv0v1+(fv1v1-fv0v1)*scale |
134 // fv0v0+(fv1v0-fv0v0)*scale
135 fadds float_point5
136 fxch %st(3) // fv0v0+(fv1v0-fv0v0)*scale | scale |
137 // fv0v1+(fv1v1-fv0v1)*scale |
138 // fv0v2+(fv1v2-fv0v2)*scale
139 fistpl fv_v+0-12(%edx) // scale | fv0v1+(fv1v1-fv0v1)*scale |
140 // fv0v2+(fv1v2-fv0v2)*scale
141 fxch %st(1) // fv0v1+(fv1v1-fv0v1)*scale | scale |
142 // fv0v2+(fv1v2-fv0v2)*scale | scale
143 fistpl fv_v+4-12(%edx) // scale | fv0v2+(fv1v2-fv0v2)*scale
144 fxch %st(1) // fv0v2+(fv1v2-fv0v2)*sc | scale
145 fistpl fv_v+8-12(%edx) // scale
147 decl %eax
148 jnz LDo3Forward
150 fstp %st(0)
152 popl %edi
153 popl %esi
158 .globl C(R_Alias_clip_top)
159 C(R_Alias_clip_top):
160 pushl %esi
161 pushl %edi
163 movl pfv0(%esp),%esi
164 movl pfv1(%esp),%edi
166 movl C(r_refdef)+rd_aliasvrect+4,%eax
167 jmp LDoForwardOrBackward
171 .globl C(R_Alias_clip_right)
172 C(R_Alias_clip_right):
173 pushl %esi
174 pushl %edi
176 movl pfv0(%esp),%esi
177 movl pfv1(%esp),%edi
179 movl C(r_refdef)+rd_aliasvrectright,%eax
181 LRightLeftEntry:
184 movl fv_v+4(%esi),%edx
185 movl fv_v+4(%edi),%ecx
187 cmpl %ecx,%edx
188 movl fv_v+0(%esi),%edx
190 movl fv_v+0(%edi),%ecx
191 jl LDoForward2
193 movl fv_v+0(%esi),%ecx
194 movl fv_v+0(%edi),%edx
195 movl pfv0(%esp),%edi
196 movl pfv1(%esp),%esi
198 LDoForward2:
200 jmp LDoForward
203 .globl C(R_Alias_clip_left)
204 C(R_Alias_clip_left):
205 pushl %esi
206 pushl %edi
208 movl pfv0(%esp),%esi
209 movl pfv1(%esp),%edi
211 movl C(r_refdef)+rd_aliasvrect+0,%eax
212 jmp LRightLeftEntry
215 #endif // id386