Added IR_SLE and IR_SLT for <= and < operations.
authorBrian <brian@yutani.localnet.net>
Thu, 8 Mar 2007 22:52:22 +0000 (15:52 -0700)
committerBrian <brian@yutani.localnet.net>
Thu, 8 Mar 2007 22:52:22 +0000 (15:52 -0700)
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.

src/mesa/shader/slang/slang_codegen.c
src/mesa/shader/slang/slang_emit.c
src/mesa/shader/slang/slang_ir.h

index 5da9855..ffc9b3e 100644 (file)
@@ -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;
index c90bf34..8ad61d8 100644 (file)
@@ -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:
index d2985ea..b733d10 100644 (file)
@@ -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 */