1/* Copyright © 2024 Intel Corporation 2 * SPDX-License-Identifier: MIT 3 */ 4 5#include "libintel_shaders.h" 6 7/* Memcpy data using multiple lanes. */ 8void genX(libanv_memcpy)(global void *dst_base, 9 global void *src_base, 10 uint num_dwords, 11 uint dword_offset) 12{ 13 global void *dst = dst_base + 4 * dword_offset; 14 global void *src = src_base + 4 * dword_offset; 15 16 if (dword_offset + 4 <= num_dwords) { 17 *(global uint4 *)(dst) = *(global uint4 *)(src); 18 } else if (dword_offset + 3 <= num_dwords) { 19 *(global uint3 *)(dst) = *(global uint3 *)(src); 20 } else if (dword_offset + 2 <= num_dwords) { 21 *(global uint2 *)(dst) = *(global uint2 *)(src); 22 } else if (dword_offset + 1 <= num_dwords) { 23 *(global uint *)(dst) = *(global uint *)(src); 24 } 25} 26 27/* Copy size from src_ptr to dst_ptr for using a single lane with size 28 * multiple of 4. 29 */ 30void genX(copy_data)(global void *dst_ptr, 31 global void *src_ptr, 32 uint32_t size) 33{ 34 for (uint32_t offset = 0; offset < size; offset += 16) { 35 if (offset + 16 <= size) { 36 *(global uint4 *)(dst_ptr + offset) = *(global uint4 *)(src_ptr + offset); 37 } else if (offset + 12 <= size) { 38 *(global uint3 *)(dst_ptr + offset) = *(global uint3 *)(src_ptr + offset); 39 } else if (offset + 8 <= size) { 40 *(global uint2 *)(dst_ptr + offset) = *(global uint2 *)(src_ptr + offset); 41 } else if (offset + 4 <= size) { 42 *(global uint *)(dst_ptr + offset) = *(global uint *)(src_ptr + offset); 43 } 44 } 45} 46