| 325 | } |
| 326 | |
| 327 | GI_FORCEINLINE |
| 328 | void GiStoreHighInt8(void* Buffer, GI_INT8_t Vector) { |
| 329 | #if defined(GI_NEON_INTRINSICS) |
| 330 | vst1_s8((int8_t*)Buffer, vget_high_s8(Vector)); |
| 331 | #elif defined(GI_SSE2_INTRINSICS) |
| 332 | _mm_storel_epi64((__m128i*)Buffer, _mm_unpackhi_epi64(Vector, Vector)); |
| 333 | #elif defined(GI_RVV_INTRINSICS) |
| 334 | vuint8m1_t index; |
| 335 | #if GI_SIMD_LEN_BYTE == 16 |
| 336 | uint8_t index_128[16] = {8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7}; |
| 337 | index = vle8_v_u8m1(index_128, 16); |
| 338 | #else |
| 339 | uint8_t* index_p = (uint8_t*)&index; |
| 340 | int32_t offset = GI_SIMD_LEN_BYTE / sizeof(int8_t) / 2; |
| 341 | for (size_t i = 0; i < GI_SIMD_LEN_BYTE / sizeof(int8_t) / 2; i++) { |
| 342 | index_p[i] = offset + i; |
| 343 | index_p[offset + i] = i; |
| 344 | } |
| 345 | #endif |
| 346 | vint8m1_t g_d = vrgather_vv_i8m1(Vector, index, GI_SIMD_LEN_BYTE / sizeof(int8_t)); |
| 347 | vse8_v_i8m1((int8_t*)Buffer, g_d, GI_SIMD_LEN_BYTE / sizeof(int8_t) / 2); |
| 348 | #else |
| 349 | int8_t* ptr = (int8_t*)Buffer; |
| 350 | for (size_t i = 0; i < GI_SIMD_LEN_BYTE / 2 / sizeof(int8_t); i++) { |
| 351 | ptr[i] = Vector[GI_SIMD_LEN_BYTE / 2 + i]; |
| 352 | } |
| 353 | #endif |
| 354 | } |
| 355 | |
| 356 | GI_FORCEINLINE |
| 357 | GI_INT32_t GiNegInt32(GI_INT32_t Vector) { |
nothing calls this directly
no outgoing calls
no test coverage detected