Quake-2

Quake 2 GPL Source Release
Log | Files | Refs

r_aclipa.s (4748B)


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