Revision 96912e39 target-ppc/op_helper.c

b/target-ppc/op_helper.c
975 975
    farg1.ll = arg1;
976 976
    farg2.ll = arg2;
977 977

  
978
    if (unlikely(float64_is_signaling_nan(farg1.d) ||
979
                 float64_is_signaling_nan(farg2.d))) {
980
        /* sNaN addition */
981
        farg1.ll = fload_invalid_op_excp(POWERPC_EXCP_FP_VXSNAN);
982
    } else if (unlikely(float64_is_infinity(farg1.d) && float64_is_infinity(farg2.d) &&
983
                      float64_is_neg(farg1.d) != float64_is_neg(farg2.d))) {
978
    if (unlikely(float64_is_infinity(farg1.d) && float64_is_infinity(farg2.d) &&
979
                 float64_is_neg(farg1.d) != float64_is_neg(farg2.d))) {
984 980
        /* Magnitude subtraction of infinities */
985 981
        farg1.ll = fload_invalid_op_excp(POWERPC_EXCP_FP_VXISI);
986 982
    } else {
983
        if (unlikely(float64_is_signaling_nan(farg1.d) ||
984
                     float64_is_signaling_nan(farg2.d))) {
985
            /* sNaN addition */
986
            fload_invalid_op_excp(POWERPC_EXCP_FP_VXSNAN);
987
        }
987 988
        farg1.d = float64_add(farg1.d, farg2.d, &env->fp_status);
988 989
    }
989 990

  
......
998 999
    farg1.ll = arg1;
999 1000
    farg2.ll = arg2;
1000 1001

  
1001
    if (unlikely(float64_is_signaling_nan(farg1.d) ||
1002
                 float64_is_signaling_nan(farg2.d))) {
1003
        /* sNaN subtraction */
1004
        farg1.ll = fload_invalid_op_excp(POWERPC_EXCP_FP_VXSNAN);
1005
    } else if (unlikely(float64_is_infinity(farg1.d) && float64_is_infinity(farg2.d) &&
1006
                      float64_is_neg(farg1.d) == float64_is_neg(farg2.d))) {
1002
    if (unlikely(float64_is_infinity(farg1.d) && float64_is_infinity(farg2.d) &&
1003
                 float64_is_neg(farg1.d) == float64_is_neg(farg2.d))) {
1007 1004
        /* Magnitude subtraction of infinities */
1008 1005
        farg1.ll = fload_invalid_op_excp(POWERPC_EXCP_FP_VXISI);
1009 1006
    } else {
1007
        if (unlikely(float64_is_signaling_nan(farg1.d) ||
1008
                     float64_is_signaling_nan(farg2.d))) {
1009
            /* sNaN subtraction */
1010
            fload_invalid_op_excp(POWERPC_EXCP_FP_VXSNAN);
1011
        }
1010 1012
        farg1.d = float64_sub(farg1.d, farg2.d, &env->fp_status);
1011 1013
    }
1012 1014

  
......
1021 1023
    farg1.ll = arg1;
1022 1024
    farg2.ll = arg2;
1023 1025

  
1024
    if (unlikely(float64_is_signaling_nan(farg1.d) ||
1025
                 float64_is_signaling_nan(farg2.d))) {
1026
        /* sNaN multiplication */
1027
        farg1.ll = fload_invalid_op_excp(POWERPC_EXCP_FP_VXSNAN);
1028
    } else if (unlikely((float64_is_infinity(farg1.d) && float64_is_zero(farg2.d)) ||
1029
                        (float64_is_zero(farg1.d) && float64_is_infinity(farg2.d)))) {
1026
    if (unlikely((float64_is_infinity(farg1.d) && float64_is_zero(farg2.d)) ||
1027
                 (float64_is_zero(farg1.d) && float64_is_infinity(farg2.d)))) {
1030 1028
        /* Multiplication of zero by infinity */
1031 1029
        farg1.ll = fload_invalid_op_excp(POWERPC_EXCP_FP_VXIMZ);
1032 1030
    } else {
1031
        if (unlikely(float64_is_signaling_nan(farg1.d) ||
1032
                     float64_is_signaling_nan(farg2.d))) {
1033
            /* sNaN multiplication */
1034
            fload_invalid_op_excp(POWERPC_EXCP_FP_VXSNAN);
1035
        }
1033 1036
        farg1.d = float64_mul(farg1.d, farg2.d, &env->fp_status);
1034 1037
    }
1035 1038

  
......
1044 1047
    farg1.ll = arg1;
1045 1048
    farg2.ll = arg2;
1046 1049

  
1047
    if (unlikely(float64_is_signaling_nan(farg1.d) ||
1048
                 float64_is_signaling_nan(farg2.d))) {
1049
        /* sNaN division */
1050
        farg1.ll = fload_invalid_op_excp(POWERPC_EXCP_FP_VXSNAN);
1051
    } else if (unlikely(float64_is_infinity(farg1.d) && float64_is_infinity(farg2.d))) {
1050
    if (unlikely(float64_is_infinity(farg1.d) && float64_is_infinity(farg2.d))) {
1052 1051
        /* Division of infinity by infinity */
1053 1052
        farg1.ll = fload_invalid_op_excp(POWERPC_EXCP_FP_VXIDI);
1054 1053
    } else if (unlikely(float64_is_zero(farg1.d) && float64_is_zero(farg2.d))) {
1055 1054
        /* Division of zero by zero */
1056 1055
        farg1.ll = fload_invalid_op_excp(POWERPC_EXCP_FP_VXZDZ);
1057 1056
    } else {
1057
        if (unlikely(float64_is_signaling_nan(farg1.d) ||
1058
                     float64_is_signaling_nan(farg2.d))) {
1059
            /* sNaN division */
1060
            fload_invalid_op_excp(POWERPC_EXCP_FP_VXSNAN);
1061
        }
1058 1062
        farg1.d = float64_div(farg1.d, farg2.d, &env->fp_status);
1059 1063
    }
1060 1064

  
......
1232 1236
    farg2.ll = arg2;
1233 1237
    farg3.ll = arg3;
1234 1238

  
1235
    if (unlikely(float64_is_signaling_nan(farg1.d) ||
1236
                 float64_is_signaling_nan(farg2.d) ||
1237
                 float64_is_signaling_nan(farg3.d))) {
1238
        /* sNaN operation */
1239
        farg1.ll = fload_invalid_op_excp(POWERPC_EXCP_FP_VXSNAN);
1240
    } else if (unlikely((float64_is_infinity(farg1.d) && float64_is_zero(farg2.d)) ||
1241
                        (float64_is_zero(farg1.d) && float64_is_infinity(farg2.d)))) {
1239
    if (unlikely((float64_is_infinity(farg1.d) && float64_is_zero(farg2.d)) ||
1240
                 (float64_is_zero(farg1.d) && float64_is_infinity(farg2.d)))) {
1242 1241
        /* Multiplication of zero by infinity */
1243 1242
        farg1.ll = fload_invalid_op_excp(POWERPC_EXCP_FP_VXIMZ);
1244 1243
    } else {
1244
        if (unlikely(float64_is_signaling_nan(farg1.d) ||
1245
                     float64_is_signaling_nan(farg2.d) ||
1246
                     float64_is_signaling_nan(farg3.d))) {
1247
            /* sNaN operation */
1248
            fload_invalid_op_excp(POWERPC_EXCP_FP_VXSNAN);
1249
        }
1245 1250
#ifdef FLOAT128
1246 1251
        /* This is the way the PowerPC specification defines it */
1247 1252
        float128 ft0_128, ft1_128;
......
1276 1281
    farg2.ll = arg2;
1277 1282
    farg3.ll = arg3;
1278 1283

  
1279
    if (unlikely(float64_is_signaling_nan(farg1.d) ||
1280
                 float64_is_signaling_nan(farg2.d) ||
1281
                 float64_is_signaling_nan(farg3.d))) {
1282
        /* sNaN operation */
1283
        farg1.ll = fload_invalid_op_excp(POWERPC_EXCP_FP_VXSNAN);
1284
    } else if (unlikely((float64_is_infinity(farg1.d) && float64_is_zero(farg2.d)) ||
1284
    if (unlikely((float64_is_infinity(farg1.d) && float64_is_zero(farg2.d)) ||
1285 1285
                        (float64_is_zero(farg1.d) && float64_is_infinity(farg2.d)))) {
1286 1286
        /* Multiplication of zero by infinity */
1287 1287
        farg1.ll = fload_invalid_op_excp(POWERPC_EXCP_FP_VXIMZ);
1288 1288
    } else {
1289
        if (unlikely(float64_is_signaling_nan(farg1.d) ||
1290
                     float64_is_signaling_nan(farg2.d) ||
1291
                     float64_is_signaling_nan(farg3.d))) {
1292
            /* sNaN operation */
1293
            fload_invalid_op_excp(POWERPC_EXCP_FP_VXSNAN);
1294
        }
1289 1295
#ifdef FLOAT128
1290 1296
        /* This is the way the PowerPC specification defines it */
1291 1297
        float128 ft0_128, ft1_128;
......
1319 1325
    farg2.ll = arg2;
1320 1326
    farg3.ll = arg3;
1321 1327

  
1322
    if (unlikely(float64_is_signaling_nan(farg1.d) ||
1323
                 float64_is_signaling_nan(farg2.d) ||
1324
                 float64_is_signaling_nan(farg3.d))) {
1325
        /* sNaN operation */
1326
        farg1.ll = fload_invalid_op_excp(POWERPC_EXCP_FP_VXSNAN);
1327
    } else if (unlikely((float64_is_infinity(farg1.d) && float64_is_zero(farg2.d)) ||
1328
                        (float64_is_zero(farg1.d) && float64_is_infinity(farg2.d)))) {
1328
    if (unlikely((float64_is_infinity(farg1.d) && float64_is_zero(farg2.d)) ||
1329
                 (float64_is_zero(farg1.d) && float64_is_infinity(farg2.d)))) {
1329 1330
        /* Multiplication of zero by infinity */
1330 1331
        farg1.ll = fload_invalid_op_excp(POWERPC_EXCP_FP_VXIMZ);
1331 1332
    } else {
1333
        if (unlikely(float64_is_signaling_nan(farg1.d) ||
1334
                     float64_is_signaling_nan(farg2.d) ||
1335
                     float64_is_signaling_nan(farg3.d))) {
1336
            /* sNaN operation */
1337
            fload_invalid_op_excp(POWERPC_EXCP_FP_VXSNAN);
1338
        }
1332 1339
#ifdef FLOAT128
1333 1340
        /* This is the way the PowerPC specification defines it */
1334 1341
        float128 ft0_128, ft1_128;
......
1364 1371
    farg2.ll = arg2;
1365 1372
    farg3.ll = arg3;
1366 1373

  
1367
    if (unlikely(float64_is_signaling_nan(farg1.d) ||
1368
                 float64_is_signaling_nan(farg2.d) ||
1369
                 float64_is_signaling_nan(farg3.d))) {
1370
        /* sNaN operation */
1371
        farg1.ll = fload_invalid_op_excp(POWERPC_EXCP_FP_VXSNAN);
1372
    } else if (unlikely((float64_is_infinity(farg1.d) && float64_is_zero(farg2.d)) ||
1374
    if (unlikely((float64_is_infinity(farg1.d) && float64_is_zero(farg2.d)) ||
1373 1375
                        (float64_is_zero(farg1.d) && float64_is_infinity(farg2.d)))) {
1374 1376
        /* Multiplication of zero by infinity */
1375 1377
        farg1.ll = fload_invalid_op_excp(POWERPC_EXCP_FP_VXIMZ);
1376 1378
    } else {
1379
        if (unlikely(float64_is_signaling_nan(farg1.d) ||
1380
                     float64_is_signaling_nan(farg2.d) ||
1381
                     float64_is_signaling_nan(farg3.d))) {
1382
            /* sNaN operation */
1383
            fload_invalid_op_excp(POWERPC_EXCP_FP_VXSNAN);
1384
        }
1377 1385
#ifdef FLOAT128
1378 1386
        /* This is the way the PowerPC specification defines it */
1379 1387
        float128 ft0_128, ft1_128;
......
1409 1417

  
1410 1418
    if (unlikely(float64_is_signaling_nan(farg.d))) {
1411 1419
        /* sNaN square root */
1412
       farg.ll = fload_invalid_op_excp(POWERPC_EXCP_FP_VXSNAN);
1413
    } else {
1414
       f32 = float64_to_float32(farg.d, &env->fp_status);
1415
       farg.d = float32_to_float64(f32, &env->fp_status);
1420
       fload_invalid_op_excp(POWERPC_EXCP_FP_VXSNAN);
1416 1421
    }
1422
    f32 = float64_to_float32(farg.d, &env->fp_status);
1423
    farg.d = float32_to_float64(f32, &env->fp_status);
1424

  
1417 1425
    return farg.ll;
1418 1426
}
1419 1427

  
......
1423 1431
    CPU_DoubleU farg;
1424 1432
    farg.ll = arg;
1425 1433

  
1426
    if (unlikely(float64_is_signaling_nan(farg.d))) {
1427
        /* sNaN square root */
1428
        farg.ll = fload_invalid_op_excp(POWERPC_EXCP_FP_VXSNAN);
1429
    } else if (unlikely(float64_is_neg(farg.d) && !float64_is_zero(farg.d))) {
1434
    if (unlikely(float64_is_neg(farg.d) && !float64_is_zero(farg.d))) {
1430 1435
        /* Square root of a negative nonzero number */
1431 1436
        farg.ll = fload_invalid_op_excp(POWERPC_EXCP_FP_VXSQRT);
1432 1437
    } else {
1438
        if (unlikely(float64_is_signaling_nan(farg.d))) {
1439
            /* sNaN square root */
1440
            fload_invalid_op_excp(POWERPC_EXCP_FP_VXSNAN);
1441
        }
1433 1442
        farg.d = float64_sqrt(farg.d, &env->fp_status);
1434 1443
    }
1435 1444
    return farg.ll;
......
1443 1452

  
1444 1453
    if (unlikely(float64_is_signaling_nan(farg.d))) {
1445 1454
        /* sNaN reciprocal */
1446
        farg.ll = fload_invalid_op_excp(POWERPC_EXCP_FP_VXSNAN);
1447
    } else {
1448
        farg.d = float64_div(float64_one, farg.d, &env->fp_status);
1455
        fload_invalid_op_excp(POWERPC_EXCP_FP_VXSNAN);
1449 1456
    }
1457
    farg.d = float64_div(float64_one, farg.d, &env->fp_status);
1450 1458
    return farg.d;
1451 1459
}
1452 1460

  
......
1459 1467

  
1460 1468
    if (unlikely(float64_is_signaling_nan(farg.d))) {
1461 1469
        /* sNaN reciprocal */
1462
        farg.ll = fload_invalid_op_excp(POWERPC_EXCP_FP_VXSNAN);
1463
    } else {
1464
        farg.d = float64_div(float64_one, farg.d, &env->fp_status);
1465
        f32 = float64_to_float32(farg.d, &env->fp_status);
1466
        farg.d = float32_to_float64(f32, &env->fp_status);
1470
        fload_invalid_op_excp(POWERPC_EXCP_FP_VXSNAN);
1467 1471
    }
1472
    farg.d = float64_div(float64_one, farg.d, &env->fp_status);
1473
    f32 = float64_to_float32(farg.d, &env->fp_status);
1474
    farg.d = float32_to_float64(f32, &env->fp_status);
1475

  
1468 1476
    return farg.ll;
1469 1477
}
1470 1478

  
......
1475 1483
    float32 f32;
1476 1484
    farg.ll = arg;
1477 1485

  
1478
    if (unlikely(float64_is_signaling_nan(farg.d))) {
1479
        /* sNaN reciprocal square root */
1480
        farg.ll = fload_invalid_op_excp(POWERPC_EXCP_FP_VXSNAN);
1481
    } else if (unlikely(float64_is_neg(farg.d) && !float64_is_zero(farg.d))) {
1486
    if (unlikely(float64_is_neg(farg.d) && !float64_is_zero(farg.d))) {
1482 1487
        /* Reciprocal square root of a negative nonzero number */
1483 1488
        farg.ll = fload_invalid_op_excp(POWERPC_EXCP_FP_VXSQRT);
1484 1489
    } else {
1490
        if (unlikely(float64_is_signaling_nan(farg.d))) {
1491
            /* sNaN reciprocal square root */
1492
            fload_invalid_op_excp(POWERPC_EXCP_FP_VXSNAN);
1493
        }
1485 1494
        farg.d = float64_sqrt(farg.d, &env->fp_status);
1486 1495
        farg.d = float64_div(float64_one, farg.d, &env->fp_status);
1487 1496
        f32 = float64_to_float32(farg.d, &env->fp_status);

Also available in: Unified diff