const char *alias;
} intrin_t;
-static ht intrin_intrinsics() {
+static ht intrin_intrinsics(void) {
static ht intrinsics = NULL;
if (!intrinsics)
intrinsics = util_htnew(PARSER_HT_SIZE);
parser_ctx(parser),
INSTR_STORE_F,
(ast_expression*)local,
- (ast_expression*)parser_const_float_1(parser)
+ (ast_expression*)parser->fold->imm_float[1] /* 1 == 1.0f */
)
);
INSTR_STORE_F,
INSTR_MUL_F,
(ast_expression*)arg2,
- (ast_expression*)parser_const_float(parser, 0.25f)
+ (ast_expression*)fold_constgen_float(parser->fold, 0.25f)
)
);
parser_ctx(parser),
INSTR_AND,
(ast_expression*)arg2,
- (ast_expression*)parser_const_float_1(parser)
+ (ast_expression*)parser->fold->imm_float[1] /* 1 == 1.0f */
),
true, /* ! not */
NULL,
INSTR_STORE_F,
INSTR_SUB_F,
(ast_expression*)arg2,
- (ast_expression*)parser_const_float_1(parser)
+ (ast_expression*)parser->fold->imm_float[1] /* 1 == 1.0f */
)
);
/* local *= x */
parser_ctx(parser),
INSTR_GT,
(ast_expression*)arg2,
- (ast_expression*)parser_const_float_0(parser)
+ (ast_expression*)parser->fold->imm_float[0] /* 0 == 0.0f */
),
false,
NULL,
INTRIN_VAL(value, "exp", func, "<float>", TYPE_FLOAT);
/* push arguments for params to call */
- vec_push(call->params, (ast_expression*)parser_const_float(parser, QC_M_E));
+ vec_push(call->params, (ast_expression*)fold_constgen_float(parser->fold, QC_M_E));
vec_push(call->params, (ast_expression*)arg1);
/* return pow(QC_M_E, x) */
static ast_value *value = NULL;
if (!value) {
- ast_value *arg1 = ast_value_new (parser_ctx(parser), "x", TYPE_FLOAT);
+ ast_value *arg1 = ast_value_new (parser_ctx(parser), "x", TYPE_FLOAT);
ast_value *local = ast_value_new (parser_ctx(parser), "local", TYPE_FLOAT);
ast_block *body = ast_block_new (parser_ctx(parser));
ast_function *func = NULL;
return (ast_expression*)value;
}
+static ast_expression *intrin_debug_typestring(parser_t *parser) {
+ (void)parser;
+ return (ast_expression*)0x1;
+}
+
static intrin_t intrinsics[] = {
- {&intrin_exp, "__builtin_exp", "exp"},
- {&intrin_mod, "__builtin_mod", "mod"},
- {&intrin_pow, "__builtin_pow", "pow"},
- {&intrin_isnan, "__builtin_isnan", "isnan"}
+ {&intrin_exp, "__builtin_exp", "exp"},
+ {&intrin_mod, "__builtin_mod", "mod"},
+ {&intrin_pow, "__builtin_pow", "pow"},
+ {&intrin_isnan, "__builtin_isnan", "isnan"},
+ {&intrin_debug_typestring, "__builtin_debug_typestring", ""}
};
void intrin_intrinsics_destroy(parser_t *parser) {
/*size_t i;*/
(void)parser;
util_htdel(intrin_intrinsics());
-#if 0
- for (i = 0; i < sizeof(intrinsics)/sizeof(intrin_t); i++)
- ast_value_delete( (ast_value*) intrinsics[i].intrin(parser));
-#endif
}
/* register the intrinsics in the hashtable for O(1) lookup */
if (!init) {
for (i = 0; i < sizeof(intrinsics)/sizeof(*intrinsics); i++)
- util_htset(intrin_intrinsics(), intrinsics[i].alias, &intrinsics[i]);
+ util_htset(intrin_intrinsics(), intrinsics[i].name, &intrinsics[i]);
init = true; /* only once */
}
return ((intrin_t*)find)->intrin(parser);
}
+ /*
+ * check aliases now to see if there is an implementation of it.
+ */
+ for (i = 0; i < sizeof(intrinsics) / sizeof(*intrinsics); i++)
+ if (!strcmp(intrinsics[i].alias, name))
+ return intrinsics[i].intrin(parser);
+
parseerror(parser, "need function: `%s` compiler depends on it", name);
return NULL;
}