304 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 22; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn -mcpu=tahiti < %s | FileCheck --check-prefixes=SI %s3; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn -mcpu=fiji -mattr=-flat-for-global < %s | FileCheck --check-prefixes=GFX89,VI %s4; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn -mcpu=gfx900 -mattr=-flat-for-global < %s | FileCheck --check-prefixes=GFX89,GFX9 %s5; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn -mcpu=gfx1100 -mattr=-flat-for-global,+real-true16 < %s | FileCheck --check-prefixes=GFX11-TRUE16 %s6; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn -mcpu=gfx1100 -mattr=-flat-for-global,-real-true16 < %s | FileCheck --check-prefixes=GFX11-FAKE16 %s7; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn -mcpu=gfx1200 -mattr=+real-true16 -mattr=-flat-for-global < %s | FileCheck --check-prefixes=GFX12,GFX12-TRUE16 %s8; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn -mcpu=gfx1200 -mattr=-real-true16 -mattr=-flat-for-global < %s | FileCheck --check-prefixes=GFX12,GFX12-FAKE16 %s9 10declare half @llvm.rint.f16(half %a)11declare <2 x half> @llvm.rint.v2f16(<2 x half> %a)12 13define amdgpu_kernel void @rint_f16(14; SI-LABEL: rint_f16:15; SI: ; %bb.0: ; %entry16; SI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x917; SI-NEXT: s_mov_b32 s7, 0xf00018; SI-NEXT: s_mov_b32 s6, -119; SI-NEXT: s_mov_b32 s10, s620; SI-NEXT: s_mov_b32 s11, s721; SI-NEXT: s_waitcnt lgkmcnt(0)22; SI-NEXT: s_mov_b32 s8, s223; SI-NEXT: s_mov_b32 s9, s324; SI-NEXT: buffer_load_ushort v0, off, s[8:11], 025; SI-NEXT: s_mov_b32 s4, s026; SI-NEXT: s_mov_b32 s5, s127; SI-NEXT: s_waitcnt vmcnt(0)28; SI-NEXT: v_cvt_f32_f16_e32 v0, v029; SI-NEXT: v_rndne_f32_e32 v0, v030; 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; GFX89-LABEL: rint_f16:35; GFX89: ; %bb.0: ; %entry36; GFX89-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x2437; GFX89-NEXT: s_mov_b32 s7, 0xf00038; GFX89-NEXT: s_mov_b32 s6, -139; GFX89-NEXT: s_mov_b32 s10, s640; GFX89-NEXT: s_mov_b32 s11, s741; GFX89-NEXT: s_waitcnt lgkmcnt(0)42; GFX89-NEXT: s_mov_b32 s8, s243; GFX89-NEXT: s_mov_b32 s9, s344; GFX89-NEXT: buffer_load_ushort v0, off, s[8:11], 045; GFX89-NEXT: s_mov_b32 s4, s046; GFX89-NEXT: s_mov_b32 s5, s147; GFX89-NEXT: s_waitcnt vmcnt(0)48; GFX89-NEXT: v_rndne_f16_e32 v0, v049; GFX89-NEXT: buffer_store_short v0, off, s[4:7], 050; GFX89-NEXT: s_endpgm51;52; GFX11-TRUE16-LABEL: rint_f16:53; GFX11-TRUE16: ; %bb.0: ; %entry54; GFX11-TRUE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x2455; GFX11-TRUE16-NEXT: s_mov_b32 s6, -156; GFX11-TRUE16-NEXT: s_mov_b32 s7, 0x3101600057; GFX11-TRUE16-NEXT: s_mov_b32 s10, s658; GFX11-TRUE16-NEXT: s_mov_b32 s11, s759; GFX11-TRUE16-NEXT: s_waitcnt lgkmcnt(0)60; GFX11-TRUE16-NEXT: s_mov_b32 s8, s261; GFX11-TRUE16-NEXT: s_mov_b32 s9, s362; GFX11-TRUE16-NEXT: s_mov_b32 s4, s063; GFX11-TRUE16-NEXT: buffer_load_u16 v0, off, s[8:11], 064; GFX11-TRUE16-NEXT: s_mov_b32 s5, s165; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)66; GFX11-TRUE16-NEXT: v_rndne_f16_e32 v0.l, v0.l67; GFX11-TRUE16-NEXT: buffer_store_b16 v0, off, s[4:7], 068; GFX11-TRUE16-NEXT: s_endpgm69;70; GFX11-FAKE16-LABEL: rint_f16:71; GFX11-FAKE16: ; %bb.0: ; %entry72; GFX11-FAKE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x2473; GFX11-FAKE16-NEXT: s_mov_b32 s6, -174; GFX11-FAKE16-NEXT: s_mov_b32 s7, 0x3101600075; GFX11-FAKE16-NEXT: s_mov_b32 s10, s676; GFX11-FAKE16-NEXT: s_mov_b32 s11, s777; GFX11-FAKE16-NEXT: s_waitcnt lgkmcnt(0)78; GFX11-FAKE16-NEXT: s_mov_b32 s8, s279; GFX11-FAKE16-NEXT: s_mov_b32 s9, s380; GFX11-FAKE16-NEXT: s_mov_b32 s4, s081; GFX11-FAKE16-NEXT: buffer_load_u16 v0, off, s[8:11], 082; GFX11-FAKE16-NEXT: s_mov_b32 s5, s183; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)84; GFX11-FAKE16-NEXT: v_rndne_f16_e32 v0, v085; GFX11-FAKE16-NEXT: buffer_store_b16 v0, off, s[4:7], 086; GFX11-FAKE16-NEXT: s_endpgm87;88; GFX12-TRUE16-LABEL: rint_f16:89; GFX12-TRUE16: ; %bb.0: ; %entry90; GFX12-TRUE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x2491; GFX12-TRUE16-NEXT: s_mov_b32 s6, -192; GFX12-TRUE16-NEXT: s_mov_b32 s7, 0x3101600093; GFX12-TRUE16-NEXT: s_mov_b32 s10, s694; GFX12-TRUE16-NEXT: s_mov_b32 s11, s795; GFX12-TRUE16-NEXT: s_wait_kmcnt 0x096; GFX12-TRUE16-NEXT: s_mov_b32 s8, s297; GFX12-TRUE16-NEXT: s_mov_b32 s9, s398; GFX12-TRUE16-NEXT: s_mov_b32 s4, s099; GFX12-TRUE16-NEXT: buffer_load_u16 v0, off, s[8:11], null100; GFX12-TRUE16-NEXT: s_mov_b32 s5, s1101; GFX12-TRUE16-NEXT: s_wait_loadcnt 0x0102; GFX12-TRUE16-NEXT: v_rndne_f16_e32 v0.l, v0.l103; GFX12-TRUE16-NEXT: buffer_store_b16 v0, off, s[4:7], null104; GFX12-TRUE16-NEXT: s_endpgm105;106; GFX12-FAKE16-LABEL: rint_f16:107; GFX12-FAKE16: ; %bb.0: ; %entry108; GFX12-FAKE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x24109; GFX12-FAKE16-NEXT: s_mov_b32 s6, -1110; GFX12-FAKE16-NEXT: s_mov_b32 s7, 0x31016000111; GFX12-FAKE16-NEXT: s_mov_b32 s10, s6112; GFX12-FAKE16-NEXT: s_mov_b32 s11, s7113; GFX12-FAKE16-NEXT: s_wait_kmcnt 0x0114; GFX12-FAKE16-NEXT: s_mov_b32 s8, s2115; GFX12-FAKE16-NEXT: s_mov_b32 s9, s3116; GFX12-FAKE16-NEXT: s_mov_b32 s4, s0117; GFX12-FAKE16-NEXT: buffer_load_u16 v0, off, s[8:11], null118; GFX12-FAKE16-NEXT: s_mov_b32 s5, s1119; GFX12-FAKE16-NEXT: s_wait_loadcnt 0x0120; GFX12-FAKE16-NEXT: v_rndne_f16_e32 v0, v0121; GFX12-FAKE16-NEXT: buffer_store_b16 v0, off, s[4:7], null122; GFX12-FAKE16-NEXT: s_endpgm123 ptr addrspace(1) %r,124 ptr addrspace(1) %a) {125entry:126 %a.val = load half, ptr addrspace(1) %a127 %r.val = call half @llvm.rint.f16(half %a.val)128 store half %r.val, ptr addrspace(1) %r129 ret void130}131 132; The original test with manual checks also had these NOT directives:133; COM: SI-DAG: v_lshlrev_b32_e32 v[[R_F16_HI:[0-9]+]], 16, v[[R_F16_1]]134; COM: SI-NOT: v_and_b32135; COM: SI: v_or_b32_e32 v[[R_V2_F16:[0-9]+]], v[[R_F16_0]], v[[R_F16_HI]]136; COM: VI-DAG: v_rndne_f16_e32 v[[R_F16_0:[0-9]+]], v[[A_V2_F16]]137; COM: VI-DAG: v_rndne_f16_sdwa v[[R_F16_1:[0-9]+]], v[[A_V2_F16]] dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1138; COM: VI-NOT: v_and_b32139; COM: VI: v_or_b32_e32 v[[R_V2_F16:[0-9]+]], v[[R_F16_0]], v[[R_F16_1]]140define amdgpu_kernel void @rint_v2f16(141; SI-LABEL: rint_v2f16:142; SI: ; %bb.0: ; %entry143; SI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9144; SI-NEXT: s_mov_b32 s7, 0xf000145; SI-NEXT: s_mov_b32 s6, -1146; SI-NEXT: s_mov_b32 s10, s6147; SI-NEXT: s_mov_b32 s11, s7148; SI-NEXT: s_waitcnt lgkmcnt(0)149; SI-NEXT: s_mov_b32 s8, s2150; SI-NEXT: s_mov_b32 s9, s3151; SI-NEXT: buffer_load_dword v0, off, s[8:11], 0152; SI-NEXT: s_mov_b32 s4, s0153; SI-NEXT: s_mov_b32 s5, s1154; SI-NEXT: s_waitcnt vmcnt(0)155; SI-NEXT: v_lshrrev_b32_e32 v1, 16, v0156; SI-NEXT: v_cvt_f32_f16_e32 v1, v1157; SI-NEXT: v_cvt_f32_f16_e32 v0, v0158; SI-NEXT: v_rndne_f32_e32 v1, v1159; SI-NEXT: v_cvt_f16_f32_e32 v1, v1160; SI-NEXT: v_rndne_f32_e32 v0, v0161; SI-NEXT: v_cvt_f16_f32_e32 v0, v0162; SI-NEXT: v_lshlrev_b32_e32 v1, 16, v1163; SI-NEXT: v_or_b32_e32 v0, v0, v1164; SI-NEXT: buffer_store_dword v0, off, s[4:7], 0165; SI-NEXT: s_endpgm166;167; VI-LABEL: rint_v2f16:168; VI: ; %bb.0: ; %entry169; VI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24170; VI-NEXT: s_mov_b32 s7, 0xf000171; VI-NEXT: s_mov_b32 s6, -1172; VI-NEXT: s_mov_b32 s10, s6173; VI-NEXT: s_mov_b32 s11, s7174; VI-NEXT: s_waitcnt lgkmcnt(0)175; VI-NEXT: s_mov_b32 s8, s2176; VI-NEXT: s_mov_b32 s9, s3177; VI-NEXT: buffer_load_dword v0, off, s[8:11], 0178; VI-NEXT: s_mov_b32 s4, s0179; VI-NEXT: s_mov_b32 s5, s1180; VI-NEXT: s_waitcnt vmcnt(0)181; VI-NEXT: v_rndne_f16_sdwa v1, v0 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1182; VI-NEXT: v_rndne_f16_e32 v0, v0183; VI-NEXT: v_or_b32_e32 v0, v0, v1184; VI-NEXT: buffer_store_dword v0, off, s[4:7], 0185; VI-NEXT: s_endpgm186;187; GFX9-LABEL: rint_v2f16:188; GFX9: ; %bb.0: ; %entry189; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24190; GFX9-NEXT: s_mov_b32 s7, 0xf000191; GFX9-NEXT: s_mov_b32 s6, -1192; GFX9-NEXT: s_mov_b32 s10, s6193; GFX9-NEXT: s_mov_b32 s11, s7194; GFX9-NEXT: s_waitcnt lgkmcnt(0)195; GFX9-NEXT: s_mov_b32 s8, s2196; GFX9-NEXT: s_mov_b32 s9, s3197; GFX9-NEXT: buffer_load_dword v0, off, s[8:11], 0198; GFX9-NEXT: s_mov_b32 s4, s0199; GFX9-NEXT: s_mov_b32 s5, s1200; GFX9-NEXT: s_waitcnt vmcnt(0)201; GFX9-NEXT: v_rndne_f16_e32 v1, v0202; GFX9-NEXT: v_rndne_f16_sdwa v0, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1203; GFX9-NEXT: v_pack_b32_f16 v0, v1, v0204; GFX9-NEXT: buffer_store_dword v0, off, s[4:7], 0205; GFX9-NEXT: s_endpgm206;207; GFX11-TRUE16-LABEL: rint_v2f16:208; GFX11-TRUE16: ; %bb.0: ; %entry209; GFX11-TRUE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x24210; GFX11-TRUE16-NEXT: s_mov_b32 s6, -1211; GFX11-TRUE16-NEXT: s_mov_b32 s7, 0x31016000212; GFX11-TRUE16-NEXT: s_mov_b32 s10, s6213; GFX11-TRUE16-NEXT: s_mov_b32 s11, s7214; GFX11-TRUE16-NEXT: s_waitcnt lgkmcnt(0)215; GFX11-TRUE16-NEXT: s_mov_b32 s8, s2216; GFX11-TRUE16-NEXT: s_mov_b32 s9, s3217; GFX11-TRUE16-NEXT: s_mov_b32 s4, s0218; GFX11-TRUE16-NEXT: buffer_load_b32 v0, off, s[8:11], 0219; GFX11-TRUE16-NEXT: s_mov_b32 s5, s1220; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)221; GFX11-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v0222; GFX11-TRUE16-NEXT: v_rndne_f16_e32 v0.l, v0.l223; GFX11-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)224; GFX11-TRUE16-NEXT: v_rndne_f16_e32 v0.h, v1.l225; GFX11-TRUE16-NEXT: v_pack_b32_f16 v0, v0.l, v0.h226; GFX11-TRUE16-NEXT: buffer_store_b32 v0, off, s[4:7], 0227; GFX11-TRUE16-NEXT: s_endpgm228;229; GFX11-FAKE16-LABEL: rint_v2f16:230; GFX11-FAKE16: ; %bb.0: ; %entry231; GFX11-FAKE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x24232; GFX11-FAKE16-NEXT: s_mov_b32 s6, -1233; GFX11-FAKE16-NEXT: s_mov_b32 s7, 0x31016000234; GFX11-FAKE16-NEXT: s_mov_b32 s10, s6235; GFX11-FAKE16-NEXT: s_mov_b32 s11, s7236; GFX11-FAKE16-NEXT: s_waitcnt lgkmcnt(0)237; GFX11-FAKE16-NEXT: s_mov_b32 s8, s2238; GFX11-FAKE16-NEXT: s_mov_b32 s9, s3239; GFX11-FAKE16-NEXT: s_mov_b32 s4, s0240; GFX11-FAKE16-NEXT: buffer_load_b32 v0, off, s[8:11], 0241; GFX11-FAKE16-NEXT: s_mov_b32 s5, s1242; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)243; GFX11-FAKE16-NEXT: v_lshrrev_b32_e32 v1, 16, v0244; GFX11-FAKE16-NEXT: v_rndne_f16_e32 v0, v0245; GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)246; GFX11-FAKE16-NEXT: v_rndne_f16_e32 v1, v1247; GFX11-FAKE16-NEXT: v_pack_b32_f16 v0, v0, v1248; GFX11-FAKE16-NEXT: buffer_store_b32 v0, off, s[4:7], 0249; GFX11-FAKE16-NEXT: s_endpgm250;251; GFX12-TRUE16-LABEL: rint_v2f16:252; GFX12-TRUE16: ; %bb.0: ; %entry253; GFX12-TRUE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x24254; GFX12-TRUE16-NEXT: s_mov_b32 s6, -1255; GFX12-TRUE16-NEXT: s_mov_b32 s7, 0x31016000256; GFX12-TRUE16-NEXT: s_mov_b32 s10, s6257; GFX12-TRUE16-NEXT: s_mov_b32 s11, s7258; GFX12-TRUE16-NEXT: s_wait_kmcnt 0x0259; GFX12-TRUE16-NEXT: s_mov_b32 s8, s2260; GFX12-TRUE16-NEXT: s_mov_b32 s9, s3261; GFX12-TRUE16-NEXT: s_mov_b32 s4, s0262; GFX12-TRUE16-NEXT: buffer_load_b32 v0, off, s[8:11], null263; GFX12-TRUE16-NEXT: s_mov_b32 s5, s1264; GFX12-TRUE16-NEXT: s_wait_loadcnt 0x0265; GFX12-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v0266; GFX12-TRUE16-NEXT: v_rndne_f16_e32 v0.l, v0.l267; GFX12-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)268; GFX12-TRUE16-NEXT: v_rndne_f16_e32 v0.h, v1.l269; GFX12-TRUE16-NEXT: v_pack_b32_f16 v0, v0.l, v0.h270; GFX12-TRUE16-NEXT: buffer_store_b32 v0, off, s[4:7], null271; GFX12-TRUE16-NEXT: s_endpgm272;273; GFX12-FAKE16-LABEL: rint_v2f16:274; GFX12-FAKE16: ; %bb.0: ; %entry275; GFX12-FAKE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x24276; GFX12-FAKE16-NEXT: s_mov_b32 s6, -1277; GFX12-FAKE16-NEXT: s_mov_b32 s7, 0x31016000278; GFX12-FAKE16-NEXT: s_mov_b32 s10, s6279; GFX12-FAKE16-NEXT: s_mov_b32 s11, s7280; GFX12-FAKE16-NEXT: s_wait_kmcnt 0x0281; GFX12-FAKE16-NEXT: s_mov_b32 s8, s2282; GFX12-FAKE16-NEXT: s_mov_b32 s9, s3283; GFX12-FAKE16-NEXT: s_mov_b32 s4, s0284; GFX12-FAKE16-NEXT: buffer_load_b32 v0, off, s[8:11], null285; GFX12-FAKE16-NEXT: s_mov_b32 s5, s1286; GFX12-FAKE16-NEXT: s_wait_loadcnt 0x0287; GFX12-FAKE16-NEXT: v_lshrrev_b32_e32 v1, 16, v0288; GFX12-FAKE16-NEXT: v_rndne_f16_e32 v0, v0289; GFX12-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)290; GFX12-FAKE16-NEXT: v_rndne_f16_e32 v1, v1291; GFX12-FAKE16-NEXT: v_pack_b32_f16 v0, v0, v1292; GFX12-FAKE16-NEXT: buffer_store_b32 v0, off, s[4:7], null293; GFX12-FAKE16-NEXT: s_endpgm294 ptr addrspace(1) %r,295 ptr addrspace(1) %a) {296entry:297 %a.val = load <2 x half>, ptr addrspace(1) %a298 %r.val = call <2 x half> @llvm.rint.v2f16(<2 x half> %a.val)299 store <2 x half> %r.val, ptr addrspace(1) %r300 ret void301}302;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:303; GFX12: {{.*}}304