2 * Inline functions to do unaligned accesses.
4 * This file is subject to the terms and conditions of the GNU General Public
5 * License. See the file "COPYING" in the main directory of this archive
8 * Copyright (C) 1996 by Ralf Baechle
10 #ifndef __ASM_MIPS_UNALIGNED_H
11 #define __ASM_MIPS_UNALIGNED_H
13 #include <asm/string.h>
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
);
113 extern inline void __put_unaligned(unsigned long val
, void *ptr
, size_t size
)
117 *(unsigned char *)ptr
= (val
);
120 stw_u(val
, (unsigned short *)ptr
);
123 stl_u(val
, (unsigned int *)ptr
);
126 stq_u(val
, (unsigned long long *)ptr
);
132 * The main single-value unaligned transfer routines.
134 #define get_unaligned(ptr) \
135 ((__typeof__(*(ptr)))__get_unaligned((ptr), sizeof(*(ptr))))
136 #define put_unaligned(x,ptr) \
137 __put_unaligned((unsigned long)(x), (ptr), sizeof(*(ptr)))
139 #endif /* __ASM_MIPS_UNALIGNED_H */