1854 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=amdgcn -mcpu=fiji < %s | FileCheck -check-prefixes=SDAG-VI %s3; RUN: llc -mtriple=amdgcn -mcpu=gfx900 < %s | FileCheck -check-prefixes=SDAG-GFX9 %s4; RUN: llc -mtriple=amdgcn -mcpu=gfx1101 -mattr=+real-true16 < %s | FileCheck -check-prefixes=GFX11,SDAG-GFX11,SDAG-GFX11-TRUE16 %s5; RUN: llc -mtriple=amdgcn -mcpu=gfx1101 -mattr=-real-true16 < %s | FileCheck -check-prefixes=GFX11,SDAG-GFX11,SDAG-GFX11-FAKE16 %s6; RUN: llc -mtriple=amdgcn -mcpu=gfx1200 -mattr=+real-true16 < %s | FileCheck -check-prefixes=SDAG-GFX12,SDAG-GFX12-TRUE16 %s7; RUN: llc -mtriple=amdgcn -mcpu=gfx1200 -mattr=-real-true16 < %s | FileCheck -check-prefixes=SDAG-GFX12,SDAG-GFX12-FAKE16 %s8 9; RUN: llc -mtriple=amdgcn -mcpu=fiji -global-isel -new-reg-bank-select < %s | FileCheck -check-prefixes=GISEL-VI %s10; RUN: llc -mtriple=amdgcn -mcpu=gfx900 -global-isel -new-reg-bank-select < %s | FileCheck -check-prefixes=GISEL-GFX9 %s11; RUN: llc -mtriple=amdgcn -mcpu=gfx1101 -mattr=+real-true16 -global-isel -new-reg-bank-select < %s | FileCheck -check-prefixes=GFX11,GISEL-GFX11,GISEL-GFX11-TRUE16 %s12; RUN: llc -mtriple=amdgcn -mcpu=gfx1101 -mattr=-real-true16 -global-isel -new-reg-bank-select < %s | FileCheck -check-prefixes=GFX11,GISEL-GFX11,GISEL-GFX11-FAKE16 %s13; RUN: llc -mtriple=amdgcn -mcpu=gfx1200 -mattr=+real-true16 -global-isel -new-reg-bank-select < %s | FileCheck -check-prefixes=GISEL-GFX12,GISEL-GFX12-TRUE16 %s14; RUN: llc -mtriple=amdgcn -mcpu=gfx1200 -mattr=-real-true16 -global-isel -new-reg-bank-select < %s | FileCheck -check-prefixes=GISEL-GFX12,GISEL-GFX12-FAKE16 %s15 16; <GFX9 has no V_SAT_PK, GFX9+ has V_SAT_PK, GFX11 has V_SAT_PK with t1617 18declare i16 @llvm.smin.i16(i16, i16)19declare i16 @llvm.smax.i16(i16, i16)20 21declare <2 x i16> @llvm.smin.v2i16(<2 x i16>, <2 x i16>)22declare <2 x i16> @llvm.smax.v2i16(<2 x i16>, <2 x i16>)23 24define <2 x i16> @basic_smax_smin(i16 %src0, i16 %src1) {25; SDAG-VI-LABEL: basic_smax_smin:26; SDAG-VI: ; %bb.0:27; SDAG-VI-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)28; SDAG-VI-NEXT: v_max_i16_e32 v0, 0, v029; SDAG-VI-NEXT: v_max_i16_e32 v1, 0, v130; SDAG-VI-NEXT: v_mov_b32_e32 v2, 0xff31; SDAG-VI-NEXT: v_min_i16_sdwa v1, v1, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD32; SDAG-VI-NEXT: v_min_i16_e32 v0, 0xff, v033; SDAG-VI-NEXT: v_or_b32_e32 v0, v0, v134; SDAG-VI-NEXT: s_setpc_b64 s[30:31]35;36; SDAG-GFX9-LABEL: basic_smax_smin:37; SDAG-GFX9: ; %bb.0:38; SDAG-GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)39; SDAG-GFX9-NEXT: v_mov_b32_e32 v2, 0xff40; SDAG-GFX9-NEXT: v_med3_i16 v0, v0, 0, v241; SDAG-GFX9-NEXT: v_med3_i16 v1, v1, 0, v242; SDAG-GFX9-NEXT: s_mov_b32 s4, 0x504010043; SDAG-GFX9-NEXT: v_perm_b32 v0, v1, v0, s444; SDAG-GFX9-NEXT: s_setpc_b64 s[30:31]45;46; SDAG-GFX11-TRUE16-LABEL: basic_smax_smin:47; SDAG-GFX11-TRUE16: ; %bb.0:48; SDAG-GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)49; SDAG-GFX11-TRUE16-NEXT: v_med3_i16 v0.l, v0.l, 0, 0xff50; SDAG-GFX11-TRUE16-NEXT: v_med3_i16 v0.h, v1.l, 0, 0xff51; SDAG-GFX11-TRUE16-NEXT: s_setpc_b64 s[30:31]52;53; SDAG-GFX11-FAKE16-LABEL: basic_smax_smin:54; SDAG-GFX11-FAKE16: ; %bb.0:55; SDAG-GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)56; SDAG-GFX11-FAKE16-NEXT: v_med3_i16 v0, v0, 0, 0xff57; SDAG-GFX11-FAKE16-NEXT: v_med3_i16 v1, v1, 0, 0xff58; SDAG-GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1)59; SDAG-GFX11-FAKE16-NEXT: v_perm_b32 v0, v1, v0, 0x504010060; SDAG-GFX11-FAKE16-NEXT: s_setpc_b64 s[30:31]61;62; SDAG-GFX12-TRUE16-LABEL: basic_smax_smin:63; SDAG-GFX12-TRUE16: ; %bb.0:64; SDAG-GFX12-TRUE16-NEXT: s_wait_loadcnt_dscnt 0x065; SDAG-GFX12-TRUE16-NEXT: s_wait_expcnt 0x066; SDAG-GFX12-TRUE16-NEXT: s_wait_samplecnt 0x067; SDAG-GFX12-TRUE16-NEXT: s_wait_bvhcnt 0x068; SDAG-GFX12-TRUE16-NEXT: s_wait_kmcnt 0x069; SDAG-GFX12-TRUE16-NEXT: v_med3_i16 v0.l, v0.l, 0, 0xff70; SDAG-GFX12-TRUE16-NEXT: v_med3_i16 v0.h, v1.l, 0, 0xff71; SDAG-GFX12-TRUE16-NEXT: s_setpc_b64 s[30:31]72;73; SDAG-GFX12-FAKE16-LABEL: basic_smax_smin:74; SDAG-GFX12-FAKE16: ; %bb.0:75; SDAG-GFX12-FAKE16-NEXT: s_wait_loadcnt_dscnt 0x076; SDAG-GFX12-FAKE16-NEXT: s_wait_expcnt 0x077; SDAG-GFX12-FAKE16-NEXT: s_wait_samplecnt 0x078; SDAG-GFX12-FAKE16-NEXT: s_wait_bvhcnt 0x079; SDAG-GFX12-FAKE16-NEXT: s_wait_kmcnt 0x080; SDAG-GFX12-FAKE16-NEXT: v_med3_i16 v0, v0, 0, 0xff81; SDAG-GFX12-FAKE16-NEXT: v_med3_i16 v1, v1, 0, 0xff82; SDAG-GFX12-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1)83; SDAG-GFX12-FAKE16-NEXT: v_perm_b32 v0, v1, v0, 0x504010084; SDAG-GFX12-FAKE16-NEXT: s_setpc_b64 s[30:31]85;86; GISEL-VI-LABEL: basic_smax_smin:87; GISEL-VI: ; %bb.0:88; GISEL-VI-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)89; GISEL-VI-NEXT: v_max_i16_e32 v0, 0, v090; GISEL-VI-NEXT: v_mov_b32_e32 v2, 0xff91; GISEL-VI-NEXT: v_max_i16_e32 v1, 0, v192; GISEL-VI-NEXT: v_min_i16_e32 v0, 0xff, v093; GISEL-VI-NEXT: v_min_i16_sdwa v1, v1, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD94; GISEL-VI-NEXT: v_or_b32_e32 v0, v0, v195; GISEL-VI-NEXT: s_setpc_b64 s[30:31]96;97; GISEL-GFX9-LABEL: basic_smax_smin:98; GISEL-GFX9: ; %bb.0:99; GISEL-GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)100; GISEL-GFX9-NEXT: v_mov_b32_e32 v2, 0xff101; GISEL-GFX9-NEXT: v_med3_i16 v0, v0, 0, v2102; GISEL-GFX9-NEXT: v_med3_i16 v1, v1, 0, v2103; GISEL-GFX9-NEXT: v_and_b32_e32 v0, 0xffff, v0104; GISEL-GFX9-NEXT: v_lshl_or_b32 v0, v1, 16, v0105; GISEL-GFX9-NEXT: s_setpc_b64 s[30:31]106;107; GISEL-GFX11-TRUE16-LABEL: basic_smax_smin:108; GISEL-GFX11-TRUE16: ; %bb.0:109; GISEL-GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)110; GISEL-GFX11-TRUE16-NEXT: v_med3_i16 v0.l, v0.l, 0, 0xff111; GISEL-GFX11-TRUE16-NEXT: v_med3_i16 v0.h, v1.l, 0, 0xff112; GISEL-GFX11-TRUE16-NEXT: s_setpc_b64 s[30:31]113;114; GISEL-GFX11-FAKE16-LABEL: basic_smax_smin:115; GISEL-GFX11-FAKE16: ; %bb.0:116; GISEL-GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)117; GISEL-GFX11-FAKE16-NEXT: v_med3_i16 v0, v0, 0, 0xff118; GISEL-GFX11-FAKE16-NEXT: v_med3_i16 v1, v1, 0, 0xff119; GISEL-GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)120; GISEL-GFX11-FAKE16-NEXT: v_and_b32_e32 v0, 0xffff, v0121; GISEL-GFX11-FAKE16-NEXT: v_lshl_or_b32 v0, v1, 16, v0122; GISEL-GFX11-FAKE16-NEXT: s_setpc_b64 s[30:31]123;124; GISEL-GFX12-TRUE16-LABEL: basic_smax_smin:125; GISEL-GFX12-TRUE16: ; %bb.0:126; GISEL-GFX12-TRUE16-NEXT: s_wait_loadcnt_dscnt 0x0127; GISEL-GFX12-TRUE16-NEXT: s_wait_expcnt 0x0128; GISEL-GFX12-TRUE16-NEXT: s_wait_samplecnt 0x0129; GISEL-GFX12-TRUE16-NEXT: s_wait_bvhcnt 0x0130; GISEL-GFX12-TRUE16-NEXT: s_wait_kmcnt 0x0131; GISEL-GFX12-TRUE16-NEXT: v_med3_i16 v0.l, v0.l, 0, 0xff132; GISEL-GFX12-TRUE16-NEXT: v_med3_i16 v0.h, v1.l, 0, 0xff133; GISEL-GFX12-TRUE16-NEXT: s_setpc_b64 s[30:31]134;135; GISEL-GFX12-FAKE16-LABEL: basic_smax_smin:136; GISEL-GFX12-FAKE16: ; %bb.0:137; GISEL-GFX12-FAKE16-NEXT: s_wait_loadcnt_dscnt 0x0138; GISEL-GFX12-FAKE16-NEXT: s_wait_expcnt 0x0139; GISEL-GFX12-FAKE16-NEXT: s_wait_samplecnt 0x0140; GISEL-GFX12-FAKE16-NEXT: s_wait_bvhcnt 0x0141; GISEL-GFX12-FAKE16-NEXT: s_wait_kmcnt 0x0142; GISEL-GFX12-FAKE16-NEXT: v_med3_i16 v0, v0, 0, 0xff143; GISEL-GFX12-FAKE16-NEXT: v_med3_i16 v1, v1, 0, 0xff144; GISEL-GFX12-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)145; GISEL-GFX12-FAKE16-NEXT: v_and_b32_e32 v0, 0xffff, v0146; GISEL-GFX12-FAKE16-NEXT: v_lshl_or_b32 v0, v1, 16, v0147; GISEL-GFX12-FAKE16-NEXT: s_setpc_b64 s[30:31]148 149 %src0.max = call i16 @llvm.smax.i16(i16 %src0, i16 0)150 %src0.clamp = call i16 @llvm.smin.i16(i16 %src0.max, i16 255)151 %src1.max = call i16 @llvm.smax.i16(i16 %src1, i16 0)152 %src1.clamp = call i16 @llvm.smin.i16(i16 %src1.max, i16 255)153 %insert.0 = insertelement <2 x i16> poison, i16 %src0.clamp, i32 0154 %vec = insertelement <2 x i16> %insert.0, i16 %src1.clamp, i32 1155 ret <2 x i16> %vec156}157 158; Check that we don't emit a VALU instruction for SGPR inputs.159define amdgpu_kernel void @basic_smax_smin_sgpr(ptr addrspace(1) %out, i32 inreg %src0ext, i32 inreg %src1ext) {160; SDAG-VI-LABEL: basic_smax_smin_sgpr:161; SDAG-VI: ; %bb.0:162; SDAG-VI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24163; SDAG-VI-NEXT: v_mov_b32_e32 v0, 0xff164; SDAG-VI-NEXT: s_waitcnt lgkmcnt(0)165; SDAG-VI-NEXT: s_sext_i32_i16 s2, s2166; SDAG-VI-NEXT: s_sext_i32_i16 s3, s3167; SDAG-VI-NEXT: v_med3_i32 v1, s2, 0, v0168; SDAG-VI-NEXT: v_med3_i32 v0, s3, 0, v0169; SDAG-VI-NEXT: v_lshlrev_b32_e32 v0, 16, v0170; SDAG-VI-NEXT: v_or_b32_e32 v2, v1, v0171; SDAG-VI-NEXT: v_mov_b32_e32 v0, s0172; SDAG-VI-NEXT: v_mov_b32_e32 v1, s1173; SDAG-VI-NEXT: flat_store_dword v[0:1], v2174; SDAG-VI-NEXT: s_endpgm175;176; SDAG-GFX9-LABEL: basic_smax_smin_sgpr:177; SDAG-GFX9: ; %bb.0:178; SDAG-GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24179; SDAG-GFX9-NEXT: v_mov_b32_e32 v1, 0xff180; SDAG-GFX9-NEXT: v_mov_b32_e32 v0, 0181; SDAG-GFX9-NEXT: s_waitcnt lgkmcnt(0)182; SDAG-GFX9-NEXT: v_med3_i16 v2, s2, 0, v1183; SDAG-GFX9-NEXT: v_med3_i16 v1, s3, 0, v1184; SDAG-GFX9-NEXT: v_and_b32_e32 v2, 0xffff, v2185; SDAG-GFX9-NEXT: v_lshl_or_b32 v1, v1, 16, v2186; SDAG-GFX9-NEXT: global_store_dword v0, v1, s[0:1]187; SDAG-GFX9-NEXT: s_endpgm188;189; SDAG-GFX11-TRUE16-LABEL: basic_smax_smin_sgpr:190; SDAG-GFX11-TRUE16: ; %bb.0:191; SDAG-GFX11-TRUE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x24192; SDAG-GFX11-TRUE16-NEXT: v_mov_b32_e32 v0, 0193; SDAG-GFX11-TRUE16-NEXT: s_waitcnt lgkmcnt(0)194; SDAG-GFX11-TRUE16-NEXT: v_med3_i16 v1.l, s2, 0, 0xff195; SDAG-GFX11-TRUE16-NEXT: v_med3_i16 v1.h, s3, 0, 0xff196; SDAG-GFX11-TRUE16-NEXT: global_store_b32 v0, v1, s[0:1]197; SDAG-GFX11-TRUE16-NEXT: s_endpgm198;199; SDAG-GFX11-FAKE16-LABEL: basic_smax_smin_sgpr:200; SDAG-GFX11-FAKE16: ; %bb.0:201; SDAG-GFX11-FAKE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x24202; SDAG-GFX11-FAKE16-NEXT: v_mov_b32_e32 v2, 0203; SDAG-GFX11-FAKE16-NEXT: s_waitcnt lgkmcnt(0)204; SDAG-GFX11-FAKE16-NEXT: v_med3_i16 v0, s2, 0, 0xff205; SDAG-GFX11-FAKE16-NEXT: v_med3_i16 v1, s3, 0, 0xff206; SDAG-GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)207; SDAG-GFX11-FAKE16-NEXT: v_and_b32_e32 v0, 0xffff, v0208; SDAG-GFX11-FAKE16-NEXT: v_lshl_or_b32 v0, v1, 16, v0209; SDAG-GFX11-FAKE16-NEXT: global_store_b32 v2, v0, s[0:1]210; SDAG-GFX11-FAKE16-NEXT: s_endpgm211;212; SDAG-GFX12-TRUE16-LABEL: basic_smax_smin_sgpr:213; SDAG-GFX12-TRUE16: ; %bb.0:214; SDAG-GFX12-TRUE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x24215; SDAG-GFX12-TRUE16-NEXT: v_mov_b32_e32 v0, 0216; SDAG-GFX12-TRUE16-NEXT: s_wait_kmcnt 0x0217; SDAG-GFX12-TRUE16-NEXT: v_med3_i16 v1.l, s2, 0, 0xff218; SDAG-GFX12-TRUE16-NEXT: v_med3_i16 v1.h, s3, 0, 0xff219; SDAG-GFX12-TRUE16-NEXT: global_store_b32 v0, v1, s[0:1]220; SDAG-GFX12-TRUE16-NEXT: s_endpgm221;222; SDAG-GFX12-FAKE16-LABEL: basic_smax_smin_sgpr:223; SDAG-GFX12-FAKE16: ; %bb.0:224; SDAG-GFX12-FAKE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x24225; SDAG-GFX12-FAKE16-NEXT: v_mov_b32_e32 v2, 0226; SDAG-GFX12-FAKE16-NEXT: s_wait_kmcnt 0x0227; SDAG-GFX12-FAKE16-NEXT: v_med3_i16 v0, s2, 0, 0xff228; SDAG-GFX12-FAKE16-NEXT: v_med3_i16 v1, s3, 0, 0xff229; SDAG-GFX12-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)230; SDAG-GFX12-FAKE16-NEXT: v_and_b32_e32 v0, 0xffff, v0231; SDAG-GFX12-FAKE16-NEXT: v_lshl_or_b32 v0, v1, 16, v0232; SDAG-GFX12-FAKE16-NEXT: global_store_b32 v2, v0, s[0:1]233; SDAG-GFX12-FAKE16-NEXT: s_endpgm234;235; GISEL-VI-LABEL: basic_smax_smin_sgpr:236; GISEL-VI: ; %bb.0:237; GISEL-VI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24238; GISEL-VI-NEXT: s_waitcnt lgkmcnt(0)239; GISEL-VI-NEXT: s_sext_i32_i16 s3, s3240; GISEL-VI-NEXT: s_sext_i32_i16 s2, s2241; GISEL-VI-NEXT: s_max_i32 s3, s3, 0242; GISEL-VI-NEXT: s_max_i32 s2, s2, 0243; GISEL-VI-NEXT: s_sext_i32_i16 s3, s3244; GISEL-VI-NEXT: s_sext_i32_i16 s2, s2245; GISEL-VI-NEXT: s_min_i32 s3, s3, 0xff246; GISEL-VI-NEXT: s_min_i32 s2, s2, 0xff247; GISEL-VI-NEXT: s_and_b32 s3, 0xffff, s3248; GISEL-VI-NEXT: s_and_b32 s2, 0xffff, s2249; GISEL-VI-NEXT: s_lshl_b32 s3, s3, 16250; GISEL-VI-NEXT: s_or_b32 s2, s2, s3251; GISEL-VI-NEXT: v_mov_b32_e32 v0, s0252; GISEL-VI-NEXT: v_mov_b32_e32 v2, s2253; GISEL-VI-NEXT: v_mov_b32_e32 v1, s1254; GISEL-VI-NEXT: flat_store_dword v[0:1], v2255; GISEL-VI-NEXT: s_endpgm256;257; GISEL-GFX9-LABEL: basic_smax_smin_sgpr:258; GISEL-GFX9: ; %bb.0:259; GISEL-GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24260; GISEL-GFX9-NEXT: v_mov_b32_e32 v1, 0261; GISEL-GFX9-NEXT: s_waitcnt lgkmcnt(0)262; GISEL-GFX9-NEXT: s_sext_i32_i16 s2, s2263; GISEL-GFX9-NEXT: s_sext_i32_i16 s3, s3264; GISEL-GFX9-NEXT: s_max_i32 s2, s2, 0265; GISEL-GFX9-NEXT: s_max_i32 s3, s3, 0266; GISEL-GFX9-NEXT: s_sext_i32_i16 s2, s2267; GISEL-GFX9-NEXT: s_sext_i32_i16 s3, s3268; GISEL-GFX9-NEXT: s_min_i32 s2, s2, 0xff269; GISEL-GFX9-NEXT: s_min_i32 s3, s3, 0xff270; GISEL-GFX9-NEXT: s_pack_ll_b32_b16 s2, s2, s3271; GISEL-GFX9-NEXT: v_mov_b32_e32 v0, s2272; GISEL-GFX9-NEXT: global_store_dword v1, v0, s[0:1]273; GISEL-GFX9-NEXT: s_endpgm274;275; GISEL-GFX11-LABEL: basic_smax_smin_sgpr:276; GISEL-GFX11: ; %bb.0:277; GISEL-GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x24278; GISEL-GFX11-NEXT: v_mov_b32_e32 v1, 0279; GISEL-GFX11-NEXT: s_waitcnt lgkmcnt(0)280; GISEL-GFX11-NEXT: s_sext_i32_i16 s2, s2281; GISEL-GFX11-NEXT: s_sext_i32_i16 s3, s3282; GISEL-GFX11-NEXT: s_max_i32 s2, s2, 0283; GISEL-GFX11-NEXT: s_max_i32 s3, s3, 0284; GISEL-GFX11-NEXT: s_sext_i32_i16 s2, s2285; GISEL-GFX11-NEXT: s_sext_i32_i16 s3, s3286; GISEL-GFX11-NEXT: s_min_i32 s2, s2, 0xff287; GISEL-GFX11-NEXT: s_min_i32 s3, s3, 0xff288; GISEL-GFX11-NEXT: s_delay_alu instid0(SALU_CYCLE_1) | instskip(NEXT) | instid1(SALU_CYCLE_1)289; GISEL-GFX11-NEXT: s_pack_ll_b32_b16 s2, s2, s3290; GISEL-GFX11-NEXT: v_mov_b32_e32 v0, s2291; GISEL-GFX11-NEXT: global_store_b32 v1, v0, s[0:1]292; GISEL-GFX11-NEXT: s_endpgm293;294; GISEL-GFX12-LABEL: basic_smax_smin_sgpr:295; GISEL-GFX12: ; %bb.0:296; GISEL-GFX12-NEXT: s_load_b128 s[0:3], s[4:5], 0x24297; GISEL-GFX12-NEXT: v_mov_b32_e32 v1, 0298; GISEL-GFX12-NEXT: s_wait_kmcnt 0x0299; GISEL-GFX12-NEXT: s_sext_i32_i16 s2, s2300; GISEL-GFX12-NEXT: s_sext_i32_i16 s3, s3301; GISEL-GFX12-NEXT: s_max_i32 s2, s2, 0302; GISEL-GFX12-NEXT: s_max_i32 s3, s3, 0303; GISEL-GFX12-NEXT: s_sext_i32_i16 s2, s2304; GISEL-GFX12-NEXT: s_sext_i32_i16 s3, s3305; GISEL-GFX12-NEXT: s_min_i32 s2, s2, 0xff306; GISEL-GFX12-NEXT: s_min_i32 s3, s3, 0xff307; GISEL-GFX12-NEXT: s_delay_alu instid0(SALU_CYCLE_1) | instskip(NEXT) | instid1(SALU_CYCLE_1)308; GISEL-GFX12-NEXT: s_pack_ll_b32_b16 s2, s2, s3309; GISEL-GFX12-NEXT: v_mov_b32_e32 v0, s2310; GISEL-GFX12-NEXT: global_store_b32 v1, v0, s[0:1]311; GISEL-GFX12-NEXT: s_endpgm312 313 %src0 = trunc i32 %src0ext to i16314 %src1 = trunc i32 %src1ext to i16315 %src0.max = call i16 @llvm.smax.i16(i16 %src0, i16 0)316 %src0.clamp = call i16 @llvm.smin.i16(i16 %src0.max, i16 255)317 %src1.max = call i16 @llvm.smax.i16(i16 %src1, i16 0)318 %src1.clamp = call i16 @llvm.smin.i16(i16 %src1.max, i16 255)319 %insert.0 = insertelement <2 x i16> poison, i16 %src0.clamp, i32 0320 %vec = insertelement <2 x i16> %insert.0, i16 %src1.clamp, i32 1321 store <2 x i16> %vec, ptr addrspace(1) %out322 ret void323}324 325define <2 x i16> @basic_smin_smax(i16 %src0, i16 %src1) {326; SDAG-VI-LABEL: basic_smin_smax:327; SDAG-VI: ; %bb.0:328; SDAG-VI-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)329; SDAG-VI-NEXT: v_min_i16_e32 v0, 0xff, v0330; SDAG-VI-NEXT: v_min_i16_e32 v1, 0xff, v1331; SDAG-VI-NEXT: v_mov_b32_e32 v2, 0332; SDAG-VI-NEXT: v_max_i16_sdwa v1, v1, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD333; SDAG-VI-NEXT: v_max_i16_e32 v0, 0, v0334; SDAG-VI-NEXT: v_or_b32_e32 v0, v0, v1335; SDAG-VI-NEXT: s_setpc_b64 s[30:31]336;337; SDAG-GFX9-LABEL: basic_smin_smax:338; SDAG-GFX9: ; %bb.0:339; SDAG-GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)340; SDAG-GFX9-NEXT: v_mov_b32_e32 v2, 0xff341; SDAG-GFX9-NEXT: v_med3_i16 v0, v0, 0, v2342; SDAG-GFX9-NEXT: v_med3_i16 v1, v1, 0, v2343; SDAG-GFX9-NEXT: s_mov_b32 s4, 0x5040100344; SDAG-GFX9-NEXT: v_perm_b32 v0, v1, v0, s4345; SDAG-GFX9-NEXT: s_setpc_b64 s[30:31]346;347; SDAG-GFX11-TRUE16-LABEL: basic_smin_smax:348; SDAG-GFX11-TRUE16: ; %bb.0:349; SDAG-GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)350; SDAG-GFX11-TRUE16-NEXT: v_med3_i16 v0.l, v0.l, 0, 0xff351; SDAG-GFX11-TRUE16-NEXT: v_med3_i16 v0.h, v1.l, 0, 0xff352; SDAG-GFX11-TRUE16-NEXT: s_setpc_b64 s[30:31]353;354; SDAG-GFX11-FAKE16-LABEL: basic_smin_smax:355; SDAG-GFX11-FAKE16: ; %bb.0:356; SDAG-GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)357; SDAG-GFX11-FAKE16-NEXT: v_med3_i16 v0, v0, 0, 0xff358; SDAG-GFX11-FAKE16-NEXT: v_med3_i16 v1, v1, 0, 0xff359; SDAG-GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1)360; SDAG-GFX11-FAKE16-NEXT: v_perm_b32 v0, v1, v0, 0x5040100361; SDAG-GFX11-FAKE16-NEXT: s_setpc_b64 s[30:31]362;363; SDAG-GFX12-TRUE16-LABEL: basic_smin_smax:364; SDAG-GFX12-TRUE16: ; %bb.0:365; SDAG-GFX12-TRUE16-NEXT: s_wait_loadcnt_dscnt 0x0366; SDAG-GFX12-TRUE16-NEXT: s_wait_expcnt 0x0367; SDAG-GFX12-TRUE16-NEXT: s_wait_samplecnt 0x0368; SDAG-GFX12-TRUE16-NEXT: s_wait_bvhcnt 0x0369; SDAG-GFX12-TRUE16-NEXT: s_wait_kmcnt 0x0370; SDAG-GFX12-TRUE16-NEXT: v_med3_i16 v0.l, v0.l, 0, 0xff371; SDAG-GFX12-TRUE16-NEXT: v_med3_i16 v0.h, v1.l, 0, 0xff372; SDAG-GFX12-TRUE16-NEXT: s_setpc_b64 s[30:31]373;374; SDAG-GFX12-FAKE16-LABEL: basic_smin_smax:375; SDAG-GFX12-FAKE16: ; %bb.0:376; SDAG-GFX12-FAKE16-NEXT: s_wait_loadcnt_dscnt 0x0377; SDAG-GFX12-FAKE16-NEXT: s_wait_expcnt 0x0378; SDAG-GFX12-FAKE16-NEXT: s_wait_samplecnt 0x0379; SDAG-GFX12-FAKE16-NEXT: s_wait_bvhcnt 0x0380; SDAG-GFX12-FAKE16-NEXT: s_wait_kmcnt 0x0381; SDAG-GFX12-FAKE16-NEXT: v_med3_i16 v0, v0, 0, 0xff382; SDAG-GFX12-FAKE16-NEXT: v_med3_i16 v1, v1, 0, 0xff383; SDAG-GFX12-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1)384; SDAG-GFX12-FAKE16-NEXT: v_perm_b32 v0, v1, v0, 0x5040100385; SDAG-GFX12-FAKE16-NEXT: s_setpc_b64 s[30:31]386;387; GISEL-VI-LABEL: basic_smin_smax:388; GISEL-VI: ; %bb.0:389; GISEL-VI-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)390; GISEL-VI-NEXT: v_min_i16_e32 v0, 0xff, v0391; GISEL-VI-NEXT: v_min_i16_e32 v1, 0xff, v1392; GISEL-VI-NEXT: v_mov_b32_e32 v2, 0393; GISEL-VI-NEXT: v_max_i16_e32 v0, 0, v0394; GISEL-VI-NEXT: v_max_i16_sdwa v1, v1, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD395; GISEL-VI-NEXT: v_or_b32_e32 v0, v0, v1396; GISEL-VI-NEXT: s_setpc_b64 s[30:31]397;398; GISEL-GFX9-LABEL: basic_smin_smax:399; GISEL-GFX9: ; %bb.0:400; GISEL-GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)401; GISEL-GFX9-NEXT: v_mov_b32_e32 v2, 0xff402; GISEL-GFX9-NEXT: v_med3_i16 v0, v0, 0, v2403; GISEL-GFX9-NEXT: v_med3_i16 v1, v1, 0, v2404; GISEL-GFX9-NEXT: v_and_b32_e32 v0, 0xffff, v0405; GISEL-GFX9-NEXT: v_lshl_or_b32 v0, v1, 16, v0406; GISEL-GFX9-NEXT: s_setpc_b64 s[30:31]407;408; GISEL-GFX11-TRUE16-LABEL: basic_smin_smax:409; GISEL-GFX11-TRUE16: ; %bb.0:410; GISEL-GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)411; GISEL-GFX11-TRUE16-NEXT: v_med3_i16 v0.l, v0.l, 0, 0xff412; GISEL-GFX11-TRUE16-NEXT: v_med3_i16 v0.h, v1.l, 0, 0xff413; GISEL-GFX11-TRUE16-NEXT: s_setpc_b64 s[30:31]414;415; GISEL-GFX11-FAKE16-LABEL: basic_smin_smax:416; GISEL-GFX11-FAKE16: ; %bb.0:417; GISEL-GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)418; GISEL-GFX11-FAKE16-NEXT: v_med3_i16 v0, v0, 0, 0xff419; GISEL-GFX11-FAKE16-NEXT: v_med3_i16 v1, v1, 0, 0xff420; GISEL-GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)421; GISEL-GFX11-FAKE16-NEXT: v_and_b32_e32 v0, 0xffff, v0422; GISEL-GFX11-FAKE16-NEXT: v_lshl_or_b32 v0, v1, 16, v0423; GISEL-GFX11-FAKE16-NEXT: s_setpc_b64 s[30:31]424;425; GISEL-GFX12-TRUE16-LABEL: basic_smin_smax:426; GISEL-GFX12-TRUE16: ; %bb.0:427; GISEL-GFX12-TRUE16-NEXT: s_wait_loadcnt_dscnt 0x0428; GISEL-GFX12-TRUE16-NEXT: s_wait_expcnt 0x0429; GISEL-GFX12-TRUE16-NEXT: s_wait_samplecnt 0x0430; GISEL-GFX12-TRUE16-NEXT: s_wait_bvhcnt 0x0431; GISEL-GFX12-TRUE16-NEXT: s_wait_kmcnt 0x0432; GISEL-GFX12-TRUE16-NEXT: v_med3_i16 v0.l, v0.l, 0, 0xff433; GISEL-GFX12-TRUE16-NEXT: v_med3_i16 v0.h, v1.l, 0, 0xff434; GISEL-GFX12-TRUE16-NEXT: s_setpc_b64 s[30:31]435;436; GISEL-GFX12-FAKE16-LABEL: basic_smin_smax:437; GISEL-GFX12-FAKE16: ; %bb.0:438; GISEL-GFX12-FAKE16-NEXT: s_wait_loadcnt_dscnt 0x0439; GISEL-GFX12-FAKE16-NEXT: s_wait_expcnt 0x0440; GISEL-GFX12-FAKE16-NEXT: s_wait_samplecnt 0x0441; GISEL-GFX12-FAKE16-NEXT: s_wait_bvhcnt 0x0442; GISEL-GFX12-FAKE16-NEXT: s_wait_kmcnt 0x0443; GISEL-GFX12-FAKE16-NEXT: v_med3_i16 v0, v0, 0, 0xff444; GISEL-GFX12-FAKE16-NEXT: v_med3_i16 v1, v1, 0, 0xff445; GISEL-GFX12-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)446; GISEL-GFX12-FAKE16-NEXT: v_and_b32_e32 v0, 0xffff, v0447; GISEL-GFX12-FAKE16-NEXT: v_lshl_or_b32 v0, v1, 16, v0448; GISEL-GFX12-FAKE16-NEXT: s_setpc_b64 s[30:31]449 450 %src0.min = call i16 @llvm.smin.i16(i16 %src0, i16 255)451 %src0.clamp = call i16 @llvm.smax.i16(i16 %src0.min, i16 0)452 %src1.min = call i16 @llvm.smin.i16(i16 %src1, i16 255)453 %src1.clamp = call i16 @llvm.smax.i16(i16 %src1.min, i16 0)454 %insert.0 = insertelement <2 x i16> poison, i16 %src0.clamp, i32 0455 %vec = insertelement <2 x i16> %insert.0, i16 %src1.clamp, i32 1456 ret <2 x i16> %vec457}458 459define <2 x i16> @basic_smin_smax_combined(i16 %src0, i16 %src1) {460; SDAG-VI-LABEL: basic_smin_smax_combined:461; SDAG-VI: ; %bb.0:462; SDAG-VI-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)463; SDAG-VI-NEXT: v_min_i16_e32 v0, 0xff, v0464; SDAG-VI-NEXT: v_max_i16_e32 v1, 0, v1465; SDAG-VI-NEXT: v_mov_b32_e32 v2, 0xff466; SDAG-VI-NEXT: v_min_i16_sdwa v1, v1, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD467; SDAG-VI-NEXT: v_max_i16_e32 v0, 0, v0468; SDAG-VI-NEXT: v_or_b32_e32 v0, v0, v1469; SDAG-VI-NEXT: s_setpc_b64 s[30:31]470;471; SDAG-GFX9-LABEL: basic_smin_smax_combined:472; SDAG-GFX9: ; %bb.0:473; SDAG-GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)474; SDAG-GFX9-NEXT: v_mov_b32_e32 v2, 0xff475; SDAG-GFX9-NEXT: v_med3_i16 v0, v0, 0, v2476; SDAG-GFX9-NEXT: v_med3_i16 v1, v1, 0, v2477; SDAG-GFX9-NEXT: s_mov_b32 s4, 0x5040100478; SDAG-GFX9-NEXT: v_perm_b32 v0, v1, v0, s4479; SDAG-GFX9-NEXT: s_setpc_b64 s[30:31]480;481; SDAG-GFX11-TRUE16-LABEL: basic_smin_smax_combined:482; SDAG-GFX11-TRUE16: ; %bb.0:483; SDAG-GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)484; SDAG-GFX11-TRUE16-NEXT: v_med3_i16 v0.l, v0.l, 0, 0xff485; SDAG-GFX11-TRUE16-NEXT: v_med3_i16 v0.h, v1.l, 0, 0xff486; SDAG-GFX11-TRUE16-NEXT: s_setpc_b64 s[30:31]487;488; SDAG-GFX11-FAKE16-LABEL: basic_smin_smax_combined:489; SDAG-GFX11-FAKE16: ; %bb.0:490; SDAG-GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)491; SDAG-GFX11-FAKE16-NEXT: v_med3_i16 v0, v0, 0, 0xff492; SDAG-GFX11-FAKE16-NEXT: v_med3_i16 v1, v1, 0, 0xff493; SDAG-GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1)494; SDAG-GFX11-FAKE16-NEXT: v_perm_b32 v0, v1, v0, 0x5040100495; SDAG-GFX11-FAKE16-NEXT: s_setpc_b64 s[30:31]496;497; SDAG-GFX12-TRUE16-LABEL: basic_smin_smax_combined:498; SDAG-GFX12-TRUE16: ; %bb.0:499; SDAG-GFX12-TRUE16-NEXT: s_wait_loadcnt_dscnt 0x0500; SDAG-GFX12-TRUE16-NEXT: s_wait_expcnt 0x0501; SDAG-GFX12-TRUE16-NEXT: s_wait_samplecnt 0x0502; SDAG-GFX12-TRUE16-NEXT: s_wait_bvhcnt 0x0503; SDAG-GFX12-TRUE16-NEXT: s_wait_kmcnt 0x0504; SDAG-GFX12-TRUE16-NEXT: v_med3_i16 v0.l, v0.l, 0, 0xff505; SDAG-GFX12-TRUE16-NEXT: v_med3_i16 v0.h, v1.l, 0, 0xff506; SDAG-GFX12-TRUE16-NEXT: s_setpc_b64 s[30:31]507;508; SDAG-GFX12-FAKE16-LABEL: basic_smin_smax_combined:509; SDAG-GFX12-FAKE16: ; %bb.0:510; SDAG-GFX12-FAKE16-NEXT: s_wait_loadcnt_dscnt 0x0511; SDAG-GFX12-FAKE16-NEXT: s_wait_expcnt 0x0512; SDAG-GFX12-FAKE16-NEXT: s_wait_samplecnt 0x0513; SDAG-GFX12-FAKE16-NEXT: s_wait_bvhcnt 0x0514; SDAG-GFX12-FAKE16-NEXT: s_wait_kmcnt 0x0515; SDAG-GFX12-FAKE16-NEXT: v_med3_i16 v0, v0, 0, 0xff516; SDAG-GFX12-FAKE16-NEXT: v_med3_i16 v1, v1, 0, 0xff517; SDAG-GFX12-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1)518; SDAG-GFX12-FAKE16-NEXT: v_perm_b32 v0, v1, v0, 0x5040100519; SDAG-GFX12-FAKE16-NEXT: s_setpc_b64 s[30:31]520;521; GISEL-VI-LABEL: basic_smin_smax_combined:522; GISEL-VI: ; %bb.0:523; GISEL-VI-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)524; GISEL-VI-NEXT: v_mov_b32_e32 v2, 0xff525; GISEL-VI-NEXT: v_min_i16_e32 v0, 0xff, v0526; GISEL-VI-NEXT: v_max_i16_e32 v1, 0, v1527; GISEL-VI-NEXT: v_max_i16_e32 v0, 0, v0528; GISEL-VI-NEXT: v_min_i16_sdwa v1, v1, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD529; GISEL-VI-NEXT: v_or_b32_e32 v0, v0, v1530; GISEL-VI-NEXT: s_setpc_b64 s[30:31]531;532; GISEL-GFX9-LABEL: basic_smin_smax_combined:533; GISEL-GFX9: ; %bb.0:534; GISEL-GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)535; GISEL-GFX9-NEXT: v_mov_b32_e32 v2, 0xff536; GISEL-GFX9-NEXT: v_med3_i16 v0, v0, 0, v2537; GISEL-GFX9-NEXT: v_med3_i16 v1, v1, 0, v2538; GISEL-GFX9-NEXT: v_and_b32_e32 v0, 0xffff, v0539; GISEL-GFX9-NEXT: v_lshl_or_b32 v0, v1, 16, v0540; GISEL-GFX9-NEXT: s_setpc_b64 s[30:31]541;542; GISEL-GFX11-TRUE16-LABEL: basic_smin_smax_combined:543; GISEL-GFX11-TRUE16: ; %bb.0:544; GISEL-GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)545; GISEL-GFX11-TRUE16-NEXT: v_med3_i16 v0.l, v0.l, 0, 0xff546; GISEL-GFX11-TRUE16-NEXT: v_med3_i16 v0.h, v1.l, 0, 0xff547; GISEL-GFX11-TRUE16-NEXT: s_setpc_b64 s[30:31]548;549; GISEL-GFX11-FAKE16-LABEL: basic_smin_smax_combined:550; GISEL-GFX11-FAKE16: ; %bb.0:551; GISEL-GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)552; GISEL-GFX11-FAKE16-NEXT: v_med3_i16 v0, v0, 0, 0xff553; GISEL-GFX11-FAKE16-NEXT: v_med3_i16 v1, v1, 0, 0xff554; GISEL-GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)555; GISEL-GFX11-FAKE16-NEXT: v_and_b32_e32 v0, 0xffff, v0556; GISEL-GFX11-FAKE16-NEXT: v_lshl_or_b32 v0, v1, 16, v0557; GISEL-GFX11-FAKE16-NEXT: s_setpc_b64 s[30:31]558;559; GISEL-GFX12-TRUE16-LABEL: basic_smin_smax_combined:560; GISEL-GFX12-TRUE16: ; %bb.0:561; GISEL-GFX12-TRUE16-NEXT: s_wait_loadcnt_dscnt 0x0562; GISEL-GFX12-TRUE16-NEXT: s_wait_expcnt 0x0563; GISEL-GFX12-TRUE16-NEXT: s_wait_samplecnt 0x0564; GISEL-GFX12-TRUE16-NEXT: s_wait_bvhcnt 0x0565; GISEL-GFX12-TRUE16-NEXT: s_wait_kmcnt 0x0566; GISEL-GFX12-TRUE16-NEXT: v_med3_i16 v0.l, v0.l, 0, 0xff567; GISEL-GFX12-TRUE16-NEXT: v_med3_i16 v0.h, v1.l, 0, 0xff568; GISEL-GFX12-TRUE16-NEXT: s_setpc_b64 s[30:31]569;570; GISEL-GFX12-FAKE16-LABEL: basic_smin_smax_combined:571; GISEL-GFX12-FAKE16: ; %bb.0:572; GISEL-GFX12-FAKE16-NEXT: s_wait_loadcnt_dscnt 0x0573; GISEL-GFX12-FAKE16-NEXT: s_wait_expcnt 0x0574; GISEL-GFX12-FAKE16-NEXT: s_wait_samplecnt 0x0575; GISEL-GFX12-FAKE16-NEXT: s_wait_bvhcnt 0x0576; GISEL-GFX12-FAKE16-NEXT: s_wait_kmcnt 0x0577; GISEL-GFX12-FAKE16-NEXT: v_med3_i16 v0, v0, 0, 0xff578; GISEL-GFX12-FAKE16-NEXT: v_med3_i16 v1, v1, 0, 0xff579; GISEL-GFX12-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)580; GISEL-GFX12-FAKE16-NEXT: v_and_b32_e32 v0, 0xffff, v0581; GISEL-GFX12-FAKE16-NEXT: v_lshl_or_b32 v0, v1, 16, v0582; GISEL-GFX12-FAKE16-NEXT: s_setpc_b64 s[30:31]583 584 %src0.min = call i16 @llvm.smin.i16(i16 %src0, i16 255)585 %src0.clamp = call i16 @llvm.smax.i16(i16 %src0.min, i16 0)586 %src1.max = call i16 @llvm.smax.i16(i16 %src1, i16 0)587 %src1.clamp = call i16 @llvm.smin.i16(i16 %src1.max, i16 255)588 %insert.0 = insertelement <2 x i16> poison, i16 %src0.clamp, i32 0589 %vec = insertelement <2 x i16> %insert.0, i16 %src1.clamp, i32 1590 ret <2 x i16> %vec591}592 593define <2 x i16> @vec_smax_smin(<2 x i16> %src) {594; SDAG-VI-LABEL: vec_smax_smin:595; SDAG-VI: ; %bb.0:596; SDAG-VI-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)597; SDAG-VI-NEXT: v_mov_b32_e32 v1, 0598; SDAG-VI-NEXT: v_max_i16_sdwa v1, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD599; SDAG-VI-NEXT: v_max_i16_e32 v0, 0, v0600; SDAG-VI-NEXT: v_mov_b32_e32 v2, 0xff601; SDAG-VI-NEXT: v_min_i16_e32 v0, 0xff, v0602; SDAG-VI-NEXT: v_min_i16_sdwa v1, v1, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD603; SDAG-VI-NEXT: v_or_b32_e32 v0, v0, v1604; SDAG-VI-NEXT: s_setpc_b64 s[30:31]605;606; SDAG-GFX9-LABEL: vec_smax_smin:607; SDAG-GFX9: ; %bb.0:608; SDAG-GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)609; SDAG-GFX9-NEXT: v_pk_max_i16 v0, v0, 0610; SDAG-GFX9-NEXT: s_movk_i32 s4, 0xff611; SDAG-GFX9-NEXT: v_pk_min_i16 v0, v0, s4 op_sel_hi:[1,0]612; SDAG-GFX9-NEXT: s_setpc_b64 s[30:31]613;614; SDAG-GFX11-LABEL: vec_smax_smin:615; SDAG-GFX11: ; %bb.0:616; SDAG-GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)617; SDAG-GFX11-NEXT: v_pk_max_i16 v0, v0, 0618; SDAG-GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)619; SDAG-GFX11-NEXT: v_pk_min_i16 v0, 0xff, v0 op_sel_hi:[0,1]620; SDAG-GFX11-NEXT: s_setpc_b64 s[30:31]621;622; SDAG-GFX12-LABEL: vec_smax_smin:623; SDAG-GFX12: ; %bb.0:624; SDAG-GFX12-NEXT: s_wait_loadcnt_dscnt 0x0625; SDAG-GFX12-NEXT: s_wait_expcnt 0x0626; SDAG-GFX12-NEXT: s_wait_samplecnt 0x0627; SDAG-GFX12-NEXT: s_wait_bvhcnt 0x0628; SDAG-GFX12-NEXT: s_wait_kmcnt 0x0629; SDAG-GFX12-NEXT: v_pk_max_i16 v0, v0, 0630; SDAG-GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1)631; SDAG-GFX12-NEXT: v_pk_min_i16 v0, 0xff, v0 op_sel_hi:[0,1]632; SDAG-GFX12-NEXT: s_setpc_b64 s[30:31]633;634; GISEL-VI-LABEL: vec_smax_smin:635; GISEL-VI: ; %bb.0:636; GISEL-VI-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)637; GISEL-VI-NEXT: v_mov_b32_e32 v2, 0638; GISEL-VI-NEXT: v_max_i16_e32 v1, 0, v0639; GISEL-VI-NEXT: v_max_i16_sdwa v0, v0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD640; GISEL-VI-NEXT: v_mov_b32_e32 v2, 0xff641; GISEL-VI-NEXT: v_min_i16_e32 v1, 0xff, v1642; GISEL-VI-NEXT: v_min_i16_sdwa v0, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD643; GISEL-VI-NEXT: v_or_b32_e32 v0, v1, v0644; GISEL-VI-NEXT: s_setpc_b64 s[30:31]645;646; GISEL-GFX9-LABEL: vec_smax_smin:647; GISEL-GFX9: ; %bb.0:648; GISEL-GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)649; GISEL-GFX9-NEXT: v_pk_max_i16 v0, v0, 0650; GISEL-GFX9-NEXT: v_mov_b32_e32 v1, 0xff00ff651; GISEL-GFX9-NEXT: v_pk_min_i16 v0, v0, v1652; GISEL-GFX9-NEXT: s_setpc_b64 s[30:31]653;654; GISEL-GFX11-LABEL: vec_smax_smin:655; GISEL-GFX11: ; %bb.0:656; GISEL-GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)657; GISEL-GFX11-NEXT: v_pk_max_i16 v0, v0, 0658; GISEL-GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)659; GISEL-GFX11-NEXT: v_pk_min_i16 v0, 0xff00ff, v0660; GISEL-GFX11-NEXT: s_setpc_b64 s[30:31]661;662; GISEL-GFX12-LABEL: vec_smax_smin:663; GISEL-GFX12: ; %bb.0:664; GISEL-GFX12-NEXT: s_wait_loadcnt_dscnt 0x0665; GISEL-GFX12-NEXT: s_wait_expcnt 0x0666; GISEL-GFX12-NEXT: s_wait_samplecnt 0x0667; GISEL-GFX12-NEXT: s_wait_bvhcnt 0x0668; GISEL-GFX12-NEXT: s_wait_kmcnt 0x0669; GISEL-GFX12-NEXT: v_pk_max_i16 v0, v0, 0670; GISEL-GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1)671; GISEL-GFX12-NEXT: v_pk_min_i16 v0, 0xff00ff, v0672; GISEL-GFX12-NEXT: s_setpc_b64 s[30:31]673 674 %src.max = call <2 x i16> @llvm.smax.v2i16(<2 x i16> %src, <2 x i16> <i16 0, i16 0>)675 %src.clamp = call <2 x i16> @llvm.smin.v2i16(<2 x i16> %src.max, <2 x i16> <i16 255, i16 255>)676 ret <2 x i16> %src.clamp677}678 679; Check that we don't emit a VALU instruction for SGPR inputs.680define amdgpu_kernel void @vec_smax_smin_sgpr(ptr addrspace(1) %out, <2 x i16> inreg %src) {681; SDAG-VI-LABEL: vec_smax_smin_sgpr:682; SDAG-VI: ; %bb.0:683; SDAG-VI-NEXT: s_load_dword s2, s[4:5], 0x2c684; SDAG-VI-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x24685; SDAG-VI-NEXT: v_mov_b32_e32 v0, 0xff686; SDAG-VI-NEXT: s_waitcnt lgkmcnt(0)687; SDAG-VI-NEXT: s_ashr_i32 s3, s2, 16688; SDAG-VI-NEXT: s_sext_i32_i16 s2, s2689; SDAG-VI-NEXT: v_med3_i32 v1, s2, 0, v0690; SDAG-VI-NEXT: v_med3_i32 v0, s3, 0, v0691; SDAG-VI-NEXT: v_lshlrev_b32_e32 v0, 16, v0692; SDAG-VI-NEXT: v_or_b32_sdwa v2, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD693; SDAG-VI-NEXT: v_mov_b32_e32 v0, s0694; SDAG-VI-NEXT: v_mov_b32_e32 v1, s1695; SDAG-VI-NEXT: flat_store_dword v[0:1], v2696; SDAG-VI-NEXT: s_endpgm697;698; SDAG-GFX9-LABEL: vec_smax_smin_sgpr:699; SDAG-GFX9: ; %bb.0:700; SDAG-GFX9-NEXT: s_load_dword s2, s[4:5], 0x2c701; SDAG-GFX9-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x24702; SDAG-GFX9-NEXT: v_mov_b32_e32 v0, 0703; SDAG-GFX9-NEXT: s_waitcnt lgkmcnt(0)704; SDAG-GFX9-NEXT: v_pk_max_i16 v1, s2, 0705; SDAG-GFX9-NEXT: s_movk_i32 s2, 0xff706; SDAG-GFX9-NEXT: v_pk_min_i16 v1, v1, s2 op_sel_hi:[1,0]707; SDAG-GFX9-NEXT: global_store_dword v0, v1, s[0:1]708; SDAG-GFX9-NEXT: s_endpgm709;710; SDAG-GFX11-LABEL: vec_smax_smin_sgpr:711; SDAG-GFX11: ; %bb.0:712; SDAG-GFX11-NEXT: s_clause 0x1713; SDAG-GFX11-NEXT: s_load_b32 s2, s[4:5], 0x2c714; SDAG-GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x24715; SDAG-GFX11-NEXT: v_mov_b32_e32 v1, 0716; SDAG-GFX11-NEXT: s_waitcnt lgkmcnt(0)717; SDAG-GFX11-NEXT: v_pk_max_i16 v0, s2, 0718; SDAG-GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)719; SDAG-GFX11-NEXT: v_pk_min_i16 v0, 0xff, v0 op_sel_hi:[0,1]720; SDAG-GFX11-NEXT: global_store_b32 v1, v0, s[0:1]721; SDAG-GFX11-NEXT: s_endpgm722;723; SDAG-GFX12-LABEL: vec_smax_smin_sgpr:724; SDAG-GFX12: ; %bb.0:725; SDAG-GFX12-NEXT: s_load_b96 s[0:2], s[4:5], 0x24726; SDAG-GFX12-NEXT: v_mov_b32_e32 v1, 0727; SDAG-GFX12-NEXT: s_wait_kmcnt 0x0728; SDAG-GFX12-NEXT: v_pk_max_i16 v0, s2, 0729; SDAG-GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1)730; SDAG-GFX12-NEXT: v_pk_min_i16 v0, 0xff, v0 op_sel_hi:[0,1]731; SDAG-GFX12-NEXT: global_store_b32 v1, v0, s[0:1]732; SDAG-GFX12-NEXT: s_endpgm733;734; GISEL-VI-LABEL: vec_smax_smin_sgpr:735; GISEL-VI: ; %bb.0:736; GISEL-VI-NEXT: s_load_dword s2, s[4:5], 0x2c737; GISEL-VI-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x24738; GISEL-VI-NEXT: s_waitcnt lgkmcnt(0)739; GISEL-VI-NEXT: s_lshr_b32 s3, s2, 16740; GISEL-VI-NEXT: s_sext_i32_i16 s3, s3741; GISEL-VI-NEXT: s_sext_i32_i16 s2, s2742; GISEL-VI-NEXT: s_max_i32 s3, s3, 0743; GISEL-VI-NEXT: s_max_i32 s2, s2, 0744; GISEL-VI-NEXT: s_sext_i32_i16 s3, s3745; GISEL-VI-NEXT: s_sext_i32_i16 s2, s2746; GISEL-VI-NEXT: s_min_i32 s3, s3, 0xff747; GISEL-VI-NEXT: s_min_i32 s2, s2, 0xff748; GISEL-VI-NEXT: s_and_b32 s3, 0xffff, s3749; GISEL-VI-NEXT: s_and_b32 s2, 0xffff, s2750; GISEL-VI-NEXT: s_lshl_b32 s3, s3, 16751; GISEL-VI-NEXT: s_or_b32 s2, s2, s3752; GISEL-VI-NEXT: v_mov_b32_e32 v0, s0753; GISEL-VI-NEXT: v_mov_b32_e32 v2, s2754; GISEL-VI-NEXT: v_mov_b32_e32 v1, s1755; GISEL-VI-NEXT: flat_store_dword v[0:1], v2756; GISEL-VI-NEXT: s_endpgm757;758; GISEL-GFX9-LABEL: vec_smax_smin_sgpr:759; GISEL-GFX9: ; %bb.0:760; GISEL-GFX9-NEXT: s_load_dword s2, s[4:5], 0x2c761; GISEL-GFX9-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x24762; GISEL-GFX9-NEXT: s_sext_i32_i16 s3, 0763; GISEL-GFX9-NEXT: v_mov_b32_e32 v1, 0764; GISEL-GFX9-NEXT: s_waitcnt lgkmcnt(0)765; GISEL-GFX9-NEXT: s_sext_i32_i16 s4, s2766; GISEL-GFX9-NEXT: s_ashr_i32 s2, s2, 16767; GISEL-GFX9-NEXT: s_max_i32 s3, s4, s3768; GISEL-GFX9-NEXT: s_max_i32 s2, s2, 0769; GISEL-GFX9-NEXT: s_pack_ll_b32_b16 s2, s3, s2770; GISEL-GFX9-NEXT: s_sext_i32_i16 s3, s2771; GISEL-GFX9-NEXT: s_ashr_i32 s2, s2, 16772; GISEL-GFX9-NEXT: s_sext_i32_i16 s4, 0xff00ff773; GISEL-GFX9-NEXT: s_min_i32 s3, s3, s4774; GISEL-GFX9-NEXT: s_min_i32 s2, s2, 0xff775; GISEL-GFX9-NEXT: s_pack_ll_b32_b16 s2, s3, s2776; GISEL-GFX9-NEXT: v_mov_b32_e32 v0, s2777; GISEL-GFX9-NEXT: global_store_dword v1, v0, s[0:1]778; GISEL-GFX9-NEXT: s_endpgm779;780; GISEL-GFX11-LABEL: vec_smax_smin_sgpr:781; GISEL-GFX11: ; %bb.0:782; GISEL-GFX11-NEXT: s_clause 0x1783; GISEL-GFX11-NEXT: s_load_b32 s2, s[4:5], 0x2c784; GISEL-GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x24785; GISEL-GFX11-NEXT: s_sext_i32_i16 s3, 0786; GISEL-GFX11-NEXT: v_mov_b32_e32 v1, 0787; GISEL-GFX11-NEXT: s_waitcnt lgkmcnt(0)788; GISEL-GFX11-NEXT: s_sext_i32_i16 s4, s2789; GISEL-GFX11-NEXT: s_ashr_i32 s2, s2, 16790; GISEL-GFX11-NEXT: s_max_i32 s3, s4, s3791; GISEL-GFX11-NEXT: s_max_i32 s2, s2, 0792; GISEL-GFX11-NEXT: s_delay_alu instid0(SALU_CYCLE_1)793; GISEL-GFX11-NEXT: s_pack_ll_b32_b16 s2, s3, s2794; GISEL-GFX11-NEXT: s_sext_i32_i16 s3, 0xff00ff795; GISEL-GFX11-NEXT: s_sext_i32_i16 s4, s2796; GISEL-GFX11-NEXT: s_ashr_i32 s2, s2, 16797; GISEL-GFX11-NEXT: s_min_i32 s3, s4, s3798; GISEL-GFX11-NEXT: s_min_i32 s2, s2, 0xff799; GISEL-GFX11-NEXT: s_delay_alu instid0(SALU_CYCLE_1) | instskip(NEXT) | instid1(SALU_CYCLE_1)800; GISEL-GFX11-NEXT: s_pack_ll_b32_b16 s2, s3, s2801; GISEL-GFX11-NEXT: v_mov_b32_e32 v0, s2802; GISEL-GFX11-NEXT: global_store_b32 v1, v0, s[0:1]803; GISEL-GFX11-NEXT: s_endpgm804;805; GISEL-GFX12-LABEL: vec_smax_smin_sgpr:806; GISEL-GFX12: ; %bb.0:807; GISEL-GFX12-NEXT: s_load_b96 s[0:2], s[4:5], 0x24808; GISEL-GFX12-NEXT: s_sext_i32_i16 s3, 0809; GISEL-GFX12-NEXT: v_mov_b32_e32 v1, 0810; GISEL-GFX12-NEXT: s_wait_kmcnt 0x0811; GISEL-GFX12-NEXT: s_sext_i32_i16 s4, s2812; GISEL-GFX12-NEXT: s_ashr_i32 s2, s2, 16813; GISEL-GFX12-NEXT: s_max_i32 s3, s4, s3814; GISEL-GFX12-NEXT: s_max_i32 s2, s2, 0815; GISEL-GFX12-NEXT: s_delay_alu instid0(SALU_CYCLE_1)816; GISEL-GFX12-NEXT: s_pack_ll_b32_b16 s2, s3, s2817; GISEL-GFX12-NEXT: s_sext_i32_i16 s3, 0xff00ff818; GISEL-GFX12-NEXT: s_sext_i32_i16 s4, s2819; GISEL-GFX12-NEXT: s_ashr_i32 s2, s2, 16820; GISEL-GFX12-NEXT: s_min_i32 s3, s4, s3821; GISEL-GFX12-NEXT: s_min_i32 s2, s2, 0xff822; GISEL-GFX12-NEXT: s_delay_alu instid0(SALU_CYCLE_1) | instskip(NEXT) | instid1(SALU_CYCLE_1)823; GISEL-GFX12-NEXT: s_pack_ll_b32_b16 s2, s3, s2824; GISEL-GFX12-NEXT: v_mov_b32_e32 v0, s2825; GISEL-GFX12-NEXT: global_store_b32 v1, v0, s[0:1]826; GISEL-GFX12-NEXT: s_endpgm827 828 %src.max = call <2 x i16> @llvm.smax.v2i16(<2 x i16> %src, <2 x i16> <i16 0, i16 0>)829 %src.clamp = call <2 x i16> @llvm.smin.v2i16(<2 x i16> %src.max, <2 x i16> <i16 255, i16 255>)830 store <2 x i16> %src.clamp, ptr addrspace(1) %out831 ret void832}833 834define <2 x i16> @vec_smin_smax(<2 x i16> %src) {835; SDAG-VI-LABEL: vec_smin_smax:836; SDAG-VI: ; %bb.0:837; SDAG-VI-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)838; SDAG-VI-NEXT: v_mov_b32_e32 v1, 0xff839; SDAG-VI-NEXT: v_min_i16_sdwa v1, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD840; SDAG-VI-NEXT: v_min_i16_e32 v0, 0xff, v0841; SDAG-VI-NEXT: v_mov_b32_e32 v2, 0842; SDAG-VI-NEXT: v_max_i16_e32 v0, 0, v0843; SDAG-VI-NEXT: v_max_i16_sdwa v1, v1, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD844; SDAG-VI-NEXT: v_or_b32_e32 v0, v0, v1845; SDAG-VI-NEXT: s_setpc_b64 s[30:31]846;847; SDAG-GFX9-LABEL: vec_smin_smax:848; SDAG-GFX9: ; %bb.0:849; SDAG-GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)850; SDAG-GFX9-NEXT: s_movk_i32 s4, 0xff851; SDAG-GFX9-NEXT: v_pk_min_i16 v0, v0, s4 op_sel_hi:[1,0]852; SDAG-GFX9-NEXT: v_pk_max_i16 v0, v0, 0853; SDAG-GFX9-NEXT: s_setpc_b64 s[30:31]854;855; SDAG-GFX11-LABEL: vec_smin_smax:856; SDAG-GFX11: ; %bb.0:857; SDAG-GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)858; SDAG-GFX11-NEXT: v_pk_min_i16 v0, 0xff, v0 op_sel_hi:[0,1]859; SDAG-GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)860; SDAG-GFX11-NEXT: v_pk_max_i16 v0, v0, 0861; SDAG-GFX11-NEXT: s_setpc_b64 s[30:31]862;863; SDAG-GFX12-LABEL: vec_smin_smax:864; SDAG-GFX12: ; %bb.0:865; SDAG-GFX12-NEXT: s_wait_loadcnt_dscnt 0x0866; SDAG-GFX12-NEXT: s_wait_expcnt 0x0867; SDAG-GFX12-NEXT: s_wait_samplecnt 0x0868; SDAG-GFX12-NEXT: s_wait_bvhcnt 0x0869; SDAG-GFX12-NEXT: s_wait_kmcnt 0x0870; SDAG-GFX12-NEXT: v_pk_min_i16 v0, 0xff, v0 op_sel_hi:[0,1]871; SDAG-GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1)872; SDAG-GFX12-NEXT: v_pk_max_i16 v0, v0, 0873; SDAG-GFX12-NEXT: s_setpc_b64 s[30:31]874;875; GISEL-VI-LABEL: vec_smin_smax:876; GISEL-VI: ; %bb.0:877; GISEL-VI-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)878; GISEL-VI-NEXT: v_mov_b32_e32 v1, 0xff879; GISEL-VI-NEXT: v_min_i16_e32 v2, 0xff, v0880; GISEL-VI-NEXT: v_min_i16_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD881; GISEL-VI-NEXT: v_max_i16_e32 v1, 0, v2882; GISEL-VI-NEXT: v_mov_b32_e32 v2, 0883; GISEL-VI-NEXT: v_max_i16_sdwa v0, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD884; GISEL-VI-NEXT: v_or_b32_e32 v0, v1, v0885; GISEL-VI-NEXT: s_setpc_b64 s[30:31]886;887; GISEL-GFX9-LABEL: vec_smin_smax:888; GISEL-GFX9: ; %bb.0:889; GISEL-GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)890; GISEL-GFX9-NEXT: v_mov_b32_e32 v1, 0xff00ff891; GISEL-GFX9-NEXT: v_pk_min_i16 v0, v0, v1892; GISEL-GFX9-NEXT: v_pk_max_i16 v0, v0, 0893; GISEL-GFX9-NEXT: s_setpc_b64 s[30:31]894;895; GISEL-GFX11-LABEL: vec_smin_smax:896; GISEL-GFX11: ; %bb.0:897; GISEL-GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)898; GISEL-GFX11-NEXT: v_pk_min_i16 v0, 0xff00ff, v0899; GISEL-GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)900; GISEL-GFX11-NEXT: v_pk_max_i16 v0, v0, 0901; GISEL-GFX11-NEXT: s_setpc_b64 s[30:31]902;903; GISEL-GFX12-LABEL: vec_smin_smax:904; GISEL-GFX12: ; %bb.0:905; GISEL-GFX12-NEXT: s_wait_loadcnt_dscnt 0x0906; GISEL-GFX12-NEXT: s_wait_expcnt 0x0907; GISEL-GFX12-NEXT: s_wait_samplecnt 0x0908; GISEL-GFX12-NEXT: s_wait_bvhcnt 0x0909; GISEL-GFX12-NEXT: s_wait_kmcnt 0x0910; GISEL-GFX12-NEXT: v_pk_min_i16 v0, 0xff00ff, v0911; GISEL-GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1)912; GISEL-GFX12-NEXT: v_pk_max_i16 v0, v0, 0913; GISEL-GFX12-NEXT: s_setpc_b64 s[30:31]914 915 %src.min = call <2 x i16> @llvm.smin.v2i16(<2 x i16> %src, <2 x i16> <i16 255, i16 255>)916 %src.clamp = call <2 x i16> @llvm.smax.v2i16(<2 x i16> %src.min, <2 x i16> <i16 0, i16 0>)917 ret <2 x i16> %src.clamp918}919define i16 @basic_smax_smin_bit_or(i16 %src0, i16 %src1) {920; SDAG-VI-LABEL: basic_smax_smin_bit_or:921; SDAG-VI: ; %bb.0:922; SDAG-VI-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)923; SDAG-VI-NEXT: v_max_i16_e32 v0, 0, v0924; SDAG-VI-NEXT: v_max_i16_e32 v1, 0, v1925; SDAG-VI-NEXT: v_mov_b32_e32 v2, 0xff926; SDAG-VI-NEXT: v_min_i16_e32 v0, 0xff, v0927; SDAG-VI-NEXT: v_min_i16_sdwa v1, v1, v2 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD928; SDAG-VI-NEXT: v_or_b32_e32 v0, v0, v1929; SDAG-VI-NEXT: s_setpc_b64 s[30:31]930;931; SDAG-GFX9-LABEL: basic_smax_smin_bit_or:932; SDAG-GFX9: ; %bb.0:933; SDAG-GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)934; SDAG-GFX9-NEXT: v_mov_b32_e32 v2, 0xff935; SDAG-GFX9-NEXT: v_med3_i16 v1, v1, 0, v2936; SDAG-GFX9-NEXT: v_med3_i16 v0, v0, 0, v2937; SDAG-GFX9-NEXT: v_lshlrev_b16_e32 v1, 8, v1938; SDAG-GFX9-NEXT: v_or_b32_e32 v0, v0, v1939; SDAG-GFX9-NEXT: s_setpc_b64 s[30:31]940;941; SDAG-GFX11-TRUE16-LABEL: basic_smax_smin_bit_or:942; SDAG-GFX11-TRUE16: ; %bb.0:943; SDAG-GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)944; SDAG-GFX11-TRUE16-NEXT: v_med3_i16 v0.h, v1.l, 0, 0xff945; SDAG-GFX11-TRUE16-NEXT: v_med3_i16 v0.l, v0.l, 0, 0xff946; SDAG-GFX11-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)947; SDAG-GFX11-TRUE16-NEXT: v_lshlrev_b16 v0.h, 8, v0.h948; SDAG-GFX11-TRUE16-NEXT: v_or_b16 v0.l, v0.l, v0.h949; SDAG-GFX11-TRUE16-NEXT: s_setpc_b64 s[30:31]950;951; SDAG-GFX11-FAKE16-LABEL: basic_smax_smin_bit_or:952; SDAG-GFX11-FAKE16: ; %bb.0:953; SDAG-GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)954; SDAG-GFX11-FAKE16-NEXT: v_med3_i16 v1, v1, 0, 0xff955; SDAG-GFX11-FAKE16-NEXT: v_med3_i16 v0, v0, 0, 0xff956; SDAG-GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)957; SDAG-GFX11-FAKE16-NEXT: v_lshlrev_b16 v1, 8, v1958; SDAG-GFX11-FAKE16-NEXT: v_or_b32_e32 v0, v0, v1959; SDAG-GFX11-FAKE16-NEXT: s_setpc_b64 s[30:31]960;961; SDAG-GFX12-TRUE16-LABEL: basic_smax_smin_bit_or:962; SDAG-GFX12-TRUE16: ; %bb.0:963; SDAG-GFX12-TRUE16-NEXT: s_wait_loadcnt_dscnt 0x0964; SDAG-GFX12-TRUE16-NEXT: s_wait_expcnt 0x0965; SDAG-GFX12-TRUE16-NEXT: s_wait_samplecnt 0x0966; SDAG-GFX12-TRUE16-NEXT: s_wait_bvhcnt 0x0967; SDAG-GFX12-TRUE16-NEXT: s_wait_kmcnt 0x0968; SDAG-GFX12-TRUE16-NEXT: v_med3_i16 v0.h, v1.l, 0, 0xff969; SDAG-GFX12-TRUE16-NEXT: v_med3_i16 v0.l, v0.l, 0, 0xff970; SDAG-GFX12-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)971; SDAG-GFX12-TRUE16-NEXT: v_lshlrev_b16 v0.h, 8, v0.h972; SDAG-GFX12-TRUE16-NEXT: v_or_b16 v0.l, v0.l, v0.h973; SDAG-GFX12-TRUE16-NEXT: s_setpc_b64 s[30:31]974;975; SDAG-GFX12-FAKE16-LABEL: basic_smax_smin_bit_or:976; SDAG-GFX12-FAKE16: ; %bb.0:977; SDAG-GFX12-FAKE16-NEXT: s_wait_loadcnt_dscnt 0x0978; SDAG-GFX12-FAKE16-NEXT: s_wait_expcnt 0x0979; SDAG-GFX12-FAKE16-NEXT: s_wait_samplecnt 0x0980; SDAG-GFX12-FAKE16-NEXT: s_wait_bvhcnt 0x0981; SDAG-GFX12-FAKE16-NEXT: s_wait_kmcnt 0x0982; SDAG-GFX12-FAKE16-NEXT: v_med3_i16 v1, v1, 0, 0xff983; SDAG-GFX12-FAKE16-NEXT: v_med3_i16 v0, v0, 0, 0xff984; SDAG-GFX12-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)985; SDAG-GFX12-FAKE16-NEXT: v_lshlrev_b16 v1, 8, v1986; SDAG-GFX12-FAKE16-NEXT: v_or_b32_e32 v0, v0, v1987; SDAG-GFX12-FAKE16-NEXT: s_setpc_b64 s[30:31]988;989; GISEL-VI-LABEL: basic_smax_smin_bit_or:990; GISEL-VI: ; %bb.0:991; GISEL-VI-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)992; GISEL-VI-NEXT: v_max_i16_e32 v0, 0, v0993; GISEL-VI-NEXT: v_mov_b32_e32 v2, 0xff994; GISEL-VI-NEXT: v_max_i16_e32 v1, 0, v1995; GISEL-VI-NEXT: v_min_i16_e32 v0, 0xff, v0996; GISEL-VI-NEXT: v_min_i16_sdwa v1, v1, v2 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD997; GISEL-VI-NEXT: v_or_b32_e32 v0, v0, v1998; GISEL-VI-NEXT: s_setpc_b64 s[30:31]999;1000; GISEL-GFX9-LABEL: basic_smax_smin_bit_or:1001; GISEL-GFX9: ; %bb.0:1002; GISEL-GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1003; GISEL-GFX9-NEXT: v_mov_b32_e32 v2, 0xff1004; GISEL-GFX9-NEXT: v_med3_i16 v1, v1, 0, v21005; GISEL-GFX9-NEXT: v_med3_i16 v0, v0, 0, v21006; GISEL-GFX9-NEXT: v_lshlrev_b16_e32 v1, 8, v11007; GISEL-GFX9-NEXT: v_or_b32_e32 v0, v0, v11008; GISEL-GFX9-NEXT: s_setpc_b64 s[30:31]1009;1010; GISEL-GFX11-TRUE16-LABEL: basic_smax_smin_bit_or:1011; GISEL-GFX11-TRUE16: ; %bb.0:1012; GISEL-GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1013; GISEL-GFX11-TRUE16-NEXT: v_med3_i16 v0.h, v1.l, 0, 0xff1014; GISEL-GFX11-TRUE16-NEXT: v_med3_i16 v0.l, v0.l, 0, 0xff1015; GISEL-GFX11-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)1016; GISEL-GFX11-TRUE16-NEXT: v_lshlrev_b16 v0.h, 8, v0.h1017; GISEL-GFX11-TRUE16-NEXT: v_or_b16 v0.l, v0.l, v0.h1018; GISEL-GFX11-TRUE16-NEXT: s_setpc_b64 s[30:31]1019;1020; GISEL-GFX11-FAKE16-LABEL: basic_smax_smin_bit_or:1021; GISEL-GFX11-FAKE16: ; %bb.0:1022; GISEL-GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1023; GISEL-GFX11-FAKE16-NEXT: v_med3_i16 v1, v1, 0, 0xff1024; GISEL-GFX11-FAKE16-NEXT: v_med3_i16 v0, v0, 0, 0xff1025; GISEL-GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)1026; GISEL-GFX11-FAKE16-NEXT: v_lshlrev_b16 v1, 8, v11027; GISEL-GFX11-FAKE16-NEXT: v_or_b32_e32 v0, v0, v11028; GISEL-GFX11-FAKE16-NEXT: s_setpc_b64 s[30:31]1029;1030; GISEL-GFX12-TRUE16-LABEL: basic_smax_smin_bit_or:1031; GISEL-GFX12-TRUE16: ; %bb.0:1032; GISEL-GFX12-TRUE16-NEXT: s_wait_loadcnt_dscnt 0x01033; GISEL-GFX12-TRUE16-NEXT: s_wait_expcnt 0x01034; GISEL-GFX12-TRUE16-NEXT: s_wait_samplecnt 0x01035; GISEL-GFX12-TRUE16-NEXT: s_wait_bvhcnt 0x01036; GISEL-GFX12-TRUE16-NEXT: s_wait_kmcnt 0x01037; GISEL-GFX12-TRUE16-NEXT: v_med3_i16 v0.h, v1.l, 0, 0xff1038; GISEL-GFX12-TRUE16-NEXT: v_med3_i16 v0.l, v0.l, 0, 0xff1039; GISEL-GFX12-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)1040; GISEL-GFX12-TRUE16-NEXT: v_lshlrev_b16 v0.h, 8, v0.h1041; GISEL-GFX12-TRUE16-NEXT: v_or_b16 v0.l, v0.l, v0.h1042; GISEL-GFX12-TRUE16-NEXT: s_setpc_b64 s[30:31]1043;1044; GISEL-GFX12-FAKE16-LABEL: basic_smax_smin_bit_or:1045; GISEL-GFX12-FAKE16: ; %bb.0:1046; GISEL-GFX12-FAKE16-NEXT: s_wait_loadcnt_dscnt 0x01047; GISEL-GFX12-FAKE16-NEXT: s_wait_expcnt 0x01048; GISEL-GFX12-FAKE16-NEXT: s_wait_samplecnt 0x01049; GISEL-GFX12-FAKE16-NEXT: s_wait_bvhcnt 0x01050; GISEL-GFX12-FAKE16-NEXT: s_wait_kmcnt 0x01051; GISEL-GFX12-FAKE16-NEXT: v_med3_i16 v1, v1, 0, 0xff1052; GISEL-GFX12-FAKE16-NEXT: v_med3_i16 v0, v0, 0, 0xff1053; GISEL-GFX12-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)1054; GISEL-GFX12-FAKE16-NEXT: v_lshlrev_b16 v1, 8, v11055; GISEL-GFX12-FAKE16-NEXT: v_or_b32_e32 v0, v0, v11056; GISEL-GFX12-FAKE16-NEXT: s_setpc_b64 s[30:31]1057 1058 %src0.max = call i16 @llvm.smax.i16(i16 %src0, i16 0)1059 %src0.clamp = call i16 @llvm.smin.i16(i16 %src0.max, i16 255)1060 %src1.max = call i16 @llvm.smax.i16(i16 %src1, i16 0)1061 %src1.clamp = call i16 @llvm.smin.i16(i16 %src1.max, i16 255)1062 %src0.and = and i16 %src0.clamp, 2551063 %src1.shl = shl i16 %src1.clamp, 81064 %or = or i16 %src0.and, %src1.shl1065 ret i16 %or1066}1067define i16 @basic_umax_umin_bit_or(i16 %src0, i16 %src1) {1068; SDAG-VI-LABEL: basic_umax_umin_bit_or:1069; SDAG-VI: ; %bb.0:1070; SDAG-VI-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1071; SDAG-VI-NEXT: v_mov_b32_e32 v2, 0xff1072; SDAG-VI-NEXT: v_min_u16_e32 v0, 0xff, v01073; SDAG-VI-NEXT: v_min_u16_sdwa v1, v1, v2 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD1074; SDAG-VI-NEXT: v_or_b32_e32 v0, v0, v11075; SDAG-VI-NEXT: s_setpc_b64 s[30:31]1076;1077; SDAG-GFX9-LABEL: basic_umax_umin_bit_or:1078; SDAG-GFX9: ; %bb.0:1079; SDAG-GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1080; SDAG-GFX9-NEXT: s_movk_i32 s4, 0xff1081; SDAG-GFX9-NEXT: v_min_u16_e32 v0, 0xff, v01082; SDAG-GFX9-NEXT: v_min_u16_sdwa v1, v1, s4 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD1083; SDAG-GFX9-NEXT: v_or_b32_e32 v0, v0, v11084; SDAG-GFX9-NEXT: s_setpc_b64 s[30:31]1085;1086; SDAG-GFX11-TRUE16-LABEL: basic_umax_umin_bit_or:1087; SDAG-GFX11-TRUE16: ; %bb.0:1088; SDAG-GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1089; SDAG-GFX11-TRUE16-NEXT: v_min_u16 v0.h, 0xff, v1.l1090; SDAG-GFX11-TRUE16-NEXT: v_min_u16 v0.l, 0xff, v0.l1091; SDAG-GFX11-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)1092; SDAG-GFX11-TRUE16-NEXT: v_lshlrev_b16 v0.h, 8, v0.h1093; SDAG-GFX11-TRUE16-NEXT: v_or_b16 v0.l, v0.l, v0.h1094; SDAG-GFX11-TRUE16-NEXT: s_setpc_b64 s[30:31]1095;1096; SDAG-GFX11-FAKE16-LABEL: basic_umax_umin_bit_or:1097; SDAG-GFX11-FAKE16: ; %bb.0:1098; SDAG-GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1099; SDAG-GFX11-FAKE16-NEXT: v_min_u16 v1, 0xff, v11100; SDAG-GFX11-FAKE16-NEXT: v_min_u16 v0, 0xff, v01101; SDAG-GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)1102; SDAG-GFX11-FAKE16-NEXT: v_lshlrev_b16 v1, 8, v11103; SDAG-GFX11-FAKE16-NEXT: v_or_b32_e32 v0, v0, v11104; SDAG-GFX11-FAKE16-NEXT: s_setpc_b64 s[30:31]1105;1106; SDAG-GFX12-TRUE16-LABEL: basic_umax_umin_bit_or:1107; SDAG-GFX12-TRUE16: ; %bb.0:1108; SDAG-GFX12-TRUE16-NEXT: s_wait_loadcnt_dscnt 0x01109; SDAG-GFX12-TRUE16-NEXT: s_wait_expcnt 0x01110; SDAG-GFX12-TRUE16-NEXT: s_wait_samplecnt 0x01111; SDAG-GFX12-TRUE16-NEXT: s_wait_bvhcnt 0x01112; SDAG-GFX12-TRUE16-NEXT: s_wait_kmcnt 0x01113; SDAG-GFX12-TRUE16-NEXT: v_min_u16 v0.h, 0xff, v1.l1114; SDAG-GFX12-TRUE16-NEXT: v_min_u16 v0.l, 0xff, v0.l1115; SDAG-GFX12-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)1116; SDAG-GFX12-TRUE16-NEXT: v_lshlrev_b16 v0.h, 8, v0.h1117; SDAG-GFX12-TRUE16-NEXT: v_or_b16 v0.l, v0.l, v0.h1118; SDAG-GFX12-TRUE16-NEXT: s_setpc_b64 s[30:31]1119;1120; SDAG-GFX12-FAKE16-LABEL: basic_umax_umin_bit_or:1121; SDAG-GFX12-FAKE16: ; %bb.0:1122; SDAG-GFX12-FAKE16-NEXT: s_wait_loadcnt_dscnt 0x01123; SDAG-GFX12-FAKE16-NEXT: s_wait_expcnt 0x01124; SDAG-GFX12-FAKE16-NEXT: s_wait_samplecnt 0x01125; SDAG-GFX12-FAKE16-NEXT: s_wait_bvhcnt 0x01126; SDAG-GFX12-FAKE16-NEXT: s_wait_kmcnt 0x01127; SDAG-GFX12-FAKE16-NEXT: v_min_u16 v1, 0xff, v11128; SDAG-GFX12-FAKE16-NEXT: v_min_u16 v0, 0xff, v01129; SDAG-GFX12-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)1130; SDAG-GFX12-FAKE16-NEXT: v_lshlrev_b16 v1, 8, v11131; SDAG-GFX12-FAKE16-NEXT: v_or_b32_e32 v0, v0, v11132; SDAG-GFX12-FAKE16-NEXT: s_setpc_b64 s[30:31]1133;1134; GISEL-VI-LABEL: basic_umax_umin_bit_or:1135; GISEL-VI: ; %bb.0:1136; GISEL-VI-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1137; GISEL-VI-NEXT: v_mov_b32_e32 v2, 0xff1138; GISEL-VI-NEXT: v_min_u16_e32 v0, 0xff, v01139; GISEL-VI-NEXT: v_min_u16_sdwa v1, v1, v2 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD1140; GISEL-VI-NEXT: v_or_b32_e32 v0, v0, v11141; GISEL-VI-NEXT: s_setpc_b64 s[30:31]1142;1143; GISEL-GFX9-LABEL: basic_umax_umin_bit_or:1144; GISEL-GFX9: ; %bb.0:1145; GISEL-GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1146; GISEL-GFX9-NEXT: v_mov_b32_e32 v2, 0xff1147; GISEL-GFX9-NEXT: v_min_u16_e32 v0, 0xff, v01148; GISEL-GFX9-NEXT: v_min_u16_sdwa v1, v1, v2 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD1149; GISEL-GFX9-NEXT: v_or_b32_e32 v0, v0, v11150; GISEL-GFX9-NEXT: s_setpc_b64 s[30:31]1151;1152; GISEL-GFX11-TRUE16-LABEL: basic_umax_umin_bit_or:1153; GISEL-GFX11-TRUE16: ; %bb.0:1154; GISEL-GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1155; GISEL-GFX11-TRUE16-NEXT: v_min_u16 v0.h, 0xff, v1.l1156; GISEL-GFX11-TRUE16-NEXT: v_min_u16 v0.l, 0xff, v0.l1157; GISEL-GFX11-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)1158; GISEL-GFX11-TRUE16-NEXT: v_lshlrev_b16 v0.h, 8, v0.h1159; GISEL-GFX11-TRUE16-NEXT: v_or_b16 v0.l, v0.l, v0.h1160; GISEL-GFX11-TRUE16-NEXT: s_setpc_b64 s[30:31]1161;1162; GISEL-GFX11-FAKE16-LABEL: basic_umax_umin_bit_or:1163; GISEL-GFX11-FAKE16: ; %bb.0:1164; GISEL-GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1165; GISEL-GFX11-FAKE16-NEXT: v_min_u16 v1, 0xff, v11166; GISEL-GFX11-FAKE16-NEXT: v_min_u16 v0, 0xff, v01167; GISEL-GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)1168; GISEL-GFX11-FAKE16-NEXT: v_lshlrev_b16 v1, 8, v11169; GISEL-GFX11-FAKE16-NEXT: v_or_b32_e32 v0, v0, v11170; GISEL-GFX11-FAKE16-NEXT: s_setpc_b64 s[30:31]1171;1172; GISEL-GFX12-TRUE16-LABEL: basic_umax_umin_bit_or:1173; GISEL-GFX12-TRUE16: ; %bb.0:1174; GISEL-GFX12-TRUE16-NEXT: s_wait_loadcnt_dscnt 0x01175; GISEL-GFX12-TRUE16-NEXT: s_wait_expcnt 0x01176; GISEL-GFX12-TRUE16-NEXT: s_wait_samplecnt 0x01177; GISEL-GFX12-TRUE16-NEXT: s_wait_bvhcnt 0x01178; GISEL-GFX12-TRUE16-NEXT: s_wait_kmcnt 0x01179; GISEL-GFX12-TRUE16-NEXT: v_min_u16 v0.h, 0xff, v1.l1180; GISEL-GFX12-TRUE16-NEXT: v_min_u16 v0.l, 0xff, v0.l1181; GISEL-GFX12-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)1182; GISEL-GFX12-TRUE16-NEXT: v_lshlrev_b16 v0.h, 8, v0.h1183; GISEL-GFX12-TRUE16-NEXT: v_or_b16 v0.l, v0.l, v0.h1184; GISEL-GFX12-TRUE16-NEXT: s_setpc_b64 s[30:31]1185;1186; GISEL-GFX12-FAKE16-LABEL: basic_umax_umin_bit_or:1187; GISEL-GFX12-FAKE16: ; %bb.0:1188; GISEL-GFX12-FAKE16-NEXT: s_wait_loadcnt_dscnt 0x01189; GISEL-GFX12-FAKE16-NEXT: s_wait_expcnt 0x01190; GISEL-GFX12-FAKE16-NEXT: s_wait_samplecnt 0x01191; GISEL-GFX12-FAKE16-NEXT: s_wait_bvhcnt 0x01192; GISEL-GFX12-FAKE16-NEXT: s_wait_kmcnt 0x01193; GISEL-GFX12-FAKE16-NEXT: v_min_u16 v1, 0xff, v11194; GISEL-GFX12-FAKE16-NEXT: v_min_u16 v0, 0xff, v01195; GISEL-GFX12-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)1196; GISEL-GFX12-FAKE16-NEXT: v_lshlrev_b16 v1, 8, v11197; GISEL-GFX12-FAKE16-NEXT: v_or_b32_e32 v0, v0, v11198; GISEL-GFX12-FAKE16-NEXT: s_setpc_b64 s[30:31]1199 1200 %src0.max = call i16 @llvm.umax.i16(i16 %src0, i16 0)1201 %src0.clamp = call i16 @llvm.umin.i16(i16 %src0.max, i16 255)1202 %src1.max = call i16 @llvm.umax.i16(i16 %src1, i16 0)1203 %src1.clamp = call i16 @llvm.umin.i16(i16 %src1.max, i16 255)1204 %src0.and = and i16 %src0.clamp, 2551205 %src1.shl = shl i16 %src1.clamp, 81206 %or = or i16 %src0.and, %src1.shl1207 ret i16 %or1208}1209define i16 @basic_smax_smin_vec_cast(i16 %src0, i16 %src1) {1210; SDAG-VI-LABEL: basic_smax_smin_vec_cast:1211; SDAG-VI: ; %bb.0:1212; SDAG-VI-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1213; SDAG-VI-NEXT: v_max_i16_e32 v0, 0, v01214; SDAG-VI-NEXT: v_max_i16_e32 v1, 0, v11215; SDAG-VI-NEXT: v_mov_b32_e32 v2, 0xff1216; SDAG-VI-NEXT: v_min_i16_e32 v0, 0xff, v01217; SDAG-VI-NEXT: v_min_i16_sdwa v1, v1, v2 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD1218; SDAG-VI-NEXT: v_or_b32_e32 v0, v0, v11219; SDAG-VI-NEXT: s_setpc_b64 s[30:31]1220;1221; SDAG-GFX9-LABEL: basic_smax_smin_vec_cast:1222; SDAG-GFX9: ; %bb.0:1223; SDAG-GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1224; SDAG-GFX9-NEXT: v_mov_b32_e32 v2, 0xff1225; SDAG-GFX9-NEXT: v_med3_i16 v1, v1, 0, v21226; SDAG-GFX9-NEXT: v_med3_i16 v0, v0, 0, v21227; SDAG-GFX9-NEXT: v_lshlrev_b16_e32 v1, 8, v11228; SDAG-GFX9-NEXT: v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD1229; SDAG-GFX9-NEXT: s_setpc_b64 s[30:31]1230;1231; SDAG-GFX11-TRUE16-LABEL: basic_smax_smin_vec_cast:1232; SDAG-GFX11-TRUE16: ; %bb.0:1233; SDAG-GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1234; SDAG-GFX11-TRUE16-NEXT: v_med3_i16 v0.h, v1.l, 0, 0xff1235; SDAG-GFX11-TRUE16-NEXT: v_med3_i16 v0.l, v0.l, 0, 0xff1236; SDAG-GFX11-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)1237; SDAG-GFX11-TRUE16-NEXT: v_lshlrev_b16 v0.h, 8, v0.h1238; SDAG-GFX11-TRUE16-NEXT: v_and_b16 v0.l, 0xff, v0.l1239; SDAG-GFX11-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1)1240; SDAG-GFX11-TRUE16-NEXT: v_or_b16 v0.l, v0.l, v0.h1241; SDAG-GFX11-TRUE16-NEXT: s_setpc_b64 s[30:31]1242;1243; SDAG-GFX11-FAKE16-LABEL: basic_smax_smin_vec_cast:1244; SDAG-GFX11-FAKE16: ; %bb.0:1245; SDAG-GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1246; SDAG-GFX11-FAKE16-NEXT: v_med3_i16 v1, v1, 0, 0xff1247; SDAG-GFX11-FAKE16-NEXT: v_med3_i16 v0, v0, 0, 0xff1248; SDAG-GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)1249; SDAG-GFX11-FAKE16-NEXT: v_lshlrev_b16 v1, 8, v11250; SDAG-GFX11-FAKE16-NEXT: v_and_b32_e32 v0, 0xff, v01251; SDAG-GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1)1252; SDAG-GFX11-FAKE16-NEXT: v_or_b32_e32 v0, v0, v11253; SDAG-GFX11-FAKE16-NEXT: s_setpc_b64 s[30:31]1254;1255; SDAG-GFX12-TRUE16-LABEL: basic_smax_smin_vec_cast:1256; SDAG-GFX12-TRUE16: ; %bb.0:1257; SDAG-GFX12-TRUE16-NEXT: s_wait_loadcnt_dscnt 0x01258; SDAG-GFX12-TRUE16-NEXT: s_wait_expcnt 0x01259; SDAG-GFX12-TRUE16-NEXT: s_wait_samplecnt 0x01260; SDAG-GFX12-TRUE16-NEXT: s_wait_bvhcnt 0x01261; SDAG-GFX12-TRUE16-NEXT: s_wait_kmcnt 0x01262; SDAG-GFX12-TRUE16-NEXT: v_med3_i16 v0.h, v1.l, 0, 0xff1263; SDAG-GFX12-TRUE16-NEXT: v_med3_i16 v0.l, v0.l, 0, 0xff1264; SDAG-GFX12-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)1265; SDAG-GFX12-TRUE16-NEXT: v_lshlrev_b16 v0.h, 8, v0.h1266; SDAG-GFX12-TRUE16-NEXT: v_and_b16 v0.l, 0xff, v0.l1267; SDAG-GFX12-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1)1268; SDAG-GFX12-TRUE16-NEXT: v_or_b16 v0.l, v0.l, v0.h1269; SDAG-GFX12-TRUE16-NEXT: s_setpc_b64 s[30:31]1270;1271; SDAG-GFX12-FAKE16-LABEL: basic_smax_smin_vec_cast:1272; SDAG-GFX12-FAKE16: ; %bb.0:1273; SDAG-GFX12-FAKE16-NEXT: s_wait_loadcnt_dscnt 0x01274; SDAG-GFX12-FAKE16-NEXT: s_wait_expcnt 0x01275; SDAG-GFX12-FAKE16-NEXT: s_wait_samplecnt 0x01276; SDAG-GFX12-FAKE16-NEXT: s_wait_bvhcnt 0x01277; SDAG-GFX12-FAKE16-NEXT: s_wait_kmcnt 0x01278; SDAG-GFX12-FAKE16-NEXT: v_med3_i16 v1, v1, 0, 0xff1279; SDAG-GFX12-FAKE16-NEXT: v_med3_i16 v0, v0, 0, 0xff1280; SDAG-GFX12-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)1281; SDAG-GFX12-FAKE16-NEXT: v_lshlrev_b16 v1, 8, v11282; SDAG-GFX12-FAKE16-NEXT: v_and_b32_e32 v0, 0xff, v01283; SDAG-GFX12-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1)1284; SDAG-GFX12-FAKE16-NEXT: v_or_b32_e32 v0, v0, v11285; SDAG-GFX12-FAKE16-NEXT: s_setpc_b64 s[30:31]1286;1287; GISEL-VI-LABEL: basic_smax_smin_vec_cast:1288; GISEL-VI: ; %bb.0:1289; GISEL-VI-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1290; GISEL-VI-NEXT: v_max_i16_e32 v0, 0, v01291; GISEL-VI-NEXT: v_mov_b32_e32 v2, 0xff1292; GISEL-VI-NEXT: v_max_i16_e32 v1, 0, v11293; GISEL-VI-NEXT: v_min_i16_e32 v0, 0xff, v01294; GISEL-VI-NEXT: v_min_i16_sdwa v1, v1, v2 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD1295; GISEL-VI-NEXT: v_or_b32_e32 v0, v0, v11296; GISEL-VI-NEXT: s_setpc_b64 s[30:31]1297;1298; GISEL-GFX9-LABEL: basic_smax_smin_vec_cast:1299; GISEL-GFX9: ; %bb.0:1300; GISEL-GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1301; GISEL-GFX9-NEXT: v_mov_b32_e32 v2, 0xff1302; GISEL-GFX9-NEXT: v_med3_i16 v1, v1, 0, v21303; GISEL-GFX9-NEXT: v_med3_i16 v0, v0, 0, v21304; GISEL-GFX9-NEXT: v_lshlrev_b16_e32 v1, 8, v11305; GISEL-GFX9-NEXT: v_or_b32_e32 v0, v0, v11306; GISEL-GFX9-NEXT: s_setpc_b64 s[30:31]1307;1308; GISEL-GFX11-TRUE16-LABEL: basic_smax_smin_vec_cast:1309; GISEL-GFX11-TRUE16: ; %bb.0:1310; GISEL-GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1311; GISEL-GFX11-TRUE16-NEXT: v_med3_i16 v0.h, v1.l, 0, 0xff1312; GISEL-GFX11-TRUE16-NEXT: v_med3_i16 v0.l, v0.l, 0, 0xff1313; GISEL-GFX11-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)1314; GISEL-GFX11-TRUE16-NEXT: v_lshlrev_b16 v0.h, 8, v0.h1315; GISEL-GFX11-TRUE16-NEXT: v_or_b16 v0.l, v0.l, v0.h1316; GISEL-GFX11-TRUE16-NEXT: s_setpc_b64 s[30:31]1317;1318; GISEL-GFX11-FAKE16-LABEL: basic_smax_smin_vec_cast:1319; GISEL-GFX11-FAKE16: ; %bb.0:1320; GISEL-GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1321; GISEL-GFX11-FAKE16-NEXT: v_med3_i16 v1, v1, 0, 0xff1322; GISEL-GFX11-FAKE16-NEXT: v_med3_i16 v0, v0, 0, 0xff1323; GISEL-GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)1324; GISEL-GFX11-FAKE16-NEXT: v_lshlrev_b16 v1, 8, v11325; GISEL-GFX11-FAKE16-NEXT: v_or_b32_e32 v0, v0, v11326; GISEL-GFX11-FAKE16-NEXT: s_setpc_b64 s[30:31]1327;1328; GISEL-GFX12-TRUE16-LABEL: basic_smax_smin_vec_cast:1329; GISEL-GFX12-TRUE16: ; %bb.0:1330; GISEL-GFX12-TRUE16-NEXT: s_wait_loadcnt_dscnt 0x01331; GISEL-GFX12-TRUE16-NEXT: s_wait_expcnt 0x01332; GISEL-GFX12-TRUE16-NEXT: s_wait_samplecnt 0x01333; GISEL-GFX12-TRUE16-NEXT: s_wait_bvhcnt 0x01334; GISEL-GFX12-TRUE16-NEXT: s_wait_kmcnt 0x01335; GISEL-GFX12-TRUE16-NEXT: v_med3_i16 v0.h, v1.l, 0, 0xff1336; GISEL-GFX12-TRUE16-NEXT: v_med3_i16 v0.l, v0.l, 0, 0xff1337; GISEL-GFX12-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)1338; GISEL-GFX12-TRUE16-NEXT: v_lshlrev_b16 v0.h, 8, v0.h1339; GISEL-GFX12-TRUE16-NEXT: v_or_b16 v0.l, v0.l, v0.h1340; GISEL-GFX12-TRUE16-NEXT: s_setpc_b64 s[30:31]1341;1342; GISEL-GFX12-FAKE16-LABEL: basic_smax_smin_vec_cast:1343; GISEL-GFX12-FAKE16: ; %bb.0:1344; GISEL-GFX12-FAKE16-NEXT: s_wait_loadcnt_dscnt 0x01345; GISEL-GFX12-FAKE16-NEXT: s_wait_expcnt 0x01346; GISEL-GFX12-FAKE16-NEXT: s_wait_samplecnt 0x01347; GISEL-GFX12-FAKE16-NEXT: s_wait_bvhcnt 0x01348; GISEL-GFX12-FAKE16-NEXT: s_wait_kmcnt 0x01349; GISEL-GFX12-FAKE16-NEXT: v_med3_i16 v1, v1, 0, 0xff1350; GISEL-GFX12-FAKE16-NEXT: v_med3_i16 v0, v0, 0, 0xff1351; GISEL-GFX12-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)1352; GISEL-GFX12-FAKE16-NEXT: v_lshlrev_b16 v1, 8, v11353; GISEL-GFX12-FAKE16-NEXT: v_or_b32_e32 v0, v0, v11354; GISEL-GFX12-FAKE16-NEXT: s_setpc_b64 s[30:31]1355 1356 %src0.max = call i16 @llvm.smax.i16(i16 %src0, i16 0)1357 %src0.clamp = call i16 @llvm.smin.i16(i16 %src0.max, i16 255)1358 %src1.max = call i16 @llvm.smax.i16(i16 %src1, i16 0)1359 %src1.clamp = call i16 @llvm.smin.i16(i16 %src1.max, i16 255)1360 %insert.0 = insertelement <2 x i16> poison, i16 %src0.clamp, i32 01361 %vec = insertelement <2 x i16> %insert.0, i16 %src1.clamp, i32 11362 %vec.trunc = trunc <2 x i16> %vec to <2 x i8>1363 %cast = bitcast <2 x i8> %vec.trunc to i161364 ret i16 %cast1365}1366define i16 @basic_smax_smin_bit_shl(i16 %src0, i16 %src1) {1367; SDAG-VI-LABEL: basic_smax_smin_bit_shl:1368; SDAG-VI: ; %bb.0:1369; SDAG-VI-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1370; SDAG-VI-NEXT: v_max_i16_e32 v0, 0, v01371; SDAG-VI-NEXT: v_mov_b32_e32 v2, 01372; SDAG-VI-NEXT: v_min_i16_e32 v0, 0xff, v01373; SDAG-VI-NEXT: v_max_i16_sdwa v1, v1, v2 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD1374; SDAG-VI-NEXT: v_or_b32_e32 v0, v0, v11375; SDAG-VI-NEXT: s_setpc_b64 s[30:31]1376;1377; SDAG-GFX9-LABEL: basic_smax_smin_bit_shl:1378; SDAG-GFX9: ; %bb.0:1379; SDAG-GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1380; SDAG-GFX9-NEXT: v_mov_b32_e32 v2, 0xff1381; SDAG-GFX9-NEXT: v_med3_i16 v0, v0, 0, v21382; SDAG-GFX9-NEXT: v_mov_b32_e32 v2, 01383; SDAG-GFX9-NEXT: v_max_i16_sdwa v1, v1, v2 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD1384; SDAG-GFX9-NEXT: v_or_b32_e32 v0, v0, v11385; SDAG-GFX9-NEXT: s_setpc_b64 s[30:31]1386;1387; SDAG-GFX11-TRUE16-LABEL: basic_smax_smin_bit_shl:1388; SDAG-GFX11-TRUE16: ; %bb.0:1389; SDAG-GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1390; SDAG-GFX11-TRUE16-NEXT: v_max_i16 v0.h, v1.l, 01391; SDAG-GFX11-TRUE16-NEXT: v_med3_i16 v0.l, v0.l, 0, 0xff1392; SDAG-GFX11-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)1393; SDAG-GFX11-TRUE16-NEXT: v_lshlrev_b16 v0.h, 8, v0.h1394; SDAG-GFX11-TRUE16-NEXT: v_or_b16 v0.l, v0.l, v0.h1395; SDAG-GFX11-TRUE16-NEXT: s_setpc_b64 s[30:31]1396;1397; SDAG-GFX11-FAKE16-LABEL: basic_smax_smin_bit_shl:1398; SDAG-GFX11-FAKE16: ; %bb.0:1399; SDAG-GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1400; SDAG-GFX11-FAKE16-NEXT: v_max_i16 v1, v1, 01401; SDAG-GFX11-FAKE16-NEXT: v_med3_i16 v0, v0, 0, 0xff1402; SDAG-GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)1403; SDAG-GFX11-FAKE16-NEXT: v_lshlrev_b16 v1, 8, v11404; SDAG-GFX11-FAKE16-NEXT: v_or_b32_e32 v0, v0, v11405; SDAG-GFX11-FAKE16-NEXT: s_setpc_b64 s[30:31]1406;1407; SDAG-GFX12-TRUE16-LABEL: basic_smax_smin_bit_shl:1408; SDAG-GFX12-TRUE16: ; %bb.0:1409; SDAG-GFX12-TRUE16-NEXT: s_wait_loadcnt_dscnt 0x01410; SDAG-GFX12-TRUE16-NEXT: s_wait_expcnt 0x01411; SDAG-GFX12-TRUE16-NEXT: s_wait_samplecnt 0x01412; SDAG-GFX12-TRUE16-NEXT: s_wait_bvhcnt 0x01413; SDAG-GFX12-TRUE16-NEXT: s_wait_kmcnt 0x01414; SDAG-GFX12-TRUE16-NEXT: v_max_i16 v0.h, v1.l, 01415; SDAG-GFX12-TRUE16-NEXT: v_med3_i16 v0.l, v0.l, 0, 0xff1416; SDAG-GFX12-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)1417; SDAG-GFX12-TRUE16-NEXT: v_lshlrev_b16 v0.h, 8, v0.h1418; SDAG-GFX12-TRUE16-NEXT: v_or_b16 v0.l, v0.l, v0.h1419; SDAG-GFX12-TRUE16-NEXT: s_setpc_b64 s[30:31]1420;1421; SDAG-GFX12-FAKE16-LABEL: basic_smax_smin_bit_shl:1422; SDAG-GFX12-FAKE16: ; %bb.0:1423; SDAG-GFX12-FAKE16-NEXT: s_wait_loadcnt_dscnt 0x01424; SDAG-GFX12-FAKE16-NEXT: s_wait_expcnt 0x01425; SDAG-GFX12-FAKE16-NEXT: s_wait_samplecnt 0x01426; SDAG-GFX12-FAKE16-NEXT: s_wait_bvhcnt 0x01427; SDAG-GFX12-FAKE16-NEXT: s_wait_kmcnt 0x01428; SDAG-GFX12-FAKE16-NEXT: v_max_i16 v1, v1, 01429; SDAG-GFX12-FAKE16-NEXT: v_med3_i16 v0, v0, 0, 0xff1430; SDAG-GFX12-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)1431; SDAG-GFX12-FAKE16-NEXT: v_lshlrev_b16 v1, 8, v11432; SDAG-GFX12-FAKE16-NEXT: v_or_b32_e32 v0, v0, v11433; SDAG-GFX12-FAKE16-NEXT: s_setpc_b64 s[30:31]1434;1435; GISEL-VI-LABEL: basic_smax_smin_bit_shl:1436; GISEL-VI: ; %bb.0:1437; GISEL-VI-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1438; GISEL-VI-NEXT: v_max_i16_e32 v0, 0, v01439; GISEL-VI-NEXT: v_mov_b32_e32 v2, 01440; GISEL-VI-NEXT: v_min_i16_e32 v0, 0xff, v01441; GISEL-VI-NEXT: v_max_i16_sdwa v1, v1, v2 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD1442; GISEL-VI-NEXT: v_or_b32_e32 v0, v0, v11443; GISEL-VI-NEXT: s_setpc_b64 s[30:31]1444;1445; GISEL-GFX9-LABEL: basic_smax_smin_bit_shl:1446; GISEL-GFX9: ; %bb.0:1447; GISEL-GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1448; GISEL-GFX9-NEXT: v_mov_b32_e32 v2, 0xff1449; GISEL-GFX9-NEXT: v_med3_i16 v0, v0, 0, v21450; GISEL-GFX9-NEXT: v_mov_b32_e32 v2, 01451; GISEL-GFX9-NEXT: v_max_i16_sdwa v1, v1, v2 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD1452; GISEL-GFX9-NEXT: v_or_b32_e32 v0, v0, v11453; GISEL-GFX9-NEXT: s_setpc_b64 s[30:31]1454;1455; GISEL-GFX11-TRUE16-LABEL: basic_smax_smin_bit_shl:1456; GISEL-GFX11-TRUE16: ; %bb.0:1457; GISEL-GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1458; GISEL-GFX11-TRUE16-NEXT: v_max_i16 v0.h, v1.l, 01459; GISEL-GFX11-TRUE16-NEXT: v_med3_i16 v0.l, v0.l, 0, 0xff1460; GISEL-GFX11-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)1461; GISEL-GFX11-TRUE16-NEXT: v_lshlrev_b16 v0.h, 8, v0.h1462; GISEL-GFX11-TRUE16-NEXT: v_or_b16 v0.l, v0.l, v0.h1463; GISEL-GFX11-TRUE16-NEXT: s_setpc_b64 s[30:31]1464;1465; GISEL-GFX11-FAKE16-LABEL: basic_smax_smin_bit_shl:1466; GISEL-GFX11-FAKE16: ; %bb.0:1467; GISEL-GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1468; GISEL-GFX11-FAKE16-NEXT: v_max_i16 v1, v1, 01469; GISEL-GFX11-FAKE16-NEXT: v_med3_i16 v0, v0, 0, 0xff1470; GISEL-GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)1471; GISEL-GFX11-FAKE16-NEXT: v_lshlrev_b16 v1, 8, v11472; GISEL-GFX11-FAKE16-NEXT: v_or_b32_e32 v0, v0, v11473; GISEL-GFX11-FAKE16-NEXT: s_setpc_b64 s[30:31]1474;1475; GISEL-GFX12-TRUE16-LABEL: basic_smax_smin_bit_shl:1476; GISEL-GFX12-TRUE16: ; %bb.0:1477; GISEL-GFX12-TRUE16-NEXT: s_wait_loadcnt_dscnt 0x01478; GISEL-GFX12-TRUE16-NEXT: s_wait_expcnt 0x01479; GISEL-GFX12-TRUE16-NEXT: s_wait_samplecnt 0x01480; GISEL-GFX12-TRUE16-NEXT: s_wait_bvhcnt 0x01481; GISEL-GFX12-TRUE16-NEXT: s_wait_kmcnt 0x01482; GISEL-GFX12-TRUE16-NEXT: v_max_i16 v0.h, v1.l, 01483; GISEL-GFX12-TRUE16-NEXT: v_med3_i16 v0.l, v0.l, 0, 0xff1484; GISEL-GFX12-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)1485; GISEL-GFX12-TRUE16-NEXT: v_lshlrev_b16 v0.h, 8, v0.h1486; GISEL-GFX12-TRUE16-NEXT: v_or_b16 v0.l, v0.l, v0.h1487; GISEL-GFX12-TRUE16-NEXT: s_setpc_b64 s[30:31]1488;1489; GISEL-GFX12-FAKE16-LABEL: basic_smax_smin_bit_shl:1490; GISEL-GFX12-FAKE16: ; %bb.0:1491; GISEL-GFX12-FAKE16-NEXT: s_wait_loadcnt_dscnt 0x01492; GISEL-GFX12-FAKE16-NEXT: s_wait_expcnt 0x01493; GISEL-GFX12-FAKE16-NEXT: s_wait_samplecnt 0x01494; GISEL-GFX12-FAKE16-NEXT: s_wait_bvhcnt 0x01495; GISEL-GFX12-FAKE16-NEXT: s_wait_kmcnt 0x01496; GISEL-GFX12-FAKE16-NEXT: v_max_i16 v1, v1, 01497; GISEL-GFX12-FAKE16-NEXT: v_med3_i16 v0, v0, 0, 0xff1498; GISEL-GFX12-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)1499; GISEL-GFX12-FAKE16-NEXT: v_lshlrev_b16 v1, 8, v11500; GISEL-GFX12-FAKE16-NEXT: v_or_b32_e32 v0, v0, v11501; GISEL-GFX12-FAKE16-NEXT: s_setpc_b64 s[30:31]1502 1503 %src0.max = call i16 @llvm.smax.i16(i16 %src0, i16 0)1504 %src0.clamp = call i16 @llvm.smin.i16(i16 %src0.max, i16 255)1505 %src1.max = call i16 @llvm.smax.i16(i16 %src1, i16 0)1506 %src1.shl = shl i16 %src1.max, 81507 %or = or i16 %src0.clamp, %src1.shl1508 ret i16 %or1509}1510define i16 @basic_smax_smin_vec_input(<2 x i16> %src) {1511; SDAG-VI-LABEL: basic_smax_smin_vec_input:1512; SDAG-VI: ; %bb.0:1513; SDAG-VI-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1514; SDAG-VI-NEXT: v_mov_b32_e32 v1, 0xff1515; SDAG-VI-NEXT: v_min_i16_sdwa v1, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD1516; SDAG-VI-NEXT: v_min_i16_e32 v0, 0xff, v01517; SDAG-VI-NEXT: v_mov_b32_e32 v2, 01518; SDAG-VI-NEXT: v_max_i16_e32 v0, 0, v01519; SDAG-VI-NEXT: v_max_i16_sdwa v1, v1, v2 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD1520; SDAG-VI-NEXT: v_or_b32_e32 v0, v0, v11521; SDAG-VI-NEXT: s_setpc_b64 s[30:31]1522;1523; SDAG-GFX9-LABEL: basic_smax_smin_vec_input:1524; SDAG-GFX9: ; %bb.0:1525; SDAG-GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1526; SDAG-GFX9-NEXT: s_movk_i32 s4, 0xff1527; SDAG-GFX9-NEXT: v_pk_min_i16 v0, v0, s4 op_sel_hi:[1,0]1528; SDAG-GFX9-NEXT: v_pk_max_i16 v0, v0, 01529; SDAG-GFX9-NEXT: v_lshrrev_b32_e32 v1, 16, v01530; SDAG-GFX9-NEXT: v_lshlrev_b16_e32 v1, 8, v11531; SDAG-GFX9-NEXT: v_or_b32_e32 v0, v0, v11532; SDAG-GFX9-NEXT: s_setpc_b64 s[30:31]1533;1534; SDAG-GFX11-TRUE16-LABEL: basic_smax_smin_vec_input:1535; SDAG-GFX11-TRUE16: ; %bb.0:1536; SDAG-GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1537; SDAG-GFX11-TRUE16-NEXT: v_pk_min_i16 v0, 0xff, v0 op_sel_hi:[0,1]1538; SDAG-GFX11-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)1539; SDAG-GFX11-TRUE16-NEXT: v_pk_max_i16 v1, v0, 01540; SDAG-GFX11-TRUE16-NEXT: v_lshlrev_b16 v0.l, 8, v1.h1541; SDAG-GFX11-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1)1542; SDAG-GFX11-TRUE16-NEXT: v_or_b16 v0.l, v1.l, v0.l1543; SDAG-GFX11-TRUE16-NEXT: s_setpc_b64 s[30:31]1544;1545; SDAG-GFX11-FAKE16-LABEL: basic_smax_smin_vec_input:1546; SDAG-GFX11-FAKE16: ; %bb.0:1547; SDAG-GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1548; SDAG-GFX11-FAKE16-NEXT: v_pk_min_i16 v0, 0xff, v0 op_sel_hi:[0,1]1549; SDAG-GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)1550; SDAG-GFX11-FAKE16-NEXT: v_pk_max_i16 v0, v0, 01551; SDAG-GFX11-FAKE16-NEXT: v_lshrrev_b32_e32 v1, 16, v01552; SDAG-GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)1553; SDAG-GFX11-FAKE16-NEXT: v_lshlrev_b16 v1, 8, v11554; SDAG-GFX11-FAKE16-NEXT: v_or_b32_e32 v0, v0, v11555; SDAG-GFX11-FAKE16-NEXT: s_setpc_b64 s[30:31]1556;1557; SDAG-GFX12-TRUE16-LABEL: basic_smax_smin_vec_input:1558; SDAG-GFX12-TRUE16: ; %bb.0:1559; SDAG-GFX12-TRUE16-NEXT: s_wait_loadcnt_dscnt 0x01560; SDAG-GFX12-TRUE16-NEXT: s_wait_expcnt 0x01561; SDAG-GFX12-TRUE16-NEXT: s_wait_samplecnt 0x01562; SDAG-GFX12-TRUE16-NEXT: s_wait_bvhcnt 0x01563; SDAG-GFX12-TRUE16-NEXT: s_wait_kmcnt 0x01564; SDAG-GFX12-TRUE16-NEXT: v_pk_min_i16 v0, 0xff, v0 op_sel_hi:[0,1]1565; SDAG-GFX12-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)1566; SDAG-GFX12-TRUE16-NEXT: v_pk_max_i16 v1, v0, 01567; SDAG-GFX12-TRUE16-NEXT: v_lshlrev_b16 v0.l, 8, v1.h1568; SDAG-GFX12-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1)1569; SDAG-GFX12-TRUE16-NEXT: v_or_b16 v0.l, v1.l, v0.l1570; SDAG-GFX12-TRUE16-NEXT: s_setpc_b64 s[30:31]1571;1572; SDAG-GFX12-FAKE16-LABEL: basic_smax_smin_vec_input:1573; SDAG-GFX12-FAKE16: ; %bb.0:1574; SDAG-GFX12-FAKE16-NEXT: s_wait_loadcnt_dscnt 0x01575; SDAG-GFX12-FAKE16-NEXT: s_wait_expcnt 0x01576; SDAG-GFX12-FAKE16-NEXT: s_wait_samplecnt 0x01577; SDAG-GFX12-FAKE16-NEXT: s_wait_bvhcnt 0x01578; SDAG-GFX12-FAKE16-NEXT: s_wait_kmcnt 0x01579; SDAG-GFX12-FAKE16-NEXT: v_pk_min_i16 v0, 0xff, v0 op_sel_hi:[0,1]1580; SDAG-GFX12-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)1581; SDAG-GFX12-FAKE16-NEXT: v_pk_max_i16 v0, v0, 01582; SDAG-GFX12-FAKE16-NEXT: v_lshrrev_b32_e32 v1, 16, v01583; SDAG-GFX12-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)1584; SDAG-GFX12-FAKE16-NEXT: v_lshlrev_b16 v1, 8, v11585; SDAG-GFX12-FAKE16-NEXT: v_or_b32_e32 v0, v0, v11586; SDAG-GFX12-FAKE16-NEXT: s_setpc_b64 s[30:31]1587;1588; GISEL-VI-LABEL: basic_smax_smin_vec_input:1589; GISEL-VI: ; %bb.0:1590; GISEL-VI-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1591; GISEL-VI-NEXT: v_mov_b32_e32 v1, 0xff1592; GISEL-VI-NEXT: v_min_i16_e32 v2, 0xff, v01593; GISEL-VI-NEXT: v_min_i16_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD1594; GISEL-VI-NEXT: v_max_i16_e32 v0, 0, v01595; GISEL-VI-NEXT: v_and_b32_e32 v0, 0xff, v01596; GISEL-VI-NEXT: v_max_i16_e32 v1, 0, v21597; GISEL-VI-NEXT: v_lshlrev_b16_e32 v0, 8, v01598; GISEL-VI-NEXT: v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD1599; GISEL-VI-NEXT: s_setpc_b64 s[30:31]1600;1601; GISEL-GFX9-LABEL: basic_smax_smin_vec_input:1602; GISEL-GFX9: ; %bb.0:1603; GISEL-GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1604; GISEL-GFX9-NEXT: v_mov_b32_e32 v1, 0xff00ff1605; GISEL-GFX9-NEXT: v_pk_min_i16 v0, v1, v01606; GISEL-GFX9-NEXT: v_pk_max_i16 v0, 0, v01607; GISEL-GFX9-NEXT: v_mov_b32_e32 v1, 0xff1608; GISEL-GFX9-NEXT: v_and_b32_sdwa v1, v0, v1 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD1609; GISEL-GFX9-NEXT: v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD1610; GISEL-GFX9-NEXT: s_setpc_b64 s[30:31]1611;1612; GISEL-GFX11-TRUE16-LABEL: basic_smax_smin_vec_input:1613; GISEL-GFX11-TRUE16: ; %bb.0:1614; GISEL-GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1615; GISEL-GFX11-TRUE16-NEXT: v_pk_min_i16 v0, 0xff00ff, v01616; GISEL-GFX11-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)1617; GISEL-GFX11-TRUE16-NEXT: v_pk_max_i16 v1, 0, v01618; GISEL-GFX11-TRUE16-NEXT: v_and_b16 v0.l, 0xff, v1.h1619; GISEL-GFX11-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)1620; GISEL-GFX11-TRUE16-NEXT: v_and_b16 v0.h, 0xff, v1.l1621; GISEL-GFX11-TRUE16-NEXT: v_lshlrev_b16 v0.l, 8, v0.l1622; GISEL-GFX11-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1)1623; GISEL-GFX11-TRUE16-NEXT: v_or_b16 v0.l, v0.h, v0.l1624; GISEL-GFX11-TRUE16-NEXT: s_setpc_b64 s[30:31]1625;1626; GISEL-GFX11-FAKE16-LABEL: basic_smax_smin_vec_input:1627; GISEL-GFX11-FAKE16: ; %bb.0:1628; GISEL-GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1629; GISEL-GFX11-FAKE16-NEXT: v_pk_min_i16 v0, 0xff00ff, v01630; GISEL-GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)1631; GISEL-GFX11-FAKE16-NEXT: v_pk_max_i16 v0, 0, v01632; GISEL-GFX11-FAKE16-NEXT: v_lshrrev_b32_e32 v1, 16, v01633; GISEL-GFX11-FAKE16-NEXT: v_and_b32_e32 v0, 0xff, v01634; GISEL-GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)1635; GISEL-GFX11-FAKE16-NEXT: v_and_b32_e32 v1, 0xff, v11636; GISEL-GFX11-FAKE16-NEXT: v_lshlrev_b16 v1, 8, v11637; GISEL-GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1)1638; GISEL-GFX11-FAKE16-NEXT: v_or_b32_e32 v0, v0, v11639; GISEL-GFX11-FAKE16-NEXT: s_setpc_b64 s[30:31]1640;1641; GISEL-GFX12-TRUE16-LABEL: basic_smax_smin_vec_input:1642; GISEL-GFX12-TRUE16: ; %bb.0:1643; GISEL-GFX12-TRUE16-NEXT: s_wait_loadcnt_dscnt 0x01644; GISEL-GFX12-TRUE16-NEXT: s_wait_expcnt 0x01645; GISEL-GFX12-TRUE16-NEXT: s_wait_samplecnt 0x01646; GISEL-GFX12-TRUE16-NEXT: s_wait_bvhcnt 0x01647; GISEL-GFX12-TRUE16-NEXT: s_wait_kmcnt 0x01648; GISEL-GFX12-TRUE16-NEXT: v_pk_min_i16 v0, 0xff00ff, v01649; GISEL-GFX12-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)1650; GISEL-GFX12-TRUE16-NEXT: v_pk_max_i16 v1, 0, v01651; GISEL-GFX12-TRUE16-NEXT: v_and_b16 v0.l, 0xff, v1.h1652; GISEL-GFX12-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)1653; GISEL-GFX12-TRUE16-NEXT: v_and_b16 v0.h, 0xff, v1.l1654; GISEL-GFX12-TRUE16-NEXT: v_lshlrev_b16 v0.l, 8, v0.l1655; GISEL-GFX12-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1)1656; GISEL-GFX12-TRUE16-NEXT: v_or_b16 v0.l, v0.h, v0.l1657; GISEL-GFX12-TRUE16-NEXT: s_setpc_b64 s[30:31]1658;1659; GISEL-GFX12-FAKE16-LABEL: basic_smax_smin_vec_input:1660; GISEL-GFX12-FAKE16: ; %bb.0:1661; GISEL-GFX12-FAKE16-NEXT: s_wait_loadcnt_dscnt 0x01662; GISEL-GFX12-FAKE16-NEXT: s_wait_expcnt 0x01663; GISEL-GFX12-FAKE16-NEXT: s_wait_samplecnt 0x01664; GISEL-GFX12-FAKE16-NEXT: s_wait_bvhcnt 0x01665; GISEL-GFX12-FAKE16-NEXT: s_wait_kmcnt 0x01666; GISEL-GFX12-FAKE16-NEXT: v_pk_min_i16 v0, 0xff00ff, v01667; GISEL-GFX12-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)1668; GISEL-GFX12-FAKE16-NEXT: v_pk_max_i16 v0, 0, v01669; GISEL-GFX12-FAKE16-NEXT: v_lshrrev_b32_e32 v1, 16, v01670; GISEL-GFX12-FAKE16-NEXT: v_and_b32_e32 v0, 0xff, v01671; GISEL-GFX12-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)1672; GISEL-GFX12-FAKE16-NEXT: v_and_b32_e32 v1, 0xff, v11673; GISEL-GFX12-FAKE16-NEXT: v_lshlrev_b16 v1, 8, v11674; GISEL-GFX12-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1)1675; GISEL-GFX12-FAKE16-NEXT: v_or_b32_e32 v0, v0, v11676; GISEL-GFX12-FAKE16-NEXT: s_setpc_b64 s[30:31]1677 1678 %smin = call <2 x i16> @llvm.smin.v2i16(<2 x i16> <i16 255, i16 255>, <2 x i16> %src)1679 %smed = call <2 x i16> @llvm.smax.v2i16(<2 x i16> <i16 0, i16 0>, <2 x i16> %smin)1680 %vec.trunc = trunc <2 x i16> %smed to <2 x i8>1681 %cast = bitcast <2 x i8> %vec.trunc to i161682 ret i16 %cast1683}1684define i16 @basic_smax_smin_vec_input_rev(<2 x i16> %src) {1685; SDAG-VI-LABEL: basic_smax_smin_vec_input_rev:1686; SDAG-VI: ; %bb.0:1687; SDAG-VI-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1688; SDAG-VI-NEXT: v_mov_b32_e32 v1, 01689; SDAG-VI-NEXT: v_max_i16_sdwa v1, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD1690; SDAG-VI-NEXT: v_max_i16_e32 v0, 0, v01691; SDAG-VI-NEXT: v_mov_b32_e32 v2, 0xff1692; SDAG-VI-NEXT: v_min_i16_e32 v0, 0xff, v01693; SDAG-VI-NEXT: v_min_i16_sdwa v1, v1, v2 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD1694; SDAG-VI-NEXT: v_or_b32_e32 v0, v0, v11695; SDAG-VI-NEXT: s_setpc_b64 s[30:31]1696;1697; SDAG-GFX9-LABEL: basic_smax_smin_vec_input_rev:1698; SDAG-GFX9: ; %bb.0:1699; SDAG-GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1700; SDAG-GFX9-NEXT: v_pk_max_i16 v0, v0, 01701; SDAG-GFX9-NEXT: s_movk_i32 s4, 0xff1702; SDAG-GFX9-NEXT: v_pk_min_i16 v0, v0, s4 op_sel_hi:[1,0]1703; SDAG-GFX9-NEXT: v_lshrrev_b32_e32 v1, 16, v01704; SDAG-GFX9-NEXT: v_lshlrev_b16_e32 v1, 8, v11705; SDAG-GFX9-NEXT: v_or_b32_e32 v0, v0, v11706; SDAG-GFX9-NEXT: s_setpc_b64 s[30:31]1707;1708; SDAG-GFX11-TRUE16-LABEL: basic_smax_smin_vec_input_rev:1709; SDAG-GFX11-TRUE16: ; %bb.0:1710; SDAG-GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1711; SDAG-GFX11-TRUE16-NEXT: v_pk_max_i16 v0, v0, 01712; SDAG-GFX11-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)1713; SDAG-GFX11-TRUE16-NEXT: v_pk_min_i16 v1, 0xff, v0 op_sel_hi:[0,1]1714; SDAG-GFX11-TRUE16-NEXT: v_lshlrev_b16 v0.l, 8, v1.h1715; SDAG-GFX11-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1)1716; SDAG-GFX11-TRUE16-NEXT: v_or_b16 v0.l, v1.l, v0.l1717; SDAG-GFX11-TRUE16-NEXT: s_setpc_b64 s[30:31]1718;1719; SDAG-GFX11-FAKE16-LABEL: basic_smax_smin_vec_input_rev:1720; SDAG-GFX11-FAKE16: ; %bb.0:1721; SDAG-GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1722; SDAG-GFX11-FAKE16-NEXT: v_pk_max_i16 v0, v0, 01723; SDAG-GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)1724; SDAG-GFX11-FAKE16-NEXT: v_pk_min_i16 v0, 0xff, v0 op_sel_hi:[0,1]1725; SDAG-GFX11-FAKE16-NEXT: v_lshrrev_b32_e32 v1, 16, v01726; SDAG-GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)1727; SDAG-GFX11-FAKE16-NEXT: v_lshlrev_b16 v1, 8, v11728; SDAG-GFX11-FAKE16-NEXT: v_or_b32_e32 v0, v0, v11729; SDAG-GFX11-FAKE16-NEXT: s_setpc_b64 s[30:31]1730;1731; SDAG-GFX12-TRUE16-LABEL: basic_smax_smin_vec_input_rev:1732; SDAG-GFX12-TRUE16: ; %bb.0:1733; SDAG-GFX12-TRUE16-NEXT: s_wait_loadcnt_dscnt 0x01734; SDAG-GFX12-TRUE16-NEXT: s_wait_expcnt 0x01735; SDAG-GFX12-TRUE16-NEXT: s_wait_samplecnt 0x01736; SDAG-GFX12-TRUE16-NEXT: s_wait_bvhcnt 0x01737; SDAG-GFX12-TRUE16-NEXT: s_wait_kmcnt 0x01738; SDAG-GFX12-TRUE16-NEXT: v_pk_max_i16 v0, v0, 01739; SDAG-GFX12-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)1740; SDAG-GFX12-TRUE16-NEXT: v_pk_min_i16 v1, 0xff, v0 op_sel_hi:[0,1]1741; SDAG-GFX12-TRUE16-NEXT: v_lshlrev_b16 v0.l, 8, v1.h1742; SDAG-GFX12-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1)1743; SDAG-GFX12-TRUE16-NEXT: v_or_b16 v0.l, v1.l, v0.l1744; SDAG-GFX12-TRUE16-NEXT: s_setpc_b64 s[30:31]1745;1746; SDAG-GFX12-FAKE16-LABEL: basic_smax_smin_vec_input_rev:1747; SDAG-GFX12-FAKE16: ; %bb.0:1748; SDAG-GFX12-FAKE16-NEXT: s_wait_loadcnt_dscnt 0x01749; SDAG-GFX12-FAKE16-NEXT: s_wait_expcnt 0x01750; SDAG-GFX12-FAKE16-NEXT: s_wait_samplecnt 0x01751; SDAG-GFX12-FAKE16-NEXT: s_wait_bvhcnt 0x01752; SDAG-GFX12-FAKE16-NEXT: s_wait_kmcnt 0x01753; SDAG-GFX12-FAKE16-NEXT: v_pk_max_i16 v0, v0, 01754; SDAG-GFX12-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)1755; SDAG-GFX12-FAKE16-NEXT: v_pk_min_i16 v0, 0xff, v0 op_sel_hi:[0,1]1756; SDAG-GFX12-FAKE16-NEXT: v_lshrrev_b32_e32 v1, 16, v01757; SDAG-GFX12-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)1758; SDAG-GFX12-FAKE16-NEXT: v_lshlrev_b16 v1, 8, v11759; SDAG-GFX12-FAKE16-NEXT: v_or_b32_e32 v0, v0, v11760; SDAG-GFX12-FAKE16-NEXT: s_setpc_b64 s[30:31]1761;1762; GISEL-VI-LABEL: basic_smax_smin_vec_input_rev:1763; GISEL-VI: ; %bb.0:1764; GISEL-VI-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1765; GISEL-VI-NEXT: v_mov_b32_e32 v2, 01766; GISEL-VI-NEXT: v_max_i16_e32 v1, 0, v01767; GISEL-VI-NEXT: v_max_i16_sdwa v0, v0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD1768; GISEL-VI-NEXT: v_mov_b32_e32 v2, 0xff1769; GISEL-VI-NEXT: v_min_i16_e32 v1, 0xff, v11770; GISEL-VI-NEXT: v_min_i16_sdwa v0, v0, v2 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD1771; GISEL-VI-NEXT: v_or_b32_e32 v0, v1, v01772; GISEL-VI-NEXT: s_setpc_b64 s[30:31]1773;1774; GISEL-GFX9-LABEL: basic_smax_smin_vec_input_rev:1775; GISEL-GFX9: ; %bb.0:1776; GISEL-GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1777; GISEL-GFX9-NEXT: v_pk_max_i16 v0, 0, v01778; GISEL-GFX9-NEXT: v_mov_b32_e32 v1, 0xff00ff1779; GISEL-GFX9-NEXT: v_pk_min_i16 v0, v1, v01780; GISEL-GFX9-NEXT: v_mov_b32_e32 v1, 0xff1781; GISEL-GFX9-NEXT: v_and_b32_sdwa v1, v0, v1 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD1782; GISEL-GFX9-NEXT: v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD1783; GISEL-GFX9-NEXT: s_setpc_b64 s[30:31]1784;1785; GISEL-GFX11-TRUE16-LABEL: basic_smax_smin_vec_input_rev:1786; GISEL-GFX11-TRUE16: ; %bb.0:1787; GISEL-GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1788; GISEL-GFX11-TRUE16-NEXT: v_pk_max_i16 v0, 0, v01789; GISEL-GFX11-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)1790; GISEL-GFX11-TRUE16-NEXT: v_pk_min_i16 v1, 0xff00ff, v01791; GISEL-GFX11-TRUE16-NEXT: v_lshlrev_b16 v0.l, 8, v1.h1792; GISEL-GFX11-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1)1793; GISEL-GFX11-TRUE16-NEXT: v_or_b16 v0.l, v1.l, v0.l1794; GISEL-GFX11-TRUE16-NEXT: s_setpc_b64 s[30:31]1795;1796; GISEL-GFX11-FAKE16-LABEL: basic_smax_smin_vec_input_rev:1797; GISEL-GFX11-FAKE16: ; %bb.0:1798; GISEL-GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1799; GISEL-GFX11-FAKE16-NEXT: v_pk_max_i16 v0, 0, v01800; GISEL-GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)1801; GISEL-GFX11-FAKE16-NEXT: v_pk_min_i16 v0, 0xff00ff, v01802; GISEL-GFX11-FAKE16-NEXT: v_lshrrev_b32_e32 v1, 16, v01803; GISEL-GFX11-FAKE16-NEXT: v_and_b32_e32 v0, 0xff, v01804; GISEL-GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)1805; GISEL-GFX11-FAKE16-NEXT: v_and_b32_e32 v1, 0xff, v11806; GISEL-GFX11-FAKE16-NEXT: v_lshlrev_b16 v1, 8, v11807; GISEL-GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1)1808; GISEL-GFX11-FAKE16-NEXT: v_or_b32_e32 v0, v0, v11809; GISEL-GFX11-FAKE16-NEXT: s_setpc_b64 s[30:31]1810;1811; GISEL-GFX12-TRUE16-LABEL: basic_smax_smin_vec_input_rev:1812; GISEL-GFX12-TRUE16: ; %bb.0:1813; GISEL-GFX12-TRUE16-NEXT: s_wait_loadcnt_dscnt 0x01814; GISEL-GFX12-TRUE16-NEXT: s_wait_expcnt 0x01815; GISEL-GFX12-TRUE16-NEXT: s_wait_samplecnt 0x01816; GISEL-GFX12-TRUE16-NEXT: s_wait_bvhcnt 0x01817; GISEL-GFX12-TRUE16-NEXT: s_wait_kmcnt 0x01818; GISEL-GFX12-TRUE16-NEXT: v_pk_max_i16 v0, 0, v01819; GISEL-GFX12-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)1820; GISEL-GFX12-TRUE16-NEXT: v_pk_min_i16 v1, 0xff00ff, v01821; GISEL-GFX12-TRUE16-NEXT: v_lshlrev_b16 v0.l, 8, v1.h1822; GISEL-GFX12-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1)1823; GISEL-GFX12-TRUE16-NEXT: v_or_b16 v0.l, v1.l, v0.l1824; GISEL-GFX12-TRUE16-NEXT: s_setpc_b64 s[30:31]1825;1826; GISEL-GFX12-FAKE16-LABEL: basic_smax_smin_vec_input_rev:1827; GISEL-GFX12-FAKE16: ; %bb.0:1828; GISEL-GFX12-FAKE16-NEXT: s_wait_loadcnt_dscnt 0x01829; GISEL-GFX12-FAKE16-NEXT: s_wait_expcnt 0x01830; GISEL-GFX12-FAKE16-NEXT: s_wait_samplecnt 0x01831; GISEL-GFX12-FAKE16-NEXT: s_wait_bvhcnt 0x01832; GISEL-GFX12-FAKE16-NEXT: s_wait_kmcnt 0x01833; GISEL-GFX12-FAKE16-NEXT: v_pk_max_i16 v0, 0, v01834; GISEL-GFX12-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)1835; GISEL-GFX12-FAKE16-NEXT: v_pk_min_i16 v0, 0xff00ff, v01836; GISEL-GFX12-FAKE16-NEXT: v_lshrrev_b32_e32 v1, 16, v01837; GISEL-GFX12-FAKE16-NEXT: v_and_b32_e32 v0, 0xff, v01838; GISEL-GFX12-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)1839; GISEL-GFX12-FAKE16-NEXT: v_and_b32_e32 v1, 0xff, v11840; GISEL-GFX12-FAKE16-NEXT: v_lshlrev_b16 v1, 8, v11841; GISEL-GFX12-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1)1842; GISEL-GFX12-FAKE16-NEXT: v_or_b32_e32 v0, v0, v11843; GISEL-GFX12-FAKE16-NEXT: s_setpc_b64 s[30:31]1844 1845 %smax = call <2 x i16> @llvm.smax.v2i16(<2 x i16> <i16 0, i16 0>, <2 x i16> %src)1846 %smed = call <2 x i16> @llvm.smin.v2i16(<2 x i16> <i16 255, i16 255>, <2 x i16> %smax)1847 %vec.trunc = trunc <2 x i16> %smed to <2 x i8>1848 %cast = bitcast <2 x i8> %vec.trunc to i161849 ret i16 %cast1850}1851 1852;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:1853; GFX11: {{.*}}1854