1 //===----------------------------------------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #ifndef _HEXAGON_CIRC_BREV_INTRINSICS_H_ 10 #define _HEXAGON_CIRC_BREV_INTRINSICS_H_ 1 11 12 #include <hexagon_protos.h> 13 #include <stdint.h> 14 15 /* Circular Load */ 16 /* ========================================================================== 17 Assembly Syntax: Return=instruction() 18 C Intrinsic Prototype: void Q6_circ_load_update_D(Word64 dst, Word64 *ptr, UWord32 incr, UWord32 bufsize, UWord32 K) 19 Instruction Type: InstructionType 20 Execution Slots: SLOT0123 21 ========================================================================== */ 22 #define Q6_circ_load_update_D(dest,ptr,incr,bufsize,K) \ 23 { ptr = (int64_t *) HEXAGON_circ_ldd (ptr, &(dest), ((((K)+1)<<24)|((bufsize)<<3)), ((incr)*8)); } 24 25 /* ========================================================================== 26 Assembly Syntax: Return=instruction() 27 C Intrinsic Prototype: void Q6_circ_load_update_W(Word32 dst, Word32 *ptr, UWord32 incr, UWord32 bufsize, UWord32 K) 28 Instruction Type: InstructionType 29 Execution Slots: SLOT0123 30 ========================================================================== */ 31 #define Q6_circ_load_update_W(dest,ptr,incr,bufsize,K) \ 32 { ptr = (int *) HEXAGON_circ_ldw (ptr, &(dest), (((K)<<24)|((bufsize)<<2)), ((incr)*4)); } 33 34 /* ========================================================================== 35 Assembly Syntax: Return=instruction() 36 C Intrinsic Prototype: void Q6_circ_load_update_H(Word16 dst, Word16 *ptr, UWord32 incr, UWord32 bufsize, UWord32 K) 37 Instruction Type: InstructionType 38 Execution Slots: SLOT0123 39 ========================================================================== */ 40 #define Q6_circ_load_update_H(dest,ptr,incr,bufsize,K) \ 41 { ptr = (int16_t *) HEXAGON_circ_ldh (ptr, &(dest), ((((K)-1)<<24)|((bufsize)<<1)), ((incr)*2)); } 42 43 /* ========================================================================== 44 Assembly Syntax: Return=instruction() 45 C Intrinsic Prototype: void Q6_circ_load_update_UH( UWord16 dst, UWord16 *ptr, UWord32 incr, UWord32 bufsize, UWord32 K) 46 Instruction Type: InstructionType 47 Execution Slots: SLOT0123 48 ========================================================================== */ 49 #define Q6_circ_load_update_UH(dest,ptr,incr,bufsize,K) \ 50 { ptr = (uint16_t *) HEXAGON_circ_lduh (ptr, &(dest), ((((K)-1)<<24)|((bufsize)<<1)), ((incr)*2)); } 51 52 /* ========================================================================== 53 Assembly Syntax: Return=instruction() 54 C Intrinsic Prototype: void Q6_circ_load_update_B(Word8 dst, Word8 *ptr, UWord32 incr, UWord32 bufsize, UWord32 K) 55 Instruction Type: InstructionType 56 Execution Slots: SLOT0123 57 ========================================================================== */ 58 #define Q6_circ_load_update_B(dest,ptr,incr,bufsize,K) \ 59 { ptr = (int8_t *) HEXAGON_circ_ldb (ptr, &(dest), ((((K)-2)<<24)|(bufsize)), incr); } 60 61 /* ========================================================================== 62 Assembly Syntax: Return=instruction() 63 C Intrinsic Prototype: void Q6_circ_load_update_UB(UWord8 dst, UWord8 *ptr, UWord32 incr, UWord32 bufsize, UWord32 K) 64 Instruction Type: InstructionType 65 Execution Slots: SLOT0123 66 ========================================================================== */ 67 #define Q6_circ_load_update_UB(dest,ptr,incr,bufsize,K) \ 68 { ptr = (uint8_t *) HEXAGON_circ_ldub (ptr, &(dest), ((((K)-2)<<24)|(bufsize)), incr); } 69 70 /* Circular Store */ 71 /* ========================================================================== 72 Assembly Syntax: Return=instruction() 73 C Intrinsic Prototype: void Q6_circ_store_update_D(Word64 *src, Word64 *ptr, UWord32 incr, UWord32 bufsize, UWord32 K) 74 Instruction Type: InstructionType 75 Execution Slots: SLOT0123 76 ========================================================================== */ 77 #define Q6_circ_store_update_D(src,ptr,incr,bufsize,K) \ 78 { ptr = (int64_t *) HEXAGON_circ_std (ptr, src, ((((K)+1)<<24)|((bufsize)<<3)), ((incr)*8)); } 79 80 /* ========================================================================== 81 Assembly Syntax: Return=instruction() 82 C Intrinsic Prototype: void Q6_circ_store_update_W(Word32 *src, Word32 *ptr, UWord32 incr, UWord32 bufsize, UWord32 K) 83 Instruction Type: InstructionType 84 Execution Slots: SLOT0123 85 ========================================================================== */ 86 #define Q6_circ_store_update_W(src,ptr,incr,bufsize,K) \ 87 { ptr = (int *) HEXAGON_circ_stw (ptr, src, (((K)<<24)|((bufsize)<<2)), ((incr)*4)); } 88 89 /* ========================================================================== 90 Assembly Syntax: Return=instruction() 91 C Intrinsic Prototype: void Q6_circ_store_update_HL(Word16 *src, Word16 *ptr, UWord32 incr, UWord32 bufsize, UWord32 K) 92 Instruction Type: InstructionType 93 Execution Slots: SLOT0123 94 ========================================================================== */ 95 #define Q6_circ_store_update_HL(src,ptr,incr,bufsize,K) \ 96 { ptr = (int16_t *) HEXAGON_circ_sth (ptr, src, ((((K)-1)<<24)|((bufsize)<<1)), ((incr)*2)); } 97 98 /* ========================================================================== 99 Assembly Syntax: Return=instruction() 100 C Intrinsic Prototype: void Q6_circ_store_update_HH(Word16 *src, Word16 *ptr, UWord32 incr, UWord32 bufsize, UWord32 K) 101 Instruction Type: InstructionType 102 Execution Slots: SLOT0123 103 ========================================================================== */ 104 #define Q6_circ_store_update_HH(src,ptr,incr,bufsize,K) \ 105 { ptr = (int16_t *) HEXAGON_circ_sthhi (ptr, src, ((((K)-1)<<24)|((bufsize)<<1)), ((incr)*2)); } 106 107 /* ========================================================================== 108 Assembly Syntax: Return=instruction() 109 C Intrinsic Prototype: void Q6_circ_store_update_B(Word8 *src, Word8 *ptr, UWord32 I4, UWord32 bufsize, UWord64 K) 110 Instruction Type: InstructionType 111 Execution Slots: SLOT0123 112 ========================================================================== */ 113 #define Q6_circ_store_update_B(src,ptr,incr,bufsize,K) \ 114 { ptr = (int8_t *) HEXAGON_circ_stb (ptr, src, ((((K)-2)<<24)|(bufsize)), incr); } 115 116 117 /* Bit Reverse Load */ 118 /* ========================================================================== 119 Assembly Syntax: Return=instruction() 120 C Intrinsic Prototype: void Q6_bitrev_load_update_D(Word64 dst, Word64 *ptr, UWord32 Iu4) 121 Instruction Type: InstructionType 122 Execution Slots: SLOT0123 123 ========================================================================== */ 124 #define Q6_bitrev_load_update_D(dest,ptr,log2bufsize) \ 125 { ptr = (int64_t *) HEXAGON_brev_ldd (ptr, &(dest), (1<<(16-((log2bufsize) + 3)))); } 126 127 /* ========================================================================== 128 Assembly Syntax: Return=instruction() 129 C Intrinsic Prototype: void Q6_bitrev_load_update_W(Word32 dst, Word32 *ptr, UWord32 Iu4) 130 Instruction Type: InstructionType 131 Execution Slots: SLOT0123 132 ========================================================================== */ 133 #define Q6_bitrev_load_update_W(dest,ptr,log2bufsize) \ 134 { ptr = (int *) HEXAGON_brev_ldw (ptr, &(dest), (1<<(16-((log2bufsize) + 2)))); } 135 136 /* ========================================================================== 137 Assembly Syntax: Return=instruction() 138 C Intrinsic Prototype: void Q6_bitrev_load_update_H(Word16 dst, Word16 *ptr, UWord32 Iu4) 139 Instruction Type: InstructionType 140 Execution Slots: SLOT0123 141 ========================================================================== */ 142 #define Q6_bitrev_load_update_H(dest,ptr,log2bufsize) \ 143 { ptr = (int16_t *) HEXAGON_brev_ldh (ptr, &(dest), (1<<(16-((log2bufsize) + 1)))); } 144 145 /* ========================================================================== 146 Assembly Syntax: Return=instruction() 147 C Intrinsic Prototype: void Q6_bitrev_load_update_UH(UWord16 dst, UWord16 *ptr, UWord32 Iu4) 148 Instruction Type: InstructionType 149 Execution Slots: SLOT0123 150 ========================================================================== */ 151 #define Q6_bitrev_load_update_UH(dest,ptr,log2bufsize) \ 152 { ptr = (uint16_t *) HEXAGON_brev_lduh (ptr, &(dest), (1<<(16-((log2bufsize) + 1)))); } 153 154 /* ========================================================================== 155 Assembly Syntax: Return=instruction() 156 C Intrinsic Prototype: void Q6_bitrev_load_update_B(Word8 dst, Word8 *ptr, UWord32 Iu4) 157 Instruction Type: InstructionType 158 Execution Slots: SLOT0123 159 ========================================================================== */ 160 #define Q6_bitrev_load_update_B(dest,ptr,log2bufsize) \ 161 { ptr = (int8_t *) HEXAGON_brev_ldb (ptr, &(dest), (1<<(16-((log2bufsize))))); } 162 163 /* ========================================================================== 164 Assembly Syntax: Return=instruction() 165 C Intrinsic Prototype: void Q6_bitrev_load_update_UB(UWord8 dst, UWord8 *ptr, UWord32 Iu4) 166 Instruction Type: InstructionType 167 Execution Slots: SLOT0123 168 ========================================================================== */ 169 #define Q6_bitrev_load_update_UB(dest,ptr,log2bufsize) \ 170 { ptr = (uint8_t *) HEXAGON_brev_ldub (ptr, &(dest), (1<<(16-((log2bufsize))))); } 171 172 /* Bit Reverse Store */ 173 174 /* ========================================================================== 175 Assembly Syntax: Return=instruction() 176 C Intrinsic Prototype: void Q6_bitrev_store_update_D(Word64 *src, Word64 *ptr, UWord32 Iu4) 177 Instruction Type: InstructionType 178 Execution Slots: SLOT0123 179 ========================================================================== */ 180 #define Q6_bitrev_store_update_D(src,ptr,log2bufsize) \ 181 { ptr = (int64_t *) HEXAGON_brev_std (ptr, src, (1<<(16-((log2bufsize) + 3)))); } 182 183 /* ========================================================================== 184 Assembly Syntax: Return=instruction() 185 C Intrinsic Prototype: void Q6_bitrev_store_update_W(Word32 *src, Word32 *ptr, UWord32 Iu4) 186 Instruction Type: InstructionType 187 Execution Slots: SLOT0123 188 ========================================================================== */ 189 #define Q6_bitrev_store_update_W(src,ptr,log2bufsize) \ 190 { ptr = (int *) HEXAGON_brev_stw (ptr, src, (1<<(16-((log2bufsize) + 2)))); } 191 192 /* ========================================================================== 193 Assembly Syntax: Return=instruction() 194 C Intrinsic Prototype: void Q6_bitrev_store_update_HL(Word16 *src, Word16 *ptr, Word32 Iu4) 195 Instruction Type: InstructionType 196 Execution Slots: SLOT0123 197 ========================================================================== */ 198 #define Q6_bitrev_store_update_HL(src,ptr,log2bufsize) \ 199 { ptr = (int16_t *) HEXAGON_brev_sth (ptr, src, (1<<(16-((log2bufsize) + 1)))); } 200 201 /* ========================================================================== 202 Assembly Syntax: Return=instruction() 203 C Intrinsic Prototype: void Q6_bitrev_store_update_HH(Word16 *src, Word16 *ptr, UWord32 Iu4) 204 Instruction Type: InstructionType 205 Execution Slots: SLOT0123 206 ========================================================================== */ 207 #define Q6_bitrev_store_update_HH(src,ptr,log2bufsize) \ 208 { ptr = (int16_t *) HEXAGON_brev_sthhi (ptr, src, (1<<(16-((log2bufsize) + 1)))); } 209 210 /* ========================================================================== 211 Assembly Syntax: Return=instruction() 212 C Intrinsic Prototype: void Q6_bitrev_store_update_B(Word8 *src, Word8 *ptr, UWord32 Iu4) 213 Instruction Type: InstructionType 214 Execution Slots: SLOT0123 215 ========================================================================== */ 216 #define Q6_bitrev_store_update_B(src,ptr,log2bufsize) \ 217 { ptr = (int8_t *) HEXAGON_brev_stb (ptr, src, (1<<(16-((log2bufsize))))); } 218 219 220 #define HEXAGON_circ_ldd __builtin_circ_ldd 221 #define HEXAGON_circ_ldw __builtin_circ_ldw 222 #define HEXAGON_circ_ldh __builtin_circ_ldh 223 #define HEXAGON_circ_lduh __builtin_circ_lduh 224 #define HEXAGON_circ_ldb __builtin_circ_ldb 225 #define HEXAGON_circ_ldub __builtin_circ_ldub 226 227 228 #define HEXAGON_circ_std __builtin_circ_std 229 #define HEXAGON_circ_stw __builtin_circ_stw 230 #define HEXAGON_circ_sth __builtin_circ_sth 231 #define HEXAGON_circ_sthhi __builtin_circ_sthhi 232 #define HEXAGON_circ_stb __builtin_circ_stb 233 234 235 #define HEXAGON_brev_ldd __builtin_brev_ldd 236 #define HEXAGON_brev_ldw __builtin_brev_ldw 237 #define HEXAGON_brev_ldh __builtin_brev_ldh 238 #define HEXAGON_brev_lduh __builtin_brev_lduh 239 #define HEXAGON_brev_ldb __builtin_brev_ldb 240 #define HEXAGON_brev_ldub __builtin_brev_ldub 241 242 #define HEXAGON_brev_std __builtin_brev_std 243 #define HEXAGON_brev_stw __builtin_brev_stw 244 #define HEXAGON_brev_sth __builtin_brev_sth 245 #define HEXAGON_brev_sthhi __builtin_brev_sthhi 246 #define HEXAGON_brev_stb __builtin_brev_stb 247 248 #ifdef __HVX__ 249 /* ========================================================================== 250 Assembly Syntax: if (Qt) vmem(Rt+#0) = Vs 251 C Intrinsic Prototype: void Q6_vmaskedstoreq_QAV(HVX_VectorPred Qt, HVX_VectorAddress A, HVX_Vector Vs) 252 Instruction Type: COPROC_VMEM 253 Execution Slots: SLOT0 254 ========================================================================== */ 255 256 #define Q6_vmaskedstoreq_QAV __BUILTIN_VECTOR_WRAP(__builtin_HEXAGON_V6_vmaskedstoreq) 257 258 /* ========================================================================== 259 Assembly Syntax: if (!Qt) vmem(Rt+#0) = Vs 260 C Intrinsic Prototype: void Q6_vmaskedstorenq_QAV(HVX_VectorPred Qt, HVX_VectorAddress A, HVX_Vector Vs) 261 Instruction Type: COPROC_VMEM 262 Execution Slots: SLOT0 263 ========================================================================== */ 264 265 #define Q6_vmaskedstorenq_QAV __BUILTIN_VECTOR_WRAP(__builtin_HEXAGON_V6_vmaskedstorenq) 266 267 /* ========================================================================== 268 Assembly Syntax: if (Qt) vmem(Rt+#0):nt = Vs 269 C Intrinsic Prototype: void Q6_vmaskedstorentq_QAV(HVX_VectorPred Qt, HVX_VectorAddress A, HVX_Vector Vs) 270 Instruction Type: COPROC_VMEM 271 Execution Slots: SLOT0 272 ========================================================================== */ 273 274 #define Q6_vmaskedstorentq_QAV __BUILTIN_VECTOR_WRAP(__builtin_HEXAGON_V6_vmaskedstorentq) 275 276 /* ========================================================================== 277 Assembly Syntax: if (!Qt) vmem(Rt+#0):nt = Vs 278 C Intrinsic Prototype: void Q6_vmaskedstorentnq_QAV(HVX_VectorPred Qt, HVX_VectorAddress A, HVX_Vector Vs) 279 Instruction Type: COPROC_VMEM 280 Execution Slots: SLOT0 281 ========================================================================== */ 282 283 #define Q6_vmaskedstorentnq_QAV __BUILTIN_VECTOR_WRAP(__builtin_HEXAGON_V6_vmaskedstorentnq) 284 285 #endif 286 287 288 #endif /* #ifndef _HEXAGON_CIRC_BREV_INTRINSICS_H_ */ 289 290 #ifdef __NOT_DEFINED__ 291 /*** comment block template ***/ 292 /* ========================================================================== 293 Assembly Syntax: Return=instruction() 294 C Intrinsic Prototype: ReturnType Intrinsic(ParamType Rs, ParamType Rt) 295 Instruction Type: InstructionType 296 Execution Slots: SLOT0123 297 ========================================================================== */ 298 #endif /*** __NOT_DEFINED__ ***/ 299