17c2aad20Sopenharmony_ci/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */
27c2aad20Sopenharmony_ci
37c2aad20Sopenharmony_ci#ifndef __LINUX_COMPILER_H
47c2aad20Sopenharmony_ci#define __LINUX_COMPILER_H
57c2aad20Sopenharmony_ci
67c2aad20Sopenharmony_ci#define likely(x)		__builtin_expect(!!(x), 1)
77c2aad20Sopenharmony_ci#define unlikely(x)		__builtin_expect(!!(x), 0)
87c2aad20Sopenharmony_ci
97c2aad20Sopenharmony_ci#define READ_ONCE(x)		(*(volatile typeof(x) *)&x)
107c2aad20Sopenharmony_ci#define WRITE_ONCE(x, v)	(*(volatile typeof(x) *)&x) = (v)
117c2aad20Sopenharmony_ci
127c2aad20Sopenharmony_ci#define barrier()		asm volatile("" ::: "memory")
137c2aad20Sopenharmony_ci
147c2aad20Sopenharmony_ci#if defined(__x86_64__)
157c2aad20Sopenharmony_ci
167c2aad20Sopenharmony_ci# define smp_rmb()		barrier()
177c2aad20Sopenharmony_ci# define smp_wmb()		barrier()
187c2aad20Sopenharmony_ci# define smp_mb()		asm volatile("lock; addl $0,-132(%%rsp)" ::: "memory", "cc")
197c2aad20Sopenharmony_ci
207c2aad20Sopenharmony_ci# define smp_store_release(p, v)		\
217c2aad20Sopenharmony_cido {						\
227c2aad20Sopenharmony_ci	barrier();				\
237c2aad20Sopenharmony_ci	WRITE_ONCE(*p, v);			\
247c2aad20Sopenharmony_ci} while (0)
257c2aad20Sopenharmony_ci
267c2aad20Sopenharmony_ci# define smp_load_acquire(p)			\
277c2aad20Sopenharmony_ci({						\
287c2aad20Sopenharmony_ci	typeof(*p) ___p = READ_ONCE(*p);	\
297c2aad20Sopenharmony_ci	barrier();				\
307c2aad20Sopenharmony_ci	___p;					\
317c2aad20Sopenharmony_ci})
327c2aad20Sopenharmony_ci
337c2aad20Sopenharmony_ci#elif defined(__aarch64__)
347c2aad20Sopenharmony_ci
357c2aad20Sopenharmony_ci# define smp_rmb()		asm volatile("dmb ishld" ::: "memory")
367c2aad20Sopenharmony_ci# define smp_wmb()		asm volatile("dmb ishst" ::: "memory")
377c2aad20Sopenharmony_ci# define smp_mb()		asm volatile("dmb ish" ::: "memory")
387c2aad20Sopenharmony_ci
397c2aad20Sopenharmony_ci#endif
407c2aad20Sopenharmony_ci
417c2aad20Sopenharmony_ci#ifndef smp_mb
427c2aad20Sopenharmony_ci# define smp_mb()		__sync_synchronize()
437c2aad20Sopenharmony_ci#endif
447c2aad20Sopenharmony_ci
457c2aad20Sopenharmony_ci#ifndef smp_rmb
467c2aad20Sopenharmony_ci# define smp_rmb()		smp_mb()
477c2aad20Sopenharmony_ci#endif
487c2aad20Sopenharmony_ci
497c2aad20Sopenharmony_ci#ifndef smp_wmb
507c2aad20Sopenharmony_ci# define smp_wmb()		smp_mb()
517c2aad20Sopenharmony_ci#endif
527c2aad20Sopenharmony_ci
537c2aad20Sopenharmony_ci#ifndef smp_store_release
547c2aad20Sopenharmony_ci# define smp_store_release(p, v)		\
557c2aad20Sopenharmony_cido {						\
567c2aad20Sopenharmony_ci	smp_mb();				\
577c2aad20Sopenharmony_ci	WRITE_ONCE(*p, v);			\
587c2aad20Sopenharmony_ci} while (0)
597c2aad20Sopenharmony_ci#endif
607c2aad20Sopenharmony_ci
617c2aad20Sopenharmony_ci#ifndef smp_load_acquire
627c2aad20Sopenharmony_ci# define smp_load_acquire(p)			\
637c2aad20Sopenharmony_ci({						\
647c2aad20Sopenharmony_ci	typeof(*p) ___p = READ_ONCE(*p);	\
657c2aad20Sopenharmony_ci	smp_mb();				\
667c2aad20Sopenharmony_ci	___p;					\
677c2aad20Sopenharmony_ci})
687c2aad20Sopenharmony_ci#endif
697c2aad20Sopenharmony_ci
707c2aad20Sopenharmony_ci#endif /* __LINUX_COMPILER_H */
71