File: IBiF_Bit_Instructions.cl

package info (click to toggle)
intel-graphics-compiler 1.0.17791.18-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 102,312 kB
  • sloc: cpp: 935,343; lisp: 286,143; ansic: 16,196; python: 3,279; yacc: 2,487; lex: 1,642; pascal: 300; sh: 174; makefile: 27
file content (138 lines) | stat: -rw-r--r-- 9,874 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
/*========================== begin_copyright_notice ============================

Copyright (C) 2019-2021 Intel Corporation

SPDX-License-Identifier: MIT

============================= end_copyright_notice ===========================*/

//===-  IBiF_Bit_Instructions.cl -===================================================//
//
// This file contains definitions of functions which allow to use
// SPIRV bit instructions from OpenCL.
//
//===----------------------------------------------------------------------===//
#include "spirv.h"

#if defined(cl_khr_extended_bit_ops)

// ---- BFI ----

#define GEN_DEFINITION_BFI(FUNC, OP, TYPE, ABBR_TYPE, SPIRV_TYPE)                                                      \
  INLINE TYPE OVERLOADABLE FUNC(TYPE base, TYPE insert, uint offset, uint count) {                                     \
    return as_##TYPE(SPIRV_BUILTIN(OP, _##ABBR_TYPE##_##ABBR_TYPE##_i32_i32, )(                                        \
        as_##SPIRV_TYPE(base), as_##SPIRV_TYPE(insert), offset, count));                                               \
  }

#define GEN_VECTOR_DEFINITION_BFI(FUNC, OP, TYPE, ABBR_TYPE, SPIRV_TYPE, VEC_SIZE)                                     \
  INLINE TYPE##VEC_SIZE OVERLOADABLE FUNC(TYPE##VEC_SIZE base, TYPE##VEC_SIZE insert, uint offset, uint count) {       \
    return as_##TYPE##VEC_SIZE(                                                                                        \
        SPIRV_BUILTIN(OP, _v##VEC_SIZE##ABBR_TYPE##_v##VEC_SIZE##ABBR_TYPE##_i32_i32, )(     \
            as_##SPIRV_TYPE##VEC_SIZE(base), as_##SPIRV_TYPE##VEC_SIZE(insert), offset, count));                       \
  }

#define GEN_DEFINITIONS_BFI_ALL_WIDTHS(FUNC, OP, TYPE, ABBR_TYPE, SPIRV_TYPE)                                          \
  GEN_DEFINITION_BFI(FUNC, OP, TYPE, ABBR_TYPE, SPIRV_TYPE)                                                            \
  GEN_VECTOR_DEFINITION_BFI(FUNC, OP, TYPE, ABBR_TYPE, SPIRV_TYPE, 2)                                                  \
  GEN_VECTOR_DEFINITION_BFI(FUNC, OP, TYPE, ABBR_TYPE, SPIRV_TYPE, 3)                                                  \
  GEN_VECTOR_DEFINITION_BFI(FUNC, OP, TYPE, ABBR_TYPE, SPIRV_TYPE, 4)                                                  \
  GEN_VECTOR_DEFINITION_BFI(FUNC, OP, TYPE, ABBR_TYPE, SPIRV_TYPE, 8)                                                  \
  GEN_VECTOR_DEFINITION_BFI(FUNC, OP, TYPE, ABBR_TYPE, SPIRV_TYPE, 16)

#define GEN_DEFINITIONS_BFI(FUNC, OP)                                                                                  \
  GEN_DEFINITIONS_BFI_ALL_WIDTHS(FUNC, OP, uchar,  i8,  char)                                                          \
  GEN_DEFINITIONS_BFI_ALL_WIDTHS(FUNC, OP, ushort, i16, short)                                                         \
  GEN_DEFINITIONS_BFI_ALL_WIDTHS(FUNC, OP, uint,   i32, int)                                                           \
  GEN_DEFINITIONS_BFI_ALL_WIDTHS(FUNC, OP, ulong,  i64, long)                                                          \
  GEN_DEFINITIONS_BFI_ALL_WIDTHS(FUNC, OP, char,   i8,  char)                                                          \
  GEN_DEFINITIONS_BFI_ALL_WIDTHS(FUNC, OP, short,  i16, short)                                                         \
  GEN_DEFINITIONS_BFI_ALL_WIDTHS(FUNC, OP, int,    i32, int)                                                           \
  GEN_DEFINITIONS_BFI_ALL_WIDTHS(FUNC, OP, long,   i64, long)

