linux/arch/x86/math-emu/fpu_arith.c
<<
>>
Prefs
   1/*---------------------------------------------------------------------------+
   2 |  fpu_arith.c                                                              |
   3 |                                                                           |
   4 | Code to implement the FPU register/register arithmetic instructions       |
   5 |                                                                           |
   6 | Copyright (C) 1992,1993,1997                                              |
   7 |                  W. Metzenthen, 22 Parker St, Ormond, Vic 3163, Australia |
   8 |                  E-mail   billm@suburbia.net                              |
   9 |                                                                           |
  10 |                                                                           |
  11 +---------------------------------------------------------------------------*/
  12
  13#include "fpu_system.h"
  14#include "fpu_emu.h"
  15#include "control_w.h"
  16#include "status_w.h"
  17
  18void fadd__(void)
  19{
  20        /* fadd st,st(i) */
  21        int i = FPU_rm;
  22        clear_C1();
  23        FPU_add(&st(i), FPU_gettagi(i), 0, control_word);
  24}
  25
  26void fmul__(void)
  27{
  28        /* fmul st,st(i) */
  29        int i = FPU_rm;
  30        clear_C1();
  31        FPU_mul(&st(i), FPU_gettagi(i), 0, control_word);
  32}
  33
  34void fsub__(void)
  35{
  36        /* fsub st,st(i) */
  37        clear_C1();
  38        FPU_sub(0, FPU_rm, control_word);
  39}
  40
  41void fsubr_(void)
  42{
  43        /* fsubr st,st(i) */
  44        clear_C1();
  45        FPU_sub(REV, FPU_rm, control_word);
  46}
  47
  48void fdiv__(void)
  49{
  50        /* fdiv st,st(i) */
  51        clear_C1();
  52        FPU_div(0, FPU_rm, control_word);
  53}
  54
  55void fdivr_(void)
  56{
  57        /* fdivr st,st(i) */
  58        clear_C1();
  59        FPU_div(REV, FPU_rm, control_word);
  60}
  61
  62void fadd_i(void)
  63{
  64        /* fadd st(i),st */
  65        int i = FPU_rm;
  66        clear_C1();
  67        FPU_add(&st(i), FPU_gettagi(i), i, control_word);
  68}
  69
  70void fmul_i(void)
  71{
  72        /* fmul st(i),st */
  73        clear_C1();
  74        FPU_mul(&st(0), FPU_gettag0(), FPU_rm, control_word);
  75}
  76
  77void fsubri(void)
  78{
  79        /* fsubr st(i),st */
  80        clear_C1();
  81        FPU_sub(DEST_RM, FPU_rm, control_word);
  82}
  83
  84void fsub_i(void)
  85{
  86        /* fsub st(i),st */
  87        clear_C1();
  88        FPU_sub(REV | DEST_RM, FPU_rm, control_word);
  89}
  90
  91void fdivri(void)
  92{
  93        /* fdivr st(i),st */
  94        clear_C1();
  95        FPU_div(DEST_RM, FPU_rm, control_word);
  96}
  97
  98void fdiv_i(void)
  99{
 100        /* fdiv st(i),st */
 101        clear_C1();
 102        FPU_div(REV | DEST_RM, FPU_rm, control_word);
 103}
 104
 105void faddp_(void)
 106{
 107        /* faddp st(i),st */
 108        int i = FPU_rm;
 109        clear_C1();
 110        if (FPU_add(&st(i), FPU_gettagi(i), i, control_word) >= 0)
 111                FPU_pop();
 112}
 113
 114void fmulp_(void)
 115{
 116        /* fmulp st(i),st */
 117        clear_C1();
 118        if (FPU_mul(&st(0), FPU_gettag0(), FPU_rm, control_word) >= 0)
 119                FPU_pop();
 120}
 121
 122void fsubrp(void)
 123{
 124        /* fsubrp st(i),st */
 125        clear_C1();
 126        if (FPU_sub(DEST_RM, FPU_rm, control_word) >= 0)
 127                FPU_pop();
 128}
 129
 130void fsubp_(void)
 131{
 132        /* fsubp st(i),st */
 133        clear_C1();
 134        if (FPU_sub(REV | DEST_RM, FPU_rm, control_word) >= 0)
 135                FPU_pop();
 136}
 137
 138void fdivrp(void)
 139{
 140        /* fdivrp st(i),st */
 141        clear_C1();
 142        if (FPU_div(DEST_RM, FPU_rm, control_word) >= 0)
 143                FPU_pop();
 144}
 145
 146void fdivp_(void)
 147{
 148        /* fdivp st(i),st */
 149        clear_C1();
 150        if (FPU_div(REV | DEST_RM, FPU_rm, control_word) >= 0)
 151                FPU_pop();
 152}
 153