1 ; PowerPC optimized drawing methods for Goom
2 ; © 2003 Guillaume Borios
3 ; This library is free software; you can redistribute it and/or
4 ; modify it under the terms of the GNU Library General Public
5 ; License as published by the Free Software Foundation; either
6 ; version 2 of the License, or (at your option) any later version.
8 ; This library is distributed in the hope that it will be useful,
9 ; but WITHOUT ANY WARRANTY; without even the implied warranty of
10 ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 ; Library General Public License for more details.
13 ; You should have received a copy of the GNU Library General Public
14 ; License along with this library; if not, write to the
15 ; Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
16 ; Boston, MA 02110-1301, USA.
19 ; 30 May 2003 : File creation
21 ; Section definition : We use a read only code section for the whole file
22 .section __TEXT,__text,regular,pure_instructions
25 ; --------------------------------------------------------------------------------------
26 ; Single 32b pixel drawing macros
28 ; DRAWMETHOD_XXXX_MACRO *pixelIN, *pixelOUT, COLOR, WR1, WR2, WR3, WR4
29 ; Only the work registers (WR) can be touched by the macros
32 ; DRAWMETHOD_DFLT_MACRO : Default drawing method (Actually OVRW)
33 ; DRAWMETHOD_PLUS_MACRO : RVB Saturated per channel addition (SLOWEST)
34 ; DRAWMETHOD_HALF_MACRO : 50% Transparency color drawing
35 ; DRAWMETHOD_OVRW_MACRO : Direct COLOR drawing (FASTEST)
36 ; DRAWMETHOD_B_OR_MACRO : Bitwise OR
37 ; DRAWMETHOD_BAND_MACRO : Bitwise AND
38 ; DRAWMETHOD_BXOR_MACRO : Bitwise XOR
39 ; DRAWMETHOD_BNOT_MACRO : Bitwise NOT
40 ; --------------------------------------------------------------------------------------
42 .macro DRAWMETHOD_OVRW_MACRO
43 stw $2,0($1) ;; *$1 <- $2
46 .macro DRAWMETHOD_B_OR_MACRO
47 lwz $3,0($0) ;; $3 <- *$0
48 or $3,$3,$2 ;; $3 <- $3 | $2
49 stw $3,0($1) ;; *$1 <- $3
52 .macro DRAWMETHOD_BAND_MACRO
53 lwz $3,0($0) ;; $3 <- *$0
54 and $3,$3,$2 ;; $3 <- $3 & $2
55 stw $3,0($1) ;; *$1 <- $3
58 .macro DRAWMETHOD_BXOR_MACRO
59 lwz $3,0($0) ;; $3 <- *$0
60 xor $3,$3,$2 ;; $3 <- $3 ^ $2
61 stw $3,0($1) ;; *$1 <- $3
64 .macro DRAWMETHOD_BNOT_MACRO
65 lwz $3,0($0) ;; $3 <- *$0
66 nand $3,$3,$3 ;; $3 <- ~$3
67 stw $3,0($1) ;; *$1 <- $3
70 .macro DRAWMETHOD_PLUS_MACRO
71 lwz $4,0($0) ;; $4 <- *$0
72 andi. $3,$4,0xFF00 ;; $3 <- $4 & 0x0000FF00
73 andi. $5,$2,0xFF00 ;; $5 <- $2 & 0x0000FF00
74 add $3,$3,$5 ;; $3 <- $3 + $5
75 rlwinm $5,$3,15,0,0 ;; $5 <- 0 | ($3[15] << 15)
76 srawi $5,$5,23 ;; $5 <- $5 >> 23 (algebraic for sign extension)
77 or $3,$3,$5 ;; $3 <- $3 | $5
78 lis $5,0xFF ;; $5 <- 0x00FF00FF
80 and $4,$4,$5 ;; $4 <- $4 & $5
81 and $6,$2,$5 ;; $6 <- $2 & $5
82 add $4,$4,$6 ;; $4 <- $4 + $6
83 rlwinm $6,$4,7,0,0 ;; $6 <- 0 | ($4[7] << 7)
84 srawi $6,$6,15 ;; $6 <- $6 >> 15 (algebraic for sign extension)
85 rlwinm $5,$4,23,0,0 ;; $5 <- 0 | ($4[23] << 23)
86 srawi $5,$5,31 ;; $5 <- $5 >> 31 (algebraic for sign extension)
87 rlwimi $6,$5,0,24,31 ;; $6[24..31] <- $5[24..31]
88 or $4,$4,$6 ;; $4 <- $4 | $6
89 rlwimi $4,$3,0,16,23 ;; $4[16..23] <- $3[16..23]
90 stw $4,0($1) ;; *$1 <- $4
93 .macro DRAWMETHOD_HALF_MACRO
94 lwz $4,0($0) ;; $4 <- *$0
95 andi. $3,$4,0xFF00 ;; $3 <- $4 & 0x0000FF00
96 andi. $5,$2,0xFF00 ;; $5 <- $2 & 0x0000FF00
97 add $3,$3,$5 ;; $3 <- $3 + $5
98 lis $5,0xFF ;; $5 <- 0x00FF00FF
100 and $4,$4,$5 ;; $4 <- $4 & $5
101 and $5,$2,$5 ;; $5 <- $2 & $5
102 add $4,$4,$5 ;; $4 <- $4 + $5
103 srwi $4,$4,1 ;; $4 <- $4 >> 1
104 rlwimi $4,$3,31,16,23 ;; $4[16..23] <- $3[15..22]
105 stw $4,0($1) ;; *$1 <- $4
108 .macro DRAWMETHOD_DFLT_MACRO
109 DRAWMETHOD_PLUS_MACRO
112 ; --------------------------------------------------------------------------------------
116 ; **************************************************************************************
117 ; void DRAWMETHOD_PLUS_PPC(unsigned int * buf, unsigned int _col);
118 ; void DRAWMETHOD_PLUS_2_PPC(unsigned * in, unsigned int * out, unsigned int _col);
119 ; **************************************************************************************
120 .globl _DRAWMETHOD_PLUS_2_PPC
122 _DRAWMETHOD_PLUS_2_PPC:
123 DRAWMETHOD_PLUS_MACRO r3,r4,r5,r6,r7,r8,r9
126 .globl _DRAWMETHOD_PLUS_PPC
128 _DRAWMETHOD_PLUS_PPC:
129 DRAWMETHOD_PLUS_MACRO r3,r3,r4,r5,r6,r7,r9
133 ; **************************************************************************************
134 ; void DRAWMETHOD_HALF_PPC(unsigned int * buf, unsigned int _col);
135 ; void DRAWMETHOD_HALF_2_PPC(unsigned * in, unsigned int * out, unsigned int _col);
136 ; **************************************************************************************
137 .globl _DRAWMETHOD_HALF_2_PPC
139 _DRAWMETHOD_HALF_2_PPC:
140 DRAWMETHOD_HALF_MACRO r3,r4,r5,r6,r7,r8
143 .globl _DRAWMETHOD_HALF_PPC
145 _DRAWMETHOD_HALF_PPC:
146 DRAWMETHOD_HALF_MACRO r3,r3,r4,r5,r6,r7
150 ; **************************************************************************************
151 ; void DRAW_LINE_PPC(unsigned int *data, int x1, int y1, int x2, int y2, unsigned int col,
152 ; unsigned int screenx, unsigned int screeny)
153 ; **************************************************************************************
154 .globl _DRAW_LINE_PPC
157 ;; NOT IMPLEMENTED YET
161 ; **************************************************************************************
162 ; void _ppc_brightness(Pixel * src, Pixel * dest, unsigned int size, unsigned int coeff)
163 ; **************************************************************************************
170 .long 0x10101000, 0x10101001, 0x10101002, 0x10101003
171 .long 0x10101004, 0x10101005, 0x10101006, 0x10101007
172 .long 0x10101008, 0x10101009, 0x1010100A, 0x1010100B
173 .long 0x1010100C, 0x1010100D, 0x1010100E, 0x1010100F
176 .section __TEXT,__text,regular,pure_instructions
178 .globl _ppc_brightness_G4
183 ;; PowerPC Altivec code
193 bcl 20,31,"L00000000001$pb"
198 addis r9,r10,ha16(vectorZERO-"L00000000001$pb")
199 addi r9,r9,lo16(vectorZERO-"L00000000001$pb")
201 vxor v0,v0,v0 ;; V0 = NULL vector
212 addis r9,r10,ha16(vectortmpwork-"L00000000001$pb")
213 addi r9,r9,lo16(vectortmpwork-"L00000000001$pb")
231 ;*********************
233 ;*********************
239 ;*********************
241 ;*********************
263 .globl _ppc_brightness_G5
267 ;; PowerPC Altivec G5 code
277 bcl 20,31,"L00000000002$pb"
282 addis r9,r10,ha16(vectorZERO-"L00000000002$pb")
283 addi r9,r9,lo16(vectorZERO-"L00000000002$pb")
285 vxor v0,v0,v0 ;; V0 = NULL vector
296 addis r9,r10,ha16(vectortmpwork-"L00000000002$pb")
297 addi r9,r9,lo16(vectortmpwork-"L00000000002$pb")
315 ;*********************
317 ;*********************
344 .globl _ppc_brightness_generic
346 _ppc_brightness_generic:
357 rlwinm r8,r7,16,24,31
358 rlwinm r9,r7,24,24,31
360 rlwinm r10,r7,0,24,31
366 rlwinm. r11,r8,0,0,23
371 rlwinm. r11,r9,0,0,23
376 rlwinm. r11,r10,0,0,23
381 rlwimi r7,r10,0,24,31