diff options
| author | Brian <brian@yutani.localnet.net> | 2006-12-15 17:05:53 -0700 | 
|---|---|---|
| committer | Brian <brian@yutani.localnet.net> | 2006-12-15 17:05:53 -0700 | 
| commit | a4be1048870446a45a4a14178b47e2cb1a0d92d6 (patch) | |
| tree | 81b518dba12010b39ac0629b741651790de89a34 /src/mesa | |
| parent | cb7ccc4b144e546239294ae754aa634bbebc4c62 (diff) | |
start implementing relational operators
Diffstat (limited to 'src/mesa')
| -rw-r--r-- | src/mesa/shader/slang/slang_codegen.c | 24 | ||||
| -rw-r--r-- | src/mesa/shader/slang/slang_emit.c | 33 | ||||
| -rw-r--r-- | src/mesa/shader/slang/slang_ir.h | 1 | 
3 files changed, 40 insertions, 18 deletions
| diff --git a/src/mesa/shader/slang/slang_codegen.c b/src/mesa/shader/slang/slang_codegen.c index 611b6145f5..f62ff01f2d 100644 --- a/src/mesa/shader/slang/slang_codegen.c +++ b/src/mesa/shader/slang/slang_codegen.c @@ -963,10 +963,32 @@ slang_assemble_operation(slang_assemble_ctx * A, slang_operation *oper)                          );        }        break; +   case slang_oper_equal: +      return new_node(IR_SEQUAL, +                      slang_assemble_operation(A, &oper->children[0]), +                      slang_assemble_operation(A, &oper->children[1])); +   case slang_oper_notequal: +      return new_node(IR_SNEQUAL, +                      slang_assemble_operation(A, &oper->children[0]), +                      slang_assemble_operation(A, &oper->children[1])); +   case slang_oper_greater: +      return new_node(IR_SGT, +                      slang_assemble_operation(A, &oper->children[0]), +                      slang_assemble_operation(A, &oper->children[1]));     case slang_oper_less: -      return new_node(IR_LESS, +      /* child[0] < child[1]  ---->   child[1] > child[0] */ +      return new_node(IR_SGT, +                      slang_assemble_operation(A, &oper->children[1]), +                      slang_assemble_operation(A, &oper->children[0])); +   case slang_oper_greaterequal: +      return new_node(IR_SGE,                        slang_assemble_operation(A, &oper->children[0]),                        slang_assemble_operation(A, &oper->children[1])); +   case slang_oper_lessequal: +      /* child[0] <= child[1]  ---->   child[1] >= child[0] */ +      return new_node(IR_SGE, +                      slang_assemble_operation(A, &oper->children[1]), +                      slang_assemble_operation(A, &oper->children[0]));     case slang_oper_add:        {  	 slang_ir_node *n; diff --git a/src/mesa/shader/slang/slang_emit.c b/src/mesa/shader/slang/slang_emit.c index 8b95b94698..3d9d525e18 100644 --- a/src/mesa/shader/slang/slang_emit.c +++ b/src/mesa/shader/slang/slang_emit.c @@ -87,7 +87,6 @@ static slang_ir_info IrInfo[] = {     { IR_CJUMP, "IR_CJUMP", 0, 0, 0 },     { IR_CALL, "IR_CALL", 0, 0, 0 },     { IR_MOVE, "IR_MOVE", 0, 0, 1 }, -   { IR_LESS, "IR_LESS", 0, 1, 2 },     { IR_NOT, "IR_NOT", 0, 1, 1 },     { IR_VAR, "IR_VAR", 0, 0, 0 },     { IR_VAR_DECL, "IR_VAR_DECL", 0, 0, 0 }, @@ -866,21 +865,23 @@ new_instruction(struct gl_program *prog, gl_inst_opcode opcode)  static struct prog_instruction * -gen(slang_gen_context *gc, slang_ir_node *n, struct gl_program *prog); +emit(slang_gen_context *gc, slang_ir_node *n, struct gl_program *prog);  /**   * Generate code for a simple binary-op instruction.   */  static struct prog_instruction * -gen_binop(slang_gen_context *gc, slang_ir_node *n, struct gl_program *prog) +emit_binop(slang_gen_context *gc, slang_ir_node *n, struct gl_program *prog)  {     struct prog_instruction *inst;     const slang_ir_info *info = slang_find_ir_info(n->Opcode);     assert(info); -   gen(gc, n->Children[0], prog); -   gen(gc, n->Children[1], prog); +   assert(info->InstOpcode != OPCODE_NOP); + +   emit(gc, n->Children[0], prog); +   emit(gc, n->Children[1], prog);     inst = new_instruction(prog, info->InstOpcode);     /* alloc temp storage for the result: */     if (!n->Store || n->Store->File == PROGRAM_UNDEFINED) { @@ -901,7 +902,7 @@ gen_binop(slang_gen_context *gc, slang_ir_node *n, struct gl_program *prog)  static struct prog_instruction * -gen_unop(slang_gen_context *gc, slang_ir_node *n, struct gl_program *prog) +emit_unop(slang_gen_context *gc, slang_ir_node *n, struct gl_program *prog)  {     struct prog_instruction *inst;     const slang_ir_info *info = slang_find_ir_info(n->Opcode); @@ -909,7 +910,7 @@ gen_unop(slang_gen_context *gc, slang_ir_node *n, struct gl_program *prog)     assert(info->NumParams == 1); -   gen(gc, n->Children[0], prog); +   emit(gc, n->Children[0], prog);     inst = new_instruction(prog, info->InstOpcode);     /*slang_resolve_storage(gc, n, prog);*/ @@ -929,7 +930,7 @@ gen_unop(slang_gen_context *gc, slang_ir_node *n, struct gl_program *prog)  static struct prog_instruction * -gen(slang_gen_context *gc, slang_ir_node *n, struct gl_program *prog) +emit(slang_gen_context *gc, slang_ir_node *n, struct gl_program *prog)  {     struct prog_instruction *inst;     if (!n) @@ -939,8 +940,8 @@ gen(slang_gen_context *gc, slang_ir_node *n, struct gl_program *prog)     case IR_SEQ:        assert(n->Children[0]);        assert(n->Children[1]); -      gen(gc, n->Children[0], prog); -      inst = gen(gc, n->Children[1], prog); +      emit(gc, n->Children[0], prog); +      inst = emit(gc, n->Children[1], prog);        n->Store = n->Children[1]->Store;        return inst;        break; @@ -962,9 +963,9 @@ gen(slang_gen_context *gc, slang_ir_node *n, struct gl_program *prog)     case IR_MOVE:        /* rhs */        assert(n->Children[1]); -      inst = gen(gc, n->Children[1], prog); +      inst = emit(gc, n->Children[1], prog);        /* lhs */ -      gen(gc, n->Children[0], prog); +      emit(gc, n->Children[0], prog);  #if 1        if (inst && is_temporary(gc, n->Children[1]->Store)) { @@ -1032,7 +1033,7 @@ gen(slang_gen_context *gc, slang_ir_node *n, struct gl_program *prog)     case IR_POW:     case IR_EXP:     case IR_EXP2: -      return gen_binop(gc, n, prog); +      return emit_binop(gc, n, prog);        break;     case IR_RSQ:     case IR_RCP: @@ -1041,7 +1042,7 @@ gen(slang_gen_context *gc, slang_ir_node *n, struct gl_program *prog)     case IR_ABS:     case IR_SIN:     case IR_COS: -      return gen_unop(gc, n, prog); +      return emit_unop(gc, n, prog);        break;     case IR_LABEL:        /*printf("LAB: %s\n", n->Target);*/ @@ -1056,7 +1057,7 @@ gen(slang_gen_context *gc, slang_ir_node *n, struct gl_program *prog)        n->Store = alloc_constant(n->Value, 4, prog); /*XXX fix size */        break;     default: -      printf("gen: ?\n"); +      printf("emit: ?\n");        abort();     }     return NULL; @@ -1084,7 +1085,7 @@ _slang_emit_code(slang_ir_node *n, slang_gen_context *gc,     printf("************ Begin generate code\n"); -   gen(gc, n, prog); +   (void) emit(gc, n, prog);     {        struct prog_instruction *inst; diff --git a/src/mesa/shader/slang/slang_ir.h b/src/mesa/shader/slang/slang_ir.h index 3c583365d8..5c054a5636 100644 --- a/src/mesa/shader/slang/slang_ir.h +++ b/src/mesa/shader/slang/slang_ir.h @@ -74,7 +74,6 @@ typedef enum     IR_ABS,     IR_SIN,     IR_COS, -   IR_LESS,     IR_NOT,     IR_VAR,     IR_VAR_DECL, | 
