• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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