OSDN Git Service

2007-02-21 Trevor Smigiel <trevor_smigiel@playstation.sony.com>
[pf3gnuchains/gcc-fork.git] / gcc / config / spu / spu_internals.h
1 /* Definitions of Synergistic Processing Unit (SPU). */
2 /* Copyright (C) 2006 Free Software Foundation, Inc.
3
4    This file is free software; you can redistribute it and/or modify it under
5    the terms of the GNU General Public License as published by the Free
6    Software Foundation; either version 2 of the License, or (at your option) 
7    any later version.
8
9    This file is distributed in the hope that it will be useful, but WITHOUT
10    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12    for more details.
13
14    You should have received a copy of the GNU General Public License
15    along with this file; see the file COPYING.  If not, write to the Free
16    Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
17    02110-1301, USA.  */
18
19 /* As a special exception, if you include this header file into source files 
20    compiled by GCC, this header file does not by itself cause  the resulting 
21    executable to be covered by the GNU General Public License.  This exception 
22    does not however invalidate any other reasons why the executable file might be 
23    covered by the GNU General Public License.  */ 
24
25
26 #ifndef  _SPU_INTERNALS_H
27 #define _SPU_INTERNALS_H 
28  
29 /* For a typical GCC implementation, the vector keyword is defined here
30  * as a macro.  If this macro conflicts with user code the user needs to
31  * undefine it.  An extended GCC implementation may implement this
32  * keyword differently, such that it never conflicts,  and will define
33  * the macro __VECTOR_KEYWORD_SUPPORTED__. */
34 #ifndef __VECTOR_KEYWORD_SUPPORTED__
35 #define vector __vector
36 #endif
37
38
39 /*  The spu specific instruction macros, si_*(), correspond 1-1 with
40  *  SPU instructions in the ISA.  The arguments are the same with the
41  *  following exceptions:
42  *   -  any instruction which both reads and writes rt will have an
43  *      extra parameter in the macro.
44  *   -  instructions which append zero to the immediate field assume
45  *      the value given in a macro already has the zeroes appended.
46  *   -  integer/float convert functions expect a value from 0 to 127,
47  *      i.e., the bias is added by the compiler.
48  *
49  *  Parameters named 'imm' accept an integer literal.
50  *  Parameters named 'r[abcdt]' accept a qword argument.
51  *  Parameters named 'scalar' accept a scalar argument.
52  */
53
54 #define qword __vector signed char
55
56 #define si_lqd(ra,imm)       __builtin_si_lqd(ra,imm)
57 #define si_lqx(ra,rb)        __builtin_si_lqx(ra,rb)
58 #define si_lqa(imm)          __builtin_si_lqa(imm)
59 #define si_lqr(imm)          __builtin_si_lqr(imm)
60 #define si_stqd(rt,ra,imm)   __builtin_si_stqd(rt,ra,imm)
61 #define si_stqx(rt,ra,rb)    __builtin_si_stqx(rt,ra,rb)
62 #define si_stqa(rt,imm)      __builtin_si_stqa(rt,imm)
63 #define si_stqr(rt,imm)      __builtin_si_stqr(rt,imm)
64 #define si_cbd(ra,imm)       __builtin_si_cbd(ra,imm)
65 #define si_cbx(ra,rb)        __builtin_si_cbx(ra,rb)
66 #define si_chd(ra,imm)       __builtin_si_chd(ra,imm)
67 #define si_chx(ra,rb)        __builtin_si_chx(ra,rb)
68 #define si_cwd(ra,imm)       __builtin_si_cwd(ra,imm)
69 #define si_cwx(ra,rb)        __builtin_si_cwx(ra,rb)
70 #define si_cdd(ra,imm)       __builtin_si_cdd(ra,imm)
71 #define si_cdx(ra,rb)        __builtin_si_cdx(ra,rb)
72 #define si_ilh(imm)          __builtin_si_ilh(imm)
73 #define si_ilhu(imm)         __builtin_si_ilhu(imm)
74 #define si_il(imm)           __builtin_si_il(imm)
75 #define si_ila(imm)          __builtin_si_ila(imm)
76 #define si_iohl(ra,imm)      __builtin_si_iohl(ra,imm)
77 #define si_fsmbi(imm)        __builtin_si_fsmbi(imm)
78 #define si_ah(ra,rb)         __builtin_si_ah(ra,rb)
79 #define si_ahi(ra,imm)       __builtin_si_ahi(ra,imm)
80 #define si_a(ra,rb)          __builtin_si_a(ra,rb)
81 #define si_ai(ra,imm)        __builtin_si_ai(ra,imm)
82 #define si_addx(ra,rb,rt)    __builtin_si_addx(ra,rb,rt)
83 #define si_cg(ra,rb)         __builtin_si_cg(ra,rb)
84 #define si_cgx(ra,rb,rt)     __builtin_si_cgx(ra,rb,rt)
85 #define si_sfh(ra,rb)        __builtin_si_sfh(ra,rb)
86 #define si_sfhi(imm,ra)      __builtin_si_sfhi(imm,ra)
87 #define si_sf(ra,rb)         __builtin_si_sf(ra,rb)
88 #define si_sfi(ra,imm)       __builtin_si_sfi(ra,imm)
89 #define si_sfx(ra,rb,rt)     __builtin_si_sfx(ra,rb,rt)
90 #define si_bg(ra,rb)         __builtin_si_bg(ra,rb)
91 #define si_bgx(ra,rb,rt)     __builtin_si_bgx(ra,rb,rt)
92 #define si_mpy(ra,rb)        __builtin_si_mpy(ra,rb)
93 #define si_mpyu(ra,rb)       __builtin_si_mpyu(ra,rb)
94 #define si_mpyi(ra,imm)      __builtin_si_mpyi(ra,imm)
95 #define si_mpyui(ra,imm)     __builtin_si_mpyui(ra,imm)
96 #define si_mpya(ra,rb,rc)    __builtin_si_mpya(ra,rb,rc)
97 #define si_mpyh(ra,rb)       __builtin_si_mpyh(ra,rb)
98 #define si_mpys(ra,rb)       __builtin_si_mpys(ra,rb)
99 #define si_mpyhh(ra,rb)      __builtin_si_mpyhh(ra,rb)
100 #define si_mpyhhu(ra,rb)     __builtin_si_mpyhhu(ra,rb)
101 #define si_mpyhha(ra,rb,rc)  __builtin_si_mpyhha(ra,rb,rc)
102 #define si_mpyhhau(ra,rb,rc) __builtin_si_mpyhhau(ra,rb,rc)
103 #define si_clz(ra)           __builtin_si_clz(ra)
104 #define si_cntb(ra)          __builtin_si_cntb(ra)
105 #define si_fsmb(ra)          __builtin_si_fsmb(ra)
106 #define si_fsmh(ra)          __builtin_si_fsmh(ra)
107 #define si_fsm(ra)           __builtin_si_fsm(ra)
108 #define si_gbb(ra)           __builtin_si_gbb(ra)
109 #define si_gbh(ra)           __builtin_si_gbh(ra)
110 #define si_gb(ra)            __builtin_si_gb(ra)
111 #define si_avgb(ra,rb)       __builtin_si_avgb(ra,rb)
112 #define si_absdb(ra,rb)      __builtin_si_absdb(ra,rb)
113 #define si_sumb(ra,rb)       __builtin_si_sumb(ra,rb)
114 #define si_xsbh(ra)          __builtin_si_xsbh(ra)
115 #define si_xshw(ra)          __builtin_si_xshw(ra)
116 #define si_xswd(ra)          __builtin_si_xswd(ra)
117 #define si_and(ra,rb)        __builtin_si_and(ra,rb)
118 #define si_andc(ra,rb)       __builtin_si_andc(ra,rb)
119 #define si_andbi(ra,imm)     __builtin_si_andbi(ra,imm)
120 #define si_andhi(ra,imm)     __builtin_si_andhi(ra,imm)
121 #define si_andi(ra,imm)      __builtin_si_andi(ra,imm)
122 #define si_or(ra,rb)         __builtin_si_or(ra,rb)
123 #define si_orc(ra,rb)        __builtin_si_orc(ra,rb)
124 #define si_orbi(ra,imm)      __builtin_si_orbi(ra,imm)
125 #define si_orhi(ra,imm)      __builtin_si_orhi(ra,imm)
126 #define si_ori(ra,imm)       __builtin_si_ori(ra,imm)
127 #define si_orx(ra)           __builtin_si_orx(ra)
128 #define si_xor(ra,rb)        __builtin_si_xor(ra,rb)
129 #define si_xorbi(ra,imm)     __builtin_si_xorbi(ra,imm)
130 #define si_xorhi(ra,imm)     __builtin_si_xorhi(ra,imm)
131 #define si_xori(ra,imm)      __builtin_si_xori(ra,imm)
132 #define si_nand(ra,rb)       __builtin_si_nand(ra,rb)
133 #define si_nor(ra,rb)        __builtin_si_nor(ra,rb)
134 #define si_eqv(ra,rb)        __builtin_si_eqv(ra,rb)
135 #define si_selb(ra,rb,rc)    __builtin_si_selb(ra,rb,rc)
136 #define si_shufb(ra,rb,rc)   __builtin_si_shufb(ra,rb,rc)
137 #define si_shlh(ra,rb)       __builtin_si_shlh(ra,rb)
138 #define si_shlhi(ra,imm)     __builtin_si_shlhi(ra,imm)
139 #define si_shl(ra,rb)        __builtin_si_shl(ra,rb)
140 #define si_shli(ra,imm)      __builtin_si_shli(ra,imm)
141 #define si_shlqbi(ra,rb)     __builtin_si_shlqbi(ra,rb)
142 #define si_shlqbii(ra,imm)   __builtin_si_shlqbii(ra,imm)
143 #define si_shlqby(ra,rb)     __builtin_si_shlqby(ra,rb)
144 #define si_shlqbyi(ra,imm)   __builtin_si_shlqbyi(ra,imm)
145 #define si_shlqbybi(ra,rb)   __builtin_si_shlqbybi(ra,rb)
146 #define si_roth(ra,rb)       __builtin_si_roth(ra,rb)
147 #define si_rothi(ra,imm)     __builtin_si_rothi(ra,imm)
148 #define si_rot(ra,rb)        __builtin_si_rot(ra,rb)
149 #define si_roti(ra,imm)      __builtin_si_roti(ra,imm)
150 #define si_rotqby(ra,rb)     __builtin_si_rotqby(ra,rb)
151 #define si_rotqbyi(ra,imm)   __builtin_si_rotqbyi(ra,imm)
152 #define si_rotqbybi(ra,rb)   __builtin_si_rotqbybi(ra,rb)
153 #define si_rotqbi(ra,rb)     __builtin_si_rotqbi(ra,rb)
154 #define si_rotqbii(ra,imm)   __builtin_si_rotqbii(ra,imm)
155 #define si_rothm(ra,rb)      __builtin_si_rothm(ra,rb)
156 #define si_rothmi(ra,imm)    __builtin_si_rothmi(ra,imm)
157 #define si_rotm(ra,rb)       __builtin_si_rotm(ra,rb)
158 #define si_rotmi(ra,imm)     __builtin_si_rotmi(ra,imm)
159 #define si_rotqmby(ra,rb)    __builtin_si_rotqmby(ra,rb)
160 #define si_rotqmbyi(ra,imm)  __builtin_si_rotqmbyi(ra,imm)
161 #define si_rotqmbi(ra,rb)    __builtin_si_rotqmbi(ra,rb)
162 #define si_rotqmbii(ra,imm)  __builtin_si_rotqmbii(ra,imm)
163 #define si_rotqmbybi(ra,rb)  __builtin_si_rotqmbybi(ra,rb)
164 #define si_rotmah(ra,rb)     __builtin_si_rotmah(ra,rb)
165 #define si_rotmahi(ra,imm)   __builtin_si_rotmahi(ra,imm)
166 #define si_rotma(ra,rb)      __builtin_si_rotma(ra,rb)
167 #define si_rotmai(ra,imm)    __builtin_si_rotmai(ra,imm)
168 #define si_heq(ra,rb)        __builtin_si_heq(ra,rb)
169 #define si_heqi(ra,imm)      __builtin_si_heqi(ra,imm)
170 #define si_hgt(ra,rb)        __builtin_si_hgt(ra,rb)
171 #define si_hgti(ra,imm)      __builtin_si_hgti(ra,imm)
172 #define si_hlgt(ra,rb)       __builtin_si_hlgt(ra,rb)
173 #define si_hlgti(ra,imm)     __builtin_si_hlgti(ra,imm)
174 #define si_ceqb(ra,rb)       __builtin_si_ceqb(ra,rb)
175 #define si_ceqbi(ra,imm)     __builtin_si_ceqbi(ra,imm)
176 #define si_ceqh(ra,rb)       __builtin_si_ceqh(ra,rb)
177 #define si_ceqhi(ra,imm)     __builtin_si_ceqhi(ra,imm)
178 #define si_ceq(ra,rb)        __builtin_si_ceq(ra,rb)
179 #define si_ceqi(ra,imm)      __builtin_si_ceqi(ra,imm)
180 #define si_cgtb(ra,rb)       __builtin_si_cgtb(ra,rb)
181 #define si_cgtbi(ra,imm)     __builtin_si_cgtbi(ra,imm)
182 #define si_cgth(ra,rb)       __builtin_si_cgth(ra,rb)
183 #define si_cgthi(ra,imm)     __builtin_si_cgthi(ra,imm)
184 #define si_cgt(ra,rb)        __builtin_si_cgt(ra,rb)
185 #define si_cgti(ra,imm)      __builtin_si_cgti(ra,imm)
186 #define si_clgtb(ra,rb)      __builtin_si_clgtb(ra,rb)
187 #define si_clgtbi(ra,imm)    __builtin_si_clgtbi(ra,imm)
188 #define si_clgth(ra,rb)      __builtin_si_clgth(ra,rb)
189 #define si_clgthi(ra,imm)    __builtin_si_clgthi(ra,imm)
190 #define si_clgt(ra,rb)       __builtin_si_clgt(ra,rb)
191 #define si_clgti(ra,imm)     __builtin_si_clgti(ra,imm)
192 #define si_bisled(ra)        __builtin_si_bisled(ra,0)
193 #define si_bisledd(ra)       __builtin_si_bisledd(ra,0)
194 #define si_bislede(ra)       __builtin_si_bislede(ra,0)
195 #define si_fa(ra,rb)         __builtin_si_fa(ra,rb)
196 #define si_dfa(ra,rb)        __builtin_si_dfa(ra,rb)
197 #define si_fs(ra,rb)         __builtin_si_fs(ra,rb)
198 #define si_dfs(ra,rb)        __builtin_si_dfs(ra,rb)
199 #define si_fm(ra,rb)         __builtin_si_fm(ra,rb)
200 #define si_dfm(ra,rb)        __builtin_si_dfm(ra,rb)
201 #define si_fma(ra,rb,rc)     __builtin_si_fma(ra,rb,rc)
202 #define si_dfma(ra,rb,rc)    __builtin_si_dfma(ra,rb,rc)
203 #define si_dfnma(ra,rb,rc)   __builtin_si_dfnma(ra,rb,rc)
204 #define si_fnms(ra,rb,rc)    __builtin_si_fnms(ra,rb,rc)
205 #define si_dfnms(ra,rb,rc)   __builtin_si_dfnms(ra,rb,rc)
206 #define si_fms(ra,rb,rc)     __builtin_si_fms(ra,rb,rc)
207 #define si_dfms(ra,rb,rc)    __builtin_si_dfms(ra,rb,rc)
208 #define si_frest(ra)         __builtin_si_frest(ra)
209 #define si_frsqest(ra)       __builtin_si_frsqest(ra)
210 #define si_fi(ra,rb)         __builtin_si_fi(ra,rb)
211 #define si_csflt(ra,imm)     __builtin_si_csflt(ra,imm)
212 #define si_cflts(ra,imm)     __builtin_si_cflts(ra,imm)
213 #define si_cuflt(ra,imm)     __builtin_si_cuflt(ra,imm)
214 #define si_cfltu(ra,imm)     __builtin_si_cfltu(ra,imm)
215 #define si_frds(ra)          __builtin_si_frds(ra)
216 #define si_fesd(ra)          __builtin_si_fesd(ra)
217 #define si_fceq(ra,rb)       __builtin_si_fceq(ra,rb)
218 #define si_fcmeq(ra,rb)      __builtin_si_fcmeq(ra,rb)
219 #define si_fcgt(ra,rb)       __builtin_si_fcgt(ra,rb)
220 #define si_fcmgt(ra,rb)      __builtin_si_fcmgt(ra,rb)
221 #define si_stop(imm)         __builtin_si_stop(imm)
222 #define si_stopd(ra,rb,rc)   __builtin_si_stopd(ra,rb,rc)
223 #define si_lnop()            __builtin_si_lnop()
224 #define si_nop()             __builtin_si_nop()
225 #define si_sync()            __builtin_si_sync()
226 #define si_syncc()           __builtin_si_syncc()
227 #define si_dsync()           __builtin_si_dsync()
228 #define si_mfspr(imm)        __builtin_si_mfspr(imm)
229 #define si_mtspr(imm,ra)     __builtin_si_mtspr(imm,ra)
230 #define si_fscrrd()          __builtin_si_fscrrd()
231 #define si_fscrwr(ra)        __builtin_si_fscrwr(ra)
232 #define si_rdch(imm)         __builtin_si_rdch(imm)
233 #define si_rchcnt(imm)       __builtin_si_rchcnt(imm)
234 #define si_wrch(imm,ra)      __builtin_si_wrch(imm,ra)
235
236 #define si_from_char(scalar)    __builtin_si_from_char(scalar)
237 #define si_from_uchar(scalar)   __builtin_si_from_uchar(scalar)
238 #define si_from_short(scalar)   __builtin_si_from_short(scalar)
239 #define si_from_ushort(scalar)  __builtin_si_from_ushort(scalar)
240 #define si_from_int(scalar)     __builtin_si_from_int(scalar)
241 #define si_from_uint(scalar)    __builtin_si_from_uint(scalar)
242 #define si_from_llong(scalar)   __builtin_si_from_long(scalar)
243 #define si_from_ullong(scalar)  __builtin_si_from_ulong(scalar)
244 #define si_from_float(scalar)   __builtin_si_from_float(scalar)
245 #define si_from_double(scalar)  __builtin_si_from_double(scalar)
246 #define si_from_ptr(scalar)     __builtin_si_from_ptr(scalar)
247
248 #define si_to_char(ra)      __builtin_si_to_char(ra)
249 #define si_to_uchar(ra)     __builtin_si_to_uchar(ra)
250 #define si_to_short(ra)     __builtin_si_to_short(ra)
251 #define si_to_ushort(ra)    __builtin_si_to_ushort(ra)
252 #define si_to_int(ra)       __builtin_si_to_int(ra)
253 #define si_to_uint(ra)      __builtin_si_to_uint(ra)
254 #define si_to_llong(ra)     __builtin_si_to_long(ra)
255 #define si_to_ullong(ra)    __builtin_si_to_ulong(ra)
256 #define si_to_float(ra)     __builtin_si_to_float(ra)
257 #define si_to_double(ra)    __builtin_si_to_double(ra)
258 #define si_to_ptr(ra)       __builtin_si_to_ptr(ra)
259
260 #define __align_hint(ptr,base,offset) __builtin_spu_align_hint(ptr,base,offset)
261
262 /* generic spu_* intrinsics */
263
264 #define spu_splats(scalar)        __builtin_spu_splats(scalar) 
265 #define spu_convtf(ra,imm)        __builtin_spu_convtf(ra,imm)
266 #define spu_convts(ra,imm)        __builtin_spu_convts(ra,imm)
267 #define spu_convtu(ra,imm)        __builtin_spu_convtu(ra,imm) 
268 #define spu_extend(ra)            __builtin_spu_extend(ra) 
269 #define spu_roundtf(ra)           __builtin_spu_roundtf(ra) 
270 #define spu_add(ra,rb)            __builtin_spu_add(ra,rb) 
271 #define spu_addx(ra,rb,rt)        __builtin_spu_addx(ra,rb,rt) 
272 #define spu_genc(ra,rb)           __builtin_spu_genc(ra,rb) 
273 #define spu_gencx(ra,rb,rt)       __builtin_spu_gencx(ra,rb,rt) 
274 #define spu_madd(ra,rb,rc)        __builtin_spu_madd(ra,rb,rc)
275 #define spu_nmadd(ra,rb,rc)       __builtin_spu_nmadd(ra,rb,rc)
276 #define spu_mhhadd(ra,rb,rc)      __builtin_spu_mhhadd(ra,rb,rc)
277 #define spu_msub(ra,rb,rc)        __builtin_spu_msub(ra,rb,rc) 
278 #define spu_mul(ra,rb)            __builtin_spu_mul(ra,rb) 
279 #define spu_mulh(ra,rb)           __builtin_spu_mulh(ra,rb) 
280 #define spu_mule(ra,rb)           __builtin_spu_mule(ra,rb) 
281 #define spu_mulo(ra,rb)           __builtin_spu_mulo(ra,rb) 
282 #define spu_mulsr(ra,rb)          __builtin_spu_mulsr(ra,rb) 
283 #define spu_nmsub(ra,rb,rc)       __builtin_spu_nmsub(ra,rb,rc) 
284 #define spu_sub(ra,rb)            __builtin_spu_sub(ra,rb)
285 #define spu_subx(ra,rb,rt)        __builtin_spu_subx(ra,rb,rt) 
286 #define spu_genb(ra,rb)           __builtin_spu_genb(ra,rb) 
287 #define spu_genbx(ra,rb,rt)       __builtin_spu_genbx(ra,rb,rt) 
288 #define spu_absd(ra,rb)           __builtin_spu_absd(ra,rb) 
289 #define spu_avg(ra,rb)            __builtin_spu_avg(ra,rb) 
290 #define spu_sumb(ra,rb)           __builtin_spu_sumb(ra,rb) 
291 #define spu_bisled(ra)            __builtin_spu_bisled(ra, 0)
292 #define spu_bisled_d(ra)          __builtin_spu_bisled_d(ra, 0)
293 #define spu_bisled_e(ra)          __builtin_spu_bisled_e(ra, 0)
294 #define spu_cmpabseq(ra,rb)       __builtin_spu_cmpabseq(ra,rb) 
295 #define spu_cmpabsgt(ra,rb)       __builtin_spu_cmpabsgt(ra,rb) 
296 #define spu_cmpeq(ra,rb)          __builtin_spu_cmpeq(ra,rb) 
297 #define spu_cmpgt(ra,rb)          __builtin_spu_cmpgt(ra,rb) 
298 #define spu_hcmpeq(ra,rb)         __builtin_spu_hcmpeq(ra,rb) 
299 #define spu_hcmpgt(ra,rb)         __builtin_spu_hcmpgt(ra,rb) 
300 #define spu_cntb(ra)              __builtin_spu_cntb(ra) 
301 #define spu_cntlz(ra)             __builtin_spu_cntlz(ra) 
302 #define spu_gather(ra)            __builtin_spu_gather(ra) 
303 #define spu_maskb(ra)             __builtin_spu_maskb(ra) 
304 #define spu_maskh(ra)             __builtin_spu_maskh(ra) 
305 #define spu_maskw(ra)             __builtin_spu_maskw(ra) 
306 #define spu_sel(ra,rb,rc)         __builtin_spu_sel(ra,rb,rc) 
307 #define spu_shuffle(ra,rb,rc)     __builtin_spu_shuffle(ra,rb,rc) 
308 #define spu_and(ra,rb)            __builtin_spu_and(ra,rb) 
309 #define spu_andc(ra,rb)           __builtin_spu_andc(ra,rb) 
310 #define spu_eqv(ra,rb)            __builtin_spu_eqv(ra,rb) 
311 #define spu_nand(ra,rb)           __builtin_spu_nand(ra,rb)
312 #define spu_nor(ra,rb)            __builtin_spu_nor(ra,rb) 
313 #define spu_or(ra,rb)             __builtin_spu_or(ra,rb) 
314 #define spu_orc(ra,rb)            __builtin_spu_orc(ra,rb) 
315 #define spu_orx(ra)               __builtin_spu_orx(ra)
316 #define spu_xor(ra,rb)            __builtin_spu_xor(ra,rb) 
317 #define spu_rl(ra,rb)             __builtin_spu_rl(ra,rb) 
318 #define spu_rlqw(ra,count)        __builtin_spu_rlqw(ra,count) 
319 #define spu_rlqwbyte(ra,count)    __builtin_spu_rlqwbyte(ra,count) 
320 #define spu_rlqwbytebc(ra,count)  __builtin_spu_rlqwbytebc(ra,count) 
321 #define spu_rlmask(ra,rb)         __builtin_spu_rlmask(ra,rb) 
322 #define spu_rlmaska(ra,rb)        __builtin_spu_rlmaska(ra,rb) 
323 #define spu_rlmaskqw(ra,rb)       __builtin_spu_rlmaskqw(ra,rb) 
324 #define spu_rlmaskqwbyte(ra,rb)   __builtin_spu_rlmaskqwbyte(ra,rb) 
325 #define spu_rlmaskqwbytebc(ra,rb) __builtin_spu_rlmaskqwbytebc(ra,rb) 
326 #define spu_sl(ra,rb)             __builtin_spu_sl(ra,rb) 
327 #define spu_slqw(ra,rb)           __builtin_spu_slqw(ra,rb) 
328 #define spu_slqwbyte(ra,rb)       __builtin_spu_slqwbyte(ra,rb) 
329 #define spu_slqwbytebc(ra,rb)     __builtin_spu_slqwbytebc(ra,rb) 
330 #define spu_extract(ra,pos)       __builtin_spu_extract(ra,pos) 
331 #define spu_insert(scalar,ra,pos) __builtin_spu_insert(scalar,ra,pos) 
332 #define spu_promote(scalar,pos)   __builtin_spu_promote(scalar,pos) 
333
334 #ifdef __cplusplus
335 extern "C" {
336 #endif
337
338 /* The type checking for some of these won't be accurate but they need
339  * to be defines because of the immediate values. */
340 #define spu_idisable()          __builtin_spu_idisable()
341 #define spu_ienable()           __builtin_spu_ienable()
342 #define spu_mfspr(imm)          si_to_uint(si_mfspr((imm)))
343 #define spu_mtspr(imm, ra)      si_mtspr((imm),si_from_uint (ra))
344 #define spu_mffpscr()           ((vec_uint4)si_fscrrd())
345 #define spu_mtfpscr(a)          si_fscrwr((qword)a)
346 #define spu_dsync()             si_dsync() 
347 #define spu_stop(imm)           si_stop(imm)
348 #define spu_sync()              si_sync()
349 #define spu_sync_c()            si_syncc()
350 #define spu_readch(imm)         si_to_uint(si_rdch((imm)))
351 #define spu_readchqw(imm)       ((vec_uint4)si_rdch((imm)))
352 #define spu_readchcnt(imm)      si_to_uint(si_rchcnt((imm)))
353 #define spu_writech(imm, ra)    si_wrch((imm), si_from_uint(ra))
354 #define spu_writechqw(imm, ra)  si_wrch((imm), (qword)(ra))
355
356 /* The following functions are static and always_inline to make sure
357  * they don't show up in object files which they aren't used in.  */
358
359 static __inline__ vec_float4 spu_re (vec_float4 ra) __attribute__((__always_inline__));
360 static __inline__ vec_float4 spu_rsqrte (vec_float4 ra) __attribute__((__always_inline__));
361
362 static __inline__ vec_float4
363 spu_re (vec_float4 ra)
364 {
365   return (vec_float4) si_fi ((qword) (ra), si_frest ((qword) (ra)));
366 }
367 static __inline__ vec_float4
368 spu_rsqrte (vec_float4 ra)
369 {
370   return (vec_float4) si_fi ((qword) (ra), si_frsqest ((qword) (ra)));
371 }
372
373 /* composite intrinsics */
374 static __inline__ void spu_mfcdma32(volatile void *ls, unsigned int ea, unsigned int size, unsigned int tagid, unsigned int cmd) __attribute__((__always_inline__));
375 static __inline__ void spu_mfcdma64(volatile void *ls, unsigned int eahi, unsigned int ealow, unsigned int size, unsigned int tagid, unsigned int cmd) __attribute__((__always_inline__));
376 static __inline__ unsigned int spu_mfcstat(unsigned int type) __attribute__((__always_inline__));
377
378 static __inline__ void
379 spu_mfcdma32(volatile void *ls, unsigned int ea, unsigned int size, unsigned int tagid, unsigned int cmd)
380 {
381       si_wrch(MFC_LSA,si_from_ptr(ls));
382       si_wrch(MFC_EAL,si_from_uint(ea));
383       si_wrch(MFC_Size,si_from_uint(size));
384       si_wrch(MFC_TagID,si_from_uint(tagid));
385       si_wrch(MFC_Cmd,si_from_uint(cmd));
386 }
387 static __inline__ void
388 spu_mfcdma64(volatile void *ls, unsigned int eahi, unsigned int ealow, unsigned int size, unsigned int tagid, unsigned int cmd)
389 {
390       si_wrch(MFC_LSA,si_from_ptr(ls));
391       si_wrch(MFC_EAH,si_from_uint(eahi));
392       si_wrch(MFC_EAL,si_from_uint(ealow));
393       si_wrch(MFC_Size,si_from_uint(size));
394       si_wrch(MFC_TagID,si_from_uint(tagid));
395       si_wrch(MFC_Cmd,si_from_uint(cmd));
396 }
397 static __inline__ unsigned int
398 spu_mfcstat(unsigned int type)
399 {
400       si_wrch(MFC_WrTagUpdate,si_from_uint(type));
401       return si_to_uint(si_rdch(MFC_RdTagStat));
402 }
403 #ifdef __cplusplus
404
405 }
406 #endif  /* __cplusplus */
407
408 #endif /* SPUINTRIN_H */
409