Add support for real power (**) in normal expressions.

This patch adds support for the real power (**) operator in
normal expressions.
This commit is contained in:
Cary R 2008-01-31 17:15:03 -08:00 committed by Stephen Williams
parent f049426f25
commit 1595ae79fd
5 changed files with 20 additions and 2 deletions

View File

@ -91,6 +91,9 @@ static int draw_binary_real(ivl_expr_t exp)
} }
break; break;
#endif #endif
case 'p':
fprintf(vvp_out, " %%pow/wr %d, %d;\n", l, r);
break;
default: default:
fprintf(stderr, "XXXX draw_binary_real(%c)\n", fprintf(stderr, "XXXX draw_binary_real(%c)\n",
ivl_expr_opcode(exp)); ivl_expr_opcode(exp));
@ -438,4 +441,3 @@ int draw_eval_real(ivl_expr_t exp)
return res; return res;
} }

View File

@ -114,6 +114,7 @@ extern bool of_NOR(vthread_t thr, vvp_code_t code);
extern bool of_NORR(vthread_t thr, vvp_code_t code); extern bool of_NORR(vthread_t thr, vvp_code_t code);
extern bool of_OR(vthread_t thr, vvp_code_t code); extern bool of_OR(vthread_t thr, vvp_code_t code);
extern bool of_ORR(vthread_t thr, vvp_code_t code); extern bool of_ORR(vthread_t thr, vvp_code_t code);
extern bool of_POW_WR(vthread_t thr, vvp_code_t code);
extern bool of_RELEASE_NET(vthread_t thr, vvp_code_t code); extern bool of_RELEASE_NET(vthread_t thr, vvp_code_t code);
extern bool of_RELEASE_REG(vthread_t thr, vvp_code_t code); extern bool of_RELEASE_REG(vthread_t thr, vvp_code_t code);
extern bool of_SET_AV(vthread_t thr, vvp_code_t code); extern bool of_SET_AV(vthread_t thr, vvp_code_t code);

View File

@ -161,6 +161,7 @@ const static struct opcode_table_s opcode_table[] = {
{ "%nor/r", of_NORR, 3, {OA_BIT1, OA_BIT2, OA_NUMBER} }, { "%nor/r", of_NORR, 3, {OA_BIT1, OA_BIT2, OA_NUMBER} },
{ "%or", of_OR, 3, {OA_BIT1, OA_BIT2, OA_NUMBER} }, { "%or", of_OR, 3, {OA_BIT1, OA_BIT2, OA_NUMBER} },
{ "%or/r", of_ORR, 3, {OA_BIT1, OA_BIT2, OA_NUMBER} }, { "%or/r", of_ORR, 3, {OA_BIT1, OA_BIT2, OA_NUMBER} },
{ "%pow/wr", of_POW_WR, 2, {OA_BIT1, OA_BIT2, OA_NONE} },
{ "%release/net",of_RELEASE_NET,1,{OA_FUNC_PTR,OA_NONE,OA_NONE} }, { "%release/net",of_RELEASE_NET,1,{OA_FUNC_PTR,OA_NONE,OA_NONE} },
{ "%release/reg",of_RELEASE_REG,1,{OA_FUNC_PTR,OA_NONE,OA_NONE} }, { "%release/reg",of_RELEASE_REG,1,{OA_FUNC_PTR,OA_NONE,OA_NONE} },
{ "%set/av", of_SET_AV, 3, {OA_ARR_PTR, OA_BIT1, OA_BIT2} }, { "%set/av", of_SET_AV, 3, {OA_ARR_PTR, OA_BIT1, OA_BIT2} },

View File

@ -570,6 +570,12 @@ and the <dst> is a writable scalar. The <dst> gets the value of the
or of all the bits of the src vector. or of all the bits of the src vector.
* %pow/wr <bit-l>, <bit-r>
This opcode raises <bit-l> (real) to the power of <bit-r> (real). The
result replaces the left operand.
* %release/net <functor-label> * %release/net <functor-label>
* %release/reg <functor-label> * %release/reg <functor-label>

View File

@ -3172,6 +3172,15 @@ bool of_NOR(vthread_t thr, vvp_code_t cp)
return true; return true;
} }
bool of_POW_WR(vthread_t thr, vvp_code_t cp)
{
double l = thr->words[cp->bit_idx[0]].w_real;
double r = thr->words[cp->bit_idx[1]].w_real;
thr->words[cp->bit_idx[0]].w_real = pow(l, r);
return true;
}
/* /*
* These implement the %release/net and %release/reg instructions. The * These implement the %release/net and %release/reg instructions. The
* %release/net instruction applies to a net kind of functor by * %release/net instruction applies to a net kind of functor by
@ -3686,4 +3695,3 @@ bool of_JOIN_UFUNC(vthread_t thr, vvp_code_t cp)
return true; return true;
} }