Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 /*---------------------------------------------------------------------------+
0003  |  fpu_arith.c                                                              |
0004  |                                                                           |
0005  | Code to implement the FPU register/register arithmetic instructions       |
0006  |                                                                           |
0007  | Copyright (C) 1992,1993,1997                                              |
0008  |                  W. Metzenthen, 22 Parker St, Ormond, Vic 3163, Australia |
0009  |                  E-mail   billm@suburbia.net                              |
0010  |                                                                           |
0011  |                                                                           |
0012  +---------------------------------------------------------------------------*/
0013 
0014 #include "fpu_system.h"
0015 #include "fpu_emu.h"
0016 #include "control_w.h"
0017 #include "status_w.h"
0018 
0019 void fadd__(void)
0020 {
0021     /* fadd st,st(i) */
0022     int i = FPU_rm;
0023     clear_C1();
0024     FPU_add(&st(i), FPU_gettagi(i), 0, control_word);
0025 }
0026 
0027 void fmul__(void)
0028 {
0029     /* fmul st,st(i) */
0030     int i = FPU_rm;
0031     clear_C1();
0032     FPU_mul(&st(i), FPU_gettagi(i), 0, control_word);
0033 }
0034 
0035 void fsub__(void)
0036 {
0037     /* fsub st,st(i) */
0038     clear_C1();
0039     FPU_sub(0, FPU_rm, control_word);
0040 }
0041 
0042 void fsubr_(void)
0043 {
0044     /* fsubr st,st(i) */
0045     clear_C1();
0046     FPU_sub(REV, FPU_rm, control_word);
0047 }
0048 
0049 void fdiv__(void)
0050 {
0051     /* fdiv st,st(i) */
0052     clear_C1();
0053     FPU_div(0, FPU_rm, control_word);
0054 }
0055 
0056 void fdivr_(void)
0057 {
0058     /* fdivr st,st(i) */
0059     clear_C1();
0060     FPU_div(REV, FPU_rm, control_word);
0061 }
0062 
0063 void fadd_i(void)
0064 {
0065     /* fadd st(i),st */
0066     int i = FPU_rm;
0067     clear_C1();
0068     FPU_add(&st(i), FPU_gettagi(i), i, control_word);
0069 }
0070 
0071 void fmul_i(void)
0072 {
0073     /* fmul st(i),st */
0074     clear_C1();
0075     FPU_mul(&st(0), FPU_gettag0(), FPU_rm, control_word);
0076 }
0077 
0078 void fsubri(void)
0079 {
0080     /* fsubr st(i),st */
0081     clear_C1();
0082     FPU_sub(DEST_RM, FPU_rm, control_word);
0083 }
0084 
0085 void fsub_i(void)
0086 {
0087     /* fsub st(i),st */
0088     clear_C1();
0089     FPU_sub(REV | DEST_RM, FPU_rm, control_word);
0090 }
0091 
0092 void fdivri(void)
0093 {
0094     /* fdivr st(i),st */
0095     clear_C1();
0096     FPU_div(DEST_RM, FPU_rm, control_word);
0097 }
0098 
0099 void fdiv_i(void)
0100 {
0101     /* fdiv st(i),st */
0102     clear_C1();
0103     FPU_div(REV | DEST_RM, FPU_rm, control_word);
0104 }
0105 
0106 void faddp_(void)
0107 {
0108     /* faddp st(i),st */
0109     int i = FPU_rm;
0110     clear_C1();
0111     if (FPU_add(&st(i), FPU_gettagi(i), i, control_word) >= 0)
0112         FPU_pop();
0113 }
0114 
0115 void fmulp_(void)
0116 {
0117     /* fmulp st(i),st */
0118     clear_C1();
0119     if (FPU_mul(&st(0), FPU_gettag0(), FPU_rm, control_word) >= 0)
0120         FPU_pop();
0121 }
0122 
0123 void fsubrp(void)
0124 {
0125     /* fsubrp st(i),st */
0126     clear_C1();
0127     if (FPU_sub(DEST_RM, FPU_rm, control_word) >= 0)
0128         FPU_pop();
0129 }
0130 
0131 void fsubp_(void)
0132 {
0133     /* fsubp st(i),st */
0134     clear_C1();
0135     if (FPU_sub(REV | DEST_RM, FPU_rm, control_word) >= 0)
0136         FPU_pop();
0137 }
0138 
0139 void fdivrp(void)
0140 {
0141     /* fdivrp st(i),st */
0142     clear_C1();
0143     if (FPU_div(DEST_RM, FPU_rm, control_word) >= 0)
0144         FPU_pop();
0145 }
0146 
0147 void fdivp_(void)
0148 {
0149     /* fdivp st(i),st */
0150     clear_C1();
0151     if (FPU_div(REV | DEST_RM, FPU_rm, control_word) >= 0)
0152         FPU_pop();
0153 }