00001
00002
00003
00004
00005
00006
00007
00008
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) \
00068 : "rm"(data), "i"(single), "i"(gqr) \
00069 ); \
00070 pair; \
00071 })
00072
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
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