// ---- UBFE/SBFE ----

#define GEN_DEFINITION_BFE( FUNC, OP, SPV_TYPE, TYPE1, TYPE2, ABBR_TYPE1, ABBR_TYPE2 )                                 \
INLINE SPV_TYPE OVERLOADABLE FUNC( TYPE1 base, TYPE2 offset, TYPE2 count ) {                                           \
    return SPIRV_BUILTIN(OP, _##ABBR_TYPE1##_##ABBR_TYPE2##_##ABBR_TYPE2, )                                            \
    ( as_##SPV_TYPE( base ), offset, count);                                                                           \
}

#define GEN_VECTOR_DEFINITION_BFE( FUNC, OP, SPV_TYPE, TYPE1, TYPE2, ABBR_TYPE1, ABBR_TYPE2, VEC_SIZE)                 \
INLINE SPV_TYPE##VEC_SIZE OVERLOADABLE FUNC( TYPE1##VEC_SIZE base, TYPE2 offset, TYPE2 count ) {                       \
    return SPIRV_BUILTIN(OP, _v##VEC_SIZE##ABBR_TYPE1##_##ABBR_TYPE2##_##ABBR_TYPE2, )                                 \
    ( as_##SPV_TYPE##VEC_SIZE( base ), offset, count);                                                                 \
}

#define GEN_DEFINITIONS_BFE_ALL_WIDTHS( FUNC, OP, TYPE, SPV_TYPE, ABBR_TYPE )                                          \
    GEN_DEFINITION_BFE       ( FUNC, OP, TYPE, SPV_TYPE, uint, ABBR_TYPE, i32 )                                        \
    GEN_VECTOR_DEFINITION_BFE( FUNC, OP, TYPE, SPV_TYPE, uint, ABBR_TYPE, i32, 2)                                      \
    GEN_VECTOR_DEFINITION_BFE( FUNC, OP, TYPE, SPV_TYPE, uint, ABBR_TYPE, i32, 3)                                      \
    GEN_VECTOR_DEFINITION_BFE( FUNC, OP, TYPE, SPV_TYPE, uint, ABBR_TYPE, i32, 4)                                      \
    GEN_VECTOR_DEFINITION_BFE( FUNC, OP, TYPE, SPV_TYPE, uint, ABBR_TYPE, i32, 8)                                      \
    GEN_VECTOR_DEFINITION_BFE( FUNC, OP, TYPE, SPV_TYPE, uint, ABBR_TYPE, i32, 16)


#define GEN_DEFINITIONS_UBFE( FUNC, OP )                                                                               \
    GEN_DEFINITIONS_BFE_ALL_WIDTHS( FUNC, OP, uchar,  uchar,  i8  )                                                    \
    GEN_DEFINITIONS_BFE_ALL_WIDTHS( FUNC, OP, ushort, ushort, i16 )                                                    \
    GEN_DEFINITIONS_BFE_ALL_WIDTHS( FUNC, OP, uint,   uint,   i32 )                                                    \
    GEN_DEFINITIONS_BFE_ALL_WIDTHS( FUNC, OP, ulong,  ulong,  i64 )                                                    \
    GEN_DEFINITIONS_BFE_ALL_WIDTHS( FUNC, OP, uchar,  char,   i8  )                                                    \
    GEN_DEFINITIONS_BFE_ALL_WIDTHS( FUNC, OP, ushort, short,  i16 )                                                    \
    GEN_DEFINITIONS_BFE_ALL_WIDTHS( FUNC, OP, uint,   int,    i32 )                                                    \
    GEN_DEFINITIONS_BFE_ALL_WIDTHS( FUNC, OP, ulong,  long,   i64 )

#define GEN_DEFINITIONS_SBFE( FUNC, OP )                                                                               \
    GEN_DEFINITIONS_BFE_ALL_WIDTHS( FUNC, OP, char,  uchar,  i8  )                                                     \
    GEN_DEFINITIONS_BFE_ALL_WIDTHS( FUNC, OP, short, ushort, i16 )                                                     \
    GEN_DEFINITIONS_BFE_ALL_WIDTHS( FUNC, OP, int,   uint,   i32 )                                                     \
    GEN_DEFINITIONS_BFE_ALL_WIDTHS( FUNC, OP, long,  ulong,  i64 )                                                     \
    GEN_DEFINITIONS_BFE_ALL_WIDTHS( FUNC, OP, char,  char,   i8  )                                                     \
    GEN_DEFINITIONS_BFE_ALL_WIDTHS( FUNC, OP, short, short,  i16 )                                                     \
    GEN_DEFINITIONS_BFE_ALL_WIDTHS( FUNC, OP, int,   int,    i32 )                                                     \
    GEN_DEFINITIONS_BFE_ALL_WIDTHS( FUNC, OP, long,  long,   i64 )

// ---- BFREV ----

#define GEN_DEFINITION_BFREV( FUNC, OP, TYPE, SPIRV_TYPE, ABBR_TYPE )                                                  \
INLINE TYPE OVERLOADABLE FUNC( TYPE base ) {                                                                           \
    return as_##TYPE( SPIRV_BUILTIN(OP, _##ABBR_TYPE, )( as_##SPIRV_TYPE( base ) ) );                                  \
}

#define GEN_VECTOR_DEFINITION_BFREV( FUNC, OP, TYPE, SPIRV_TYPE, ABBR_TYPE, VEC_SIZE )                                 \
INLINE TYPE##VEC_SIZE OVERLOADABLE FUNC( TYPE##VEC_SIZE base ) {                                                       \
    return as_##TYPE##VEC_SIZE( SPIRV_BUILTIN(OP, _v##VEC_SIZE##ABBR_TYPE, )( as_##SPIRV_TYPE##VEC_SIZE ( base ) ) );  \
}

#define GEN_DEFINITIONS_BFREV_ALL_WIDTHS( FUNC, OP, TYPE, SPIRV_TYPE, ABBR_TYPE )  \
    GEN_DEFINITION_BFREV       ( FUNC, OP, TYPE, SPIRV_TYPE, ABBR_TYPE )           \
    GEN_VECTOR_DEFINITION_BFREV( FUNC, OP, TYPE, SPIRV_TYPE, ABBR_TYPE, 2)         \
    GEN_VECTOR_DEFINITION_BFREV( FUNC, OP, TYPE, SPIRV_TYPE, ABBR_TYPE, 3)         \
    GEN_VECTOR_DEFINITION_BFREV( FUNC, OP, TYPE, SPIRV_TYPE, ABBR_TYPE, 4)         \
    GEN_VECTOR_DEFINITION_BFREV( FUNC, OP, TYPE, SPIRV_TYPE, ABBR_TYPE, 8)         \
    GEN_VECTOR_DEFINITION_BFREV( FUNC, OP, TYPE, SPIRV_TYPE, ABBR_TYPE, 16)

#define GEN_DEFINITIONS_BFREV( FUNC, OP )                               \
    GEN_DEFINITIONS_BFREV_ALL_WIDTHS( FUNC, OP, uchar,  char,  i8  )    \
    GEN_DEFINITIONS_BFREV_ALL_WIDTHS( FUNC, OP, ushort, short, i16 )    \
    GEN_DEFINITIONS_BFREV_ALL_WIDTHS( FUNC, OP, uint,   int,   i32 )    \
    GEN_DEFINITIONS_BFREV_ALL_WIDTHS( FUNC, OP, ulong,  long,  i64 )    \
    GEN_DEFINITIONS_BFREV_ALL_WIDTHS( FUNC, OP, char,   char,  i8  )    \
    GEN_DEFINITIONS_BFREV_ALL_WIDTHS( FUNC, OP, short,  short, i16 )    \
    GEN_DEFINITIONS_BFREV_ALL_WIDTHS( FUNC, OP, int,    int,   i32 )    \
    GEN_DEFINITIONS_BFREV_ALL_WIDTHS( FUNC, OP, long,   long,  i64 )

// Generate all

GEN_DEFINITIONS_BFI( bitfield_insert, BitFieldInsert )
GEN_DEFINITIONS_SBFE( bitfield_extract_signed, BitFieldSExtract )
GEN_DEFINITIONS_UBFE( bitfield_extract_unsigned, BitFieldUExtract )
GEN_DEFINITIONS_BFREV( bit_reverse, BitReverse )

GEN_DEFINITIONS_BFI( intel_bfi, BitFieldInsert )
GEN_DEFINITIONS_SBFE( intel_sbfe, BitFieldSExtract )
GEN_DEFINITIONS_UBFE( intel_ubfe, BitFieldUExtract )
GEN_DEFINITIONS_BFREV( intel_bfrev, BitReverse )

#endif // cl_khr_extended_bit_ops