mirror of
https://github.com/DarkPlacesEngine/gmqcc.git
synced 2025-04-20 00:40:44 +00:00
Compare commits
8 commits
Author | SHA1 | Date | |
---|---|---|---|
|
de24486e54 | ||
|
e26d1e985a | ||
|
cac827d763 | ||
|
9a87c5aac7 | ||
|
b2165f718b | ||
|
9348649af4 | ||
|
11ffe61314 | ||
|
b54f0a64de |
4 changed files with 56 additions and 15 deletions
11
doc/gmqcc.1
11
doc/gmqcc.1
|
@ -116,6 +116,17 @@ them.
|
|||
-f\fIno-\fRcorrect-ternary
|
||||
.fi
|
||||
.in
|
||||
.TP
|
||||
.B "-dump"
|
||||
DEBUG OPTION. Print the code's intermediate representation before the
|
||||
optimization and finalization passes to stdout before generating the
|
||||
binary.
|
||||
.TP
|
||||
.B "-dumpfin"
|
||||
DEBUG OPTION. Print the code's intermediate representation after the
|
||||
optimization and finalization passes to stdout before generating the
|
||||
binary. The instructions will be enumerated, and values will contain a
|
||||
list of liferanges.
|
||||
.SH COMPILE WARNINGS
|
||||
.TP
|
||||
.B -Wunused-variable
|
||||
|
|
12
gmqcc.h
12
gmqcc.h
|
@ -41,7 +41,7 @@
|
|||
|
||||
#define GMQCC_VERSION_MAJOR 0
|
||||
#define GMQCC_VERSION_MINOR 2
|
||||
#define GMQCC_VERSION_PATCH 0
|
||||
#define GMQCC_VERSION_PATCH 2
|
||||
#define GMQCC_VERSION_BUILD(J,N,P) (((J)<<16)|((N)<<8)|(P))
|
||||
#define GMQCC_VERSION \
|
||||
GMQCC_VERSION_BUILD(GMQCC_VERSION_MAJOR, GMQCC_VERSION_MINOR, GMQCC_VERSION_PATCH)
|
||||
|
@ -295,16 +295,16 @@ void _util_vec_grow(void **a, size_t i, size_t s);
|
|||
/* exposed interface */
|
||||
#define vec_meta(A) (((vector_t*)(A)) - 1)
|
||||
#define vec_free(A) ((A) ? (mem_d((void*)vec_meta(A)), (A) = NULL) : 0)
|
||||
#define vec_push(A,V) (GMQCC_VEC_WILLGROW(A,1), (A)[vec_meta(A)->used++] = V)
|
||||
#define vec_push(A,V) (GMQCC_VEC_WILLGROW((A),1), (A)[vec_meta(A)->used++] = (V))
|
||||
#define vec_size(A) ((A) ? vec_meta(A)->used : 0)
|
||||
#define vec_add(A,N) (GMQCC_VEC_WILLGROW(A,N), vec_meta(A)->used += (N), &(A)[vec_meta(A)->used-(N)])
|
||||
#define vec_add(A,N) (GMQCC_VEC_WILLGROW((A),(N)), vec_meta(A)->used += (N), &(A)[vec_meta(A)->used-(N)])
|
||||
#define vec_last(A) ((A)[vec_meta(A)->used - 1])
|
||||
#define vec_pop(A) (vec_meta(A)->used -= 1)
|
||||
#define vec_shrinkto(A,N) (vec_meta(A)->used = (N))
|
||||
#define vec_shrinkby(A,N) (vec_meta(A)->used -= (N))
|
||||
#define vec_append(A,N,S) memcpy(vec_add(A, N), S, N * sizeof(*S))
|
||||
#define vec_upload(X,Y,S) memcpy(vec_add(X, S * sizeof(*Y)), Y, S * sizeof(*Y))
|
||||
#define vec_remove(A,I,N) memmove((char*)A+I*sizeof(*A),(char*)A+(I+N)*sizeof(*A),sizeof(*A)*(vec_meta(A)->used-I-N)),vec_meta(A)->used-=(N)
|
||||
#define vec_append(A,N,S) memcpy(vec_add((A), (N)), (S), (N) * sizeof(*(S)))
|
||||
#define vec_upload(X,Y,S) memcpy(vec_add((X), (S) * sizeof(*(Y))), (Y), (S) * sizeof(*(Y)))
|
||||
#define vec_remove(A,I,N) memmove((A)+(I),(A)+((I)+(N)),sizeof(*(A))*(vec_meta(A)->used-(I)-(N))),vec_meta(A)->used-=(N)
|
||||
|
||||
typedef struct hash_table_t {
|
||||
size_t size;
|
||||
|
|
46
ir.c
46
ir.c
|
@ -728,6 +728,8 @@ bool ir_function_pass_tailrecursion(ir_function *self)
|
|||
|
||||
bool ir_function_finalize(ir_function *self)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
if (self->builtin)
|
||||
return true;
|
||||
|
||||
|
@ -748,6 +750,27 @@ bool ir_function_finalize(ir_function *self)
|
|||
if (!ir_function_naive_phi(self))
|
||||
return false;
|
||||
|
||||
for (i = 0; i < vec_size(self->locals); ++i) {
|
||||
ir_value *v = self->locals[i];
|
||||
if (v->vtype == TYPE_VECTOR ||
|
||||
(v->vtype == TYPE_FIELD && v->outtype == TYPE_VECTOR))
|
||||
{
|
||||
ir_value_vector_member(v, 0);
|
||||
ir_value_vector_member(v, 1);
|
||||
ir_value_vector_member(v, 2);
|
||||
}
|
||||
}
|
||||
for (i = 0; i < vec_size(self->values); ++i) {
|
||||
ir_value *v = self->values[i];
|
||||
if (v->vtype == TYPE_VECTOR ||
|
||||
(v->vtype == TYPE_FIELD && v->outtype == TYPE_VECTOR))
|
||||
{
|
||||
ir_value_vector_member(v, 0);
|
||||
ir_value_vector_member(v, 1);
|
||||
ir_value_vector_member(v, 2);
|
||||
}
|
||||
}
|
||||
|
||||
ir_function_enumerate(self);
|
||||
|
||||
if (!ir_function_calculate_liferanges(self))
|
||||
|
@ -998,16 +1021,22 @@ ir_value* ir_value_vector_member(ir_value *self, unsigned int member)
|
|||
if (self->members[member])
|
||||
return self->members[member];
|
||||
|
||||
len = strlen(self->name);
|
||||
name = (char*)mem_a(len + 3);
|
||||
memcpy(name, self->name, len);
|
||||
name[len+0] = '_';
|
||||
name[len+1] = 'x' + member;
|
||||
name[len+2] = '\0';
|
||||
if (self->name) {
|
||||
len = strlen(self->name);
|
||||
name = (char*)mem_a(len + 3);
|
||||
memcpy(name, self->name, len);
|
||||
name[len+0] = '_';
|
||||
name[len+1] = 'x' + member;
|
||||
name[len+2] = '\0';
|
||||
}
|
||||
else
|
||||
name = NULL;
|
||||
|
||||
if (self->vtype == TYPE_VECTOR)
|
||||
{
|
||||
m = ir_value_var(name, self->store, TYPE_FLOAT);
|
||||
mem_d(name);
|
||||
if (name)
|
||||
mem_d(name);
|
||||
if (!m)
|
||||
return NULL;
|
||||
m->context = self->context;
|
||||
|
@ -1020,7 +1049,8 @@ ir_value* ir_value_vector_member(ir_value *self, unsigned int member)
|
|||
if (self->fieldtype != TYPE_VECTOR)
|
||||
return NULL;
|
||||
m = ir_value_var(name, self->store, TYPE_FIELD);
|
||||
mem_d(name);
|
||||
if (name)
|
||||
mem_d(name);
|
||||
if (!m)
|
||||
return NULL;
|
||||
m->fieldtype = TYPE_FLOAT;
|
||||
|
|
2
parser.c
2
parser.c
|
@ -4454,7 +4454,7 @@ skipvar:
|
|||
ast_unref(cval);
|
||||
}
|
||||
} else {
|
||||
bool cvq;
|
||||
int cvq;
|
||||
shunt sy = { NULL, NULL };
|
||||
cvq = var->cvq;
|
||||
var->cvq = CV_NONE;
|
||||
|
|
Loading…
Reference in a new issue