r600/sfn: Schedule shift instruction on R600 in t-slot

Fixes: 33765aa92a
    r600/sfn: Enable NIR for pre RG hardware

Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/18130>
This commit is contained in:
Gert Wollny 2022-08-04 10:20:33 +02:00 committed by Marge Bot
parent fd8e311988
commit 00599f6e71
6 changed files with 242 additions and 237 deletions

View file

@ -29,210 +29,210 @@
namespace r600 {
const std::map<EAluOp, AluOp> alu_ops = {
{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")},
{op0_nop ,AluOp(0, 0, AluOp::a, AluOp::a, AluOp::a, "NOP")},
{op0_group_barrier ,AluOp(0, 0, AluOp::a, AluOp::a, AluOp::a, "GROUP_BARRIER")},
{op0_group_seq_begin ,AluOp(0, 0, AluOp::a, AluOp::a, AluOp::a, "GROUP_SEQ_BEGIN")},
{op0_group_seq_end ,AluOp(0, 0, AluOp::a, AluOp::a, AluOp::a, "GROUP_SEQ_END")},
{op0_pred_set_clr ,AluOp(0, 1, AluOp::a, AluOp::a, AluOp::a, "PRED_SET_CLR")},
{op0_store_flags ,AluOp(0, 0, AluOp::v, AluOp::v, AluOp::v, "STORE_FLAGS")},
{op0_lds_1a ,AluOp(0, 0, AluOp::v, AluOp::v, AluOp::v, "LDS_1A")},
{op0_lds_1a1d ,AluOp(0, 0, AluOp::v, AluOp::v, AluOp::v, "LDS_1A1D")},
{op0_lds_2a ,AluOp(0, 0, AluOp::v, AluOp::v, AluOp::v, "LDS_2A")},
{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")},
{op1_bcnt_int ,AluOp(1, 0, AluOp::v, AluOp::v, AluOp::v, "BCNT_INT")},
{op1_bcnt_accum_prev_int ,AluOp(1, 0, AluOp::v, AluOp::v, AluOp::v, "BCNT_ACCUM_PREV_INT")},
{op1_bfrev_int ,AluOp(1, 0, AluOp::a, AluOp::a, AluOp::a, "BFREV_INT")},
{op1_ceil ,AluOp(1, 1, AluOp::a, AluOp::a, AluOp::a, "CEIL")},
{op1_cos ,AluOp(1, 1, AluOp::t, AluOp::t, AluOp::t, "COS")},
{op1_exp_ieee ,AluOp(1, 1, AluOp::t, AluOp::t, AluOp::t, "EXP_IEEE")},
{op1_floor ,AluOp(1, 1, AluOp::a, AluOp::a, AluOp::a, "FLOOR")},
{op1_flt_to_int ,AluOp(1, 0, AluOp::t, AluOp::t, AluOp::v, "FLT_TO_INT")},
{op1_flt_to_uint ,AluOp(1, 1, AluOp::t, AluOp::t, AluOp::t, "FLT_TO_UINT")},
{op1_flt_to_int_rpi ,AluOp(1, 1, AluOp::v, AluOp::v, AluOp::v, "FLT_TO_INT_RPI")},
{op1_flt_to_int_floor ,AluOp(1, 1, AluOp::v, AluOp::v, AluOp::v, "FLT_TO_INT_FLOOR")},
{op1_flt16_to_flt32 ,AluOp(1, 1, AluOp::v, AluOp::v, AluOp::v, "FLT16_TO_FLT32")},
{op1_flt32_to_flt16 ,AluOp(1, 1, AluOp::v, AluOp::v, AluOp::v, "FLT32_TO_FLT16")},
{op1_flt32_to_flt64 ,AluOp(1, 1, AluOp::v, AluOp::v, AluOp::v, "FLT32_TO_FLT64")},
{op1_flt64_to_flt32 ,AluOp(1, 1, AluOp::a, AluOp::a, AluOp::a, "FLT64_TO_FLT32")},
{op1_fract ,AluOp(1, 1, AluOp::a, AluOp::a, AluOp::a, "FRACT")},
{op1_fract_64 ,AluOp(1, 1, AluOp::v, AluOp::v, AluOp::v, "FRACT_64")},
{op1_frexp_64 ,AluOp(1, 1, AluOp::v, AluOp::v, AluOp::v, "FREXP_64")},
{op1_int_to_flt ,AluOp(1, 0, AluOp::t, AluOp::t, AluOp::t, "INT_TO_FLT")},
{op1_ldexp_64 ,AluOp(1, 1, AluOp::v, AluOp::v, AluOp::v, "LDEXP_64")},
{op1_interp_load_p0 ,AluOp(1, 1, AluOp::v, AluOp::v, AluOp::v, "INTERP_LOAD_P0")},
{op1_interp_load_p10 ,AluOp(1, 1, AluOp::v, AluOp::v, AluOp::v, "INTERP_LOAD_P10")},
{op1_interp_load_p20 ,AluOp(1, 1, AluOp::v, AluOp::v, AluOp::v, "INTERP_LOAD_P20")},
{op1_load_store_flags ,AluOp(1, 0, AluOp::v, AluOp::v, AluOp::v, "LOAD_STORE_FLAGS")},
{op1_log_clamped ,AluOp(1, 1, AluOp::t, AluOp::t, AluOp::t, "LOG_CLAMPED")},
{op1_log_ieee ,AluOp(1, 1, AluOp::t, AluOp::t, AluOp::t, "LOG_IEEE")},
{op1_max4 ,AluOp(1, 1, AluOp::v, AluOp::v, AluOp::v, "MAX4")},
{op1_mbcnt_32hi_int ,AluOp(1, 0, AluOp::v, AluOp::v, AluOp::v, "MBCNT_32HI_INT")},
{op1_mbcnt_32lo_accum_prev_int ,AluOp(1, 0, AluOp::v, AluOp::v, AluOp::v, "MBCNT_32LO_ACCUM_PREV_INT")},
{op1_mov ,AluOp(1, 0, AluOp::a, AluOp::a, AluOp::a, "MOV")},
{op1_mova_int ,AluOp(1, 0, AluOp::v, AluOp::v, AluOp::v, "MOVA_INT")},
{op1_not_int ,AluOp(1, 0, AluOp::a, AluOp::a, AluOp::a, "NOT_INT")},
{op1_offset_to_flt ,AluOp(1, 0, AluOp::v, AluOp::v, AluOp::v, "OFFSET_TO_FLT")},
{op1_pred_set_inv ,AluOp(1, 1, AluOp::a, AluOp::a, AluOp::a, "PRED_SET_INV")},
{op1_pred_set_restore ,AluOp(1, 1, AluOp::a, AluOp::a, AluOp::a, "PRED_SET_RESTORE")},
{op1_set_cf_idx0 ,AluOp(1, 0, AluOp::a, AluOp::a, AluOp::a, "SET_CF_IDX0")}, /* Reads from AR register? */
{op1_set_cf_idx1 ,AluOp(1, 0, AluOp::a, AluOp::a, AluOp::a, "SET_CF_IDX1")}, /* Reads from AR register? */
{op1_recip_clamped ,AluOp(1, 1, AluOp::t, AluOp::t, AluOp::t, "RECIP_CLAMPED")},
{op1_recip_ff ,AluOp(1, 1, AluOp::t, AluOp::t, AluOp::t, "RECIP_FF")},
{op1_recip_ieee ,AluOp(1, 1, AluOp::t, AluOp::t, AluOp::t, "RECIP_IEEE")},
{op1_recipsqrt_clamped ,AluOp(1, 1, AluOp::t, AluOp::t, AluOp::t, "RECIPSQRT_CLAMPED")},
{op1_recipsqrt_ff ,AluOp(1, 1, AluOp::t, AluOp::t, AluOp::t, "RECIPSQRT_FF")},
{op1_recipsqrt_ieee1 ,AluOp(1, 1, AluOp::t, AluOp::t, AluOp::t, "RECIPSQRT_IEEE")},
{op1_recip_int ,AluOp(1, 0, AluOp::t, AluOp::t, AluOp::t, "RECIP_INT")},
{op1_recip_uint ,AluOp(1, 0, AluOp::t, AluOp::t, AluOp::t, "RECIP_UINT")},
{op1_recip_64 ,AluOp(2, 1, AluOp::t, AluOp::t, AluOp::t, "RECIP_64")},
{op1_recip_clamped_64 ,AluOp(2, 1, AluOp::t, AluOp::t, AluOp::t, "RECIP_CLAMPED_64")},
{op1_recipsqrt_64 ,AluOp(2, 1, AluOp::t, AluOp::t, AluOp::t, "RECIPSQRT_64")},
{op1_recipsqrt_clamped_64,AluOp(2, 1, AluOp::t, AluOp::t, AluOp::t, "RECIPSQRT_CLAMPED_64")},
{op1_rndne ,AluOp(1, 1, AluOp::a, AluOp::a, AluOp::a, "RNDNE")},
{op1_sqrt_ieee ,AluOp(1, 1, AluOp::t, AluOp::t, AluOp::t, "SQRT_IEEE")},
{op1_sin ,AluOp(1, 1, AluOp::t, AluOp::t, AluOp::t, "SIN")},
{op1_trunc ,AluOp(1, 1, AluOp::a, AluOp::a, AluOp::a, "TRUNC")},
{op1_sqrt_64 ,AluOp(2, 1, AluOp::t, AluOp::t, AluOp::t, "SQRT_64")},
{op1_ubyte0_flt ,AluOp(1, 1, AluOp::v, AluOp::v, AluOp::v, "UBYTE0_FLT")},
{op1_ubyte1_flt ,AluOp(1, 1, AluOp::v, AluOp::v, AluOp::v, "UBYTE1_FLT")},
{op1_ubyte2_flt ,AluOp(1, 1, AluOp::v, AluOp::v, AluOp::v, "UBYTE2_FLT")},
{op1_ubyte3_flt ,AluOp(1, 1, AluOp::v, AluOp::v, AluOp::v, "UBYTE3_FLT")},
{op1_uint_to_flt ,AluOp(1, 0, AluOp::t, AluOp::t, AluOp::t, "UINT_TO_FLT")},
{op1_ffbh_uint ,AluOp(1, 0, AluOp::v, AluOp::v, AluOp::v, "FFBH_UINT")},
{op1_ffbl_int ,AluOp(1, 0, AluOp::v, AluOp::v, AluOp::v, "FFBL_INT")},
{op1_ffbh_int ,AluOp(1, 0, AluOp::v, AluOp::v, AluOp::v, "FFBH_INT")},
{op1_flt_to_uint4 ,AluOp(1, 1, AluOp::v, AluOp::v, AluOp::v, "FLT_TO_UINT4")},
{op1v_flt32_to_flt64 ,AluOp(1, 1, AluOp::a, AluOp::a, AluOp::a, "FLT32_TO_FLT64")},
{op1v_flt64_to_flt32 ,AluOp(1, 1, AluOp::v, AluOp::v, AluOp::v, "FLT64_TO_FLT32")},
{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")},
{op2_add ,AluOp(2, 1, AluOp::a, AluOp::a, AluOp::a, "ADD")},
{op2_bfm_int ,AluOp(2, 0, AluOp::v, AluOp::v, AluOp::v, "BFM_INT")},
{op2_mul ,AluOp(2, 1, AluOp::a, AluOp::a, AluOp::a, "MUL")},
{op2_mul_ieee ,AluOp(2, 1, AluOp::a, AluOp::a, AluOp::a, "MUL_IEEE")},
{op2_max ,AluOp(2, 1, AluOp::a, AluOp::a, AluOp::a, "MAX")},
{op2_min ,AluOp(2, 1, AluOp::a, AluOp::a, AluOp::a, "MIN")},
{op2_max_dx10 ,AluOp(2, 1, AluOp::a, AluOp::a, AluOp::a, "MAX_DX10")},
{op2_min_dx10 ,AluOp(2, 1, AluOp::a, AluOp::a, AluOp::a, "MIN_DX10")},
{op2_sete ,AluOp(2, 1, AluOp::a, AluOp::a, AluOp::a, "SETE")},
{op2_setgt ,AluOp(2, 1, AluOp::a, AluOp::a, AluOp::a, "SETGT")},
{op2_setge ,AluOp(2, 1, AluOp::a, AluOp::a, AluOp::a, "SETGE")},
{op2_setne ,AluOp(2, 1, AluOp::a, AluOp::a, AluOp::a, "SETNE")},
{op2_sete_dx10 ,AluOp(2, 1, AluOp::a, AluOp::a, AluOp::a, "SETE_DX10")},
{op2_setgt_dx10 ,AluOp(2, 1, AluOp::a, AluOp::a, AluOp::a, "SETGT_DX10")},
{op2_setge_dx10 ,AluOp(2, 1, AluOp::a, AluOp::a, AluOp::a, "SETGE_DX10")},
{op2_setne_dx10 ,AluOp(2, 1, AluOp::a, AluOp::a, AluOp::a, "SETNE_DX10")},
{op2_ashr_int ,AluOp(2, 0, AluOp::t, AluOp::a, AluOp::a, "ASHR_INT")},
{op2_lshr_int ,AluOp(2, 0, AluOp::t, AluOp::a, AluOp::a, "LSHR_INT")},
{op2_lshl_int ,AluOp(2, 0, AluOp::t, AluOp::a, AluOp::a, "LSHL_INT")},
{op2_mul_64 ,AluOp(2, 1, AluOp::a, AluOp::a, AluOp::a, "MUL_64")},
{op2_pred_setgt_uint ,AluOp(2, 0, AluOp::a, AluOp::a, AluOp::a, "PRED_SETGT_UINT")},
{op2_pred_setge_uint ,AluOp(2, 0, AluOp::a, AluOp::a, AluOp::a, "PRED_SETGE_UINT")},
{op2_pred_sete ,AluOp(2, 1, AluOp::a, AluOp::a, AluOp::a, "PRED_SETE")},
{op2_pred_setgt ,AluOp(2, 1, AluOp::a, AluOp::a, AluOp::a, "PRED_SETGT")},
{op2_pred_setge ,AluOp(2, 1, AluOp::a, AluOp::a, AluOp::a, "PRED_SETGE")},
{op2_pred_setne ,AluOp(2, 1, AluOp::a, AluOp::a, AluOp::a, "PRED_SETNE")},
{op2_pred_set_pop ,AluOp(2, 1, AluOp::a, AluOp::a, AluOp::a, "PRED_SET_POP")},
{op2_pred_sete_push ,AluOp(2, 1, AluOp::a, AluOp::a, AluOp::a, "PRED_SETE_PUSH")},
{op2_pred_setgt_push ,AluOp(2, 1, AluOp::a, AluOp::a, AluOp::a, "PRED_SETGT_PUSH")},
{op2_pred_setge_push ,AluOp(2, 1, AluOp::a, AluOp::a, AluOp::a, "PRED_SETGE_PUSH")},
{op2_pred_setne_push ,AluOp(2, 1, AluOp::a, AluOp::a, AluOp::a, "PRED_SETNE_PUSH")},
{op2_kille ,AluOp(2, 1, AluOp::a, AluOp::a, AluOp::a, "KILLE")},
{op2_killgt ,AluOp(2, 1, AluOp::a, AluOp::a, AluOp::a, "KILLGT")},
{op2_killge ,AluOp(2, 1, AluOp::a, AluOp::a, AluOp::a, "KILLGE")},
{op2_killne ,AluOp(2, 1, AluOp::a, AluOp::a, AluOp::a, "KILLNE")},
{op2_and_int ,AluOp(2, 0, AluOp::a, AluOp::a, AluOp::a, "AND_INT")},
{op2_or_int ,AluOp(2, 0, AluOp::a, AluOp::a, AluOp::a, "OR_INT")},
{op2_xor_int ,AluOp(2, 0, AluOp::a, AluOp::a, AluOp::a, "XOR_INT")},
{op2_add_int ,AluOp(2, 0, AluOp::a, AluOp::a, AluOp::a, "ADD_INT")},
{op2_sub_int ,AluOp(2, 0, AluOp::a, AluOp::a, AluOp::a, "SUB_INT")},
{op2_max_int ,AluOp(2, 0, AluOp::a, AluOp::a, AluOp::a, "MAX_INT")},
{op2_min_int ,AluOp(2, 0, AluOp::a, AluOp::a, AluOp::a, "MIN_INT")},
{op2_max_uint ,AluOp(2, 0, AluOp::a, AluOp::a, AluOp::a, "MAX_UINT")},
{op2_min_uint ,AluOp(2, 0, AluOp::a, AluOp::a, AluOp::a, "MIN_UINT")},
{op2_sete_int ,AluOp(2, 0, AluOp::a, AluOp::a, AluOp::a, "SETE_INT")},
{op2_setgt_int ,AluOp(2, 0, AluOp::a, AluOp::a, AluOp::a, "SETGT_INT")},
{op2_setge_int ,AluOp(2, 0, AluOp::a, AluOp::a, AluOp::a, "SETGE_INT")},
{op2_setne_int ,AluOp(2, 0, AluOp::a, AluOp::a, AluOp::a, "SETNE_INT")},
{op2_setgt_uint ,AluOp(2, 0, AluOp::a, AluOp::a, AluOp::a, "SETGT_UINT")},
{op2_setge_uint ,AluOp(2, 0, AluOp::a, AluOp::a, AluOp::a, "SETGE_UINT")},
{op2_killgt_uint ,AluOp(2, 0, AluOp::a, AluOp::a, AluOp::a, "KILLGT_UINT")},
{op2_killge_uint ,AluOp(2, 0, AluOp::a, AluOp::a, AluOp::a, "KILLGE_UINT")},
{op2_prede_int ,AluOp(2, 0, AluOp::a, AluOp::a, AluOp::a, "PREDE_INT")},
{op2_pred_setgt_int ,AluOp(2, 0, AluOp::a, AluOp::a, AluOp::a, "PRED_SETGT_INT")},
{op2_pred_setge_int ,AluOp(2, 0, AluOp::a, AluOp::a, AluOp::a, "PRED_SETGE_INT")},
{op2_pred_setne_int ,AluOp(2, 0, AluOp::a, AluOp::a, AluOp::a, "PRED_SETNE_INT")},
{op2_kille_int ,AluOp(2, 0, AluOp::a, AluOp::a, AluOp::a, "KILLE_INT")},
{op2_killgt_int ,AluOp(2, 0, AluOp::a, AluOp::a, AluOp::a, "KILLGT_INT")},
{op2_killge_int ,AluOp(2, 0, AluOp::a, AluOp::a, AluOp::a, "KILLGE_INT")},
{op2_killne_int ,AluOp(2, 0, AluOp::a, AluOp::a, AluOp::a, "KILLNE_INT")},
{op2_pred_sete_push_int ,AluOp(2, 0, AluOp::a, AluOp::a, AluOp::a, "PRED_SETE_PUSH_INT")},
{op2_pred_setgt_push_int ,AluOp(2, 0, AluOp::a, AluOp::a, AluOp::a, "PRED_SETGT_PUSH_INT")},
{op2_pred_setge_push_int ,AluOp(2, 0, AluOp::a, AluOp::a, AluOp::a, "PRED_SETGE_PUSH_INT")},
{op2_pred_setne_push_int ,AluOp(2, 0, AluOp::a, AluOp::a, AluOp::a, "PRED_SETNE_PUSH_INT")},
{op2_pred_setlt_push_int ,AluOp(2, 0, AluOp::a, AluOp::a, AluOp::a, "PRED_SETLT_PUSH_INT")},
{op2_pred_setle_push_int ,AluOp(2, 0, AluOp::a, AluOp::a, AluOp::a, "PRED_SETLE_PUSH_INT")},
{op2_addc_uint ,AluOp(2, 0, AluOp::a, AluOp::a, AluOp::a, "ADDC_UINT")},
{op2_subb_uint ,AluOp(2, 0, AluOp::a, AluOp::a, AluOp::a, "SUBB_UINT")},
{op2_set_mode ,AluOp(2, 0, AluOp::a, AluOp::a, AluOp::a, "SET_MODE")},
{op2_set_lds_size ,AluOp(2, 0, AluOp::a, AluOp::a, AluOp::a, "SET_LDS_SIZE")},
{op2_mullo_int ,AluOp(2, 0, AluOp::t, AluOp::t, AluOp::t, "MULLO_INT")},
{op2_mulhi_int ,AluOp(2, 0, AluOp::t, AluOp::t, AluOp::t, "MULHI_INT")},
{op2_mullo_uint ,AluOp(2, 0, AluOp::t, AluOp::t, AluOp::t, "MULLO_UINT")},
{op2_mulhi_uint ,AluOp(2, 0, AluOp::t, AluOp::t, AluOp::t, "MULHI_UINT")},
{op2_dot_ieee ,AluOp(2, 1, AluOp::v, AluOp::v, AluOp::v, "DOT_IEEE")},
{op2_mulhi_uint24 ,AluOp(2, 0, AluOp::v, AluOp::v, AluOp::v, "MULHI_UINT24")},
{op2_mul_uint24 ,AluOp(2, 0, AluOp::v, AluOp::v, AluOp::v, "MUL_UINT24")},
{op2_sete_64 ,AluOp(2, 1, AluOp::v, AluOp::v, AluOp::v, "SETE_64")},
{op2_setne_64 ,AluOp(2, 1, AluOp::v, AluOp::v, AluOp::v, "SETNE_64")},
{op2_setgt_64 ,AluOp(2, 1, AluOp::v, AluOp::v, AluOp::v, "SETGT_64")},
{op2_setge_64 ,AluOp(2, 1, AluOp::v, AluOp::v, AluOp::v, "SETGE_64")},
{op2_min_64 ,AluOp(2, 1, AluOp::v, AluOp::v, AluOp::v, "MIN_64")},
{op2_max_64 ,AluOp(2, 1, AluOp::v, AluOp::v, AluOp::v, "MAX_64")},
{op2_dot4 ,AluOp(2, 1, AluOp::v, AluOp::v, AluOp::v, "DOT4")},
{op2_dot4_ieee ,AluOp(2, 1, AluOp::v, AluOp::v, AluOp::v, "DOT4_IEEE")},
{op2_cube ,AluOp(2, 1, AluOp::v, AluOp::v, AluOp::v, "CUBE")},
{op2_pred_setgt_64 ,AluOp(2, 1, AluOp::v, AluOp::v, AluOp::v, "PRED_SETGT_64")},
{op2_pred_sete_64 ,AluOp(2, 1, AluOp::v, AluOp::v, AluOp::v, "PRED_SETE_64")},
{op2_pred_setge_64 ,AluOp(2, 1, AluOp::v, AluOp::v, AluOp::v, "PRED_SETGE_64")},
{OP2V_MUL_64 ,AluOp(2, 1, AluOp::v, AluOp::v, AluOp::v, "MUL_64")},
{op2_add_64 ,AluOp(2, 1, AluOp::v, AluOp::v, AluOp::v, "ADD_64")},
{op2_sad_accum_prev_uint ,AluOp(2, 0, AluOp::v, AluOp::v, AluOp::v, "SAD_ACCUM_PREV_UINT")},
{op2_dot ,AluOp(2, 1, AluOp::v, AluOp::v, AluOp::v, "DOT")},
{op1_mul_prev ,AluOp(2, 1, AluOp::v, AluOp::v, AluOp::v, "MUL_PREV")},
{op1_mul_ieee_prev ,AluOp(2, 1, AluOp::v, AluOp::v, AluOp::v, "MUL_IEEE_PREV")},
{op1_add_prev ,AluOp(2, 1, AluOp::v, AluOp::v, AluOp::v, "ADD_PREV")},
{op2_muladd_prev ,AluOp(2, 1, AluOp::v, AluOp::v, AluOp::v, "MULADD_PREV")},
{op2_muladd_ieee_prev ,AluOp(2, 1, AluOp::v, AluOp::v, AluOp::v, "MULADD_IEEE_PREV")},
{op2_interp_xy ,AluOp(2, 1, AluOp::v, AluOp::v, AluOp::v, "INTERP_XY")},
{op2_interp_zw ,AluOp(2, 1, AluOp::v, AluOp::v, AluOp::v, "INTERP_ZW")},
{op2_interp_x ,AluOp(2, 1, AluOp::v, AluOp::v, AluOp::v, "INTERP_X")},
{op2_interp_z ,AluOp(2, 1, AluOp::v, AluOp::v, AluOp::v, "INTERP_Z")},
{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")}
{op3_bfe_uint ,AluOp(3, 0, AluOp::v, AluOp::v, AluOp::v, "BFE_UINT")},
{op3_bfe_int ,AluOp(3, 0, AluOp::v, AluOp::v, AluOp::v, "BFE_INT")},
{op3_bfi_int ,AluOp(3, 0, AluOp::v, AluOp::v, AluOp::v, "BFI_INT")},
{op3_fma ,AluOp(3, 1, AluOp::v, AluOp::v, AluOp::v, "FMA")},
{op3_cndne_64 ,AluOp(3, 1, AluOp::v, AluOp::v, AluOp::v, "CNDNE_64")},
{op3_fma_64 ,AluOp(3, 1, AluOp::v, AluOp::v, AluOp::v, "FMA_64")},
{op3_lerp_uint ,AluOp(3, 0, AluOp::v, AluOp::v, AluOp::v, "LERP_UINT")},
{op3_bit_align_int ,AluOp(3, 0, AluOp::v, AluOp::v, AluOp::v, "BIT_ALIGN_INT")},
{op3_byte_align_int ,AluOp(3, 0, AluOp::v, AluOp::v, AluOp::v, "BYTE_ALIGN_INT")},
{op3_sad_accum_uint ,AluOp(3, 0, AluOp::v, AluOp::v, AluOp::v, "SAD_ACCUM_UINT")},
{op3_sad_accum_hi_uint ,AluOp(3, 0, AluOp::v, AluOp::v, AluOp::v, "SAD_ACCUM_HI_UINT")},
{op3_muladd_uint24 ,AluOp(3, 0, AluOp::v, AluOp::v, AluOp::v, "MULADD_UINT24")},
{op3_lds_idx_op ,AluOp(3, 0, AluOp::x, AluOp::x, AluOp::x,"LDS_IDX_OP")},
{op3_muladd ,AluOp(3, 1, AluOp::a, AluOp::a, AluOp::a, "MULADD")},
{op3_muladd_m2 ,AluOp(3, 1, AluOp::a, AluOp::a, AluOp::a, "MULADD_M2")},
{op3_muladd_m4 ,AluOp(3, 1, AluOp::a, AluOp::a, AluOp::a, "MULADD_M4")},
{op3_muladd_d2 ,AluOp(3, 1, AluOp::a, AluOp::a, AluOp::a, "MULADD_D2")},
{op3_muladd_ieee ,AluOp(3, 1, AluOp::a, AluOp::a, AluOp::a, "MULADD_IEEE")},
{op3_cnde ,AluOp(3, 1, AluOp::a, AluOp::a, AluOp::a, "CNDE")},
{op3_cndgt ,AluOp(3, 1, AluOp::a, AluOp::a, AluOp::a, "CNDGT")},
{op3_cndge ,AluOp(3, 1, AluOp::a, AluOp::a, AluOp::a, "CNDGE")},
{op3_cnde_int ,AluOp(3, 0, AluOp::a, AluOp::a, AluOp::a, "CNDE_INT")},
{op3_cndgt_int ,AluOp(3, 0, AluOp::a, AluOp::a, AluOp::a, "CNDGT_INT")},
{op3_cndge_int ,AluOp(3, 0, AluOp::a, AluOp::a, AluOp::a, "CNDGE_INT")},
{op3_mul_lit ,AluOp(3, 1, AluOp::t, AluOp::t, AluOp::t, "MUL_LIT")}
};
const std::map<AluInlineConstants, AluInlineConstantDescr> alu_src_const = {

View file

@ -312,19 +312,22 @@ struct AluOp {
static constexpr int t = 16;
static constexpr int a = 31;
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)
AluOp(int ns, int f, uint8_t um_r600, uint8_t um_r700, uint8_t um_eg, const char *n):
nsrc(ns), is_float(f), name(n)
{
unit_mask[0] = um_r600;
unit_mask[1] = um_r700;
unit_mask[2] = um_eg;
}
bool can_channel(int flags, bool eg) const {
return flags & (eg ? unit_mask_eg : unit_mask);
bool can_channel(int flags, r600_chip_class unit_type) const {
assert(unit_type < 3);
return flags & unit_mask[unit_type];
}
int nsrc: 4;
int is_float:1;
int unit_mask: 5;
int unit_mask_eg: 5;
uint8_t unit_mask[3];
const char *name;
};

View file

@ -1234,15 +1234,29 @@ bool AluInstr::from_nir(nir_alu_instr *alu, Shader& shader)
default:
;
}
} else {
}
if (shader.chip_class() >= ISA_CC_R700) {
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);
case nir_op_ishl: return emit_alu_op2_int(*alu, op2_lshl_int, shader);
case nir_op_ishr: return emit_alu_op2_int(*alu, op2_ashr_int, shader);
case nir_op_ushr: return emit_alu_op2_int(*alu, op2_lshr_int, shader);
default:
;
}
}
} else {
switch (alu->op) {
case nir_op_ishl: return emit_alu_trans_op2_eg(*alu, op2_lshl_int, shader);
case nir_op_ishr: return emit_alu_trans_op2_eg(*alu, op2_ashr_int, shader);
case nir_op_ushr: return emit_alu_trans_op2_eg(*alu, op2_lshr_int, shader);
default:
;
}
}
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);
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);
case nir_op_flog2: return emit_alu_trans_op1_eg(*alu, op1_log_clamped, shader);
@ -1347,8 +1361,6 @@ bool AluInstr::from_nir(nir_alu_instr *alu, Shader& shader)
case nir_op_ineg: return emit_alu_comb_with_zero(*alu, op2_sub_int, shader);
case nir_op_inot: return emit_alu_op1(*alu, op1_not_int, shader);
case nir_op_ior: return emit_alu_op2_int(*alu, op2_or_int, shader);
case nir_op_ishl: return emit_alu_op2_int(*alu, op2_lshl_int, shader);
case nir_op_ishr: return emit_alu_op2_int(*alu, op2_ashr_int, shader);
case nir_op_isub: return emit_alu_op2_int(*alu, op2_sub_int, shader);
case nir_op_ixor: return emit_alu_op2_int(*alu, op2_xor_int, shader);
case nir_op_pack_64_2x32: return emit_pack_64_2x32(*alu, shader);
@ -1367,7 +1379,6 @@ bool AluInstr::from_nir(nir_alu_instr *alu, Shader& shader)
case nir_op_umax: return emit_alu_op2_int(*alu, op2_max_uint, shader);
case nir_op_umin: return emit_alu_op2_int(*alu, op2_min_uint, shader);
case nir_op_umul24: return emit_alu_op2(*alu, op2_mul_uint24, shader);
case nir_op_ushr: return emit_alu_op2_int(*alu, op2_lshr_int, shader);
case nir_op_unpack_64_2x32_split_x: return emit_unpack_64_2x32_split(*alu, 0, shader);
case nir_op_unpack_64_2x32_split_y: return emit_unpack_64_2x32_split(*alu, 1, shader);
case nir_op_unpack_half_2x16_split_x: return emit_unpack_32_2x16_split_x(*alu, shader);

