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 18 19void fadd__(void) 20{ 21 /* fadd st,st(i) */ 22 int i = FPU_rm; 23 clear_C1(); 24 FPU_add(&st(i), FPU_gettagi(i), 0, control_word); 25} 26 27 28void fmul__(void) 29{ 30 /* fmul st,st(i) */ 31 int i = FPU_rm; 32 clear_C1(); 33 FPU_mul(&st(i), FPU_gettagi(i), 0, control_word); 34} 35 36 37 38void fsub__(void) 39{ 40 /* fsub st,st(i) */ 41 clear_C1(); 42 FPU_sub(0, FPU_rm, control_word); 43} 44 45 46void fsubr_(void) 47{ 48 /* fsubr st,st(i) */ 49 clear_C1(); 50 FPU_sub(REV, FPU_rm, control_word); 51} 52 53 54void fdiv__(void) 55{ 56 /* fdiv st,st(i) */ 57 clear_C1(); 58 FPU_div(0, FPU_rm, control_word); 59} 60 61 62void fdivr_(void) 63{ 64 /* fdivr st,st(i) */ 65 clear_C1(); 66 FPU_div(REV, FPU_rm, control_word); 67} 68 69 70 71void fadd_i(void) 72{ 73 /* fadd st(i),st */ 74 int i = FPU_rm; 75 clear_C1(); 76 FPU_add(&st(i), FPU_gettagi(i), i, control_word); 77} 78 79 80void fmul_i(void) 81{ 82 /* fmul st(i),st */ 83 clear_C1(); 84 FPU_mul(&st(0), FPU_gettag0(), FPU_rm, control_word); 85} 86 87 88void fsubri(void) 89{ 90 /* fsubr st(i),st */ 91 clear_C1(); 92 FPU_sub(DEST_RM, FPU_rm, control_word); 93} 94 95 96void fsub_i(void) 97{ 98 /* fsub st(i),st */ 99 clear_C1(); 100 FPU_sub(REV|DEST_RM, FPU_rm, control_word); 101} 102 103 104void fdivri(void) 105{ 106 /* fdivr st(i),st */ 107 clear_C1(); 108 FPU_div(DEST_RM, FPU_rm, control_word); 109} 110 111 112void fdiv_i(void) 113{ 114 /* fdiv st(i),st */ 115 clear_C1(); 116 FPU_div(REV|DEST_RM, FPU_rm, control_word); 117} 118 119 120 121void faddp_(void) 122{ 123 /* faddp st(i),st */ 124 int i = FPU_rm; 125 clear_C1(); 126 if ( FPU_add(&st(i), FPU_gettagi(i), i, control_word) >= 0 ) 127 FPU_pop(); 128} 129 130 131void fmulp_(void) 132{ 133 /* fmulp st(i),st */ 134 clear_C1(); 135 if ( FPU_mul(&st(0), FPU_gettag0(), FPU_rm, control_word) >= 0 ) 136 FPU_pop(); 137} 138 139 140 141void fsubrp(void) 142{ 143 /* fsubrp st(i),st */ 144 clear_C1(); 145 if ( FPU_sub(DEST_RM, FPU_rm, control_word) >= 0 ) 146 FPU_pop(); 147} 148 149 150void fsubp_(void) 151{ 152 /* fsubp st(i),st */ 153 clear_C1(); 154 if ( FPU_sub(REV|DEST_RM, FPU_rm, control_word) >= 0 ) 155 FPU_pop(); 156} 157 158 159void fdivrp(void) 160{ 161 /* fdivrp st(i),st */ 162 clear_C1(); 163 if ( FPU_div(DEST_RM, FPU_rm, control_word) >= 0 ) 164 FPU_pop(); 165} 166 167 168void fdivp_(void) 169{ 170 /* fdivp st(i),st */ 171 clear_C1(); 172 if ( FPU_div(REV|DEST_RM, FPU_rm, control_word) >= 0 ) 173 FPU_pop(); 174} 175