107 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1250 -mattr=+real-true16 -mattr=-flat-for-global < %s | FileCheck -check-prefixes=GFX12-TRUE16 %s3; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1250 -mattr=-real-true16 -mattr=-flat-for-global < %s | FileCheck -check-prefixes=GFX12-FAKE16 %s4 5declare bfloat @llvm.sqrt.bf16(bfloat %a)6declare <2 x bfloat> @llvm.sqrt.v2bf16(<2 x bfloat> %a)7 8define amdgpu_kernel void @sqrt_bf16(ptr addrspace(1) %r, ptr addrspace(1) %a) {9; GFX12-TRUE16-LABEL: sqrt_bf16:10; GFX12-TRUE16: ; %bb.0: ; %entry11; GFX12-TRUE16-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 112; GFX12-TRUE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x013; GFX12-TRUE16-NEXT: s_mov_b32 s6, -114; GFX12-TRUE16-NEXT: s_mov_b32 s7, 0x3101600015; GFX12-TRUE16-NEXT: s_mov_b32 s10, s616; GFX12-TRUE16-NEXT: s_mov_b32 s11, s717; GFX12-TRUE16-NEXT: s_wait_kmcnt 0x018; GFX12-TRUE16-NEXT: s_mov_b32 s8, s219; GFX12-TRUE16-NEXT: s_mov_b32 s9, s320; GFX12-TRUE16-NEXT: s_mov_b32 s4, s021; GFX12-TRUE16-NEXT: buffer_load_u16 v0, off, s[8:11], null22; GFX12-TRUE16-NEXT: s_mov_b32 s5, s123; GFX12-TRUE16-NEXT: s_wait_loadcnt 0x024; GFX12-TRUE16-NEXT: v_sqrt_bf16_e32 v0.l, v0.l25; GFX12-TRUE16-NEXT: buffer_store_b16 v0, off, s[4:7], null26; GFX12-TRUE16-NEXT: s_endpgm27;28; GFX12-FAKE16-LABEL: sqrt_bf16:29; GFX12-FAKE16: ; %bb.0: ; %entry30; GFX12-FAKE16-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 131; GFX12-FAKE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x032; GFX12-FAKE16-NEXT: s_mov_b32 s6, -133; GFX12-FAKE16-NEXT: s_mov_b32 s7, 0x3101600034; GFX12-FAKE16-NEXT: s_mov_b32 s10, s635; GFX12-FAKE16-NEXT: s_mov_b32 s11, s736; GFX12-FAKE16-NEXT: s_wait_kmcnt 0x037; GFX12-FAKE16-NEXT: s_mov_b32 s8, s238; GFX12-FAKE16-NEXT: s_mov_b32 s9, s339; GFX12-FAKE16-NEXT: s_mov_b32 s4, s040; GFX12-FAKE16-NEXT: buffer_load_u16 v0, off, s[8:11], null41; GFX12-FAKE16-NEXT: s_mov_b32 s5, s142; GFX12-FAKE16-NEXT: s_wait_loadcnt 0x043; GFX12-FAKE16-NEXT: v_sqrt_bf16_e32 v0, v044; GFX12-FAKE16-NEXT: buffer_store_b16 v0, off, s[4:7], null45; GFX12-FAKE16-NEXT: s_endpgm46entry:47 %a.val = load bfloat, ptr addrspace(1) %a48 %r.val = call bfloat @llvm.sqrt.bf16(bfloat %a.val)49 store bfloat %r.val, ptr addrspace(1) %r50 ret void51}52 53define amdgpu_kernel void @sqrt_v2bf16(ptr addrspace(1) %r, ptr addrspace(1) %a) {54; GFX12-TRUE16-LABEL: sqrt_v2bf16:55; GFX12-TRUE16: ; %bb.0: ; %entry56; GFX12-TRUE16-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 157; GFX12-TRUE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x058; GFX12-TRUE16-NEXT: s_mov_b32 s6, -159; GFX12-TRUE16-NEXT: s_mov_b32 s7, 0x3101600060; GFX12-TRUE16-NEXT: s_mov_b32 s10, s661; GFX12-TRUE16-NEXT: s_mov_b32 s11, s762; GFX12-TRUE16-NEXT: s_wait_kmcnt 0x063; GFX12-TRUE16-NEXT: s_mov_b32 s8, s264; GFX12-TRUE16-NEXT: s_mov_b32 s9, s365; GFX12-TRUE16-NEXT: s_mov_b32 s4, s066; GFX12-TRUE16-NEXT: buffer_load_b32 v0, off, s[8:11], null67; GFX12-TRUE16-NEXT: s_mov_b32 s5, s168; GFX12-TRUE16-NEXT: s_wait_loadcnt 0x069; GFX12-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v070; GFX12-TRUE16-NEXT: v_sqrt_bf16_e32 v0.l, v0.l71; GFX12-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1)72; GFX12-TRUE16-NEXT: v_sqrt_bf16_e32 v0.h, v1.l73; GFX12-TRUE16-NEXT: buffer_store_b32 v0, off, s[4:7], null74; GFX12-TRUE16-NEXT: s_endpgm75;76; GFX12-FAKE16-LABEL: sqrt_v2bf16:77; GFX12-FAKE16: ; %bb.0: ; %entry78; GFX12-FAKE16-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 179; GFX12-FAKE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x080; GFX12-FAKE16-NEXT: s_mov_b32 s6, -181; GFX12-FAKE16-NEXT: s_mov_b32 s7, 0x3101600082; GFX12-FAKE16-NEXT: s_mov_b32 s10, s683; GFX12-FAKE16-NEXT: s_mov_b32 s11, s784; GFX12-FAKE16-NEXT: s_wait_kmcnt 0x085; GFX12-FAKE16-NEXT: s_mov_b32 s8, s286; GFX12-FAKE16-NEXT: s_mov_b32 s9, s387; GFX12-FAKE16-NEXT: s_mov_b32 s4, s088; GFX12-FAKE16-NEXT: buffer_load_b32 v0, off, s[8:11], null89; GFX12-FAKE16-NEXT: s_mov_b32 s5, s190; GFX12-FAKE16-NEXT: s_wait_loadcnt 0x091; GFX12-FAKE16-NEXT: v_sqrt_bf16_e32 v1, v092; GFX12-FAKE16-NEXT: v_nop93; GFX12-FAKE16-NEXT: v_lshrrev_b32_e32 v0, 16, v094; GFX12-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(TRANS32_DEP_2)95; GFX12-FAKE16-NEXT: v_sqrt_bf16_e32 v0, v096; GFX12-FAKE16-NEXT: v_and_b32_e32 v1, 0xffff, v197; GFX12-FAKE16-NEXT: s_delay_alu instid0(TRANS32_DEP_1) | instid1(VALU_DEP_1)98; GFX12-FAKE16-NEXT: v_lshl_or_b32 v0, v0, 16, v199; GFX12-FAKE16-NEXT: buffer_store_b32 v0, off, s[4:7], null100; GFX12-FAKE16-NEXT: s_endpgm101entry:102 %a.val = load <2 x bfloat>, ptr addrspace(1) %a103 %r.val = call <2 x bfloat> @llvm.sqrt.v2bf16(<2 x bfloat> %a.val)104 store <2 x bfloat> %r.val, ptr addrspace(1) %r105 ret void106}107