3 * This file is subject to the terms and conditions of the GNU General Public
4 * License. See the file "COPYING" in the main directory of this archive
7 * Copyright (C) 1996, 1999 by Ralf Baechle
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 long * __addr
)
20 unsigned long long __res
;
22 __asm__("uld\t%0,(%1)"
30 * Load long unaligned.
32 extern __inline__
unsigned long ldl_u(const unsigned int * __addr
)
36 __asm__("ulw\t%0,(%1)"
44 * Load word unaligned.
46 extern __inline__
unsigned long ldw_u(const unsigned short * __addr
)
50 __asm__("ulh\t%0,(%1)"
58 * Store quad ununaligned.
60 extern __inline__
void stq_u(unsigned long __val
, unsigned long long * __addr
)
70 * Store long ununaligned.
72 extern __inline__
void stl_u(unsigned long __val
, unsigned int * __addr
)
82 * Store word ununaligned.
84 extern __inline__
void stw_u(unsigned long __val
, unsigned short * __addr
)
93 extern inline unsigned long __get_unaligned(const void *ptr
, size_t size
)
98 val
= *(const unsigned char *)ptr
;
101 val
= ldw_u((const unsigned short *)ptr
);
104 val
= ldl_u((const unsigned int *)ptr
);
107 val
= ldq_u((const unsigned long long *)ptr
);
110 __get_unaligned_bad_length();
116 extern inline void __put_unaligned(unsigned long val
, void *ptr
, size_t size
)
120 *(unsigned char *)ptr
= (val
);
123 stw_u(val
, (unsigned short *)ptr
);
126 stl_u(val
, (unsigned int *)ptr
);
129 stq_u(val
, (unsigned long long *)ptr
);
132 __put_unaligned_bad_length();
138 * The main single-value unaligned transfer routines.
140 #define get_unaligned(ptr) \
141 ((__typeof__(*(ptr)))__get_unaligned((ptr), sizeof(*(ptr))))
142 #define put_unaligned(x,ptr) \
143 __put_unaligned((unsigned long)(x), (ptr), sizeof(*(ptr)))
145 #endif /* _ASM_UNALIGNED_H */