brintos

brintos / llvm-project-archived public Read only

0
0
Text · 9.8 KiB · 786c2b6 Raw
174 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 11#define _CLC_ELEMENT_CASES2(VAR)                                               \12  case 0:                                                                      \13    return VAR.s0;                                                             \14  case 1:                                                                      \15    return VAR.s1;16 17#define _CLC_ELEMENT_CASES4(VAR)                                               \18  _CLC_ELEMENT_CASES2(VAR)                                                     \19  case 2:                                                                      \20    return VAR.s2;                                                             \21  case 3:                                                                      \22    return VAR.s3;23 24#define _CLC_ELEMENT_CASES8(VAR)                                               \25  _CLC_ELEMENT_CASES4(VAR)                                                     \26  case 4:                                                                      \27    return VAR.s4;                                                             \28  case 5:                                                                      \29    return VAR.s5;                                                             \30  case 6:                                                                      \31    return VAR.s6;                                                             \32  case 7:                                                                      \33    return VAR.s7;34 35#define _CLC_ELEMENT_CASES16(VAR)                                              \36  _CLC_ELEMENT_CASES8(VAR)                                                     \37  case 8:                                                                      \38    return VAR.s8;                                                             \39  case 9:                                                                      \40    return VAR.s9;                                                             \41  case 10:                                                                     \42    return VAR.sA;                                                             \43  case 11:                                                                     \44    return VAR.sB;                                                             \45  case 12:                                                                     \46    return VAR.sC;                                                             \47  case 13:                                                                     \48    return VAR.sD;                                                             \49  case 14:                                                                     \50    return VAR.sE;                                                             \51  case 15:                                                                     \52    return VAR.sF;53 54#define _CLC_GET_ELEMENT_DEFINE(ARGTYPE, ARGSIZE, IDXTYPE)                     \55  static ARGTYPE __clc_get_el_##ARGTYPE##ARGSIZE##_##IDXTYPE(                  \56      ARGTYPE##ARGSIZE x, ARGTYPE##ARGSIZE y, IDXTYPE idx) {                   \57    if (idx < ARGSIZE)                                                         \58      switch (idx) { _CLC_ELEMENT_CASES##ARGSIZE(x) default : return 0; }      \59    else                                                                       \60      switch (idx - ARGSIZE) {                                                 \61        _CLC_ELEMENT_CASES##ARGSIZE(y) default : return 0;                     \62      }                                                                        \63  }64 65#define _CLC_SHUFFLE_SET_2_ELEMENTS(ARGTYPE, ARGSIZE, MASKTYPE)                \66  ret_val.s0 = __clc_get_el_##ARGTYPE##ARGSIZE##_##MASKTYPE(x, y, mask.s0);    \67  ret_val.s1 = __clc_get_el_##ARGTYPE##ARGSIZE##_##MASKTYPE(x, y, mask.s1);68 69#define _CLC_SHUFFLE_SET_4_ELEMENTS(ARGTYPE, ARGSIZE, MASKTYPE)                \70  _CLC_SHUFFLE_SET_2_ELEMENTS(ARGTYPE, ARGSIZE, MASKTYPE)                      \71  ret_val.s2 = __clc_get_el_##ARGTYPE##ARGSIZE##_##MASKTYPE(x, y, mask.s2);    \72  ret_val.s3 = __clc_get_el_##ARGTYPE##ARGSIZE##_##MASKTYPE(x, y, mask.s3);73 74#define _CLC_SHUFFLE_SET_8_ELEMENTS(ARGTYPE, ARGSIZE, MASKTYPE)                \75  _CLC_SHUFFLE_SET_4_ELEMENTS(ARGTYPE, ARGSIZE, MASKTYPE)                      \76  ret_val.s4 = __clc_get_el_##ARGTYPE##ARGSIZE##_##MASKTYPE(x, y, mask.s4);    \77  ret_val.s5 = __clc_get_el_##ARGTYPE##ARGSIZE##_##MASKTYPE(x, y, mask.s5);    \78  ret_val.s6 = __clc_get_el_##ARGTYPE##ARGSIZE##_##MASKTYPE(x, y, mask.s6);    \79  ret_val.s7 = __clc_get_el_##ARGTYPE##ARGSIZE##_##MASKTYPE(x, y, mask.s7);80 81#define _CLC_SHUFFLE_SET_16_ELEMENTS(ARGTYPE, ARGSIZE, MASKTYPE)               \82  _CLC_SHUFFLE_SET_8_ELEMENTS(ARGTYPE, ARGSIZE, MASKTYPE)                      \83  ret_val.s8 = __clc_get_el_##ARGTYPE##ARGSIZE##_##MASKTYPE(x, y, mask.s8);    \84  ret_val.s9 = __clc_get_el_##ARGTYPE##ARGSIZE##_##MASKTYPE(x, y, mask.s9);    \85  ret_val.sA = __clc_get_el_##ARGTYPE##ARGSIZE##_##MASKTYPE(x, y, mask.sA);    \86  ret_val.sB = __clc_get_el_##ARGTYPE##ARGSIZE##_##MASKTYPE(x, y, mask.sB);    \87  ret_val.sC = __clc_get_el_##ARGTYPE##ARGSIZE##_##MASKTYPE(x, y, mask.sC);    \88  ret_val.sD = __clc_get_el_##ARGTYPE##ARGSIZE##_##MASKTYPE(x, y, mask.sD);    \89  ret_val.sE = __clc_get_el_##ARGTYPE##ARGSIZE##_##MASKTYPE(x, y, mask.sE);    \90  ret_val.sF = __clc_get_el_##ARGTYPE##ARGSIZE##_##MASKTYPE(x, y, mask.sF);91 92#define _CLC_SHUFFLE_DEFINE2(ARGTYPE, ARGSIZE, MASKTYPE)                       \93  _CLC_DEF _CLC_OVERLOAD ARGTYPE##2 __clc_shuffle2(                            \94      ARGTYPE##ARGSIZE x, ARGTYPE##ARGSIZE y, MASKTYPE##2 mask) {              \95    ARGTYPE##2 ret_val;                                                        \96    mask &= (MASKTYPE##2)(ARGSIZE * 2 - 1);                                    \97    _CLC_SHUFFLE_SET_2_ELEMENTS(ARGTYPE, ARGSIZE, MASKTYPE)                    \98    return ret_val;                                                            \99  }100 101#define _CLC_SHUFFLE_DEFINE4(ARGTYPE, ARGSIZE, MASKTYPE)                       \102  _CLC_DEF _CLC_OVERLOAD ARGTYPE##4 __clc_shuffle2(                            \103      ARGTYPE##ARGSIZE x, ARGTYPE##ARGSIZE y, MASKTYPE##4 mask) {              \104    ARGTYPE##4 ret_val;                                                        \105    mask &= (MASKTYPE##4)(ARGSIZE * 2 - 1);                                    \106    _CLC_SHUFFLE_SET_4_ELEMENTS(ARGTYPE, ARGSIZE, MASKTYPE)                    \107    return ret_val;                                                            \108  }109 110#define _CLC_SHUFFLE_DEFINE8(ARGTYPE, ARGSIZE, MASKTYPE)                       \111  _CLC_DEF _CLC_OVERLOAD ARGTYPE##8 __clc_shuffle2(                            \112      ARGTYPE##ARGSIZE x, ARGTYPE##ARGSIZE y, MASKTYPE##8 mask) {              \113    ARGTYPE##8 ret_val;                                                        \114    mask &= (MASKTYPE##8)(ARGSIZE * 2 - 1);                                    \115    _CLC_SHUFFLE_SET_8_ELEMENTS(ARGTYPE, ARGSIZE, MASKTYPE)                    \116    return ret_val;                                                            \117  }118 119#define _CLC_SHUFFLE_DEFINE16(ARGTYPE, ARGSIZE, MASKTYPE)                      \120  _CLC_DEF _CLC_OVERLOAD ARGTYPE##16 __clc_shuffle2(                           \121      ARGTYPE##ARGSIZE x, ARGTYPE##ARGSIZE y, MASKTYPE##16 mask) {             \122    ARGTYPE##16 ret_val;                                                       \123    mask &= (MASKTYPE##16)(ARGSIZE * 2 - 1);                                   \124    _CLC_SHUFFLE_SET_16_ELEMENTS(ARGTYPE, ARGSIZE, MASKTYPE)                   \125    return ret_val;                                                            \126  }127 128#define _CLC_VECTOR_SHUFFLE_MASKSIZE(INTYPE, ARGSIZE, MASKTYPE)                \129  _CLC_GET_ELEMENT_DEFINE(INTYPE, ARGSIZE, MASKTYPE)                           \130  _CLC_SHUFFLE_DEFINE2(INTYPE, ARGSIZE, MASKTYPE)                              \131  _CLC_SHUFFLE_DEFINE4(INTYPE, ARGSIZE, MASKTYPE)                              \132  _CLC_SHUFFLE_DEFINE8(INTYPE, ARGSIZE, MASKTYPE)                              \133  _CLC_SHUFFLE_DEFINE16(INTYPE, ARGSIZE, MASKTYPE)134 135#define _CLC_VECTOR_SHUFFLE_INSIZE(TYPE, MASKTYPE)                             \136  _CLC_VECTOR_SHUFFLE_MASKSIZE(TYPE, 2, MASKTYPE)                              \137  _CLC_VECTOR_SHUFFLE_MASKSIZE(TYPE, 4, MASKTYPE)                              \138  _CLC_VECTOR_SHUFFLE_MASKSIZE(TYPE, 8, MASKTYPE)                              \139  _CLC_VECTOR_SHUFFLE_MASKSIZE(TYPE, 16, MASKTYPE)140 141_CLC_VECTOR_SHUFFLE_INSIZE(char, uchar)142_CLC_VECTOR_SHUFFLE_INSIZE(short, ushort)143_CLC_VECTOR_SHUFFLE_INSIZE(int, uint)144_CLC_VECTOR_SHUFFLE_INSIZE(long, ulong)145_CLC_VECTOR_SHUFFLE_INSIZE(uchar, uchar)146_CLC_VECTOR_SHUFFLE_INSIZE(ushort, ushort)147_CLC_VECTOR_SHUFFLE_INSIZE(uint, uint)148_CLC_VECTOR_SHUFFLE_INSIZE(ulong, ulong)149_CLC_VECTOR_SHUFFLE_INSIZE(float, uint)150#ifdef cl_khr_fp64151#pragma OPENCL EXTENSION cl_khr_fp64 : enable152_CLC_VECTOR_SHUFFLE_INSIZE(double, ulong)153#endif154#ifdef cl_khr_fp16155#pragma OPENCL EXTENSION cl_khr_fp16 : enable156_CLC_VECTOR_SHUFFLE_INSIZE(half, ushort)157#endif158 159#undef _CLC_ELEMENT_CASES2160#undef _CLC_ELEMENT_CASES4161#undef _CLC_ELEMENT_CASES8162#undef _CLC_ELEMENT_CASES16163#undef _CLC_GET_ELEMENT_DEFINE164#undef _CLC_SHUFFLE_SET_2_ELEMENTS165#undef _CLC_SHUFFLE_SET_4_ELEMENTS166#undef _CLC_SHUFFLE_SET_8_ELEMENTS167#undef _CLC_SHUFFLE_SET_16_ELEMENTS168#undef _CLC_SHUFFLE_DEFINE2169#undef _CLC_SHUFFLE_DEFINE4170#undef _CLC_SHUFFLE_DEFINE8171#undef _CLC_SHUFFLE_DEFINE16172#undef _CLC_VECTOR_SHUFFLE_MASKSIZE173#undef _CLC_VECTOR_SHUFFLE_INSIZE174