Skip to content

Commit b26b262

Browse files
committed
revert _Py_IS_ALIGNED() to raw checks
1 parent aef4baa commit b26b262

3 files changed

Lines changed: 125 additions & 125 deletions

File tree

Include/cpython/pyatomic.h

Lines changed: 53 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -545,6 +545,59 @@ static inline Py_ssize_t
545545
_Py_atomic_load_ssize_acquire(const Py_ssize_t *obj);
546546

547547

548+
// --- _Py_atomic_memcpy / _Py_atomic_memmove ------------
549+
550+
static inline void *
551+
_Py_atomic_memcpy_ptr_store_relaxed(void *dest, void *src, size_t n)
552+
{
553+
assert(((uintptr_t)dest & (sizeof (void *) - 1)) == 0);
554+
assert(((uintptr_t)src & (sizeof (void *) - 1)) == 0);
555+
assert(n % sizeof(void *) == 0);
556+
557+
if (dest != src) {
558+
void **dest_ = (void **)dest;
559+
void **src_ = (void **)src;
560+
void **end = dest_ + n / sizeof(void *);
561+
562+
for (; dest_ != end; dest_++, src_++) {
563+
_Py_atomic_store_ptr_relaxed(dest_, *src_);
564+
}
565+
}
566+
567+
return dest;
568+
}
569+
570+
static inline void *
571+
_Py_atomic_memmove_ptr_store_relaxed(void *dest, void *src, size_t n)
572+
{
573+
assert(((uintptr_t)dest & (sizeof (void *) - 1)) == 0);
574+
assert(((uintptr_t)src & (sizeof (void *) - 1)) == 0);
575+
assert(n % sizeof(void *) == 0);
576+
577+
if (dest < src || dest >= (void *)((char *)src + n)) {
578+
void **dest_ = (void **)dest;
579+
void **src_ = (void **)src;
580+
void **end = dest_ + n / sizeof(void *);
581+
582+
for (; dest_ != end; dest_++, src_++) {
583+
_Py_atomic_store_ptr_relaxed(dest_, *src_);
584+
}
585+
}
586+
else if (dest > src) {
587+
n = n / sizeof(void *) - 1;
588+
void **dest_ = (void **)dest + n;
589+
void **src_ = (void **)src + n;
590+
void **end = (void **)dest - 1;
591+
592+
for (; dest_ != end; dest_--, src_--) {
593+
_Py_atomic_store_ptr_relaxed(dest_, *src_);
594+
}
595+
}
596+
597+
return dest;
598+
}
599+
600+
548601

549602

550603
// --- _Py_atomic_fence ------------------------------------------------------
@@ -612,56 +665,3 @@ static inline void _Py_atomic_fence_release(void);
612665
#else
613666
# error "long must be 4 or 8 bytes in size"
614667
#endif // SIZEOF_LONG
615-
616-
617-
// --- _Py_atomic_memcpy / _Py_atomic_memmove ------------
618-
619-
static inline void *
620-
_Py_atomic_memcpy_ptr_store_relaxed(void *dest, void *src, size_t n)
621-
{
622-
assert(_Py_IS_ALIGNED(dest, sizeof(void *)));
623-
assert(_Py_IS_ALIGNED(src, sizeof(void *)));
624-
assert(n % sizeof(void *) == 0);
625-
626-
if (dest != src) {
627-
void **dest_ = (void **)dest;
628-
void **src_ = (void **)src;
629-
void **end = dest_ + n / sizeof(void *);
630-
631-
for (; dest_ != end; dest_++, src_++) {
632-
_Py_atomic_store_ptr_relaxed(dest_, *src_);
633-
}
634-
}
635-
636-
return dest;
637-
}
638-
639-
static inline void *
640-
_Py_atomic_memmove_ptr_store_relaxed(void *dest, void *src, size_t n)
641-
{
642-
assert(_Py_IS_ALIGNED(dest, sizeof(void *)));
643-
assert(_Py_IS_ALIGNED(src, sizeof(void *)));
644-
assert(n % sizeof(void *) == 0);
645-
646-
if (dest < src || dest >= (void *)((char *)src + n)) {
647-
void **dest_ = (void **)dest;
648-
void **src_ = (void **)src;
649-
void **end = dest_ + n / sizeof(void *);
650-
651-
for (; dest_ != end; dest_++, src_++) {
652-
_Py_atomic_store_ptr_relaxed(dest_, *src_);
653-
}
654-
}
655-
else if (dest > src) {
656-
n = n / sizeof(void *) - 1;
657-
void **dest_ = (void **)dest + n;
658-
void **src_ = (void **)src + n;
659-
void **end = (void **)dest - 1;
660-
661-
for (; dest_ != end; dest_--, src_--) {
662-
_Py_atomic_store_ptr_relaxed(dest_, *src_);
663-
}
664-
}
665-
666-
return dest;
667-
}

