2 * Clip testing in SPARC assembly
10 #define V4F_STRIDE 0x14
12 #define V4F_FLAGS 0x1c
16 #define V4F_START 0x04
17 #define V4F_COUNT 0x08
18 #define V4F_STRIDE 0x0c
20 #define V4F_FLAGS 0x14
28 .register %g2, #scratch
29 .register %g3, #scratch
35 .word 0x3f800000 /* 1.0f */
37 /* This trick is shamelessly stolen from the x86
38 * Mesa asm. Very clever, and we can do it too
39 * since we have the necessary add with carry
40 * instructions on Sparc.
43 .byte 0, 1, 0, 2, 4, 5, 4, 6
44 .byte 0, 1, 0, 2, 8, 9, 8, 10
45 .byte 32, 33, 32, 34, 36, 37, 36, 38
46 .byte 32, 33, 32, 34, 40, 41, 40, 42
47 .byte 0, 1, 0, 2, 4, 5, 4, 6
48 .byte 0, 1, 0, 2, 8, 9, 8, 10
49 .byte 16, 17, 16, 18, 20, 21, 20, 22
50 .byte 16, 17, 16, 18, 24, 25, 24, 26
51 .byte 63, 61, 63, 62, 55, 53, 55, 54
52 .byte 63, 61, 63, 62, 59, 57, 59, 58
53 .byte 47, 45, 47, 46, 39, 37, 39, 38
54 .byte 47, 45, 47, 46, 43, 41, 43, 42
55 .byte 63, 61, 63, 62, 55, 53, 55, 54
56 .byte 63, 61, 63, 62, 59, 57, 59, 58
57 .byte 31, 29, 31, 30, 23, 21, 23, 22
58 .byte 31, 29, 31, 30, 27, 25, 27, 26
60 /* GLvector4f *clip_vec, GLvector4f *proj_vec,
61 GLubyte clipMask[], GLubyte *orMask, GLubyte *andMask */
68 .globl _mesa_sparc_cliptest_points4
69 _mesa_sparc_cliptest_points4:
72 sub %o7, (. - one_dot_zero - 4), %g1
76 ld [%i0 + V4F_STRIDE], %l1
77 ld [%i0 + V4F_COUNT], %l3
78 LDPTR [%i0 + V4F_START], %i0
79 LDPTR [%i1 + V4F_START], %i5
85 ld [%i1 + V4F_FLAGS], %g3
86 or %g3, VEC_SIZE_4, %g3
87 st %g3, [%i1 + V4F_FLAGS]
89 st %g3, [%i1 + V4F_SIZE]
90 st %l3, [%i1 + V4F_COUNT]
98 * g2: (tmpAndMask << 8) | tmpOrMask
100 * i0: from[stride][i]
105 1: ld [%i0 + 0x0c], %f3 ! LSU Group
106 ld [%i0 + 0x0c], %g5 ! LSU Group
107 ld [%i0 + 0x08], %g4 ! LSU Group
108 fdivs %f4, %f3, %f8 ! FGM
109 addcc %g5, %g5, %g5 ! IEU1 Group
110 addx %g0, 0x0, %g3 ! IEU1 Group
111 addcc %g4, %g4, %g4 ! IEU1 Group
112 addx %g3, %g3, %g3 ! IEU1 Group
113 subcc %g5, %g4, %g0 ! IEU1 Group
114 ld [%i0 + 0x04], %g4 ! LSU Group
115 addx %g3, %g3, %g3 ! IEU1 Group
116 addcc %g4, %g4, %g4 ! IEU1 Group
117 addx %g3, %g3, %g3 ! IEU1 Group
118 subcc %g5, %g4, %g0 ! IEU1 Group
119 ld [%i0 + 0x00], %g4 ! LSU Group
120 addx %g3, %g3, %g3 ! IEU1 Group
121 addcc %g4, %g4, %g4 ! IEU1 Group
122 addx %g3, %g3, %g3 ! IEU1 Group
123 subcc %g5, %g4, %g0 ! IEU1 Group
124 addx %g3, %g3, %g3 ! IEU1 Group
125 ldub [%g1 + %g3], %g3 ! LSU Group
126 cmp %g3, 0 ! IEU1 Group, stall
129 sll %g3, 8, %g4 ! IEU1 Group
130 add %l2, 1, %l2 ! IEU0
131 st %g0, [%i5 + 0x00] ! LSU
132 or %g4, 0xff, %g4 ! IEU0 Group
133 or %g2, %g3, %g2 ! IEU1
134 st %g0, [%i5 + 0x04] ! LSU
135 and %g2, %g4, %g2 ! IEU0 Group
136 st %g0, [%i5 + 0x08] ! LSU
138 st %f4, [%i5 + 0x0c] ! LSU Group
139 2: ld [%i0 + 0x00], %f0 ! LSU Group
140 ld [%i0 + 0x04], %f1 ! LSU Group
141 ld [%i0 + 0x08], %f2 ! LSU Group
142 fmuls %f0, %f8, %f0 ! FGM
143 st %f0, [%i5 + 0x00] ! LSU Group
144 fmuls %f1, %f8, %f1 ! FGM
145 st %f1, [%i5 + 0x04] ! LSU Group
146 fmuls %f2, %f8, %f2 ! FGM
147 st %f2, [%i5 + 0x08] ! LSU Group
148 st %f8, [%i5 + 0x0c] ! LSU Group
149 3: add %i5, 0x10, %i5 ! IEU1
150 add %l0, 1, %l0 ! IEU0 Group
151 add %i2, 1, %i2 ! IEU0 Group
152 cmp %l0, %l3 ! IEU1 Group
154 add %i0, %l1, %i0 ! IEU0 Group
156 srl %g2, 8, %g3 ! IEU0 Group
157 cmp %l2, %l3 ! IEU1 Group
160 1: stb %g3, [%i4] ! LSU Group
162 restore %i1, 0x0, %o0
164 .globl _mesa_sparc_cliptest_points4_np
165 _mesa_sparc_cliptest_points4_np:
169 sub %o7, (. - one_dot_zero - 4), %g1
172 ld [%i0 + V4F_STRIDE], %l1
173 ld [%i0 + V4F_COUNT], %l3
174 LDPTR [%i0 + V4F_START], %i0
187 * g2: (tmpAndMask << 8) | tmpOrMask
189 * i0: from[stride][i]
193 1: ld [%i0 + 0x0c], %g5 ! LSU Group
194 ld [%i0 + 0x08], %g4 ! LSU Group
195 addcc %g5, %g5, %g5 ! IEU1 Group
196 addx %g0, 0x0, %g3 ! IEU1 Group
197 addcc %g4, %g4, %g4 ! IEU1 Group
198 addx %g3, %g3, %g3 ! IEU1 Group
199 subcc %g5, %g4, %g0 ! IEU1 Group
200 ld [%i0 + 0x04], %g4 ! LSU Group
201 addx %g3, %g3, %g3 ! IEU1 Group
202 addcc %g4, %g4, %g4 ! IEU1 Group
203 addx %g3, %g3, %g3 ! IEU1 Group
204 subcc %g5, %g4, %g0 ! IEU1 Group
205 ld [%i0 + 0x00], %g4 ! LSU Group
206 addx %g3, %g3, %g3 ! IEU1 Group
207 addcc %g4, %g4, %g4 ! IEU1 Group
208 addx %g3, %g3, %g3 ! IEU1 Group
209 subcc %g5, %g4, %g0 ! IEU1 Group
210 addx %g3, %g3, %g3 ! IEU1 Group
211 ldub [%g1 + %g3], %g3 ! LSU Group
212 cmp %g3, 0 ! IEU1 Group, stall
215 sll %g3, 8, %g4 ! IEU1 Group
216 add %l2, 1, %l2 ! IEU0
217 or %g4, 0xff, %g4 ! IEU0 Group
218 or %g2, %g3, %g2 ! IEU1
219 and %g2, %g4, %g2 ! IEU0 Group
220 2: add %l0, 1, %l0 ! IEU0 Group
221 add %i2, 1, %i2 ! IEU0 Group
222 cmp %l0, %l3 ! IEU1 Group
224 add %i0, %l1, %i0 ! IEU0 Group
226 srl %g2, 8, %g3 ! IEU0 Group
227 cmp %l2, %l3 ! IEU1 Group
230 1: stb %g3, [%i4] ! LSU Group
232 restore %i1, 0x0, %o0