Skip to content

Commit b810f6f

Browse files
dpaoliellosivadeilra
authored andcommitted
Apply 0029-loadstoreintrinsic.patch
1 parent a11a842 commit b810f6f

File tree

2 files changed

+78
-0
lines changed

2 files changed

+78
-0
lines changed

clang/lib/Headers/arm64_neon.h

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,78 @@
1717

1818
#include <arm_neon.h>
1919

20+
#if defined (__cplusplus)
21+
extern "C" {
22+
#endif
23+
24+
static inline uint8x16_t __iso_volatile_neon_load128(const volatile uint8x16_t *ptr)
25+
{
26+
return *ptr;
27+
}
28+
29+
static inline uint8x16x2_t __iso_volatile_neon_load128_p(const volatile uint8x16x2_t *ptr)
30+
{
31+
uint8x16x2_t result;
32+
__asm__ __volatile__(
33+
"ldp %q0, %q1, %2"
34+
: "=w" (result.val[0]), "=w" (result.val[1])
35+
: "m" (*ptr)
36+
);
37+
return result;
38+
}
39+
40+
static inline uint8x8x2_t __iso_volatile_neon_load64_np(const volatile uint8x8x2_t *ptr) {
41+
uint8x8x2_t result;
42+
__asm__ __volatile__(
43+
"ldnp %d0, %d1, %2"
44+
: "=w" (result.val[0]), "=w" (result.val[1])
45+
: "m" (*ptr)
46+
);
47+
return result;
48+
}
49+
50+
static inline uint8x16x2_t __iso_volatile_neon_load128_np(const volatile uint8x16x2_t *ptr) {
51+
uint8x16x2_t result;
52+
__asm__ __volatile__(
53+
"ldnp %q0, %q1, %2"
54+
: "=w" (result.val[0]), "=w" (result.val[1])
55+
: "m" (*ptr)
56+
);
57+
return result;
58+
}
59+
60+
static inline void __iso_volatile_neon_store128(volatile uint8x16_t *p, uint8x16_t val)
61+
{
62+
*p = val;
63+
}
64+
65+
static inline void __iso_volatile_neon_store128_p(volatile uint8x16x2_t *ptr, uint8x16x2_t data) {
66+
__asm__ __volatile__(
67+
"stp %q[i1], %q[i2], %[out]"
68+
: [out] "=m" (*ptr)
69+
: [i1]"w" (data.val[0]), [i2]"w" (data.val[1])
70+
);
71+
}
72+
73+
static inline void __iso_volatile_neon_store64_np(volatile uint8x8x2_t *ptr, uint8x8x2_t data) {
74+
__asm__ __volatile__(
75+
"stnp %d[i1], %d[i2], %[out]"
76+
: [out] "=m" (*ptr)
77+
: [i1]"w" (data.val[0]), [i2]"w" (data.val[1])
78+
);
79+
}
80+
81+
static inline void __iso_volatile_neon_store128_np(volatile uint8x16x2_t *ptr, uint8x16x2_t data) {
82+
__asm__ __volatile__(
83+
"stnp %q[i1], %q[i2], %[out]"
84+
: [out] "=m" (*ptr)
85+
: [i1]"w" (data.val[0]), [i2]"w" (data.val[1])
86+
);
87+
}
88+
89+
#if defined (__cplusplus)
90+
}
91+
#endif
92+
2093
#endif /* __ARM64_NEON_H */
2194
#endif /* _MSC_VER */

clang/lib/Headers/immintrin.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -692,6 +692,11 @@ _InterlockedCompareExchange64_HLERelease(__int64 volatile *_Destination,
692692
: "r" (_Exchange) : "memory");
693693
return _Comparand;
694694
}
695+
696+
static __inline void __iso_volatile_ia_nt_store128(volatile __m128i* _Destination, __m128i _Value) {
697+
__builtin_nontemporal_store(_Value, _Destination);
698+
}
699+
695700
#endif
696701
#ifdef __cplusplus
697702
}

0 commit comments

Comments
 (0)