brintos

brintos / llvm-project-archived public Read only

0
0
Text · 7.1 KiB · 5942f10 Raw
131 lines · plain
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-exception6//7//===----------------------------------------------------------------------===//8 9#include <clc/internal/clc.h>10#include <clc/shared/clc_vload.h>11 12#define __CLC_VLOAD_VECTORIZE(PRIM_TYPE, ADDR_SPACE)                           \13  _CLC_OVERLOAD _CLC_DEF PRIM_TYPE##2 __clc_vload2(                            \14      size_t offset, const ADDR_SPACE PRIM_TYPE *x) {                          \15    return *(                                                                  \16        (const ADDR_SPACE less_aligned_##PRIM_TYPE##2 *)(&x[2 * offset]));     \17  }                                                                            \18                                                                               \19  _CLC_OVERLOAD _CLC_DEF PRIM_TYPE##3 __clc_vload3(                            \20      size_t offset, const ADDR_SPACE PRIM_TYPE *x) {                          \21    PRIM_TYPE##2 vec =                                                         \22        *((const ADDR_SPACE less_aligned_##PRIM_TYPE##2 *)(&x[3 * offset]));   \23    return (PRIM_TYPE##3)(vec.s0, vec.s1, x[offset * 3 + 2]);                  \24  }                                                                            \25                                                                               \26  _CLC_OVERLOAD _CLC_DEF PRIM_TYPE##4 __clc_vload4(                            \27      size_t offset, const ADDR_SPACE PRIM_TYPE *x) {                          \28    return *(                                                                  \29        (const ADDR_SPACE less_aligned_##PRIM_TYPE##4 *)(&x[4 * offset]));     \30  }                                                                            \31                                                                               \32  _CLC_OVERLOAD _CLC_DEF PRIM_TYPE##8 __clc_vload8(                            \33      size_t offset, const ADDR_SPACE PRIM_TYPE *x) {                          \34    return *(                                                                  \35        (const ADDR_SPACE less_aligned_##PRIM_TYPE##8 *)(&x[8 * offset]));     \36  }                                                                            \37                                                                               \38  _CLC_OVERLOAD _CLC_DEF PRIM_TYPE##16 __clc_vload16(                          \39      size_t offset, const ADDR_SPACE PRIM_TYPE *x) {                          \40    return *(                                                                  \41        (const ADDR_SPACE less_aligned_##PRIM_TYPE##16 *)(&x[16 * offset]));   \42  }43 44#if _CLC_DISTINCT_GENERIC_AS_SUPPORTED45#define __CLC_VLOAD_VECTORIZE_GENERIC __CLC_VLOAD_VECTORIZE46#else47// The generic address space isn't available, so make the macro do nothing48#define __CLC_VLOAD_VECTORIZE_GENERIC(X, Y)49#endif50 51#define __CLC_VLOAD_ADDR_SPACES(__CLC_SCALAR_GENTYPE)                          \52  __CLC_VLOAD_VECTORIZE(__CLC_SCALAR_GENTYPE, __private)                       \53  __CLC_VLOAD_VECTORIZE(__CLC_SCALAR_GENTYPE, __local)                         \54  __CLC_VLOAD_VECTORIZE(__CLC_SCALAR_GENTYPE, __constant)                      \55  __CLC_VLOAD_VECTORIZE(__CLC_SCALAR_GENTYPE, __global)                        \56  __CLC_VLOAD_VECTORIZE_GENERIC(__CLC_SCALAR_GENTYPE, __generic)57 58#define __CLC_VLOAD_TYPES()                                                    \59  __CLC_VLOAD_ADDR_SPACES(char)                                                \60  __CLC_VLOAD_ADDR_SPACES(uchar)                                               \61  __CLC_VLOAD_ADDR_SPACES(short)                                               \62  __CLC_VLOAD_ADDR_SPACES(ushort)                                              \63  __CLC_VLOAD_ADDR_SPACES(int)                                                 \64  __CLC_VLOAD_ADDR_SPACES(uint)                                                \65  __CLC_VLOAD_ADDR_SPACES(long)                                                \66  __CLC_VLOAD_ADDR_SPACES(ulong)                                               \67  __CLC_VLOAD_ADDR_SPACES(float)68 69__CLC_VLOAD_TYPES()70 71#ifdef cl_khr_fp6472#pragma OPENCL EXTENSION cl_khr_fp64 : enable73__CLC_VLOAD_ADDR_SPACES(double)74#endif75#ifdef cl_khr_fp1676#pragma OPENCL EXTENSION cl_khr_fp16 : enable77__CLC_VLOAD_ADDR_SPACES(half)78#endif79 80/* vload_half are legal even without cl_khr_fp16 */81/* no vload_half for double */82#define __CLC_VEC_LOAD1(val, AS) val = __builtin_load_halff(&mem[offset++]);83#define __CLC_VEC_LOAD2(val, AS)                                               \84  __CLC_VEC_LOAD1(val.lo, AS)                                                  \85  __CLC_VEC_LOAD1(val.hi, AS)86#define __CLC_VEC_LOAD3(val, AS)                                               \87  __CLC_VEC_LOAD1(val.s0, AS)                                                  \88  __CLC_VEC_LOAD1(val.s1, AS)                                                  \89  __CLC_VEC_LOAD1(val.s2, AS)90#define __CLC_VEC_LOAD4(val, AS)                                               \91  __CLC_VEC_LOAD2(val.lo, AS)                                                  \92  __CLC_VEC_LOAD2(val.hi, AS)93#define __CLC_VEC_LOAD8(val, AS)                                               \94  __CLC_VEC_LOAD4(val.lo, AS)                                                  \95  __CLC_VEC_LOAD4(val.hi, AS)96#define __CLC_VEC_LOAD16(val, AS)                                              \97  __CLC_VEC_LOAD8(val.lo, AS)                                                  \98  __CLC_VEC_LOAD8(val.hi, AS)99 100#define __CLC_FUNC_IMPL(SUFFIX, VEC_SIZE, OFFSET_SIZE, TYPE, AS)               \101  _CLC_OVERLOAD _CLC_DEF TYPE __clc_vload_half##SUFFIX(size_t offset,          \102                                                       const AS half *mem) {   \103    offset *= VEC_SIZE;                                                        \104    TYPE __tmp;                                                                \105    __CLC_VEC_LOAD##VEC_SIZE(__tmp, AS) return __tmp;                          \106  }                                                                            \107  _CLC_OVERLOAD _CLC_DEF TYPE __clc_vloada_half##SUFFIX(size_t offset,         \108                                                        const AS half *mem) {  \109    offset *= OFFSET_SIZE;                                                     \110    TYPE __tmp;                                                                \111    __CLC_VEC_LOAD##VEC_SIZE(__tmp, AS) return __tmp;                          \112  }113 114#define __CLC_FUNC(SUFFIX, VEC_SIZE, OFFSET_SIZE, TYPE, AS)                    \115  __CLC_FUNC_IMPL(SUFFIX, VEC_SIZE, OFFSET_SIZE, TYPE, AS)116 117#define __CLC_BODY "clc_vload_half.inc"118#include <clc/math/gentype.inc>119#undef __CLC_FUNC120#undef __CLC_FUNC_IMPL121#undef __CLC_VEC_LOAD16122#undef __CLC_VEC_LOAD8123#undef __CLC_VEC_LOAD4124#undef __CLC_VEC_LOAD3125#undef __CLC_VEC_LOAD2126#undef __CLC_VEC_LOAD1127#undef __CLC_VLOAD_TYPES128#undef __CLC_VLOAD_ADDR_SPACES129#undef __CLC_VLOAD_VECTORIZE130#undef __CLC_VLOAD_VECTORIZE_GENERIC131