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,
62 GLboolean viewport_z_enable */
69 .globl _mesa_sparc_cliptest_points4
70 _mesa_sparc_cliptest_points4:
73 sub %o7, (. - one_dot_zero - 4), %g1
77 ld [%i0 + V4F_STRIDE], %l1
78 ld [%i0 + V4F_COUNT], %l3
79 LDPTR [%i0 + V4F_START], %i0
80 LDPTR [%i1 + V4F_START], %i5
86 ld [%i1 + V4F_FLAGS], %g3
87 or %g3, VEC_SIZE_4, %g3
88 st %g3, [%i1 + V4F_FLAGS]
90 st %g3, [%i1 + V4F_SIZE]
91 st %l3, [%i1 + V4F_COUNT]
99 * g2: (tmpAndMask << 8) | tmpOrMask
101 * i0: from[stride][i]
106 1: ld [%i0 + 0x0c], %f3 ! LSU Group
107 ld [%i0 + 0x0c], %g5 ! LSU Group
108 ld [%i0 + 0x08], %g4 ! LSU Group
109 fdivs %f4, %f3, %f8 ! FGM
110 addcc %g5, %g5, %g5 ! IEU1 Group
111 addx %g0, 0x0, %g3 ! IEU1 Group
112 addcc %g4, %g4, %g4 ! IEU1 Group
113 addx %g3, %g3, %g3 ! IEU1 Group
114 subcc %g5, %g4, %g0 ! IEU1 Group
115 ld [%i0 + 0x04], %g4 ! LSU Group
116 addx %g3, %g3, %g3 ! IEU1 Group
117 addcc %g4, %g4, %g4 ! IEU1 Group
118 addx %g3, %g3, %g3 ! IEU1 Group
119 subcc %g5, %g4, %g0 ! IEU1 Group
120 ld [%i0 + 0x00], %g4 ! LSU Group
121 addx %g3, %g3, %g3 ! IEU1 Group
122 addcc %g4, %g4, %g4 ! IEU1 Group
123 addx %g3, %g3, %g3 ! IEU1 Group
124 subcc %g5, %g4, %g0 ! IEU1 Group
125 addx %g3, %g3, %g3 ! IEU1 Group
126 ldub [%g1 + %g3], %g3 ! LSU Group
127 cmp %g3, 0 ! IEU1 Group, stall
130 sll %g3, 8, %g4 ! IEU1 Group
131 add %l2, 1, %l2 ! IEU0
132 st %g0, [%i5 + 0x00] ! LSU
133 or %g4, 0xff, %g4 ! IEU0 Group
134 or %g2, %g3, %g2 ! IEU1
135 st %g0, [%i5 + 0x04] ! LSU
136 and %g2, %g4, %g2 ! IEU0 Group
137 st %g0, [%i5 + 0x08] ! LSU
139 st %f4, [%i5 + 0x0c] ! LSU Group
140 2: ld [%i0 + 0x00], %f0 ! LSU Group
141 ld [%i0 + 0x04], %f1 ! LSU Group
142 ld [%i0 + 0x08], %f2 ! LSU Group
143 fmuls %f0, %f8, %f0 ! FGM
144 st %f0, [%i5 + 0x00] ! LSU Group
145 fmuls %f1, %f8, %f1 ! FGM
146 st %f1, [%i5 + 0x04] ! LSU Group
147 fmuls %f2, %f8, %f2 ! FGM
148 st %f2, [%i5 + 0x08] ! LSU Group
149 st %f8, [%i5 + 0x0c] ! LSU Group
150 3: add %i5, 0x10, %i5 ! IEU1
151 add %l0, 1, %l0 ! IEU0 Group
152 add %i2, 1, %i2 ! IEU0 Group
153 cmp %l0, %l3 ! IEU1 Group
155 add %i0, %l1, %i0 ! IEU0 Group
157 srl %g2, 8, %g3 ! IEU0 Group
158 cmp %l2, %l3 ! IEU1 Group
161 1: stb %g3, [%i4] ! LSU Group
163 restore %i1, 0x0, %o0
165 .globl _mesa_sparc_cliptest_points4_np
166 _mesa_sparc_cliptest_points4_np:
170 sub %o7, (. - one_dot_zero - 4), %g1
173 ld [%i0 + V4F_STRIDE], %l1
174 ld [%i0 + V4F_COUNT], %l3
175 LDPTR [%i0 + V4F_START], %i0
188 * g2: (tmpAndMask << 8) | tmpOrMask
190 * i0: from[stride][i]
194 1: ld [%i0 + 0x0c], %g5 ! LSU Group
195 ld [%i0 + 0x08], %g4 ! LSU Group
196 addcc %g5, %g5, %g5 ! IEU1 Group
197 addx %g0, 0x0, %g3 ! IEU1 Group
198 addcc %g4, %g4, %g4 ! IEU1 Group
199 addx %g3, %g3, %g3 ! IEU1 Group
200 subcc %g5, %g4, %g0 ! IEU1 Group
201 ld [%i0 + 0x04], %g4 ! LSU Group
202 addx %g3, %g3, %g3 ! IEU1 Group
203 addcc %g4, %g4, %g4 ! IEU1 Group
204 addx %g3, %g3, %g3 ! IEU1 Group
205 subcc %g5, %g4, %g0 ! IEU1 Group
206 ld [%i0 + 0x00], %g4 ! LSU Group
207 addx %g3, %g3, %g3 ! IEU1 Group
208 addcc %g4, %g4, %g4 ! IEU1 Group
209 addx %g3, %g3, %g3 ! IEU1 Group
210 subcc %g5, %g4, %g0 ! IEU1 Group
211 addx %g3, %g3, %g3 ! IEU1 Group
212 ldub [%g1 + %g3], %g3 ! LSU Group
213 cmp %g3, 0 ! IEU1 Group, stall
216 sll %g3, 8, %g4 ! IEU1 Group
217 add %l2, 1, %l2 ! IEU0
218 or %g4, 0xff, %g4 ! IEU0 Group
219 or %g2, %g3, %g2 ! IEU1
220 and %g2, %g4, %g2 ! IEU0 Group
221 2: add %l0, 1, %l0 ! IEU0 Group
222 add %i2, 1, %i2 ! IEU0 Group
223 cmp %l0, %l3 ! IEU1 Group
225 add %i0, %l1, %i0 ! IEU0 Group
227 srl %g2, 8, %g3 ! IEU0 Group
228 cmp %l2, %l3 ! IEU1 Group
231 1: stb %g3, [%i4] ! LSU Group
233 restore %i1, 0x0, %o0