347 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 22; RUN: llc -mtriple=amdgcn -mcpu=tahiti < %s | FileCheck -enable-var-scope -check-prefixes=SI %s3; RUN: llc -mtriple=amdgcn -mcpu=fiji -mattr=-flat-for-global < %s | FileCheck -enable-var-scope -check-prefixes=VI %s4; RUN: llc -mtriple=amdgcn -mcpu=gfx1100 -mattr=+real-true16 -mattr=-flat-for-global < %s | FileCheck -enable-var-scope -check-prefixes=GFX11-TRUE16 %s5; RUN: llc -mtriple=amdgcn -mcpu=gfx1100 -mattr=-real-true16 -mattr=-flat-for-global < %s | FileCheck -enable-var-scope -check-prefixes=GFX11-FAKE16 %s6 7define amdgpu_kernel void @br_cc_f16(8; SI-LABEL: br_cc_f16:9; SI: ; %bb.0: ; %entry10; SI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x911; SI-NEXT: s_load_dwordx2 s[8:9], s[4:5], 0xd12; SI-NEXT: s_mov_b32 s7, 0xf00013; SI-NEXT: s_mov_b32 s6, -114; SI-NEXT: s_mov_b32 s10, s615; SI-NEXT: s_waitcnt lgkmcnt(0)16; SI-NEXT: s_mov_b32 s4, s217; SI-NEXT: s_mov_b32 s5, s318; SI-NEXT: s_mov_b32 s11, s719; SI-NEXT: buffer_load_ushort v0, off, s[4:7], 0 glc20; SI-NEXT: s_waitcnt vmcnt(0)21; SI-NEXT: buffer_load_ushort v1, off, s[8:11], 0 glc22; SI-NEXT: s_waitcnt vmcnt(0)23; SI-NEXT: v_cvt_f32_f16_e32 v0, v024; SI-NEXT: v_cvt_f32_f16_e32 v1, v125; SI-NEXT: v_cmp_nlt_f32_e32 vcc, v0, v126; SI-NEXT: s_cbranch_vccnz .LBB0_227; SI-NEXT: ; %bb.1: ; %one28; SI-NEXT: v_cvt_f16_f32_e32 v0, v029; SI-NEXT: s_branch .LBB0_330; SI-NEXT: .LBB0_2: ; %two31; SI-NEXT: v_cvt_f16_f32_e32 v0, v132; SI-NEXT: .LBB0_3: ; %one33; SI-NEXT: s_mov_b32 s2, s634; SI-NEXT: s_mov_b32 s3, s735; SI-NEXT: buffer_store_short v0, off, s[0:3], 036; SI-NEXT: s_endpgm37;38; VI-LABEL: br_cc_f16:39; VI: ; %bb.0: ; %entry40; VI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x2441; VI-NEXT: s_load_dwordx2 s[8:9], s[4:5], 0x3442; VI-NEXT: s_mov_b32 s7, 0xf00043; VI-NEXT: s_mov_b32 s6, -144; VI-NEXT: s_mov_b32 s10, s645; VI-NEXT: s_waitcnt lgkmcnt(0)46; VI-NEXT: s_mov_b32 s4, s247; VI-NEXT: s_mov_b32 s5, s348; VI-NEXT: s_mov_b32 s11, s749; VI-NEXT: buffer_load_ushort v0, off, s[4:7], 0 glc50; VI-NEXT: s_waitcnt vmcnt(0)51; VI-NEXT: buffer_load_ushort v1, off, s[8:11], 0 glc52; VI-NEXT: s_waitcnt vmcnt(0)53; VI-NEXT: s_mov_b32 s2, s654; VI-NEXT: s_mov_b32 s3, s755; VI-NEXT: v_cmp_nlt_f16_e32 vcc, v0, v156; VI-NEXT: s_cbranch_vccnz .LBB0_257; VI-NEXT: ; %bb.1: ; %one58; VI-NEXT: buffer_store_short v0, off, s[0:3], 059; VI-NEXT: s_endpgm60; VI-NEXT: .LBB0_2: ; %two61; VI-NEXT: buffer_store_short v1, off, s[0:3], 062; VI-NEXT: s_endpgm63;64; GFX11-TRUE16-LABEL: br_cc_f16:65; GFX11-TRUE16: ; %bb.0: ; %entry66; GFX11-TRUE16-NEXT: s_clause 0x167; GFX11-TRUE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x2468; GFX11-TRUE16-NEXT: s_load_b64 s[8:9], s[4:5], 0x3469; GFX11-TRUE16-NEXT: s_mov_b32 s6, -170; GFX11-TRUE16-NEXT: s_mov_b32 s7, 0x3101600071; GFX11-TRUE16-NEXT: s_mov_b32 s10, s672; GFX11-TRUE16-NEXT: s_mov_b32 s11, s773; GFX11-TRUE16-NEXT: s_waitcnt lgkmcnt(0)74; GFX11-TRUE16-NEXT: s_mov_b32 s4, s275; GFX11-TRUE16-NEXT: s_mov_b32 s5, s376; GFX11-TRUE16-NEXT: buffer_load_u16 v0, off, s[4:7], 0 glc dlc77; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)78; GFX11-TRUE16-NEXT: buffer_load_u16 v1, off, s[8:11], 0 glc dlc79; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)80; GFX11-TRUE16-NEXT: s_mov_b32 s2, s681; GFX11-TRUE16-NEXT: s_mov_b32 s3, s782; GFX11-TRUE16-NEXT: v_mov_b16_e32 v2.l, v0.l83; GFX11-TRUE16-NEXT: v_mov_b16_e32 v2.h, v1.l84; GFX11-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1)85; GFX11-TRUE16-NEXT: v_cmp_nlt_f16_e32 vcc_lo, v2.l, v2.h86; GFX11-TRUE16-NEXT: s_cbranch_vccnz .LBB0_287; GFX11-TRUE16-NEXT: ; %bb.1: ; %one88; GFX11-TRUE16-NEXT: buffer_store_b16 v0, off, s[0:3], 089; GFX11-TRUE16-NEXT: s_endpgm90; GFX11-TRUE16-NEXT: .LBB0_2: ; %two91; GFX11-TRUE16-NEXT: buffer_store_b16 v1, off, s[0:3], 092; GFX11-TRUE16-NEXT: s_endpgm93;94; GFX11-FAKE16-LABEL: br_cc_f16:95; GFX11-FAKE16: ; %bb.0: ; %entry96; GFX11-FAKE16-NEXT: s_clause 0x197; GFX11-FAKE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x2498; GFX11-FAKE16-NEXT: s_load_b64 s[8:9], s[4:5], 0x3499; GFX11-FAKE16-NEXT: s_mov_b32 s6, -1100; GFX11-FAKE16-NEXT: s_mov_b32 s7, 0x31016000101; GFX11-FAKE16-NEXT: s_mov_b32 s10, s6102; GFX11-FAKE16-NEXT: s_mov_b32 s11, s7103; GFX11-FAKE16-NEXT: s_waitcnt lgkmcnt(0)104; GFX11-FAKE16-NEXT: s_mov_b32 s4, s2105; GFX11-FAKE16-NEXT: s_mov_b32 s5, s3106; GFX11-FAKE16-NEXT: buffer_load_u16 v0, off, s[4:7], 0 glc dlc107; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)108; GFX11-FAKE16-NEXT: buffer_load_u16 v1, off, s[8:11], 0 glc dlc109; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)110; GFX11-FAKE16-NEXT: s_mov_b32 s2, s6111; GFX11-FAKE16-NEXT: s_mov_b32 s3, s7112; GFX11-FAKE16-NEXT: v_cmp_nlt_f16_e32 vcc_lo, v0, v1113; GFX11-FAKE16-NEXT: s_cbranch_vccnz .LBB0_2114; GFX11-FAKE16-NEXT: ; %bb.1: ; %one115; GFX11-FAKE16-NEXT: buffer_store_b16 v0, off, s[0:3], 0116; GFX11-FAKE16-NEXT: s_endpgm117; GFX11-FAKE16-NEXT: .LBB0_2: ; %two118; GFX11-FAKE16-NEXT: buffer_store_b16 v1, off, s[0:3], 0119; GFX11-FAKE16-NEXT: s_endpgm120 ptr addrspace(1) %r,121 ptr addrspace(1) %a,122 ptr addrspace(1) %b) {123entry:124 %a.val = load volatile half, ptr addrspace(1) %a125 %b.val = load volatile half, ptr addrspace(1) %b126 %fcmp = fcmp olt half %a.val, %b.val127 br i1 %fcmp, label %one, label %two128 129one:130 store half %a.val, ptr addrspace(1) %r131 ret void132 133two:134 store half %b.val, ptr addrspace(1) %r135 ret void136}137 138define amdgpu_kernel void @br_cc_f16_imm_a(139; SI-LABEL: br_cc_f16_imm_a:140; SI: ; %bb.0: ; %entry141; SI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9142; SI-NEXT: s_mov_b32 s7, 0xf000143; SI-NEXT: s_mov_b32 s6, -1144; SI-NEXT: s_waitcnt lgkmcnt(0)145; SI-NEXT: s_mov_b32 s4, s2146; SI-NEXT: s_mov_b32 s5, s3147; SI-NEXT: buffer_load_ushort v0, off, s[4:7], 0148; SI-NEXT: s_waitcnt vmcnt(0)149; SI-NEXT: v_cvt_f32_f16_e32 v0, v0150; SI-NEXT: v_cmp_nlt_f32_e32 vcc, 0.5, v0151; SI-NEXT: s_cbranch_vccnz .LBB1_2152; SI-NEXT: ; %bb.1: ; %one153; SI-NEXT: s_mov_b32 s2, s6154; SI-NEXT: s_mov_b32 s3, s7155; SI-NEXT: v_mov_b32_e32 v0, 0x3800156; SI-NEXT: buffer_store_short v0, off, s[0:3], 0157; SI-NEXT: s_endpgm158; SI-NEXT: .LBB1_2: ; %two159; SI-NEXT: v_cvt_f16_f32_e32 v0, v0160; SI-NEXT: s_mov_b32 s2, s6161; SI-NEXT: s_mov_b32 s3, s7162; SI-NEXT: buffer_store_short v0, off, s[0:3], 0163; SI-NEXT: s_endpgm164;165; VI-LABEL: br_cc_f16_imm_a:166; VI: ; %bb.0: ; %entry167; VI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24168; VI-NEXT: s_mov_b32 s7, 0xf000169; VI-NEXT: s_mov_b32 s6, -1170; VI-NEXT: s_waitcnt lgkmcnt(0)171; VI-NEXT: s_mov_b32 s4, s2172; VI-NEXT: s_mov_b32 s5, s3173; VI-NEXT: buffer_load_ushort v0, off, s[4:7], 0174; VI-NEXT: s_mov_b32 s2, s6175; VI-NEXT: s_mov_b32 s3, s7176; VI-NEXT: s_waitcnt vmcnt(0)177; VI-NEXT: v_cmp_nlt_f16_e32 vcc, 0.5, v0178; VI-NEXT: s_cbranch_vccnz .LBB1_2179; VI-NEXT: ; %bb.1: ; %one180; VI-NEXT: v_mov_b32_e32 v0, 0x3800181; VI-NEXT: .LBB1_2: ; %two182; VI-NEXT: buffer_store_short v0, off, s[0:3], 0183; VI-NEXT: s_endpgm184;185; GFX11-TRUE16-LABEL: br_cc_f16_imm_a:186; GFX11-TRUE16: ; %bb.0: ; %entry187; GFX11-TRUE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x24188; GFX11-TRUE16-NEXT: s_mov_b32 s7, 0x31016000189; GFX11-TRUE16-NEXT: s_mov_b32 s6, -1190; GFX11-TRUE16-NEXT: s_waitcnt lgkmcnt(0)191; GFX11-TRUE16-NEXT: s_mov_b32 s4, s2192; GFX11-TRUE16-NEXT: s_mov_b32 s5, s3193; GFX11-TRUE16-NEXT: buffer_load_u16 v0, off, s[4:7], 0194; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)195; GFX11-TRUE16-NEXT: v_mov_b16_e32 v1.l, v0.l196; GFX11-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1)197; GFX11-TRUE16-NEXT: v_cmp_nlt_f16_e32 vcc_lo, 0.5, v1.l198; GFX11-TRUE16-NEXT: s_cbranch_vccnz .LBB1_2199; GFX11-TRUE16-NEXT: ; %bb.1: ; %one200; GFX11-TRUE16-NEXT: v_mov_b16_e32 v0.l, 0x3800201; GFX11-TRUE16-NEXT: .LBB1_2: ; %two202; GFX11-TRUE16-NEXT: s_mov_b32 s2, s6203; GFX11-TRUE16-NEXT: s_mov_b32 s3, s7204; GFX11-TRUE16-NEXT: buffer_store_b16 v0, off, s[0:3], 0205; GFX11-TRUE16-NEXT: s_endpgm206;207; GFX11-FAKE16-LABEL: br_cc_f16_imm_a:208; GFX11-FAKE16: ; %bb.0: ; %entry209; GFX11-FAKE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x24210; GFX11-FAKE16-NEXT: s_mov_b32 s7, 0x31016000211; GFX11-FAKE16-NEXT: s_mov_b32 s6, -1212; GFX11-FAKE16-NEXT: s_waitcnt lgkmcnt(0)213; GFX11-FAKE16-NEXT: s_mov_b32 s4, s2214; GFX11-FAKE16-NEXT: s_mov_b32 s5, s3215; GFX11-FAKE16-NEXT: buffer_load_u16 v0, off, s[4:7], 0216; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)217; GFX11-FAKE16-NEXT: v_cmp_nlt_f16_e32 vcc_lo, 0.5, v0218; GFX11-FAKE16-NEXT: s_cbranch_vccnz .LBB1_2219; GFX11-FAKE16-NEXT: ; %bb.1: ; %one220; GFX11-FAKE16-NEXT: v_mov_b32_e32 v0, 0x3800221; GFX11-FAKE16-NEXT: .LBB1_2: ; %two222; GFX11-FAKE16-NEXT: s_mov_b32 s2, s6223; GFX11-FAKE16-NEXT: s_mov_b32 s3, s7224; GFX11-FAKE16-NEXT: buffer_store_b16 v0, off, s[0:3], 0225; GFX11-FAKE16-NEXT: s_endpgm226 ptr addrspace(1) %r,227 ptr addrspace(1) %b) {228entry:229 %b.val = load half, ptr addrspace(1) %b230 %fcmp = fcmp olt half 0xH3800, %b.val231 br i1 %fcmp, label %one, label %two232 233one:234 store half 0xH3800, ptr addrspace(1) %r235 ret void236 237two:238 store half %b.val, ptr addrspace(1) %r239 ret void240}241 242define amdgpu_kernel void @br_cc_f16_imm_b(243; SI-LABEL: br_cc_f16_imm_b:244; SI: ; %bb.0: ; %entry245; SI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9246; SI-NEXT: s_mov_b32 s7, 0xf000247; SI-NEXT: s_mov_b32 s6, -1248; SI-NEXT: s_waitcnt lgkmcnt(0)249; SI-NEXT: s_mov_b32 s4, s2250; SI-NEXT: s_mov_b32 s5, s3251; SI-NEXT: buffer_load_ushort v0, off, s[4:7], 0252; SI-NEXT: s_waitcnt vmcnt(0)253; SI-NEXT: v_cvt_f32_f16_e32 v0, v0254; SI-NEXT: v_cmp_ngt_f32_e32 vcc, 0.5, v0255; SI-NEXT: s_cbranch_vccnz .LBB2_2256; SI-NEXT: ; %bb.1: ; %one257; SI-NEXT: v_cvt_f16_f32_e32 v0, v0258; SI-NEXT: s_mov_b32 s2, s6259; SI-NEXT: s_mov_b32 s3, s7260; SI-NEXT: buffer_store_short v0, off, s[0:3], 0261; SI-NEXT: s_endpgm262; SI-NEXT: .LBB2_2: ; %two263; SI-NEXT: s_mov_b32 s2, s6264; SI-NEXT: s_mov_b32 s3, s7265; SI-NEXT: v_mov_b32_e32 v0, 0x3800266; SI-NEXT: buffer_store_short v0, off, s[0:3], 0267; SI-NEXT: s_endpgm268;269; VI-LABEL: br_cc_f16_imm_b:270; VI: ; %bb.0: ; %entry271; VI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24272; VI-NEXT: s_mov_b32 s7, 0xf000273; VI-NEXT: s_mov_b32 s6, -1274; VI-NEXT: s_waitcnt lgkmcnt(0)275; VI-NEXT: s_mov_b32 s4, s2276; VI-NEXT: s_mov_b32 s5, s3277; VI-NEXT: buffer_load_ushort v0, off, s[4:7], 0278; VI-NEXT: s_mov_b32 s2, s6279; VI-NEXT: s_mov_b32 s3, s7280; VI-NEXT: s_waitcnt vmcnt(0)281; VI-NEXT: v_cmp_ngt_f16_e32 vcc, 0.5, v0282; VI-NEXT: s_cbranch_vccnz .LBB2_2283; VI-NEXT: ; %bb.1: ; %one284; VI-NEXT: buffer_store_short v0, off, s[0:3], 0285; VI-NEXT: s_endpgm286; VI-NEXT: .LBB2_2: ; %two287; VI-NEXT: v_mov_b32_e32 v0, 0x3800288; VI-NEXT: buffer_store_short v0, off, s[0:3], 0289; VI-NEXT: s_endpgm290;291; GFX11-TRUE16-LABEL: br_cc_f16_imm_b:292; GFX11-TRUE16: ; %bb.0: ; %entry293; GFX11-TRUE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x24294; GFX11-TRUE16-NEXT: s_mov_b32 s7, 0x31016000295; GFX11-TRUE16-NEXT: s_mov_b32 s6, -1296; GFX11-TRUE16-NEXT: s_waitcnt lgkmcnt(0)297; GFX11-TRUE16-NEXT: s_mov_b32 s4, s2298; GFX11-TRUE16-NEXT: s_mov_b32 s5, s3299; GFX11-TRUE16-NEXT: buffer_load_u16 v0, off, s[4:7], 0300; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)301; GFX11-TRUE16-NEXT: v_mov_b16_e32 v1.l, v0.l302; GFX11-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1)303; GFX11-TRUE16-NEXT: v_cmp_ngt_f16_e32 vcc_lo, 0.5, v1.l304; GFX11-TRUE16-NEXT: s_cbranch_vccz .LBB2_2305; GFX11-TRUE16-NEXT: ; %bb.1: ; %two306; GFX11-TRUE16-NEXT: v_mov_b16_e32 v0.l, 0x3800307; GFX11-TRUE16-NEXT: .LBB2_2: ; %one308; GFX11-TRUE16-NEXT: s_mov_b32 s2, s6309; GFX11-TRUE16-NEXT: s_mov_b32 s3, s7310; GFX11-TRUE16-NEXT: buffer_store_b16 v0, off, s[0:3], 0311; GFX11-TRUE16-NEXT: s_endpgm312;313; GFX11-FAKE16-LABEL: br_cc_f16_imm_b:314; GFX11-FAKE16: ; %bb.0: ; %entry315; GFX11-FAKE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x24316; GFX11-FAKE16-NEXT: s_mov_b32 s7, 0x31016000317; GFX11-FAKE16-NEXT: s_mov_b32 s6, -1318; GFX11-FAKE16-NEXT: s_waitcnt lgkmcnt(0)319; GFX11-FAKE16-NEXT: s_mov_b32 s4, s2320; GFX11-FAKE16-NEXT: s_mov_b32 s5, s3321; GFX11-FAKE16-NEXT: buffer_load_u16 v0, off, s[4:7], 0322; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)323; GFX11-FAKE16-NEXT: v_cmp_ngt_f16_e32 vcc_lo, 0.5, v0324; GFX11-FAKE16-NEXT: s_cbranch_vccz .LBB2_2325; GFX11-FAKE16-NEXT: ; %bb.1: ; %two326; GFX11-FAKE16-NEXT: v_mov_b32_e32 v0, 0x3800327; GFX11-FAKE16-NEXT: .LBB2_2: ; %one328; GFX11-FAKE16-NEXT: s_mov_b32 s2, s6329; GFX11-FAKE16-NEXT: s_mov_b32 s3, s7330; GFX11-FAKE16-NEXT: buffer_store_b16 v0, off, s[0:3], 0331; GFX11-FAKE16-NEXT: s_endpgm332 ptr addrspace(1) %r,333 ptr addrspace(1) %a) {334entry:335 %a.val = load half, ptr addrspace(1) %a336 %fcmp = fcmp olt half %a.val, 0xH3800337 br i1 %fcmp, label %one, label %two338 339one:340 store half %a.val, ptr addrspace(1) %r341 ret void342 343two:344 store half 0xH3800, ptr addrspace(1) %r345 ret void346}347