208 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=amdgcn -mcpu=gfx1200 -mattr=+real-true16 < %s | FileCheck -check-prefixes=GFX12,SDAG,SDAG-TRUE16 %s3; RUN: llc -mtriple=amdgcn -mcpu=gfx1200 -mattr=-real-true16 < %s | FileCheck -check-prefixes=GFX12,SDAG,SDAG-FAKE16 %s4; RUN: llc -global-isel -mtriple=amdgcn -mcpu=gfx1200 -mattr=+real-true16 < %s | FileCheck -check-prefixes=GFX12,GISEL,GISEL-TRUE16 %s5; RUN: llc -global-isel -mtriple=amdgcn -mcpu=gfx1200 -mattr=-real-true16 < %s | FileCheck -check-prefixes=GFX12,GISEL,GISEL-FAKE16 %s6 7define amdgpu_ps float @test_minmax_f32(float %a, float %b, float %c) {8; GFX12-LABEL: test_minmax_f32:9; GFX12: ; %bb.0:10; GFX12-NEXT: v_maximumminimum_f32 v0, v0, v1, v211; GFX12-NEXT: ; return to shader part epilog12 %max = call float @llvm.maximum.f32(float %a, float %b)13 %minmax = call float @llvm.minimum.f32(float %max, float %c)14 ret float %minmax15}16 17define amdgpu_ps void @s_test_minmax_f32(float inreg %a, float inreg %b, float inreg %c, ptr addrspace(1) inreg %out) {18; SDAG-LABEL: s_test_minmax_f32:19; SDAG: ; %bb.0:20; SDAG-NEXT: s_maximum_f32 s0, s0, s121; SDAG-NEXT: s_mov_b32 s5, s422; SDAG-NEXT: s_mov_b32 s4, s323; SDAG-NEXT: s_delay_alu instid0(SALU_CYCLE_1) | instskip(NEXT) | instid1(SALU_CYCLE_3)24; SDAG-NEXT: s_minimum_f32 s0, s0, s225; SDAG-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s026; SDAG-NEXT: global_store_b32 v0, v1, s[4:5]27; SDAG-NEXT: s_endpgm28;29; GISEL-LABEL: s_test_minmax_f32:30; GISEL: ; %bb.0:31; GISEL-NEXT: s_maximum_f32 s0, s0, s132; GISEL-NEXT: s_mov_b32 s6, s333; GISEL-NEXT: s_mov_b32 s7, s434; GISEL-NEXT: v_mov_b32_e32 v1, 035; GISEL-NEXT: s_minimum_f32 s0, s0, s236; GISEL-NEXT: s_delay_alu instid0(SALU_CYCLE_3)37; GISEL-NEXT: v_mov_b32_e32 v0, s038; GISEL-NEXT: global_store_b32 v1, v0, s[6:7]39; GISEL-NEXT: s_endpgm40 %smax = call float @llvm.maximum.f32(float %a, float %b)41 %sminmax = call float @llvm.minimum.f32(float %smax, float %c)42 store float %sminmax, ptr addrspace(1) %out43 ret void44}45 46define amdgpu_ps float @test_minmax_commuted_f32(float %a, float %b, float %c) {47; GFX12-LABEL: test_minmax_commuted_f32:48; GFX12: ; %bb.0:49; GFX12-NEXT: v_maximumminimum_f32 v0, v0, v1, v250; GFX12-NEXT: ; return to shader part epilog51 %max = call float @llvm.maximum.f32(float %a, float %b)52 %minmax = call float @llvm.minimum.f32(float %c, float %max)53 ret float %minmax54}55 56define amdgpu_ps float @test_maxmin_f32(float %a, float %b, float %c) {57; GFX12-LABEL: test_maxmin_f32:58; GFX12: ; %bb.0:59; GFX12-NEXT: v_minimummaximum_f32 v0, v0, v1, v260; GFX12-NEXT: ; return to shader part epilog61 %min = call float @llvm.minimum.f32(float %a, float %b)62 %maxmin = call float @llvm.maximum.f32(float %min, float %c)63 ret float %maxmin64}65 66define amdgpu_ps float @test_maxmin_commuted_f32(float %a, float %b, float %c) {67; GFX12-LABEL: test_maxmin_commuted_f32:68; GFX12: ; %bb.0:69; GFX12-NEXT: v_minimummaximum_f32 v0, v0, v1, v270; GFX12-NEXT: ; return to shader part epilog71 %min = call float @llvm.minimum.f32(float %a, float %b)72 %maxmin = call float @llvm.maximum.f32(float %c, float %min)73 ret float %maxmin74}75 76define amdgpu_ps half @test_minmax_f16(half %a, half %b, half %c) {77; SDAG-TRUE16-LABEL: test_minmax_f16:78; SDAG-TRUE16: ; %bb.0:79; SDAG-TRUE16-NEXT: v_maximumminimum_f16 v0.l, v0.l, v1.l, v2.l80; SDAG-TRUE16-NEXT: ; return to shader part epilog81;82; SDAG-FAKE16-LABEL: test_minmax_f16:83; SDAG-FAKE16: ; %bb.0:84; SDAG-FAKE16-NEXT: v_maximumminimum_f16 v0, v0, v1, v285; SDAG-FAKE16-NEXT: ; return to shader part epilog86;87; GISEL-TRUE16-LABEL: test_minmax_f16:88; GISEL-TRUE16: ; %bb.0:89; GISEL-TRUE16-NEXT: v_maximumminimum_f16 v0.l, v0.l, v1.l, v2.l90; GISEL-TRUE16-NEXT: ; return to shader part epilog91;92; GISEL-FAKE16-LABEL: test_minmax_f16:93; GISEL-FAKE16: ; %bb.0:94; GISEL-FAKE16-NEXT: v_maximumminimum_f16 v0, v0, v1, v295; GISEL-FAKE16-NEXT: ; return to shader part epilog96 %max = call half @llvm.maximum.f16(half %a, half %b)97 %minmax = call half @llvm.minimum.f16(half %max, half %c)98 ret half %minmax99}100 101define amdgpu_ps half @test_minmax_commuted_f16(half %a, half %b, half %c) {102; SDAG-TRUE16-LABEL: test_minmax_commuted_f16:103; SDAG-TRUE16: ; %bb.0:104; SDAG-TRUE16-NEXT: v_maximumminimum_f16 v0.l, v0.l, v1.l, v2.l105; SDAG-TRUE16-NEXT: ; return to shader part epilog106;107; SDAG-FAKE16-LABEL: test_minmax_commuted_f16:108; SDAG-FAKE16: ; %bb.0:109; SDAG-FAKE16-NEXT: v_maximumminimum_f16 v0, v0, v1, v2110; SDAG-FAKE16-NEXT: ; return to shader part epilog111;112; GISEL-TRUE16-LABEL: test_minmax_commuted_f16:113; GISEL-TRUE16: ; %bb.0:114; GISEL-TRUE16-NEXT: v_maximumminimum_f16 v0.l, v0.l, v1.l, v2.l115; GISEL-TRUE16-NEXT: ; return to shader part epilog116;117; GISEL-FAKE16-LABEL: test_minmax_commuted_f16:118; GISEL-FAKE16: ; %bb.0:119; GISEL-FAKE16-NEXT: v_maximumminimum_f16 v0, v0, v1, v2120; GISEL-FAKE16-NEXT: ; return to shader part epilog121 %max = call half @llvm.maximum.f16(half %a, half %b)122 %minmax = call half @llvm.minimum.f16(half %c, half %max)123 ret half %minmax124}125 126define amdgpu_ps half @test_maxmin_commuted_f16(half %a, half %b, half %c) {127; SDAG-TRUE16-LABEL: test_maxmin_commuted_f16:128; SDAG-TRUE16: ; %bb.0:129; SDAG-TRUE16-NEXT: v_minimummaximum_f16 v0.l, v0.l, v1.l, v2.l130; SDAG-TRUE16-NEXT: ; return to shader part epilog131;132; SDAG-FAKE16-LABEL: test_maxmin_commuted_f16:133; SDAG-FAKE16: ; %bb.0:134; SDAG-FAKE16-NEXT: v_minimummaximum_f16 v0, v0, v1, v2135; SDAG-FAKE16-NEXT: ; return to shader part epilog136;137; GISEL-TRUE16-LABEL: test_maxmin_commuted_f16:138; GISEL-TRUE16: ; %bb.0:139; GISEL-TRUE16-NEXT: v_minimummaximum_f16 v0.l, v0.l, v1.l, v2.l140; GISEL-TRUE16-NEXT: ; return to shader part epilog141;142; GISEL-FAKE16-LABEL: test_maxmin_commuted_f16:143; GISEL-FAKE16: ; %bb.0:144; GISEL-FAKE16-NEXT: v_minimummaximum_f16 v0, v0, v1, v2145; GISEL-FAKE16-NEXT: ; return to shader part epilog146 %min = call half @llvm.minimum.f16(half %a, half %b)147 %maxmin = call half @llvm.maximum.f16(half %c, half %min)148 ret half %maxmin149}150 151define amdgpu_ps void @s_test_minmax_f16(half inreg %a, half inreg %b, half inreg %c, ptr addrspace(1) inreg %out) {152; SDAG-TRUE16-LABEL: s_test_minmax_f16:153; SDAG-TRUE16: ; %bb.0:154; SDAG-TRUE16-NEXT: s_maximum_f16 s0, s0, s1155; SDAG-TRUE16-NEXT: v_mov_b32_e32 v1, 0156; SDAG-TRUE16-NEXT: s_mov_b32 s5, s4157; SDAG-TRUE16-NEXT: s_mov_b32 s4, s3158; SDAG-TRUE16-NEXT: s_minimum_f16 s0, s0, s2159; SDAG-TRUE16-NEXT: s_delay_alu instid0(SALU_CYCLE_3)160; SDAG-TRUE16-NEXT: v_mov_b16_e32 v0.l, s0161; SDAG-TRUE16-NEXT: global_store_b16 v1, v0, s[4:5]162; SDAG-TRUE16-NEXT: s_endpgm163;164; SDAG-FAKE16-LABEL: s_test_minmax_f16:165; SDAG-FAKE16: ; %bb.0:166; SDAG-FAKE16-NEXT: s_maximum_f16 s0, s0, s1167; SDAG-FAKE16-NEXT: s_mov_b32 s5, s4168; SDAG-FAKE16-NEXT: s_mov_b32 s4, s3169; SDAG-FAKE16-NEXT: s_delay_alu instid0(SALU_CYCLE_1) | instskip(NEXT) | instid1(SALU_CYCLE_3)170; SDAG-FAKE16-NEXT: s_minimum_f16 s0, s0, s2171; SDAG-FAKE16-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s0172; SDAG-FAKE16-NEXT: global_store_b16 v0, v1, s[4:5]173; SDAG-FAKE16-NEXT: s_endpgm174;175; GISEL-TRUE16-LABEL: s_test_minmax_f16:176; GISEL-TRUE16: ; %bb.0:177; GISEL-TRUE16-NEXT: s_maximum_f16 s0, s0, s1178; GISEL-TRUE16-NEXT: v_mov_b32_e32 v1, 0179; GISEL-TRUE16-NEXT: s_mov_b32 s6, s3180; GISEL-TRUE16-NEXT: s_mov_b32 s7, s4181; GISEL-TRUE16-NEXT: s_minimum_f16 s0, s0, s2182; GISEL-TRUE16-NEXT: s_delay_alu instid0(SALU_CYCLE_3)183; GISEL-TRUE16-NEXT: v_mov_b16_e32 v0.l, s0184; GISEL-TRUE16-NEXT: global_store_b16 v1, v0, s[6:7]185; GISEL-TRUE16-NEXT: s_endpgm186;187; GISEL-FAKE16-LABEL: s_test_minmax_f16:188; GISEL-FAKE16: ; %bb.0:189; GISEL-FAKE16-NEXT: s_maximum_f16 s0, s0, s1190; GISEL-FAKE16-NEXT: s_mov_b32 s6, s3191; GISEL-FAKE16-NEXT: s_mov_b32 s7, s4192; GISEL-FAKE16-NEXT: v_mov_b32_e32 v1, 0193; GISEL-FAKE16-NEXT: s_minimum_f16 s0, s0, s2194; GISEL-FAKE16-NEXT: s_delay_alu instid0(SALU_CYCLE_3)195; GISEL-FAKE16-NEXT: v_mov_b32_e32 v0, s0196; GISEL-FAKE16-NEXT: global_store_b16 v1, v0, s[6:7]197; GISEL-FAKE16-NEXT: s_endpgm198 %smax = call half @llvm.maximum.f16(half %a, half %b)199 %sminmax = call half @llvm.minimum.f16(half %smax, half %c)200 store half %sminmax, ptr addrspace(1) %out201 ret void202}203 204declare half @llvm.minimum.f16(half, half)205declare half @llvm.maximum.f16(half, half)206declare float @llvm.minimum.f32(float, float)207declare float @llvm.maximum.f32(float, float)208