static GMQCC_INLINE void intrin_reg(intrin_t *intrin, ast_value *const value, ast_function *const func) {
vec_push(intrin->parser->functions, func);
- vec_push(intrin->parser->globals, (ast_expression*)value);
+ vec_push(intrin->parser->globals, (ast_expression*)value);
}
#define QC_POW_EPSILON 0.00001f
ast_block *block = ast_block_new(intrin_ctx(intrin));
/* float x; */
- vec_push(value->expression.params, x);
+ value->expression.params.push_back(x);
/* <callisnan> = isnan(x); */
vec_push(callisnan->params, (ast_expression*)x);
vec_push(callisinf->params, (ast_expression*)x);
/* return (!<callisnan> || <callisinf>); */
- vec_push(block->exprs,
+ block->exprs.push_back(
(ast_expression*)ast_return_new(
intrin_ctx(intrin),
(ast_expression*)ast_unary_new(
ast_block *body = ast_block_new(intrin_ctx(intrin));
ast_function *func = intrin_value(intrin, &value, "isinf", TYPE_FLOAT);
- vec_push(body->exprs,
+ body->exprs.push_back(
(ast_expression*)ast_return_new(
intrin_ctx(intrin),
(ast_expression*)ast_binary_new(
)
);
- vec_push(value->expression.params, x);
+ value->expression.params.push_back(x);
vec_push(func->blocks, body);
intrin_reg(intrin, value, func);
ast_block *body = ast_block_new(intrin_ctx(intrin));
ast_function *func = intrin_value(intrin, &value, "isnan", TYPE_FLOAT);
- vec_push(body->locals, local);
- vec_push(body->exprs,
+ body->locals.push_back(local);
+ body->exprs.push_back(
(ast_expression*)ast_store_new(
intrin_ctx(intrin),
INSTR_STORE_F,
)
);
- vec_push(body->exprs,
+ body->exprs.push_back(
(ast_expression*)ast_return_new(
intrin_ctx(intrin),
(ast_expression*)ast_binary_new(
)
);
- vec_push(value->expression.params, arg1);
+ value->expression.params.push_back(arg1);
vec_push(func->blocks, body);
intrin_reg(intrin, value, func);
ast_block *body = ast_block_new(intrin_ctx(intrin));
ast_function *func = intrin_value(intrin, &value, "isnormal", TYPE_FLOAT);
- vec_push(value->expression.params, x);
+ value->expression.params.push_back(x);
vec_push(callisfinite->params, (ast_expression*)x);
/* return <callisfinite> */
- vec_push(body->exprs,
+ body->exprs.push_back(
(ast_expression*)ast_return_new(
intrin_ctx(intrin),
(ast_expression*)callisfinite
ast_block *body = ast_block_new(intrin_ctx(intrin));
ast_function *func = intrin_value(intrin, &value, "signbit", TYPE_FLOAT);
- vec_push(value->expression.params, x);
+ value->expression.params.push_back(x);
/* return (x < 0); */
- vec_push(body->exprs,
+ body->exprs.push_back(
(ast_expression*)ast_return_new(
intrin_ctx(intrin),
(ast_expression*)ast_ternary_new(
ast_block *body = ast_block_new(intrin_ctx(intrin));
ast_function *func = intrin_value(intrin, &value, "acosh", TYPE_FLOAT);
- vec_push(value->expression.params, x);
+ value->expression.params.push_back(x);
/* <callsqrt> = sqrt((x * x) - 1); */
vec_push(callsqrt->params,
);
/* return <calllog>; */
- vec_push(body->exprs,
+ body->exprs.push_back(
(ast_expression*)ast_return_new(
intrin_ctx(intrin),
(ast_expression*)calllog
ast_block *body = ast_block_new(intrin_ctx(intrin));
ast_function *func = intrin_value(intrin, &value, "asinh", TYPE_FLOAT);
- vec_push(value->expression.params, x);
+ value->expression.params.push_back(x);
/* <callsqrt> = sqrt((x * x) + 1); */
vec_push(callsqrt->params,
);
/* return <calllog>; */
- vec_push(body->exprs,
+ body->exprs.push_back(
(ast_expression*)ast_return_new(
intrin_ctx(intrin),
(ast_expression*)calllog
ast_block *body = ast_block_new(intrin_ctx(intrin));
ast_function *func = intrin_value(intrin, &value, "atanh", TYPE_FLOAT);
- vec_push(value->expression.params, x);
+ value->expression.params.push_back(x);
/* <callog> = log((1 + x) / (1 - x)); */
vec_push(calllog->params,
);
/* return 0.5 * <calllog>; */
- vec_push(body->exprs,
+ body->exprs.push_back(
(ast_expression*)ast_binary_new(
intrin_ctx(intrin),
INSTR_MUL_F,
ast_block *body = ast_block_new(intrin_ctx(intrin));
ast_function *func = intrin_value(intrin, &value, "exp", TYPE_FLOAT);
- vec_push(value->expression.params, x);
- vec_push(body->locals, sum);
- vec_push(body->locals, acc);
- vec_push(body->locals, i);
+ value->expression.params.push_back(x);
+
+ body->locals.push_back(sum);
+ body->locals.push_back(acc);
+ body->locals.push_back(i);
/* sum = 1.0; */
- vec_push(body->exprs,
+ body->exprs.push_back(
(ast_expression*)ast_store_new(
intrin_ctx(intrin),
INSTR_STORE_F,
);
/* acc = 1.0; */
- vec_push(body->exprs,
+ body->exprs.push_back(
(ast_expression*)ast_store_new(
intrin_ctx(intrin),
INSTR_STORE_F,
* for (i = 1; i < 200; ++i)
* sum += (acc *= x / i);
*/
- vec_push(body->exprs,
+ body->exprs.push_back(
(ast_expression*)ast_loop_new(
intrin_ctx(intrin),
/* i = 1; */
);
/* return sum; */
- vec_push(body->exprs,
+ body->exprs.push_back(
(ast_expression*)ast_return_new(
intrin_ctx(intrin),
(ast_expression*)sum
ast_block *body = ast_block_new(intrin_ctx(intrin));
ast_function *func = intrin_value(intrin, &value, "exp2", TYPE_FLOAT);
- vec_push(value->expression.params, arg1);
+ value->expression.params.push_back(arg1);
vec_push(callpow->params, (ast_expression*)intrin->fold->imm_float[3]);
vec_push(callpow->params, (ast_expression*)arg1);
/* return <callpow> */
- vec_push(body->exprs,
+ body->exprs.push_back(
(ast_expression*)ast_return_new(
intrin_ctx(intrin),
(ast_expression*)callpow
ast_block *body = ast_block_new(intrin_ctx(intrin));
ast_function *func = intrin_value(intrin, &value, "expm1", TYPE_FLOAT);
- vec_push(value->expression.params, x);
+ value->expression.params.push_back(x);
/* <callexp> = exp(x); */
vec_push(callexp->params, (ast_expression*)x);
/* return <callexp> - 1; */
- vec_push(body->exprs,
+ body->exprs.push_back(
(ast_expression*)ast_return_new(
intrin_ctx(intrin),
(ast_expression*)ast_binary_new(
ast_value *square = ast_value_new(intrin_ctx(intrin), "square", TYPE_FLOAT);
ast_value *accumulate = ast_value_new(intrin_ctx(intrin), "accumulate", TYPE_FLOAT);
ast_value *mid = ast_value_new(intrin_ctx(intrin), "mid", TYPE_FLOAT);
- vec_push(body->locals, result);
- vec_push(body->locals, low);
- vec_push(body->locals, high);
- vec_push(body->locals, square);
- vec_push(body->locals, accumulate);
- vec_push(body->locals, mid);
+ body->locals.push_back(result);
+ body->locals.push_back(low);
+ body->locals.push_back(high);
+ body->locals.push_back(square);
+ body->locals.push_back(accumulate);
+ body->locals.push_back(mid);
- vec_push(value->expression.params, base);
- vec_push(value->expression.params, exp);
+ value->expression.params.push_back(base);
+ value->expression.params.push_back(exp);
/*
* if (exp == 0.0)
* return 1;
*/
- vec_push(body->exprs,
+ body->exprs.push_back(
(ast_expression*)ast_ifthen_new(
intrin_ctx(intrin),
(ast_expression*)ast_binary_new(
* if (exp == 1.0)
* return base;
*/
- vec_push(body->exprs,
+ body->exprs.push_back(
(ast_expression*)ast_ifthen_new(
intrin_ctx(intrin),
(ast_expression*)ast_binary_new(
* if (exp < 0)
* return 1.0 / <callpow1>;
*/
- vec_push(body->exprs,
+ body->exprs.push_back(
(ast_expression*)ast_ifthen_new(
intrin_ctx(intrin),
(ast_expression*)ast_binary_new(
* return result * result;
* }
*/
- vec_push(expgt1->exprs,
+ expgt1->exprs.push_back(
(ast_expression*)ast_store_new(
intrin_ctx(intrin),
INSTR_STORE_F,
(ast_expression*)callpow2
)
);
- vec_push(expgt1->exprs,
+ expgt1->exprs.push_back(
(ast_expression*)ast_return_new(
intrin_ctx(intrin),
(ast_expression*)ast_binary_new(
* <expgt1>
* }
*/
- vec_push(body->exprs,
+ body->exprs.push_back(
(ast_expression*)ast_ifthen_new(
intrin_ctx(intrin),
(ast_expression*)ast_binary_new(
* accumulate = square;
* mid = high / 2.0f;
*/
- vec_push(body->exprs,
+ body->exprs.push_back(
(ast_expression*)ast_store_new(intrin_ctx(intrin),
INSTR_STORE_F,
(ast_expression*)low,
(ast_expression*)intrin->fold->imm_float[0]
)
);
- vec_push(body->exprs,
+ body->exprs.push_back(
(ast_expression*)ast_store_new(
intrin_ctx(intrin),
INSTR_STORE_F,
)
);
- vec_push(body->exprs,
+ body->exprs.push_back(
(ast_expression*)ast_store_new(
intrin_ctx(intrin),
INSTR_STORE_F,
)
);
- vec_push(body->exprs,
+ body->exprs.push_back(
(ast_expression*)ast_store_new(
intrin_ctx(intrin),
INSTR_STORE_F,
(ast_expression*)square
)
);
- vec_push(body->exprs,
+ body->exprs.push_back(
(ast_expression*)ast_store_new(
intrin_ctx(intrin),
INSTR_STORE_F,
* accumulate *= square;
* }
*/
- vec_push(midltexp->exprs,
+ midltexp->exprs.push_back(
(ast_expression*)ast_store_new(
intrin_ctx(intrin),
INSTR_STORE_F,
(ast_expression*)mid
)
);
- vec_push(midltexp->exprs,
+ midltexp->exprs.push_back(
(ast_expression*)ast_binstore_new(
intrin_ctx(intrin),
INSTR_STORE_F,
* accumulate *= (1.0 / square);
* }
*/
- vec_push(midltexpelse->exprs,
+ midltexpelse->exprs.push_back(
(ast_expression*)ast_store_new(
intrin_ctx(intrin),
INSTR_STORE_F,
(ast_expression*)mid
)
);
- vec_push(midltexpelse->exprs,
+ midltexpelse->exprs.push_back(
(ast_expression*)ast_binstore_new(
intrin_ctx(intrin),
INSTR_STORE_F,
* mid = (low + high) / 2;
* }
*/
- vec_push(whileblock->exprs,
+ whileblock->exprs.push_back(
(ast_expression*)ast_store_new(
intrin_ctx(intrin),
INSTR_STORE_F,
(ast_expression*)callsqrt2
)
);
- vec_push(whileblock->exprs,
+ whileblock->exprs.push_back(
(ast_expression*)ast_ifthen_new(
intrin_ctx(intrin),
(ast_expression*)ast_binary_new(
(ast_expression*)midltexpelse
)
);
- vec_push(whileblock->exprs,
+ whileblock->exprs.push_back(
(ast_expression*)ast_store_new(
intrin_ctx(intrin),
INSTR_STORE_F,
* while (<callfabs> > epsilon)
* <whileblock>
*/
- vec_push(body->exprs,
+ body->exprs.push_back(
(ast_expression*)ast_loop_new(
intrin_ctx(intrin),
/* init */
);
/* return accumulate */
- vec_push(body->exprs,
+ body->exprs.push_back(
(ast_expression*)ast_return_new(
intrin_ctx(intrin),
(ast_expression*)accumulate
ast_block *body = ast_block_new(intrin_ctx(intrin));
ast_function *func = intrin_value(intrin, &value, "mod", TYPE_FLOAT);
- vec_push(value->expression.params, a);
- vec_push(value->expression.params, b);
+ value->expression.params.push_back(a);
+ value->expression.params.push_back(b);
- vec_push(body->locals, div);
- vec_push(body->locals, sign);
+ body->locals.push_back(div);
+ body->locals.push_back(sign);
/* div = a / b; */
- vec_push(body->exprs,
+ body->exprs.push_back(
(ast_expression*)ast_store_new(
intrin_ctx(intrin),
INSTR_STORE_F,
);
/* sign = (div < 0.0f) ? -1 : 1; */
- vec_push(body->exprs,
+ body->exprs.push_back(
(ast_expression*)ast_store_new(
intrin_ctx(intrin),
INSTR_STORE_F,
);
/* return a - b * sign * <call> */
- vec_push(body->exprs,
+ body->exprs.push_back(
(ast_expression*)ast_return_new(
intrin_ctx(intrin),
(ast_expression*)ast_binary_new(
ast_block *body = ast_block_new(intrin_ctx(intrin));
ast_function *func = intrin_value(intrin, &value, "fabs", TYPE_FLOAT);
- vec_push(body->exprs,
+ body->exprs.push_back(
(ast_expression*)ast_return_new(
intrin_ctx(intrin),
(ast_expression*)ast_ternary_new(
)
);
- vec_push(value->expression.params, arg1);
+ value->expression.params.push_back(arg1);
+
vec_push(func->blocks, body);
intrin_reg(intrin, value, func);
ast_block *body = ast_block_new(intrin_ctx(intrin));
ast_function *func = intrin_value(intrin, &value, "epsilon", TYPE_FLOAT);
- vec_push(body->locals, eps);
+ body->locals.push_back(eps);
/* eps = 1.0f; */
- vec_push(body->exprs,
+ body->exprs.push_back(
(ast_expression*)ast_store_new(
intrin_ctx(intrin),
INSTR_STORE_F,
)
);
- vec_push(body->exprs,
+ body->exprs.push_back(
(ast_expression*)ast_loop_new(
intrin_ctx(intrin),
NULL,
);
/* return eps; */
- vec_push(body->exprs,
+ body->exprs.push_back(
(ast_expression*)ast_return_new(
intrin_ctx(intrin),
(ast_expression*)eps
ast_function *func = intrin_value(intrin, &value, "nan", TYPE_FLOAT);
ast_block *block = ast_block_new(intrin_ctx(intrin));
- vec_push(block->locals, x);
+ block->locals.push_back(x);
- vec_push(block->exprs,
+ block->exprs.push_back(
(ast_expression*)ast_store_new(
intrin_ctx(intrin),
INSTR_STORE_F,
)
);
- vec_push(block->exprs,
+ block->exprs.push_back(
(ast_expression*)ast_return_new(
intrin_ctx(intrin),
(ast_expression*)ast_binary_new(
ast_block *block = ast_block_new(intrin_ctx(intrin));
size_t i;
- vec_push(block->locals, x);
- vec_push(block->locals, y);
+ block->locals.push_back(x);
+ block->locals.push_back(y);
/* to keep code size down */
for (i = 0; i <= 1; i++) {
- vec_push(block->exprs,
+ block->exprs.push_back(
(ast_expression*)ast_store_new(
intrin_ctx(intrin),
INSTR_STORE_F,
);
}
- vec_push(block->exprs,
+ block->exprs.push_back(
(ast_expression*)ast_return_new(
intrin_ctx(intrin),
(ast_expression*)ast_binary_new(
ast_function *func = intrin_value(intrin, &value, "ln", TYPE_FLOAT);
size_t i;
- vec_push(value->expression.params, power);
- vec_push(value->expression.params, base);
+ value->expression.params.push_back(power);
+ value->expression.params.push_back(base);
- vec_push(block->locals, whole);
- vec_push(block->locals, nth);
- vec_push(block->locals, sign);
- vec_push(block->locals, eps);
- vec_push(block->locals, A_i);
- vec_push(block->locals, B_i);
- vec_push(block->locals, A_iminus1);
- vec_push(block->locals, B_iminus1);
+ block->locals.push_back(whole);
+ block->locals.push_back(nth);
+ block->locals.push_back(sign);
+ block->locals.push_back(eps);
+ block->locals.push_back(A_i);
+ block->locals.push_back(B_i);
+ block->locals.push_back(A_iminus1);
+ block->locals.push_back(B_iminus1);
/* sign = 1.0f; */
- vec_push(block->exprs,
+ block->exprs.push_back(
(ast_expression*)ast_store_new(
intrin_ctx(intrin),
INSTR_STORE_F,
);
/* eps = __builtin_epsilon(); */
- vec_push(block->exprs,
+ block->exprs.push_back(
(ast_expression*)ast_store_new(
intrin_ctx(intrin),
INSTR_STORE_F,
for (i = 0; i <= 1; i++) {
int j;
for (j = 1; j >= 0; j--) {
- vec_push(block->exprs,
+ block->exprs.push_back(
(ast_expression*)ast_store_new(
intrin_ctx(intrin),
INSTR_STORE_F,
* }
*/
for (i = 0; i <= 1; i++) {
- vec_push(((i) ? blt1 : plt1)->exprs,
+ ((i) ? blt1 : plt1)->exprs.push_back(
(ast_expression*)ast_store_new(
intrin_ctx(intrin),
INSTR_STORE_F,
)
)
);
- vec_push(plt1->exprs,
+ plt1->exprs.push_back(
(ast_expression*)ast_binstore_new(
intrin_ctx(intrin),
INSTR_STORE_F,
* <blt1>
* }
*/
- vec_push(plt1orblt1->exprs,
+ plt1orblt1->exprs.push_back(
(ast_expression*)ast_ifthen_new(
intrin_ctx(intrin),
(ast_expression*)ast_binary_new(
);
for (i = 0; i <= 1; i++) {
- vec_push(plt1orblt1->exprs,
+ plt1orblt1->exprs.push_back(
(ast_expression*)ast_ifthen_new(
intrin_ctx(intrin),
(ast_expression*)ast_binary_new(
);
}
- vec_push(block->exprs, (ast_expression*)plt1orblt1);
+ block->exprs.push_back((ast_expression*)plt1orblt1);
/* whole = power; */
- vec_push(forloop->exprs,
+ forloop->exprs.push_back(
(ast_expression*)ast_store_new(
intrin_ctx(intrin),
INSTR_STORE_F,
);
/* nth = 0.0f; */
- vec_push(forloop->exprs,
+ forloop->exprs.push_back(
(ast_expression*)ast_store_new(
intrin_ctx(intrin),
INSTR_STORE_F,
);
/* base2 = base; */
- vec_push(whileloop->exprs,
+ whileloop->exprs.push_back(
(ast_expression*)ast_store_new(
intrin_ctx(intrin),
INSTR_STORE_F,
);
/* n2 = 1.0f; */
- vec_push(whileloop->exprs,
+ whileloop->exprs.push_back(
(ast_expression*)ast_store_new(
intrin_ctx(intrin),
INSTR_STORE_F,
);
/* newbase2 = base2 * base2; */
- vec_push(whileloop->exprs,
+ whileloop->exprs.push_back(
(ast_expression*)ast_store_new(
intrin_ctx(intrin),
INSTR_STORE_F,
);
/* while loop locals */
- vec_push(whileloop->locals, base2);
- vec_push(whileloop->locals, n2);
- vec_push(whileloop->locals, newbase2);
+ whileloop->locals.push_back(base2);
+ whileloop->locals.push_back(n2);
+ whileloop->locals.push_back(newbase2);
/* base2 = newbase2; */
- vec_push(nestwhile->exprs,
+ nestwhile->exprs.push_back(
(ast_expression*)ast_store_new(
intrin_ctx(intrin),
INSTR_STORE_F,
);
/* n2 *= 2; */
- vec_push(nestwhile->exprs,
+ nestwhile->exprs.push_back(
(ast_expression*)ast_binstore_new(
intrin_ctx(intrin),
INSTR_STORE_F,
);
/* newbase2 *= newbase2; */
- vec_push(nestwhile->exprs,
+ nestwhile->exprs.push_back(
(ast_expression*)ast_binstore_new(
intrin_ctx(intrin),
INSTR_STORE_F,
);
/* while (whole >= newbase2) */
- vec_push(whileloop->exprs,
+ whileloop->exprs.push_back(
(ast_expression*)ast_loop_new(
intrin_ctx(intrin),
NULL,
);
/* whole /= base2; */
- vec_push(whileloop->exprs,
+ whileloop->exprs.push_back(
(ast_expression*)ast_binstore_new(
intrin_ctx(intrin),
INSTR_STORE_F,
);
/* nth += n2; */
- vec_push(whileloop->exprs,
+ whileloop->exprs.push_back(
(ast_expression*)ast_binstore_new(
intrin_ctx(intrin),
INSTR_STORE_F,
);
/* while (whole >= base) */
- vec_push(forloop->exprs,
+ forloop->exprs.push_back(
(ast_expression*)ast_loop_new(
intrin_ctx(intrin),
NULL,
)
);
- vec_push(forloop->locals, b_iplus1);
- vec_push(forloop->locals, A_iplus1);
- vec_push(forloop->locals, B_iplus1);
+ forloop->locals.push_back(b_iplus1);
+ forloop->locals.push_back(A_iplus1);
+ forloop->locals.push_back(B_iplus1);
/* b_iplus1 = nth; */
- vec_push(forloop->exprs,
+ forloop->exprs.push_back(
(ast_expression*)ast_store_new(
intrin_ctx(intrin),
INSTR_STORE_F,
* B_iplus1 = b_iplus1 * B_i + B_iminus1;
*/
for (i = 0; i <= 1; i++) {
- vec_push(forloop->exprs,
+ forloop->exprs.push_back(
(ast_expression*)ast_store_new(
intrin_ctx(intrin),
INSTR_STORE_F,
* B_iminus1 = B_i;
*/
for (i = 0; i <= 1; i++) {
- vec_push(forloop->exprs,
+ forloop->exprs.push_back(
(ast_expression*)ast_store_new(
intrin_ctx(intrin),
INSTR_STORE_F,
* B_i = B_iplus1;
*/
for (i = 0; i <= 1; i++) {
- vec_push(forloop->exprs,
+ forloop->exprs.push_back(
(ast_expression*)ast_store_new(
intrin_ctx(intrin),
INSTR_STORE_F,
* if (whole <= 1.0f + eps)
* break;
*/
- vec_push(forloop->exprs,
+ forloop->exprs.push_back(
(ast_expression*)ast_ifthen_new(
intrin_ctx(intrin),
(ast_expression*)ast_binary_new(
* base = whole;
*/
for (i = 0; i <= 1; i++) {
- vec_push(forloop->exprs,
+ forloop->exprs.push_back(
(ast_expression*)ast_store_new(
intrin_ctx(intrin),
INSTR_STORE_F,
}
/* add the for loop block */
- vec_push(block->exprs,
+ block->exprs.push_back(
(ast_expression*)ast_loop_new(
intrin_ctx(intrin),
NULL,
);
/* return sign * A_i / B_il */
- vec_push(block->exprs,
+ block->exprs.push_back(
(ast_expression*)ast_return_new(
intrin_ctx(intrin),
(ast_expression*)ast_binary_new(
ast_block *body = ast_block_new(intrin_ctx(intrin));
ast_function *func = intrin_value(intrin, &value, name, TYPE_FLOAT);
- vec_push(value->expression.params, arg1);
+ value->expression.params.push_back(arg1);
vec_push(callln->params, (ast_expression*)arg1);
vec_push(callln->params, (ast_expression*)fold_constgen_float(intrin->fold, base, false));
- vec_push(body->exprs,
+ body->exprs.push_back(
(ast_expression*)ast_return_new(
intrin_ctx(intrin),
(ast_expression*)callln
ast_block *body = ast_block_new(intrin_ctx(intrin));
ast_function *func = intrin_value(intrin, &value, name, TYPE_FLOAT);
- vec_push(value->expression.params, a);
- vec_push(value->expression.params, b);
+ value->expression.params.push_back(a);
+ value->expression.params.push_back(b);
/* <callpow> = pow(2, b) */
vec_push(callpow->params, (ast_expression*)intrin->fold->imm_float[3]);
);
/* return <callfloor> */
- vec_push(body->exprs,
+ body->exprs.push_back(
(ast_expression*)ast_return_new(
intrin_ctx(intrin),
(ast_expression*)callfloor