Added IR_SLE and IR_SLT for <= and < operations.
Using IR_SGE and IR_SGT with transposed args doesn't work since the __asm calls don't do argument matching by name, but by position. This fixes the broken lessThan() and lessThanEqual() functions.
This commit is contained in:
@@ -327,6 +327,8 @@ static slang_asm_info AsmInfo[] = {
|
||||
{ "vec4_seq", IR_SEQ, 1, 2 },
|
||||
{ "vec4_sge", IR_SGE, 1, 2 },
|
||||
{ "vec4_sgt", IR_SGT, 1, 2 },
|
||||
{ "vec4_sle", IR_SLE, 1, 2 },
|
||||
{ "vec4_slt", IR_SLT, 1, 2 },
|
||||
/* vec4 unary */
|
||||
{ "vec4_floor", IR_FLOOR, 1, 1 },
|
||||
{ "vec4_frac", IR_FRAC, 1, 1 },
|
||||
@@ -609,6 +611,7 @@ _slang_is_noop(const slang_operation *oper)
|
||||
|
||||
/**
|
||||
* Produce inline code for a call to an assembly instruction.
|
||||
* XXX Note: children are passed as asm args in-order, not by name!
|
||||
*/
|
||||
static slang_operation *
|
||||
slang_inline_asm_function(slang_assemble_ctx *A,
|
||||
@@ -2299,19 +2302,17 @@ _slang_gen_operation(slang_assemble_ctx * A, slang_operation *oper)
|
||||
_slang_gen_operation(A, &oper->children[0]),
|
||||
_slang_gen_operation(A, &oper->children[1]));
|
||||
case SLANG_OPER_LESS:
|
||||
/* child[0] < child[1] ----> child[1] > child[0] */
|
||||
return new_node2(IR_SGT,
|
||||
_slang_gen_operation(A, &oper->children[1]),
|
||||
_slang_gen_operation(A, &oper->children[0]));
|
||||
return new_node2(IR_SLT,
|
||||
_slang_gen_operation(A, &oper->children[0]),
|
||||
_slang_gen_operation(A, &oper->children[1]));
|
||||
case SLANG_OPER_GREATEREQUAL:
|
||||
return new_node2(IR_SGE,
|
||||
_slang_gen_operation(A, &oper->children[0]),
|
||||
_slang_gen_operation(A, &oper->children[1]));
|
||||
case SLANG_OPER_LESSEQUAL:
|
||||
/* child[0] <= child[1] ----> child[1] >= child[0] */
|
||||
return new_node2(IR_SGE,
|
||||
_slang_gen_operation(A, &oper->children[1]),
|
||||
_slang_gen_operation(A, &oper->children[0]));
|
||||
return new_node2(IR_SLE,
|
||||
_slang_gen_operation(A, &oper->children[0]),
|
||||
_slang_gen_operation(A, &oper->children[1]));
|
||||
case SLANG_OPER_ADD:
|
||||
{
|
||||
slang_ir_node *n;
|
||||
|
||||
@@ -95,6 +95,8 @@ static const slang_ir_info IrInfo[] = {
|
||||
{ IR_SNEQUAL, "IR_SNEQUAL", OPCODE_SNE, 4, 2 },
|
||||
{ IR_SGE, "IR_SGE", OPCODE_SGE, 4, 2 },
|
||||
{ IR_SGT, "IR_SGT", OPCODE_SGT, 4, 2 },
|
||||
{ IR_SLE, "IR_SLE", OPCODE_SLE, 4, 2 },
|
||||
{ IR_SLT, "IR_SLT", OPCODE_SLT, 4, 2 },
|
||||
{ IR_POW, "IR_POW", OPCODE_POW, 1, 2 },
|
||||
/* unary ops */
|
||||
{ IR_I_TO_F, "IR_I_TO_F", OPCODE_NOP, 1, 1 },
|
||||
@@ -1495,6 +1497,8 @@ emit(slang_emit_info *emitInfo, slang_ir_node *n)
|
||||
case IR_SNEQUAL:
|
||||
case IR_SGE:
|
||||
case IR_SGT:
|
||||
case IR_SLE:
|
||||
case IR_SLT:
|
||||
case IR_POW:
|
||||
case IR_EXP:
|
||||
case IR_EXP2:
|
||||
|
||||
@@ -84,6 +84,8 @@ typedef enum
|
||||
IR_SNEQUAL, /* Set if args are not equal */
|
||||
IR_SGE, /* Set if greater or equal */
|
||||
IR_SGT, /* Set if greater than */
|
||||
IR_SLE, /* Set if less or equal */
|
||||
IR_SLT, /* Set if less than */
|
||||
IR_POW, /* x^y */
|
||||
IR_EXP, /* e^x */
|
||||
IR_EXP2, /* 2^x */
|
||||
|
||||
Reference in New Issue
Block a user