From 5f26ba906db16f4cc047b0805fe70d81084c6f02 Mon Sep 17 00:00:00 2001 From: Jeremy Rand Date: Thu, 26 Sep 2013 16:20:06 -0400 Subject: [PATCH] Add R2B and B2R operations --- Make.engine | 5 ++++- ops/abCOp.c | 6 ++++++ ops/abCOpB2R.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ ops/abCOpB2R.h | 14 ++++++++++++++ ops/abCOpR2B.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ ops/abCOpR2B.h | 14 ++++++++++++++ 6 files changed, 134 insertions(+), 1 deletion(-) create mode 100644 ops/abCOpB2R.c create mode 100644 ops/abCOpB2R.h create mode 100644 ops/abCOpR2B.c create mode 100644 ops/abCOpR2B.h diff --git a/Make.engine b/Make.engine index 4d21a85..2e48330 100644 --- a/Make.engine +++ b/Make.engine @@ -16,7 +16,8 @@ OPS_OBJS=ops/abCOp.o ops/abCOpAdd.o ops/abCOpSubtr.o ops/abCOpMult.o \ ops/abCOpSwap.o ops/abCOpSin.o ops/abCOpCos.o ops/abCOpTan.o ops/abCOpAsin.o \ ops/abCOpAcos.o ops/abCOpAtan.o ops/abCOpSq.o ops/abCOpSqrt.o ops/abCOpPi.o \ ops/abCOpLog.o ops/abCOpAlog.o ops/abCOpLn.o ops/abCOpExp.o ops/abCOpSinh.o \ - ops/abCOpCosh.o ops/abCOpTanh.o ops/abCOpClear.o + ops/abCOpCosh.o ops/abCOpTanh.o ops/abCOpClear.o ops/abCOpR2B.o \ + ops/abCOpB2R.o SHELL_OBJS=abCMain.o $(CALC_OBJS) $(EXPR_OBJS) $(OPS_OBJS) @@ -88,4 +89,6 @@ ops/abCOpSinh.o: ops/abCOp.h abCError.h abCStack.h expr/abCExpr.h expr/abCExpRea ops/abCOpCosh.o: ops/abCOp.h abCError.h abCStack.h expr/abCExpr.h expr/abCExpReal.h ops/abCOpCosh.h ops/abCOpTanh.o: ops/abCOp.h abCError.h abCStack.h expr/abCExpr.h expr/abCExpReal.h ops/abCOpTanh.h ops/abCOpClear.o: ops/abCOp.h abCStack.h ops/abCOpClear.h +ops/abCOpR2B.o: ops/abCOp.h abCStack.h abCError.h expr/abCExpr.h expr/abCExpReal.h expr/abCExprInt.h ops/abCOp.h ops/abCOpR2B.h +ops/abCOpB2R.o: ops/abCOp.h abCStack.h abCError.h expr/abCExpr.h expr/abCExpReal.h expr/abCExprInt.h ops/abCOp.h ops/abCOpB2R.h diff --git a/ops/abCOp.c b/ops/abCOp.c index 550895a..aeee3e2 100644 --- a/ops/abCOp.c +++ b/ops/abCOp.c @@ -45,6 +45,9 @@ #include "ops/abCOpCosh.h" #include "ops/abCOpTanh.h" +#include "ops/abCOpR2B.h" +#include "ops/abCOpB2R.h" + #include "ops/abCOpAnd.h" #include "ops/abCOpOr.h" #include "ops/abCOpXor.h" @@ -105,6 +108,9 @@ void abCalcOpInit(void) abCalcOpCoshInit(); abCalcOpTanhInit(); + abCalcOpR2BInit(); + abCalcOpB2RInit(); + abCalcOpAndInit(); abCalcOpOrInit(); abCalcOpXorInit(); diff --git a/ops/abCOpB2R.c b/ops/abCOpB2R.c new file mode 100644 index 0000000..99a6700 --- /dev/null +++ b/ops/abCOpB2R.c @@ -0,0 +1,48 @@ +/* + abCOpB2R.c + By: Jeremy Rand + */ + + +#include + +#include "abCError.h" +#include "abCStack.h" + +#include "expr/abCExpr.h" +#include "expr/abCExpReal.h" +#include "expr/abCExprInt.h" + +#include "ops/abCOp.h" +#include "ops/abCOpB2R.h" + + +#define B2R_NAME "B2R" + + +static void b2rExecute(void); + + +void abCalcOpB2RInit(void) +{ + abCalcOpRegister(B2R_NAME, b2rExecute); +} + + +void b2rExecute(void) +{ + abCalcExpr result; + int width; + int topBit; + AB_CALC_OP_ONE_ARG(B2R_NAME); + + if (expr->type != abCalcExprTypeInt) { + abCalcRaiseError(abCalcBadArgTypeError, B2R_NAME); + return; + } + + abCalcExprRealSet(&result, (abCalcRealType)expr->u.integer); + + abCalcStackExprPop(NULL); + abCalcStackExprPush(&result); +} diff --git a/ops/abCOpB2R.h b/ops/abCOpB2R.h new file mode 100644 index 0000000..1029e1c --- /dev/null +++ b/ops/abCOpB2R.h @@ -0,0 +1,14 @@ +/* + abCOpB2R.h + By: Jeremy Rand + */ + + +#ifndef ABCOPB2R_H +#define ABCOPB2R_H + + +void abCalcOpB2RInit(void); + + +#endif diff --git a/ops/abCOpR2B.c b/ops/abCOpR2B.c new file mode 100644 index 0000000..5b18989 --- /dev/null +++ b/ops/abCOpR2B.c @@ -0,0 +1,48 @@ +/* + abCOpR2B.c + By: Jeremy Rand + */ + + +#include + +#include "abCError.h" +#include "abCStack.h" + +#include "expr/abCExpr.h" +#include "expr/abCExpReal.h" +#include "expr/abCExprInt.h" + +#include "ops/abCOp.h" +#include "ops/abCOpR2B.h" + + +#define R2B_NAME "R2B" + + +static void r2bExecute(void); + + +void abCalcOpR2BInit(void) +{ + abCalcOpRegister(R2B_NAME, r2bExecute); +} + + +void r2bExecute(void) +{ + abCalcExpr result; + int width; + int topBit; + AB_CALC_OP_ONE_ARG(R2B_NAME); + + if (expr->type != abCalcExprTypeReal) { + abCalcRaiseError(abCalcBadArgTypeError, R2B_NAME); + return; + } + + abCalcExprIntSet(&result, (abCalcIntType)expr->u.real); + + abCalcStackExprPop(NULL); + abCalcStackExprPush(&result); +} diff --git a/ops/abCOpR2B.h b/ops/abCOpR2B.h new file mode 100644 index 0000000..4b8c87e --- /dev/null +++ b/ops/abCOpR2B.h @@ -0,0 +1,14 @@ +/* + abCOpR2B.h + By: Jeremy Rand + */ + + +#ifndef ABCOPR2B_H +#define ABCOPR2B_H + + +void abCalcOpR2BInit(void); + + +#endif