Revision af12906f target-ppc/op.c

b/target-ppc/op.c
261 261
}
262 262
#endif /* !defined(CONFIG_USER_ONLY) */
263 263

  
264
/* FPSCR */
265
#ifdef CONFIG_SOFTFLOAT
266
void OPPROTO op_reset_fpstatus (void)
267
{
268
    env->fp_status.float_exception_flags = 0;
269
    RETURN();
270
}
271
#endif
272

  
273
void OPPROTO op_compute_fprf (void)
274
{
275
    do_compute_fprf(PARAM1);
276
    RETURN();
277
}
278

  
279
#ifdef CONFIG_SOFTFLOAT
280
void OPPROTO op_float_check_status (void)
281
{
282
    do_float_check_status();
283
    RETURN();
284
}
285
#else
286
void OPPROTO op_float_check_status (void)
287
{
288
    if (env->exception_index == POWERPC_EXCP_PROGRAM &&
289
        (env->error_code & POWERPC_EXCP_FP)) {
290
        /* Differred floating-point exception after target FPR update */
291
        if (msr_fe0 != 0 || msr_fe1 != 0)
292
            do_raise_exception_err(env->exception_index, env->error_code);
293
    }
294
    RETURN();
295
}
296
#endif
297

  
298
void OPPROTO op_load_fpscr_FT0 (void)
299
{
300
    /* The 32 MSB of the target fpr are undefined.
301
     * They'll be zero...
302
     */
303
    CPU_DoubleU u;
304

  
305
    u.l.upper = 0;
306
    u.l.lower = env->fpscr;
307
    FT0 = u.d;
308
    RETURN();
309
}
310

  
311
void OPPROTO op_fpscr_resetbit (void)
312
{
313
    env->fpscr &= PARAM1;
314
    RETURN();
315
}
316

  
317
void OPPROTO op_fpscr_setbit (void)
318
{
319
    do_fpscr_setbit(PARAM1);
320
    RETURN();
321
}
322

  
323
void OPPROTO op_store_fpscr (void)
324
{
325
    do_store_fpscr(PARAM1);
326
    RETURN();
327
}
328

  
329 264
/***                             Integer shift                             ***/
330 265
void OPPROTO op_srli_T1 (void)
331 266
{
......
333 268
    RETURN();
334 269
}
335 270

  
336
/***                       Floating-Point arithmetic                       ***/
337
/* fadd - fadd. */
338
void OPPROTO op_fadd (void)
339
{
340
#if USE_PRECISE_EMULATION
341
    do_fadd();
342
#else
343
    FT0 = float64_add(FT0, FT1, &env->fp_status);
344
#endif
345
    RETURN();
346
}
347

  
348
/* fsub - fsub. */
349
void OPPROTO op_fsub (void)
350
{
351
#if USE_PRECISE_EMULATION
352
    do_fsub();
353
#else
354
    FT0 = float64_sub(FT0, FT1, &env->fp_status);
355
#endif
356
    RETURN();
357
}
358

  
359
/* fmul - fmul. */
360
void OPPROTO op_fmul (void)
361
{
362
#if USE_PRECISE_EMULATION
363
    do_fmul();
364
#else
365
    FT0 = float64_mul(FT0, FT1, &env->fp_status);
366
#endif
367
    RETURN();
368
}
369

  
370
/* fdiv - fdiv. */
371
void OPPROTO op_fdiv (void)
372
{
373
#if USE_PRECISE_EMULATION
374
    do_fdiv();
375
#else
376
    FT0 = float64_div(FT0, FT1, &env->fp_status);
377
#endif
378
    RETURN();
379
}
380

  
381
/* fsqrt - fsqrt. */
382
void OPPROTO op_fsqrt (void)
383
{
384
    do_fsqrt();
385
    RETURN();
386
}
387

  
388
/* fre - fre. */
389
void OPPROTO op_fre (void)
390
{
391
    do_fre();
392
    RETURN();
393
}
394

  
395
/* fres - fres. */
396
void OPPROTO op_fres (void)
397
{
398
    do_fres();
399
    RETURN();
400
}
401

  
402
/* frsqrte  - frsqrte. */
403
void OPPROTO op_frsqrte (void)
404
{
405
    do_frsqrte();
406
    RETURN();
407
}
408

  
409
/* fsel - fsel. */
410
void OPPROTO op_fsel (void)
411
{
412
    do_fsel();
413
    RETURN();
414
}
415

  
416
/***                     Floating-Point multiply-and-add                   ***/
417
/* fmadd - fmadd. */
418
void OPPROTO op_fmadd (void)
419
{
420
#if USE_PRECISE_EMULATION
421
    do_fmadd();
422
#else
423
    FT0 = float64_mul(FT0, FT1, &env->fp_status);
424
    FT0 = float64_add(FT0, FT2, &env->fp_status);
425
#endif
426
    RETURN();
427
}
428

  
429
/* fmsub - fmsub. */
430
void OPPROTO op_fmsub (void)
431
{
432
#if USE_PRECISE_EMULATION
433
    do_fmsub();
434
#else
435
    FT0 = float64_mul(FT0, FT1, &env->fp_status);
436
    FT0 = float64_sub(FT0, FT2, &env->fp_status);
437
#endif
438
    RETURN();
439
}
440

  
441
/* fnmadd - fnmadd. - fnmadds - fnmadds. */
442
void OPPROTO op_fnmadd (void)
443
{
444
    do_fnmadd();
445
    RETURN();
446
}
447

  
448
/* fnmsub - fnmsub. */
449
void OPPROTO op_fnmsub (void)
450
{
451
    do_fnmsub();
452
    RETURN();
453
}
454

  
455
/***                     Floating-Point round & convert                    ***/
456
/* frsp - frsp. */
457
void OPPROTO op_frsp (void)
458
{
459
#if USE_PRECISE_EMULATION
460
    do_frsp();
461
#else
462
    FT0 = float64_to_float32(FT0, &env->fp_status);
463
#endif
464
    RETURN();
465
}
466

  
467
/* fctiw - fctiw. */
468
void OPPROTO op_fctiw (void)
469
{
470
    do_fctiw();
471
    RETURN();
472
}
473

  
474
/* fctiwz - fctiwz. */
475
void OPPROTO op_fctiwz (void)
476
{
477
    do_fctiwz();
478
    RETURN();
479
}
480

  
481
#if defined(TARGET_PPC64)
482
/* fcfid - fcfid. */
483
void OPPROTO op_fcfid (void)
484
{
485
    do_fcfid();
486
    RETURN();
487
}
488

  
489
/* fctid - fctid. */
490
void OPPROTO op_fctid (void)
491
{
492
    do_fctid();
493
    RETURN();
494
}
495

  
496
/* fctidz - fctidz. */
497
void OPPROTO op_fctidz (void)
498
{
499
    do_fctidz();
500
    RETURN();
501
}
502
#endif
503

  
504
void OPPROTO op_frin (void)
505
{
506
    do_frin();
507
    RETURN();
508
}
509

  
510
void OPPROTO op_friz (void)
511
{
512
    do_friz();
513
    RETURN();
514
}
515

  
516
void OPPROTO op_frip (void)
517
{
518
    do_frip();
519
    RETURN();
520
}
521

  
522
void OPPROTO op_frim (void)
523
{
524
    do_frim();
525
    RETURN();
526
}
527

  
528
/***                         Floating-point move                           ***/
529
/* fabs */
530
void OPPROTO op_fabs (void)
531
{
532
    FT0 = float64_abs(FT0);
533
    RETURN();
534
}
535

  
536
/* fnabs */
537
void OPPROTO op_fnabs (void)
538
{
539
    FT0 = float64_abs(FT0);
540
    FT0 = float64_chs(FT0);
541
    RETURN();
542
}
543

  
544
/* fneg */
545
void OPPROTO op_fneg (void)
546
{
547
    FT0 = float64_chs(FT0);
548
    RETURN();
549
}
550

  
551 271
/* Load and store */
552 272
#define MEMSUFFIX _raw
553 273
#include "op_helper.h"

Also available in: Unified diff