2 * This file is subject to the terms and conditions of the GNU General Public
3 * License. See the file "COPYING" in the main directory of this archive
6 * Copyright (C) 1996, 1999, 2000 by Ralf Baechle
7 * Copyright (C) 1999, 2000 Silicon Graphics, Inc.
9 #ifndef _ASM_UNALIGNED_H
10 #define _ASM_UNALIGNED_H
12 extern void __get_unaligned_bad_length(void);
13 extern void __put_unaligned_bad_length(void);
16 * Load quad unaligned.
18 extern inline unsigned long __ldq_u(const unsigned long * __addr
)
30 * Load long unaligned.
32 extern inline unsigned long __ldl_u(const unsigned int * __addr
)
44 * Load word unaligned.
46 extern inline unsigned long __ldw_u(const unsigned short * __addr
)
58 * Store quad ununaligned.
60 extern inline void __stq_u(unsigned long __val
, unsigned long * __addr
)
68 * Store long ununaligned.
70 extern inline void __stl_u(unsigned long __val
, unsigned int * __addr
)
78 * Store word ununaligned.
80 extern inline void __stw_u(unsigned long __val
, unsigned short * __addr
)
88 * The main single-value unaligned transfer routines.
90 #define get_unaligned(ptr) \
92 __typeof__(*(ptr)) __val; \
94 switch (sizeof(*(ptr))) { \
96 __val = *(const unsigned char *)(ptr); \
99 __val = __ldw_u((const unsigned short *)(ptr)); \
102 __val = __ldl_u((const unsigned int *)(ptr)); \
105 __val = __ldq_u((const unsigned long long *)(ptr)); \
108 __get_unaligned_bad_length(); \
115 #define put_unaligned(val,ptr) \
117 switch (sizeof(*(ptr))) { \
119 *(unsigned char *)(ptr) = (val); \
122 __stw_u((val), (unsigned short *)(ptr)); \
125 __stl_u((val), (unsigned int *)(ptr)); \
128 __stq_u((val), (unsigned long long *)(ptr)); \
131 __put_unaligned_bad_length(); \
136 #endif /* _ASM_UNALIGNED_H */