paired.h

Go to the documentation of this file.
00001 /*
00002         libbroadway - A general purpose library to control the Wii.
00003         Paired Singles manipulation
00004 
00005 Copyright (C) 2010      Alex Marshall <trap15@raidenii.net>
00006 
00007 # This code is licensed to you under the terms of the GNU GPL, version 2;
00008 # see file COPYING or http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
00009 */
00010 
00019 #ifndef __PAIRED_H__
00020 #define __PAIRED_H__
00021 
00024 typedef enum {
00025         GQR_TYPE_FLOAT = 0,     
00026         GQR_TYPE_U8 = 4,        
00027         GQR_TYPE_U16,           
00028         GQR_TYPE_S8,            
00029         GQR_TYPE_S16,           
00030 } gqr_type_t;
00031 
00043 void paired_set_gqr(int gqr, int mode, gqr_type_t type, int scale);
00052 void paired_get_gqr(int gqr, int mode, gqr_type_t *type, int *scale);
00053 
00063 #define paired_load(gqr, data, single) ({               \
00064         double pair;                                    \
00065         asm volatile                                    \
00066         ("      psq_lx          %0, 0, %1, 0, %3\n"     \
00067          : "=f"(pair) /* The FPR target */              \
00068          : "rm"(data), "i"(single), "i"(gqr)            \
00069         );                                              \
00070         pair;                                           \
00071 })
00072 /* Har har, I used indexed format for cheatz */
00073 
00081 #define paired_store(gqr, data, single, pair)           \
00082         asm volatile                                    \
00083         ("      psq_st          %1, %0, 0, %3\n"        \
00084          : "=m"(data)                                   \
00085          : "f"(pair), "i"(single), "i"(gqr)             \
00086         );
00087 
00093 #define paired_abs(pair) ({                     \
00094         double out;                             \
00095         asm volatile                            \
00096         ("      ps_abs          %0, %1\n"       \
00097          : "=f"(out)                            \
00098          : "f"(pair)                            \
00099         );                                      \
00100         out;                                    \
00101 })
00102 
00108 #define paired_nabs(pair) ({                    \
00109         double out;                             \
00110         asm volatile                            \
00111         ("      ps_nabs         %0, %1\n"       \
00112          : "=f"(out)                            \
00113          : "f"(pair)                            \
00114         );                                      \
00115         out;                                    \
00116 })
00117 
00123 #define paired_neg(pair) ({                     \
00124         double out;                             \
00125         asm volatile                            \
00126         ("      ps_neg          %0, %1\n"       \
00127          : "=f"(out)                            \
00128          : "f"(pair)                            \
00129         );                                      \
00130         out;                                    \
00131 })
00132 
00138 #define paired_reciprocal(pair) ({              \
00139         double out;                             \
00140         asm volatile                            \
00141         ("      ps_res          %0, %1\n"       \
00142          : "=f"(out)                            \
00143          : "f"(pair)                            \
00144         );                                      \
00145         out;                                    \
00146 })
00147 
00153 #define paired_sqrt_reciprocal(pair) ({         \
00154         double out;                             \
00155         asm volatile                            \
00156         ("      ps_rsqrte       %0, %1\n"       \
00157          : "=f"(out)                            \
00158          : "f"(pair)                            \
00159         );                                      \
00160         out;                                    \
00161 })
00162 
00169 #define paired_add(pair0, pair1) ({             \
00170         double out;                             \
00171         asm volatile                            \
00172         ("      ps_add          %0, %1, %2\n"   \
00173          : "=f"(out)                            \
00174          : "f"(pair0), "f"(pair1)               \
00175         );                                      \
00176         out;                                    \
00177 })
00178 
00185 #define paired_div(dend, sor) ({                \
00186         double out;                             \
00187         asm volatile                            \
00188         ("      ps_div          %0, %1, %2\n"   \
00189          : "=f"(out)                            \
00190          : "f"(dend), "f"(sor)                  \
00191         );                                      \
00192         out;                                    \
00193 })
00194 
00201 #define paired_mul(pair0, pair1) ({             \
00202         double out;                             \
00203         asm volatile                            \
00204         ("      ps_mul          %0, %1, %2\n"   \
00205          : "=f"(out)                            \
00206          : "f"(pair0), "f"(pair1)               \
00207         );                                      \
00208         out;                                    \
00209 })
00210 
00217 #define paired_sub(uend, hend) ({               \
00218         double out;                             \
00219         asm volatile                            \
00220         ("      ps_sub          %0, %1, %2\n"   \
00221          : "=f"(out)                            \
00222          : "f"(uend), "f"(hend)                 \
00223         );                                      \
00224         out;                                    \
00225 })
00226 
00227 /* TODO: Comparison functions! */
00228 
00236 #define paired_madd(mul0, mul1, add) ({                 \
00237         double out;                                     \
00238         asm volatile                                    \
00239         ("      ps_madd         %0, %1, %2, %3\n"       \
00240          : "=f"(out)                                    \
00241          : "f"(mul0), "f"(mul1), "f"(add)               \
00242         );                                              \
00243         out;                                            \
00244 })
00245 
00253 #define paired_madds0(mul0, mul1, add) ({               \
00254         double out;                                     \
00255         asm volatile                                    \
00256         ("      ps_madds0       %0, %1, %2, %3\n"       \
00257          : "=f"(out)                                    \
00258          : "f"(mul0), "f"(mul1), "f"(add)               \
00259         );                                              \
00260         out;                                            \
00261 })
00262 
00270 #define paired_madds1(mul0, mul1, add) ({               \
00271         double out;                                     \
00272         asm volatile                                    \
00273         ("      ps_madds1       %0, %1, %2, %3\n"       \
00274          : "=f"(out)                                    \
00275          : "f"(mul0), "f"(mul1), "f"(add)               \
00276         );                                              \
00277         out;                                            \
00278 })
00279 
00287 #define paired_msub(mul0, mul1, sub) ({                 \
00288         double out;                                     \
00289         asm volatile                                    \
00290         ("      ps_msub         %0, %1, %2, %3\n"       \
00291          : "=f"(out)                                    \
00292          : "f"(mul0), "f"(mul1), "f"(sub)               \
00293         );                                              \
00294         out;                                            \
00295 })
00296 
00303 #define paired_muls0(mul0, mul1) ({                     \
00304         double out;                                     \
00305         asm volatile                                    \
00306         ("      ps_muls0        %0, %1, %2\n"           \
00307          : "=f"(out)                                    \
00308          : "f"(mul0), "f"(mul1)                         \
00309         );                                              \
00310         out;                                            \
00311 })
00312 
00319 #define paired_muls1(mul0, mul1) ({                     \
00320         double out;                                     \
00321         asm volatile                                    \
00322         ("      ps_muls1        %0, %1, %2\n"           \
00323          : "=f"(out)                                    \
00324          : "f"(mul0), "f"(mul1)                         \
00325         );                                              \
00326         out;                                            \
00327 })
00328 
00336 #define paired_nmadd(mul0, mul1, add) ({                \
00337         double out;                                     \
00338         asm volatile                                    \
00339         ("      ps_nmadd        %0, %1, %2, %3\n"       \
00340          : "=f"(out)                                    \
00341          : "f"(mul0), "f"(mul1), "f"(add)               \
00342         );                                              \
00343         out;                                            \
00344 })
00345 
00353 #define paired_nmsub(mul0, mul1, sub) ({                \
00354         double out;                                     \
00355         asm volatile                                    \
00356         ("      ps_nmsub        %0, %1, %2, %3\n"       \
00357          : "=f"(out)                                    \
00358          : "f"(mul0), "f"(mul1), "f"(sub)               \
00359         );                                              \
00360         out;                                            \
00361 })
00362 
00369 #define paired_merge00(pair0, pair1) ({                 \
00370         double out;                                     \
00371         asm volatile                                    \
00372         ("      ps_merge00      %0, %1, %2\n"           \
00373          : "=f"(out)                                    \
00374          : "f"(pair0), "f"(pair1)                       \
00375         );                                              \
00376         out;                                            \
00377 })
00378 
00385 #define paired_merge01(pair0, pair1) ({                 \
00386         double out;                                     \
00387         asm volatile                                    \
00388         ("      ps_merge01      %0, %1, %2\n"           \
00389          : "=f"(out)                                    \
00390          : "f"(pair0), "f"(pair1)                       \
00391         );                                              \
00392         out;                                            \
00393 })
00394 
00401 #define paired_merge10(pair0, pair1) ({                 \
00402         double out;                                     \
00403         asm volatile                                    \
00404         ("      ps_merge10      %0, %1, %2\n"           \
00405          : "=f"(out)                                    \
00406          : "f"(pair0), "f"(pair1)                       \
00407         );                                              \
00408         out;                                            \
00409 })
00410 
00417 #define paired_merge11(pair0, pair1) ({                 \
00418         double out;                                     \
00419         asm volatile                                    \
00420         ("      ps_merge11      %0, %1, %2\n"           \
00421          : "=f"(out)                                    \
00422          : "f"(pair0), "f"(pair1)                       \
00423         );                                              \
00424         out;                                            \
00425 })
00426 
00442 #define paired_select(sel, pos, neg) ({                 \
00443         double out;                                     \
00444         asm volatile                                    \
00445         ("      ps_sel          %0, %1, %2, %3\n"       \
00446          : "=f"(out)                                    \
00447          : "f"(sel), "f"(pos), "f"(neg)                 \
00448         );                                              \
00449         out;                                            \
00450 })
00451 
00459 #define paired_sum0(pair0, pair1, pair2) ({             \
00460         double out;                                     \
00461         asm volatile                                    \
00462         ("      ps_sum0         %0, %1, %2, %3\n"       \
00463          : "=f"(out)                                    \
00464          : "f"(pair0), "f"(pair2), "f"(pair1)           \
00465         );                                              \
00466         out;                                            \
00467 })
00468 
00476 #define paired_sum1(pair0, pair1, pair2) ({             \
00477         double out;                                     \
00478         asm volatile                                    \
00479         ("      ps_sum1         %0, %1, %2, %3\n"       \
00480          : "=f"(out)                                    \
00481          : "f"(pair0), "f"(pair2), "f"(pair1)           \
00482         );                                              \
00483         out;                                            \
00484 })
00485 
00486 #endif
00487 
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Defines
Generated by  doxygen 1.6.3