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