X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=parser.c;h=bbca3cf3b2ec3393f882ce9b4d0d9609a2069c5c;hb=a68f0fcb355db42acabe72da5939fbd1b04f6016;hp=fc2ef35de879a5cb58d49793984650ff6332f3c5;hpb=d0ee56f25f6fe0e62c4490cc436e9ae2466e511d;p=xonotic%2Fgmqcc.git diff --git a/parser.c b/parser.c index fc2ef35..bbca3cf 100644 --- a/parser.c +++ b/parser.c @@ -29,8 +29,6 @@ #define PARSER_HT_SIZE 512 #define TYPEDEF_HT_SIZE 512 -static ast_expression * const intrinsic_debug_typestring = (ast_expression*)0x1; - static void parser_enterblock(parser_t *parser); static bool parser_leaveblock(parser_t *parser); static void parser_addlocal(parser_t *parser, const char *name, ast_expression *e); @@ -353,11 +351,6 @@ static bool parser_sy_apply_operator(parser_t *parser, shunt *sy) #define NotSameType(T) \ (exprs[0]->vtype != exprs[1]->vtype || \ exprs[0]->vtype != T) - - /* preform any constant folding on operator usage first */ - /*if ((out = fold_op(parser->fold, op, exprs)))*/ - /*goto complete;*/ - switch (op->id) { default: @@ -587,6 +580,7 @@ static bool parser_sy_apply_operator(parser_t *parser, shunt *sy) } } break; + case opid1('/'): if (exprs[1]->vtype != TYPE_FLOAT) { ast_type_to_string(exprs[0], ty1, sizeof(ty1)); @@ -595,21 +589,9 @@ static bool parser_sy_apply_operator(parser_t *parser, shunt *sy) return false; } if (!(out = fold_op(parser->fold, op, exprs))) { - if (exprs[0]->vtype == TYPE_FLOAT) + if (exprs[0]->vtype == TYPE_FLOAT) out = (ast_expression*)ast_binary_new(ctx, INSTR_DIV_F, exprs[0], exprs[1]); - else if (exprs[0]->vtype == TYPE_VECTOR) { - out = (ast_expression*)ast_binary_new ( - ctx, - INSTR_MUL_VF, - exprs[0], - (ast_expression*)ast_binary_new( - ctx, - INSTR_DIV_F, - (ast_expression*)parser->fold->imm_float[1], - exprs[1] - ) - ); - } else { + else { ast_type_to_string(exprs[0], ty1, sizeof(ty1)); ast_type_to_string(exprs[1], ty2, sizeof(ty2)); compile_error(ctx, "invalid types used in expression: cannot divide types %s and %s", ty1, ty2); @@ -1172,7 +1154,6 @@ static bool parser_sy_apply_operator(parser_t *parser, shunt *sy) break; } #undef NotSameType -/*complete:*/ if (!out) { compile_error(ctx, "failed to apply operator %s", op->op); return false; @@ -1214,9 +1195,11 @@ static bool parser_close_call(parser_t *parser, shunt *sy) return false; } - fun = sy->out[fid].out; - - if (fun == intrinsic_debug_typestring) { + /* + * TODO handle this at the intrinsic level with an ast_intrinsic + * node and codegen. + */ + if ((fun = sy->out[fid].out) == intrin_debug_typestring(parser)) { char ty[1024]; if (fid+2 != vec_size(sy->out) || vec_last(sy->out).block) @@ -1231,8 +1214,8 @@ static bool parser_close_call(parser_t *parser, shunt *sy) vec_shrinkby(sy->out, 1); return true; } - call = ast_call_new(sy->ops[vec_size(sy->ops)].ctx, fun); + if (!call) return false; @@ -1548,9 +1531,7 @@ static bool parse_sya_operand(parser_t *parser, shunt *sy, bool with_labels) /* a_vector.{x,y,z} */ if (!vec_size(sy->ops) || !vec_last(sy->ops).etype || - operators[vec_last(sy->ops).etype-1].id != opid1('.') || - (prev >= intrinsic_debug_typestring && - prev <= intrinsic_debug_typestring)) + operators[vec_last(sy->ops).etype-1].id != opid1('.')) { /* When adding more intrinsics, fix the above condition */ prev = NULL; @@ -1574,16 +1555,13 @@ static bool parse_sya_operand(parser_t *parser, shunt *sy, bool with_labels) if (!var && !strcmp(parser_tokval(parser), "__FUNC__")) var = (ast_expression*)fold_constgen_string(parser->fold, parser->function->name, false); if (!var) { - /* intrinsics */ - if (!strcmp(parser_tokval(parser), "__builtin_debug_typestring")) { - var = (ast_expression*)intrinsic_debug_typestring; - } - /* now we try for the real intrinsic hashtable. If the string + /* + * now we try for the real intrinsic hashtable. If the string * begins with __builtin, we simply skip past it, otherwise we * use the identifier as is. */ - else if (!strncmp(parser_tokval(parser), "__builtin_", 10)) { - var = intrin_func(parser, parser_tokval(parser) + 10 /* skip __builtin */); + if (!strncmp(parser_tokval(parser), "__builtin_", 10)) { + var = intrin_func(parser, parser_tokval(parser)); } if (!var) {