1 ; PowerPC optimized drawing methods for Goom
2 ; © 2003 Guillaume Borios
3 ; This Source Code is released under the terms of the General Public License
6 ; 30 May 2003 : File creation
8 ; Section definition : We use a read only code section for the whole file
9 .section __TEXT,__text,regular,pure_instructions
12 ; --------------------------------------------------------------------------------------
13 ; Single 32b pixel drawing macros
15 ; DRAWMETHOD_XXXX_MACRO *pixelIN, *pixelOUT, COLOR, WR1, WR2, WR3, WR4
16 ; Only the work registers (WR) can be touched by the macros
19 ; DRAWMETHOD_DFLT_MACRO : Default drawing method (Actually OVRW)
20 ; DRAWMETHOD_PLUS_MACRO : RVB Saturated per channel addition (SLOWEST)
21 ; DRAWMETHOD_HALF_MACRO : 50% Transparency color drawing
22 ; DRAWMETHOD_OVRW_MACRO : Direct COLOR drawing (FASTEST)
23 ; DRAWMETHOD_B_OR_MACRO : Bitwise OR
24 ; DRAWMETHOD_BAND_MACRO : Bitwise AND
25 ; DRAWMETHOD_BXOR_MACRO : Bitwise XOR
26 ; DRAWMETHOD_BNOT_MACRO : Bitwise NOT
27 ; --------------------------------------------------------------------------------------
29 .macro DRAWMETHOD_OVRW_MACRO
30 stw $2,0($1) ;; *$1 <- $2
33 .macro DRAWMETHOD_B_OR_MACRO
34 lwz $3,0($0) ;; $3 <- *$0
35 or $3,$3,$2 ;; $3 <- $3 | $2
36 stw $3,0($1) ;; *$1 <- $3
39 .macro DRAWMETHOD_BAND_MACRO
40 lwz $3,0($0) ;; $3 <- *$0
41 and $3,$3,$2 ;; $3 <- $3 & $2
42 stw $3,0($1) ;; *$1 <- $3
45 .macro DRAWMETHOD_BXOR_MACRO
46 lwz $3,0($0) ;; $3 <- *$0
47 xor $3,$3,$2 ;; $3 <- $3 ^ $2
48 stw $3,0($1) ;; *$1 <- $3
51 .macro DRAWMETHOD_BNOT_MACRO
52 lwz $3,0($0) ;; $3 <- *$0
53 nand $3,$3,$3 ;; $3 <- ~$3
54 stw $3,0($1) ;; *$1 <- $3
57 .macro DRAWMETHOD_PLUS_MACRO
58 lwz $4,0($0) ;; $4 <- *$0
59 andi. $3,$4,0xFF00 ;; $3 <- $4 & 0x0000FF00
60 andi. $5,$2,0xFF00 ;; $5 <- $2 & 0x0000FF00
61 add $3,$3,$5 ;; $3 <- $3 + $5
62 rlwinm $5,$3,15,0,0 ;; $5 <- 0 | ($3[15] << 15)
63 srawi $5,$5,23 ;; $5 <- $5 >> 23 (algebraic for sign extension)
64 or $3,$3,$5 ;; $3 <- $3 | $5
65 lis $5,0xFF ;; $5 <- 0x00FF00FF
67 and $4,$4,$5 ;; $4 <- $4 & $5
68 and $6,$2,$5 ;; $6 <- $2 & $5
69 add $4,$4,$6 ;; $4 <- $4 + $6
70 rlwinm $6,$4,7,0,0 ;; $6 <- 0 | ($4[7] << 7)
71 srawi $6,$6,15 ;; $6 <- $6 >> 15 (algebraic for sign extension)
72 rlwinm $5,$4,23,0,0 ;; $5 <- 0 | ($4[23] << 23)
73 srawi $5,$5,31 ;; $5 <- $5 >> 31 (algebraic for sign extension)
74 rlwimi $6,$5,0,24,31 ;; $6[24..31] <- $5[24..31]
75 or $4,$4,$6 ;; $4 <- $4 | $6
76 rlwimi $4,$3,0,16,23 ;; $4[16..23] <- $3[16..23]
77 stw $4,0($1) ;; *$1 <- $4
80 .macro DRAWMETHOD_HALF_MACRO
81 lwz $4,0($0) ;; $4 <- *$0
82 andi. $3,$4,0xFF00 ;; $3 <- $4 & 0x0000FF00
83 andi. $5,$2,0xFF00 ;; $5 <- $2 & 0x0000FF00
84 add $3,$3,$5 ;; $3 <- $3 + $5
85 lis $5,0xFF ;; $5 <- 0x00FF00FF
87 and $4,$4,$5 ;; $4 <- $4 & $5
88 and $5,$2,$5 ;; $5 <- $2 & $5
89 add $4,$4,$5 ;; $4 <- $4 + $5
90 srwi $4,$4,1 ;; $4 <- $4 >> 1
91 rlwimi $4,$3,31,16,23 ;; $4[16..23] <- $3[15..22]
92 stw $4,0($1) ;; *$1 <- $4
95 .macro DRAWMETHOD_DFLT_MACRO
99 ; --------------------------------------------------------------------------------------
103 ; **************************************************************************************
104 ; void DRAWMETHOD_PLUS_PPC(unsigned int * buf, unsigned int _col);
105 ; void DRAWMETHOD_PLUS_2_PPC(unsigned * in, unsigned int * out, unsigned int _col);
106 ; **************************************************************************************
107 .globl _DRAWMETHOD_PLUS_2_PPC
109 _DRAWMETHOD_PLUS_2_PPC:
110 DRAWMETHOD_PLUS_MACRO r3,r4,r5,r6,r7,r8,r9
113 .globl _DRAWMETHOD_PLUS_PPC
115 _DRAWMETHOD_PLUS_PPC:
116 DRAWMETHOD_PLUS_MACRO r3,r3,r4,r5,r6,r7,r9
120 ; **************************************************************************************
121 ; void DRAWMETHOD_HALF_PPC(unsigned int * buf, unsigned int _col);
122 ; void DRAWMETHOD_HALF_2_PPC(unsigned * in, unsigned int * out, unsigned int _col);
123 ; **************************************************************************************
124 .globl _DRAWMETHOD_HALF_2_PPC
126 _DRAWMETHOD_HALF_2_PPC:
127 DRAWMETHOD_HALF_MACRO r3,r4,r5,r6,r7,r8
130 .globl _DRAWMETHOD_HALF_PPC
132 _DRAWMETHOD_HALF_PPC:
133 DRAWMETHOD_HALF_MACRO r3,r3,r4,r5,r6,r7
137 ; **************************************************************************************
138 ; void DRAW_LINE_PPC(unsigned int *data, int x1, int y1, int x2, int y2, unsigned int col,
139 ; unsigned int screenx, unsigned int screeny)
140 ; **************************************************************************************
141 .globl _DRAW_LINE_PPC
144 ;; NOT IMPLEMENTED YET
148 ; **************************************************************************************
149 ; void _ppc_brightness(Pixel * src, Pixel * dest, unsigned int size, unsigned int coeff)
150 ; **************************************************************************************
157 .long 0x10101000, 0x10101001, 0x10101002, 0x10101003
158 .long 0x10101004, 0x10101005, 0x10101006, 0x10101007
159 .long 0x10101008, 0x10101009, 0x1010100A, 0x1010100B
160 .long 0x1010100C, 0x1010100D, 0x1010100E, 0x1010100F
163 .section __TEXT,__text,regular,pure_instructions
165 .globl _ppc_brightness_G4
170 ;; PowerPC Altivec code
180 bcl 20,31,"L00000000001$pb"
185 addis r9,r10,ha16(vectorZERO-"L00000000001$pb")
186 addi r9,r9,lo16(vectorZERO-"L00000000001$pb")
188 vxor v0,v0,v0 ;; V0 = NULL vector
199 addis r9,r10,ha16(vectortmpwork-"L00000000001$pb")
200 addi r9,r9,lo16(vectortmpwork-"L00000000001$pb")
218 ;*********************
220 ;*********************
226 ;*********************
228 ;*********************
250 .globl _ppc_brightness_G5
254 ;; PowerPC Altivec G5 code
264 bcl 20,31,"L00000000002$pb"
269 addis r9,r10,ha16(vectorZERO-"L00000000002$pb")
270 addi r9,r9,lo16(vectorZERO-"L00000000002$pb")
272 vxor v0,v0,v0 ;; V0 = NULL vector
283 addis r9,r10,ha16(vectortmpwork-"L00000000002$pb")
284 addi r9,r9,lo16(vectortmpwork-"L00000000002$pb")
302 ;*********************
304 ;*********************
331 .globl _ppc_brightness_generic
333 _ppc_brightness_generic:
344 rlwinm r8,r7,16,24,31
345 rlwinm r9,r7,24,24,31
347 rlwinm r10,r7,0,24,31
353 rlwinm. r11,r8,0,0,23
358 rlwinm. r11,r9,0,0,23
363 rlwinm. r11,r10,0,0,23
368 rlwimi r7,r10,0,24,31