Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
S
simde
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Libraries
simde
Commits
4a29d21f
Commit
4a29d21f
authored
May 24, 2023
by
Michael R. Crusoe
Committed by
Michael R. Crusoe
Jun 06, 2023
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
avx512: start supporting AVX512FP16 / m512h
parent
f686d38f
Changes
20
Hide whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
756 additions
and
7 deletions
+756
-7
simde-arch.h
simde-arch.h
+3
-0
simde-f16.h
simde-f16.h
+54
-5
simde-features.h
simde-features.h
+12
-0
x86/avx512.h
x86/avx512.h
+1
-0
x86/avx512/cast.h
x86/avx512/cast.h
+33
-0
x86/avx512/cmp.h
x86/avx512/cmp.h
+229
-0
x86/avx512/fpclass.h
x86/avx512/fpclass.h
+19
-0
x86/avx512/load.h
x86/avx512/load.h
+17
-0
x86/avx512/loadu.h
x86/avx512/loadu.h
+16
-0
x86/avx512/max.h
x86/avx512/max.h
+24
-0
x86/avx512/min.h
x86/avx512/min.h
+24
-0
x86/avx512/mov.h
x86/avx512/mov.h
+6
-0
x86/avx512/permutexvar.h
x86/avx512/permutexvar.h
+14
-0
x86/avx512/reduce.h
x86/avx512/reduce.h
+87
-0
x86/avx512/set.h
x86/avx512/set.h
+50
-0
x86/avx512/set1.h
x86/avx512/set1.h
+21
-0
x86/avx512/setone.h
x86/avx512/setone.h
+6
-0
x86/avx512/setzero.h
x86/avx512/setzero.h
+15
-0
x86/avx512/storeu.h
x86/avx512/storeu.h
+14
-0
x86/avx512/types.h
x86/avx512/types.h
+111
-2
No files found.
simde-arch.h
View file @
4a29d21f
...
@@ -324,6 +324,9 @@
...
@@ -324,6 +324,9 @@
# if defined(__AVX512VL__)
# if defined(__AVX512VL__)
# define SIMDE_ARCH_X86_AVX512VL 1
# define SIMDE_ARCH_X86_AVX512VL 1
# endif
# endif
# if defined(__AVX512FP16__)
# define SIMDE_ARCH_X86_AVX512FP16 1
# endif
# if defined(__GFNI__)
# if defined(__GFNI__)
# define SIMDE_ARCH_X86_GFNI 1
# define SIMDE_ARCH_X86_GFNI 1
# endif
# endif
...
...
simde-f16.h
View file @
4a29d21f
...
@@ -96,10 +96,11 @@ SIMDE_BEGIN_DECLS_
...
@@ -96,10 +96,11 @@ SIMDE_BEGIN_DECLS_
#endif
#endif
#elif SIMDE_FLOAT16_API == SIMDE_FLOAT16_API_FP16_NO_ABI
#elif SIMDE_FLOAT16_API == SIMDE_FLOAT16_API_FP16_NO_ABI
typedef
struct
{
__fp16
value
;
}
simde_float16
;
typedef
struct
{
__fp16
value
;
}
simde_float16
;
#if defined(SIMDE_STATEMENT_EXPR_)
#if defined(SIMDE_STATEMENT_EXPR_)
&& !defined(SIMDE_TESTS_H)
#define SIMDE_FLOAT16_C(value) (__extension__({ ((simde_float16) { HEDLEY_DIAGNOSTIC_PUSH SIMDE_DIAGNOSTIC_DISABLE_C99_EXTENSIONS_ HEDLEY_STATIC_CAST(__fp16, (value)) }); HEDLEY_DIAGNOSTIC_POP }))
#define SIMDE_FLOAT16_C(value) (__extension__({ ((simde_float16) { HEDLEY_DIAGNOSTIC_PUSH SIMDE_DIAGNOSTIC_DISABLE_C99_EXTENSIONS_ HEDLEY_STATIC_CAST(__fp16, (value)) }); HEDLEY_DIAGNOSTIC_POP }))
#else
#else
#define SIMDE_FLOAT16_C(value) ((simde_float16) { HEDLEY_STATIC_CAST(__fp16, (value)) })
#define SIMDE_FLOAT16_C(value) ((simde_float16) { HEDLEY_STATIC_CAST(__fp16, (value)) })
#define SIMDE_FLOAT16_IS_SCALAR 1
#endif
#endif
#elif SIMDE_FLOAT16_API == SIMDE_FLOAT16_API_FP16
#elif SIMDE_FLOAT16_API == SIMDE_FLOAT16_API_FP16
typedef
__fp16
simde_float16
;
typedef
__fp16
simde_float16
;
...
@@ -126,7 +127,7 @@ SIMDE_DEFINE_CONVERSION_FUNCTION_(simde_float16_as_uint16, uint16_t, simde_
...
@@ -126,7 +127,7 @@ SIMDE_DEFINE_CONVERSION_FUNCTION_(simde_float16_as_uint16, uint16_t, simde_
SIMDE_DEFINE_CONVERSION_FUNCTION_
(
simde_uint16_as_float16
,
simde_float16
,
uint16_t
)
SIMDE_DEFINE_CONVERSION_FUNCTION_
(
simde_uint16_as_float16
,
simde_float16
,
uint16_t
)
#if SIMDE_FLOAT16_API == SIMDE_FLOAT16_API_PORTABLE
#if SIMDE_FLOAT16_API == SIMDE_FLOAT16_API_PORTABLE
#define SIMDE_NANHF simde_uint16_as_float16(0x7E00)
#define SIMDE_NANHF simde_uint16_as_float16(0x7E00)
// a quiet Not-a-Number
#define SIMDE_INFINITYHF simde_uint16_as_float16(0x7C00)
#define SIMDE_INFINITYHF simde_uint16_as_float16(0x7C00)
#define SIMDE_NINFINITYHF simde_uint16_as_float16(0xFC00)
#define SIMDE_NINFINITYHF simde_uint16_as_float16(0xFC00)
#else
#else
...
@@ -145,9 +146,9 @@ SIMDE_DEFINE_CONVERSION_FUNCTION_(simde_uint16_as_float16, simde_float16, u
...
@@ -145,9 +146,9 @@ SIMDE_DEFINE_CONVERSION_FUNCTION_(simde_uint16_as_float16, simde_float16, u
#endif
#endif
#else
#else
#if SIMDE_MATH_BUILTIN_LIBM(nanf16)
#if SIMDE_MATH_BUILTIN_LIBM(nanf16)
#define SIMDE_NANHF
HEDLEY_STATIC_CAST(simde_float16, __builtin_nanf16("")
)
#define SIMDE_NANHF
__builtin_nanf16(""
)
#elif defined(SIMDE_MATH_NAN)
#elif defined(SIMDE_MATH_NAN)
#define SIMDE_NANHF
HEDLEY_STATIC_CAST(simde_float16, SIMDE_MATH_NAN)
#define SIMDE_NANHF
SIMDE_MATH_NAN
#endif
#endif
#if SIMDE_MATH_BUILTIN_LIBM(inf16)
#if SIMDE_MATH_BUILTIN_LIBM(inf16)
#define SIMDE_INFINITYHF __builtin_inf16()
#define SIMDE_INFINITYHF __builtin_inf16()
...
@@ -158,9 +159,9 @@ SIMDE_DEFINE_CONVERSION_FUNCTION_(simde_uint16_as_float16, simde_float16, u
...
@@ -158,9 +159,9 @@ SIMDE_DEFINE_CONVERSION_FUNCTION_(simde_uint16_as_float16, simde_float16, u
#endif
#endif
#endif
#endif
#endif
#endif
/* Conversion -- convert between single-precision and half-precision
/* Conversion -- convert between single-precision and half-precision
* floats. */
* floats. */
static
HEDLEY_ALWAYS_INLINE
HEDLEY_CONST
static
HEDLEY_ALWAYS_INLINE
HEDLEY_CONST
simde_float16
simde_float16
simde_float16_from_float32
(
simde_float32
value
)
{
simde_float16_from_float32
(
simde_float32
value
)
{
...
@@ -258,6 +259,54 @@ simde_float16_to_float32 (simde_float16 value) {
...
@@ -258,6 +259,54 @@ simde_float16_to_float32 (simde_float16 value) {
#define SIMDE_FLOAT16_VALUE(value) simde_float16_from_float32(SIMDE_FLOAT32_C(value))
#define SIMDE_FLOAT16_VALUE(value) simde_float16_from_float32(SIMDE_FLOAT32_C(value))
#endif
#endif
#if !defined(simde_isinfhf) && defined(simde_math_isinff)
#define simde_isinfhf(a) simde_math_isinff(simde_float16_to_float32(a))
#endif
#if !defined(simde_isnanhf) && defined(simde_math_isnanf)
#define simde_isnanhf(a) simde_math_isnanf(simde_float16_to_float32(a))
#endif
#if !defined(simde_isnormalhf) && defined(simde_math_isnormalf)
#define simde_isnormalhf(a) simde_math_isnormalf(simde_float16_to_float32(a))
#endif
#if !defined(simde_issubnormalhf) && defined(simde_math_issubnormalf)
#define simde_issubnormalhf(a) simde_math_issubnormalf(simde_float16_to_float32(a))
#endif
#define simde_fpclassifyhf(a) simde_math_fpclassifyf(simde_float16_to_float32(a))
static
HEDLEY_INLINE
uint8_t
simde_fpclasshf
(
simde_float16
v
,
const
int
imm8
)
{
uint16_t
bits
=
simde_float16_as_uint16
(
v
);
uint8_t
negative
=
(
bits
>>
15
)
&
1
;
uint16_t
const
ExpMask
=
0x7C00
;
// [14:10]
uint16_t
const
MantMask
=
0x03FF
;
// [9:0]
uint8_t
exponent_all_ones
=
((
bits
&
ExpMask
)
==
ExpMask
);
uint8_t
exponent_all_zeros
=
((
bits
&
ExpMask
)
==
0
);
uint8_t
mantissa_all_zeros
=
((
bits
&
MantMask
)
==
0
);
uint8_t
zero
=
exponent_all_zeros
&
mantissa_all_zeros
;
uint8_t
signaling_bit
=
(
bits
>>
9
)
&
1
;
uint8_t
result
=
0
;
uint8_t
snan
=
exponent_all_ones
&
(
!
mantissa_all_zeros
)
&
(
!
signaling_bit
);
uint8_t
qnan
=
exponent_all_ones
&
(
!
mantissa_all_zeros
)
&
signaling_bit
;
uint8_t
positive_zero
=
(
!
negative
)
&
zero
;
uint8_t
negative_zero
=
negative
&
zero
;
uint8_t
positive_infinity
=
(
!
negative
)
&
exponent_all_ones
&
mantissa_all_zeros
;
uint8_t
negative_infinity
=
negative
&
exponent_all_ones
&
mantissa_all_zeros
;
uint8_t
denormal
=
exponent_all_zeros
&
(
!
mantissa_all_zeros
);
uint8_t
finite_negative
=
negative
&
(
!
exponent_all_ones
)
&
(
!
zero
);
result
=
(((
imm8
>>
0
)
&
qnan
)
|
\
((
imm8
>>
1
)
&
positive_zero
)
|
\
((
imm8
>>
2
)
&
negative_zero
)
|
\
((
imm8
>>
3
)
&
positive_infinity
)
|
\
((
imm8
>>
4
)
&
negative_infinity
)
|
\
((
imm8
>>
5
)
&
denormal
)
|
\
((
imm8
>>
6
)
&
finite_negative
)
|
\
((
imm8
>>
7
)
&
snan
));
return
result
;
}
SIMDE_END_DECLS_
SIMDE_END_DECLS_
HEDLEY_DIAGNOSTIC_POP
HEDLEY_DIAGNOSTIC_POP
...
...
simde-features.h
View file @
4a29d21f
...
@@ -142,6 +142,15 @@
...
@@ -142,6 +142,15 @@
#define SIMDE_X86_AVX512F_NATIVE
#define SIMDE_X86_AVX512F_NATIVE
#endif
#endif
#if !defined(SIMDE_X86_AVX512FP16_NATIVE) && !defined(SIMDE_X86_AVX512FP16_NO_NATIVE) && !defined(SIMDE_NO_NATIVE)
#if defined(SIMDE_ARCH_X86_AVX512FP16)
#define SIMDE_X86_AVX512FP16_NATIVE
#endif
#endif
#if defined(SIMDE_X86_AVX512BW_NATIVE) && !defined(SIMDE_X86_AVX512F_NATIVE)
#define SIMDE_X86_AVX512F_NATIVE
#endif
#if !defined(SIMDE_X86_AVX512BF16_NATIVE) && !defined(SIMDE_X86_AVX512BF16_NO_NATIVE) && !defined(SIMDE_NO_NATIVE)
#if !defined(SIMDE_X86_AVX512BF16_NATIVE) && !defined(SIMDE_X86_AVX512BF16_NO_NATIVE) && !defined(SIMDE_NO_NATIVE)
#if defined(SIMDE_ARCH_X86_AVX512BF16)
#if defined(SIMDE_ARCH_X86_AVX512BF16)
#define SIMDE_X86_AVX512BF16_NATIVE
#define SIMDE_X86_AVX512BF16_NATIVE
...
@@ -623,6 +632,9 @@
...
@@ -623,6 +632,9 @@
#if !defined(SIMDE_X86_AVX512CD_NATIVE)
#if !defined(SIMDE_X86_AVX512CD_NATIVE)
#define SIMDE_X86_AVX512CD_ENABLE_NATIVE_ALIASES
#define SIMDE_X86_AVX512CD_ENABLE_NATIVE_ALIASES
#endif
#endif
#if !defined(SIMDE_X86_AVX512FP16_NATIVE)
#define SIMDE_X86_AVX512FP16_ENABLE_NATIVE_ALIASES
#endif
#if !defined(SIMDE_X86_GFNI_NATIVE)
#if !defined(SIMDE_X86_GFNI_NATIVE)
#define SIMDE_X86_GFNI_ENABLE_NATIVE_ALIASES
#define SIMDE_X86_GFNI_ENABLE_NATIVE_ALIASES
#endif
#endif
...
...
x86/avx512.h
View file @
4a29d21f
...
@@ -100,6 +100,7 @@
...
@@ -100,6 +100,7 @@
#include "avx512/popcnt.h"
#include "avx512/popcnt.h"
#include "avx512/range.h"
#include "avx512/range.h"
#include "avx512/range_round.h"
#include "avx512/range_round.h"
#include "avx512/reduce.h"
#include "avx512/rol.h"
#include "avx512/rol.h"
#include "avx512/rolv.h"
#include "avx512/rolv.h"
#include "avx512/ror.h"
#include "avx512/ror.h"
...
...
x86/avx512/cast.h
View file @
4a29d21f
...
@@ -100,6 +100,39 @@ simde_mm512_castps_si512 (simde__m512 a) {
...
@@ -100,6 +100,39 @@ simde_mm512_castps_si512 (simde__m512 a) {
#define _mm512_castps_si512(a) simde_mm512_castps_si512(a)
#define _mm512_castps_si512(a) simde_mm512_castps_si512(a)
#endif
#endif
SIMDE_FUNCTION_ATTRIBUTES
simde__m512i
simde_mm512_castph_si512
(
simde__m512h
a
)
{
#if defined(SIMDE_X86_AVX512FP16_NATIVE)
return
_mm512_castph_si512
(
a
);
#else
simde__m512i
r
;
simde_memcpy
(
&
r
,
&
a
,
sizeof
(
r
));
return
r
;
#endif
}
#if defined(SIMDE_X86_AVX512FP16_ENABLE_NATIVE_ALIASES)
#undef _mm512_castph_si512
#define _mm512_castph_si512(a) simde_mm512_castph_si512(a)
#endif
SIMDE_FUNCTION_ATTRIBUTES
simde__m512h
simde_mm512_castsi512_ph
(
simde__m512i
a
)
{
#if defined(SIMDE_X86_AVX512FP16_NATIVE)
return
_mm512_castsi512_ph
(
a
);
#else
simde__m512h
r
;
simde_memcpy
(
&
r
,
&
a
,
sizeof
(
r
));
return
r
;
#endif
}
#if defined(SIMDE_X86_AVX512FP16_ENABLE_NATIVE_ALIASES)
#undef _mm512_castsi512_ph
#define _mm512_castsi512_ph(a) simde_mm512_castsi512_ph(a)
#endif
SIMDE_FUNCTION_ATTRIBUTES
SIMDE_FUNCTION_ATTRIBUTES
simde__m512
simde__m512
simde_mm512_castsi512_ps
(
simde__m512i
a
)
{
simde_mm512_castsi512_ps
(
simde__m512i
a
)
{
...
...
x86/avx512/cmp.h
View file @
4a29d21f
...
@@ -534,6 +534,235 @@ simde_mm512_cmp_pd_mask (simde__m512d a, simde__m512d b, const int imm8)
...
@@ -534,6 +534,235 @@ simde_mm512_cmp_pd_mask (simde__m512d a, simde__m512d b, const int imm8)
#define _mm_cmp_pd_mask(a, b, imm8) simde_mm_cmp_pd_mask((a), (b), (imm8))
#define _mm_cmp_pd_mask(a, b, imm8) simde_mm_cmp_pd_mask((a), (b), (imm8))
#endif
#endif
SIMDE_HUGE_FUNCTION_ATTRIBUTES
simde__mmask32
simde_mm512_cmp_ph_mask
(
simde__m512h
a
,
simde__m512h
b
,
const
int
imm8
)
SIMDE_REQUIRE_CONSTANT_RANGE
(
imm8
,
0
,
31
)
{
simde__m512h_private
r_
,
a_
=
simde__m512h_to_private
(
a
),
b_
=
simde__m512h_to_private
(
b
);
switch
(
imm8
)
{
case
SIMDE_CMP_EQ_OQ
:
case
SIMDE_CMP_EQ_OS
:
#if defined(SIMDE_VECTOR_SUBSCRIPT_OPS) && defined(SIMDE_FLOAT16_VECTOR)
r_
.
i16
=
HEDLEY_REINTERPRET_CAST
(
__typeof__
(
r_
.
i16
),
(
a_
.
f16
==
b_
.
f16
));
#else
SIMDE_VECTORIZE
for
(
size_t
i
=
0
;
i
<
(
sizeof
(
r_
.
f16
)
/
sizeof
(
r_
.
f16
[
0
]))
;
i
++
)
{
r_
.
i16
[
i
]
=
(
simde_float16_as_uint16
(
a_
.
f16
[
i
])
==
simde_float16_as_uint16
(
b_
.
f16
[
i
])
&&
!
simde_isnanhf
(
a_
.
f16
[
i
])
&&
!
simde_isnanhf
(
b_
.
f16
[
i
])
)
?
~
INT16_C
(
0
)
:
INT16_C
(
0
);
}
#endif
break
;
case
SIMDE_CMP_LT_OQ
:
case
SIMDE_CMP_LT_OS
:
#if defined(SIMDE_VECTOR_SUBSCRIPT_OPS) && defined(SIMDE_FLOAT16_VECTOR)
r_
.
i16
=
HEDLEY_REINTERPRET_CAST
(
__typeof__
(
r_
.
i16
),
(
a_
.
f16
<
b_
.
f16
));
#else
SIMDE_VECTORIZE
for
(
size_t
i
=
0
;
i
<
(
sizeof
(
r_
.
f16
)
/
sizeof
(
r_
.
f16
[
0
]))
;
i
++
)
{
r_
.
i16
[
i
]
=
(
simde_float16_to_float32
(
a_
.
f16
[
i
])
<
simde_float16_to_float32
(
b_
.
f16
[
i
]))
?
~
INT16_C
(
0
)
:
INT16_C
(
0
);
}
#endif
break
;
case
SIMDE_CMP_LE_OQ
:
case
SIMDE_CMP_LE_OS
:
#if defined(SIMDE_VECTOR_SUBSCRIPT_OPS) && defined(SIMDE_FLOAT16_VECTOR)
r_
.
i16
=
HEDLEY_REINTERPRET_CAST
(
__typeof__
(
r_
.
i16
),
(
a_
.
f16
<=
b_
.
f16
));
#else
SIMDE_VECTORIZE
for
(
size_t
i
=
0
;
i
<
(
sizeof
(
r_
.
f16
)
/
sizeof
(
r_
.
f16
[
0
]))
;
i
++
)
{
r_
.
i16
[
i
]
=
(
simde_float16_to_float32
(
a_
.
f16
[
i
])
<=
simde_float16_to_float32
(
b_
.
f16
[
i
]))
?
~
INT16_C
(
0
)
:
INT16_C
(
0
);
}
#endif
break
;
case
SIMDE_CMP_UNORD_Q
:
case
SIMDE_CMP_UNORD_S
:
#if defined(SIMDE_VECTOR_SUBSCRIPT_OPS) && defined(SIMDE_FLOAT16_VECTOR)
r_
.
i16
=
HEDLEY_REINTERPRET_CAST
(
__typeof__
(
r_
.
i16
),
(
a_
.
f16
!=
a_
.
f16
)
|
(
b_
.
f16
!=
b_
.
f16
));
#else
SIMDE_VECTORIZE
for
(
size_t
i
=
0
;
i
<
(
sizeof
(
r_
.
f16
)
/
sizeof
(
r_
.
f16
[
0
]))
;
i
++
)
{
r_
.
i16
[
i
]
=
(
(
simde_float16_to_float32
(
a_
.
f16
[
i
])
!=
simde_float16_to_float32
(
a_
.
f16
[
i
]))
||
(
simde_float16_to_float32
(
b_
.
f16
[
i
])
!=
simde_float16_to_float32
(
b_
.
f16
[
i
]))
)
?
~
INT16_C
(
0
)
:
INT16_C
(
0
);
}
#endif
break
;
case
SIMDE_CMP_NEQ_UQ
:
case
SIMDE_CMP_NEQ_US
:
#if defined(SIMDE_VECTOR_SUBSCRIPT_OPS) && defined(SIMDE_FLOAT16_VECTOR)
r_
.
i16
=
HEDLEY_REINTERPRET_CAST
(
__typeof__
(
r_
.
i16
),
(
a_
.
f16
!=
b_
.
f16
));
#else
SIMDE_VECTORIZE
for
(
size_t
i
=
0
;
i
<
(
sizeof
(
r_
.
f16
)
/
sizeof
(
r_
.
f16
[
0
]))
;
i
++
)
{
r_
.
i16
[
i
]
=
(
(
simde_float16_as_uint16
(
a_
.
f16
[
i
])
!=
simde_float16_as_uint16
(
b_
.
f16
[
i
]))
||
simde_isnanhf
(
a_
.
f16
[
i
])
||
simde_isnanhf
(
b_
.
f16
[
i
])
)
?
~
INT16_C
(
0
)
:
INT16_C
(
0
);
}
#endif
break
;
case
SIMDE_CMP_NEQ_OQ
:
case
SIMDE_CMP_NEQ_OS
:
#if defined(SIMDE_VECTOR_SUBSCRIPT_OPS) && defined(SIMDE_FLOAT16_VECTOR)
r_
.
i16
=
HEDLEY_REINTERPRET_CAST
(
__typeof__
(
r_
.
i16
),
(
a_
.
f16
==
a_
.
f16
)
&
(
b_
.
f16
==
b_
.
f16
)
&
(
a_
.
f16
!=
b_
.
f16
));
#else
SIMDE_VECTORIZE
for
(
size_t
i
=
0
;
i
<
(
sizeof
(
r_
.
f16
)
/
sizeof
(
r_
.
f16
[
0
]))
;
i
++
)
{
r_
.
i16
[
i
]
=
(
!
(
simde_isnanhf
(
a_
.
f16
[
i
])
||
simde_isnanhf
(
b_
.
f16
[
i
]))
&&
(
simde_float16_as_uint16
(
a_
.
f16
[
i
])
!=
simde_float16_as_uint16
(
b_
.
f16
[
i
]))
)
?
~
INT16_C
(
0
)
:
INT16_C
(
0
);
}
#endif
break
;
case
SIMDE_CMP_NLT_UQ
:
case
SIMDE_CMP_NLT_US
:
#if defined(SIMDE_VECTOR_SUBSCRIPT_OPS) && defined(SIMDE_FLOAT16_VECTOR)
r_
.
i16
=
HEDLEY_REINTERPRET_CAST
(
__typeof__
(
r_
.
i16
),
~
(
a_
.
f16
<
b_
.
f16
));
#else
SIMDE_VECTORIZE
for
(
size_t
i
=
0
;
i
<
(
sizeof
(
r_
.
f16
)
/
sizeof
(
r_
.
f16
[
0
]))
;
i
++
)
{
r_
.
i16
[
i
]
=
!
(
simde_float16_to_float32
(
a_
.
f16
[
i
])
<
simde_float16_to_float32
(
b_
.
f16
[
i
])
)
?
~
INT16_C
(
0
)
:
INT16_C
(
0
);
}
#endif
break
;
case
SIMDE_CMP_NLE_UQ
:
case
SIMDE_CMP_NLE_US
:
#if defined(SIMDE_VECTOR_SUBSCRIPT_OPS) && defined(SIMDE_FLOAT16_VECTOR)
r_
.
i16
=
HEDLEY_REINTERPRET_CAST
(
__typeof__
(
r_
.
i16
),
~
(
a_
.
f16
<=
b_
.
f16
));
#else
SIMDE_VECTORIZE
for
(
size_t
i
=
0
;
i
<
(
sizeof
(
r_
.
f16
)
/
sizeof
(
r_
.
f16
[
0
]))
;
i
++
)
{
r_
.
i16
[
i
]
=
!
(
simde_float16_to_float32
(
a_
.
f16
[
i
])
<=
simde_float16_to_float32
(
b_
.
f16
[
i
])
)
?
~
INT16_C
(
0
)
:
INT16_C
(
0
);
}
#endif
break
;
case
SIMDE_CMP_ORD_Q
:
case
SIMDE_CMP_ORD_S
:
#if defined(SIMDE_VECTOR_SUBSCRIPT_OPS) && defined(SIMDE_FLOAT16_VECTOR)
r_
.
i16
=
HEDLEY_REINTERPRET_CAST
(
__typeof__
(
r_
.
i16
),
((
a_
.
f16
==
a_
.
f16
)
&
(
b_
.
f16
==
b_
.
f16
)));
#else
SIMDE_VECTORIZE
for
(
size_t
i
=
0
;
i
<
(
sizeof
(
r_
.
f16
)
/
sizeof
(
r_
.
f16
[
0
]))
;
i
++
)
{
r_
.
i16
[
i
]
=
(
simde_isnanhf
(
a_
.
f16
[
i
])
||
simde_isnanhf
(
b_
.
f16
[
i
]))
?
INT16_C
(
0
)
:
~
INT16_C
(
0
);
}
#endif
break
;
case
SIMDE_CMP_EQ_UQ
:
case
SIMDE_CMP_EQ_US
:
#if defined(SIMDE_VECTOR_SUBSCRIPT_OPS) && defined(SIMDE_FLOAT16_VECTOR)
r_
.
i16
=
HEDLEY_REINTERPRET_CAST
(
__typeof__
(
r_
.
i16
),
(
a_
.
f16
!=
a_
.
f16
)
|
(
b_
.
f16
!=
b_
.
f16
)
|
(
a_
.
f16
==
b_
.
f16
));
#else
SIMDE_VECTORIZE
for
(
size_t
i
=
0
;
i
<
(
sizeof
(
r_
.
f16
)
/
sizeof
(
r_
.
f16
[
0
]))
;
i
++
)
{
r_
.
i16
[
i
]
=
(
(
simde_isnanhf
(
a_
.
f16
[
i
])
||
simde_isnanhf
(
b_
.
f16
[
i
]))
||
(
simde_float16_as_uint16
(
a_
.
f16
[
i
])
==
simde_float16_as_uint16
(
b_
.
f16
[
i
]))
)
?
~
INT16_C
(
0
)
:
INT16_C
(
0
);
}
#endif
break
;
case
SIMDE_CMP_NGE_UQ
:
case
SIMDE_CMP_NGE_US
:
#if defined(SIMDE_VECTOR_SUBSCRIPT_OPS) && defined(SIMDE_FLOAT16_VECTOR)
r_
.
i16
=
HEDLEY_REINTERPRET_CAST
(
__typeof__
(
r_
.
i16
),
~
(
a_
.
f16
>=
b_
.
f16
));
#else
SIMDE_VECTORIZE
for
(
size_t
i
=
0
;
i
<
(
sizeof
(
r_
.
f16
)
/
sizeof
(
r_
.
f16
[
0
]))
;
i
++
)
{
r_
.
i16
[
i
]
=
!
(
simde_float16_to_float32
(
a_
.
f16
[
i
])
>=
simde_float16_to_float32
(
b_
.
f16
[
i
])
)
?
~
INT16_C
(
0
)
:
INT16_C
(
0
);
}
#endif
break
;
case
SIMDE_CMP_NGT_UQ
:
case
SIMDE_CMP_NGT_US
:
#if defined(SIMDE_VECTOR_SUBSCRIPT_OPS) && defined(SIMDE_FLOAT16_VECTOR)
r_
.
i16
=
HEDLEY_REINTERPRET_CAST
(
__typeof__
(
r_
.
i16
),
~
(
a_
.
f16
>
b_
.
f16
));
#else
SIMDE_VECTORIZE
for
(
size_t
i
=
0
;
i
<
(
sizeof
(
r_
.
f16
)
/
sizeof
(
r_
.
f16
[
0
]))
;
i
++
)
{
r_
.
i16
[
i
]
=
!
(
simde_float16_to_float32
(
a_
.
f16
[
i
])
>
simde_float16_to_float32
(
b_
.
f16
[
i
])
)
?
~
INT16_C
(
0
)
:
INT16_C
(
0
);
}
#endif
break
;
case
SIMDE_CMP_FALSE_OQ
:
case
SIMDE_CMP_FALSE_OS
:
r_
=
simde__m512h_to_private
(
simde_mm512_setzero_ph
());
break
;
case
SIMDE_CMP_GE_OQ
:
case
SIMDE_CMP_GE_OS
:
#if defined(SIMDE_VECTOR_SUBSCRIPT_OPS) && defined(SIMDE_FLOAT16_VECTOR)
r_
.
i16
=
HEDLEY_REINTERPRET_CAST
(
__typeof__
(
r_
.
i16
),
(
a_
.
f16
>=
b_
.
f16
));
#else
SIMDE_VECTORIZE
for
(
size_t
i
=
0
;
i
<
(
sizeof
(
r_
.
f16
)
/
sizeof
(
r_
.
f16
[
0
]))
;
i
++
)
{
r_
.
i16
[
i
]
=
(
simde_float16_to_float32
(
a_
.
f16
[
i
])
>=
simde_float16_to_float32
(
b_
.
f16
[
i
])
)
?
~
INT16_C
(
0
)
:
INT16_C
(
0
);
}
#endif
break
;
case
SIMDE_CMP_GT_OQ
:
case
SIMDE_CMP_GT_OS
:
#if defined(SIMDE_VECTOR_SUBSCRIPT_OPS) && defined(SIMDE_FLOAT16_VECTOR)
r_
.
i16
=
HEDLEY_REINTERPRET_CAST
(
__typeof__
(
r_
.
i16
),
(
a_
.
f16
>
b_
.
f16
));
#else
SIMDE_VECTORIZE
for
(
size_t
i
=
0
;
i
<
(
sizeof
(
r_
.
f16
)
/
sizeof
(
r_
.
f16
[
0
]))
;
i
++
)
{
r_
.
i16
[
i
]
=
(
simde_float16_to_float32
(
a_
.
f16
[
i
])
>
simde_float16_to_float32
(
b_
.
f16
[
i
])
)
?
~
INT16_C
(
0
)
:
INT16_C
(
0
);
}
#endif
break
;
case
SIMDE_CMP_TRUE_UQ
:
case
SIMDE_CMP_TRUE_US
:
r_
=
simde__m512h_to_private
(
simde_x_mm512_setone_ph
());
break
;
default:
HEDLEY_UNREACHABLE
();
}
return
simde_mm512_movepi16_mask
(
simde_mm512_castph_si512
(
simde__m512h_from_private
(
r_
)));
}
#if defined(SIMDE_X86_AVX512FP16_NATIVE)
#define simde_mm512_cmp_ph_mask(a, b, imm8) _mm512_cmp_ph_mask((a), (b), (imm8))
#endif
#if defined(SIMDE_X86_AVX512FP16_ENABLE_NATIVE_ALIASES)
#undef _mm512_cmp_ph_mask
#define _mm512_cmp_ph_mask(a, b, imm8) simde_mm512_cmp_ph_mask((a), (b), (imm8))
#endif
SIMDE_HUGE_FUNCTION_ATTRIBUTES
SIMDE_HUGE_FUNCTION_ATTRIBUTES
simde__mmask32
simde__mmask32
simde_mm512_cmp_epu16_mask
(
simde__m512i
a
,
simde__m512i
b
,
const
int
imm8
)
simde_mm512_cmp_epu16_mask
(
simde__m512i
a
,
simde__m512i
b
,
const
int
imm8
)
...
...
x86/avx512/fpclass.h
View file @
4a29d21f
...
@@ -53,6 +53,25 @@ simde_mm256_fpclass_ps_mask(simde__m256 a, int imm8)
...
@@ -53,6 +53,25 @@ simde_mm256_fpclass_ps_mask(simde__m256 a, int imm8)
# define _mm256_fpclass_ps_mask(a, imm8) simde_mm256_fpclass_ps_mask((a), (imm8))
# define _mm256_fpclass_ps_mask(a, imm8) simde_mm256_fpclass_ps_mask((a), (imm8))
#endif
#endif
SIMDE_FUNCTION_ATTRIBUTES
simde__mmask32
simde_mm512_fpclass_ph_mask
(
simde__m512h
a
,
int
imm8
)
SIMDE_REQUIRE_CONSTANT_RANGE
(
imm8
,
0
,
0x88
)
{
simde__mmask32
r
=
0
;
simde__m512h_private
a_
=
simde__m512h_to_private
(
a
);
for
(
size_t
i
=
0
;
i
<
(
sizeof
(
a_
.
f16
)
/
sizeof
(
a_
.
f16
[
0
]))
;
i
++
)
{
r
|=
simde_fpclasshf
(
a_
.
f16
[
i
],
imm8
)
?
(
UINT8_C
(
1
)
<<
i
)
:
0
;
}
return
r
;
}
#if defined(SIMDE_X86_AVX512FP16_NATIVE)
# define simde_mm512_fpclass_ph_mask(a, imm8) _mm512_fpclass_ph_mask((a), (imm8))
#endif
#if defined(SIMDE_X86_AVX512FP16_ENABLE_NATIVE_ALIASES)
# undef _mm512_fpclass_ph_mask
# define _mm512_fpclass_ph_mask(a, imm8) simde_mm512_fpclass_ph_mask((a), (imm8))
#endif
SIMDE_FUNCTION_ATTRIBUTES
SIMDE_FUNCTION_ATTRIBUTES
simde__mmask8
simde__mmask8
...
...
x86/avx512/load.h
View file @
4a29d21f
...
@@ -64,6 +64,23 @@ simde_mm512_load_ps (void const * mem_addr) {
...
@@ -64,6 +64,23 @@ simde_mm512_load_ps (void const * mem_addr) {
#undef _mm512_load_ps
#undef _mm512_load_ps
#define _mm512_load_ps(a) simde_mm512_load_ps(a)
#define _mm512_load_ps(a) simde_mm512_load_ps(a)
#endif
#endif
SIMDE_FUNCTION_ATTRIBUTES
simde__m512h
simde_mm512_load_ph
(
void
const
*
mem_addr
)
{
#if defined(SIMDE_X86_AVX512FP16_NATIVE)
return
_mm512_load_ph
(
SIMDE_ALIGN_ASSUME_LIKE
(
mem_addr
,
simde__m512h
));
#else
simde__m512h
r
;
simde_memcpy
(
&
r
,
SIMDE_ALIGN_ASSUME_LIKE
(
mem_addr
,
simde__m512h
),
sizeof
(
r
));
return
r
;
#endif
}
#if defined(SIMDE_X86_AVX512FP16_ENABLE_NATIVE_ALIASES)
#undef _mm512_load_ph
#define _mm512_load_ph(a) simde_mm512_load_ph(a)
#endif
SIMDE_FUNCTION_ATTRIBUTES
SIMDE_FUNCTION_ATTRIBUTES
simde__m512i
simde__m512i
simde_mm512_load_si512
(
void
const
*
mem_addr
)
{
simde_mm512_load_si512
(
void
const
*
mem_addr
)
{
...
...
x86/avx512/loadu.h
View file @
4a29d21f
...
@@ -73,6 +73,22 @@ simde_mm512_loadu_pd (void const * mem_addr) {
...
@@ -73,6 +73,22 @@ simde_mm512_loadu_pd (void const * mem_addr) {
#define _mm512_loadu_pd(a) simde_mm512_loadu_pd(a)
#define _mm512_loadu_pd(a) simde_mm512_loadu_pd(a)
#endif
#endif
SIMDE_FUNCTION_ATTRIBUTES
simde__m512h
simde_mm512_loadu_ph
(
void
const
*
mem_addr
)
{
#if defined(SIMDE_X86_AVX512FP16_NATIVE)
return
_mm512_loadu_ph
(
mem_addr
);
#else
simde__m512h
r
;
simde_memcpy
(
&
r
,
mem_addr
,
sizeof
(
r
));
return
r
;
#endif
}
#if defined(SIMDE_X86_AVX512FP16_ENABLE_NATIVE_ALIASES)
#undef _mm512_loadu_ph
#define _mm512_loadu_ph(a) simde_mm512_loadu_ph(a)
#endif
SIMDE_FUNCTION_ATTRIBUTES
SIMDE_FUNCTION_ATTRIBUTES
simde__m512i
simde__m512i
simde_mm512_loadu_si512
(
void
const
*
mem_addr
)
{
simde_mm512_loadu_si512
(
void
const
*
mem_addr
)
{
...
...
x86/avx512/max.h
View file @
4a29d21f
...
@@ -553,6 +553,30 @@ simde_mm512_max_pd (simde__m512d a, simde__m512d b) {
...
@@ -553,6 +553,30 @@ simde_mm512_max_pd (simde__m512d a, simde__m512d b) {
#define _mm512_max_pd(a, b) simde_mm512_max_pd(a, b)
#define _mm512_max_pd(a, b) simde_mm512_max_pd(a, b)
#endif
#endif
SIMDE_FUNCTION_ATTRIBUTES
simde__m512h
simde_mm512_max_ph
(
simde__m512h
a
,
simde__m512h
b
)
{
#if defined(SIMDE_X86_AVX512FP16_NATIVE)
return
_mm512_max_ph
(
a
,
b
);
#else
simde__m512h_private
r_
,
a_
=
simde__m512h_to_private
(
a
),
b_
=
simde__m512h_to_private
(
b
);
SIMDE_VECTORIZE
for
(
size_t
i
=
0
;
i
<
(
sizeof
(
r_
.
f16
)
/
sizeof
(
r_
.
f16
[
0
]))
;
i
++
)
{
r_
.
f16
[
i
]
=
simde_float16_to_float32
(
a_
.
f16
[
i
])
>
simde_float16_to_float32
(
b_
.
f16
[
i
])
?
a_
.
f16
[
i
]
:
b_
.
f16
[
i
];
}
return
simde__m512h_from_private
(
r_
);
#endif
}
#if defined(SIMDE_X86_AVX512FP16_ENABLE_NATIVE_ALIASES)
#undef _mm512_max_ph
#define _mm512_max_ph(a, b) simde_mm512_max_ph(a, b)
#endif
SIMDE_FUNCTION_ATTRIBUTES
SIMDE_FUNCTION_ATTRIBUTES
simde__m512d
simde__m512d
simde_mm512_mask_max_pd
(
simde__m512d
src
,
simde__mmask8
k
,
simde__m512d
a
,
simde__m512d
b
)
{
simde_mm512_mask_max_pd
(
simde__m512d
src
,
simde__mmask8
k
,
simde__m512d
a
,
simde__m512d
b
)
{
...
...
x86/avx512/min.h
View file @
4a29d21f
...
@@ -581,6 +581,30 @@ simde_mm512_maskz_min_pd(simde__mmask8 k, simde__m512d a, simde__m512d b) {
...
@@ -581,6 +581,30 @@ simde_mm512_maskz_min_pd(simde__mmask8 k, simde__m512d a, simde__m512d b) {
#define _mm512_maskz_min_pd(k, a, b) simde_mm512_maskz_min_pd(k, a, b)
#define _mm512_maskz_min_pd(k, a, b) simde_mm512_maskz_min_pd(k, a, b)
#endif
#endif
SIMDE_FUNCTION_ATTRIBUTES
simde__m512h
simde_mm512_min_ph
(
simde__m512h
a
,
simde__m512h
b
)
{
#if defined(SIMDE_X86_AVX512FP16_NATIVE)
return
_mm512_min_ph
(
a
,
b
);
#else
simde__m512h_private
r_
,
a_
=
simde__m512h_to_private
(
a
),
b_
=
simde__m512h_to_private
(
b
);
SIMDE_VECTORIZE
for
(
size_t
i
=
0
;
i
<
(
sizeof
(
r_
.
f16
)
/
sizeof
(
r_
.
f16
[
0
]))
;
i
++
)
{
r_
.
f16
[
i
]
=
simde_float16_to_float32
(
a_
.
f16
[
i
])
<
simde_float16_to_float32
(
b_
.
f16
[
i
])
?
a_
.
f16
[
i
]
:
b_
.
f16
[
i
];
}
return
simde__m512h_from_private
(
r_
);
#endif
}
#if defined(SIMDE_X86_AVX512FP16_ENABLE_NATIVE_ALIASES)
#undef _mm512_min_ph
#define _mm512_min_ph(a, b) simde_mm512_min_ph(a, b)
#endif
SIMDE_END_DECLS_
SIMDE_END_DECLS_
HEDLEY_DIAGNOSTIC_POP
HEDLEY_DIAGNOSTIC_POP
...
...
x86/avx512/mov.h
View file @
4a29d21f
...
@@ -451,6 +451,12 @@ simde_mm512_mask_mov_ps (simde__m512 src, simde__mmask16 k, simde__m512 a) {
...
@@ -451,6 +451,12 @@ simde_mm512_mask_mov_ps (simde__m512 src, simde__mmask16 k, simde__m512 a) {
#define _mm512_mask_mov_ps(src, k, a) simde_mm512_mask_mov_ps(src, k, a)
#define _mm512_mask_mov_ps(src, k, a) simde_mm512_mask_mov_ps(src, k, a)
#endif
#endif
SIMDE_FUNCTION_ATTRIBUTES
simde__m512h
simde_x_mm512_mask_mov_ph
(
simde__m512h
src
,
simde__mmask32
k
,
simde__m512h
a
)
{
return
simde_mm512_castsi512_ph
(
simde_mm512_mask_mov_epi16
(
simde_mm512_castph_si512
(
src
),
k
,
simde_mm512_castph_si512
(
a
)));
}
SIMDE_FUNCTION_ATTRIBUTES
SIMDE_FUNCTION_ATTRIBUTES
simde__m128i
simde__m128i
simde_mm_maskz_mov_epi8
(
simde__mmask16
k
,
simde__m128i
a
)
{
simde_mm_maskz_mov_epi8
(
simde__mmask16
k
,
simde__m128i
a
)
{
...
...
x86/avx512/permutexvar.h
View file @
4a29d21f
...
@@ -1146,6 +1146,20 @@ simde_mm512_permutexvar_ps (simde__m512i idx, simde__m512 a) {
...
@@ -1146,6 +1146,20 @@ simde_mm512_permutexvar_ps (simde__m512i idx, simde__m512 a) {
#define _mm512_permutexvar_ps(idx, a) simde_mm512_permutexvar_ps(idx, a)
#define _mm512_permutexvar_ps(idx, a) simde_mm512_permutexvar_ps(idx, a)
#endif
#endif
SIMDE_FUNCTION_ATTRIBUTES
simde__m512h
simde_mm512_permutexvar_ph
(
simde__m512i
idx
,
simde__m512h
a
)
{
#if defined(SIMDE_X86_AVX512FP16_NATIVE)
return
_mm512_permutexvar_ph
(
idx
,
a
);
#else
return
simde_mm512_castsi512_ph
(
simde_mm512_permutexvar_epi16
(
idx
,
simde_mm512_castph_si512
(
a
)));
#endif
}
#if defined(SIMDE_X86_AVX512FP16_ENABLE_NATIVE_ALIASES)
#undef _mm512_permutexvar_ph
#define _mm512_permutexvar_ph(idx, a) simde_mm512_permutexvar_ph(idx, a)
#endif
SIMDE_FUNCTION_ATTRIBUTES
SIMDE_FUNCTION_ATTRIBUTES
simde__m512
simde__m512
simde_mm512_mask_permutexvar_ps
(
simde__m512
src
,
simde__mmask16
k
,
simde__m512i
idx
,
simde__m512
a
)
{
simde_mm512_mask_permutexvar_ps
(
simde__m512
src
,
simde__mmask16
k
,
simde__m512i
idx
,
simde__m512
a
)
{
...
...
x86/avx512/reduce.h
0 → 100644
View file @
4a29d21f
/* SPDX-License-Identifier: MIT
*
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
* files (the "Software"), to deal in the Software without
* restriction, including without limitation the rights to use, copy,
* modify, merge, publish, distribute, sublicense, and/or sell copies
* of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
* Copyright:
* 2023 Michael R. Crusoe <crusoe@debian.org>
*/
#if !defined(SIMDE_X86_AVX512_REDUCE_H)
#define SIMDE_X86_AVX512_REDUCE_H
#include "types.h"
HEDLEY_DIAGNOSTIC_PUSH
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
SIMDE_BEGIN_DECLS_
SIMDE_FUNCTION_ATTRIBUTES
simde_float16
simde_mm512_reduce_max_ph
(
simde__m512h
a
)
{
#if defined(SIMDE_X86_AVX512FP16_NATIVE)
return
_mm512_reduce_max_ph
(
a
);
#else
simde__m512h_private
a_
;
simde_float16
r
;
a_
=
simde__m512h_to_private
(
a
);
r
=
SIMDE_NINFINITYHF
;
#if defined(SIMDE_FLOAT16_VECTOR)
SIMDE_VECTORIZE_REDUCTION
(
max
:
r
)
#endif
for
(
size_t
i
=
0
;
i
<
(
sizeof
(
a_
.
f16
)
/
sizeof
(
a_
.
f16
[
0
]))
;
i
++
)
{
r
=
simde_float16_to_float32
(
a_
.
f16
[
i
])
>
simde_float16_to_float32
(
r
)
?
a_
.
f16
[
i
]
:
r
;
}
return
r
;
#endif
}
#if defined(SIMDE_X86_AVX512FP16_ENABLE_NATIVE_ALIASES)
# define _mm512_reduce_max_ph(a) simde_mm512_reduce_max_ph((a))
#endif
SIMDE_FUNCTION_ATTRIBUTES
simde_float16
simde_mm512_reduce_min_ph
(
simde__m512h
a
)
{
#if defined(SIMDE_X86_AVX512FP16_NATIVE)
return
_mm512_reduce_min_ph
(
a
);
#else
simde__m512h_private
a_
;
simde_float16
r
;
a_
=
simde__m512h_to_private
(
a
);
r
=
SIMDE_INFINITYHF
;
#if defined(SIMDE_FLOAT16_VECTOR)
SIMDE_VECTORIZE_REDUCTION
(
min
:
r
)
#endif
for
(
size_t
i
=
0
;
i
<
(
sizeof
(
a_
.
f16
)
/
sizeof
(
a_
.
f16
[
0
]))
;
i
++
)
{
r
=
simde_float16_to_float32
(
a_
.
f16
[
i
])
<
simde_float16_to_float32
(
r
)
?
a_
.
f16
[
i
]
:
r
;
}
return
r
;
#endif
}
#if defined(SIMDE_X86_AVX512FP16_ENABLE_NATIVE_ALIASES)
# define _mm512_reduce_min_ph(a) simde_mm512_reduce_min_ph((a))
#endif
SIMDE_END_DECLS_
HEDLEY_DIAGNOSTIC_POP
#endif
/* !defined(SIMDE_X86_AVX512_REDUCE_H) */
x86/avx512/set.h
View file @
4a29d21f
...
@@ -484,6 +484,56 @@ simde_mm512_set_pd (simde_float64 e7, simde_float64 e6, simde_float64 e5, simde_
...
@@ -484,6 +484,56 @@ simde_mm512_set_pd (simde_float64 e7, simde_float64 e6, simde_float64 e5, simde_
#define _mm512_set_pd(e7, e6, e5, e4, e3, e2, e1, e0) simde_mm512_set_pd(e7, e6, e5, e4, e3, e2, e1, e0)
#define _mm512_set_pd(e7, e6, e5, e4, e3, e2, e1, e0) simde_mm512_set_pd(e7, e6, e5, e4, e3, e2, e1, e0)
#endif
#endif
SIMDE_FUNCTION_ATTRIBUTES
simde__m512h
simde_mm512_set_ph
(
simde_float16
e31
,
simde_float16
e30
,
simde_float16
e29
,
simde_float16
e28
,
simde_float16
e27
,
simde_float16
e26
,
simde_float16
e25
,
simde_float16
e24
,
simde_float16
e23
,
simde_float16
e22
,
simde_float16
e21
,
simde_float16
e20
,
simde_float16
e19
,
simde_float16
e18
,
simde_float16
e17
,
simde_float16
e16
,
simde_float16
e15
,
simde_float16
e14
,
simde_float16
e13
,
simde_float16
e12
,
simde_float16
e11
,
simde_float16
e10
,
simde_float16
e9
,
simde_float16
e8
,
simde_float16
e7
,
simde_float16
e6
,
simde_float16
e5
,
simde_float16
e4
,
simde_float16
e3
,
simde_float16
e2
,
simde_float16
e1
,
simde_float16
e0
)
{
simde__m512h_private
r_
;
r_
.
f16
[
0
]
=
e0
;
r_
.
f16
[
1
]
=
e1
;
r_
.
f16
[
2
]
=
e2
;
r_
.
f16
[
3
]
=
e3
;
r_
.
f16
[
4
]
=
e4
;
r_
.
f16
[
5
]
=
e5
;
r_
.
f16
[
6
]
=
e6
;
r_
.
f16
[
7
]
=
e7
;
r_
.
f16
[
8
]
=
e8
;
r_
.
f16
[
9
]
=
e9
;
r_
.
f16
[
10
]
=
e10
;
r_
.
f16
[
11
]
=
e11
;
r_
.
f16
[
12
]
=
e12
;
r_
.
f16
[
13
]
=
e13
;
r_
.
f16
[
14
]
=
e14
;
r_
.
f16
[
15
]
=
e15
;
r_
.
f16
[
16
]
=
e16
;
r_
.
f16
[
17
]
=
e17
;
r_
.
f16
[
18
]
=
e18
;
r_
.
f16
[
19
]
=
e19
;
r_
.
f16
[
20
]
=
e20
;
r_
.
f16
[
21
]
=
e21
;
r_
.
f16
[
22
]
=
e22
;
r_
.
f16
[
23
]
=
e23
;
r_
.
f16
[
24
]
=
e24
;
r_
.
f16
[
25
]
=
e25
;
r_
.
f16
[
26
]
=
e26
;
r_
.
f16
[
27
]
=
e27
;
r_
.
f16
[
28
]
=
e28
;
r_
.
f16
[
29
]
=
e29
;
r_
.
f16
[
30
]
=
e30
;
r_
.
f16
[
31
]
=
e31
;
return
simde__m512h_from_private
(
r_
);
}
#if defined(SIMDE_X86_AVX512FP16_ENABLE_NATIVE_ALIASES)
#undef _mm512_set_ph
#define _mm512_set_ph(e31, e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0) \
simde_mm512_set_ph(e31, e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)
#endif
SIMDE_END_DECLS_
SIMDE_END_DECLS_
HEDLEY_DIAGNOSTIC_POP
HEDLEY_DIAGNOSTIC_POP
...
...
x86/avx512/set1.h
View file @
4a29d21f
...
@@ -325,6 +325,27 @@ simde_mm512_set1_pd (simde_float64 a) {
...
@@ -325,6 +325,27 @@ simde_mm512_set1_pd (simde_float64 a) {
#define _mm512_set1_pd(a) simde_mm512_set1_pd(a)
#define _mm512_set1_pd(a) simde_mm512_set1_pd(a)
#endif
#endif
SIMDE_FUNCTION_ATTRIBUTES
simde__m512h
simde_mm512_set1_ph
(
simde_float16
a
)
{
#if defined(SIMDE_X86_AVX512FP16_NATIVE)
return
_mm512_set1_ph
(
a
);
#else
simde__m512h_private
r_
;
SIMDE_VECTORIZE
for
(
size_t
i
=
0
;
i
<
(
sizeof
(
r_
.
f16
)
/
sizeof
(
r_
.
f16
[
0
]))
;
i
++
)
{
r_
.
f16
[
i
]
=
a
;
}
return
simde__m512h_from_private
(
r_
);
#endif
}
#if defined(SIMDE_X86_AVX512FP16_ENABLE_NATIVE_ALIASES)
#undef _mm512_set1_ph
#define _mm512_set1_ph(a) simde_mm512_set1_ph(a)
#endif
SIMDE_END_DECLS_
SIMDE_END_DECLS_
HEDLEY_DIAGNOSTIC_POP
HEDLEY_DIAGNOSTIC_POP
...
...
x86/avx512/setone.h
View file @
4a29d21f
...
@@ -60,6 +60,12 @@ simde_x_mm512_setone_pd(void) {
...
@@ -60,6 +60,12 @@ simde_x_mm512_setone_pd(void) {
return
simde_mm512_castsi512_pd
(
simde_x_mm512_setone_si512
());
return
simde_mm512_castsi512_pd
(
simde_x_mm512_setone_si512
());
}
}
SIMDE_FUNCTION_ATTRIBUTES
simde__m512h
simde_x_mm512_setone_ph
(
void
)
{
return
simde_mm512_castsi512_ph
(
simde_x_mm512_setone_si512
());
}
SIMDE_END_DECLS_
SIMDE_END_DECLS_
HEDLEY_DIAGNOSTIC_POP
HEDLEY_DIAGNOSTIC_POP
...
...
x86/avx512/setzero.h
View file @
4a29d21f
...
@@ -84,6 +84,21 @@ simde_mm512_setzero_pd(void) {
...
@@ -84,6 +84,21 @@ simde_mm512_setzero_pd(void) {
#define _mm512_setzero_pd() simde_mm512_setzero_pd()
#define _mm512_setzero_pd() simde_mm512_setzero_pd()
#endif
#endif
SIMDE_FUNCTION_ATTRIBUTES
simde__m512h
simde_mm512_setzero_ph
(
void
)
{
#if defined(SIMDE_X86_AVX512FP16_NATIVE)
return
_mm512_setzero_ph
();
#else
return
simde_mm512_castsi512_ph
(
simde_mm512_setzero_si512
());
#endif
}
#if defined(SIMDE_X86_AVX512FP16_ENABLE_NATIVE_ALIASES)
#undef _mm512_setzero_ph
#define _mm512_setzero_ph() simde_mm512_setzero_ph()
#endif
SIMDE_END_DECLS_
SIMDE_END_DECLS_
HEDLEY_DIAGNOSTIC_POP
HEDLEY_DIAGNOSTIC_POP
...
...
x86/avx512/storeu.h
View file @
4a29d21f
...
@@ -95,6 +95,20 @@ simde_mm512_storeu_pd (void * mem_addr, simde__m512d a) {
...
@@ -95,6 +95,20 @@ simde_mm512_storeu_pd (void * mem_addr, simde__m512d a) {
#define _mm512_storeu_pd(mem_addr, a) simde_mm512_storeu_pd(mem_addr, a)
#define _mm512_storeu_pd(mem_addr, a) simde_mm512_storeu_pd(mem_addr, a)
#endif
#endif
SIMDE_FUNCTION_ATTRIBUTES
void
simde_mm512_storeu_ph
(
void
*
mem_addr
,
simde__m512h
a
)
{
#if defined(SIMDE_X86_AVX512FP16_NATIVE)
_mm512_storeu_ph
(
mem_addr
,
a
);
#else
simde_memcpy
(
mem_addr
,
&
a
,
sizeof
(
a
));
#endif
}
#if defined(SIMDE_X86_AVX512FP16_ENABLE_NATIVE_ALIASES)
#undef _mm512_storeu_ph
#define _mm512_storeu_ph(mem_addr, a) simde_mm512_storeu_ph(mem_addr, a)
#endif
SIMDE_FUNCTION_ATTRIBUTES
SIMDE_FUNCTION_ATTRIBUTES
void
void
simde_mm512_storeu_si512
(
void
*
mem_addr
,
simde__m512i
a
)
{
simde_mm512_storeu_si512
(
void
*
mem_addr
,
simde__m512i
a
)
{
...
...
x86/avx512/types.h
View file @
4a29d21f
...
@@ -26,8 +26,8 @@
...
@@ -26,8 +26,8 @@
#if !defined(SIMDE_X86_AVX512_TYPES_H)
#if !defined(SIMDE_X86_AVX512_TYPES_H)
#define SIMDE_X86_AVX512_TYPES_H
#define SIMDE_X86_AVX512_TYPES_H
#include "../avx.h"
#include "../avx.h"
#include "../../simde-f16.h"
HEDLEY_DIAGNOSTIC_PUSH
HEDLEY_DIAGNOSTIC_PUSH
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
...
@@ -376,6 +376,73 @@ typedef union {
...
@@ -376,6 +376,73 @@ typedef union {
#endif
#endif
}
simde__m512d_private
;
}
simde__m512d_private
;
typedef
union
{
#if defined(SIMDE_VECTOR_SUBSCRIPT)
SIMDE_AVX512_ALIGN
int8_t
i8
SIMDE_VECTOR
(
64
)
SIMDE_MAY_ALIAS
;
SIMDE_AVX512_ALIGN
int16_t
i16
SIMDE_VECTOR
(
64
)
SIMDE_MAY_ALIAS
;
SIMDE_AVX512_ALIGN
int32_t
i32
SIMDE_VECTOR
(
64
)
SIMDE_MAY_ALIAS
;
SIMDE_AVX512_ALIGN
int64_t
i64
SIMDE_VECTOR
(
64
)
SIMDE_MAY_ALIAS
;
SIMDE_AVX512_ALIGN
uint8_t
u8
SIMDE_VECTOR
(
64
)
SIMDE_MAY_ALIAS
;
SIMDE_AVX512_ALIGN
uint16_t
u16
SIMDE_VECTOR
(
64
)
SIMDE_MAY_ALIAS
;
SIMDE_AVX512_ALIGN
uint32_t
u32
SIMDE_VECTOR
(
64
)
SIMDE_MAY_ALIAS
;
SIMDE_AVX512_ALIGN
uint64_t
u64
SIMDE_VECTOR
(
64
)
SIMDE_MAY_ALIAS
;
#if defined(SIMDE_HAVE_INT128_)
SIMDE_AVX512_ALIGN
simde_int128
i128
SIMDE_VECTOR
(
64
)
SIMDE_MAY_ALIAS
;
SIMDE_AVX512_ALIGN
simde_uint128
u128
SIMDE_VECTOR
(
64
)
SIMDE_MAY_ALIAS
;
#endif
#if defined(SIMDE_FLOAT16_VECTOR)
SIMDE_ALIGN_TO_16
simde_float16
f16
SIMDE_VECTOR
(
64
)
SIMDE_MAY_ALIAS
;
#else
SIMDE_AVX512_ALIGN
simde_float16
f16
[
32
];
#endif
SIMDE_AVX512_ALIGN
simde_float32
f32
SIMDE_VECTOR
(
64
)
SIMDE_MAY_ALIAS
;
SIMDE_AVX512_ALIGN
simde_float64
f64
SIMDE_VECTOR
(
64
)
SIMDE_MAY_ALIAS
;
SIMDE_AVX512_ALIGN
int_fast32_t
i32f
SIMDE_VECTOR
(
64
)
SIMDE_MAY_ALIAS
;
SIMDE_AVX512_ALIGN
uint_fast32_t
u32f
SIMDE_VECTOR
(
64
)
SIMDE_MAY_ALIAS
;
#else
SIMDE_AVX512_ALIGN
int8_t
i8
[
64
];
SIMDE_AVX512_ALIGN
int16_t
i16
[
32
];
SIMDE_AVX512_ALIGN
int32_t
i32
[
16
];
SIMDE_AVX512_ALIGN
int64_t
i64
[
8
];
SIMDE_AVX512_ALIGN
uint8_t
u8
[
64
];
SIMDE_AVX512_ALIGN
uint16_t
u16
[
32
];
SIMDE_AVX512_ALIGN
uint32_t
u32
[
16
];
SIMDE_AVX512_ALIGN
uint64_t
u64
[
8
];
#if defined(SIMDE_HAVE_INT128_)
SIMDE_AVX512_ALIGN
simde_int128
i128
[
4
];
SIMDE_AVX512_ALIGN
simde_uint128
u128
[
4
];
#endif
SIMDE_AVX512_ALIGN
simde_float16
f16
[
32
];
SIMDE_AVX512_ALIGN
simde_float32
f32
[
16
];
SIMDE_AVX512_ALIGN
simde_float64
f64
[
8
];
SIMDE_AVX512_ALIGN
int_fast32_t
i32f
[
64
/
sizeof
(
int_fast32_t
)];
SIMDE_AVX512_ALIGN
uint_fast32_t
u32f
[
64
/
sizeof
(
uint_fast32_t
)];
#endif
SIMDE_AVX512_ALIGN
simde__m128d_private
m128d_private
[
4
];
SIMDE_AVX512_ALIGN
simde__m128d
m128d
[
4
];
SIMDE_AVX512_ALIGN
simde__m256d_private
m256d_private
[
2
];
SIMDE_AVX512_ALIGN
simde__m256d
m256d
[
2
];
#if defined(SIMDE_X86_AVX512FP16_NATIVE)
SIMDE_AVX512_ALIGN
__m512h
n
;
#elif defined(SIMDE_POWER_ALTIVEC_P6_NATIVE)
SIMDE_ALIGN_TO_16
SIMDE_POWER_ALTIVEC_VECTOR
(
unsigned
char
)
altivec_u8
[
4
];
SIMDE_ALIGN_TO_16
SIMDE_POWER_ALTIVEC_VECTOR
(
unsigned
short
)
altivec_u16
[
4
];
SIMDE_ALIGN_TO_16
SIMDE_POWER_ALTIVEC_VECTOR
(
unsigned
int
)
altivec_u32
[
4
];
SIMDE_ALIGN_TO_16
SIMDE_POWER_ALTIVEC_VECTOR
(
signed
char
)
altivec_i8
[
4
];
SIMDE_ALIGN_TO_16
SIMDE_POWER_ALTIVEC_VECTOR
(
signed
short
)
altivec_i16
[
4
];
SIMDE_ALIGN_TO_16
SIMDE_POWER_ALTIVEC_VECTOR
(
signed
int
)
altivec_i32
[
4
];
SIMDE_ALIGN_TO_16
SIMDE_POWER_ALTIVEC_VECTOR
(
float
)
altivec_f32
[
4
];
#if defined(SIMDE_POWER_ALTIVEC_P7_NATIVE)
SIMDE_ALIGN_TO_16
SIMDE_POWER_ALTIVEC_VECTOR
(
unsigned
long
long
)
altivec_u64
[
4
];
SIMDE_ALIGN_TO_16
SIMDE_POWER_ALTIVEC_VECTOR
(
signed
long
long
)
altivec_i64
[
4
];
SIMDE_ALIGN_TO_16
SIMDE_POWER_ALTIVEC_VECTOR
(
double
)
altivec_f64
[
4
];
#endif
#endif
}
simde__m512h_private
;
typedef
union
{
typedef
union
{
#if defined(SIMDE_VECTOR_SUBSCRIPT)
#if defined(SIMDE_VECTOR_SUBSCRIPT)
SIMDE_AVX512_ALIGN
int8_t
i8
SIMDE_VECTOR
(
64
)
SIMDE_MAY_ALIAS
;
SIMDE_AVX512_ALIGN
int8_t
i8
SIMDE_VECTOR
(
64
)
SIMDE_MAY_ALIAS
;
...
@@ -476,7 +543,7 @@ typedef union {
...
@@ -476,7 +543,7 @@ typedef union {
typedef
simde__m512_private
simde__m512
;
typedef
simde__m512_private
simde__m512
;
typedef
simde__m512i_private
simde__m512i
;
typedef
simde__m512i_private
simde__m512i
;
typedef
simde__m512d_private
simde__m512d
;
typedef
simde__m512d_private
simde__m512d
;
#endif
#endif
typedef
uint8_t
simde__mmask8
;
typedef
uint8_t
simde__mmask8
;
typedef
uint16_t
simde__mmask16
;
typedef
uint16_t
simde__mmask16
;
...
@@ -498,6 +565,16 @@ typedef union {
...
@@ -498,6 +565,16 @@ typedef union {
#endif
#endif
#endif
#endif
#if defined(SIMDE_X86_AVX512FP16_NATIVE)
typedef
__m512h
simde__m512h
;
#else
#if defined(SIMDE_VECTOR_SUBSCRIPT) && defined(SIMDE_FLOAT16_VECTOR)
typedef
simde_float16
simde__m512h
SIMDE_AVX512_ALIGN
SIMDE_VECTOR
(
64
)
SIMDE_MAY_ALIAS
;
#else
typedef
simde__m512h_private
simde__m512h
;
#endif
#endif
/* These are really part of AVX-512VL / AVX-512BW (in GCC __mmask32 is
/* These are really part of AVX-512VL / AVX-512BW (in GCC __mmask32 is
* in avx512vlintrin.h and __mmask64 is in avx512bwintrin.h, in clang
* in avx512vlintrin.h and __mmask64 is in avx512bwintrin.h, in clang
* both are in avx512bwintrin.h), not AVX-512F. However, we don't have
* both are in avx512bwintrin.h), not AVX-512F. However, we don't have
...
@@ -555,6 +632,18 @@ typedef uint64_t simde__mmask64;
...
@@ -555,6 +632,18 @@ typedef uint64_t simde__mmask64;
#endif
#endif
#endif
#endif
#if !defined(SIMDE_X86_AVX512FP16_NATIVE) && defined(SIMDE_ENABLE_NATIVE_ALIASES)
#if !defined(HEDLEY_INTEL_VERSION)
//typedef simde__m128h __m128h;
//typedef simde__m256h __m256h;
typedef
simde__m512h
__m512h
;
#else
//#define __m128h simde__m128h
//#define __m256h simde__m256h
#define __m512h simde__m512h
#endif
#endif
HEDLEY_STATIC_ASSERT
(
16
==
sizeof
(
simde__m128bh
),
"simde__m128bh size incorrect"
);
HEDLEY_STATIC_ASSERT
(
16
==
sizeof
(
simde__m128bh
),
"simde__m128bh size incorrect"
);
HEDLEY_STATIC_ASSERT
(
16
==
sizeof
(
simde__m128bh_private
),
"simde__m128bh_private size incorrect"
);
HEDLEY_STATIC_ASSERT
(
16
==
sizeof
(
simde__m128bh_private
),
"simde__m128bh_private size incorrect"
);
HEDLEY_STATIC_ASSERT
(
32
==
sizeof
(
simde__m256bh
),
"simde__m256bh size incorrect"
);
HEDLEY_STATIC_ASSERT
(
32
==
sizeof
(
simde__m256bh
),
"simde__m256bh size incorrect"
);
...
@@ -567,6 +656,8 @@ HEDLEY_STATIC_ASSERT(64 == sizeof(simde__m512i), "simde__m512i size incorrect");
...
@@ -567,6 +656,8 @@ HEDLEY_STATIC_ASSERT(64 == sizeof(simde__m512i), "simde__m512i size incorrect");
HEDLEY_STATIC_ASSERT
(
64
==
sizeof
(
simde__m512i_private
),
"simde__m512i_private size incorrect"
);
HEDLEY_STATIC_ASSERT
(
64
==
sizeof
(
simde__m512i_private
),
"simde__m512i_private size incorrect"
);
HEDLEY_STATIC_ASSERT
(
64
==
sizeof
(
simde__m512d
),
"simde__m512d size incorrect"
);
HEDLEY_STATIC_ASSERT
(
64
==
sizeof
(
simde__m512d
),
"simde__m512d size incorrect"
);
HEDLEY_STATIC_ASSERT
(
64
==
sizeof
(
simde__m512d_private
),
"simde__m512d_private size incorrect"
);
HEDLEY_STATIC_ASSERT
(
64
==
sizeof
(
simde__m512d_private
),
"simde__m512d_private size incorrect"
);
HEDLEY_STATIC_ASSERT
(
64
==
sizeof
(
simde__m512h
),
"simde__m512h size incorrect"
);
HEDLEY_STATIC_ASSERT
(
64
==
sizeof
(
simde__m512h_private
),
"simde__m512h_private size incorrect"
);
#if defined(SIMDE_CHECK_ALIGNMENT) && defined(SIMDE_ALIGN_OF)
#if defined(SIMDE_CHECK_ALIGNMENT) && defined(SIMDE_ALIGN_OF)
HEDLEY_STATIC_ASSERT
(
SIMDE_ALIGN_OF
(
simde__m128bh
)
==
16
,
"simde__m128bh is not 16-byte aligned"
);
HEDLEY_STATIC_ASSERT
(
SIMDE_ALIGN_OF
(
simde__m128bh
)
==
16
,
"simde__m128bh is not 16-byte aligned"
);
HEDLEY_STATIC_ASSERT
(
SIMDE_ALIGN_OF
(
simde__m128bh_private
)
==
16
,
"simde__m128bh_private is not 16-byte aligned"
);
HEDLEY_STATIC_ASSERT
(
SIMDE_ALIGN_OF
(
simde__m128bh_private
)
==
16
,
"simde__m128bh_private is not 16-byte aligned"
);
...
@@ -580,6 +671,8 @@ HEDLEY_STATIC_ASSERT(SIMDE_ALIGN_OF(simde__m512i) == 32, "simde__m512i is not 32
...
@@ -580,6 +671,8 @@ HEDLEY_STATIC_ASSERT(SIMDE_ALIGN_OF(simde__m512i) == 32, "simde__m512i is not 32
HEDLEY_STATIC_ASSERT
(
SIMDE_ALIGN_OF
(
simde__m512i_private
)
==
32
,
"simde__m512i_private is not 32-byte aligned"
);
HEDLEY_STATIC_ASSERT
(
SIMDE_ALIGN_OF
(
simde__m512i_private
)
==
32
,
"simde__m512i_private is not 32-byte aligned"
);
HEDLEY_STATIC_ASSERT
(
SIMDE_ALIGN_OF
(
simde__m512d
)
==
32
,
"simde__m512d is not 32-byte aligned"
);
HEDLEY_STATIC_ASSERT
(
SIMDE_ALIGN_OF
(
simde__m512d
)
==
32
,
"simde__m512d is not 32-byte aligned"
);
HEDLEY_STATIC_ASSERT
(
SIMDE_ALIGN_OF
(
simde__m512d_private
)
==
32
,
"simde__m512d_private is not 32-byte aligned"
);
HEDLEY_STATIC_ASSERT
(
SIMDE_ALIGN_OF
(
simde__m512d_private
)
==
32
,
"simde__m512d_private is not 32-byte aligned"
);
HEDLEY_STATIC_ASSERT
(
SIMDE_ALIGN_OF
(
simde__m512h
)
==
32
,
"simde__m512h is not 32-byte aligned"
);
HEDLEY_STATIC_ASSERT
(
SIMDE_ALIGN_OF
(
simde__m512h_private
)
==
32
,
"simde__m512h_private is not 32-byte aligned"
);
#endif
#endif
#define SIMDE_MM_CMPINT_EQ 0
#define SIMDE_MM_CMPINT_EQ 0
...
@@ -697,6 +790,22 @@ simde__m512d_to_private(simde__m512d v) {
...
@@ -697,6 +790,22 @@ simde__m512d_to_private(simde__m512d v) {
return
r
;
return
r
;
}
}
SIMDE_FUNCTION_ATTRIBUTES
simde__m512h
simde__m512h_from_private
(
simde__m512h_private
v
)
{
simde__m512h
r
;
simde_memcpy
(
&
r
,
&
v
,
sizeof
(
r
));
return
r
;
}
SIMDE_FUNCTION_ATTRIBUTES
simde__m512h_private
simde__m512h_to_private
(
simde__m512h
v
)
{
simde__m512h_private
r
;
simde_memcpy
(
&
r
,
&
v
,
sizeof
(
r
));
return
r
;
}
SIMDE_END_DECLS_
SIMDE_END_DECLS_
HEDLEY_DIAGNOSTIC_POP
HEDLEY_DIAGNOSTIC_POP
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment