//===-- VIInstructions.td - VI Instruction Defintions ---------------------===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // Instruction definitions for VI and newer. //===----------------------------------------------------------------------===// let SIAssemblerPredicate = DisableInst, SubtargetPredicate = isVI in { //===----------------------------------------------------------------------===// // VOP1 Instructions //===----------------------------------------------------------------------===// defm V_CVT_F16_U16 : VOP1Inst , "v_cvt_f16_u16", VOP_F16_I16>; defm V_CVT_F16_I16 : VOP1Inst , "v_cvt_f16_i16", VOP_F16_I16>; defm V_CVT_U16_F16 : VOP1Inst , "v_cvt_u16_f16", VOP_I16_F16>; defm V_CVT_I16_F16 : VOP1Inst , "v_cvt_i16_f16", VOP_I16_F16>; defm V_RCP_F16 : VOP1Inst , "v_rcp_f16", VOP_F16_F16>; defm V_SQRT_F16 : VOP1Inst , "v_sqrt_f16", VOP_F16_F16>; defm V_RSQ_F16 : VOP1Inst , "v_rsq_f16", VOP_F16_F16>; defm V_LOG_F16 : VOP1Inst , "v_log_f16", VOP_F16_F16>; defm V_EXP_F16 : VOP1Inst , "v_exp_f16", VOP_F16_F16>; defm V_FREXP_MANT_F16 : VOP1Inst , "v_frexp_mant_f16", VOP_F16_F16 >; defm V_FREXP_EXP_I16_F16 : VOP1Inst , "v_frexp_exp_i16_f16", VOP_I16_F16 >; defm V_FLOOR_F16 : VOP1Inst , "v_floor_f16", VOP_F16_F16>; defm V_CEIL_F16 : VOP1Inst , "v_ceil_f16", VOP_F16_F16>; defm V_TRUNC_F16 : VOP1Inst , "v_trunc_f16", VOP_F16_F16>; defm V_RNDNE_F16 : VOP1Inst , "v_rndne_f16", VOP_F16_F16>; defm V_FRACT_F16 : VOP1Inst , "v_fract_f16", VOP_F16_F16>; defm V_SIN_F16 : VOP1Inst , "v_sin_f16", VOP_F16_F16>; defm V_COS_F16 : VOP1Inst , "v_cos_f16", VOP_F16_F16>; //===----------------------------------------------------------------------===// // VOP2 Instructions //===----------------------------------------------------------------------===// let isCommutable = 1 in { defm V_ADD_F16 : VOP2Inst , "v_add_f16", VOP_F16_F16_F16>; defm V_SUB_F16 : VOP2Inst , "v_sub_f16", VOP_F16_F16_F16>; defm V_SUBREV_F16 : VOP2Inst , "v_subrev_f16", VOP_F16_F16_F16, null_frag, "v_sub_f16" >; defm V_MUL_F16 : VOP2Inst , "v_mul_f16", VOP_F16_F16_F16>; defm V_MAC_F16 : VOP2Inst , "v_mac_f16", VOP_F16_F16_F16>; } // End isCommutable = 1 defm V_MADMK_F16 : VOP2MADK , "v_madmk_f16">; let isCommutable = 1 in { defm V_MADAK_F16 : VOP2MADK , "v_madak_f16">; defm V_ADD_U16 : VOP2Inst , "v_add_u16", VOP_I16_I16_I16>; defm V_SUB_U16 : VOP2Inst , "v_sub_u16" , VOP_I16_I16_I16>; defm V_SUBREV_U16 : VOP2Inst , "v_subrev_u16", VOP_I16_I16_I16>; defm V_MUL_LO_U16 : VOP2Inst , "v_mul_lo_u16", VOP_I16_I16_I16>; } // End isCommutable = 1 defm V_LSHLREV_B16 : VOP2Inst , "v_lshlrev_b16", VOP_I16_I16_I16>; defm V_LSHRREV_B16 : VOP2Inst , "v_lshrrev_b16", VOP_I16_I16_I16>; defm V_ASHRREV_B16 : VOP2Inst , "v_ashrrev_b16", VOP_I16_I16_I16>; let isCommutable = 1 in { defm V_MAX_F16 : VOP2Inst , "v_max_f16", VOP_F16_F16_F16>; defm V_MIN_F16 : VOP2Inst , "v_min_f16", VOP_F16_F16_F16>; defm V_MAX_U16 : VOP2Inst , "v_max_u16", VOP_I16_I16_I16>; defm V_MAX_I16 : VOP2Inst , "v_max_i16", VOP_I16_I16_I16>; defm V_MIN_U16 : VOP2Inst , "v_min_u16", VOP_I16_I16_I16>; defm V_MIN_I16 : VOP2Inst , "v_min_i16", VOP_I16_I16_I16>; } // End isCommutable = 1 defm V_LDEXP_F16 : VOP2Inst , "v_ldexp_f16", VOP_F16_F16_I16>; // Aliases to simplify matching of floating-point instructions that // are VOP2 on SI and VOP3 on VI. class SI2_VI3Alias : InstAlias < name#" $dst, $src0, $src1", (inst VGPR_32:$dst, 0, VCSrc_32:$src0, 0, VCSrc_32:$src1, 0, 0) >, PredicateControl { let UseInstAsmMatchConverter = 0; } def : SI2_VI3Alias <"v_ldexp_f32", V_LDEXP_F32_e64_vi>; def : SI2_VI3Alias <"v_cvt_pkaccum_u8_f32", V_CVT_PKACCUM_U8_F32_e64_vi>; def : SI2_VI3Alias <"v_cvt_pknorm_i16_f32", V_CVT_PKNORM_I16_F32_e64_vi>; def : SI2_VI3Alias <"v_cvt_pknorm_u16_f32", V_CVT_PKNORM_U16_F32_e64_vi>; def : SI2_VI3Alias <"v_cvt_pkrtz_f16_f32", V_CVT_PKRTZ_F16_F32_e64_vi>; //===----------------------------------------------------------------------===// // SMEM Instructions //===----------------------------------------------------------------------===// def S_DCACHE_WB : SMEM_Inval <0x21, "s_dcache_wb", int_amdgcn_s_dcache_wb>; def S_DCACHE_WB_VOL : SMEM_Inval <0x23, "s_dcache_wb_vol", int_amdgcn_s_dcache_wb_vol>; } // End SIAssemblerPredicate = DisableInst, SubtargetPredicate = isVI //===----------------------------------------------------------------------===// // SMEM Patterns //===----------------------------------------------------------------------===// let Predicates = [isVI] in { // 1. Offset as 20bit DWORD immediate def : Pat < (SIload_constant v4i32:$sbase, IMM20bit:$offset), (S_BUFFER_LOAD_DWORD_IMM $sbase, (as_i32imm $offset)) >; // Patterns for global loads with no offset class FlatLoadPat : Pat < (vt (node i64:$addr)), (inst $addr, 0, 0, 0) >; def : FlatLoadPat ; def : FlatLoadPat ; def : FlatLoadPat ; def : FlatLoadPat ; def : FlatLoadPat ; def : FlatLoadPat ; def : FlatLoadPat ; class FlatStorePat : Pat < (node vt:$data, i64:$addr), (inst $data, $addr, 0, 0, 0) >; def : FlatStorePat ; def : FlatStorePat ; def : FlatStorePat ; def : FlatStorePat ; def : FlatStorePat ; class FlatAtomicPat : Pat < (vt (node i64:$addr, vt:$data)), (inst $addr, $data, 0, 0) >; def : FlatAtomicPat ; def : FlatAtomicPat ; def : FlatAtomicPat ; def : FlatAtomicPat ; def : FlatAtomicPat ; def : FlatAtomicPat ; def : FlatAtomicPat ; def : FlatAtomicPat ; def : FlatAtomicPat ; def : FlatAtomicPat ; } // End Predicates = [isVI]