summaryrefslogtreecommitdiff
path: root/src/i386/r_aclipa.s
diff options
context:
space:
mode:
Diffstat (limited to 'src/i386/r_aclipa.s')
-rw-r--r--src/i386/r_aclipa.s195
1 files changed, 195 insertions, 0 deletions
diff --git a/src/i386/r_aclipa.s b/src/i386/r_aclipa.s
new file mode 100644
index 0000000..6898a0c
--- /dev/null
+++ b/src/i386/r_aclipa.s
@@ -0,0 +1,195 @@
+//
+// r_aliasa.s
+// x86 assembly-language Alias model transform and project code.
+//
+
+#include "qasm.h"
+#include "d_ifacea.h"
+
+#if USE_ASM
+
+ .data
+Ltemp0: .long 0
+Ltemp1: .long 0
+
+ .text
+
+#define pfv0 8+4
+#define pfv1 8+8
+#define out 8+12
+
+.globl C(R_Alias_clip_bottom)
+C(R_Alias_clip_bottom):
+ pushl %esi
+ pushl %edi
+
+ movl pfv0(%esp),%esi
+ movl pfv1(%esp),%edi
+
+ movl C(r_refdef)+rd_aliasvrectbottom,%eax
+
+LDoForwardOrBackward:
+
+ movl fv_v+4(%esi),%edx
+ movl fv_v+4(%edi),%ecx
+
+ cmpl %ecx,%edx
+ jl LDoForward
+
+ movl fv_v+4(%esi),%ecx
+ movl fv_v+4(%edi),%edx
+ movl pfv0(%esp),%edi
+ movl pfv1(%esp),%esi
+
+LDoForward:
+
+ subl %edx,%ecx
+ subl %edx,%eax
+ movl %ecx,Ltemp1
+ movl %eax,Ltemp0
+ fildl Ltemp1
+ fildl Ltemp0
+ movl out(%esp),%edx
+ movl $2,%eax
+
+ fdivp %st(0),%st(1) // scale
+
+LDo3Forward:
+ fildl fv_v+0(%esi) // fv0v0 | scale
+ fildl fv_v+0(%edi) // fv1v0 | fv0v0 | scale
+ fildl fv_v+4(%esi) // fv0v1 | fv1v0 | fv0v0 | scale
+ fildl fv_v+4(%edi) // fv1v1 | fv0v1 | fv1v0 | fv0v0 | scale
+ fildl fv_v+8(%esi) // fv0v2 | fv1v1 | fv0v1 | fv1v0 | fv0v0 | scale
+ fildl fv_v+8(%edi) // fv1v2 | fv0v2 | fv1v1 | fv0v1 | fv1v0 | fv0v0 |
+ // scale
+ fxch %st(5) // fv0v0 | fv0v2 | fv1v1 | fv0v1 | fv1v0 | fv1v2 |
+ // scale
+ fsubr %st(0),%st(4) // fv0v0 | fv0v2 | fv1v1 | fv0v1 | fv1v0-fv0v0 |
+ // fv1v2 | scale
+ fxch %st(3) // fv0v1 | fv0v2 | fv1v1 | fv0v0 | fv1v0-fv0v0 |
+ // fv1v2 | scale
+ fsubr %st(0),%st(2) // fv0v1 | fv0v2 | fv1v1-fv0v1 | fv0v0 |
+ // fv1v0-fv0v0 | fv1v2 | scale
+ fxch %st(1) // fv0v2 | fv0v1 | fv1v1-fv0v1 | fv0v0 |
+ // fv1v0-fv0v0 | fv1v2 | scale
+ fsubr %st(0),%st(5) // fv0v2 | fv0v1 | fv1v1-fv0v1 | fv0v0 |
+ // fv1v0-fv0v0 | fv1v2-fv0v2 | scale
+ fxch %st(6) // scale | fv0v1 | fv1v1-fv0v1 | fv0v0 |
+ // fv1v0-fv0v0 | fv1v2-fv0v2 | fv0v2
+ fmul %st(0),%st(4) // scale | fv0v1 | fv1v1-fv0v1 | fv0v0 |
+ // (fv1v0-fv0v0)*scale | fv1v2-fv0v2 | fv0v2
+ addl $12,%edi
+ fmul %st(0),%st(2) // scale | fv0v1 | (fv1v1-fv0v1)*scale | fv0v0 |
+ // (fv1v0-fv0v0)*scale | fv1v2-fv0v2 | fv0v2
+ addl $12,%esi
+ addl $12,%edx
+ fmul %st(0),%st(5) // scale | fv0v1 | (fv1v1-fv0v1)*scale | fv0v0 |
+ // (fv1v0-fv0v0)*scale | (fv1v2-fv0v2)*scale |
+ // fv0v2
+ fxch %st(3) // fv0v0 | fv0v1 | (fv1v1-fv0v1)*scale | scale |
+ // (fv1v0-fv0v0)*scale | (fv1v2-fv0v2)*scale |
+ // fv0v2
+ faddp %st(0),%st(4) // fv0v1 | (fv1v1-fv0v1)*scale | scale |
+ // fv0v0+(fv1v0-fv0v0)*scale |
+ // (fv1v2-fv0v2)*scale | fv0v2
+ faddp %st(0),%st(1) // fv0v1+(fv1v1-fv0v1)*scale | scale |
+ // fv0v0+(fv1v0-fv0v0)*scale |
+ // (fv1v2-fv0v2)*scale | fv0v2
+ fxch %st(4) // fv0v2 | scale | fv0v0+(fv1v0-fv0v0)*scale |
+ // (fv1v2-fv0v2)*scale | fv0v1+(fv1v1-fv0v1)*scale
+ faddp %st(0),%st(3) // scale | fv0v0+(fv1v0-fv0v0)*scale |
+ // fv0v2+(fv1v2-fv0v2)*scale |
+ // fv0v1+(fv1v1-fv0v1)*scale
+ fxch %st(1) // fv0v0+(fv1v0-fv0v0)*scale | scale |
+ // fv0v2+(fv1v2-fv0v2)*scale |
+ // fv0v1+(fv1v1-fv0v1)*scale
+ fadds float_point5
+ fxch %st(3) // fv0v1+(fv1v1-fv0v1)*scale | scale |
+ // fv0v2+(fv1v2-fv0v2)*scale |
+ // fv0v0+(fv1v0-fv0v0)*scale
+ fadds float_point5
+ fxch %st(2) // fv0v2+(fv1v2-fv0v2)*scale | scale |
+ // fv0v1+(fv1v1-fv0v1)*scale |
+ // fv0v0+(fv1v0-fv0v0)*scale
+ fadds float_point5
+ fxch %st(3) // fv0v0+(fv1v0-fv0v0)*scale | scale |
+ // fv0v1+(fv1v1-fv0v1)*scale |
+ // fv0v2+(fv1v2-fv0v2)*scale
+ fistpl fv_v+0-12(%edx) // scale | fv0v1+(fv1v1-fv0v1)*scale |
+ // fv0v2+(fv1v2-fv0v2)*scale
+ fxch %st(1) // fv0v1+(fv1v1-fv0v1)*scale | scale |
+ // fv0v2+(fv1v2-fv0v2)*scale | scale
+ fistpl fv_v+4-12(%edx) // scale | fv0v2+(fv1v2-fv0v2)*scale
+ fxch %st(1) // fv0v2+(fv1v2-fv0v2)*sc | scale
+ fistpl fv_v+8-12(%edx) // scale
+
+ decl %eax
+ jnz LDo3Forward
+
+ fstp %st(0)
+
+ popl %edi
+ popl %esi
+
+ ret
+
+
+.globl C(R_Alias_clip_top)
+C(R_Alias_clip_top):
+ pushl %esi
+ pushl %edi
+
+ movl pfv0(%esp),%esi
+ movl pfv1(%esp),%edi
+
+ movl C(r_refdef)+rd_aliasvrect+4,%eax
+ jmp LDoForwardOrBackward
+
+
+
+.globl C(R_Alias_clip_right)
+C(R_Alias_clip_right):
+ pushl %esi
+ pushl %edi
+
+ movl pfv0(%esp),%esi
+ movl pfv1(%esp),%edi
+
+ movl C(r_refdef)+rd_aliasvrectright,%eax
+
+LRightLeftEntry:
+
+
+ movl fv_v+4(%esi),%edx
+ movl fv_v+4(%edi),%ecx
+
+ cmpl %ecx,%edx
+ movl fv_v+0(%esi),%edx
+
+ movl fv_v+0(%edi),%ecx
+ jl LDoForward2
+
+ movl fv_v+0(%esi),%ecx
+ movl fv_v+0(%edi),%edx
+ movl pfv0(%esp),%edi
+ movl pfv1(%esp),%esi
+
+LDoForward2:
+
+ jmp LDoForward
+
+
+.globl C(R_Alias_clip_left)
+C(R_Alias_clip_left):
+ pushl %esi
+ pushl %edi
+
+ movl pfv0(%esp),%esi
+ movl pfv1(%esp),%edi
+
+ movl C(r_refdef)+rd_aliasvrect+0,%eax
+ jmp LRightLeftEntry
+
+
+#endif // USE_ASM
+