289 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=amdgcn-- -mcpu=tahiti | FileCheck %s --check-prefix=SI3; RUN: llc < %s -mtriple=amdgcn-- -mcpu=fiji -mattr=-flat-for-global | FileCheck %s --check-prefix=VI4; RUN: llc < %s -mtriple=amdgcn-- -mcpu=gfx1100 -mattr=+real-true16 -mattr=-flat-for-global | FileCheck %s --check-prefixes=GFX11,GFX11-TRUE165; RUN: llc < %s -mtriple=amdgcn-- -mcpu=gfx1100 -mattr=-real-true16 -mattr=-flat-for-global | FileCheck %s --check-prefixes=GFX11,GFX11-FAKE166 7define amdgpu_kernel void @madak_f16(8; SI-LABEL: madak_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 s14, s615; SI-NEXT: s_waitcnt lgkmcnt(0)16; SI-NEXT: s_mov_b32 s12, s217; SI-NEXT: s_mov_b32 s13, s318; SI-NEXT: s_mov_b32 s15, s719; SI-NEXT: s_mov_b32 s10, s620; SI-NEXT: s_mov_b32 s11, s721; SI-NEXT: buffer_load_ushort v0, off, s[12:15], 022; SI-NEXT: buffer_load_ushort v1, off, s[8:11], 023; SI-NEXT: s_mov_b32 s4, s024; SI-NEXT: s_mov_b32 s5, s125; SI-NEXT: s_waitcnt vmcnt(1)26; SI-NEXT: v_cvt_f32_f16_e32 v0, v027; SI-NEXT: s_waitcnt vmcnt(0)28; SI-NEXT: v_cvt_f32_f16_e32 v1, v129; SI-NEXT: v_madak_f32 v0, v0, v1, 0x4120000030; SI-NEXT: v_cvt_f16_f32_e32 v0, v031; SI-NEXT: buffer_store_short v0, off, s[4:7], 032; SI-NEXT: s_endpgm33;34; VI-LABEL: madak_f16:35; VI: ; %bb.0: ; %entry36; VI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x2437; VI-NEXT: s_load_dwordx2 s[8:9], s[4:5], 0x3438; VI-NEXT: s_mov_b32 s7, 0xf00039; VI-NEXT: s_mov_b32 s6, -140; VI-NEXT: s_mov_b32 s14, s641; VI-NEXT: s_waitcnt lgkmcnt(0)42; VI-NEXT: s_mov_b32 s12, s243; VI-NEXT: s_mov_b32 s13, s344; VI-NEXT: s_mov_b32 s15, s745; VI-NEXT: s_mov_b32 s10, s646; VI-NEXT: s_mov_b32 s11, s747; VI-NEXT: buffer_load_ushort v0, off, s[12:15], 048; VI-NEXT: buffer_load_ushort v1, off, s[8:11], 049; VI-NEXT: s_mov_b32 s4, s050; VI-NEXT: s_mov_b32 s5, s151; VI-NEXT: s_waitcnt vmcnt(0)52; VI-NEXT: v_madak_f16 v0, v0, v1, 0x490053; VI-NEXT: buffer_store_short v0, off, s[4:7], 054; VI-NEXT: s_endpgm55;56; GFX11-TRUE16-LABEL: madak_f16:57; GFX11-TRUE16: ; %bb.0: ; %entry58; GFX11-TRUE16-NEXT: s_clause 0x159; GFX11-TRUE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x2460; GFX11-TRUE16-NEXT: s_load_b64 s[4:5], s[4:5], 0x3461; GFX11-TRUE16-NEXT: s_mov_b32 s10, -162; GFX11-TRUE16-NEXT: s_mov_b32 s11, 0x3101600063; GFX11-TRUE16-NEXT: s_mov_b32 s14, s1064; GFX11-TRUE16-NEXT: s_mov_b32 s15, s1165; GFX11-TRUE16-NEXT: s_mov_b32 s6, s1066; GFX11-TRUE16-NEXT: s_mov_b32 s7, s1167; GFX11-TRUE16-NEXT: s_waitcnt lgkmcnt(0)68; GFX11-TRUE16-NEXT: s_mov_b32 s12, s269; GFX11-TRUE16-NEXT: s_mov_b32 s13, s370; GFX11-TRUE16-NEXT: buffer_load_u16 v0, off, s[12:15], 071; GFX11-TRUE16-NEXT: buffer_load_u16 v1, off, s[4:7], 072; GFX11-TRUE16-NEXT: s_mov_b32 s8, s073; GFX11-TRUE16-NEXT: s_mov_b32 s9, s174; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)75; GFX11-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v1.l76; GFX11-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1)77; GFX11-TRUE16-NEXT: v_add_f16_e32 v0.l, 0x4900, v0.l78; GFX11-TRUE16-NEXT: buffer_store_b16 v0, off, s[8:11], 079; GFX11-TRUE16-NEXT: s_endpgm80;81; GFX11-FAKE16-LABEL: madak_f16:82; GFX11-FAKE16: ; %bb.0: ; %entry83; GFX11-FAKE16-NEXT: s_clause 0x184; GFX11-FAKE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x2485; GFX11-FAKE16-NEXT: s_load_b64 s[4:5], s[4:5], 0x3486; GFX11-FAKE16-NEXT: s_mov_b32 s10, -187; GFX11-FAKE16-NEXT: s_mov_b32 s11, 0x3101600088; GFX11-FAKE16-NEXT: s_mov_b32 s14, s1089; GFX11-FAKE16-NEXT: s_mov_b32 s15, s1190; GFX11-FAKE16-NEXT: s_mov_b32 s6, s1091; GFX11-FAKE16-NEXT: s_mov_b32 s7, s1192; GFX11-FAKE16-NEXT: s_waitcnt lgkmcnt(0)93; GFX11-FAKE16-NEXT: s_mov_b32 s12, s294; GFX11-FAKE16-NEXT: s_mov_b32 s13, s395; GFX11-FAKE16-NEXT: buffer_load_u16 v0, off, s[12:15], 096; GFX11-FAKE16-NEXT: buffer_load_u16 v1, off, s[4:7], 097; GFX11-FAKE16-NEXT: s_mov_b32 s8, s098; GFX11-FAKE16-NEXT: s_mov_b32 s9, s199; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)100; GFX11-FAKE16-NEXT: v_mul_f16_e32 v0, v0, v1101; GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1)102; GFX11-FAKE16-NEXT: v_add_f16_e32 v0, 0x4900, v0103; GFX11-FAKE16-NEXT: buffer_store_b16 v0, off, s[8:11], 0104; GFX11-FAKE16-NEXT: s_endpgm105 ptr addrspace(1) %r,106 ptr addrspace(1) %a,107 ptr addrspace(1) %b) #0 {108entry:109 %a.val = load half, ptr addrspace(1) %a110 %b.val = load half, ptr addrspace(1) %b111 112 %t.val = fmul half %a.val, %b.val113 %r.val = fadd half %t.val, 10.0114 115 store half %r.val, ptr addrspace(1) %r116 ret void117}118 119define amdgpu_kernel void @madak_f16_use_2(120; SI-LABEL: madak_f16_use_2:121; SI: ; %bb.0: ; %entry122; SI-NEXT: s_load_dwordx8 s[8:15], s[4:5], 0x9123; SI-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x11124; SI-NEXT: s_mov_b32 s3, 0xf000125; SI-NEXT: s_mov_b32 s2, -1126; SI-NEXT: s_mov_b32 s18, s2127; SI-NEXT: s_waitcnt lgkmcnt(0)128; SI-NEXT: s_mov_b32 s16, s12129; SI-NEXT: s_mov_b32 s17, s13130; SI-NEXT: s_mov_b32 s19, s3131; SI-NEXT: s_mov_b32 s12, s14132; SI-NEXT: s_mov_b32 s13, s15133; SI-NEXT: s_mov_b32 s14, s2134; SI-NEXT: s_mov_b32 s15, s3135; SI-NEXT: s_mov_b32 s6, s2136; SI-NEXT: s_mov_b32 s7, s3137; SI-NEXT: buffer_load_ushort v0, off, s[16:19], 0 glc138; SI-NEXT: s_waitcnt vmcnt(0)139; SI-NEXT: buffer_load_ushort v1, off, s[12:15], 0 glc140; SI-NEXT: s_waitcnt vmcnt(0)141; SI-NEXT: buffer_load_ushort v2, off, s[4:7], 0 glc142; SI-NEXT: s_waitcnt vmcnt(0)143; SI-NEXT: v_mov_b32_e32 v3, 0x41200000144; SI-NEXT: s_mov_b32 s0, s8145; SI-NEXT: s_mov_b32 s1, s9146; SI-NEXT: s_mov_b32 s4, s10147; SI-NEXT: s_mov_b32 s5, s11148; SI-NEXT: v_cvt_f32_f16_e32 v0, v0149; SI-NEXT: v_cvt_f32_f16_e32 v1, v1150; SI-NEXT: v_cvt_f32_f16_e32 v2, v2151; SI-NEXT: v_madak_f32 v1, v0, v1, 0x41200000152; SI-NEXT: v_mac_f32_e32 v3, v0, v2153; SI-NEXT: v_cvt_f16_f32_e32 v0, v1154; SI-NEXT: v_cvt_f16_f32_e32 v1, v3155; SI-NEXT: buffer_store_short v0, off, s[0:3], 0156; SI-NEXT: buffer_store_short v1, off, s[4:7], 0157; SI-NEXT: s_endpgm158;159; VI-LABEL: madak_f16_use_2:160; VI: ; %bb.0: ; %entry161; VI-NEXT: s_load_dwordx8 s[8:15], s[4:5], 0x24162; VI-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x44163; VI-NEXT: s_mov_b32 s3, 0xf000164; VI-NEXT: s_mov_b32 s2, -1165; VI-NEXT: s_mov_b32 s18, s2166; VI-NEXT: s_waitcnt lgkmcnt(0)167; VI-NEXT: s_mov_b32 s16, s12168; VI-NEXT: s_mov_b32 s17, s13169; VI-NEXT: s_mov_b32 s19, s3170; VI-NEXT: s_mov_b32 s12, s14171; VI-NEXT: s_mov_b32 s13, s15172; VI-NEXT: s_mov_b32 s14, s2173; VI-NEXT: s_mov_b32 s15, s3174; VI-NEXT: s_mov_b32 s6, s2175; VI-NEXT: s_mov_b32 s7, s3176; VI-NEXT: buffer_load_ushort v0, off, s[16:19], 0 glc177; VI-NEXT: s_waitcnt vmcnt(0)178; VI-NEXT: buffer_load_ushort v1, off, s[12:15], 0 glc179; VI-NEXT: s_waitcnt vmcnt(0)180; VI-NEXT: buffer_load_ushort v2, off, s[4:7], 0 glc181; VI-NEXT: s_waitcnt vmcnt(0)182; VI-NEXT: v_mov_b32_e32 v3, 0x4900183; VI-NEXT: s_mov_b32 s0, s8184; VI-NEXT: s_mov_b32 s1, s9185; VI-NEXT: s_mov_b32 s4, s10186; VI-NEXT: s_mov_b32 s5, s11187; VI-NEXT: v_madak_f16 v1, v0, v1, 0x4900188; VI-NEXT: v_mac_f16_e32 v3, v0, v2189; VI-NEXT: buffer_store_short v1, off, s[0:3], 0190; VI-NEXT: buffer_store_short v3, off, s[4:7], 0191; VI-NEXT: s_endpgm192;193; GFX11-TRUE16-LABEL: madak_f16_use_2:194; GFX11-TRUE16: ; %bb.0: ; %entry195; GFX11-TRUE16-NEXT: s_clause 0x1196; GFX11-TRUE16-NEXT: s_load_b256 s[8:15], s[4:5], 0x24197; GFX11-TRUE16-NEXT: s_load_b64 s[0:1], s[4:5], 0x44198; GFX11-TRUE16-NEXT: s_mov_b32 s6, -1199; GFX11-TRUE16-NEXT: s_mov_b32 s7, 0x31016000200; GFX11-TRUE16-NEXT: s_mov_b32 s18, s6201; GFX11-TRUE16-NEXT: s_mov_b32 s19, s7202; GFX11-TRUE16-NEXT: s_mov_b32 s22, s6203; GFX11-TRUE16-NEXT: s_mov_b32 s23, s7204; GFX11-TRUE16-NEXT: s_mov_b32 s2, s6205; GFX11-TRUE16-NEXT: s_mov_b32 s3, s7206; GFX11-TRUE16-NEXT: s_waitcnt lgkmcnt(0)207; GFX11-TRUE16-NEXT: s_mov_b32 s16, s12208; GFX11-TRUE16-NEXT: s_mov_b32 s17, s13209; GFX11-TRUE16-NEXT: s_mov_b32 s20, s14210; GFX11-TRUE16-NEXT: s_mov_b32 s21, s15211; GFX11-TRUE16-NEXT: buffer_load_u16 v0, off, s[16:19], 0 glc dlc212; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)213; GFX11-TRUE16-NEXT: buffer_load_u16 v1, off, s[20:23], 0 glc dlc214; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)215; GFX11-TRUE16-NEXT: buffer_load_u16 v2, off, s[0:3], 0 glc dlc216; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)217; GFX11-TRUE16-NEXT: s_mov_b32 s4, s8218; GFX11-TRUE16-NEXT: s_mov_b32 s5, s9219; GFX11-TRUE16-NEXT: s_mov_b32 s0, s10220; GFX11-TRUE16-NEXT: s_mov_b32 s1, s11221; GFX11-TRUE16-NEXT: v_mul_f16_e32 v0.h, v0.l, v1.l222; GFX11-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v2.l223; GFX11-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)224; GFX11-TRUE16-NEXT: v_add_f16_e32 v1.l, 0x4900, v0.h225; GFX11-TRUE16-NEXT: v_add_f16_e32 v0.l, 0x4900, v0.l226; GFX11-TRUE16-NEXT: buffer_store_b16 v1, off, s[4:7], 0227; GFX11-TRUE16-NEXT: buffer_store_b16 v0, off, s[0:3], 0228; GFX11-TRUE16-NEXT: s_endpgm229;230; GFX11-FAKE16-LABEL: madak_f16_use_2:231; GFX11-FAKE16: ; %bb.0: ; %entry232; GFX11-FAKE16-NEXT: s_clause 0x1233; GFX11-FAKE16-NEXT: s_load_b256 s[8:15], s[4:5], 0x24234; GFX11-FAKE16-NEXT: s_load_b64 s[0:1], s[4:5], 0x44235; GFX11-FAKE16-NEXT: s_mov_b32 s6, -1236; GFX11-FAKE16-NEXT: s_mov_b32 s7, 0x31016000237; GFX11-FAKE16-NEXT: s_mov_b32 s18, s6238; GFX11-FAKE16-NEXT: s_mov_b32 s19, s7239; GFX11-FAKE16-NEXT: s_mov_b32 s22, s6240; GFX11-FAKE16-NEXT: s_mov_b32 s23, s7241; GFX11-FAKE16-NEXT: s_mov_b32 s2, s6242; GFX11-FAKE16-NEXT: s_mov_b32 s3, s7243; GFX11-FAKE16-NEXT: s_waitcnt lgkmcnt(0)244; GFX11-FAKE16-NEXT: s_mov_b32 s16, s12245; GFX11-FAKE16-NEXT: s_mov_b32 s17, s13246; GFX11-FAKE16-NEXT: s_mov_b32 s20, s14247; GFX11-FAKE16-NEXT: s_mov_b32 s21, s15248; GFX11-FAKE16-NEXT: buffer_load_u16 v0, off, s[16:19], 0 glc dlc249; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)250; GFX11-FAKE16-NEXT: buffer_load_u16 v1, off, s[20:23], 0 glc dlc251; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)252; GFX11-FAKE16-NEXT: buffer_load_u16 v2, off, s[0:3], 0 glc dlc253; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)254; GFX11-FAKE16-NEXT: s_mov_b32 s4, s8255; GFX11-FAKE16-NEXT: s_mov_b32 s5, s9256; GFX11-FAKE16-NEXT: s_mov_b32 s0, s10257; GFX11-FAKE16-NEXT: s_mov_b32 s1, s11258; GFX11-FAKE16-NEXT: v_mul_f16_e32 v1, v0, v1259; GFX11-FAKE16-NEXT: v_mul_f16_e32 v0, v0, v2260; GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)261; GFX11-FAKE16-NEXT: v_add_f16_e32 v1, 0x4900, v1262; GFX11-FAKE16-NEXT: v_add_f16_e32 v0, 0x4900, v0263; GFX11-FAKE16-NEXT: buffer_store_b16 v1, off, s[4:7], 0264; GFX11-FAKE16-NEXT: buffer_store_b16 v0, off, s[0:3], 0265; GFX11-FAKE16-NEXT: s_endpgm266 ptr addrspace(1) %r0,267 ptr addrspace(1) %r1,268 ptr addrspace(1) %a,269 ptr addrspace(1) %b,270 ptr addrspace(1) %c) #0 {271entry:272 %a.val = load volatile half, ptr addrspace(1) %a273 %b.val = load volatile half, ptr addrspace(1) %b274 %c.val = load volatile half, ptr addrspace(1) %c275 276 %t0.val = fmul half %a.val, %b.val277 %t1.val = fmul half %a.val, %c.val278 %r0.val = fadd half %t0.val, 10.0279 %r1.val = fadd half %t1.val, 10.0280 281 store half %r0.val, ptr addrspace(1) %r0282 store half %r1.val, ptr addrspace(1) %r1283 ret void284}285 286attributes #0 = { "denormal-fp-math"="preserve-sign,preserve-sign" }287;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:288; GFX11: {{.*}}289