#include <string.h>
+
+#include "ast.h"
+#include "fold.h"
#include "parser.h"
lex_ctx_t intrin::ctx() const {
ctx(),
INSTR_NE_F,
(ast_expression*)x,
- (ast_expression*)m_fold->imm_float[0]
+ (ast_expression*)m_fold->m_imm_float[0]
),
(ast_expression*)ast_binary_new(
ctx(),
ctx(),
INSTR_LT,
(ast_expression*)x,
- (ast_expression*)m_fold->imm_float[0]
+ (ast_expression*)m_fold->m_imm_float[0]
),
- (ast_expression*)m_fold->imm_float[1],
- (ast_expression*)m_fold->imm_float[0]
+ (ast_expression*)m_fold->m_imm_float[1],
+ (ast_expression*)m_fold->m_imm_float[0]
)
)
);
(ast_expression*)x,
(ast_expression*)x
),
- (ast_expression*)m_fold->imm_float[1]
+ (ast_expression*)m_fold->m_imm_float[1]
)
);
(ast_expression*)x,
(ast_expression*)x
),
- (ast_expression*)m_fold->imm_float[1]
+ (ast_expression*)m_fold->m_imm_float[1]
)
);
(ast_expression*)ast_binary_new(
ctx(),
INSTR_ADD_F,
- (ast_expression*)m_fold->imm_float[1],
+ (ast_expression*)m_fold->m_imm_float[1],
(ast_expression*)x
),
(ast_expression*)ast_binary_new(
ctx(),
INSTR_SUB_F,
- (ast_expression*)m_fold->imm_float[1],
+ (ast_expression*)m_fold->m_imm_float[1],
(ast_expression*)x
)
)
(ast_expression*)ast_binary_new(
ctx(),
INSTR_MUL_F,
- (ast_expression*)fold_constgen_float(m_fold, 0.5, false),
+ (ast_expression*)m_fold->constgen_float(0.5, false),
(ast_expression*)calllog
)
);
ctx(),
INSTR_STORE_F,
(ast_expression*)sum,
- (ast_expression*)m_fold->imm_float[1]
+ (ast_expression*)m_fold->m_imm_float[1]
)
);
ctx(),
INSTR_STORE_F,
(ast_expression*)acc,
- (ast_expression*)m_fold->imm_float[1]
+ (ast_expression*)m_fold->m_imm_float[1]
)
);
ctx(),
INSTR_STORE_F,
(ast_expression*)i,
- (ast_expression*)m_fold->imm_float[1]
+ (ast_expression*)m_fold->m_imm_float[1]
),
/* i < 200; */
(ast_expression*)ast_binary_new(
ctx(),
INSTR_LT,
(ast_expression*)i,
- (ast_expression*)fold_constgen_float(m_fold, 200.0f, false)
+ (ast_expression*)m_fold->constgen_float(200.0f, false)
),
false,
nullptr,
INSTR_STORE_F,
INSTR_ADD_F,
(ast_expression*)i,
- (ast_expression*)m_fold->imm_float[1]
+ (ast_expression*)m_fold->m_imm_float[1]
),
/* sum += (acc *= (x / i)) */
(ast_expression*)ast_binstore_new(
val->expression.params.push_back(arg1);
- callpow->params.push_back((ast_expression*)m_fold->imm_float[3]);
+ callpow->params.push_back((ast_expression*)m_fold->m_imm_float[3]);
callpow->params.push_back((ast_expression*)arg1);
/* return <callpow> */
ctx(),
INSTR_SUB_F,
(ast_expression*)callexp,
- (ast_expression*)m_fold->imm_float[1]
+ (ast_expression*)m_fold->m_imm_float[1]
)
)
);
ctx(),
INSTR_EQ_F,
(ast_expression*)exp,
- (ast_expression*)m_fold->imm_float[0]
+ (ast_expression*)m_fold->m_imm_float[0]
),
(ast_expression*)ast_return_new(
ctx(),
- (ast_expression*)m_fold->imm_float[1]
+ (ast_expression*)m_fold->m_imm_float[1]
),
nullptr
)
ctx(),
INSTR_EQ_F,
(ast_expression*)exp,
- (ast_expression*)m_fold->imm_float[1]
+ (ast_expression*)m_fold->m_imm_float[1]
),
(ast_expression*)ast_return_new(
ctx(),
ctx(),
INSTR_LT,
(ast_expression*)exp,
- (ast_expression*)m_fold->imm_float[0]
+ (ast_expression*)m_fold->m_imm_float[0]
),
(ast_expression*)ast_return_new(
ctx(),
(ast_expression*)ast_binary_new(
ctx(),
INSTR_DIV_F,
- (ast_expression*)m_fold->imm_float[1],
+ (ast_expression*)m_fold->m_imm_float[1],
(ast_expression*)callpow1
)
),
ctx(),
INSTR_DIV_F,
(ast_expression*)exp,
- (ast_expression*)m_fold->imm_float[3] /* 2.0f */
+ (ast_expression*)m_fold->m_imm_float[3] /* 2.0f */
)
);
ctx(),
INSTR_GE,
(ast_expression*)exp,
- (ast_expression*)m_fold->imm_float[1]
+ (ast_expression*)m_fold->m_imm_float[1]
),
(ast_expression*)expgt1,
nullptr
(ast_expression*)ast_store_new(ctx(),
INSTR_STORE_F,
(ast_expression*)low,
- (ast_expression*)m_fold->imm_float[0]
+ (ast_expression*)m_fold->m_imm_float[0]
)
);
body->exprs.push_back(
ctx(),
INSTR_STORE_F,
(ast_expression*)high,
- (ast_expression*)m_fold->imm_float[1]
+ (ast_expression*)m_fold->m_imm_float[1]
)
);
ctx(),
INSTR_DIV_F,
(ast_expression*)high,
- (ast_expression*)m_fold->imm_float[3] /* 2.0f */
+ (ast_expression*)m_fold->m_imm_float[3] /* 2.0f */
)
)
);
(ast_expression*)ast_binary_new(
ctx(),
INSTR_DIV_F,
- (ast_expression*)m_fold->imm_float[1],
+ (ast_expression*)m_fold->m_imm_float[1],
(ast_expression*)square
)
)
(ast_expression*)low,
(ast_expression*)high
),
- (ast_expression*)m_fold->imm_float[3] /* 2.0f */
+ (ast_expression*)m_fold->m_imm_float[3] /* 2.0f */
)
)
);
ctx(),
INSTR_GT,
(ast_expression*)callfabs,
- (ast_expression*)fold_constgen_float(m_fold, QC_POW_EPSILON, false)
+ (ast_expression*)m_fold->constgen_float(QC_POW_EPSILON, false)
),
/* pre not */
false,
ctx(),
INSTR_LT,
(ast_expression*)div,
- (ast_expression*)m_fold->imm_float[0]
+ (ast_expression*)m_fold->m_imm_float[0]
),
- (ast_expression*)m_fold->imm_float[2],
- (ast_expression*)m_fold->imm_float[1]
+ (ast_expression*)m_fold->m_imm_float[2],
+ (ast_expression*)m_fold->m_imm_float[1]
)
)
);
ctx(),
INSTR_LE,
(ast_expression*)arg1,
- (ast_expression*)m_fold->imm_float[0]
+ (ast_expression*)m_fold->m_imm_float[0]
),
(ast_expression*)ast_unary_new(
ctx(),
ctx(),
INSTR_STORE_F,
(ast_expression*)eps,
- (ast_expression*)m_fold->imm_float[0]
+ (ast_expression*)m_fold->m_imm_float[0]
)
);
(ast_expression*)ast_binary_new(
ctx(),
INSTR_ADD_F,
- (ast_expression*)m_fold->imm_float[1],
+ (ast_expression*)m_fold->m_imm_float[1],
(ast_expression*)ast_binary_new(
ctx(),
INSTR_MUL_F,
(ast_expression*)eps,
- (ast_expression*)m_fold->imm_float[3] /* 2.0f */
+ (ast_expression*)m_fold->m_imm_float[3] /* 2.0f */
)
),
- (ast_expression*)m_fold->imm_float[1]
+ (ast_expression*)m_fold->m_imm_float[1]
),
false,
nullptr,
INSTR_STORE_F,
INSTR_DIV_F,
(ast_expression*)eps,
- (ast_expression*)m_fold->imm_float[3] /* 2.0f */
+ (ast_expression*)m_fold->m_imm_float[3] /* 2.0f */
)
)
);
ctx(),
INSTR_STORE_F,
(ast_expression*)x,
- (ast_expression*)m_fold->imm_float[0]
+ (ast_expression*)m_fold->m_imm_float[0]
)
);
ctx(),
INSTR_STORE_F,
(ast_expression*)((i == 0) ? x : y),
- (ast_expression*)m_fold->imm_float[i]
+ (ast_expression*)m_fold->m_imm_float[i]
)
);
}
ctx(),
INSTR_STORE_F,
(ast_expression*)sign,
- (ast_expression*)m_fold->imm_float[1]
+ (ast_expression*)m_fold->m_imm_float[1]
)
);
INSTR_STORE_F,
(ast_expression*)((j) ? ((i) ? B_iminus1 : A_i)
: ((i) ? A_iminus1 : B_i)),
- (ast_expression*)m_fold->imm_float[j]
+ (ast_expression*)m_fold->m_imm_float[j]
)
);
}
(ast_expression*)ast_binary_new(
ctx(),
INSTR_DIV_F,
- (ast_expression*)m_fold->imm_float[1],
+ (ast_expression*)m_fold->m_imm_float[1],
(ast_expression*)((i) ? base : power)
)
)
INSTR_STORE_F,
INSTR_MUL_F,
(ast_expression*)sign,
- (ast_expression*)m_fold->imm_float[2]
+ (ast_expression*)m_fold->m_imm_float[2]
)
);
}
ctx(),
INSTR_LE,
(ast_expression*)power,
- (ast_expression*)m_fold->imm_float[0]
+ (ast_expression*)m_fold->m_imm_float[0]
),
(ast_expression*)ast_binary_new(
ctx(),
INSTR_LE,
(ast_expression*)base,
- (ast_expression*)m_fold->imm_float[0]
+ (ast_expression*)m_fold->m_imm_float[0]
)
),
(ast_expression*)ast_return_new(
ctx(),
INSTR_LT,
(ast_expression*)((i) ? base : power),
- (ast_expression*)m_fold->imm_float[1]
+ (ast_expression*)m_fold->m_imm_float[1]
),
(ast_expression*)((i) ? blt1 : plt1),
nullptr
ctx(),
INSTR_STORE_F,
(ast_expression*)nth,
- (ast_expression*)m_fold->imm_float[0]
+ (ast_expression*)m_fold->m_imm_float[0]
)
);
ctx(),
INSTR_STORE_F,
(ast_expression*)n2,
- (ast_expression*)m_fold->imm_float[1]
+ (ast_expression*)m_fold->m_imm_float[1]
)
);
INSTR_STORE_F,
INSTR_MUL_F,
(ast_expression*)n2,
- (ast_expression*)m_fold->imm_float[3] /* 2.0f */
+ (ast_expression*)m_fold->m_imm_float[3] /* 2.0f */
)
);
(ast_expression*)ast_binary_new(
ctx(),
INSTR_ADD_F,
- (ast_expression*)m_fold->imm_float[1],
+ (ast_expression*)m_fold->m_imm_float[1],
(ast_expression*)eps
)
),
ctx(),
nullptr,
/* for(; 1; ) ?? (can this be nullptr too?) */
- (ast_expression*)m_fold->imm_float[1],
+ (ast_expression*)m_fold->m_imm_float[1],
false,
nullptr,
false,
val->expression.params.push_back(arg1);
callln->params.push_back((ast_expression*)arg1);
- callln->params.push_back((ast_expression*)fold_constgen_float(m_fold, base, false));
+ callln->params.push_back((ast_expression*)m_fold->constgen_float(base, false));
body->exprs.push_back(
(ast_expression*)ast_return_new(
val->expression.params.push_back(b);
/* <callpow> = pow(2, b) */
- callpow->params.push_back((ast_expression*)m_fold->imm_float[3]);
+ callpow->params.push_back((ast_expression*)m_fold->m_imm_float[3]);
callpow->params.push_back((ast_expression*)b);
/* <callfloor> = floor(a [instr] <callpow>) */
intrin::intrin(parser_t *parser)
: m_parser(parser)
- , m_fold(parser->fold)
+ , m_fold(&parser->m_fold)
{
static const intrin_func_t intrinsics[] = {
{&intrin::isfinite_, "__builtin_isfinite", "isfinite", 1},
}
}
-ast_expression *intrin::fold(ast_value *val, ast_expression **exprs) {
+ast_expression *intrin::do_fold(ast_value *val, ast_expression **exprs) {
if (!val || !val->name)
return nullptr;
static constexpr size_t kPrefixLength = 10; // "__builtin_"
if (!strcmp(val->name, it.name))
return (vec_size(exprs) != it.args)
? nullptr
- : fold_intrin(m_fold, val->name + kPrefixLength, exprs);
+ : m_fold->intrinsic(val->name + kPrefixLength, exprs);
}
return nullptr;
}