r600g: FLT_TO_INT_FLOOR and FLT_TO_INT_RPI are vector-only instructions on Evergreen.
authorHenri Verbeet <hverbeet@gmail.com>
Tue, 15 Mar 2011 00:13:45 +0000 (01:13 +0100)
committerHenri Verbeet <hverbeet@gmail.com>
Tue, 15 Mar 2011 00:15:50 +0000 (01:15 +0100)
Signed-off-by: Henri Verbeet <hverbeet@gmail.com>
src/gallium/drivers/r600/r600_asm.c

index df7c5b3fbbcc1acb75d301c7bfcabec175e657cd..240093f9b9db52bcdbde6d27ffdb2271dde83d81 100644 (file)
@@ -426,7 +426,9 @@ static int is_alu_mova_inst(struct r600_bc *bc, struct r600_bc_alu *alu)
 static int is_alu_vec_unit_inst(struct r600_bc *bc, struct r600_bc_alu *alu)
 {
        return is_alu_reduction_inst(bc, alu) ||
-               is_alu_mova_inst(bc, alu);
+               is_alu_mova_inst(bc, alu) ||
+               (bc->chiprev == CHIPREV_EVERGREEN &&
+               alu->inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT_FLOOR);
 }
 
 /* alu instructions that can only execute on the trans unit */
@@ -468,8 +470,9 @@ static int is_alu_trans_unit_inst(struct r600_bc *bc, struct r600_bc_alu *alu)
        case CHIPREV_EVERGREEN:
        default:
                if (!alu->is_op3)
-                       /* Note that FLT_TO_INT* instructions are vector instructions
-                        * on Evergreen, despite what the documentation says. */
+                       /* Note that FLT_TO_INT_* instructions are vector-only instructions
+                        * on Evergreen, despite what the documentation says. FLT_TO_INT
+                        * can do both vector and scalar. */
                        return alu->inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ASHR_INT ||
                                alu->inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT ||
                                alu->inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHL_INT ||