View file

@ -44,12 +44,12 @@ bool AluGroup::add_instruction(AluInstr *instr)
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));
assert(opinfo->second.can_channel(AluOp::t, s_chip_class));
if (add_trans_instructions(instr))
return true;
}
if (add_vec_instructions(instr)) {
if (add_vec_instructions(instr) && !instr->has_alu_flag(alu_is_trans)) {
instr->set_parent_group(this);
return true;
}
@ -58,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, s_eg_t_slot_handling) &&
opinfo->second.can_channel(AluOp::t, s_chip_class) &&
add_trans_instructions(instr)) {
instr->set_parent_group(this);
return true;
@ -82,7 +82,7 @@ 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, s_eg_t_slot_handling))
if (!opinfo->second.can_channel(AluOp::t, s_chip_class))
return false;
/* if we schedule a non-trans instr into the trans slot, we have to make
@ -376,19 +376,10 @@ 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;
}
s_chip_class = chip_class;
s_max_slots = chip_class == ISA_CC_CAYMAN ? 4 : 5;
}
int AluGroup::s_max_slots = 5;
bool AluGroup::s_eg_t_slot_handling = false;
r600_chip_class AluGroup::s_chip_class = ISA_CC_EVERGREEN;
}

View file

@ -99,7 +99,7 @@ private:
AluReadportReservation m_readports_evaluator;
static int s_max_slots;
static bool s_eg_t_slot_handling;
static r600_chip_class s_chip_class;
PRegister m_addr_used{nullptr};

View file

@ -148,7 +148,7 @@ public:
class BlockSheduler {
public:
BlockSheduler( bool eg_t_slot_handling);
BlockSheduler(r600_chip_class chip_class);
void run(Shader *shader);
void finalize();
@ -218,7 +218,7 @@ private:
int m_lds_addr_count{0};
int m_alu_groups_schduled{0};
bool m_eg_t_slot_handling;
r600_chip_class m_chip_class;
};
@ -238,7 +238,7 @@ Shader *schedule(Shader *original)
// to be able to re-start scheduling
auto scheduled_shader = original;
BlockSheduler s(original->chip_class() >= ISA_CC_EVERGREEN);
BlockSheduler s(original->chip_class());
s.run(scheduled_shader);
s.finalize();
@ -252,13 +252,13 @@ Shader *schedule(Shader *original)
return scheduled_shader;
}
BlockSheduler::BlockSheduler(bool eg_t_slot_handling):
BlockSheduler::BlockSheduler(r600_chip_class chip_class):
current_shed(sched_alu),
m_last_pos(nullptr),
m_last_pixel(nullptr),
m_last_param(nullptr),
m_current_block(nullptr),
m_eg_t_slot_handling(eg_t_slot_handling)
m_chip_class(chip_class)
{
}
@ -823,7 +823,7 @@ bool BlockSheduler::collect_ready_alu_vec(std::list<AluInstr *>& 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, m_eg_t_slot_handling) &&
if (opinfo->second.can_channel(AluOp::t, m_chip_class) &&
!(*i)->indirect_addr().first)
priority = -1;
}