xref: /qemu/target/arm/tcg/arm_ldst.h (revision f7478a92dd9ee2276bfaa5b7317140d3f9d6a53b)
11d854765SPaolo Bonzini /*
21d854765SPaolo Bonzini  * ARM load/store instructions for code (armeb-user support)
31d854765SPaolo Bonzini  *
41d854765SPaolo Bonzini  *  Copyright (c) 2012 CodeSourcery, LLC
51d854765SPaolo Bonzini  *
61d854765SPaolo Bonzini  * This library is free software; you can redistribute it and/or
71d854765SPaolo Bonzini  * modify it under the terms of the GNU Lesser General Public
81d854765SPaolo Bonzini  * License as published by the Free Software Foundation; either
91d854765SPaolo Bonzini  * version 2 of the License, or (at your option) any later version.
101d854765SPaolo Bonzini  *
111d854765SPaolo Bonzini  * This library is distributed in the hope that it will be useful,
121d854765SPaolo Bonzini  * but WITHOUT ANY WARRANTY; without even the implied warranty of
131d854765SPaolo Bonzini  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
141d854765SPaolo Bonzini  * Lesser General Public License for more details.
151d854765SPaolo Bonzini  *
161d854765SPaolo Bonzini  * You should have received a copy of the GNU Lesser General Public
171d854765SPaolo Bonzini  * License along with this library; if not, see <http://www.gnu.org/licenses/>.
181d854765SPaolo Bonzini  */
191d854765SPaolo Bonzini 
201d854765SPaolo Bonzini #ifndef ARM_LDST_H
211d854765SPaolo Bonzini #define ARM_LDST_H
221d854765SPaolo Bonzini 
2363c91552SPaolo Bonzini #include "exec/exec-all.h"
24f08b6170SPaolo Bonzini #include "exec/cpu_ldst.h"
251d854765SPaolo Bonzini #include "qemu/bswap.h"
261d854765SPaolo Bonzini 
271d854765SPaolo Bonzini /* Load an instruction and return it in the standard little-endian order */
281d854765SPaolo Bonzini static inline uint32_t arm_ldl_code(CPUARMState *env, target_ulong addr,
29f9fd40ebSPaolo Bonzini                                     bool sctlr_b)
301d854765SPaolo Bonzini {
311d854765SPaolo Bonzini     uint32_t insn = cpu_ldl_code(env, addr);
32f9fd40ebSPaolo Bonzini     if (bswap_code(sctlr_b)) {
331d854765SPaolo Bonzini         return bswap32(insn);
341d854765SPaolo Bonzini     }
351d854765SPaolo Bonzini     return insn;
361d854765SPaolo Bonzini }
371d854765SPaolo Bonzini 
381d854765SPaolo Bonzini /* Ditto, for a halfword (Thumb) instruction */
391d854765SPaolo Bonzini static inline uint16_t arm_lduw_code(CPUARMState *env, target_ulong addr,
40f9fd40ebSPaolo Bonzini                                      bool sctlr_b)
411d854765SPaolo Bonzini {
42f7478a92SJulian Brown     uint16_t insn;
43f7478a92SJulian Brown #ifndef CONFIG_USER_ONLY
44f7478a92SJulian Brown     /* In big-endian (BE32) mode, adjacent Thumb instructions have been swapped
45f7478a92SJulian Brown        within each word.  Undo that now.  */
46f7478a92SJulian Brown     if (sctlr_b) {
47f7478a92SJulian Brown         addr ^= 2;
48f7478a92SJulian Brown     }
49f7478a92SJulian Brown #endif
50f7478a92SJulian Brown     insn = cpu_lduw_code(env, addr);
51f9fd40ebSPaolo Bonzini     if (bswap_code(sctlr_b)) {
521d854765SPaolo Bonzini         return bswap16(insn);
531d854765SPaolo Bonzini     }
541d854765SPaolo Bonzini     return insn;
551d854765SPaolo Bonzini }
561d854765SPaolo Bonzini 
571d854765SPaolo Bonzini #endif
58