[qfcc] Support implicit typing for new_value_expr

This makes creating implicitly type vector literals much easier.
This commit is contained in:
Bill Currie 2023-10-20 20:45:58 +09:00
parent 93247163b3
commit b973c5a738
7 changed files with 50 additions and 44 deletions

View file

@ -585,9 +585,10 @@ expr_t *new_args_expr (void);
/** Create a new value expression node. /** Create a new value expression node.
\param value The value to put in the expression node. \param value The value to put in the expression node.
\param implicit The value is implicitly typed
\return The new value expression. \return The new value expression.
*/ */
const expr_t *new_value_expr (ex_value_t *value); const expr_t *new_value_expr (ex_value_t *value, bool implicit);
/** Create a new typed zero value expression node. /** Create a new typed zero value expression node.
@ -710,7 +711,8 @@ int expr_int (const expr_t *e) __attribute__((pure));
const expr_t *new_uint_expr (unsigned uint_val); const expr_t *new_uint_expr (unsigned uint_val);
unsigned expr_uint (const expr_t *e) __attribute__((pure)); unsigned expr_uint (const expr_t *e) __attribute__((pure));
const expr_t *new_long_expr (pr_long_t long_val); const expr_t *new_long_expr (pr_long_t long_val, bool implicit);
pr_long_t expr_long (const expr_t *e) __attribute__((pure));
const expr_t *new_ulong_expr (pr_ulong_t ulong_val); const expr_t *new_ulong_expr (pr_ulong_t ulong_val);
/** Create a new short constant expression node. /** Create a new short constant expression node.

View file

@ -276,6 +276,6 @@ evaluate_constexpr (const expr_t *e)
value_pr.pr_trace = options.verbosity > 1; value_pr.pr_trace = options.verbosity > 1;
PR_ExecuteProgram (&value_pr, vf_foldconst); PR_ExecuteProgram (&value_pr, vf_foldconst);
auto val = new_type_value (e->expr.type, value_pr.pr_return_buffer); auto val = new_type_value (e->expr.type, value_pr.pr_return_buffer);
e = new_value_expr (val); e = new_value_expr (val, false);
return e; return e;
} }

View file

@ -716,11 +716,12 @@ new_args_expr (void)
} }
const expr_t * const expr_t *
new_value_expr (ex_value_t *value) new_value_expr (ex_value_t *value, bool implicit)
{ {
expr_t *e = new_expr (); expr_t *e = new_expr ();
e->type = ex_value; e->type = ex_value;
e->value = value; e->value = value;
e->implicit = implicit;
return e; return e;
} }
@ -728,7 +729,7 @@ const expr_t *
new_zero_expr (type_t *type) new_zero_expr (type_t *type)
{ {
pr_type_t zero[type_size (type)] = {}; pr_type_t zero[type_size (type)] = {};
return new_value_expr (new_type_value (type, zero)); return new_value_expr (new_type_value (type, zero), false);
} }
const expr_t * const expr_t *
@ -748,89 +749,97 @@ new_name_expr (const char *name)
const expr_t * const expr_t *
new_string_expr (const char *string_val) new_string_expr (const char *string_val)
{ {
return new_value_expr (new_string_val (string_val)); return new_value_expr (new_string_val (string_val), false);
} }
const expr_t * const expr_t *
new_double_expr (double double_val, bool implicit) new_double_expr (double double_val, bool implicit)
{ {
auto d = (expr_t *) new_value_expr (new_double_val (double_val)); return new_value_expr (new_double_val (double_val), implicit);
d->implicit = implicit;
return d;
} }
const expr_t * const expr_t *
new_float_expr (float float_val) new_float_expr (float float_val)
{ {
return new_value_expr (new_float_val (float_val)); return new_value_expr (new_float_val (float_val), false);
} }
const expr_t * const expr_t *
new_vector_expr (const float *vector_val) new_vector_expr (const float *vector_val)
{ {
return new_value_expr (new_vector_val (vector_val)); return new_value_expr (new_vector_val (vector_val), false);
} }
const expr_t * const expr_t *
new_entity_expr (int entity_val) new_entity_expr (int entity_val)
{ {
return new_value_expr (new_entity_val (entity_val)); return new_value_expr (new_entity_val (entity_val), false);
} }
const expr_t * const expr_t *
new_field_expr (int field_val, type_t *type, def_t *def) new_field_expr (int field_val, type_t *type, def_t *def)
{ {
return new_value_expr (new_field_val (field_val, type, def)); return new_value_expr (new_field_val (field_val, type, def), false);
} }
const expr_t * const expr_t *
new_func_expr (int func_val, type_t *type) new_func_expr (int func_val, type_t *type)
{ {
return new_value_expr (new_func_val (func_val, type)); return new_value_expr (new_func_val (func_val, type), false);
} }
const expr_t * const expr_t *
new_pointer_expr (int val, type_t *type, def_t *def) new_pointer_expr (int val, type_t *type, def_t *def)
{ {
return new_value_expr (new_pointer_val (val, type, def, 0)); return new_value_expr (new_pointer_val (val, type, def, 0), false);
} }
const expr_t * const expr_t *
new_quaternion_expr (const float *quaternion_val) new_quaternion_expr (const float *quaternion_val)
{ {
return new_value_expr (new_quaternion_val (quaternion_val)); return new_value_expr (new_quaternion_val (quaternion_val), false);
} }
const expr_t * const expr_t *
new_int_expr (int int_val, bool implicit) new_int_expr (int int_val, bool implicit)
{ {
auto i = (expr_t *) new_value_expr (new_int_val (int_val)); return new_value_expr (new_int_val (int_val), implicit);
i->implicit = implicit;
return i;
} }
const expr_t * const expr_t *
new_uint_expr (unsigned uint_val) new_uint_expr (unsigned uint_val)
{ {
return new_value_expr (new_uint_val (uint_val)); return new_value_expr (new_uint_val (uint_val), false);
} }
const expr_t * const expr_t *
new_long_expr (pr_long_t long_val) new_long_expr (pr_long_t long_val, bool implicit)
{ {
return new_value_expr (new_long_val (long_val)); return new_value_expr (new_long_val (long_val), implicit);
}
pr_long_t
expr_long (const expr_t *e)
{
if (e->type == ex_nil) {
return 0;
}
if (e->type == ex_value && e->value->lltype == ev_long) {
return e->value->v.long_val;
}
internal_error (e, "not a long constant");
} }
const expr_t * const expr_t *
new_ulong_expr (pr_ulong_t ulong_val) new_ulong_expr (pr_ulong_t ulong_val)
{ {
return new_value_expr (new_ulong_val (ulong_val)); return new_value_expr (new_ulong_val (ulong_val), false);
} }
const expr_t * const expr_t *
new_short_expr (short short_val) new_short_expr (short short_val)
{ {
return new_value_expr (new_short_val (short_val)); return new_value_expr (new_short_val (short_val), false);
} }
int int
@ -891,7 +900,7 @@ constant_expr (const expr_t *e)
} else { } else {
return e; return e;
} }
auto new = new_value_expr (value); auto new = new_value_expr (value, false);
return expr_file_line ((expr_t *) new, e);//FIXME cast return expr_file_line ((expr_t *) new, e);//FIXME cast
} }
@ -1541,7 +1550,7 @@ field_expr (const expr_t *e1, const expr_t *e2)
internal_error (e2, "unexpected field exression"); internal_error (e2, "unexpected field exression");
} }
auto fv = new_field_val (e2->value->v.pointer.val + field->s.offset, field->type, e2->value->v.pointer.def); auto fv = new_field_val (e2->value->v.pointer.val + field->s.offset, field->type, e2->value->v.pointer.def);
e2 = expr_file_line ((expr_t *) new_value_expr (fv), e2); e2 = expr_file_line ((expr_t *) new_value_expr (fv, false), e2);
// create a new . expression // create a new . expression
return field_expr (e1, e2); return field_expr (e1, e2);
} else { } else {
@ -2700,7 +2709,7 @@ address_expr (const expr_t *e1, type_t *t)
} }
if (is_array (type)) { if (is_array (type)) {
auto ptrval = new_pointer_val (0, t, def, 0); auto ptrval = new_pointer_val (0, t, def, 0);
return new_value_expr (ptrval); return new_value_expr (ptrval, false);
} else { } else {
return new_pointer_expr (0, t, def); return new_pointer_expr (0, t, def);
} }
@ -2719,7 +2728,7 @@ address_expr (const expr_t *e1, type_t *t)
if (is_array (type)) { if (is_array (type)) {
auto ptrval = new_pointer_val (0, t, def, 0); auto ptrval = new_pointer_val (0, t, def, 0);
return new_value_expr (ptrval); return new_value_expr (ptrval, false);
} else { } else {
return new_pointer_expr (0, t, def); return new_pointer_expr (0, t, def);
} }

View file

@ -2723,7 +2723,7 @@ algebra_reverse (const expr_t *e)
set_sign (&ones[j * type_size (algebra->type)], sign, ct); set_sign (&ones[j * type_size (algebra->type)], sign, ct);
} }
if (neg) { if (neg) {
auto rev = new_value_expr (new_type_value (ct, ones)); auto rev = new_value_expr (new_type_value (ct, ones), false);
rev = edag_add_expr (rev); rev = edag_add_expr (rev);
r[i] = typed_binary_expr (ct, HADAMARD, r[i], rev); r[i] = typed_binary_expr (ct, HADAMARD, r[i], rev);
r[i] = edag_add_expr (rev); r[i] = edag_add_expr (rev);

View file

@ -79,7 +79,7 @@ cast_math (type_t *dstType, type_t *srcType, const expr_t *expr)
do_conversion (dst_value, dstType, src_value, srcType, expr); do_conversion (dst_value, dstType, src_value, srcType, expr);
return new_value_expr (new_type_value (dstType, dst_value)); return new_value_expr (new_type_value (dstType, dst_value), false);
} }
const expr_t * const expr_t *

View file

@ -127,9 +127,7 @@ new_vector_list (const expr_t *expr_list)
offs += type_size (src_type); offs += type_size (src_type);
} }
auto vec = (expr_t *) new_value_expr (new_type_value (vec_type, value)); return new_value_expr (new_type_value (vec_type, value), all_implicit);
vec->implicit = all_implicit;
return vec;
} }
expr_t *vec = new_expr (); expr_t *vec = new_expr ();

View file

@ -173,7 +173,7 @@ STRING \"(\\.|[^"\\])*\"
} }
} else { } else {
if (tolower (c[1]) == 'l') { if (tolower (c[1]) == 'l') {
yylval->value.expr = new_long_expr (i); yylval->value.expr = new_long_expr (i, false);
} else { } else {
yylval->value.expr = new_int_expr (i, true); yylval->value.expr = new_int_expr (i, true);
} }
@ -648,7 +648,7 @@ parse_int_vector (const char *token, int width)
if (t2 == 'l') { if (t2 == 'l') {
type = &type_ulong; type = &type_ulong;
type = vector_type (type, width); type = vector_type (type, width);
expr = new_value_expr (new_type_value (type, data)); expr = new_value_expr (new_type_value (type, data), !t1);
} else { } else {
type = &type_uint; type = &type_uint;
union { union {
@ -664,13 +664,13 @@ parse_int_vector (const char *token, int width)
}; };
data = uint_data.t; data = uint_data.t;
type = vector_type (type, width); type = vector_type (type, width);
expr = new_value_expr (new_type_value (type, data)); expr = new_value_expr (new_type_value (type, data), !t1);
} }
break; break;
case 'l': case 'l':
type = &type_long; type = &type_long;
type = vector_type (type, width); type = vector_type (type, width);
expr = new_value_expr (new_type_value (type, data)); expr = new_value_expr (new_type_value (type, data), !t1);
break; break;
case 'f': case 'f':
type = &type_float; type = &type_float;
@ -687,7 +687,7 @@ parse_int_vector (const char *token, int width)
}; };
data = float_data.t; data = float_data.t;
type = vector_type (type, width); type = vector_type (type, width);
expr = new_value_expr (new_type_value (type, data)); expr = new_value_expr (new_type_value (type, data), !t1);
break; break;
case 'd': case 'd':
type = &type_double; type = &type_double;
@ -704,7 +704,7 @@ parse_int_vector (const char *token, int width)
}; };
data = double_data.t; data = double_data.t;
type = vector_type (type, width); type = vector_type (type, width);
expr = new_value_expr (new_type_value (type, data)); expr = new_value_expr (new_type_value (type, data), !t1);
break; break;
case 0: case 0:
type = &type_int; type = &type_int;
@ -721,10 +721,9 @@ parse_int_vector (const char *token, int width)
}; };
data = int_data.t; data = int_data.t;
type = vector_type (type, width); type = vector_type (type, width);
expr = new_value_expr (new_type_value (type, data)); expr = new_value_expr (new_type_value (type, data), !t1);
break; break;
} }
((expr_t *) expr)->implicit = !t1;
return expr; return expr;
} }
@ -782,9 +781,7 @@ parse_float_vector (const char *token, int width)
type = &type_double; type = &type_double;
} }
type = vector_type (type, width); type = vector_type (type, width);
auto expr = (expr_t *) new_value_expr (new_type_value (type, data)); return new_value_expr (new_type_value (type, data), !t);
expr->implicit = !t;
return expr;
} }
static void static void