xref: /netbsd-src/tests/lib/libc/atomic/t___sync_and.c (revision 4229f721ac6c258f9d43e71cdf53ac0028b32d31)
1*4229f721Sisaki /*	$NetBSD: t___sync_and.c,v 1.3 2019/03/01 05:39:01 isaki Exp $	*/
28116c33cSisaki 
38116c33cSisaki /*
48116c33cSisaki  * Copyright (C) 2019 Tetsuya Isaki. All rights reserved.
58116c33cSisaki  *
68116c33cSisaki  * Redistribution and use in source and binary forms, with or without
78116c33cSisaki  * modification, are permitted provided that the following conditions
88116c33cSisaki  * are met:
98116c33cSisaki  * 1. Redistributions of source code must retain the above copyright
108116c33cSisaki  *    notice, this list of conditions and the following disclaimer.
118116c33cSisaki  * 2. Redistributions in binary form must reproduce the above copyright
128116c33cSisaki  *    notice, this list of conditions and the following disclaimer in the
138116c33cSisaki  *    documentation and/or other materials provided with the distribution.
148116c33cSisaki  *
158116c33cSisaki  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
168116c33cSisaki  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
178116c33cSisaki  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
188116c33cSisaki  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
198116c33cSisaki  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
208116c33cSisaki  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
218116c33cSisaki  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
228116c33cSisaki  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
238116c33cSisaki  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
248116c33cSisaki  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
258116c33cSisaki  * SUCH DAMAGE.
268116c33cSisaki  */
278116c33cSisaki 
288116c33cSisaki #include <sys/cdefs.h>
29*4229f721Sisaki __RCSID("$NetBSD: t___sync_and.c,v 1.3 2019/03/01 05:39:01 isaki Exp $");
308116c33cSisaki 
318116c33cSisaki #include <atf-c.h>
328116c33cSisaki #include <inttypes.h>
338116c33cSisaki #include <machine/types.h>	// for __HAVE_ATOMIC64_OPS
348116c33cSisaki 
358116c33cSisaki /*
368116c33cSisaki  * These tests don't examine the atomicity.
378116c33cSisaki  */
388116c33cSisaki 
398116c33cSisaki /* XXX
408116c33cSisaki  * Depending on a combination of arch and compiler, __sync_* is
418116c33cSisaki  * implemented as compiler's builtin function.  In that case, even
428116c33cSisaki  * if libc exports the function symbol, it is not used.  As a result
438116c33cSisaki  * this tests will examine compiler's builtin functions.
448116c33cSisaki  * It's better to run only when target is actually in libc.
458116c33cSisaki  */
468116c33cSisaki 
478116c33cSisaki #define DST    (0x1122334455667788UL)
488116c33cSisaki #define SRC    (0xf0f0f0f0f0f0f0f0UL)
498116c33cSisaki #define EXPECT (0x1020304050607080UL)
508116c33cSisaki 
518116c33cSisaki #define atf_sync_prefetch(NAME, TYPE, FMT) \
528116c33cSisaki ATF_TC(NAME); \
538116c33cSisaki ATF_TC_HEAD(NAME, tc) \
548116c33cSisaki { \
558116c33cSisaki 	atf_tc_set_md_var(tc, "descr", #NAME); \
568116c33cSisaki } \
578116c33cSisaki ATF_TC_BODY(NAME, tc) \
588116c33cSisaki { \
598116c33cSisaki 	volatile TYPE val; \
608116c33cSisaki 	TYPE src; \
618116c33cSisaki 	TYPE res; \
628116c33cSisaki 	TYPE expval; \
638116c33cSisaki 	TYPE expres; \
648116c33cSisaki 	val = (TYPE)DST; \
658116c33cSisaki 	src = (TYPE)SRC; \
668116c33cSisaki 	expval = (TYPE)EXPECT; \
678116c33cSisaki 	expres = (TYPE)DST; \
688116c33cSisaki 	res = NAME(&val, src); \
698116c33cSisaki 	ATF_REQUIRE_MSG(val == expval, \
708116c33cSisaki 	    "val expects 0x%" FMT " but 0x%" FMT, expval, val); \
718116c33cSisaki 	ATF_REQUIRE_MSG(res == expres, \
728116c33cSisaki 	    "res expects 0x%" FMT " but 0x%" FMT, expres, res); \
738116c33cSisaki }
748116c33cSisaki 
758116c33cSisaki atf_sync_prefetch(__sync_fetch_and_and_1, uint8_t,  PRIx8);
768116c33cSisaki atf_sync_prefetch(__sync_fetch_and_and_2, uint16_t, PRIx16);
778116c33cSisaki atf_sync_prefetch(__sync_fetch_and_and_4, uint32_t, PRIx32);
788116c33cSisaki #if defined(__HAVE_ATOMIC64_OPS)
798116c33cSisaki atf_sync_prefetch(__sync_fetch_and_and_8, uint64_t, PRIx64);
808116c33cSisaki #endif
818116c33cSisaki 
828116c33cSisaki #define atf_sync_postfetch(NAME, TYPE, FMT) \
838116c33cSisaki ATF_TC(NAME); \
848116c33cSisaki ATF_TC_HEAD(NAME, tc) \
858116c33cSisaki { \
868116c33cSisaki 	atf_tc_set_md_var(tc, "descr", #NAME); \
878116c33cSisaki } \
888116c33cSisaki ATF_TC_BODY(NAME, tc) \
898116c33cSisaki { \
908116c33cSisaki 	volatile TYPE val; \
918116c33cSisaki 	TYPE src; \
928116c33cSisaki 	TYPE res; \
938116c33cSisaki 	TYPE exp; \
948116c33cSisaki 	val = (TYPE)DST; \
958116c33cSisaki 	src = (TYPE)SRC; \
968116c33cSisaki 	exp = (TYPE)EXPECT; \
978116c33cSisaki 	res = NAME(&val, src); \
988116c33cSisaki 	ATF_REQUIRE_MSG(val == exp, \
998116c33cSisaki 	    "val expects 0x%" FMT " but 0x%" FMT, exp, val); \
1008116c33cSisaki 	ATF_REQUIRE_MSG(res == exp, \
1018116c33cSisaki 	    "res expects 0x%" FMT " but 0x%" FMT, exp, res); \
1028116c33cSisaki }
1038116c33cSisaki 
1048116c33cSisaki atf_sync_postfetch(__sync_and_and_fetch_1, uint8_t,  PRIx8);
1058116c33cSisaki atf_sync_postfetch(__sync_and_and_fetch_2, uint16_t, PRIx16);
1068116c33cSisaki atf_sync_postfetch(__sync_and_and_fetch_4, uint32_t, PRIx32);
1078116c33cSisaki #ifdef __HAVE_ATOMIC64_OPS
1088116c33cSisaki atf_sync_postfetch(__sync_and_and_fetch_8, uint64_t, PRIx64);
1098116c33cSisaki #endif
1108116c33cSisaki 
ATF_TP_ADD_TCS(tp)1118116c33cSisaki ATF_TP_ADD_TCS(tp)
1128116c33cSisaki {
1138116c33cSisaki 	ATF_TP_ADD_TC(tp, __sync_fetch_and_and_1);
1148116c33cSisaki 	ATF_TP_ADD_TC(tp, __sync_fetch_and_and_2);
1158116c33cSisaki 	ATF_TP_ADD_TC(tp, __sync_fetch_and_and_4);
1168116c33cSisaki #ifdef __HAVE_ATOMIC64_OPS
1178116c33cSisaki 	ATF_TP_ADD_TC(tp, __sync_fetch_and_and_8);
1188116c33cSisaki #endif
1198116c33cSisaki 
1208116c33cSisaki 	ATF_TP_ADD_TC(tp, __sync_and_and_fetch_1);
1218116c33cSisaki 	ATF_TP_ADD_TC(tp, __sync_and_and_fetch_2);
1228116c33cSisaki 	ATF_TP_ADD_TC(tp, __sync_and_and_fetch_4);
1238116c33cSisaki #ifdef __HAVE_ATOMIC64_OPS
1248116c33cSisaki 	ATF_TP_ADD_TC(tp, __sync_and_and_fetch_8);
1258116c33cSisaki #endif
1268116c33cSisaki 
1278116c33cSisaki 	return atf_no_error();
1288116c33cSisaki }
129