|
|
@@ -40,52 +40,104 @@ static inline unsigned int r600_bc_get_num_operands(struct r600_bc *bc, struct r |
|
|
|
if(alu->is_op3) |
|
|
|
return 3; |
|
|
|
|
|
|
|
switch (alu->inst) { |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP: |
|
|
|
return 0; |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLE: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGE: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLNE: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETE: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETGT: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETGE: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4_IEEE: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CUBE: |
|
|
|
return 2; |
|
|
|
|
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_FLOOR: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_CLAMPED: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_CLAMPED: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT: |
|
|
|
//case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT_FLOOR: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS: |
|
|
|
return 1; |
|
|
|
default: R600_ERR( |
|
|
|
"Need instruction operand number for 0x%x.\n", alu->inst); |
|
|
|
}; |
|
|
|
switch (bc->chiprev) { |
|
|
|
case CHIPREV_R600: |
|
|
|
case CHIPREV_R700: |
|
|
|
switch (alu->inst) { |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP: |
|
|
|
return 0; |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLE: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGE: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLNE: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETE: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETGT: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETGE: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4_IEEE: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CUBE: |
|
|
|
return 2; |
|
|
|
|
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_FLOOR: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_CLAMPED: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_CLAMPED: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN: |
|
|
|
case V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS: |
|
|
|
return 1; |
|
|
|
default: R600_ERR( |
|
|
|
"Need instruction operand number for 0x%x.\n", alu->inst); |
|
|
|
} |
|
|
|
break; |
|
|
|
case CHIPREV_EVERGREEN: |
|
|
|
switch (alu->inst) { |
|
|
|
case EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP: |
|
|
|
return 0; |
|
|
|
case EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD: |
|
|
|
case EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLE: |
|
|
|
case EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT: |
|
|
|
case EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGE: |
|
|
|
case EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLNE: |
|
|
|
case EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL: |
|
|
|
case EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX: |
|
|
|
case EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN: |
|
|
|
case EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE: |
|
|
|
case EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE: |
|
|
|
case EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT: |
|
|
|
case EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE: |
|
|
|
case EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETE: |
|
|
|
case EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETGT: |
|
|
|
case EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETGE: |
|
|
|
case EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE: |
|
|
|
case EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4: |
|
|
|
case EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4_IEEE: |
|
|
|
case EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CUBE: |
|
|
|
case EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INTERP_XY: |
|
|
|
case EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INTERP_ZW: |
|
|
|
return 2; |
|
|
|
|
|
|
|
case EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV: |
|
|
|
case EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT: |
|
|
|
case EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT: |
|
|
|
case EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR: |
|
|
|
case EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC: |
|
|
|
case EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE: |
|
|
|
case EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED: |
|
|
|
case EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE: |
|
|
|
case EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_CLAMPED: |
|
|
|
case EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE: |
|
|
|
case EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_CLAMPED: |
|
|
|
case EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE: |
|
|
|
case EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT: |
|
|
|
case EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT_FLOOR: |
|
|
|
case EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN: |
|
|
|
case EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS: |
|
|
|
return 1; |
|
|
|
default: R600_ERR( |
|
|
|
"Need instruction operand number for 0x%x.\n", alu->inst); |
|
|
|
} |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
return 3; |
|
|
|
} |
|
|
@@ -205,58 +257,118 @@ int r600_bc_add_output(struct r600_bc *bc, const struct r600_bc_output *output) |
|
|
|
/* alu instructions that can ony exits once per group */ |
|
|
|
static int is_alu_once_inst(struct r600_bc *bc, struct r600_bc_alu *alu) |
|
|
|
{ |
|
|
|
return !alu->is_op3 && ( |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLE || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGE || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLNE || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT_UINT || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGE_UINT || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLE_INT || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT_INT || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGE_INT || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLNE_INT || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETGT_UINT || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETGE_UINT || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETE || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETGT || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETGE || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SET_INV || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SET_POP || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SET_CLR || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SET_RESTORE || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETE_PUSH || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETGT_PUSH || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETGE_PUSH || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE_PUSH || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETE_INT || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETGT_INT || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETGE_INT || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE_INT || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETE_PUSH_INT || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETGT_PUSH_INT || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETGE_PUSH_INT || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE_PUSH_INT || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETLT_PUSH_INT || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETLE_PUSH_INT); |
|
|
|
switch (bc->chiprev) { |
|
|
|
case CHIPREV_R600: |
|
|
|
case CHIPREV_R700: |
|
|
|
return !alu->is_op3 && ( |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLE || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGE || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLNE || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT_UINT || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGE_UINT || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLE_INT || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT_INT || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGE_INT || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLNE_INT || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETGT_UINT || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETGE_UINT || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETE || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETGT || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETGE || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SET_INV || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SET_POP || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SET_CLR || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SET_RESTORE || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETE_PUSH || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETGT_PUSH || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETGE_PUSH || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE_PUSH || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETE_INT || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETGT_INT || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETGE_INT || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE_INT || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETE_PUSH_INT || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETGT_PUSH_INT || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETGE_PUSH_INT || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE_PUSH_INT || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETLT_PUSH_INT || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETLE_PUSH_INT); |
|
|
|
case CHIPREV_EVERGREEN: |
|
|
|
default: |
|
|
|
return !alu->is_op3 && ( |
|
|
|
alu->inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLE || |
|
|
|
alu->inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT || |
|
|
|
alu->inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGE || |
|
|
|
alu->inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLNE || |
|
|
|
alu->inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT_UINT || |
|
|
|
alu->inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGE_UINT || |
|
|
|
alu->inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLE_INT || |
|
|
|
alu->inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT_INT || |
|
|
|
alu->inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGE_INT || |
|
|
|
alu->inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLNE_INT || |
|
|
|
alu->inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETGT_UINT || |
|
|
|
alu->inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETGE_UINT || |
|
|
|
alu->inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETE || |
|
|
|
alu->inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETGT || |
|
|
|
alu->inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETGE || |
|
|
|
alu->inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE || |
|
|
|
alu->inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SET_INV || |
|
|
|
alu->inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SET_POP || |
|
|
|
alu->inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SET_CLR || |
|
|
|
alu->inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SET_RESTORE || |
|
|
|
alu->inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETE_PUSH || |
|
|
|
alu->inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETGT_PUSH || |
|
|
|
alu->inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETGE_PUSH || |
|
|
|
alu->inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE_PUSH || |
|
|
|
alu->inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETE_INT || |
|
|
|
alu->inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETGT_INT || |
|
|
|
alu->inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETGE_INT || |
|
|
|
alu->inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE_INT || |
|
|
|
alu->inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETE_PUSH_INT || |
|
|
|
alu->inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETGT_PUSH_INT || |
|
|
|
alu->inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETGE_PUSH_INT || |
|
|
|
alu->inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE_PUSH_INT || |
|
|
|
alu->inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETLT_PUSH_INT || |
|
|
|
alu->inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETLE_PUSH_INT); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
static int is_alu_reduction_inst(struct r600_bc *bc, struct r600_bc_alu *alu) |
|
|
|
{ |
|
|
|
return !alu->is_op3 && ( |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CUBE || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4 || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4_IEEE || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX4); |
|
|
|
switch (bc->chiprev) { |
|
|
|
case CHIPREV_R600: |
|
|
|
case CHIPREV_R700: |
|
|
|
return !alu->is_op3 && ( |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CUBE || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4 || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4_IEEE || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX4); |
|
|
|
case CHIPREV_EVERGREEN: |
|
|
|
default: |
|
|
|
return !alu->is_op3 && ( |
|
|
|
alu->inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CUBE || |
|
|
|
alu->inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4 || |
|
|
|
alu->inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4_IEEE || |
|
|
|
alu->inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX4); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
static int is_alu_mova_inst(struct r600_bc *bc, struct r600_bc_alu *alu) |
|
|
|
{ |
|
|
|
return !alu->is_op3 && ( |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_FLOOR || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT); |
|
|
|
switch (bc->chiprev) { |
|
|
|
case CHIPREV_R600: |
|
|
|
case CHIPREV_R700: |
|
|
|
return !alu->is_op3 && ( |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_FLOOR || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT); |
|
|
|
case CHIPREV_EVERGREEN: |
|
|
|
default: |
|
|
|
return !alu->is_op3 && ( |
|
|
|
alu->inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/* alu instructions that can only execute on the vector unit */ |
|
|
@@ -269,36 +381,69 @@ static int is_alu_vec_unit_inst(struct r600_bc *bc, struct r600_bc_alu *alu) |
|
|
|
/* alu instructions that can only execute on the trans unit */ |
|
|
|
static int is_alu_trans_unit_inst(struct r600_bc *bc, struct r600_bc_alu *alu) |
|
|
|
{ |
|
|
|
if(!alu->is_op3) |
|
|
|
return alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ASHR_INT || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHL_INT || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHR_INT || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_INT || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_INT || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_INT || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_UINT || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_CLAMPED || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_FF || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_CLAMPED || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_FF || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SQRT_IEEE; |
|
|
|
else |
|
|
|
return alu->inst == V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MUL_LIT || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MUL_LIT_D2 || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MUL_LIT_M2 || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MUL_LIT_M4; |
|
|
|
switch (bc->chiprev) { |
|
|
|
case CHIPREV_R600: |
|
|
|
case CHIPREV_R700: |
|
|
|
if (!alu->is_op3) |
|
|
|
return alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ASHR_INT || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHL_INT || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHR_INT || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_INT || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_INT || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_INT || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_UINT || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_CLAMPED || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_FF || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_CLAMPED || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_FF || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SQRT_IEEE; |
|
|
|
else |
|
|
|
return alu->inst == V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MUL_LIT || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MUL_LIT_D2 || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MUL_LIT_M2 || |
|
|
|
alu->inst == V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MUL_LIT_M4; |
|
|
|
case CHIPREV_EVERGREEN: |
|
|
|
default: |
|
|
|
if (!alu->is_op3) |
|
|
|
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_FLT_TO_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 || |
|
|
|
alu->inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHR_INT || |
|
|
|
alu->inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_INT || |
|
|
|
alu->inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT || |
|
|
|
alu->inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_INT || |
|
|
|
alu->inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT || |
|
|
|
alu->inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_INT || |
|
|
|
alu->inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_UINT || |
|
|
|
alu->inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT || |
|
|
|
alu->inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS || |
|
|
|
alu->inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE || |
|
|
|
alu->inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED || |
|
|
|
alu->inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE || |
|
|
|
alu->inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_CLAMPED || |
|
|
|
alu->inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_FF || |
|
|
|
alu->inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE || |
|
|
|
alu->inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_CLAMPED || |
|
|
|
alu->inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_FF || |
|
|
|
alu->inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE || |
|
|
|
alu->inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN || |
|
|
|
alu->inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SQRT_IEEE; |
|
|
|
else |
|
|
|
return alu->inst == EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MUL_LIT; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/* alu instructions that can execute on any unit */ |