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