home *** CD-ROM | disk | FTP | other *** search
-
- /*
- * m_fpu.c
- * Copyright © 1992 Niklas Röjemo
- */
-
- #include "mnemonics.h"
- #include "error.h"
- #include "option.h"
- #include "input.h"
- #include "expr.h"
- #include "code.h"
- #include "get.h"
- #include "put.h"
- #include "area.h"
- #include "value.h"
- #include "m_fpu.h"
- #include "fix.h"
- #include "reloc.h"
-
- WORD fpuImm(FLOAT d)
- {
- if(d == 0.0) { return 0;
- } else if(d == 1.0) { return 1;
- } else if(d == 2.0) { return 2;
- } else if(d == 3.0) { return 3;
- } else if(d == 4.0) { return 4;
- } else if(d == 5.0) { return 5;
- } else if(d == 0.5) { return 6;
- } else if(d ==10.0) { return 7;
- } else return -1;
- }
-
- static WORD getFloatRhs(WORD ir)
- {
- Value im;
- if(inputLook() == '#') {
- inputSkip();
- exprBuild();
- ir |= 8; /* Immediate Float */
- im = exprEval(ValueFloat | ValueLateLabel|ValueCode);
- switch(im.Tag) {
- case ValueFloat:
- ir = fixImmFloat(inputLineNo,ir,im.ValueFloat.f);
- break;
- case ValueLateLabel: case ValueCode:
- relocImmFloat(ir,im);
- break;
- default:
- error(ErrorError,TRUE,"Illegal float immediate.");
- break;
- }
- } else {
- ir |= getFpuReg();
- }
- return ir;
- }
-
- /** DATA dyadic **/
-
- static void dstlhsrhs(unsigned int ir)
- {
- unsigned int op;
- op = getFpuReg();
- ir |= DST_OP(op);
- skipblanks();
- if(inputLook() == ',') {inputSkip(); skipblanks();}
- else error(ErrorError,TRUE,"Inserting a comma after dst.");
- op = getFpuReg();
- ir |= LHS_OP(op);
- skipblanks();
- if(inputLook() == ',') {inputSkip(); skipblanks();}
- else error(ErrorError,TRUE,"Inserting a comma after lhs.");
- putIns(getFloatRhs(ir));
- }
-
-
- void m_adf(unsigned int cc)
- {
- dstlhsrhs(M_ADF | cc);
- }
-
- void m_dvf(unsigned int cc)
- {
- dstlhsrhs(M_DVF | cc);
- }
-
- void m_fdv(unsigned int cc)
- {
- dstlhsrhs(M_FDV | cc);
- }
-
- void m_fml(unsigned int cc)
- {
- dstlhsrhs(M_FML | cc);
- }
-
- void m_frd(unsigned int cc)
- {
- dstlhsrhs(M_FRD | cc);
- }
-
- void m_muf(unsigned int cc)
- {
- dstlhsrhs(M_MUF | cc);
- }
-
- void m_pol(unsigned int cc)
- {
- dstlhsrhs(M_POL | cc);
- }
-
- void m_pow(unsigned int cc)
- {
- dstlhsrhs(M_POW | cc);
- }
-
- void m_rdf(unsigned int cc)
- {
- dstlhsrhs(M_RDF | cc);
- }
-
- void m_rmf(unsigned int cc)
- {
- dstlhsrhs(M_RMF | cc);
- }
-
- void m_rpw(unsigned int cc)
- {
- dstlhsrhs(M_RPW | cc);
- }
-
- void m_rsf(unsigned int cc)
- {
- dstlhsrhs(M_RSF | cc);
- }
-
- void m_suf(unsigned int cc)
- {
- dstlhsrhs(M_SUF | cc);
- }
-
-
- /** DATA monadic **/
-
- static void dstrhs(unsigned int ir)
- {
- unsigned int op;
- op = getFpuReg();
- ir |= DST_OP(op);
- skipblanks();
- if(inputLook() == ',') {inputSkip(); skipblanks();}
- else error(ErrorError,TRUE,"Inserting a comma after dst.");
- putIns(getFloatRhs(ir));
- }
-
- void m_abs(unsigned int cc)
- {
- dstrhs(M_ABS | cc);
- }
-
- void m_acs(unsigned int cc)
- {
- dstrhs(M_ACS | cc);
- }
-
- void m_asn(unsigned int cc)
- {
- dstrhs(M_ASN | cc);
- }
-
- void m_atn(unsigned int cc)
- {
- dstrhs(M_ATN | cc);
- }
-
- void m_cos(unsigned int cc)
- {
- dstrhs(M_COS | cc);
- }
-
- void m_exp(unsigned int cc)
- {
- dstrhs(M_EXP | cc);
- }
-
- void m_lgn(unsigned int cc)
- {
- dstrhs(M_LGN | cc);
- }
-
- void m_log(unsigned int cc)
- {
- dstrhs(M_LOG | cc);
- }
-
- void m_mnf(unsigned int cc)
- {
- dstrhs(M_MNF | cc);
- }
-
- void m_mvf(unsigned int cc)
- {
- dstrhs(M_MVF | cc);
- }
-
- void m_rnd(unsigned int cc)
- {
- dstrhs(M_RND | cc);
- }
-
- void m_sin(unsigned int cc)
- {
- dstrhs(M_SIN | cc);
- }
-
- void m_sqt(unsigned int cc)
- {
- dstrhs(M_SQT | cc);
- }
-
- void m_tan(unsigned int cc)
- {
- dstrhs(M_TAN | cc);
- }
-
- /** REGISTER TRANSFER **/
-
- void m_fix(unsigned int cc)
- {
- unsigned int ir = M_FIX | cc;
- ir |= DST_OP(getCpuReg());
- skipblanks();
- if(inputLook() == ',') {inputSkip(); skipblanks();}
- else error(ErrorError,TRUE,"Inserting a comma after dst.");
- putIns(getFloatRhs(ir));
- }
-
- void m_flt(unsigned int cc)
- {
- unsigned int ir = M_FLT | cc;
- ir |= DST_OP(getFpuReg());
- skipblanks();
- if(inputLook() == ',') {inputSkip(); skipblanks();}
- else error(ErrorError,TRUE,"Inserting a comma after dst.");
- ir |= LHS_OP(getCpuReg());
- putIns(ir);
- }
-
- void flagtransfer(unsigned int ir)
- {
- unsigned int op;
- op = getCpuReg();
- ir |= DST_OP(op);
- putIns(ir);
- }
-
- void m_wfs(unsigned int cc)
- {
- flagtransfer(M_WFS | cc);
- }
-
- void m_rfs(unsigned int cc)
- {
- flagtransfer(M_RFS | cc);
- }
-
- void m_wfc(unsigned int cc)
- {
- flagtransfer(M_WFC | cc);
- }
-
- void m_rfc(unsigned int cc)
- {
- flagtransfer(M_RFC | cc);
- }
-
- void comparelow(unsigned int ir) /* No precision and no rounding allowed ? */
- {
- ir |= LHS_OP(getFpuReg());
- skipblanks();
- if(inputLook() == ',') {inputSkip(); skipblanks();}
- else error(ErrorError,TRUE,"Inserting a comma after lhs.");
- putIns(getFloatRhs(ir));
- }
-
- void m_cmf(unsigned int cc)
- {
- comparelow(M_CMF | cc);
- }
-
- void m_cnf(unsigned int cc)
- {
- comparelow(M_CNF | cc);
- }
-