1// vi:set ft=cpp: -*- Mode: C++ -*- 2/* SPDX-License-Identifier: GPL-2.0-only or License-Ref-kk-custom */ 3/* 4 * Copyright (C) 2013 Technische Universität Dresden. 5 */ 6 7#pragma once 8 9namespace cxx { 10 11template< typename T > 12T access_once(T const *a) 13{ 14#if 1 15 __asm__ __volatile__ ( "" : "=m"(*const_cast<T*>(a))); 16 T tmp = *a; 17 __asm__ __volatile__ ( "" : "=m"(*const_cast<T*>(a))); 18 return tmp; 19#else 20 return *static_cast<T const volatile *>(a); 21#endif 22} 23 24template< typename T > 25void write_now(T *a, T const &val) 26{ 27 __asm__ __volatile__ ( "" : "=m"(*a)); 28 *a = val; 29 __asm__ __volatile__ ( "" : : "m"(*a)); 30} 31 32 33} 34 35