home *** CD-ROM | disk | FTP | other *** search
/ APDL Public Domain 1 / APDL_PD1A.iso / program / assembler / as / src / c / m_fpu < prev    next >
Encoding:
Text File  |  1992-07-20  |  4.6 KB  |  296 lines

  1.  
  2. /*
  3.  * m_fpu.c
  4.  * Copyright © 1992 Niklas Röjemo
  5.  */
  6.  
  7. #include "mnemonics.h"
  8. #include "error.h"
  9. #include "option.h"
  10. #include "input.h"
  11. #include "expr.h"
  12. #include "code.h"
  13. #include "get.h"
  14. #include "put.h"
  15. #include "area.h"
  16. #include "value.h"
  17. #include "m_fpu.h"
  18. #include "fix.h"
  19. #include "reloc.h"
  20.  
  21. WORD fpuImm(FLOAT d)
  22. {
  23.          if(d == 0.0) { return 0;
  24.   } else if(d == 1.0) { return 1;
  25.   } else if(d == 2.0) { return 2;
  26.   } else if(d == 3.0) { return 3;
  27.   } else if(d == 4.0) { return 4;
  28.   } else if(d == 5.0) { return 5;
  29.   } else if(d == 0.5) { return 6;
  30.   } else if(d ==10.0) { return 7;
  31.   } else return -1;
  32. }
  33.  
  34. static WORD getFloatRhs(WORD ir)
  35. {
  36.   Value im;
  37.   if(inputLook() == '#') {
  38.     inputSkip();
  39.     exprBuild();
  40.     ir |= 8;  /* Immediate Float */
  41.     im = exprEval(ValueFloat | ValueLateLabel|ValueCode);
  42.     switch(im.Tag) {
  43.     case ValueFloat:
  44.       ir = fixImmFloat(inputLineNo,ir,im.ValueFloat.f);
  45.       break;
  46.     case ValueLateLabel: case ValueCode:
  47.       relocImmFloat(ir,im);
  48.       break;
  49.     default:
  50.       error(ErrorError,TRUE,"Illegal float immediate.");
  51.       break;
  52.     }
  53.   } else {
  54.     ir |= getFpuReg();
  55.   }
  56.   return ir;
  57. }
  58.  
  59. /** DATA dyadic **/
  60.  
  61. static void dstlhsrhs(unsigned int ir)
  62. {
  63.   unsigned int op;
  64.   op = getFpuReg();
  65.   ir |= DST_OP(op);
  66.   skipblanks();
  67.   if(inputLook() == ',') {inputSkip(); skipblanks();}
  68.   else error(ErrorError,TRUE,"Inserting a comma after dst.");
  69.   op = getFpuReg();
  70.   ir |= LHS_OP(op);
  71.   skipblanks();
  72.   if(inputLook() == ',') {inputSkip(); skipblanks();}
  73.   else error(ErrorError,TRUE,"Inserting a comma after lhs.");
  74.   putIns(getFloatRhs(ir));
  75. }
  76.  
  77.  
  78. void m_adf(unsigned int cc)
  79. {
  80.   dstlhsrhs(M_ADF | cc);
  81. }
  82.  
  83. void m_dvf(unsigned int cc)
  84. {
  85.   dstlhsrhs(M_DVF | cc);
  86. }
  87.  
  88. void m_fdv(unsigned int cc)
  89. {
  90.   dstlhsrhs(M_FDV | cc);
  91. }
  92.  
  93. void m_fml(unsigned int cc)
  94. {
  95.   dstlhsrhs(M_FML | cc);
  96. }
  97.  
  98. void m_frd(unsigned int cc)
  99. {
  100.   dstlhsrhs(M_FRD | cc);
  101. }
  102.  
  103. void m_muf(unsigned int cc)
  104. {
  105.   dstlhsrhs(M_MUF | cc);
  106. }
  107.  
  108. void m_pol(unsigned int cc)
  109. {
  110.   dstlhsrhs(M_POL | cc);
  111. }
  112.  
  113. void m_pow(unsigned int cc)
  114. {
  115.   dstlhsrhs(M_POW | cc);
  116. }
  117.  
  118. void m_rdf(unsigned int cc)
  119. {
  120.   dstlhsrhs(M_RDF | cc);
  121. }
  122.  
  123. void m_rmf(unsigned int cc)
  124. {
  125.   dstlhsrhs(M_RMF | cc);
  126. }
  127.  
  128. void m_rpw(unsigned int cc)
  129. {
  130.   dstlhsrhs(M_RPW | cc);
  131. }
  132.  
  133. void m_rsf(unsigned int cc)
  134. {
  135.   dstlhsrhs(M_RSF | cc);
  136. }
  137.  
  138. void m_suf(unsigned int cc)
  139. {
  140.   dstlhsrhs(M_SUF | cc);
  141. }
  142.  
  143.  
  144. /** DATA monadic **/
  145.  
  146. static void dstrhs(unsigned int ir)
  147. {
  148.   unsigned int op;
  149.   op = getFpuReg();
  150.   ir |= DST_OP(op);
  151.   skipblanks();
  152.   if(inputLook() == ',') {inputSkip(); skipblanks();}
  153.   else error(ErrorError,TRUE,"Inserting a comma after dst.");
  154.   putIns(getFloatRhs(ir));
  155. }
  156.  
  157. void m_abs(unsigned int cc)
  158. {
  159.   dstrhs(M_ABS | cc);
  160. }
  161.  
  162. void m_acs(unsigned int cc)
  163. {
  164.   dstrhs(M_ACS | cc);
  165. }
  166.  
  167. void m_asn(unsigned int cc)
  168. {
  169.   dstrhs(M_ASN | cc);
  170. }
  171.  
  172. void m_atn(unsigned int cc)
  173. {
  174.   dstrhs(M_ATN | cc);
  175. }
  176.  
  177. void m_cos(unsigned int cc)
  178. {
  179.   dstrhs(M_COS | cc);
  180. }
  181.  
  182. void m_exp(unsigned int cc)
  183. {
  184.   dstrhs(M_EXP | cc);
  185. }
  186.  
  187. void m_lgn(unsigned int cc)
  188. {
  189.   dstrhs(M_LGN | cc);
  190. }
  191.  
  192. void m_log(unsigned int cc)
  193. {
  194.   dstrhs(M_LOG | cc);
  195. }
  196.  
  197. void m_mnf(unsigned int cc)
  198. {
  199.   dstrhs(M_MNF | cc);
  200. }
  201.  
  202. void m_mvf(unsigned int cc)
  203. {
  204.   dstrhs(M_MVF | cc);
  205. }
  206.  
  207. void m_rnd(unsigned int cc)
  208. {
  209.   dstrhs(M_RND | cc);
  210. }
  211.  
  212. void m_sin(unsigned int cc)
  213. {
  214.   dstrhs(M_SIN | cc);
  215. }
  216.  
  217. void m_sqt(unsigned int cc)
  218. {
  219.   dstrhs(M_SQT | cc);
  220. }
  221.  
  222. void m_tan(unsigned int cc)
  223. {
  224.   dstrhs(M_TAN | cc);
  225. }
  226.  
  227. /** REGISTER TRANSFER **/
  228.  
  229. void m_fix(unsigned int cc)
  230. {
  231.   unsigned int ir = M_FIX | cc;
  232.   ir |= DST_OP(getCpuReg());
  233.   skipblanks();
  234.   if(inputLook() == ',') {inputSkip(); skipblanks();}
  235.   else error(ErrorError,TRUE,"Inserting a comma after dst.");
  236.   putIns(getFloatRhs(ir));
  237. }
  238.  
  239. void m_flt(unsigned int cc)
  240. {
  241.   unsigned int ir = M_FLT | cc;
  242.   ir |= DST_OP(getFpuReg());
  243.   skipblanks();
  244.   if(inputLook() == ',') {inputSkip(); skipblanks();}
  245.   else error(ErrorError,TRUE,"Inserting a comma after dst.");
  246.   ir |= LHS_OP(getCpuReg());
  247.   putIns(ir);
  248. }
  249.  
  250. void flagtransfer(unsigned int ir)
  251. {
  252.   unsigned int op;
  253.   op = getCpuReg();
  254.   ir |= DST_OP(op);
  255.   putIns(ir);
  256. }
  257.  
  258. void m_wfs(unsigned int cc)
  259. {
  260.   flagtransfer(M_WFS | cc);
  261. }
  262.  
  263. void m_rfs(unsigned int cc)
  264. {
  265.   flagtransfer(M_RFS | cc);
  266. }
  267.  
  268. void m_wfc(unsigned int cc)
  269. {
  270.   flagtransfer(M_WFC | cc);
  271. }
  272.  
  273. void m_rfc(unsigned int cc)
  274. {
  275.   flagtransfer(M_RFC | cc);
  276. }
  277.  
  278. void comparelow(unsigned int ir) /* No precision and no rounding allowed ? */
  279. {
  280.   ir |= LHS_OP(getFpuReg());
  281.   skipblanks();
  282.   if(inputLook() == ',') {inputSkip(); skipblanks();}
  283.   else error(ErrorError,TRUE,"Inserting a comma after lhs.");
  284.   putIns(getFloatRhs(ir));
  285. }
  286.  
  287. void m_cmf(unsigned int cc)
  288. {
  289.   comparelow(M_CMF | cc);
  290. }
  291.  
  292. void m_cnf(unsigned int cc)
  293. {
  294.   comparelow(M_CNF | cc);
  295. }
  296.