fpu_arith.c 3.0 KB

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