Include/internal/pycore_list.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ _Py_memory_ptrs_repeat(char* dest, Py_ssize_t len_dest, Py_ssize_t len_src)
5959
{
6060
assert(len_src > 0);
6161
assert(len_src % sizeof(void *) == 0);
62-
assert(_Py_IS_ALIGNED(dest, sizeof(void *)));
62+
assert(((uintptr_t)dest & (sizeof (void *) - 1)) == 0);
6363
Py_ssize_t copied = len_src;
6464
while (copied < len_dest) {
6565
Py_ssize_t bytes_to_copy = Py_MIN(copied, len_dest - copied);

Modules/_testcapi/pyatomic.c

Lines changed: 71 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
*/
66

77
#include "parts.h"
8-
// #include "pyconfig.h" // SIZEOF_VOID_P
8+
#include "pyconfig.h" // SIZEOF_VOID_P
99

1010
// We define atomic bitwise operations on these types
1111
#define FOR_BITWISE_TYPES(V) \
@@ -157,77 +157,77 @@ test_atomic_load_store_int_release_acquire(PyObject *self, PyObject *obj) { \
157157
Py_RETURN_NONE;
158158
}
159159

160-
// static PyObject *
161-
// test_atomic_memcpy_ptr_store_relaxed(PyObject *self, PyObject *obj) {
162-
// #if SIZEOF_VOID_P == 8
163-
// #define p0 (void *)0x5555555555555555
164-
// #define p1 (void *)0xaaaaaaaaaaaaaaaa
165-
// #define p2 (void *)0xfedcba9876543210
166-
// #define p3 (void *)0x0123456789abcdef
167-
// #else
168-
// #if SIZEOF_VOID_P == 4
169-
// #define p0 (void *)0x55555555
170-
// #define p1 (void *)0xaaaaaaaa
171-
// #define p2 (void *)0x76543210
172-
// #define p3 (void *)0x01234567
173-
// #else
174-
// #error "unexpected sizeof(void *), expecting 8 or 4"
175-
// #endif
176-
// #endif
177-
// void *src[4] = { (void *)0, p2, p3, (void *)0 };
178-
// void *dst[4] = { p0, (void *)0, (void *)0, p1 };
179-
// assert(_Py_atomic_memcpy_ptr_store_relaxed(&dst[1], &src[1], SIZEOF_VOID_P * 2) == &dst[1]);
180-
// assert(dst[0] == p0);
181-
// assert(dst[1] == p2);
182-
// assert(dst[2] == p3);
183-
// assert(dst[3] == p1);
184-
// Py_RETURN_NONE;
185-
// #undef p3
186-
// #undef p2
187-
// #undef p1
188-
// #undef p0
189-
// }
160+
static PyObject *
161+
test_atomic_memcpy_ptr_store_relaxed(PyObject *self, PyObject *obj) {
162+
#if SIZEOF_VOID_P == 8
163+
#define p0 (void *)0x5555555555555555
164+
#define p1 (void *)0xaaaaaaaaaaaaaaaa
165+
#define p2 (void *)0xfedcba9876543210
166+
#define p3 (void *)0x0123456789abcdef
167+
#else
168+
#if SIZEOF_VOID_P == 4
169+
#define p0 (void *)0x55555555
170+
#define p1 (void *)0xaaaaaaaa
171+
#define p2 (void *)0x76543210
172+
#define p3 (void *)0x01234567
173+
#else
174+
#error "unexpected sizeof(void *), expecting 8 or 4"
175+
#endif
176+
#endif
177+
void *src[4] = { (void *)0, p2, p3, (void *)0 };
178+
void *dst[4] = { p0, (void *)0, (void *)0, p1 };
179+
assert(_Py_atomic_memcpy_ptr_store_relaxed(&dst[1], &src[1], SIZEOF_VOID_P * 2) == &dst[1]);
180+
assert(dst[0] == p0);
181+
assert(dst[1] == p2);
182+
assert(dst[2] == p3);
183+
assert(dst[3] == p1);
184+
Py_RETURN_NONE;
185+
#undef p3
186+
#undef p2
187+
#undef p1
188+
#undef p0
189+
}
190190

191-
// static PyObject *
192-
// test_atomic_memmove_ptr_store_relaxed(PyObject *self, PyObject *obj) {
193-
// #if SIZEOF_VOID_P == 8
194-
// #define p0 (void *)0x5555555555555555
195-
// #define p1 (void *)0xaaaaaaaaaaaaaaaa
196-
// #define p2 (void *)0xfedcba9876543210
197-
// #define p3 (void *)0x0123456789abcdef
198-
// #define p4 (void *)0x0f2d4b6987a5c3e1
199-
// #else
200-
// #if SIZEOF_VOID_P == 4
201-
// #define p0 (void *)0x55555555
202-
// #define p1 (void *)0xaaaaaaaa
203-
// #define p2 (void *)0x76543210
204-
// #define p3 (void *)0x01234567
205-
// #define p4 (void *)0x07254361
206-
// #else
207-
// #error "unexpected sizeof(void *), expecting 8 or 4"
208-
// #endif
209-
// #endif
210-
// void *back[5] = { p0, p2, p3, p4, p1 };
211-
// assert(_Py_atomic_memmove_ptr_store_relaxed(&back[1], &back[2], SIZEOF_VOID_P * 2) == &back[1]);
212-
// assert(back[0] == p0);
213-
// assert(back[1] == p3);
214-
// assert(back[2] == p4);
215-
// assert(back[3] == p4);
216-
// assert(back[4] == p1);
217-
// void *fwd[5] = { p0, p2, p3, p4, p1 };
218-
// assert(_Py_atomic_memmove_ptr_store_relaxed(&fwd[2], &fwd[1], SIZEOF_VOID_P * 2) == &fwd[2]);
219-
// assert(fwd[0] == p0);
220-
// assert(fwd[1] == p2);
221-
// assert(fwd[2] == p2);
222-
// assert(fwd[3] == p3);
223-
// assert(fwd[4] == p1);
224-
// Py_RETURN_NONE;
225-
// #undef p4
226-
// #undef p3
227-
// #undef p2
228-
// #undef p1
229-
// #undef p0
230-
// }
191+
static PyObject *
192+
test_atomic_memmove_ptr_store_relaxed(PyObject *self, PyObject *obj) {
193+
#if SIZEOF_VOID_P == 8
194+
#define p0 (void *)0x5555555555555555
195+
#define p1 (void *)0xaaaaaaaaaaaaaaaa
196+
#define p2 (void *)0xfedcba9876543210
197+
#define p3 (void *)0x0123456789abcdef
198+
#define p4 (void *)0x0f2d4b6987a5c3e1
199+
#else
200+
#if SIZEOF_VOID_P == 4
201+
#define p0 (void *)0x55555555
202+
#define p1 (void *)0xaaaaaaaa
203+
#define p2 (void *)0x76543210
204+
#define p3 (void *)0x01234567
205+
#define p4 (void *)0x07254361
206+
#else
207+
#error "unexpected sizeof(void *), expecting 8 or 4"
208+
#endif
209+
#endif
210+
void *back[5] = { p0, p2, p3, p4, p1 };
211+
assert(_Py_atomic_memmove_ptr_store_relaxed(&back[1], &back[2], SIZEOF_VOID_P * 2) == &back[1]);
212+
assert(back[0] == p0);
213+
assert(back[1] == p3);
214+
assert(back[2] == p4);
215+
assert(back[3] == p4);
216+
assert(back[4] == p1);
217+
void *fwd[5] = { p0, p2, p3, p4, p1 };
218+
assert(_Py_atomic_memmove_ptr_store_relaxed(&fwd[2], &fwd[1], SIZEOF_VOID_P * 2) == &fwd[2]);
219+
assert(fwd[0] == p0);
220+
assert(fwd[1] == p2);
221+
assert(fwd[2] == p2);
222+
assert(fwd[3] == p3);
223+
assert(fwd[4] == p1);
224+
Py_RETURN_NONE;
225+
#undef p4
226+
#undef p3
227+
#undef p2
228+
#undef p1
229+
#undef p0
230+
}
231231

232232
// NOTE: all tests should start with "test_atomic_" to be included
233233
// in test_pyatomic.py

0 commit comments

Comments
 (0)