Revision fb0eaffc target-ppc/op.c

b/target-ppc/op.c
27 27
#define Ts2 (int32_t)T2
28 28

  
29 29
#define FT0 (env->ft0)
30
#define FT1 (env->ft1)
31
#define FT2 (env->ft2)
32

  
33
#define FTS0 ((float)env->ft0)
34
#define FTS1 ((float)env->ft1)
35
#define FTS2 ((float)env->ft2)
30 36

  
31 37
#define PPC_OP(name) void op_##name(void)
32 38

  
......
173 179
    RETURN();
174 180
}
175 181

  
182
/* Set Rc1 (for floating point arithmetic) */
183
PPC_OP(set_Rc1)
184
{
185
    env->crf[1] = regs->fpscr[7];
186
    RETURN();
187
}
188

  
176 189
PPC_OP(set_T0)
177 190
{
178 191
    T0 = PARAM(1);
......
278 291
    RETURN();
279 292
}
280 293

  
294
/* FPSCR */
295
PPC_OP(load_fpscr)
296
{
297
    do_load_fpscr();
298
    RETURN();
299
}
300

  
301
PPC_OP(store_fpscr)
302
{
303
    do_store_fpscr(PARAM(1));
304
    RETURN();
305
}
306

  
307
PPC_OP(reset_scrfx)
308
{
309
    regs->fpscr[7] &= ~0x8;
310
    RETURN();
311
}
312

  
281 313
/* Set reservation */
282 314
PPC_OP(set_reservation)
283 315
{
......
988 1020
/* rotate left word immediate then mask insert */
989 1021
PPC_OP(rlwimi)
990 1022
{
991
    T0 = rotl(T0, PARAM(1) & PARAM(2)) | (T0 & PARAM(3));
1023
    T0 = (rotl(T0, PARAM(1)) & PARAM(2)) | (T1 & PARAM(3));
992 1024
    RETURN();
993 1025
}
994 1026

  
......
1216 1248
    regs->spr[PARAM(1)] = T0;
1217 1249
}
1218 1250

  
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 1251
/***                         Floating-point store                          ***/
1231 1252

  
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 1253
PPC_OP(stfd_z_FT0)
1251 1254
{
1252
    st64(SPARAM(1), FT0);
1255
    stfq((void *)SPARAM(1), FT0);
1253 1256
}
1254 1257

  
1255 1258
PPC_OP(stfd_FT0)
1256 1259
{
1257 1260
    T0 += SPARAM(1);
1258
    st64(T0, FT0);
1261
    stfq((void *)T0, FT0);
1259 1262
}
1260 1263

  
1261 1264
PPC_OP(stfdx_z_FT0)
1262 1265
{
1263
    st64(T0, FT0);
1266
    stfq((void *)T0, FT0);
1264 1267
}
1265 1268

  
1266 1269
PPC_OP(stfdx_FT0)
1267 1270
{
1268 1271
    T0 += T1;
1269
    st64(T0, FT0);
1272
    stfq((void *)T0, FT0);
1270 1273
}
1271 1274

  
1272

  
1273 1275
PPC_OP(stfs_z_FT0)
1274 1276
{
1275
    st32(SPARAM(1), dtos(FT0));
1277
    float tmp = FT0;
1278
    stfl((void *)SPARAM(1), tmp);
1276 1279
}
1277 1280

  
1278 1281
PPC_OP(stfs_FT0)
1279 1282
{
1283
    float tmp = FT0;
1280 1284
    T0 += SPARAM(1);
1281
    st32(T0, dtos(FT0));
1285
    stfl((void *)T0, tmp);
1282 1286
}
1283 1287

  
1284 1288
PPC_OP(stfsx_z_FT0)
1285 1289
{
1286
    st32(T0, dtos(FT0));
1290
    float tmp = FT0;
1291
    stfl((void *)T0, tmp);
1287 1292
}
1288 1293

  
1289 1294
PPC_OP(stfsx_FT0)
1290 1295
{
1296
    float tmp = FT0;
1291 1297
    T0 += T1;
1292
    st32(T0, dtos(FT0));
1298
    stfl((void *)T0, tmp);
1293 1299
}
1294 1300

  
1295 1301
/***                         Floating-point load                          ***/
1296 1302
PPC_OP(lfd_z_FT0)
1297 1303
{
1298
    FT0 = ld64(SPARAM(1));
1304
    FT0 = ldfq((void *)SPARAM(1));
1299 1305
}
1300 1306

  
1301 1307
PPC_OP(lfd_FT0)
1302 1308
{
1303 1309
    T0 += SPARAM(1);
1304
    FT0 = ld64(T0);
1310
    FT0 = ldfq((void *)T0);
1305 1311
}
1306 1312

  
1307 1313
PPC_OP(lfdx_z_FT0)
1308 1314
{
1309
    FT0 = ld64(T0);
1315
    FT0 = ldfq((void *)T0);
1310 1316
}
1311 1317

  
1312 1318
PPC_OP(lfdx_FT0)
1313 1319
{
1314 1320
    T0 += T1;
1315
    FT0 = ld64(T0);
1321
    FT0 = ldfq((void *)T0);
1316 1322
}
1317 1323

  
1318 1324
PPC_OP(lfs_z_FT0)
1319 1325
{
1320
    FT0 = stod(ld32(SPARAM(1)));
1326
    float tmp = ldfl((void *)SPARAM(1));
1327
    FT0 = tmp;
1321 1328
}
1322 1329

  
1323 1330
PPC_OP(lfs_FT0)
1324 1331
{
1332
    float tmp;
1325 1333
    T0 += SPARAM(1);
1326
    FT0 = stod(ld32(T0));
1334
    tmp = ldfl((void *)T0);
1335
    FT0 = tmp;
1327 1336
}
1328 1337

  
1329 1338
PPC_OP(lfsx_z_FT0)
1330 1339
{
1331
    FT0 = stod(ld32(T0));
1340
    float tmp;
1341
    tmp = ldfl((void *)T0);
1342
    FT0 = tmp;
1332 1343
}
1333 1344

  
1334 1345
PPC_OP(lfsx_FT0)
1335 1346
{
1347
    float tmp;
1348
    T0 += T1;
1349
    tmp = ldfl((void *)T0);
1350
    FT0 = tmp;
1351
}
1352

  
1353
PPC_OP(lwarx_z)
1354
{
1355
    T1 = ld32(T0);
1356
    regs->reserve = T0;
1357
    RETURN();
1358
}
1359

  
1360
PPC_OP(lwarx)
1361
{
1362
    T0 += T1;
1363
    T1 = ld32(T0);
1364
    regs->reserve = T0;
1365
    RETURN();
1366
}
1367

  
1368
PPC_OP(stwcx_z)
1369
{
1370
    if (regs->reserve != T0) {
1371
        env->crf[0] = xer_ov;
1372
    } else {
1373
        st32(T0, T1);
1374
        env->crf[0] = xer_ov | 0x02;
1375
    }
1376
    regs->reserve = 0;
1377
    RETURN();
1378
}
1379

  
1380
PPC_OP(stwcx)
1381
{
1336 1382
    T0 += T1;
1337
    FT0 = stod(ld32(T0));
1383
    if (regs->reserve != (T0 & ~0x03)) {
1384
        env->crf[0] = xer_ov;
1385
    } else {
1386
        st32(T0, T2);
1387
        env->crf[0] = xer_ov | 0x02;
1388
    }
1389
    regs->reserve = 0;
1390
    RETURN();
1391
}
1392

  
1393
PPC_OP(dcbz_z)
1394
{
1395
    do_dcbz();
1396
    RETURN();
1397
}
1398

  
1399
PPC_OP(dcbz)
1400
{
1401
    T0 += T1;
1402
    do_dcbz();
1403
    RETURN();
1404
}
1405

  
1406
/* Instruction cache block invalidate */
1407
PPC_OP(icbi_z)
1408
{
1409
    do_icbi();
1410
    RETURN();
1411
}
1412

  
1413
PPC_OP(icbi)
1414
{
1415
    T0 += T1;
1416
    do_icbi();
1417
    RETURN();
1338 1418
}

Also available in: Unified diff