Commit 28b6751f30603a4c7146282fde9efcf8b5f31f7b
1 parent
79aceca5
suppressed use of gen_multi - use intermediate FT0 register for floats - use T0 …
…temporary for fpscr update - use PARAM1 for spr access - added untested single load/store support git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@473 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
5 changed files
with
385 additions
and
227 deletions
target-ppc/cpu.h
target-ppc/op.c
| ... | ... | @@ -22,20 +22,110 @@ |
| 22 | 22 | #include "exec.h" |
| 23 | 23 | |
| 24 | 24 | #define regs (env) |
| 25 | -extern uint32_t __a; | |
| 26 | -extern uint32_t __b; | |
| 27 | -extern uint32_t __c; | |
| 28 | -extern uint32_t __d; | |
| 29 | -extern uint32_t __e; | |
| 30 | -extern uint32_t __f; | |
| 31 | 25 | #define Ts0 (int32_t)T0 |
| 32 | 26 | #define Ts1 (int32_t)T1 |
| 33 | 27 | #define Ts2 (int32_t)T2 |
| 34 | 28 | |
| 35 | -#include "op-multi.c" | |
| 29 | +#define FT0 (env->ft0) | |
| 36 | 30 | |
| 37 | 31 | #define PPC_OP(name) void op_##name(void) |
| 38 | 32 | |
| 33 | +#define REG 0 | |
| 34 | +#include "op_template.h" | |
| 35 | + | |
| 36 | +#define REG 1 | |
| 37 | +#include "op_template.h" | |
| 38 | + | |
| 39 | +#define REG 2 | |
| 40 | +#include "op_template.h" | |
| 41 | + | |
| 42 | +#define REG 3 | |
| 43 | +#include "op_template.h" | |
| 44 | + | |
| 45 | +#define REG 4 | |
| 46 | +#include "op_template.h" | |
| 47 | + | |
| 48 | +#define REG 5 | |
| 49 | +#include "op_template.h" | |
| 50 | + | |
| 51 | +#define REG 6 | |
| 52 | +#include "op_template.h" | |
| 53 | + | |
| 54 | +#define REG 7 | |
| 55 | +#include "op_template.h" | |
| 56 | + | |
| 57 | +#define REG 8 | |
| 58 | +#include "op_template.h" | |
| 59 | + | |
| 60 | +#define REG 9 | |
| 61 | +#include "op_template.h" | |
| 62 | + | |
| 63 | +#define REG 10 | |
| 64 | +#include "op_template.h" | |
| 65 | + | |
| 66 | +#define REG 11 | |
| 67 | +#include "op_template.h" | |
| 68 | + | |
| 69 | +#define REG 12 | |
| 70 | +#include "op_template.h" | |
| 71 | + | |
| 72 | +#define REG 13 | |
| 73 | +#include "op_template.h" | |
| 74 | + | |
| 75 | +#define REG 14 | |
| 76 | +#include "op_template.h" | |
| 77 | + | |
| 78 | +#define REG 15 | |
| 79 | +#include "op_template.h" | |
| 80 | + | |
| 81 | +#define REG 16 | |
| 82 | +#include "op_template.h" | |
| 83 | + | |
| 84 | +#define REG 17 | |
| 85 | +#include "op_template.h" | |
| 86 | + | |
| 87 | +#define REG 18 | |
| 88 | +#include "op_template.h" | |
| 89 | + | |
| 90 | +#define REG 19 | |
| 91 | +#include "op_template.h" | |
| 92 | + | |
| 93 | +#define REG 20 | |
| 94 | +#include "op_template.h" | |
| 95 | + | |
| 96 | +#define REG 21 | |
| 97 | +#include "op_template.h" | |
| 98 | + | |
| 99 | +#define REG 22 | |
| 100 | +#include "op_template.h" | |
| 101 | + | |
| 102 | +#define REG 23 | |
| 103 | +#include "op_template.h" | |
| 104 | + | |
| 105 | +#define REG 24 | |
| 106 | +#include "op_template.h" | |
| 107 | + | |
| 108 | +#define REG 25 | |
| 109 | +#include "op_template.h" | |
| 110 | + | |
| 111 | +#define REG 26 | |
| 112 | +#include "op_template.h" | |
| 113 | + | |
| 114 | +#define REG 27 | |
| 115 | +#include "op_template.h" | |
| 116 | + | |
| 117 | +#define REG 28 | |
| 118 | +#include "op_template.h" | |
| 119 | + | |
| 120 | +#define REG 29 | |
| 121 | +#include "op_template.h" | |
| 122 | + | |
| 123 | +#define REG 30 | |
| 124 | +#include "op_template.h" | |
| 125 | + | |
| 126 | +#define REG 31 | |
| 127 | +#include "op_template.h" | |
| 128 | + | |
| 39 | 129 | /* PPC state maintenance operations */ |
| 40 | 130 | /* set_Rc0 */ |
| 41 | 131 | PPC_OP(set_Rc0) |
| ... | ... | @@ -1114,3 +1204,135 @@ PPC_OP(stswx) |
| 1114 | 1204 | do_stsw(PARAM(1), T0, T1 + T2); |
| 1115 | 1205 | RETURN(); |
| 1116 | 1206 | } |
| 1207 | + | |
| 1208 | +/* SPR */ | |
| 1209 | +PPC_OP(load_spr) | |
| 1210 | +{ | |
| 1211 | + T0 = regs->spr[PARAM(1)]; | |
| 1212 | +} | |
| 1213 | + | |
| 1214 | +PPC_OP(store_spr) | |
| 1215 | +{ | |
| 1216 | + regs->spr[PARAM(1)] = T0; | |
| 1217 | +} | |
| 1218 | + | |
| 1219 | +/* FPSCR */ | |
| 1220 | +PPC_OP(load_fpscr) | |
| 1221 | +{ | |
| 1222 | + T0 = do_load_fpscr(); | |
| 1223 | +} | |
| 1224 | + | |
| 1225 | +PPC_OP(store_fpscr) | |
| 1226 | +{ | |
| 1227 | + do_store_fpscr(PARAM(1), T0); | |
| 1228 | +} | |
| 1229 | + | |
| 1230 | +/*** Floating-point store ***/ | |
| 1231 | + | |
| 1232 | +static inline uint32_t dtos(uint64_t f) | |
| 1233 | +{ | |
| 1234 | + unsigned int e, m, s; | |
| 1235 | + e = (((f >> 52) & 0x7ff) - 1022) + 126; | |
| 1236 | + s = (f >> 63); | |
| 1237 | + m = (f >> 29); | |
| 1238 | + return (s << 31) | (e << 23) | m; | |
| 1239 | +} | |
| 1240 | + | |
| 1241 | +static inline uint64_t stod(uint32_t f) | |
| 1242 | +{ | |
| 1243 | + unsigned int e, m, s; | |
| 1244 | + e = ((f >> 23) & 0xff) - 126 + 1022; | |
| 1245 | + s = f >> 31; | |
| 1246 | + m = f & ((1 << 23) - 1); | |
| 1247 | + return ((uint64_t)s << 63) | ((uint64_t)e << 52) | ((uint64_t)m << 29); | |
| 1248 | +} | |
| 1249 | + | |
| 1250 | +PPC_OP(stfd_z_FT0) | |
| 1251 | +{ | |
| 1252 | + st64(SPARAM(1), FT0); | |
| 1253 | +} | |
| 1254 | + | |
| 1255 | +PPC_OP(stfd_FT0) | |
| 1256 | +{ | |
| 1257 | + T0 += SPARAM(1); | |
| 1258 | + st64(T0, FT0); | |
| 1259 | +} | |
| 1260 | + | |
| 1261 | +PPC_OP(stfdx_z_FT0) | |
| 1262 | +{ | |
| 1263 | + st64(T0, FT0); | |
| 1264 | +} | |
| 1265 | + | |
| 1266 | +PPC_OP(stfdx_FT0) | |
| 1267 | +{ | |
| 1268 | + T0 += T1; | |
| 1269 | + st64(T0, FT0); | |
| 1270 | +} | |
| 1271 | + | |
| 1272 | + | |
| 1273 | +PPC_OP(stfs_z_FT0) | |
| 1274 | +{ | |
| 1275 | + st32(SPARAM(1), dtos(FT0)); | |
| 1276 | +} | |
| 1277 | + | |
| 1278 | +PPC_OP(stfs_FT0) | |
| 1279 | +{ | |
| 1280 | + T0 += SPARAM(1); | |
| 1281 | + st32(T0, dtos(FT0)); | |
| 1282 | +} | |
| 1283 | + | |
| 1284 | +PPC_OP(stfsx_z_FT0) | |
| 1285 | +{ | |
| 1286 | + st32(T0, dtos(FT0)); | |
| 1287 | +} | |
| 1288 | + | |
| 1289 | +PPC_OP(stfsx_FT0) | |
| 1290 | +{ | |
| 1291 | + T0 += T1; | |
| 1292 | + st32(T0, dtos(FT0)); | |
| 1293 | +} | |
| 1294 | + | |
| 1295 | +/*** Floating-point load ***/ | |
| 1296 | +PPC_OP(lfd_z_FT0) | |
| 1297 | +{ | |
| 1298 | + FT0 = ld64(SPARAM(1)); | |
| 1299 | +} | |
| 1300 | + | |
| 1301 | +PPC_OP(lfd_FT0) | |
| 1302 | +{ | |
| 1303 | + T0 += SPARAM(1); | |
| 1304 | + FT0 = ld64(T0); | |
| 1305 | +} | |
| 1306 | + | |
| 1307 | +PPC_OP(lfdx_z_FT0) | |
| 1308 | +{ | |
| 1309 | + FT0 = ld64(T0); | |
| 1310 | +} | |
| 1311 | + | |
| 1312 | +PPC_OP(lfdx_FT0) | |
| 1313 | +{ | |
| 1314 | + T0 += T1; | |
| 1315 | + FT0 = ld64(T0); | |
| 1316 | +} | |
| 1317 | + | |
| 1318 | +PPC_OP(lfs_z_FT0) | |
| 1319 | +{ | |
| 1320 | + FT0 = stod(ld32(SPARAM(1))); | |
| 1321 | +} | |
| 1322 | + | |
| 1323 | +PPC_OP(lfs_FT0) | |
| 1324 | +{ | |
| 1325 | + T0 += SPARAM(1); | |
| 1326 | + FT0 = stod(ld32(T0)); | |
| 1327 | +} | |
| 1328 | + | |
| 1329 | +PPC_OP(lfsx_z_FT0) | |
| 1330 | +{ | |
| 1331 | + FT0 = stod(ld32(T0)); | |
| 1332 | +} | |
| 1333 | + | |
| 1334 | +PPC_OP(lfsx_FT0) | |
| 1335 | +{ | |
| 1336 | + T0 += T1; | |
| 1337 | + FT0 = stod(ld32(T0)); | |
| 1338 | +} | ... | ... |
target-ppc/op.tpl deleted
100644 → 0
| 1 | -/* | |
| 2 | - * PPC emulation micro-operations for qemu. | |
| 3 | - * | |
| 4 | - * Copyright (c) 2003 Jocelyn Mayer | |
| 5 | - * | |
| 6 | - * This library is free software; you can redistribute it and/or | |
| 7 | - * modify it under the terms of the GNU Lesser General Public | |
| 8 | - * License as published by the Free Software Foundation; either | |
| 9 | - * version 2 of the License, or (at your option) any later version. | |
| 10 | - * | |
| 11 | - * This library is distributed in the hope that it will be useful, | |
| 12 | - * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 13 | - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| 14 | - * Lesser General Public License for more details. | |
| 15 | - * | |
| 16 | - * You should have received a copy of the GNU Lesser General Public | |
| 17 | - * License along with this library; if not, write to the Free Software | |
| 18 | - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
| 19 | - */ | |
| 20 | - | |
| 21 | -/* Host registers definitions */ | |
| 22 | -$DEFH T 3 | |
| 23 | -/* PPC registers definitions */ | |
| 24 | -$DEF gpr 32 | |
| 25 | -$DEF fpr 32 | |
| 26 | -$DEF crf 8 | |
| 27 | -$DEF spr 1024 | |
| 28 | - | |
| 29 | -/* PPC registers <-> host registers move */ | |
| 30 | -/* GPR */ | |
| 31 | -$OP load_gpr_T0 gpr | |
| 32 | -{ | |
| 33 | - T0 = regs->gpra; | |
| 34 | - RETURN(); | |
| 35 | -} | |
| 36 | -$ENDOP | |
| 37 | - | |
| 38 | -$OP load_gpr_T1 gpr | |
| 39 | -{ | |
| 40 | - T1 = regs->gpra; | |
| 41 | - RETURN(); | |
| 42 | -} | |
| 43 | -$ENDOP | |
| 44 | - | |
| 45 | -$OP load_gpr_T2 gpr | |
| 46 | -{ | |
| 47 | - T2 = regs->gpra; | |
| 48 | - RETURN(); | |
| 49 | -} | |
| 50 | -$ENDOP | |
| 51 | - | |
| 52 | -$OP store_T0_gpr gpr | |
| 53 | -{ | |
| 54 | - regs->gpra = T0; | |
| 55 | - RETURN(); | |
| 56 | -} | |
| 57 | -$ENDOP | |
| 58 | - | |
| 59 | -$OP store_T1_gpr gpr | |
| 60 | -{ | |
| 61 | - regs->gpra = T1; | |
| 62 | - RETURN(); | |
| 63 | -} | |
| 64 | -$ENDOP | |
| 65 | - | |
| 66 | -$OP store_gpr_P gpr PARAM | |
| 67 | -{ | |
| 68 | - regs->gpra = PARAM(1); | |
| 69 | - RETURN(); | |
| 70 | -} | |
| 71 | -$ENDOP | |
| 72 | - | |
| 73 | -/* crf */ | |
| 74 | -$OP load_crf_T0 crf | |
| 75 | -{ | |
| 76 | - T0 = regs->crfa; | |
| 77 | - RETURN(); | |
| 78 | -} | |
| 79 | -$ENDOP | |
| 80 | - | |
| 81 | -$OP load_crf_T1 crf | |
| 82 | -{ | |
| 83 | - T1 = regs->crfa; | |
| 84 | - RETURN(); | |
| 85 | -} | |
| 86 | -$ENDOP | |
| 87 | - | |
| 88 | -$OP store_T0_crf crf | |
| 89 | -{ | |
| 90 | - regs->crfa = T0; | |
| 91 | - RETURN(); | |
| 92 | -} | |
| 93 | -$ENDOP | |
| 94 | - | |
| 95 | -$OP store_T1_crf crf | |
| 96 | -{ | |
| 97 | - regs->crfa = T1; | |
| 98 | - RETURN(); | |
| 99 | -} | |
| 100 | -$ENDOP | |
| 101 | - | |
| 102 | -/* SPR */ | |
| 103 | -$OP load_spr spr | |
| 104 | -{ | |
| 105 | - T0 = regs->spra; | |
| 106 | - RETURN(); | |
| 107 | -} | |
| 108 | -$ENDOP | |
| 109 | - | |
| 110 | -$OP store_spr spr | |
| 111 | -{ | |
| 112 | - regs->spra = T0; | |
| 113 | - RETURN(); | |
| 114 | -} | |
| 115 | -$ENDOP | |
| 116 | - | |
| 117 | -/* FPSCR */ | |
| 118 | -$OP load_fpscr fpr | |
| 119 | -{ | |
| 120 | - regs->fpra = do_load_fpscr(); | |
| 121 | - RETURN(); | |
| 122 | -} | |
| 123 | -$ENDOP | |
| 124 | - | |
| 125 | -$OP store_fpscr fpr PARAM | |
| 126 | -{ | |
| 127 | - do_store_fpscr(PARAM(1), regs->fpra); | |
| 128 | - RETURN(); | |
| 129 | -} | |
| 130 | -$ENDOP | |
| 131 | - | |
| 132 | -/*** Floating-point store ***/ | |
| 133 | -/* candidate for helper (too long on x86 host) */ | |
| 134 | -$OP stfd_z fpr PARAM | |
| 135 | -{ | |
| 136 | - st64(SPARAM(1), regs->fpra); | |
| 137 | - RETURN(); | |
| 138 | -} | |
| 139 | -$ENDOP | |
| 140 | - | |
| 141 | -/* candidate for helper (too long on x86 host) */ | |
| 142 | -$OP stfd fpr PARAM | |
| 143 | -{ | |
| 144 | - T0 += SPARAM(1); | |
| 145 | - st64(T0, regs->fpra); | |
| 146 | - RETURN(); | |
| 147 | -} | |
| 148 | -$ENDOP | |
| 149 | - | |
| 150 | -/* candidate for helper (too long on x86 host) */ | |
| 151 | -$OP stfdx_z fpr | |
| 152 | -{ | |
| 153 | - st64(T0, regs->fpra); | |
| 154 | - RETURN(); | |
| 155 | -} | |
| 156 | -$ENDOP | |
| 157 | -/* candidate for helper (too long on x86 host) */ | |
| 158 | -$OP stfdx fpr | |
| 159 | -{ | |
| 160 | - T0 += T1; | |
| 161 | - st64(T0, regs->fpra); | |
| 162 | - RETURN(); | |
| 163 | -} | |
| 164 | -$ENDOP | |
| 165 | - | |
| 166 | -/* candidate for helper (too long on x86 host) */ | |
| 167 | -$OP lfd_z fpr PARAM | |
| 168 | -{ | |
| 169 | - regs->fpra = ld64(SPARAM(1)); | |
| 170 | - RETURN(); | |
| 171 | -} | |
| 172 | -$ENDOP | |
| 173 | - | |
| 174 | -/* candidate for helper (too long) */ | |
| 175 | -$OP lfd fpr PARAM | |
| 176 | -{ | |
| 177 | - T0 += SPARAM(1); | |
| 178 | - regs->fpra = ld64(T0); | |
| 179 | - RETURN(); | |
| 180 | -} | |
| 181 | -$ENDOP | |
| 182 | - | |
| 183 | -$OP lfdx_z fpr | |
| 184 | -{ | |
| 185 | - regs->fpra = ld64(T0); | |
| 186 | - RETURN(); | |
| 187 | -} | |
| 188 | -$ENDOP | |
| 189 | - | |
| 190 | -$OP lfdx fpr | |
| 191 | -{ | |
| 192 | - T0 += T1; | |
| 193 | - regs->fpra = ld64(T0); | |
| 194 | - RETURN(); | |
| 195 | -} | |
| 196 | -$ENDOP | |
| 197 | -/*****************************************************************************/ |
target-ppc/op_template.h
0 → 100644
| 1 | +/* | |
| 2 | + * PPC emulation micro-operations for qemu. | |
| 3 | + * | |
| 4 | + * Copyright (c) 2003 Jocelyn Mayer | |
| 5 | + * | |
| 6 | + * This library is free software; you can redistribute it and/or | |
| 7 | + * modify it under the terms of the GNU Lesser General Public | |
| 8 | + * License as published by the Free Software Foundation; either | |
| 9 | + * version 2 of the License, or (at your option) any later version. | |
| 10 | + * | |
| 11 | + * This library is distributed in the hope that it will be useful, | |
| 12 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 13 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| 14 | + * Lesser General Public License for more details. | |
| 15 | + * | |
| 16 | + * You should have received a copy of the GNU Lesser General Public | |
| 17 | + * License along with this library; if not, write to the Free Software | |
| 18 | + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
| 19 | + */ | |
| 20 | + | |
| 21 | +void OPPROTO glue(op_load_gpr_T0_gpr, REG)(void) | |
| 22 | +{ | |
| 23 | + T0 = regs->gpr[REG]; | |
| 24 | +} | |
| 25 | + | |
| 26 | +void OPPROTO glue(op_load_gpr_T1_gpr, REG)(void) | |
| 27 | +{ | |
| 28 | + T1 = regs->gpr[REG]; | |
| 29 | +} | |
| 30 | + | |
| 31 | +void OPPROTO glue(op_load_gpr_T2_gpr, REG)(void) | |
| 32 | +{ | |
| 33 | + T2 = regs->gpr[REG]; | |
| 34 | +} | |
| 35 | + | |
| 36 | +void OPPROTO glue(op_store_T0_gpr_gpr, REG)(void) | |
| 37 | +{ | |
| 38 | + regs->gpr[REG] = T0; | |
| 39 | +} | |
| 40 | + | |
| 41 | +void OPPROTO glue(op_store_T1_gpr_gpr, REG)(void) | |
| 42 | +{ | |
| 43 | + regs->gpr[REG] = T1; | |
| 44 | +} | |
| 45 | + | |
| 46 | +void OPPROTO glue(op_store_T2_gpr_gpr, REG)(void) | |
| 47 | +{ | |
| 48 | + regs->gpr[REG] = T2; | |
| 49 | +} | |
| 50 | + | |
| 51 | +#if REG <= 7 | |
| 52 | + | |
| 53 | +void OPPROTO glue(op_load_crf_T0_crf, REG)(void) | |
| 54 | +{ | |
| 55 | + T0 = regs->crf[REG]; | |
| 56 | +} | |
| 57 | + | |
| 58 | +void OPPROTO glue(op_load_crf_T1_crf, REG)(void) | |
| 59 | +{ | |
| 60 | + T1 = regs->crf[REG]; | |
| 61 | +} | |
| 62 | + | |
| 63 | +void OPPROTO glue(op_store_T0_crf_crf, REG)(void) | |
| 64 | +{ | |
| 65 | + regs->crf[REG] = T0; | |
| 66 | +} | |
| 67 | + | |
| 68 | +void OPPROTO glue(op_store_T1_crf_crf, REG)(void) | |
| 69 | +{ | |
| 70 | + regs->crf[REG] = T1; | |
| 71 | +} | |
| 72 | + | |
| 73 | +#endif /* REG <= 7 */ | |
| 74 | + | |
| 75 | +/* float moves */ | |
| 76 | + | |
| 77 | +void OPPROTO glue(op_load_FT0_fpr, REG)(void) | |
| 78 | +{ | |
| 79 | + FT0 = env->fpr[REG]; | |
| 80 | +} | |
| 81 | + | |
| 82 | +void OPPROTO glue(op_store_FT0_fpr, REG)(void) | |
| 83 | +{ | |
| 84 | + env->fpr[REG] = FT0; | |
| 85 | +} | |
| 86 | + | |
| 87 | +#undef REG | ... | ... |
target-ppc/translate.c
| ... | ... | @@ -36,7 +36,50 @@ static uint16_t *gen_opc_ptr; |
| 36 | 36 | static uint32_t *gen_opparam_ptr; |
| 37 | 37 | |
| 38 | 38 | #include "gen-op.h" |
| 39 | -#include "select.h" | |
| 39 | + | |
| 40 | +typedef void (GenOpFunc)(void); | |
| 41 | + | |
| 42 | +#define GEN8(func, NAME) \ | |
| 43 | +static GenOpFunc *NAME ## _table [8] = {\ | |
| 44 | +NAME ## 0, NAME ## 1, NAME ## 2, NAME ## 3,\ | |
| 45 | +NAME ## 4, NAME ## 5, NAME ## 6, NAME ## 7,\ | |
| 46 | +};\ | |
| 47 | +static inline void func(int n)\ | |
| 48 | +{\ | |
| 49 | + NAME ## _table[n]();\ | |
| 50 | +} | |
| 51 | + | |
| 52 | +#define GEN32(func, NAME) \ | |
| 53 | +static GenOpFunc *NAME ## _table [32] = {\ | |
| 54 | +NAME ## 0, NAME ## 1, NAME ## 2, NAME ## 3,\ | |
| 55 | +NAME ## 4, NAME ## 5, NAME ## 6, NAME ## 7,\ | |
| 56 | +NAME ## 8, NAME ## 9, NAME ## 10, NAME ## 11,\ | |
| 57 | +NAME ## 12, NAME ## 13, NAME ## 14, NAME ## 15,\ | |
| 58 | +NAME ## 16, NAME ## 17, NAME ## 18, NAME ## 19,\ | |
| 59 | +NAME ## 20, NAME ## 21, NAME ## 22, NAME ## 23,\ | |
| 60 | +NAME ## 24, NAME ## 25, NAME ## 26, NAME ## 27,\ | |
| 61 | +NAME ## 28, NAME ## 29, NAME ## 30, NAME ## 31,\ | |
| 62 | +};\ | |
| 63 | +static inline void func(int n)\ | |
| 64 | +{\ | |
| 65 | + NAME ## _table[n]();\ | |
| 66 | +} | |
| 67 | + | |
| 68 | +GEN8(gen_op_load_crf_T0, gen_op_load_crf_T0_crf) | |
| 69 | +GEN8(gen_op_load_crf_T1, gen_op_load_crf_T1_crf) | |
| 70 | +GEN8(gen_op_store_T0_crf, gen_op_store_T0_crf_crf) | |
| 71 | +GEN8(gen_op_store_T1_crf, gen_op_store_T1_crf_crf) | |
| 72 | + | |
| 73 | +GEN32(gen_op_load_gpr_T0, gen_op_load_gpr_T0_gpr) | |
| 74 | +GEN32(gen_op_load_gpr_T1, gen_op_load_gpr_T1_gpr) | |
| 75 | +GEN32(gen_op_load_gpr_T2, gen_op_load_gpr_T2_gpr) | |
| 76 | + | |
| 77 | +GEN32(gen_op_store_T0_gpr, gen_op_store_T0_gpr_gpr) | |
| 78 | +GEN32(gen_op_store_T1_gpr, gen_op_store_T1_gpr_gpr) | |
| 79 | +GEN32(gen_op_store_T2_gpr, gen_op_store_T2_gpr_gpr) | |
| 80 | + | |
| 81 | +GEN32(gen_op_load_FT0_fpr, gen_op_load_FT0_fpr) | |
| 82 | +GEN32(gen_op_store_FT0_fpr, gen_op_store_FT0_fpr) | |
| 40 | 83 | |
| 41 | 84 | static uint8_t spr_access[1024 / 2]; |
| 42 | 85 | |
| ... | ... | @@ -810,7 +853,8 @@ GEN_HANDLER(mcrfs, 0x3F, 0x00, 0x02, 0x0063F801, PPC_FLOAT) |
| 810 | 853 | /* mffs */ |
| 811 | 854 | GEN_HANDLER(mffs, 0x3F, 0x07, 0x12, 0x001FF800, PPC_FLOAT) |
| 812 | 855 | { |
| 813 | - gen_op_load_fpscr(rD(ctx->opcode)); | |
| 856 | + gen_op_load_fpscr(); | |
| 857 | + gen_op_store_T0_gpr(rD(ctx->opcode)); | |
| 814 | 858 | if (Rc(ctx->opcode)) { |
| 815 | 859 | /* Update CR1 */ |
| 816 | 860 | } |
| ... | ... | @@ -832,7 +876,8 @@ GEN_HANDLER(mtfsb1, 0x3F, 0x06, 0x01, 0x001FF800, PPC_FLOAT) |
| 832 | 876 | /* mtfsf */ |
| 833 | 877 | GEN_HANDLER(mtfsf, 0x3F, 0x07, 0x16, 0x02010000, PPC_FLOAT) |
| 834 | 878 | { |
| 835 | - gen_op_store_fpscr(FM(ctx->opcode), rB(ctx->opcode)); | |
| 879 | + gen_op_load_gpr_T0(rB(ctx->opcode)); | |
| 880 | + gen_op_store_fpscr(FM(ctx->opcode)); | |
| 836 | 881 | if (Rc(ctx->opcode)) { |
| 837 | 882 | /* Update CR1 */ |
| 838 | 883 | } |
| ... | ... | @@ -1182,11 +1227,12 @@ GEN_HANDLER(lf##width, opc, 0xFF, 0xFF, 0x00000000, PPC_FLOAT) \ |
| 1182 | 1227 | { \ |
| 1183 | 1228 | uint32_t simm = SIMM(ctx->opcode); \ |
| 1184 | 1229 | if (rA(ctx->opcode) == 0) { \ |
| 1185 | - gen_op_lf##width##_z(simm, rD(ctx->opcode)); \ | |
| 1230 | + gen_op_lf##width##_z_FT0(simm); \ | |
| 1186 | 1231 | } else { \ |
| 1187 | 1232 | gen_op_load_gpr_T0(rA(ctx->opcode)); \ |
| 1188 | - gen_op_lf##width(simm, rD(ctx->opcode)); \ | |
| 1233 | + gen_op_lf##width##_FT0(simm); \ | |
| 1189 | 1234 | } \ |
| 1235 | + gen_op_store_FT0_fpr(rD(ctx->opcode));\ | |
| 1190 | 1236 | SET_RETVAL(0); \ |
| 1191 | 1237 | } |
| 1192 | 1238 | |
| ... | ... | @@ -1197,7 +1243,8 @@ GEN_HANDLER(lf##width##u, opc, 0xFF, 0xFF, 0x00000000, PPC_FLOAT) \ |
| 1197 | 1243 | rA(ctx->opcode) == rD(ctx->opcode)) \ |
| 1198 | 1244 | SET_RETVAL(EXCP_INVAL); \ |
| 1199 | 1245 | gen_op_load_gpr_T0(rA(ctx->opcode)); \ |
| 1200 | - gen_op_lf##width(SIMM(ctx->opcode), rD(ctx->opcode)); \ | |
| 1246 | + gen_op_lf##width##_FT0(SIMM(ctx->opcode)); \ | |
| 1247 | + gen_op_store_FT0_fpr(rD(ctx->opcode));\ | |
| 1201 | 1248 | gen_op_store_T0_gpr(rA(ctx->opcode)); \ |
| 1202 | 1249 | SET_RETVAL(0); \ |
| 1203 | 1250 | } |
| ... | ... | @@ -1210,7 +1257,8 @@ GEN_HANDLER(lf##width##ux, 0x1F, 0x17, opc, 0x00000001, PPC_FLOAT) \ |
| 1210 | 1257 | SET_RETVAL(EXCP_INVAL); \ |
| 1211 | 1258 | gen_op_load_gpr_T0(rA(ctx->opcode)); \ |
| 1212 | 1259 | gen_op_load_gpr_T1(rB(ctx->opcode)); \ |
| 1213 | - gen_op_lf##width##x(rD(ctx->opcode)); \ | |
| 1260 | + gen_op_lf##width##x_FT0(); \ | |
| 1261 | + gen_op_store_FT0_fpr(rD(ctx->opcode));\ | |
| 1214 | 1262 | gen_op_store_T0_gpr(rA(ctx->opcode)); \ |
| 1215 | 1263 | SET_RETVAL(0); \ |
| 1216 | 1264 | } |
| ... | ... | @@ -1220,12 +1268,13 @@ GEN_HANDLER(lf##width##x, 0x1F, 0x17, opc, 0x00000001, PPC_FLOAT) \ |
| 1220 | 1268 | { \ |
| 1221 | 1269 | if (rA(ctx->opcode) == 0) { \ |
| 1222 | 1270 | gen_op_load_gpr_T0(rB(ctx->opcode)); \ |
| 1223 | - gen_op_lf##width##x_z(rD(ctx->opcode)); \ | |
| 1271 | + gen_op_lf##width##x_z_FT0(); \ | |
| 1224 | 1272 | } else { \ |
| 1225 | 1273 | gen_op_load_gpr_T0(rA(ctx->opcode)); \ |
| 1226 | 1274 | gen_op_load_gpr_T1(rB(ctx->opcode)); \ |
| 1227 | - gen_op_lf##width##x(rD(ctx->opcode)); \ | |
| 1275 | + gen_op_lf##width##x_FT0(); \ | |
| 1228 | 1276 | } \ |
| 1277 | + gen_op_store_FT0_fpr(rD(ctx->opcode));\ | |
| 1229 | 1278 | SET_RETVAL(0); \ |
| 1230 | 1279 | } |
| 1231 | 1280 | |
| ... | ... | @@ -1238,10 +1287,6 @@ GEN_LFX(width, opc | 0x00) |
| 1238 | 1287 | /* lfd lfdu lfdux lfdx */ |
| 1239 | 1288 | GEN_LDF(d, 0x12); |
| 1240 | 1289 | /* lfs lfsu lfsux lfsx */ |
| 1241 | -#define gen_op_lfs_z(a, b) | |
| 1242 | -#define gen_op_lfs(a, b) | |
| 1243 | -#define gen_op_lfsx_z(a) | |
| 1244 | -#define gen_op_lfsx(a) | |
| 1245 | 1290 | GEN_LDF(s, 0x10); |
| 1246 | 1291 | |
| 1247 | 1292 | /*** Floating-point store ***/ |
| ... | ... | @@ -1249,11 +1294,12 @@ GEN_LDF(s, 0x10); |
| 1249 | 1294 | GEN_HANDLER(stf##width, opc, 0xFF, 0xFF, 0x00000000, PPC_FLOAT) \ |
| 1250 | 1295 | { \ |
| 1251 | 1296 | uint32_t simm = SIMM(ctx->opcode); \ |
| 1297 | + gen_op_load_FT0_fpr(rS(ctx->opcode));\ | |
| 1252 | 1298 | if (rA(ctx->opcode) == 0) { \ |
| 1253 | - gen_op_stf##width##_z(simm, rS(ctx->opcode)); \ | |
| 1299 | + gen_op_stf##width##_z_FT0(simm); \ | |
| 1254 | 1300 | } else { \ |
| 1255 | 1301 | gen_op_load_gpr_T0(rA(ctx->opcode)); \ |
| 1256 | - gen_op_stf##width(simm, rS(ctx->opcode)); \ | |
| 1302 | + gen_op_stf##width##_FT0(simm); \ | |
| 1257 | 1303 | } \ |
| 1258 | 1304 | SET_RETVAL(0); \ |
| 1259 | 1305 | } |
| ... | ... | @@ -1264,7 +1310,8 @@ GEN_HANDLER(stf##width##u, opc, 0xFF, 0xFF, 0x00000000, PPC_FLOAT) \ |
| 1264 | 1310 | if (rA(ctx->opcode) == 0) \ |
| 1265 | 1311 | SET_RETVAL(EXCP_INVAL); \ |
| 1266 | 1312 | gen_op_load_gpr_T0(rA(ctx->opcode)); \ |
| 1267 | - gen_op_stf##width(SIMM(ctx->opcode), rS(ctx->opcode)); \ | |
| 1313 | + gen_op_load_FT0_fpr(rS(ctx->opcode));\ | |
| 1314 | + gen_op_stf##width##_FT0(SIMM(ctx->opcode)); \ | |
| 1268 | 1315 | gen_op_store_T0_gpr(rA(ctx->opcode)); \ |
| 1269 | 1316 | SET_RETVAL(0); \ |
| 1270 | 1317 | } |
| ... | ... | @@ -1276,7 +1323,8 @@ GEN_HANDLER(stf##width##ux, 0x1F, 0x17, opc, 0x00000001, PPC_FLOAT) \ |
| 1276 | 1323 | SET_RETVAL(EXCP_INVAL); \ |
| 1277 | 1324 | gen_op_load_gpr_T0(rA(ctx->opcode)); \ |
| 1278 | 1325 | gen_op_load_gpr_T1(rB(ctx->opcode)); \ |
| 1279 | - gen_op_stf##width##x(rS(ctx->opcode)); \ | |
| 1326 | + gen_op_load_FT0_fpr(rS(ctx->opcode));\ | |
| 1327 | + gen_op_stf##width##x_FT0(); \ | |
| 1280 | 1328 | gen_op_store_T0_gpr(rA(ctx->opcode)); \ |
| 1281 | 1329 | SET_RETVAL(0); \ |
| 1282 | 1330 | } |
| ... | ... | @@ -1284,13 +1332,14 @@ GEN_HANDLER(stf##width##ux, 0x1F, 0x17, opc, 0x00000001, PPC_FLOAT) \ |
| 1284 | 1332 | #define GEN_STFX(width, opc) \ |
| 1285 | 1333 | GEN_HANDLER(stf##width##x, 0x1F, 0x17, opc, 0x00000001, PPC_FLOAT) \ |
| 1286 | 1334 | { \ |
| 1335 | + gen_op_load_FT0_fpr(rS(ctx->opcode));\ | |
| 1287 | 1336 | if (rA(ctx->opcode) == 0) { \ |
| 1288 | 1337 | gen_op_load_gpr_T0(rB(ctx->opcode)); \ |
| 1289 | - gen_op_stf##width##x_z(rS(ctx->opcode)); \ | |
| 1338 | + gen_op_stf##width##x_z_FT0(); \ | |
| 1290 | 1339 | } else { \ |
| 1291 | 1340 | gen_op_load_gpr_T0(rA(ctx->opcode)); \ |
| 1292 | 1341 | gen_op_load_gpr_T1(rB(ctx->opcode)); \ |
| 1293 | - gen_op_stf##width##x(rS(ctx->opcode)); \ | |
| 1342 | + gen_op_stf##width##x_FT0(); \ | |
| 1294 | 1343 | } \ |
| 1295 | 1344 | SET_RETVAL(0); \ |
| 1296 | 1345 | } |
| ... | ... | @@ -1304,10 +1353,6 @@ GEN_STFX(width, opc | 0x00) |
| 1304 | 1353 | /* stfd stfdu stfdux stfdx */ |
| 1305 | 1354 | GEN_STOF(d, 0x16); |
| 1306 | 1355 | /* stfs stfsu stfsux stfsx */ |
| 1307 | -#define gen_op_stfs_z(a, b) | |
| 1308 | -#define gen_op_stfs(a, b) | |
| 1309 | -#define gen_op_stfsx_z(a) | |
| 1310 | -#define gen_op_stfsx(a) | |
| 1311 | 1356 | GEN_STOF(s, 0x14); |
| 1312 | 1357 | |
| 1313 | 1358 | /* Optional: */ | ... | ... |