mirror of
https://github.com/DarkPlacesEngine/gmqcc.git
synced 2025-03-21 10:21:03 +00:00
Vector cross product virtual instruction, now >< operator works for non-constant vectors. Thanks divVerent for the help.
This commit is contained in:
parent
64661f54ea
commit
b2c8f3ebc5
5 changed files with 39 additions and 8 deletions
3
gmqcc.h
3
gmqcc.h
|
@ -725,7 +725,8 @@ enum {
|
|||
VINSTR_BITOR_VF,
|
||||
VINSTR_BITXOR,
|
||||
VINSTR_BITXOR_V,
|
||||
VINSTR_BITXOR_VF /* BITXOR_VF must be the last emulated bitop */
|
||||
VINSTR_BITXOR_VF,
|
||||
VINSTR_CROSS
|
||||
};
|
||||
|
||||
/* TODO: elide */
|
||||
|
|
32
ir.c
32
ir.c
|
@ -613,7 +613,7 @@ static bool instr_is_operation(uint16_t op)
|
|||
(op >= INSTR_NOT_F && op <= INSTR_NOT_FNC) ||
|
||||
(op >= INSTR_AND && op <= INSTR_BITOR) ||
|
||||
(op >= INSTR_CALL0 && op <= INSTR_CALL8) ||
|
||||
(op >= VINSTR_BITAND_V && op <= VINSTR_BITXOR_VF) );
|
||||
(op >= VINSTR_BITAND_V && op <= VINSTR_CROSS) );
|
||||
}
|
||||
|
||||
static bool ir_function_pass_peephole(ir_function *self)
|
||||
|
@ -1815,6 +1815,7 @@ ir_value* ir_block_create_binop(ir_block *self, lex_ctx_t ctx,
|
|||
case VINSTR_BITAND_VF:
|
||||
case VINSTR_BITOR_VF:
|
||||
case VINSTR_BITXOR_VF:
|
||||
case VINSTR_CROSS:
|
||||
#if 0
|
||||
case INSTR_DIV_VF:
|
||||
case INSTR_MUL_IV:
|
||||
|
@ -2518,7 +2519,8 @@ static bool ir_block_life_propagate(ir_block *self, bool *changed)
|
|||
instr->opcode == VINSTR_BITOR_VF ||
|
||||
instr->opcode == VINSTR_BITXOR ||
|
||||
instr->opcode == VINSTR_BITXOR_VF ||
|
||||
instr->opcode == VINSTR_BITXOR_V)
|
||||
instr->opcode == VINSTR_BITXOR_V ||
|
||||
instr->opcode == VINSTR_CROSS)
|
||||
{
|
||||
value = instr->_ops[2];
|
||||
/* the float source will get an additional lifetime */
|
||||
|
@ -2532,7 +2534,8 @@ static bool ir_block_life_propagate(ir_block *self, bool *changed)
|
|||
instr->opcode == INSTR_LOAD_V ||
|
||||
instr->opcode == VINSTR_BITXOR ||
|
||||
instr->opcode == VINSTR_BITXOR_VF ||
|
||||
instr->opcode == VINSTR_BITXOR_V)
|
||||
instr->opcode == VINSTR_BITXOR_V ||
|
||||
instr->opcode == VINSTR_CROSS)
|
||||
{
|
||||
value = instr->_ops[1];
|
||||
/* the float source will get an additional lifetime */
|
||||
|
@ -2960,6 +2963,28 @@ static bool gen_blocks_recursive(code_t *code, ir_function *func, ir_block *bloc
|
|||
continue;
|
||||
}
|
||||
|
||||
if (instr->opcode == VINSTR_CROSS) {
|
||||
stmt.opcode = INSTR_MUL_F;
|
||||
for (j = 0; j < 3; ++j) {
|
||||
stmt.o1.s1 = ir_value_code_addr(instr->_ops[1]) + (j + 1) % 3;
|
||||
stmt.o2.s1 = ir_value_code_addr(instr->_ops[2]) + (j + 2) % 3;
|
||||
stmt.o3.s1 = ir_value_code_addr(instr->_ops[0]) + j;
|
||||
code_push_statement(code, &stmt, instr->context);
|
||||
stmt.o1.s1 = ir_value_code_addr(instr->_ops[1]) + (j + 2) % 3;
|
||||
stmt.o2.s1 = ir_value_code_addr(instr->_ops[2]) + (j + 1) % 3;
|
||||
stmt.o3.s1 = ir_value_code_addr(func->owner->vinstr_temp[0]) + j;
|
||||
code_push_statement(code, &stmt, instr->context);
|
||||
}
|
||||
stmt.opcode = INSTR_SUB_V;
|
||||
stmt.o1.s1 = ir_value_code_addr(instr->_ops[0]);
|
||||
stmt.o2.s1 = ir_value_code_addr(func->owner->vinstr_temp[0]);
|
||||
stmt.o3.s1 = ir_value_code_addr(instr->_ops[0]);
|
||||
code_push_statement(code, &stmt, instr->context);
|
||||
|
||||
/* instruction generated */
|
||||
continue;
|
||||
}
|
||||
|
||||
if (instr->opcode == VINSTR_COND) {
|
||||
ontrue = instr->bops[0];
|
||||
onfalse = instr->bops[1];
|
||||
|
@ -3959,6 +3984,7 @@ static const char *qc_opname(int op)
|
|||
case VINSTR_BITAND_VF: return "BITAND_VF";
|
||||
case VINSTR_BITOR_VF: return "BITOR_VF";
|
||||
case VINSTR_BITXOR_VF: return "BITXOR_VF";
|
||||
case VINSTR_CROSS: return "CROSS";
|
||||
default: return "<UNK>";
|
||||
}
|
||||
}
|
||||
|
|
8
parser.c
8
parser.c
|
@ -772,8 +772,12 @@ static bool parser_sy_apply_operator(parser_t *parser, shunt *sy)
|
|||
}
|
||||
|
||||
if (!(out = fold_op(parser->fold, op, exprs))) {
|
||||
compile_error(ctx, "cross product for non-constant vectors unimplemented");
|
||||
return false;
|
||||
out = (ast_expression*)ast_binary_new(
|
||||
parser_ctx(parser),
|
||||
VINSTR_CROSS,
|
||||
exprs[0],
|
||||
exprs[1]
|
||||
);
|
||||
}
|
||||
|
||||
break;
|
||||
|
|
|
@ -8,5 +8,5 @@ void main(vector v) {
|
|||
print(vtos(v & 16), "\n");
|
||||
print(vtos(v | '25 42 51'), "\n");
|
||||
print(vtos(v & '25 42 51'), "\n");
|
||||
print(vtos('1 2 3' >< '3 2 1'));
|
||||
print(vtos(v >< '3 2 1'));
|
||||
}
|
||||
|
|
|
@ -11,4 +11,4 @@ M: '20 24 16'
|
|||
M: '0 0 16'
|
||||
M: '29 42 51'
|
||||
M: '0 8 16'
|
||||
M: '-4 8 -4'
|
||||
M: '-24 44 -16'
|
||||
|
|
Loading…
Reference in a new issue