1 /* 2 * Header file for wrappers around MSA instructions assembler invocations 3 * 4 * Copyright (C) 2019 Wave Computing, Inc. 5 * Copyright (C) 2019 Aleksandar Markovic <amarkovic@wavecomp.com> 6 * 7 * This program is free software: you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License as published by 9 * the Free Software Foundation, either version 2 of the License, or 10 * (at your option) any later version. 11 * 12 * This program is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * GNU General Public License for more details. 16 * 17 * You should have received a copy of the GNU General Public License 18 * along with this program. If not, see <https://www.gnu.org/licenses/>. 19 * 20 */ 21 22 #ifndef WRAPPERS_MSA_H 23 #define WRAPPERS_MSA_H 24 25 26 #define DO_MSA__WD__WS(suffix, mnemonic) \ 27 static inline void do_msa_##suffix(void *input, void *output) \ 28 { \ 29 __asm__ volatile ( \ 30 "move $t0, %0\n\t" \ 31 "ld.d $w11, 0($t0)\n\t" \ 32 #mnemonic " $w10, $w11\n\t" \ 33 "move $t0, %1\n\t" \ 34 "st.d $w10, 0($t0)\n\t" \ 35 : \ 36 : "r" (input), "r" (output) \ 37 : "t0", "memory" \ 38 ); \ 39 } 40 41 #define DO_MSA__WD__WD(suffix, mnemonic) \ 42 static inline void do_msa_##suffix(void *input, void *output) \ 43 { \ 44 __asm__ volatile ( \ 45 "move $t0, %0\n\t" \ 46 "ld.d $w11, 0($t0)\n\t" \ 47 #mnemonic " $w10, $w10\n\t" \ 48 "move $t0, %1\n\t" \ 49 "st.d $w10, 0($t0)\n\t" \ 50 : \ 51 : "r" (input), "r" (output) \ 52 : "t0", "memory" \ 53 ); \ 54 } 55 56 DO_MSA__WD__WS(NLOC_B, nloc.b) 57 DO_MSA__WD__WS(NLOC_H, nloc.h) 58 DO_MSA__WD__WS(NLOC_W, nloc.w) 59 DO_MSA__WD__WS(NLOC_D, nloc.d) 60 61 DO_MSA__WD__WS(NLZC_B, nlzc.b) 62 DO_MSA__WD__WS(NLZC_H, nlzc.h) 63 DO_MSA__WD__WS(NLZC_W, nlzc.w) 64 DO_MSA__WD__WS(NLZC_D, nlzc.d) 65 66 DO_MSA__WD__WS(PCNT_B, pcnt.b) 67 DO_MSA__WD__WS(PCNT_H, pcnt.h) 68 DO_MSA__WD__WS(PCNT_W, pcnt.w) 69 DO_MSA__WD__WS(PCNT_D, pcnt.d) 70 71 72 #define DO_MSA__WD__WS_WT(suffix, mnemonic) \ 73 static inline void do_msa_##suffix(void *input1, void *input2, \ 74 void *output) \ 75 { \ 76 __asm__ volatile ( \ 77 "move $t0, %0\n\t" \ 78 "ld.d $w11, 0($t0)\n\t" \ 79 "move $t0, %1\n\t" \ 80 "ld.d $w12, 0($t0)\n\t" \ 81 #mnemonic " $w10, $w11, $w12\n\t" \ 82 "move $t0, %2\n\t" \ 83 "st.d $w10, 0($t0)\n\t" \ 84 : \ 85 : "r" (input1), "r" (input2), "r" (output) \ 86 : "t0", "memory" \ 87 ); \ 88 } 89 90 #define DO_MSA__WD__WD_WT(suffix, mnemonic) \ 91 static inline void do_msa_##suffix(void *input1, void *input2, \ 92 void *output) \ 93 { \ 94 __asm__ volatile ( \ 95 "move $t0, %0\n\t" \ 96 "ld.d $w11, 0($t0)\n\t" \ 97 "move $t0, %1\n\t" \ 98 "ld.d $w12, 0($t0)\n\t" \ 99 #mnemonic " $w10, $w10, $w12\n\t" \ 100 "move $t0, %2\n\t" \ 101 "st.d $w10, 0($t0)\n\t" \ 102 : \ 103 : "r" (input1), "r" (input2), "r" (output) \ 104 : "t0", "memory" \ 105 ); \ 106 } 107 108 #define DO_MSA__WD__WS_WD(suffix, mnemonic) \ 109 static inline void do_msa_##suffix(void *input1, void *input2, \ 110 void *output) \ 111 { \ 112 __asm__ volatile ( \ 113 "move $t0, %0\n\t" \ 114 "ld.d $w11, 0($t0)\n\t" \ 115 "move $t0, %1\n\t" \ 116 "ld.d $w12, 0($t0)\n\t" \ 117 #mnemonic " $w10, $w11, $w10\n\t" \ 118 "move $t0, %2\n\t" \ 119 "st.d $w10, 0($t0)\n\t" \ 120 : \ 121 : "r" (input1), "r" (input2), "r" (output) \ 122 : "t0", "memory" \ 123 ); \ 124 } 125 126 DO_MSA__WD__WS_WT(ILVEV_B, ilvev.b) 127 DO_MSA__WD__WS_WT(ILVEV_H, ilvev.h) 128 DO_MSA__WD__WS_WT(ILVEV_W, ilvev.w) 129 DO_MSA__WD__WS_WT(ILVEV_D, ilvev.d) 130 131 DO_MSA__WD__WS_WT(ILVOD_B, ilvod.b) 132 DO_MSA__WD__WS_WT(ILVOD_H, ilvod.h) 133 DO_MSA__WD__WS_WT(ILVOD_W, ilvod.w) 134 DO_MSA__WD__WS_WT(ILVOD_D, ilvod.d) 135 136 DO_MSA__WD__WS_WT(ILVL_B, ilvl.b) 137 DO_MSA__WD__WS_WT(ILVL_H, ilvl.h) 138 DO_MSA__WD__WS_WT(ILVL_W, ilvl.w) 139 DO_MSA__WD__WS_WT(ILVL_D, ilvl.d) 140 141 DO_MSA__WD__WS_WT(ILVR_B, ilvr.b) 142 DO_MSA__WD__WS_WT(ILVR_H, ilvr.h) 143 DO_MSA__WD__WS_WT(ILVR_W, ilvr.w) 144 DO_MSA__WD__WS_WT(ILVR_D, ilvr.d) 145 146 DO_MSA__WD__WS_WT(AND_V, and.v) 147 DO_MSA__WD__WS_WT(NOR_V, nor.v) 148 DO_MSA__WD__WS_WT(OR_V, or.v) 149 DO_MSA__WD__WS_WT(XOR_V, xor.v) 150 151 DO_MSA__WD__WS_WT(CEQ_B, ceq.b) 152 DO_MSA__WD__WS_WT(CEQ_H, ceq.h) 153 DO_MSA__WD__WS_WT(CEQ_W, ceq.w) 154 DO_MSA__WD__WS_WT(CEQ_D, ceq.d) 155 156 DO_MSA__WD__WS_WT(CLE_S_B, cle_s.b) 157 DO_MSA__WD__WS_WT(CLE_S_H, cle_s.h) 158 DO_MSA__WD__WS_WT(CLE_S_W, cle_s.w) 159 DO_MSA__WD__WS_WT(CLE_S_D, cle_s.d) 160 161 DO_MSA__WD__WS_WT(CLE_U_B, cle_u.b) 162 DO_MSA__WD__WS_WT(CLE_U_H, cle_u.h) 163 DO_MSA__WD__WS_WT(CLE_U_W, cle_u.w) 164 DO_MSA__WD__WS_WT(CLE_U_D, cle_u.d) 165 166 DO_MSA__WD__WS_WT(CLT_S_B, clt_s.b) 167 DO_MSA__WD__WS_WT(CLT_S_H, clt_s.h) 168 DO_MSA__WD__WS_WT(CLT_S_W, clt_s.w) 169 DO_MSA__WD__WS_WT(CLT_S_D, clt_s.d) 170 171 DO_MSA__WD__WS_WT(CLT_U_B, clt_u.b) 172 DO_MSA__WD__WS_WT(CLT_U_H, clt_u.h) 173 DO_MSA__WD__WS_WT(CLT_U_W, clt_u.w) 174 DO_MSA__WD__WS_WT(CLT_U_D, clt_u.d) 175 176 DO_MSA__WD__WS_WT(MAX_A_B, max_a.b) 177 DO_MSA__WD__WS_WT(MAX_A_H, max_a.h) 178 DO_MSA__WD__WS_WT(MAX_A_W, max_a.w) 179 DO_MSA__WD__WS_WT(MAX_A_D, max_a.d) 180 181 DO_MSA__WD__WS_WT(MIN_A_B, min_a.b) 182 DO_MSA__WD__WS_WT(MIN_A_H, min_a.h) 183 DO_MSA__WD__WS_WT(MIN_A_W, min_a.w) 184 DO_MSA__WD__WS_WT(MIN_A_D, min_a.d) 185 186 DO_MSA__WD__WS_WT(MAX_S_B, max_s.b) 187 DO_MSA__WD__WS_WT(MAX_S_H, max_s.h) 188 DO_MSA__WD__WS_WT(MAX_S_W, max_s.w) 189 DO_MSA__WD__WS_WT(MAX_S_D, max_s.d) 190 191 DO_MSA__WD__WS_WT(MIN_S_B, min_s.b) 192 DO_MSA__WD__WS_WT(MIN_S_H, min_s.h) 193 DO_MSA__WD__WS_WT(MIN_S_W, min_s.w) 194 DO_MSA__WD__WS_WT(MIN_S_D, min_s.d) 195 196 DO_MSA__WD__WS_WT(MAX_U_B, max_u.b) 197 DO_MSA__WD__WS_WT(MAX_U_H, max_u.h) 198 DO_MSA__WD__WS_WT(MAX_U_W, max_u.w) 199 DO_MSA__WD__WS_WT(MAX_U_D, max_u.d) 200 201 DO_MSA__WD__WS_WT(MIN_U_B, min_u.b) 202 DO_MSA__WD__WS_WT(MIN_U_H, min_u.h) 203 DO_MSA__WD__WS_WT(MIN_U_W, min_u.w) 204 DO_MSA__WD__WS_WT(MIN_U_D, min_u.d) 205 206 DO_MSA__WD__WS_WT(BCLR_B, bclr.b) 207 DO_MSA__WD__WS_WT(BCLR_H, bclr.h) 208 DO_MSA__WD__WS_WT(BCLR_W, bclr.w) 209 DO_MSA__WD__WS_WT(BCLR_D, bclr.d) 210 211 DO_MSA__WD__WS_WT(BSET_B, bset.b) 212 DO_MSA__WD__WS_WT(BSET_H, bset.h) 213 DO_MSA__WD__WS_WT(BSET_W, bset.w) 214 DO_MSA__WD__WS_WT(BSET_D, bset.d) 215 216 DO_MSA__WD__WS_WT(BNEG_B, bneg.b) 217 DO_MSA__WD__WS_WT(BNEG_H, bneg.h) 218 DO_MSA__WD__WS_WT(BNEG_W, bneg.w) 219 DO_MSA__WD__WS_WT(BNEG_D, bneg.d) 220 221 DO_MSA__WD__WS_WT(PCKEV_B, pckev.b) 222 DO_MSA__WD__WS_WT(PCKEV_H, pckev.h) 223 DO_MSA__WD__WS_WT(PCKEV_W, pckev.w) 224 DO_MSA__WD__WS_WT(PCKEV_D, pckev.d) 225 226 DO_MSA__WD__WS_WT(PCKOD_B, pckod.b) 227 DO_MSA__WD__WS_WT(PCKOD_H, pckod.h) 228 DO_MSA__WD__WS_WT(PCKOD_W, pckod.w) 229 DO_MSA__WD__WS_WT(PCKOD_D, pckod.d) 230 231 DO_MSA__WD__WS_WT(VSHF_B, vshf.b) 232 DO_MSA__WD__WS_WT(VSHF_H, vshf.h) 233 DO_MSA__WD__WS_WT(VSHF_W, vshf.w) 234 DO_MSA__WD__WS_WT(VSHF_D, vshf.d) 235 236 DO_MSA__WD__WS_WT(SLL_B, sll.b) 237 DO_MSA__WD__WS_WT(SLL_H, sll.h) 238 DO_MSA__WD__WS_WT(SLL_W, sll.w) 239 DO_MSA__WD__WS_WT(SLL_D, sll.d) 240 241 DO_MSA__WD__WS_WT(SRA_B, sra.b) 242 DO_MSA__WD__WS_WT(SRA_H, sra.h) 243 DO_MSA__WD__WS_WT(SRA_W, sra.w) 244 DO_MSA__WD__WS_WT(SRA_D, sra.d) 245 246 DO_MSA__WD__WS_WT(SRAR_B, srar.b) 247 DO_MSA__WD__WS_WT(SRAR_H, srar.h) 248 DO_MSA__WD__WS_WT(SRAR_W, srar.w) 249 DO_MSA__WD__WS_WT(SRAR_D, srar.d) 250 251 DO_MSA__WD__WS_WT(SRL_B, srl.b) 252 DO_MSA__WD__WS_WT(SRL_H, srl.h) 253 DO_MSA__WD__WS_WT(SRL_W, srl.w) 254 DO_MSA__WD__WS_WT(SRL_D, srl.d) 255 256 DO_MSA__WD__WS_WT(SRLR_B, srlr.b) 257 DO_MSA__WD__WS_WT(SRLR_H, srlr.h) 258 DO_MSA__WD__WS_WT(SRLR_W, srlr.w) 259 DO_MSA__WD__WS_WT(SRLR_D, srlr.d) 260 261 DO_MSA__WD__WS_WT(BMNZ_V, bmnz.v) 262 DO_MSA__WD__WS_WT(BMZ_V, bmz.v) 263 264 DO_MSA__WD__WS_WT(FMAX_W, fmax.w) 265 DO_MSA__WD__WS_WT(FMAX_D, fmax.d) 266 267 DO_MSA__WD__WS_WT(FMAX_A_W, fmax_a.w) 268 DO_MSA__WD__WS_WT(FMAX_A_D, fmax_a.d) 269 270 DO_MSA__WD__WS_WT(FMIN_W, fmin.w) 271 DO_MSA__WD__WS_WT(FMIN_D, fmin.d) 272 273 DO_MSA__WD__WS_WT(FMIN_A_W, fmin_a.w) 274 DO_MSA__WD__WS_WT(FMIN_A_D, fmin_a.d) 275 276 277 #endif 278