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