diff --git a/src/gallium/drivers/r600/sfn/sfn_alu_defines.cpp b/src/gallium/drivers/r600/sfn/sfn_alu_defines.cpp index 7263da7e2f9..594db7bc937 100644 --- a/src/gallium/drivers/r600/sfn/sfn_alu_defines.cpp +++ b/src/gallium/drivers/r600/sfn/sfn_alu_defines.cpp @@ -29,210 +29,210 @@ namespace r600 { const std::map alu_ops = { - {op0_nop ,AluOp(0, 0, AluOp::a,"NOP")}, - {op0_group_barrier ,AluOp(0, 0, AluOp::a,"GROUP_BARRIER")}, - {op0_group_seq_begin ,AluOp(0, 0, AluOp::a,"GROUP_SEQ_BEGIN")}, - {op0_group_seq_end ,AluOp(0, 0, AluOp::a,"GROUP_SEQ_END")}, - {op0_pred_set_clr ,AluOp(0, 1, AluOp::a,"PRED_SET_CLR")}, - {op0_store_flags ,AluOp(0, 0, AluOp::v,"STORE_FLAGS")}, - {op0_lds_1a ,AluOp(0, 0, AluOp::v,"LDS_1A")}, - {op0_lds_1a1d ,AluOp(0, 0, AluOp::v,"LDS_1A1D")}, - {op0_lds_2a ,AluOp(0, 0, AluOp::v,"LDS_2A")}, + {op0_nop ,AluOp(0, 0, AluOp::a, AluOp::a,"NOP")}, + {op0_group_barrier ,AluOp(0, 0, AluOp::a, AluOp::a,"GROUP_BARRIER")}, + {op0_group_seq_begin ,AluOp(0, 0, AluOp::a, AluOp::a,"GROUP_SEQ_BEGIN")}, + {op0_group_seq_end ,AluOp(0, 0, AluOp::a, AluOp::a,"GROUP_SEQ_END")}, + {op0_pred_set_clr ,AluOp(0, 1, AluOp::a, AluOp::a,"PRED_SET_CLR")}, + {op0_store_flags ,AluOp(0, 0, AluOp::v, AluOp::v,"STORE_FLAGS")}, + {op0_lds_1a ,AluOp(0, 0, AluOp::v, AluOp::v,"LDS_1A")}, + {op0_lds_1a1d ,AluOp(0, 0, AluOp::v, AluOp::v,"LDS_1A1D")}, + {op0_lds_2a ,AluOp(0, 0, AluOp::v, AluOp::v,"LDS_2A")}, - {op1_bcnt_int ,AluOp(1, 0, AluOp::v,"BCNT_INT")}, - {op1_bcnt_accum_prev_int ,AluOp(1, 0, AluOp::v,"BCNT_ACCUM_PREV_INT")}, - {op1_bfrev_int ,AluOp(1, 0, AluOp::a,"BFREV_INT")}, - {op1_ceil ,AluOp(1, 1, AluOp::a,"CEIL")}, - {op1_cos ,AluOp(1, 1, AluOp::t,"COS")}, - {op1_exp_ieee ,AluOp(1, 1, AluOp::t,"EXP_IEEE")}, - {op1_floor ,AluOp(1, 1, AluOp::a,"FLOOR")}, - {op1_flt_to_int ,AluOp(1, 0, AluOp::v,"FLT_TO_INT")}, - {op1_flt_to_uint ,AluOp(1, 1, AluOp::t,"FLT_TO_UINT")}, - {op1_flt_to_int_rpi ,AluOp(1, 1, AluOp::v,"FLT_TO_INT_RPI")}, - {op1_flt_to_int_floor ,AluOp(1, 1, AluOp::v,"FLT_TO_INT_FLOOR")}, - {op1_flt16_to_flt32 ,AluOp(1, 1, AluOp::v,"FLT16_TO_FLT32")}, - {op1_flt32_to_flt16 ,AluOp(1, 1, AluOp::v,"FLT32_TO_FLT16")}, - {op1_flt32_to_flt64 ,AluOp(1, 1, AluOp::v,"FLT32_TO_FLT64")}, - {op1_flt64_to_flt32 ,AluOp(1, 1, AluOp::a,"FLT64_TO_FLT32")}, - {op1_fract ,AluOp(1, 1, AluOp::a,"FRACT")}, - {op1_fract_64 ,AluOp(1, 1, AluOp::v,"FRACT_64")}, - {op1_frexp_64 ,AluOp(1, 1, AluOp::v,"FREXP_64")}, - {op1_int_to_flt ,AluOp(1, 0, AluOp::t,"INT_TO_FLT")}, - {op1_ldexp_64 ,AluOp(1, 1, AluOp::v,"LDEXP_64")}, - {op1_interp_load_p0 ,AluOp(1, 1, AluOp::v,"INTERP_LOAD_P0")}, - {op1_interp_load_p10 ,AluOp(1, 1, AluOp::v,"INTERP_LOAD_P10")}, - {op1_interp_load_p20 ,AluOp(1, 1, AluOp::v,"INTERP_LOAD_P20")}, - {op1_load_store_flags ,AluOp(1, 0, AluOp::v,"LOAD_STORE_FLAGS")}, - {op1_log_clamped ,AluOp(1, 1, AluOp::t,"LOG_CLAMPED")}, - {op1_log_ieee ,AluOp(1, 1, AluOp::t,"LOG_IEEE")}, - {op1_max4 ,AluOp(1, 1, AluOp::v,"MAX4")}, - {op1_mbcnt_32hi_int ,AluOp(1, 0, AluOp::v,"MBCNT_32HI_INT")}, - {op1_mbcnt_32lo_accum_prev_int ,AluOp(1, 0, AluOp::v,"MBCNT_32LO_ACCUM_PREV_INT")}, - {op1_mov ,AluOp(1, 0, AluOp::a,"MOV")}, - {op1_mova_int ,AluOp(1, 0, AluOp::v,"MOVA_INT")}, - {op1_not_int ,AluOp(1, 0, AluOp::a,"NOT_INT")}, - {op1_offset_to_flt ,AluOp(1, 0, AluOp::v,"OFFSET_TO_FLT")}, - {op1_pred_set_inv ,AluOp(1, 1, AluOp::a,"PRED_SET_INV")}, - {op1_pred_set_restore ,AluOp(1, 1, AluOp::a,"PRED_SET_RESTORE")}, - {op1_set_cf_idx0 ,AluOp(1, 0, AluOp::a,"SET_CF_IDX0")}, /* Reads from AR register? */ - {op1_set_cf_idx1 ,AluOp(1, 0, AluOp::a,"SET_CF_IDX1")}, /* Reads from AR register? */ - {op1_recip_clamped ,AluOp(1, 1, AluOp::t,"RECIP_CLAMPED")}, - {op1_recip_ff ,AluOp(1, 1, AluOp::t,"RECIP_FF")}, - {op1_recip_ieee ,AluOp(1, 1, AluOp::t,"RECIP_IEEE")}, - {op1_recipsqrt_clamped ,AluOp(1, 1, AluOp::t,"RECIPSQRT_CLAMPED")}, - {op1_recipsqrt_ff ,AluOp(1, 1, AluOp::t,"RECIPSQRT_FF")}, - {op1_recipsqrt_ieee1 ,AluOp(1, 1, AluOp::t,"RECIPSQRT_IEEE")}, - {op1_recip_int ,AluOp(1, 0, AluOp::t,"RECIP_INT")}, - {op1_recip_uint ,AluOp(1, 0, AluOp::t,"RECIP_UINT")}, - {op1_recip_64 ,AluOp(2, 1, AluOp::t,"RECIP_64")}, - {op1_recip_clamped_64 ,AluOp(2, 1, AluOp::t,"RECIP_CLAMPED_64")}, - {op1_recipsqrt_64 ,AluOp(2, 1, AluOp::t,"RECIPSQRT_64")}, - {op1_recipsqrt_clamped_64,AluOp(2, 1, AluOp::t,"RECIPSQRT_CLAMPED_64")}, - {op1_rndne ,AluOp(1, 1, AluOp::a,"RNDNE")}, - {op1_sqrt_ieee ,AluOp(1, 1, AluOp::t,"SQRT_IEEE")}, - {op1_sin ,AluOp(1, 1, AluOp::t,"SIN")}, - {op1_trunc ,AluOp(1, 1, AluOp::a,"TRUNC")}, - {op1_sqrt_64 ,AluOp(2, 1, AluOp::t,"SQRT_64")}, - {op1_ubyte0_flt ,AluOp(1, 1, AluOp::v,"UBYTE0_FLT")}, - {op1_ubyte1_flt ,AluOp(1, 1, AluOp::v,"UBYTE1_FLT")}, - {op1_ubyte2_flt ,AluOp(1, 1, AluOp::v,"UBYTE2_FLT")}, - {op1_ubyte3_flt ,AluOp(1, 1, AluOp::v,"UBYTE3_FLT")}, - {op1_uint_to_flt ,AluOp(1, 0, AluOp::t,"UINT_TO_FLT")}, - {op1_ffbh_uint ,AluOp(1, 0, AluOp::v,"FFBH_UINT")}, - {op1_ffbl_int ,AluOp(1, 0, AluOp::v,"FFBL_INT")}, - {op1_ffbh_int ,AluOp(1, 0, AluOp::v,"FFBH_INT")}, - {op1_flt_to_uint4 ,AluOp(1, 1, AluOp::v,"FLT_TO_UINT4")}, - {op1v_flt32_to_flt64 ,AluOp(1, 1, AluOp::a,"FLT32_TO_FLT64")}, - {op1v_flt64_to_flt32 ,AluOp(1, 1, AluOp::v,"FLT64_TO_FLT32")}, + {op1_bcnt_int ,AluOp(1, 0, AluOp::v, AluOp::v,"BCNT_INT")}, + {op1_bcnt_accum_prev_int ,AluOp(1, 0, AluOp::v, AluOp::v,"BCNT_ACCUM_PREV_INT")}, + {op1_bfrev_int ,AluOp(1, 0, AluOp::a, AluOp::a,"BFREV_INT")}, + {op1_ceil ,AluOp(1, 1, AluOp::a, AluOp::a,"CEIL")}, + {op1_cos ,AluOp(1, 1, AluOp::t, AluOp::t,"COS")}, + {op1_exp_ieee ,AluOp(1, 1, AluOp::t, AluOp::t,"EXP_IEEE")}, + {op1_floor ,AluOp(1, 1, AluOp::a, AluOp::a,"FLOOR")}, + {op1_flt_to_int ,AluOp(1, 0, AluOp::t, AluOp::v,"FLT_TO_INT")}, + {op1_flt_to_uint ,AluOp(1, 1, AluOp::t, AluOp::t,"FLT_TO_UINT")}, + {op1_flt_to_int_rpi ,AluOp(1, 1, AluOp::v, AluOp::v,"FLT_TO_INT_RPI")}, + {op1_flt_to_int_floor ,AluOp(1, 1, AluOp::v, AluOp::v,"FLT_TO_INT_FLOOR")}, + {op1_flt16_to_flt32 ,AluOp(1, 1, AluOp::v, AluOp::v,"FLT16_TO_FLT32")}, + {op1_flt32_to_flt16 ,AluOp(1, 1, AluOp::v, AluOp::v,"FLT32_TO_FLT16")}, + {op1_flt32_to_flt64 ,AluOp(1, 1, AluOp::v, AluOp::v,"FLT32_TO_FLT64")}, + {op1_flt64_to_flt32 ,AluOp(1, 1, AluOp::a, AluOp::a,"FLT64_TO_FLT32")}, + {op1_fract ,AluOp(1, 1, AluOp::a, AluOp::a,"FRACT")}, + {op1_fract_64 ,AluOp(1, 1, AluOp::v, AluOp::v,"FRACT_64")}, + {op1_frexp_64 ,AluOp(1, 1, AluOp::v, AluOp::v,"FREXP_64")}, + {op1_int_to_flt ,AluOp(1, 0, AluOp::t, AluOp::t,"INT_TO_FLT")}, + {op1_ldexp_64 ,AluOp(1, 1, AluOp::v, AluOp::v,"LDEXP_64")}, + {op1_interp_load_p0 ,AluOp(1, 1, AluOp::v, AluOp::v,"INTERP_LOAD_P0")}, + {op1_interp_load_p10 ,AluOp(1, 1, AluOp::v, AluOp::v,"INTERP_LOAD_P10")}, + {op1_interp_load_p20 ,AluOp(1, 1, AluOp::v, AluOp::v,"INTERP_LOAD_P20")}, + {op1_load_store_flags ,AluOp(1, 0, AluOp::v, AluOp::v,"LOAD_STORE_FLAGS")}, + {op1_log_clamped ,AluOp(1, 1, AluOp::t, AluOp::t,"LOG_CLAMPED")}, + {op1_log_ieee ,AluOp(1, 1, AluOp::t, AluOp::t,"LOG_IEEE")}, + {op1_max4 ,AluOp(1, 1, AluOp::v, AluOp::v,"MAX4")}, + {op1_mbcnt_32hi_int ,AluOp(1, 0, AluOp::v, AluOp::v,"MBCNT_32HI_INT")}, + {op1_mbcnt_32lo_accum_prev_int ,AluOp(1, 0, AluOp::v, AluOp::v,"MBCNT_32LO_ACCUM_PREV_INT")}, + {op1_mov ,AluOp(1, 0, AluOp::a, AluOp::a,"MOV")}, + {op1_mova_int ,AluOp(1, 0, AluOp::v, AluOp::v,"MOVA_INT")}, + {op1_not_int ,AluOp(1, 0, AluOp::a, AluOp::a,"NOT_INT")}, + {op1_offset_to_flt ,AluOp(1, 0, AluOp::v, AluOp::v,"OFFSET_TO_FLT")}, + {op1_pred_set_inv ,AluOp(1, 1, AluOp::a, AluOp::a,"PRED_SET_INV")}, + {op1_pred_set_restore ,AluOp(1, 1, AluOp::a, AluOp::a,"PRED_SET_RESTORE")}, + {op1_set_cf_idx0 ,AluOp(1, 0, AluOp::a, AluOp::a,"SET_CF_IDX0")}, /* Reads from AR register? */ + {op1_set_cf_idx1 ,AluOp(1, 0, AluOp::a, AluOp::a,"SET_CF_IDX1")}, /* Reads from AR register? */ + {op1_recip_clamped ,AluOp(1, 1, AluOp::t, AluOp::t,"RECIP_CLAMPED")}, + {op1_recip_ff ,AluOp(1, 1, AluOp::t, AluOp::t,"RECIP_FF")}, + {op1_recip_ieee ,AluOp(1, 1, AluOp::t, AluOp::t,"RECIP_IEEE")}, + {op1_recipsqrt_clamped ,AluOp(1, 1, AluOp::t, AluOp::t,"RECIPSQRT_CLAMPED")}, + {op1_recipsqrt_ff ,AluOp(1, 1, AluOp::t, AluOp::t,"RECIPSQRT_FF")}, + {op1_recipsqrt_ieee1 ,AluOp(1, 1, AluOp::t, AluOp::t,"RECIPSQRT_IEEE")}, + {op1_recip_int ,AluOp(1, 0, AluOp::t, AluOp::t,"RECIP_INT")}, + {op1_recip_uint ,AluOp(1, 0, AluOp::t, AluOp::t,"RECIP_UINT")}, + {op1_recip_64 ,AluOp(2, 1, AluOp::t, AluOp::t,"RECIP_64")}, + {op1_recip_clamped_64 ,AluOp(2, 1, AluOp::t, AluOp::t,"RECIP_CLAMPED_64")}, + {op1_recipsqrt_64 ,AluOp(2, 1, AluOp::t, AluOp::t,"RECIPSQRT_64")}, + {op1_recipsqrt_clamped_64,AluOp(2, 1, AluOp::t, AluOp::t,"RECIPSQRT_CLAMPED_64")}, + {op1_rndne ,AluOp(1, 1, AluOp::a, AluOp::a,"RNDNE")}, + {op1_sqrt_ieee ,AluOp(1, 1, AluOp::t, AluOp::t,"SQRT_IEEE")}, + {op1_sin ,AluOp(1, 1, AluOp::t, AluOp::t,"SIN")}, + {op1_trunc ,AluOp(1, 1, AluOp::a, AluOp::a,"TRUNC")}, + {op1_sqrt_64 ,AluOp(2, 1, AluOp::t, AluOp::t,"SQRT_64")}, + {op1_ubyte0_flt ,AluOp(1, 1, AluOp::v, AluOp::v,"UBYTE0_FLT")}, + {op1_ubyte1_flt ,AluOp(1, 1, AluOp::v, AluOp::v,"UBYTE1_FLT")}, + {op1_ubyte2_flt ,AluOp(1, 1, AluOp::v, AluOp::v,"UBYTE2_FLT")}, + {op1_ubyte3_flt ,AluOp(1, 1, AluOp::v, AluOp::v,"UBYTE3_FLT")}, + {op1_uint_to_flt ,AluOp(1, 0, AluOp::t, AluOp::t,"UINT_TO_FLT")}, + {op1_ffbh_uint ,AluOp(1, 0, AluOp::v, AluOp::v,"FFBH_UINT")}, + {op1_ffbl_int ,AluOp(1, 0, AluOp::v, AluOp::v,"FFBL_INT")}, + {op1_ffbh_int ,AluOp(1, 0, AluOp::v, AluOp::v,"FFBH_INT")}, + {op1_flt_to_uint4 ,AluOp(1, 1, AluOp::v, AluOp::v,"FLT_TO_UINT4")}, + {op1v_flt32_to_flt64 ,AluOp(1, 1, AluOp::a, AluOp::a,"FLT32_TO_FLT64")}, + {op1v_flt64_to_flt32 ,AluOp(1, 1, AluOp::v, AluOp::v,"FLT64_TO_FLT32")}, - {op2_add ,AluOp(2, 1, AluOp::a,"ADD")}, - {op2_bfm_int ,AluOp(2, 0, AluOp::v,"BFM_INT")}, - {op2_mul ,AluOp(2, 1, AluOp::a,"MUL")}, - {op2_mul_ieee ,AluOp(2, 1, AluOp::a,"MUL_IEEE")}, - {op2_max ,AluOp(2, 1, AluOp::a,"MAX")}, - {op2_min ,AluOp(2, 1, AluOp::a,"MIN")}, - {op2_max_dx10 ,AluOp(2, 1, AluOp::a,"MAX_DX10")}, - {op2_min_dx10 ,AluOp(2, 1, AluOp::a,"MIN_DX10")}, - {op2_sete ,AluOp(2, 1, AluOp::a,"SETE")}, - {op2_setgt ,AluOp(2, 1, AluOp::a,"SETGT")}, - {op2_setge ,AluOp(2, 1, AluOp::a,"SETGE")}, - {op2_setne ,AluOp(2, 1, AluOp::a,"SETNE")}, - {op2_sete_dx10 ,AluOp(2, 1, AluOp::a,"SETE_DX10")}, - {op2_setgt_dx10 ,AluOp(2, 1, AluOp::a,"SETGT_DX10")}, - {op2_setge_dx10 ,AluOp(2, 1, AluOp::a,"SETGE_DX10")}, - {op2_setne_dx10 ,AluOp(2, 1, AluOp::a,"SETNE_DX10")}, - {op2_ashr_int ,AluOp(2, 0, AluOp::a,"ASHR_INT")}, - {op2_lshr_int ,AluOp(2, 0, AluOp::a,"LSHR_INT")}, - {op2_lshl_int ,AluOp(2, 0, AluOp::a,"LSHL_INT")}, - {op2_mul_64 ,AluOp(2, 1, AluOp::a,"MUL_64")}, - {op2_pred_setgt_uint ,AluOp(2, 0, AluOp::a,"PRED_SETGT_UINT")}, - {op2_pred_setge_uint ,AluOp(2, 0, AluOp::a,"PRED_SETGE_UINT")}, - {op2_pred_sete ,AluOp(2, 1, AluOp::a,"PRED_SETE")}, - {op2_pred_setgt ,AluOp(2, 1, AluOp::a,"PRED_SETGT")}, - {op2_pred_setge ,AluOp(2, 1, AluOp::a,"PRED_SETGE")}, - {op2_pred_setne ,AluOp(2, 1, AluOp::a,"PRED_SETNE")}, - {op2_pred_set_pop ,AluOp(2, 1, AluOp::a,"PRED_SET_POP")}, - {op2_pred_sete_push ,AluOp(2, 1, AluOp::a,"PRED_SETE_PUSH")}, - {op2_pred_setgt_push ,AluOp(2, 1, AluOp::a,"PRED_SETGT_PUSH")}, - {op2_pred_setge_push ,AluOp(2, 1, AluOp::a,"PRED_SETGE_PUSH")}, - {op2_pred_setne_push ,AluOp(2, 1, AluOp::a,"PRED_SETNE_PUSH")}, - {op2_kille ,AluOp(2, 1, AluOp::a,"KILLE")}, - {op2_killgt ,AluOp(2, 1, AluOp::a,"KILLGT")}, - {op2_killge ,AluOp(2, 1, AluOp::a,"KILLGE")}, - {op2_killne ,AluOp(2, 1, AluOp::a,"KILLNE")}, - {op2_and_int ,AluOp(2, 0, AluOp::a,"AND_INT")}, - {op2_or_int ,AluOp(2, 0, AluOp::a,"OR_INT")}, - {op2_xor_int ,AluOp(2, 0, AluOp::a,"XOR_INT")}, - {op2_add_int ,AluOp(2, 0, AluOp::a,"ADD_INT")}, - {op2_sub_int ,AluOp(2, 0, AluOp::a,"SUB_INT")}, - {op2_max_int ,AluOp(2, 0, AluOp::a,"MAX_INT")}, - {op2_min_int ,AluOp(2, 0, AluOp::a,"MIN_INT")}, - {op2_max_uint ,AluOp(2, 0, AluOp::a,"MAX_UINT")}, - {op2_min_uint ,AluOp(2, 0, AluOp::a,"MIN_UINT")}, - {op2_sete_int ,AluOp(2, 0, AluOp::a,"SETE_INT")}, - {op2_setgt_int ,AluOp(2, 0, AluOp::a,"SETGT_INT")}, - {op2_setge_int ,AluOp(2, 0, AluOp::a,"SETGE_INT")}, - {op2_setne_int ,AluOp(2, 0, AluOp::a,"SETNE_INT")}, - {op2_setgt_uint ,AluOp(2, 0, AluOp::a,"SETGT_UINT")}, - {op2_setge_uint ,AluOp(2, 0, AluOp::a,"SETGE_UINT")}, - {op2_killgt_uint ,AluOp(2, 0, AluOp::a,"KILLGT_UINT")}, - {op2_killge_uint ,AluOp(2, 0, AluOp::a,"KILLGE_UINT")}, - {op2_prede_int ,AluOp(2, 0, AluOp::a,"PREDE_INT")}, - {op2_pred_setgt_int ,AluOp(2, 0, AluOp::a,"PRED_SETGT_INT")}, - {op2_pred_setge_int ,AluOp(2, 0, AluOp::a,"PRED_SETGE_INT")}, - {op2_pred_setne_int ,AluOp(2, 0, AluOp::a,"PRED_SETNE_INT")}, - {op2_kille_int ,AluOp(2, 0, AluOp::a,"KILLE_INT")}, - {op2_killgt_int ,AluOp(2, 0, AluOp::a,"KILLGT_INT")}, - {op2_killge_int ,AluOp(2, 0, AluOp::a,"KILLGE_INT")}, - {op2_killne_int ,AluOp(2, 0, AluOp::a,"KILLNE_INT")}, - {op2_pred_sete_push_int ,AluOp(2, 0, AluOp::a,"PRED_SETE_PUSH_INT")}, - {op2_pred_setgt_push_int ,AluOp(2, 0, AluOp::a,"PRED_SETGT_PUSH_INT")}, - {op2_pred_setge_push_int ,AluOp(2, 0, AluOp::a,"PRED_SETGE_PUSH_INT")}, - {op2_pred_setne_push_int ,AluOp(2, 0, AluOp::a,"PRED_SETNE_PUSH_INT")}, - {op2_pred_setlt_push_int ,AluOp(2, 0, AluOp::a,"PRED_SETLT_PUSH_INT")}, - {op2_pred_setle_push_int ,AluOp(2, 0, AluOp::a,"PRED_SETLE_PUSH_INT")}, - {op2_addc_uint ,AluOp(2, 0, AluOp::a,"ADDC_UINT")}, - {op2_subb_uint ,AluOp(2, 0, AluOp::a,"SUBB_UINT")}, - {op2_set_mode ,AluOp(2, 0, AluOp::a,"SET_MODE")}, - {op2_set_lds_size ,AluOp(2, 0, AluOp::a,"SET_LDS_SIZE")}, - {op2_mullo_int ,AluOp(2, 0, AluOp::t,"MULLO_INT")}, - {op2_mulhi_int ,AluOp(2, 0, AluOp::t,"MULHI_INT")}, - {op2_mullo_uint ,AluOp(2, 0, AluOp::t,"MULLO_UINT")}, - {op2_mulhi_uint ,AluOp(2, 0, AluOp::t,"MULHI_UINT")}, - {op2_dot_ieee ,AluOp(2, 1, AluOp::v,"DOT_IEEE")}, - {op2_mulhi_uint24 ,AluOp(2, 0, AluOp::v,"MULHI_UINT24")}, - {op2_mul_uint24 ,AluOp(2, 0, AluOp::v,"MUL_UINT24")}, - {op2_sete_64 ,AluOp(2, 1, AluOp::v,"SETE_64")}, - {op2_setne_64 ,AluOp(2, 1, AluOp::v,"SETNE_64")}, - {op2_setgt_64 ,AluOp(2, 1, AluOp::v,"SETGT_64")}, - {op2_setge_64 ,AluOp(2, 1, AluOp::v,"SETGE_64")}, - {op2_min_64 ,AluOp(2, 1, AluOp::v,"MIN_64")}, - {op2_max_64 ,AluOp(2, 1, AluOp::v,"MAX_64")}, - {op2_dot4 ,AluOp(2, 1, AluOp::v,"DOT4")}, - {op2_dot4_ieee ,AluOp(2, 1, AluOp::v,"DOT4_IEEE")}, - {op2_cube ,AluOp(2, 1, AluOp::v,"CUBE")}, - {op2_pred_setgt_64 ,AluOp(2, 1, AluOp::v,"PRED_SETGT_64")}, - {op2_pred_sete_64 ,AluOp(2, 1, AluOp::v,"PRED_SETE_64")}, - {op2_pred_setge_64 ,AluOp(2, 1, AluOp::v,"PRED_SETGE_64")}, - {OP2V_MUL_64 ,AluOp(2, 1, AluOp::v,"MUL_64")}, - {op2_add_64 ,AluOp(2, 1, AluOp::v,"ADD_64")}, - {op2_sad_accum_prev_uint ,AluOp(2, 0, AluOp::v,"SAD_ACCUM_PREV_UINT")}, - {op2_dot ,AluOp(2, 1, AluOp::v,"DOT")}, - {op1_mul_prev ,AluOp(2, 1, AluOp::v,"MUL_PREV")}, - {op1_mul_ieee_prev ,AluOp(2, 1, AluOp::v,"MUL_IEEE_PREV")}, - {op1_add_prev ,AluOp(2, 1, AluOp::v,"ADD_PREV")}, - {op2_muladd_prev ,AluOp(2, 1, AluOp::v,"MULADD_PREV")}, - {op2_muladd_ieee_prev ,AluOp(2, 1, AluOp::v,"MULADD_IEEE_PREV")}, - {op2_interp_xy ,AluOp(2, 1, AluOp::v,"INTERP_XY")}, - {op2_interp_zw ,AluOp(2, 1, AluOp::v,"INTERP_ZW")}, - {op2_interp_x ,AluOp(2, 1, AluOp::v,"INTERP_X")}, - {op2_interp_z ,AluOp(2, 1, AluOp::v,"INTERP_Z")}, + {op2_add ,AluOp(2, 1, AluOp::a, AluOp::a,"ADD")}, + {op2_bfm_int ,AluOp(2, 0, AluOp::v, AluOp::v,"BFM_INT")}, + {op2_mul ,AluOp(2, 1, AluOp::a, AluOp::a,"MUL")}, + {op2_mul_ieee ,AluOp(2, 1, AluOp::a, AluOp::a,"MUL_IEEE")}, + {op2_max ,AluOp(2, 1, AluOp::a, AluOp::a,"MAX")}, + {op2_min ,AluOp(2, 1, AluOp::a, AluOp::a,"MIN")}, + {op2_max_dx10 ,AluOp(2, 1, AluOp::a, AluOp::a,"MAX_DX10")}, + {op2_min_dx10 ,AluOp(2, 1, AluOp::a, AluOp::a,"MIN_DX10")}, + {op2_sete ,AluOp(2, 1, AluOp::a, AluOp::a,"SETE")}, + {op2_setgt ,AluOp(2, 1, AluOp::a, AluOp::a,"SETGT")}, + {op2_setge ,AluOp(2, 1, AluOp::a, AluOp::a,"SETGE")}, + {op2_setne ,AluOp(2, 1, AluOp::a, AluOp::a,"SETNE")}, + {op2_sete_dx10 ,AluOp(2, 1, AluOp::a, AluOp::a,"SETE_DX10")}, + {op2_setgt_dx10 ,AluOp(2, 1, AluOp::a, AluOp::a,"SETGT_DX10")}, + {op2_setge_dx10 ,AluOp(2, 1, AluOp::a, AluOp::a,"SETGE_DX10")}, + {op2_setne_dx10 ,AluOp(2, 1, AluOp::a, AluOp::a,"SETNE_DX10")}, + {op2_ashr_int ,AluOp(2, 0, AluOp::a, AluOp::a,"ASHR_INT")}, + {op2_lshr_int ,AluOp(2, 0, AluOp::a, AluOp::a,"LSHR_INT")}, + {op2_lshl_int ,AluOp(2, 0, AluOp::a, AluOp::a,"LSHL_INT")}, + {op2_mul_64 ,AluOp(2, 1, AluOp::a, AluOp::a,"MUL_64")}, + {op2_pred_setgt_uint ,AluOp(2, 0, AluOp::a, AluOp::a,"PRED_SETGT_UINT")}, + {op2_pred_setge_uint ,AluOp(2, 0, AluOp::a, AluOp::a,"PRED_SETGE_UINT")}, + {op2_pred_sete ,AluOp(2, 1, AluOp::a, AluOp::a,"PRED_SETE")}, + {op2_pred_setgt ,AluOp(2, 1, AluOp::a, AluOp::a,"PRED_SETGT")}, + {op2_pred_setge ,AluOp(2, 1, AluOp::a, AluOp::a,"PRED_SETGE")}, + {op2_pred_setne ,AluOp(2, 1, AluOp::a, AluOp::a,"PRED_SETNE")}, + {op2_pred_set_pop ,AluOp(2, 1, AluOp::a, AluOp::a,"PRED_SET_POP")}, + {op2_pred_sete_push ,AluOp(2, 1, AluOp::a, AluOp::a,"PRED_SETE_PUSH")}, + {op2_pred_setgt_push ,AluOp(2, 1, AluOp::a, AluOp::a,"PRED_SETGT_PUSH")}, + {op2_pred_setge_push ,AluOp(2, 1, AluOp::a, AluOp::a,"PRED_SETGE_PUSH")}, + {op2_pred_setne_push ,AluOp(2, 1, AluOp::a, AluOp::a,"PRED_SETNE_PUSH")}, + {op2_kille ,AluOp(2, 1, AluOp::a, AluOp::a,"KILLE")}, + {op2_killgt ,AluOp(2, 1, AluOp::a, AluOp::a,"KILLGT")}, + {op2_killge ,AluOp(2, 1, AluOp::a, AluOp::a,"KILLGE")}, + {op2_killne ,AluOp(2, 1, AluOp::a, AluOp::a,"KILLNE")}, + {op2_and_int ,AluOp(2, 0, AluOp::a, AluOp::a,"AND_INT")}, + {op2_or_int ,AluOp(2, 0, AluOp::a, AluOp::a,"OR_INT")}, + {op2_xor_int ,AluOp(2, 0, AluOp::a, AluOp::a,"XOR_INT")}, + {op2_add_int ,AluOp(2, 0, AluOp::a, AluOp::a,"ADD_INT")}, + {op2_sub_int ,AluOp(2, 0, AluOp::a, AluOp::a,"SUB_INT")}, + {op2_max_int ,AluOp(2, 0, AluOp::a, AluOp::a,"MAX_INT")}, + {op2_min_int ,AluOp(2, 0, AluOp::a, AluOp::a,"MIN_INT")}, + {op2_max_uint ,AluOp(2, 0, AluOp::a, AluOp::a,"MAX_UINT")}, + {op2_min_uint ,AluOp(2, 0, AluOp::a, AluOp::a,"MIN_UINT")}, + {op2_sete_int ,AluOp(2, 0, AluOp::a, AluOp::a,"SETE_INT")}, + {op2_setgt_int ,AluOp(2, 0, AluOp::a, AluOp::a,"SETGT_INT")}, + {op2_setge_int ,AluOp(2, 0, AluOp::a, AluOp::a,"SETGE_INT")}, + {op2_setne_int ,AluOp(2, 0, AluOp::a, AluOp::a,"SETNE_INT")}, + {op2_setgt_uint ,AluOp(2, 0, AluOp::a, AluOp::a,"SETGT_UINT")}, + {op2_setge_uint ,AluOp(2, 0, AluOp::a, AluOp::a,"SETGE_UINT")}, + {op2_killgt_uint ,AluOp(2, 0, AluOp::a, AluOp::a,"KILLGT_UINT")}, + {op2_killge_uint ,AluOp(2, 0, AluOp::a, AluOp::a,"KILLGE_UINT")}, + {op2_prede_int ,AluOp(2, 0, AluOp::a, AluOp::a,"PREDE_INT")}, + {op2_pred_setgt_int ,AluOp(2, 0, AluOp::a, AluOp::a,"PRED_SETGT_INT")}, + {op2_pred_setge_int ,AluOp(2, 0, AluOp::a, AluOp::a,"PRED_SETGE_INT")}, + {op2_pred_setne_int ,AluOp(2, 0, AluOp::a, AluOp::a,"PRED_SETNE_INT")}, + {op2_kille_int ,AluOp(2, 0, AluOp::a, AluOp::a,"KILLE_INT")}, + {op2_killgt_int ,AluOp(2, 0, AluOp::a, AluOp::a,"KILLGT_INT")}, + {op2_killge_int ,AluOp(2, 0, AluOp::a, AluOp::a,"KILLGE_INT")}, + {op2_killne_int ,AluOp(2, 0, AluOp::a, AluOp::a,"KILLNE_INT")}, + {op2_pred_sete_push_int ,AluOp(2, 0, AluOp::a, AluOp::a,"PRED_SETE_PUSH_INT")}, + {op2_pred_setgt_push_int ,AluOp(2, 0, AluOp::a, AluOp::a,"PRED_SETGT_PUSH_INT")}, + {op2_pred_setge_push_int ,AluOp(2, 0, AluOp::a, AluOp::a,"PRED_SETGE_PUSH_INT")}, + {op2_pred_setne_push_int ,AluOp(2, 0, AluOp::a, AluOp::a,"PRED_SETNE_PUSH_INT")}, + {op2_pred_setlt_push_int ,AluOp(2, 0, AluOp::a, AluOp::a,"PRED_SETLT_PUSH_INT")}, + {op2_pred_setle_push_int ,AluOp(2, 0, AluOp::a, AluOp::a,"PRED_SETLE_PUSH_INT")}, + {op2_addc_uint ,AluOp(2, 0, AluOp::a, AluOp::a,"ADDC_UINT")}, + {op2_subb_uint ,AluOp(2, 0, AluOp::a, AluOp::a,"SUBB_UINT")}, + {op2_set_mode ,AluOp(2, 0, AluOp::a, AluOp::a,"SET_MODE")}, + {op2_set_lds_size ,AluOp(2, 0, AluOp::a, AluOp::a,"SET_LDS_SIZE")}, + {op2_mullo_int ,AluOp(2, 0, AluOp::t, AluOp::t,"MULLO_INT")}, + {op2_mulhi_int ,AluOp(2, 0, AluOp::t, AluOp::t,"MULHI_INT")}, + {op2_mullo_uint ,AluOp(2, 0, AluOp::t, AluOp::t,"MULLO_UINT")}, + {op2_mulhi_uint ,AluOp(2, 0, AluOp::t, AluOp::t,"MULHI_UINT")}, + {op2_dot_ieee ,AluOp(2, 1, AluOp::v, AluOp::v,"DOT_IEEE")}, + {op2_mulhi_uint24 ,AluOp(2, 0, AluOp::v, AluOp::v,"MULHI_UINT24")}, + {op2_mul_uint24 ,AluOp(2, 0, AluOp::v, AluOp::v,"MUL_UINT24")}, + {op2_sete_64 ,AluOp(2, 1, AluOp::v, AluOp::v,"SETE_64")}, + {op2_setne_64 ,AluOp(2, 1, AluOp::v, AluOp::v,"SETNE_64")}, + {op2_setgt_64 ,AluOp(2, 1, AluOp::v, AluOp::v,"SETGT_64")}, + {op2_setge_64 ,AluOp(2, 1, AluOp::v, AluOp::v,"SETGE_64")}, + {op2_min_64 ,AluOp(2, 1, AluOp::v, AluOp::v,"MIN_64")}, + {op2_max_64 ,AluOp(2, 1, AluOp::v, AluOp::v,"MAX_64")}, + {op2_dot4 ,AluOp(2, 1, AluOp::v, AluOp::v,"DOT4")}, + {op2_dot4_ieee ,AluOp(2, 1, AluOp::v, AluOp::v,"DOT4_IEEE")}, + {op2_cube ,AluOp(2, 1, AluOp::v, AluOp::v,"CUBE")}, + {op2_pred_setgt_64 ,AluOp(2, 1, AluOp::v, AluOp::v,"PRED_SETGT_64")}, + {op2_pred_sete_64 ,AluOp(2, 1, AluOp::v, AluOp::v,"PRED_SETE_64")}, + {op2_pred_setge_64 ,AluOp(2, 1, AluOp::v, AluOp::v,"PRED_SETGE_64")}, + {OP2V_MUL_64 ,AluOp(2, 1, AluOp::v, AluOp::v,"MUL_64")}, + {op2_add_64 ,AluOp(2, 1, AluOp::v, AluOp::v,"ADD_64")}, + {op2_sad_accum_prev_uint ,AluOp(2, 0, AluOp::v, AluOp::v,"SAD_ACCUM_PREV_UINT")}, + {op2_dot ,AluOp(2, 1, AluOp::v, AluOp::v,"DOT")}, + {op1_mul_prev ,AluOp(2, 1, AluOp::v, AluOp::v,"MUL_PREV")}, + {op1_mul_ieee_prev ,AluOp(2, 1, AluOp::v, AluOp::v,"MUL_IEEE_PREV")}, + {op1_add_prev ,AluOp(2, 1, AluOp::v, AluOp::v,"ADD_PREV")}, + {op2_muladd_prev ,AluOp(2, 1, AluOp::v, AluOp::v,"MULADD_PREV")}, + {op2_muladd_ieee_prev ,AluOp(2, 1, AluOp::v, AluOp::v,"MULADD_IEEE_PREV")}, + {op2_interp_xy ,AluOp(2, 1, AluOp::v, AluOp::v,"INTERP_XY")}, + {op2_interp_zw ,AluOp(2, 1, AluOp::v, AluOp::v,"INTERP_ZW")}, + {op2_interp_x ,AluOp(2, 1, AluOp::v, AluOp::v,"INTERP_X")}, + {op2_interp_z ,AluOp(2, 1, AluOp::v, AluOp::v,"INTERP_Z")}, - {op3_bfe_uint ,AluOp(3, 0, AluOp::v,"BFE_UINT")}, - {op3_bfe_int ,AluOp(3, 0, AluOp::v,"BFE_INT")}, - {op3_bfi_int ,AluOp(3, 0, AluOp::v,"BFI_INT")}, - {op3_fma ,AluOp(3, 1, AluOp::v,"FMA")}, - {op3_cndne_64 ,AluOp(3, 1, AluOp::v,"CNDNE_64")}, - {op3_fma_64 ,AluOp(3, 1, AluOp::v,"FMA_64")}, - {op3_lerp_uint ,AluOp(3, 0, AluOp::v,"LERP_UINT")}, - {op3_bit_align_int ,AluOp(3, 0, AluOp::v,"BIT_ALIGN_INT")}, - {op3_byte_align_int ,AluOp(3, 0, AluOp::v,"BYTE_ALIGN_INT")}, - {op3_sad_accum_uint ,AluOp(3, 0, AluOp::v,"SAD_ACCUM_UINT")}, - {op3_sad_accum_hi_uint ,AluOp(3, 0, AluOp::v,"SAD_ACCUM_HI_UINT")}, - {op3_muladd_uint24 ,AluOp(3, 0, AluOp::v,"MULADD_UINT24")}, - {op3_lds_idx_op ,AluOp(3, 0, AluOp::x,"LDS_IDX_OP")}, - {op3_muladd ,AluOp(3, 1, AluOp::a,"MULADD")}, - {op3_muladd_m2 ,AluOp(3, 1, AluOp::a,"MULADD_M2")}, - {op3_muladd_m4 ,AluOp(3, 1, AluOp::a,"MULADD_M4")}, - {op3_muladd_d2 ,AluOp(3, 1, AluOp::a,"MULADD_D2")}, - {op3_muladd_ieee ,AluOp(3, 1, AluOp::a,"MULADD_IEEE")}, - {op3_cnde ,AluOp(3, 1, AluOp::a,"CNDE")}, - {op3_cndgt ,AluOp(3, 1, AluOp::a,"CNDGT")}, - {op3_cndge ,AluOp(3, 1, AluOp::a,"CNDGE")}, - {op3_cnde_int ,AluOp(3, 0, AluOp::a,"CNDE_INT")}, - {op3_cndgt_int ,AluOp(3, 0, AluOp::a,"CNDGT_INT")}, - {op3_cndge_int ,AluOp(3, 0, AluOp::a,"CNDGE_INT")}, - {op3_mul_lit ,AluOp(3, 1, AluOp::t,"MUL_LIT")} + {op3_bfe_uint ,AluOp(3, 0, AluOp::v, AluOp::v,"BFE_UINT")}, + {op3_bfe_int ,AluOp(3, 0, AluOp::v, AluOp::v,"BFE_INT")}, + {op3_bfi_int ,AluOp(3, 0, AluOp::v, AluOp::v,"BFI_INT")}, + {op3_fma ,AluOp(3, 1, AluOp::v, AluOp::v,"FMA")}, + {op3_cndne_64 ,AluOp(3, 1, AluOp::v, AluOp::v,"CNDNE_64")}, + {op3_fma_64 ,AluOp(3, 1, AluOp::v, AluOp::v,"FMA_64")}, + {op3_lerp_uint ,AluOp(3, 0, AluOp::v, AluOp::v,"LERP_UINT")}, + {op3_bit_align_int ,AluOp(3, 0, AluOp::v, AluOp::v,"BIT_ALIGN_INT")}, + {op3_byte_align_int ,AluOp(3, 0, AluOp::v, AluOp::v,"BYTE_ALIGN_INT")}, + {op3_sad_accum_uint ,AluOp(3, 0, AluOp::v, AluOp::v,"SAD_ACCUM_UINT")}, + {op3_sad_accum_hi_uint ,AluOp(3, 0, AluOp::v, AluOp::v,"SAD_ACCUM_HI_UINT")}, + {op3_muladd_uint24 ,AluOp(3, 0, AluOp::v, AluOp::v,"MULADD_UINT24")}, + {op3_lds_idx_op ,AluOp(3, 0, AluOp::x, AluOp::x,"LDS_IDX_OP")}, + {op3_muladd ,AluOp(3, 1, AluOp::a, AluOp::a,"MULADD")}, + {op3_muladd_m2 ,AluOp(3, 1, AluOp::a, AluOp::a,"MULADD_M2")}, + {op3_muladd_m4 ,AluOp(3, 1, AluOp::a, AluOp::a,"MULADD_M4")}, + {op3_muladd_d2 ,AluOp(3, 1, AluOp::a, AluOp::a,"MULADD_D2")}, + {op3_muladd_ieee ,AluOp(3, 1, AluOp::a, AluOp::a,"MULADD_IEEE")}, + {op3_cnde ,AluOp(3, 1, AluOp::a, AluOp::a,"CNDE")}, + {op3_cndgt ,AluOp(3, 1, AluOp::a, AluOp::a,"CNDGT")}, + {op3_cndge ,AluOp(3, 1, AluOp::a, AluOp::a,"CNDGE")}, + {op3_cnde_int ,AluOp(3, 0, AluOp::a, AluOp::a,"CNDE_INT")}, + {op3_cndgt_int ,AluOp(3, 0, AluOp::a, AluOp::a,"CNDGT_INT")}, + {op3_cndge_int ,AluOp(3, 0, AluOp::a, AluOp::a,"CNDGE_INT")}, + {op3_mul_lit ,AluOp(3, 1, AluOp::t, AluOp::t,"MUL_LIT")} }; const std::map alu_src_const = { diff --git a/src/gallium/drivers/r600/sfn/sfn_alu_defines.h b/src/gallium/drivers/r600/sfn/sfn_alu_defines.h index 9bdedf85161..2e761c142ae 100644 --- a/src/gallium/drivers/r600/sfn/sfn_alu_defines.h +++ b/src/gallium/drivers/r600/sfn/sfn_alu_defines.h @@ -312,18 +312,19 @@ struct AluOp { static constexpr int t = 16; static constexpr int a = 31; - AluOp(int ns, int f, int um, const char *n): - nsrc(ns), is_float(f), unit_mask(um), name(n) + AluOp(int ns, int f, int um, int um_eg, const char *n): + nsrc(ns), is_float(f), unit_mask(um), unit_mask_eg(um_eg), name(n) { } - bool can_channel(int flags) const { - return flags & unit_mask; + bool can_channel(int flags, bool eg) const { + return flags & (eg ? unit_mask_eg : unit_mask); } int nsrc: 4; int is_float:1; int unit_mask: 5; + int unit_mask_eg: 5; const char *name; }; diff --git a/src/gallium/drivers/r600/sfn/sfn_instr_alu.cpp b/src/gallium/drivers/r600/sfn/sfn_instr_alu.cpp index fa021811cc7..277c946bbfc 100644 --- a/src/gallium/drivers/r600/sfn/sfn_instr_alu.cpp +++ b/src/gallium/drivers/r600/sfn/sfn_instr_alu.cpp @@ -1227,6 +1227,21 @@ bool AluInstr::from_nir(nir_alu_instr *alu, Shader& shader) ; } } else { + if (shader.chip_class() == ISA_CC_EVERGREEN) { + switch (alu->op) { + case nir_op_f2i32: return emit_alu_f2i32_or_u32_eg(*alu, op1_flt_to_int, shader); + case nir_op_f2u32: return emit_alu_f2i32_or_u32_eg(*alu, op1_flt_to_uint, shader); + default: + ; + } + } else { + switch (alu->op) { + case nir_op_f2i32: return emit_alu_trans_op1_eg(*alu, op1_flt_to_int, shader); + case nir_op_f2u32: return emit_alu_trans_op1_eg(*alu, op1_flt_to_uint, shader); + default: + ; + } + } switch (alu->op) { case nir_op_fcos_amd: return emit_alu_trans_op1_eg(*alu, op1_cos, shader); case nir_op_fexp2: return emit_alu_trans_op1_eg(*alu, op1_exp_ieee, shader); @@ -1240,8 +1255,6 @@ bool AluInstr::from_nir(nir_alu_instr *alu, Shader& shader) case nir_op_imul: return emit_alu_trans_op2_eg(*alu, op2_mullo_int, shader); case nir_op_imul_high: return emit_alu_trans_op2_eg(*alu, op2_mulhi_int, shader); case nir_op_umul_high: return emit_alu_trans_op2_eg(*alu, op2_mulhi_uint, shader); - case nir_op_f2i32: return emit_alu_f2i32_or_u32_eg(*alu, op1_flt_to_int, shader); - case nir_op_f2u32: return emit_alu_f2i32_or_u32_eg(*alu, op1_flt_to_uint, shader); default: ; } diff --git a/src/gallium/drivers/r600/sfn/sfn_instr_alugroup.cpp b/src/gallium/drivers/r600/sfn/sfn_instr_alugroup.cpp index b20eb3c2664..8ac9ca645b2 100644 --- a/src/gallium/drivers/r600/sfn/sfn_instr_alugroup.cpp +++ b/src/gallium/drivers/r600/sfn/sfn_instr_alugroup.cpp @@ -42,8 +42,12 @@ bool AluGroup::add_instruction(AluInstr *instr) if (m_has_lds_op && instr->has_lds_access()) return false; - if (instr->has_alu_flag(alu_is_trans) && add_trans_instructions(instr)) - return true; + if (instr->has_alu_flag(alu_is_trans)) { + auto opinfo = alu_ops.find(instr->opcode()); + assert(opinfo->second.can_channel(AluOp::t, s_eg_t_slot_handling)); + if (add_trans_instructions(instr)) + return true; + } if (add_vec_instructions(instr)) { instr->set_parent_group(this); @@ -54,7 +58,7 @@ bool AluGroup::add_instruction(AluInstr *instr) assert(opinfo != alu_ops.end()); if (s_max_slots > 4 && - opinfo->second.can_channel(AluOp::t) && + opinfo->second.can_channel(AluOp::t, s_eg_t_slot_handling) && add_trans_instructions(instr)) { instr->set_parent_group(this); return true; @@ -78,8 +82,10 @@ bool AluGroup::add_trans_instructions(AluInstr *instr) auto opinfo = alu_ops.find(instr->opcode()); assert(opinfo != alu_ops.end()); - if (!opinfo->second.can_channel(AluOp::t)) + if (!opinfo->second.can_channel(AluOp::t, s_eg_t_slot_handling)) { + std::cerr << *instr << ": t-slot not supported ("<< s_eg_t_slot_handling << ")\n"; return false; + } /* if we schedule a non-trans instr into the trans slot, we have to make @@ -373,15 +379,19 @@ AluInstr::SrcValues AluGroup::get_kconsts() const void AluGroup::set_chipclass(r600_chip_class chip_class) { + s_eg_t_slot_handling = false; switch (chip_class) { case ISA_CC_CAYMAN: s_max_slots = 4; break; + case ISA_CC_EVERGREEN: + s_eg_t_slot_handling = true; + FALLTHROUGH; default: s_max_slots = 5; } } int AluGroup::s_max_slots = 5; - +bool AluGroup::s_eg_t_slot_handling = false; } diff --git a/src/gallium/drivers/r600/sfn/sfn_instr_alugroup.h b/src/gallium/drivers/r600/sfn/sfn_instr_alugroup.h index 35089fd4e9a..7abea2a663d 100644 --- a/src/gallium/drivers/r600/sfn/sfn_instr_alugroup.h +++ b/src/gallium/drivers/r600/sfn/sfn_instr_alugroup.h @@ -99,6 +99,7 @@ private: AluReadportReservation m_readports_evaluator; static int s_max_slots; + static bool s_eg_t_slot_handling; PRegister m_addr_used{nullptr}; diff --git a/src/gallium/drivers/r600/sfn/sfn_scheduler.cpp b/src/gallium/drivers/r600/sfn/sfn_scheduler.cpp index 87ab579f8a3..07cacbb53e5 100644 --- a/src/gallium/drivers/r600/sfn/sfn_scheduler.cpp +++ b/src/gallium/drivers/r600/sfn/sfn_scheduler.cpp @@ -148,7 +148,7 @@ public: class BlockSheduler { public: - BlockSheduler(); + BlockSheduler( bool eg_t_slot_handling); void run(Shader *shader); void finalize(); @@ -218,6 +218,7 @@ private: int m_lds_addr_count{0}; int m_alu_groups_schduled{0}; + bool m_eg_t_slot_handling; }; @@ -236,7 +237,7 @@ Shader *schedule(Shader *original) // to be able to re-start scheduling auto scheduled_shader = original; - BlockSheduler s; + BlockSheduler s(original->chip_class() >= ISA_CC_EVERGREEN); s.run(scheduled_shader); s.finalize(); @@ -250,12 +251,13 @@ Shader *schedule(Shader *original) return scheduled_shader; } -BlockSheduler::BlockSheduler(): +BlockSheduler::BlockSheduler(bool eg_t_slot_handling): current_shed(sched_alu), m_last_pos(nullptr), m_last_pixel(nullptr), m_last_param(nullptr), - m_current_block(nullptr) + m_current_block(nullptr), + m_eg_t_slot_handling(eg_t_slot_handling) { } @@ -820,7 +822,8 @@ bool BlockSheduler::collect_ready_alu_vec(std::list& ready, std::lis else if (AluGroup::has_t()) { auto opinfo = alu_ops.find((*i)->opcode()); assert(opinfo != alu_ops.end()); - if (opinfo->second.can_channel(AluOp::t) && !(*i)->indirect_addr().first) + if (opinfo->second.can_channel(AluOp::t, m_eg_t_slot_handling) && + !(*i)->indirect_addr().first) priority = -1; }