mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-02-08 16:52:16 +00:00
[qfcc] Used aligned type sizes for sizeof
And geometric algebra vectors. This does break things a little in GA, but it does bring qfcc's C closer to standard C in that sizeof respects the alignment of the type (very important for arrays).
This commit is contained in:
parent
ad6b4057f9
commit
09cdf87f67
5 changed files with 33 additions and 5 deletions
|
@ -230,6 +230,7 @@ int type_promotes (const type_t *dst, const type_t *src) __attribute__((pure));
|
||||||
int type_same (const type_t *dst, const type_t *src) __attribute__((pure));
|
int type_same (const type_t *dst, const type_t *src) __attribute__((pure));
|
||||||
int type_size (const type_t *type) __attribute__((pure));
|
int type_size (const type_t *type) __attribute__((pure));
|
||||||
int type_width (const type_t *type) __attribute__((pure));
|
int type_width (const type_t *type) __attribute__((pure));
|
||||||
|
int type_aligned_size (const type_t *type) __attribute__((pure));
|
||||||
|
|
||||||
void init_types (void);
|
void init_types (void);
|
||||||
void chain_initial_types (void);
|
void chain_initial_types (void);
|
||||||
|
|
|
@ -445,6 +445,11 @@ algebra_subtype (type_t *type, attribute_t *attr)
|
||||||
static int
|
static int
|
||||||
algebra_alignment (const type_t *type, int width)
|
algebra_alignment (const type_t *type, int width)
|
||||||
{
|
{
|
||||||
|
if (width > 4) {
|
||||||
|
// don't need more than 4 units
|
||||||
|
width = 4;
|
||||||
|
}
|
||||||
|
// alignment reflects the size for doubles vs floats
|
||||||
return type->alignment * BITOP_RUP (width);
|
return type->alignment * BITOP_RUP (width);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -657,7 +662,20 @@ algebra_type_size (const type_t *type)
|
||||||
return a->num_components * type_size (a->type);
|
return a->num_components * type_size (a->type);
|
||||||
} else if (type->type == ev_float || type->type == ev_double) {
|
} else if (type->type == ev_float || type->type == ev_double) {
|
||||||
auto m = type->t.multivec;
|
auto m = type->t.multivec;
|
||||||
return m->num_components * type_size (m->algebra->type);
|
auto a = m->algebra;
|
||||||
|
auto layout = &a->layout;
|
||||||
|
int size = 0;
|
||||||
|
if (m->group_mask & (m->group_mask - 1)) {
|
||||||
|
for (int i = 0; i < layout->count; i++) {
|
||||||
|
if (m->group_mask & (1u << i)) {
|
||||||
|
auto t = algebra_mvec_type (a, m->group_mask & (1u << i));
|
||||||
|
size += type_aligned_size (t);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
size = m->num_components * type_size (m->algebra->type);
|
||||||
|
}
|
||||||
|
return size;
|
||||||
} else {
|
} else {
|
||||||
internal_error (0, "invalid algebra type");
|
internal_error (0, "invalid algebra type");
|
||||||
}
|
}
|
||||||
|
|
|
@ -3009,7 +3009,7 @@ sizeof_expr (expr_t *expr, struct type_s *type)
|
||||||
if (!type)
|
if (!type)
|
||||||
type = get_type (expr);
|
type = get_type (expr);
|
||||||
if (type) {
|
if (type) {
|
||||||
expr = new_int_expr (type_size (type));
|
expr = new_int_expr (type_aligned_size (type));
|
||||||
}
|
}
|
||||||
return expr;
|
return expr;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1444,6 +1444,13 @@ type_width (const type_t *type)
|
||||||
internal_error (0, "invalid type meta: %d", type->meta);
|
internal_error (0, "invalid type meta: %d", type->meta);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
type_aligned_size (const type_t *type)
|
||||||
|
{
|
||||||
|
int size = type_size (type);
|
||||||
|
return RUP (size, type->alignment);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
chain_basic_types (void)
|
chain_basic_types (void)
|
||||||
{
|
{
|
||||||
|
|
|
@ -27,11 +27,13 @@ main (void)
|
||||||
printf ("scalar has wrong size: %d\n", sizeof (scalar_t));
|
printf ("scalar has wrong size: %d\n", sizeof (scalar_t));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
if (sizeof (vector_t) != 3 * sizeof (scalar_t)) {
|
// vector_t is a vec3 but has alignment of 4 thus sizeof of 4 * scalar
|
||||||
printf ("bivector has wrong size: %d\n", sizeof (vector_t));
|
if (sizeof (vector_t) != 4 * sizeof (scalar_t)) {
|
||||||
|
printf ("vector has wrong size: %d\n", sizeof (vector_t));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
if (sizeof (bivector_t) != 3 * sizeof (scalar_t)) {
|
// bivector_t is a vec3 but has alignment of 4 thus sizeof of 4 * scalar
|
||||||
|
if (sizeof (bivector_t) != 4 * sizeof (scalar_t)) {
|
||||||
printf ("bivector has wrong size: %d\n", sizeof (bivector_t));
|
printf ("bivector has wrong size: %d\n", sizeof (bivector_t));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue