2 void glue(do_lsw
, MEMSUFFIX
) (int dst
);
3 void glue(do_stsw
, MEMSUFFIX
) (int src
);
5 static inline uint16_t glue(ld16r
, MEMSUFFIX
) (target_ulong EA
)
7 uint16_t tmp
= glue(lduw
, MEMSUFFIX
)(EA
);
8 return ((tmp
& 0xFF00) >> 8) | ((tmp
& 0x00FF) << 8);
11 static inline uint32_t glue(ld32r
, MEMSUFFIX
) (target_ulong EA
)
13 uint32_t tmp
= glue(ldl
, MEMSUFFIX
)(EA
);
14 return ((tmp
& 0xFF000000) >> 24) | ((tmp
& 0x00FF0000) >> 8) |
15 ((tmp
& 0x0000FF00) << 8) | ((tmp
& 0x000000FF) << 24);
18 static inline void glue(st16r
, MEMSUFFIX
) (target_ulong EA
, uint16_t data
)
20 uint16_t tmp
= ((data
& 0xFF00) >> 8) | ((data
& 0x00FF) << 8);
21 glue(stw
, MEMSUFFIX
)(EA
, tmp
);
24 static inline void glue(st32r
, MEMSUFFIX
) (target_ulong EA
, uint32_t data
)
26 uint32_t tmp
= ((data
& 0xFF000000) >> 24) | ((data
& 0x00FF0000) >> 8) |
27 ((data
& 0x0000FF00) << 8) | ((data
& 0x000000FF) << 24);
28 glue(stl
, MEMSUFFIX
)(EA
, tmp
);
31 /*** Integer load ***/
32 #define PPC_LD_OP(name, op) \
33 PPC_OP(glue(glue(l, name), MEMSUFFIX)) \
35 T1 = glue(op, MEMSUFFIX)(T0); \
39 #define PPC_ST_OP(name, op) \
40 PPC_OP(glue(glue(st, name), MEMSUFFIX)) \
42 glue(op, MEMSUFFIX)(T0, T1); \
51 /*** Integer store ***/
56 /*** Integer load and store with byte reverse ***/
57 PPC_LD_OP(hbr
, ld16r
);
58 PPC_LD_OP(wbr
, ld32r
);
59 PPC_ST_OP(hbr
, st16r
);
60 PPC_ST_OP(wbr
, st32r
);
62 /*** Integer load and store multiple ***/
63 PPC_OP(glue(lmw
, MEMSUFFIX
))
67 for (; dst
< 32; dst
++, T0
+= 4) {
68 ugpr(dst
) = glue(ldl
, MEMSUFFIX
)(T0
);
73 PPC_OP(glue(stmw
, MEMSUFFIX
))
77 for (; src
< 32; src
++, T0
+= 4) {
78 glue(stl
, MEMSUFFIX
)(T0
, ugpr(src
));
83 /*** Integer load and store strings ***/
84 PPC_OP(glue(lswi
, MEMSUFFIX
))
86 glue(do_lsw
, MEMSUFFIX
)(PARAM(1));
90 /* PPC32 specification says we must generate an exception if
91 * rA is in the range of registers to be loaded.
92 * In an other hand, IBM says this is valid, but rA won't be loaded.
93 * For now, I'll follow the spec...
95 PPC_OP(glue(lswx
, MEMSUFFIX
))
98 if ((PARAM(1) < PARAM(2) && (PARAM(1) + T1
) > PARAM(2)) ||
99 (PARAM(1) < PARAM(3) && (PARAM(1) + T1
) > PARAM(3))) {
100 do_raise_exception_err(EXCP_PROGRAM
, EXCP_INVAL
| EXCP_INVAL_LSWX
);
102 glue(do_lsw
, MEMSUFFIX
)(PARAM(1));
108 PPC_OP(glue(stsw
, MEMSUFFIX
))
110 glue(do_stsw
, MEMSUFFIX
)(PARAM(1));
114 /*** Floating-point store ***/
115 #define PPC_STF_OP(name, op) \
116 PPC_OP(glue(glue(st, name), MEMSUFFIX)) \
118 glue(op, MEMSUFFIX)(T0, FT1); \
122 PPC_STF_OP(fd
, stfq
);
123 PPC_STF_OP(fs
, stfl
);
125 /*** Floating-point load ***/
126 #define PPC_LDF_OP(name, op) \
127 PPC_OP(glue(glue(l, name), MEMSUFFIX)) \
129 FT1 = glue(op, MEMSUFFIX)(T0); \
133 PPC_LDF_OP(fd
, ldfq
);
134 PPC_LDF_OP(fs
, ldfl
);
136 /* Load and set reservation */
137 PPC_OP(glue(lwarx
, MEMSUFFIX
))
140 do_raise_exception(EXCP_ALIGN
);
142 T1
= glue(ldl
, MEMSUFFIX
)(T0
);
148 /* Store with reservation */
149 PPC_OP(glue(stwcx
, MEMSUFFIX
))
152 do_raise_exception(EXCP_ALIGN
);
154 if (regs
->reserve
!= T0
) {
155 env
->crf
[0] = xer_ov
;
157 glue(stl
, MEMSUFFIX
)(T0
, T1
);
158 env
->crf
[0] = xer_ov
| 0x02;
165 PPC_OP(glue(dcbz
, MEMSUFFIX
))
167 glue(stl
, MEMSUFFIX
)(T0
+ 0x00, 0);
168 glue(stl
, MEMSUFFIX
)(T0
+ 0x04, 0);
169 glue(stl
, MEMSUFFIX
)(T0
+ 0x08, 0);
170 glue(stl
, MEMSUFFIX
)(T0
+ 0x0C, 0);
171 glue(stl
, MEMSUFFIX
)(T0
+ 0x10, 0);
172 glue(stl
, MEMSUFFIX
)(T0
+ 0x14, 0);
173 glue(stl
, MEMSUFFIX
)(T0
+ 0x18, 0);
174 glue(stl
, MEMSUFFIX
)(T0
+ 0x1C, 0);
178 /* External access */
179 PPC_OP(glue(eciwx
, MEMSUFFIX
))
181 T1
= glue(ldl
, MEMSUFFIX
)(T0
);
185 PPC_OP(glue(ecowx
, MEMSUFFIX
))
187 glue(stl
, MEMSUFFIX
)(T0
, T1
);