brintos

brintos / llvm-project-archived public Read only

0
0
Text · 9.7 KiB · bd7a6a1 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, IDXTYPE idx) {                                       \57    switch (idx) { _CLC_ELEMENT_CASES##ARGSIZE(x) default : return 0; }        \58  }59 60#define _CLC_SHUFFLE_SET_ONE_ELEMENT(ARGTYPE, ARGSIZE, INDEX, MASKTYPE)        \61  ret_val.s##INDEX =                                                           \62      __clc_get_el_##ARGTYPE##ARGSIZE##_##MASKTYPE(x, mask.s##INDEX);63 64#define _CLC_SHUFFLE_SET_2_ELEMENTS(ARGTYPE, ARGSIZE, MASKTYPE)                \65  ret_val.s0 = __clc_get_el_##ARGTYPE##ARGSIZE##_##MASKTYPE(x, mask.s0);       \66  ret_val.s1 = __clc_get_el_##ARGTYPE##ARGSIZE##_##MASKTYPE(x, mask.s1);67 68#define _CLC_SHUFFLE_SET_4_ELEMENTS(ARGTYPE, ARGSIZE, MASKTYPE)                \69  _CLC_SHUFFLE_SET_2_ELEMENTS(ARGTYPE, ARGSIZE, MASKTYPE)                      \70  ret_val.s2 = __clc_get_el_##ARGTYPE##ARGSIZE##_##MASKTYPE(x, mask.s2);       \71  ret_val.s3 = __clc_get_el_##ARGTYPE##ARGSIZE##_##MASKTYPE(x, mask.s3);72 73#define _CLC_SHUFFLE_SET_8_ELEMENTS(ARGTYPE, ARGSIZE, MASKTYPE)                \74  _CLC_SHUFFLE_SET_4_ELEMENTS(ARGTYPE, ARGSIZE, MASKTYPE)                      \75  ret_val.s4 = __clc_get_el_##ARGTYPE##ARGSIZE##_##MASKTYPE(x, mask.s4);       \76  ret_val.s5 = __clc_get_el_##ARGTYPE##ARGSIZE##_##MASKTYPE(x, mask.s5);       \77  ret_val.s6 = __clc_get_el_##ARGTYPE##ARGSIZE##_##MASKTYPE(x, mask.s6);       \78  ret_val.s7 = __clc_get_el_##ARGTYPE##ARGSIZE##_##MASKTYPE(x, mask.s7);79 80#define _CLC_SHUFFLE_SET_16_ELEMENTS(ARGTYPE, ARGSIZE, MASKTYPE)               \81  _CLC_SHUFFLE_SET_8_ELEMENTS(ARGTYPE, ARGSIZE, MASKTYPE)                      \82  ret_val.s8 = __clc_get_el_##ARGTYPE##ARGSIZE##_##MASKTYPE(x, mask.s8);       \83  ret_val.s9 = __clc_get_el_##ARGTYPE##ARGSIZE##_##MASKTYPE(x, mask.s9);       \84  ret_val.sA = __clc_get_el_##ARGTYPE##ARGSIZE##_##MASKTYPE(x, mask.sA);       \85  ret_val.sB = __clc_get_el_##ARGTYPE##ARGSIZE##_##MASKTYPE(x, mask.sB);       \86  ret_val.sC = __clc_get_el_##ARGTYPE##ARGSIZE##_##MASKTYPE(x, mask.sC);       \87  ret_val.sD = __clc_get_el_##ARGTYPE##ARGSIZE##_##MASKTYPE(x, mask.sD);       \88  ret_val.sE = __clc_get_el_##ARGTYPE##ARGSIZE##_##MASKTYPE(x, mask.sE);       \89  ret_val.sF = __clc_get_el_##ARGTYPE##ARGSIZE##_##MASKTYPE(x, mask.sF);90 91#define _CLC_SHUFFLE_DEFINE2(ARGTYPE, ARGSIZE, MASKTYPE)                       \92  _CLC_DEF _CLC_OVERLOAD ARGTYPE##2 __clc_shuffle(ARGTYPE##ARGSIZE x,          \93                                                  MASKTYPE##2 mask) {          \94    ARGTYPE##2 ret_val;                                                        \95    mask &= (MASKTYPE##2)(ARGSIZE - 1);                                        \96    _CLC_SHUFFLE_SET_2_ELEMENTS(ARGTYPE, ARGSIZE, MASKTYPE)                    \97    return ret_val;                                                            \98  }99 100#define _CLC_SHUFFLE_DEFINE4(ARGTYPE, ARGSIZE, MASKTYPE)                       \101  _CLC_DEF _CLC_OVERLOAD ARGTYPE##4 __clc_shuffle(ARGTYPE##ARGSIZE x,          \102                                                  MASKTYPE##4 mask) {          \103    ARGTYPE##4 ret_val;                                                        \104    mask &= (MASKTYPE##4)(ARGSIZE - 1);                                        \105    _CLC_SHUFFLE_SET_4_ELEMENTS(ARGTYPE, ARGSIZE, MASKTYPE)                    \106    return ret_val;                                                            \107  }108 109#define _CLC_SHUFFLE_DEFINE8(ARGTYPE, ARGSIZE, MASKTYPE)                       \110  _CLC_DEF _CLC_OVERLOAD ARGTYPE##8 __clc_shuffle(ARGTYPE##ARGSIZE x,          \111                                                  MASKTYPE##8 mask) {          \112    ARGTYPE##8 ret_val;                                                        \113    mask &= (MASKTYPE##8)(ARGSIZE - 1);                                        \114    _CLC_SHUFFLE_SET_8_ELEMENTS(ARGTYPE, ARGSIZE, MASKTYPE)                    \115    return ret_val;                                                            \116  }117 118#define _CLC_SHUFFLE_DEFINE16(ARGTYPE, ARGSIZE, MASKTYPE)                      \119  _CLC_DEF _CLC_OVERLOAD ARGTYPE##16 __clc_shuffle(ARGTYPE##ARGSIZE x,         \120                                                   MASKTYPE##16 mask) {        \121    ARGTYPE##16 ret_val;                                                       \122    mask &= (MASKTYPE##16)(ARGSIZE - 1);                                       \123    _CLC_SHUFFLE_SET_16_ELEMENTS(ARGTYPE, ARGSIZE, MASKTYPE)                   \124    return ret_val;                                                            \125  }126 127#define _CLC_VECTOR_SHUFFLE_MASKSIZE(INTYPE, ARGSIZE, MASKTYPE)                \128  _CLC_GET_ELEMENT_DEFINE(INTYPE, ARGSIZE, MASKTYPE)                           \129  _CLC_SHUFFLE_DEFINE2(INTYPE, ARGSIZE, MASKTYPE)                              \130  _CLC_SHUFFLE_DEFINE4(INTYPE, ARGSIZE, MASKTYPE)                              \131  _CLC_SHUFFLE_DEFINE8(INTYPE, ARGSIZE, MASKTYPE)                              \132  _CLC_SHUFFLE_DEFINE16(INTYPE, ARGSIZE, MASKTYPE)133 134#define _CLC_VECTOR_SHUFFLE_INSIZE(TYPE, MASKTYPE)                             \135  _CLC_VECTOR_SHUFFLE_MASKSIZE(TYPE, 2, MASKTYPE)                              \136  _CLC_VECTOR_SHUFFLE_MASKSIZE(TYPE, 4, MASKTYPE)                              \137  _CLC_VECTOR_SHUFFLE_MASKSIZE(TYPE, 8, MASKTYPE)                              \138  _CLC_VECTOR_SHUFFLE_MASKSIZE(TYPE, 16, MASKTYPE)139 140_CLC_VECTOR_SHUFFLE_INSIZE(char, uchar)141_CLC_VECTOR_SHUFFLE_INSIZE(short, ushort)142_CLC_VECTOR_SHUFFLE_INSIZE(int, uint)143_CLC_VECTOR_SHUFFLE_INSIZE(long, ulong)144_CLC_VECTOR_SHUFFLE_INSIZE(uchar, uchar)145_CLC_VECTOR_SHUFFLE_INSIZE(ushort, ushort)146_CLC_VECTOR_SHUFFLE_INSIZE(uint, uint)147_CLC_VECTOR_SHUFFLE_INSIZE(ulong, ulong)148_CLC_VECTOR_SHUFFLE_INSIZE(float, uint)149#ifdef cl_khr_fp64150#pragma OPENCL EXTENSION cl_khr_fp64 : enable151_CLC_VECTOR_SHUFFLE_INSIZE(double, ulong)152#endif153#ifdef cl_khr_fp16154#pragma OPENCL EXTENSION cl_khr_fp16 : enable155_CLC_VECTOR_SHUFFLE_INSIZE(half, ushort)156#endif157 158#undef _CLC_ELEMENT_CASES2159#undef _CLC_ELEMENT_CASES4160#undef _CLC_ELEMENT_CASES8161#undef _CLC_ELEMENT_CASES16162#undef _CLC_GET_ELEMENT_DEFINE163#undef _CLC_SHUFFLE_SET_ONE_ELEMENT164#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