1104 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 --check-prefixes=GFX6 %s3; RUN: llc -mtriple=amdgcn -mcpu=tonga -mattr=-flat-for-global < %s | FileCheck --check-prefixes=GFX8 %s4; RUN: llc -mtriple=amdgcn -mcpu=gfx900 -mattr=-flat-for-global < %s | FileCheck --check-prefixes=GFX9 %s5; RUN: llc -mtriple=amdgcn -mcpu=gfx1100 -mattr=+real-true16 -mattr=-flat-for-global < %s | FileCheck --check-prefixes=GFX11,GFX11-TRUE16 %s6; RUN: llc -mtriple=amdgcn -mcpu=gfx1100 -mattr=-real-true16 -mattr=-flat-for-global < %s | FileCheck --check-prefixes=GFX11,GFX11-FAKE16 %s7; RUN: llc -mtriple=r600 -mcpu=redwood < %s | FileCheck --check-prefixes=R600 %s8 9define amdgpu_kernel void @round_f32(ptr addrspace(1) %out, float %x) #0 {10; GFX6-LABEL: round_f32:11; GFX6: ; %bb.0:12; GFX6-NEXT: s_load_dword s6, s[4:5], 0xb13; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x914; GFX6-NEXT: s_mov_b32 s3, 0xf00015; GFX6-NEXT: s_mov_b32 s2, -116; GFX6-NEXT: s_waitcnt lgkmcnt(0)17; GFX6-NEXT: v_trunc_f32_e32 v0, s618; GFX6-NEXT: v_sub_f32_e32 v1, s6, v019; GFX6-NEXT: v_cmp_ge_f32_e64 s[4:5], |v1|, 0.520; GFX6-NEXT: v_cndmask_b32_e64 v1, 0, 1.0, s[4:5]21; GFX6-NEXT: s_brev_b32 s4, -222; GFX6-NEXT: v_mov_b32_e32 v2, s623; GFX6-NEXT: v_bfi_b32 v1, s4, v1, v224; GFX6-NEXT: v_add_f32_e32 v0, v0, v125; GFX6-NEXT: buffer_store_dword v0, off, s[0:3], 026; GFX6-NEXT: s_endpgm27;28; GFX8-LABEL: round_f32:29; GFX8: ; %bb.0:30; GFX8-NEXT: s_load_dword s6, s[4:5], 0x2c31; GFX8-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x2432; GFX8-NEXT: s_mov_b32 s3, 0xf00033; GFX8-NEXT: s_mov_b32 s2, -134; GFX8-NEXT: s_waitcnt lgkmcnt(0)35; GFX8-NEXT: v_trunc_f32_e32 v0, s636; GFX8-NEXT: v_sub_f32_e32 v1, s6, v037; GFX8-NEXT: v_cmp_ge_f32_e64 s[4:5], |v1|, 0.538; GFX8-NEXT: v_cndmask_b32_e64 v1, 0, 1.0, s[4:5]39; GFX8-NEXT: s_brev_b32 s4, -240; GFX8-NEXT: v_mov_b32_e32 v2, s641; GFX8-NEXT: v_bfi_b32 v1, s4, v1, v242; GFX8-NEXT: v_add_f32_e32 v0, v0, v143; GFX8-NEXT: buffer_store_dword v0, off, s[0:3], 044; GFX8-NEXT: s_endpgm45;46; GFX9-LABEL: round_f32:47; GFX9: ; %bb.0:48; GFX9-NEXT: s_load_dword s6, s[4:5], 0x2c49; GFX9-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x2450; GFX9-NEXT: s_mov_b32 s3, 0xf00051; GFX9-NEXT: s_mov_b32 s2, -152; GFX9-NEXT: s_waitcnt lgkmcnt(0)53; GFX9-NEXT: v_trunc_f32_e32 v0, s654; GFX9-NEXT: v_sub_f32_e32 v1, s6, v055; GFX9-NEXT: v_cmp_ge_f32_e64 s[4:5], |v1|, 0.556; GFX9-NEXT: v_cndmask_b32_e64 v1, 0, 1.0, s[4:5]57; GFX9-NEXT: s_brev_b32 s4, -258; GFX9-NEXT: v_mov_b32_e32 v2, s659; GFX9-NEXT: v_bfi_b32 v1, s4, v1, v260; GFX9-NEXT: v_add_f32_e32 v0, v0, v161; GFX9-NEXT: buffer_store_dword v0, off, s[0:3], 062; GFX9-NEXT: s_endpgm63;64; GFX11-LABEL: round_f32:65; GFX11: ; %bb.0:66; GFX11-NEXT: s_clause 0x167; GFX11-NEXT: s_load_b32 s2, s[4:5], 0x2c68; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x2469; GFX11-NEXT: s_waitcnt lgkmcnt(0)70; GFX11-NEXT: v_trunc_f32_e32 v0, s271; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)72; GFX11-NEXT: v_sub_f32_e32 v1, s2, v073; GFX11-NEXT: v_cmp_ge_f32_e64 s3, |v1|, 0.574; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_1)75; GFX11-NEXT: v_cndmask_b32_e64 v1, 0, 1.0, s376; GFX11-NEXT: s_mov_b32 s3, 0x3101600077; GFX11-NEXT: v_bfi_b32 v1, 0x7fffffff, v1, s278; GFX11-NEXT: s_mov_b32 s2, -179; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)80; GFX11-NEXT: v_add_f32_e32 v0, v0, v181; GFX11-NEXT: buffer_store_b32 v0, off, s[0:3], 082; GFX11-NEXT: s_endpgm83;84; R600-LABEL: round_f32:85; R600: ; %bb.0:86; R600-NEXT: ALU 7, @4, KC0[CB0:0-32], KC1[]87; R600-NEXT: MEM_RAT_CACHELESS STORE_RAW T0.X, T1.X, 188; R600-NEXT: CF_END89; R600-NEXT: PAD90; R600-NEXT: ALU clause starting at 4:91; R600-NEXT: TRUNC * T0.W, KC0[2].Z,92; R600-NEXT: ADD * T1.W, KC0[2].Z, -PV.W,93; R600-NEXT: SETGE * T1.W, |PV.W|, 0.5,94; R600-NEXT: BFI_INT * T1.W, literal.x, PV.W, KC0[2].Z,95; R600-NEXT: 2147483647(nan), 0(0.000000e+00)96; R600-NEXT: ADD T0.X, T0.W, PV.W,97; R600-NEXT: LSHR * T1.X, KC0[2].Y, literal.x,98; R600-NEXT: 2(2.802597e-45), 0(0.000000e+00)99 %result = call float @llvm.round.f32(float %x) #1100 store float %result, ptr addrspace(1) %out101 ret void102}103 104; The vector tests are really difficult to verify, since it can be hard to105; predict how the scheduler will order the instructions. We already have106; a test for the scalar case, so the vector tests just check that the107; compiler doesn't crash.108define amdgpu_kernel void @round_v2f32(ptr addrspace(1) %out, <2 x float> %in) #0 {109; GFX6-LABEL: round_v2f32:110; GFX6: ; %bb.0:111; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9112; GFX6-NEXT: s_brev_b32 s8, -2113; GFX6-NEXT: s_mov_b32 s7, 0xf000114; GFX6-NEXT: s_mov_b32 s6, -1115; GFX6-NEXT: s_waitcnt lgkmcnt(0)116; GFX6-NEXT: v_trunc_f32_e32 v0, s3117; GFX6-NEXT: v_sub_f32_e32 v1, s3, v0118; GFX6-NEXT: s_mov_b32 s4, s0119; GFX6-NEXT: s_mov_b32 s5, s1120; GFX6-NEXT: v_cmp_ge_f32_e64 s[0:1], |v1|, 0.5121; GFX6-NEXT: v_cndmask_b32_e64 v1, 0, 1.0, s[0:1]122; GFX6-NEXT: v_mov_b32_e32 v2, s3123; GFX6-NEXT: v_bfi_b32 v1, s8, v1, v2124; GFX6-NEXT: v_add_f32_e32 v1, v0, v1125; GFX6-NEXT: v_trunc_f32_e32 v0, s2126; GFX6-NEXT: v_sub_f32_e32 v2, s2, v0127; GFX6-NEXT: v_cmp_ge_f32_e64 s[0:1], |v2|, 0.5128; GFX6-NEXT: v_cndmask_b32_e64 v2, 0, 1.0, s[0:1]129; GFX6-NEXT: v_mov_b32_e32 v3, s2130; GFX6-NEXT: v_bfi_b32 v2, s8, v2, v3131; GFX6-NEXT: v_add_f32_e32 v0, v0, v2132; GFX6-NEXT: buffer_store_dwordx2 v[0:1], off, s[4:7], 0133; GFX6-NEXT: s_endpgm134;135; GFX8-LABEL: round_v2f32:136; GFX8: ; %bb.0:137; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24138; GFX8-NEXT: s_brev_b32 s8, -2139; GFX8-NEXT: s_mov_b32 s7, 0xf000140; GFX8-NEXT: s_mov_b32 s6, -1141; GFX8-NEXT: s_waitcnt lgkmcnt(0)142; GFX8-NEXT: v_trunc_f32_e32 v0, s3143; GFX8-NEXT: v_sub_f32_e32 v1, s3, v0144; GFX8-NEXT: s_mov_b32 s4, s0145; GFX8-NEXT: s_mov_b32 s5, s1146; GFX8-NEXT: v_cmp_ge_f32_e64 s[0:1], |v1|, 0.5147; GFX8-NEXT: v_cndmask_b32_e64 v1, 0, 1.0, s[0:1]148; GFX8-NEXT: v_mov_b32_e32 v2, s3149; GFX8-NEXT: v_bfi_b32 v1, s8, v1, v2150; GFX8-NEXT: v_add_f32_e32 v1, v0, v1151; GFX8-NEXT: v_trunc_f32_e32 v0, s2152; GFX8-NEXT: v_sub_f32_e32 v2, s2, v0153; GFX8-NEXT: v_cmp_ge_f32_e64 s[0:1], |v2|, 0.5154; GFX8-NEXT: v_cndmask_b32_e64 v2, 0, 1.0, s[0:1]155; GFX8-NEXT: v_mov_b32_e32 v3, s2156; GFX8-NEXT: v_bfi_b32 v2, s8, v2, v3157; GFX8-NEXT: v_add_f32_e32 v0, v0, v2158; GFX8-NEXT: buffer_store_dwordx2 v[0:1], off, s[4:7], 0159; GFX8-NEXT: s_endpgm160;161; GFX9-LABEL: round_v2f32:162; GFX9: ; %bb.0:163; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24164; GFX9-NEXT: s_brev_b32 s8, -2165; GFX9-NEXT: s_mov_b32 s7, 0xf000166; GFX9-NEXT: s_mov_b32 s6, -1167; GFX9-NEXT: s_waitcnt lgkmcnt(0)168; GFX9-NEXT: v_trunc_f32_e32 v0, s3169; GFX9-NEXT: v_sub_f32_e32 v1, s3, v0170; GFX9-NEXT: s_mov_b32 s4, s0171; GFX9-NEXT: s_mov_b32 s5, s1172; GFX9-NEXT: v_cmp_ge_f32_e64 s[0:1], |v1|, 0.5173; GFX9-NEXT: v_cndmask_b32_e64 v1, 0, 1.0, s[0:1]174; GFX9-NEXT: v_mov_b32_e32 v2, s3175; GFX9-NEXT: v_bfi_b32 v1, s8, v1, v2176; GFX9-NEXT: v_add_f32_e32 v1, v0, v1177; GFX9-NEXT: v_trunc_f32_e32 v0, s2178; GFX9-NEXT: v_sub_f32_e32 v2, s2, v0179; GFX9-NEXT: v_cmp_ge_f32_e64 s[0:1], |v2|, 0.5180; GFX9-NEXT: v_cndmask_b32_e64 v2, 0, 1.0, s[0:1]181; GFX9-NEXT: v_mov_b32_e32 v3, s2182; GFX9-NEXT: v_bfi_b32 v2, s8, v2, v3183; GFX9-NEXT: v_add_f32_e32 v0, v0, v2184; GFX9-NEXT: buffer_store_dwordx2 v[0:1], off, s[4:7], 0185; GFX9-NEXT: s_endpgm186;187; GFX11-LABEL: round_v2f32:188; GFX11: ; %bb.0:189; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x24190; GFX11-NEXT: s_waitcnt lgkmcnt(0)191; GFX11-NEXT: v_trunc_f32_e32 v0, s3192; GFX11-NEXT: v_trunc_f32_e32 v2, s2193; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)194; GFX11-NEXT: v_sub_f32_e32 v1, s3, v0195; GFX11-NEXT: v_sub_f32_e32 v3, s2, v2196; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)197; GFX11-NEXT: v_cmp_ge_f32_e64 s4, |v1|, 0.5198; GFX11-NEXT: v_cndmask_b32_e64 v1, 0, 1.0, s4199; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_2)200; GFX11-NEXT: v_cmp_ge_f32_e64 s4, |v3|, 0.5201; GFX11-NEXT: v_bfi_b32 v1, 0x7fffffff, v1, s3202; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2)203; GFX11-NEXT: v_cndmask_b32_e64 v3, 0, 1.0, s4204; GFX11-NEXT: s_mov_b32 s3, 0x31016000205; GFX11-NEXT: v_add_f32_e32 v1, v0, v1206; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_1)207; GFX11-NEXT: v_bfi_b32 v3, 0x7fffffff, v3, s2208; GFX11-NEXT: s_mov_b32 s2, -1209; GFX11-NEXT: v_add_f32_e32 v0, v2, v3210; GFX11-NEXT: buffer_store_b64 v[0:1], off, s[0:3], 0211; GFX11-NEXT: s_endpgm212;213; R600-LABEL: round_v2f32:214; R600: ; %bb.0:215; R600-NEXT: ALU 13, @4, KC0[CB0:0-32], KC1[]216; R600-NEXT: MEM_RAT_CACHELESS STORE_RAW T0.XY, T1.X, 1217; R600-NEXT: CF_END218; R600-NEXT: PAD219; R600-NEXT: ALU clause starting at 4:220; R600-NEXT: TRUNC * T0.W, KC0[3].X,221; R600-NEXT: ADD T1.W, KC0[3].X, -PV.W,222; R600-NEXT: TRUNC * T2.W, KC0[2].W,223; R600-NEXT: ADD T3.W, KC0[2].W, -PS,224; R600-NEXT: SETGE * T1.W, |PV.W|, 0.5,225; R600-NEXT: BFI_INT T1.W, literal.x, PS, KC0[3].X,226; R600-NEXT: SETGE * T3.W, |PV.W|, 0.5,227; R600-NEXT: 2147483647(nan), 0(0.000000e+00)228; R600-NEXT: ADD T0.Y, T0.W, PV.W,229; R600-NEXT: BFI_INT * T0.W, literal.x, PS, KC0[2].W,230; R600-NEXT: 2147483647(nan), 0(0.000000e+00)231; R600-NEXT: ADD T0.X, T2.W, PV.W,232; R600-NEXT: LSHR * T1.X, KC0[2].Y, literal.x,233; R600-NEXT: 2(2.802597e-45), 0(0.000000e+00)234 %result = call <2 x float> @llvm.round.v2f32(<2 x float> %in) #1235 store <2 x float> %result, ptr addrspace(1) %out236 ret void237}238 239define amdgpu_kernel void @round_v4f32(ptr addrspace(1) %out, <4 x float> %in) #0 {240; GFX6-LABEL: round_v4f32:241; GFX6: ; %bb.0:242; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0xd243; GFX6-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x9244; GFX6-NEXT: s_brev_b32 s10, -2245; GFX6-NEXT: s_mov_b32 s7, 0xf000246; GFX6-NEXT: s_mov_b32 s6, -1247; GFX6-NEXT: s_waitcnt lgkmcnt(0)248; GFX6-NEXT: v_trunc_f32_e32 v0, s3249; GFX6-NEXT: v_sub_f32_e32 v1, s3, v0250; GFX6-NEXT: v_cmp_ge_f32_e64 s[8:9], |v1|, 0.5251; GFX6-NEXT: v_cndmask_b32_e64 v1, 0, 1.0, s[8:9]252; GFX6-NEXT: v_mov_b32_e32 v2, s3253; GFX6-NEXT: v_bfi_b32 v1, s10, v1, v2254; GFX6-NEXT: v_add_f32_e32 v3, v0, v1255; GFX6-NEXT: v_trunc_f32_e32 v0, s2256; GFX6-NEXT: v_sub_f32_e32 v1, s2, v0257; GFX6-NEXT: v_cmp_ge_f32_e64 s[8:9], |v1|, 0.5258; GFX6-NEXT: v_cndmask_b32_e64 v1, 0, 1.0, s[8:9]259; GFX6-NEXT: v_mov_b32_e32 v2, s2260; GFX6-NEXT: v_bfi_b32 v1, s10, v1, v2261; GFX6-NEXT: v_add_f32_e32 v2, v0, v1262; GFX6-NEXT: v_trunc_f32_e32 v0, s1263; GFX6-NEXT: v_sub_f32_e32 v1, s1, v0264; GFX6-NEXT: v_cmp_ge_f32_e64 s[2:3], |v1|, 0.5265; GFX6-NEXT: v_cndmask_b32_e64 v1, 0, 1.0, s[2:3]266; GFX6-NEXT: v_mov_b32_e32 v4, s1267; GFX6-NEXT: v_bfi_b32 v1, s10, v1, v4268; GFX6-NEXT: v_add_f32_e32 v1, v0, v1269; GFX6-NEXT: v_trunc_f32_e32 v0, s0270; GFX6-NEXT: v_sub_f32_e32 v4, s0, v0271; GFX6-NEXT: v_cmp_ge_f32_e64 s[2:3], |v4|, 0.5272; GFX6-NEXT: v_cndmask_b32_e64 v4, 0, 1.0, s[2:3]273; GFX6-NEXT: v_mov_b32_e32 v5, s0274; GFX6-NEXT: v_bfi_b32 v4, s10, v4, v5275; GFX6-NEXT: v_add_f32_e32 v0, v0, v4276; GFX6-NEXT: buffer_store_dwordx4 v[0:3], off, s[4:7], 0277; GFX6-NEXT: s_endpgm278;279; GFX8-LABEL: round_v4f32:280; GFX8: ; %bb.0:281; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x34282; GFX8-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x24283; GFX8-NEXT: s_brev_b32 s10, -2284; GFX8-NEXT: s_mov_b32 s7, 0xf000285; GFX8-NEXT: s_mov_b32 s6, -1286; GFX8-NEXT: s_waitcnt lgkmcnt(0)287; GFX8-NEXT: v_trunc_f32_e32 v0, s3288; GFX8-NEXT: v_sub_f32_e32 v1, s3, v0289; GFX8-NEXT: v_cmp_ge_f32_e64 s[8:9], |v1|, 0.5290; GFX8-NEXT: v_cndmask_b32_e64 v1, 0, 1.0, s[8:9]291; GFX8-NEXT: v_mov_b32_e32 v2, s3292; GFX8-NEXT: v_bfi_b32 v1, s10, v1, v2293; GFX8-NEXT: v_add_f32_e32 v3, v0, v1294; GFX8-NEXT: v_trunc_f32_e32 v0, s2295; GFX8-NEXT: v_sub_f32_e32 v1, s2, v0296; GFX8-NEXT: v_cmp_ge_f32_e64 s[8:9], |v1|, 0.5297; GFX8-NEXT: v_cndmask_b32_e64 v1, 0, 1.0, s[8:9]298; GFX8-NEXT: v_mov_b32_e32 v2, s2299; GFX8-NEXT: v_bfi_b32 v1, s10, v1, v2300; GFX8-NEXT: v_add_f32_e32 v2, v0, v1301; GFX8-NEXT: v_trunc_f32_e32 v0, s1302; GFX8-NEXT: v_sub_f32_e32 v1, s1, v0303; GFX8-NEXT: v_cmp_ge_f32_e64 s[2:3], |v1|, 0.5304; GFX8-NEXT: v_cndmask_b32_e64 v1, 0, 1.0, s[2:3]305; GFX8-NEXT: v_mov_b32_e32 v4, s1306; GFX8-NEXT: v_bfi_b32 v1, s10, v1, v4307; GFX8-NEXT: v_add_f32_e32 v1, v0, v1308; GFX8-NEXT: v_trunc_f32_e32 v0, s0309; GFX8-NEXT: v_sub_f32_e32 v4, s0, v0310; GFX8-NEXT: v_cmp_ge_f32_e64 s[2:3], |v4|, 0.5311; GFX8-NEXT: v_cndmask_b32_e64 v4, 0, 1.0, s[2:3]312; GFX8-NEXT: v_mov_b32_e32 v5, s0313; GFX8-NEXT: v_bfi_b32 v4, s10, v4, v5314; GFX8-NEXT: v_add_f32_e32 v0, v0, v4315; GFX8-NEXT: buffer_store_dwordx4 v[0:3], off, s[4:7], 0316; GFX8-NEXT: s_endpgm317;318; GFX9-LABEL: round_v4f32:319; GFX9: ; %bb.0:320; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x34321; GFX9-NEXT: s_load_dwordx2 s[8:9], s[4:5], 0x24322; GFX9-NEXT: s_brev_b32 s6, -2323; GFX9-NEXT: s_mov_b32 s11, 0xf000324; GFX9-NEXT: s_mov_b32 s10, -1325; GFX9-NEXT: s_waitcnt lgkmcnt(0)326; GFX9-NEXT: v_trunc_f32_e32 v0, s3327; GFX9-NEXT: v_sub_f32_e32 v1, s3, v0328; GFX9-NEXT: v_cmp_ge_f32_e64 s[4:5], |v1|, 0.5329; GFX9-NEXT: v_cndmask_b32_e64 v1, 0, 1.0, s[4:5]330; GFX9-NEXT: v_mov_b32_e32 v2, s3331; GFX9-NEXT: v_bfi_b32 v1, s6, v1, v2332; GFX9-NEXT: v_add_f32_e32 v3, v0, v1333; GFX9-NEXT: v_trunc_f32_e32 v0, s2334; GFX9-NEXT: v_sub_f32_e32 v1, s2, v0335; GFX9-NEXT: v_cmp_ge_f32_e64 s[4:5], |v1|, 0.5336; GFX9-NEXT: v_cndmask_b32_e64 v1, 0, 1.0, s[4:5]337; GFX9-NEXT: v_mov_b32_e32 v2, s2338; GFX9-NEXT: v_bfi_b32 v1, s6, v1, v2339; GFX9-NEXT: v_add_f32_e32 v2, v0, v1340; GFX9-NEXT: v_trunc_f32_e32 v0, s1341; GFX9-NEXT: v_sub_f32_e32 v1, s1, v0342; GFX9-NEXT: v_cmp_ge_f32_e64 s[2:3], |v1|, 0.5343; GFX9-NEXT: v_cndmask_b32_e64 v1, 0, 1.0, s[2:3]344; GFX9-NEXT: v_mov_b32_e32 v4, s1345; GFX9-NEXT: v_bfi_b32 v1, s6, v1, v4346; GFX9-NEXT: v_add_f32_e32 v1, v0, v1347; GFX9-NEXT: v_trunc_f32_e32 v0, s0348; GFX9-NEXT: v_sub_f32_e32 v4, s0, v0349; GFX9-NEXT: v_cmp_ge_f32_e64 s[2:3], |v4|, 0.5350; GFX9-NEXT: v_cndmask_b32_e64 v4, 0, 1.0, s[2:3]351; GFX9-NEXT: v_mov_b32_e32 v5, s0352; GFX9-NEXT: v_bfi_b32 v4, s6, v4, v5353; GFX9-NEXT: v_add_f32_e32 v0, v0, v4354; GFX9-NEXT: buffer_store_dwordx4 v[0:3], off, s[8:11], 0355; GFX9-NEXT: s_endpgm356;357; GFX11-LABEL: round_v4f32:358; GFX11: ; %bb.0:359; GFX11-NEXT: s_clause 0x1360; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x34361; GFX11-NEXT: s_load_b64 s[4:5], s[4:5], 0x24362; GFX11-NEXT: s_mov_b32 s7, 0x31016000363; GFX11-NEXT: s_waitcnt lgkmcnt(0)364; GFX11-NEXT: v_trunc_f32_e32 v0, s3365; GFX11-NEXT: v_trunc_f32_e32 v1, s2366; GFX11-NEXT: v_trunc_f32_e32 v4, s1367; GFX11-NEXT: v_trunc_f32_e32 v5, s0368; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_2)369; GFX11-NEXT: v_dual_sub_f32 v2, s3, v0 :: v_dual_sub_f32 v3, s2, v1370; GFX11-NEXT: v_dual_sub_f32 v6, s1, v4 :: v_dual_sub_f32 v7, s0, v5371; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)372; GFX11-NEXT: v_cmp_ge_f32_e64 s6, |v2|, 0.5373; GFX11-NEXT: v_cndmask_b32_e64 v2, 0, 1.0, s6374; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_2)375; GFX11-NEXT: v_cmp_ge_f32_e64 s6, |v3|, 0.5376; GFX11-NEXT: v_bfi_b32 v2, 0x7fffffff, v2, s3377; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2)378; GFX11-NEXT: v_cndmask_b32_e64 v3, 0, 1.0, s6379; GFX11-NEXT: v_cmp_ge_f32_e64 s6, |v6|, 0.5380; GFX11-NEXT: v_bfi_b32 v8, 0x7fffffff, v3, s2381; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_3)382; GFX11-NEXT: v_cndmask_b32_e64 v6, 0, 1.0, s6383; GFX11-NEXT: v_cmp_ge_f32_e64 s6, |v7|, 0.5384; GFX11-NEXT: v_dual_add_f32 v3, v0, v2 :: v_dual_add_f32 v2, v1, v8385; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_3)386; GFX11-NEXT: v_bfi_b32 v6, 0x7fffffff, v6, s1387; GFX11-NEXT: v_cndmask_b32_e64 v7, 0, 1.0, s6388; GFX11-NEXT: s_mov_b32 s6, -1389; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)390; GFX11-NEXT: v_bfi_b32 v7, 0x7fffffff, v7, s0391; GFX11-NEXT: v_dual_add_f32 v1, v4, v6 :: v_dual_add_f32 v0, v5, v7392; GFX11-NEXT: buffer_store_b128 v[0:3], off, s[4:7], 0393; GFX11-NEXT: s_endpgm394;395; R600-LABEL: round_v4f32:396; R600: ; %bb.0:397; R600-NEXT: ALU 25, @4, KC0[CB0:0-32], KC1[]398; R600-NEXT: MEM_RAT_CACHELESS STORE_RAW T4.XYZW, T0.X, 1399; R600-NEXT: CF_END400; R600-NEXT: PAD401; R600-NEXT: ALU clause starting at 4:402; R600-NEXT: TRUNC * T0.W, KC0[4].X,403; R600-NEXT: ADD T1.W, KC0[4].X, -PV.W,404; R600-NEXT: TRUNC * T2.W, KC0[3].W,405; R600-NEXT: TRUNC T0.Z, KC0[3].Z,406; R600-NEXT: ADD T3.W, KC0[3].W, -PS,407; R600-NEXT: SETGE * T1.W, |PV.W|, 0.5,408; R600-NEXT: BFI_INT T0.Y, literal.x, PS, KC0[4].X,409; R600-NEXT: SETGE T1.Z, |PV.W|, 0.5,410; R600-NEXT: ADD * T1.W, KC0[3].Z, -PV.Z,411; R600-NEXT: 2147483647(nan), 0(0.000000e+00)412; R600-NEXT: TRUNC * T3.W, KC0[3].Y,413; R600-NEXT: ADD T1.Y, KC0[3].Y, -PV.W,414; R600-NEXT: SETGE T2.Z, |T1.W|, 0.5,415; R600-NEXT: BFI_INT T1.W, literal.x, T1.Z, KC0[3].W,416; R600-NEXT: ADD * T4.W, T0.W, T0.Y,417; R600-NEXT: 2147483647(nan), 0(0.000000e+00)418; R600-NEXT: ADD T4.Z, T2.W, PV.W,419; R600-NEXT: BFI_INT T0.W, literal.x, PV.Z, KC0[3].Z,420; R600-NEXT: SETGE * T1.W, |PV.Y|, 0.5,421; R600-NEXT: 2147483647(nan), 0(0.000000e+00)422; R600-NEXT: ADD T4.Y, T0.Z, PV.W,423; R600-NEXT: BFI_INT * T0.W, literal.x, PS, KC0[3].Y,424; R600-NEXT: 2147483647(nan), 0(0.000000e+00)425; R600-NEXT: ADD T4.X, T3.W, PV.W,426; R600-NEXT: LSHR * T0.X, KC0[2].Y, literal.x,427; R600-NEXT: 2(2.802597e-45), 0(0.000000e+00)428 %result = call <4 x float> @llvm.round.v4f32(<4 x float> %in) #1429 store <4 x float> %result, ptr addrspace(1) %out430 ret void431}432 433define amdgpu_kernel void @round_v8f32(ptr addrspace(1) %out, <8 x float> %in) #0 {434; GFX6-LABEL: round_v8f32:435; GFX6: ; %bb.0:436; GFX6-NEXT: s_load_dwordx8 s[8:15], s[4:5], 0x11437; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x9438; GFX6-NEXT: s_brev_b32 s6, -2439; GFX6-NEXT: s_mov_b32 s3, 0xf000440; GFX6-NEXT: s_mov_b32 s2, -1441; GFX6-NEXT: s_waitcnt lgkmcnt(0)442; GFX6-NEXT: v_trunc_f32_e32 v0, s11443; GFX6-NEXT: v_sub_f32_e32 v1, s11, v0444; GFX6-NEXT: v_cmp_ge_f32_e64 s[4:5], |v1|, 0.5445; GFX6-NEXT: v_cndmask_b32_e64 v1, 0, 1.0, s[4:5]446; GFX6-NEXT: v_mov_b32_e32 v2, s11447; GFX6-NEXT: v_bfi_b32 v1, s6, v1, v2448; GFX6-NEXT: v_add_f32_e32 v3, v0, v1449; GFX6-NEXT: v_trunc_f32_e32 v0, s10450; GFX6-NEXT: v_sub_f32_e32 v1, s10, v0451; GFX6-NEXT: v_cmp_ge_f32_e64 s[4:5], |v1|, 0.5452; GFX6-NEXT: v_cndmask_b32_e64 v1, 0, 1.0, s[4:5]453; GFX6-NEXT: v_mov_b32_e32 v2, s10454; GFX6-NEXT: v_bfi_b32 v1, s6, v1, v2455; GFX6-NEXT: v_add_f32_e32 v2, v0, v1456; GFX6-NEXT: v_trunc_f32_e32 v0, s9457; GFX6-NEXT: v_sub_f32_e32 v1, s9, v0458; GFX6-NEXT: v_cmp_ge_f32_e64 s[4:5], |v1|, 0.5459; GFX6-NEXT: v_cndmask_b32_e64 v1, 0, 1.0, s[4:5]460; GFX6-NEXT: v_mov_b32_e32 v4, s9461; GFX6-NEXT: v_bfi_b32 v1, s6, v1, v4462; GFX6-NEXT: v_add_f32_e32 v1, v0, v1463; GFX6-NEXT: v_trunc_f32_e32 v0, s8464; GFX6-NEXT: v_sub_f32_e32 v4, s8, v0465; GFX6-NEXT: v_cmp_ge_f32_e64 s[4:5], |v4|, 0.5466; GFX6-NEXT: v_cndmask_b32_e64 v4, 0, 1.0, s[4:5]467; GFX6-NEXT: v_mov_b32_e32 v5, s8468; GFX6-NEXT: v_bfi_b32 v4, s6, v4, v5469; GFX6-NEXT: v_add_f32_e32 v0, v0, v4470; GFX6-NEXT: v_trunc_f32_e32 v4, s15471; GFX6-NEXT: v_sub_f32_e32 v5, s15, v4472; GFX6-NEXT: v_cmp_ge_f32_e64 s[4:5], |v5|, 0.5473; GFX6-NEXT: v_cndmask_b32_e64 v5, 0, 1.0, s[4:5]474; GFX6-NEXT: v_mov_b32_e32 v6, s15475; GFX6-NEXT: v_bfi_b32 v5, s6, v5, v6476; GFX6-NEXT: v_add_f32_e32 v7, v4, v5477; GFX6-NEXT: v_trunc_f32_e32 v4, s14478; GFX6-NEXT: v_sub_f32_e32 v5, s14, v4479; GFX6-NEXT: v_cmp_ge_f32_e64 s[4:5], |v5|, 0.5480; GFX6-NEXT: v_cndmask_b32_e64 v5, 0, 1.0, s[4:5]481; GFX6-NEXT: v_mov_b32_e32 v6, s14482; GFX6-NEXT: v_bfi_b32 v5, s6, v5, v6483; GFX6-NEXT: v_add_f32_e32 v6, v4, v5484; GFX6-NEXT: v_trunc_f32_e32 v4, s13485; GFX6-NEXT: v_sub_f32_e32 v5, s13, v4486; GFX6-NEXT: v_cmp_ge_f32_e64 s[4:5], |v5|, 0.5487; GFX6-NEXT: v_cndmask_b32_e64 v5, 0, 1.0, s[4:5]488; GFX6-NEXT: v_mov_b32_e32 v8, s13489; GFX6-NEXT: v_bfi_b32 v5, s6, v5, v8490; GFX6-NEXT: v_add_f32_e32 v5, v4, v5491; GFX6-NEXT: v_trunc_f32_e32 v4, s12492; GFX6-NEXT: v_sub_f32_e32 v8, s12, v4493; GFX6-NEXT: v_cmp_ge_f32_e64 s[4:5], |v8|, 0.5494; GFX6-NEXT: v_cndmask_b32_e64 v8, 0, 1.0, s[4:5]495; GFX6-NEXT: v_mov_b32_e32 v9, s12496; GFX6-NEXT: v_bfi_b32 v8, s6, v8, v9497; GFX6-NEXT: v_add_f32_e32 v4, v4, v8498; GFX6-NEXT: buffer_store_dwordx4 v[4:7], off, s[0:3], 0 offset:16499; GFX6-NEXT: buffer_store_dwordx4 v[0:3], off, s[0:3], 0500; GFX6-NEXT: s_endpgm501;502; GFX8-LABEL: round_v8f32:503; GFX8: ; %bb.0:504; GFX8-NEXT: s_load_dwordx8 s[8:15], s[4:5], 0x44505; GFX8-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x24506; GFX8-NEXT: s_brev_b32 s6, -2507; GFX8-NEXT: s_mov_b32 s3, 0xf000508; GFX8-NEXT: s_mov_b32 s2, -1509; GFX8-NEXT: s_waitcnt lgkmcnt(0)510; GFX8-NEXT: v_trunc_f32_e32 v0, s11511; GFX8-NEXT: v_sub_f32_e32 v1, s11, v0512; GFX8-NEXT: v_cmp_ge_f32_e64 s[4:5], |v1|, 0.5513; GFX8-NEXT: v_cndmask_b32_e64 v1, 0, 1.0, s[4:5]514; GFX8-NEXT: v_mov_b32_e32 v2, s11515; GFX8-NEXT: v_bfi_b32 v1, s6, v1, v2516; GFX8-NEXT: v_add_f32_e32 v3, v0, v1517; GFX8-NEXT: v_trunc_f32_e32 v0, s10518; GFX8-NEXT: v_sub_f32_e32 v1, s10, v0519; GFX8-NEXT: v_cmp_ge_f32_e64 s[4:5], |v1|, 0.5520; GFX8-NEXT: v_cndmask_b32_e64 v1, 0, 1.0, s[4:5]521; GFX8-NEXT: v_mov_b32_e32 v2, s10522; GFX8-NEXT: v_bfi_b32 v1, s6, v1, v2523; GFX8-NEXT: v_add_f32_e32 v2, v0, v1524; GFX8-NEXT: v_trunc_f32_e32 v0, s9525; GFX8-NEXT: v_sub_f32_e32 v1, s9, v0526; GFX8-NEXT: v_cmp_ge_f32_e64 s[4:5], |v1|, 0.5527; GFX8-NEXT: v_cndmask_b32_e64 v1, 0, 1.0, s[4:5]528; GFX8-NEXT: v_mov_b32_e32 v4, s9529; GFX8-NEXT: v_bfi_b32 v1, s6, v1, v4530; GFX8-NEXT: v_add_f32_e32 v1, v0, v1531; GFX8-NEXT: v_trunc_f32_e32 v0, s8532; GFX8-NEXT: v_sub_f32_e32 v4, s8, v0533; GFX8-NEXT: v_cmp_ge_f32_e64 s[4:5], |v4|, 0.5534; GFX8-NEXT: v_cndmask_b32_e64 v4, 0, 1.0, s[4:5]535; GFX8-NEXT: v_mov_b32_e32 v5, s8536; GFX8-NEXT: v_bfi_b32 v4, s6, v4, v5537; GFX8-NEXT: v_add_f32_e32 v0, v0, v4538; GFX8-NEXT: v_trunc_f32_e32 v4, s15539; GFX8-NEXT: v_sub_f32_e32 v5, s15, v4540; GFX8-NEXT: v_cmp_ge_f32_e64 s[4:5], |v5|, 0.5541; GFX8-NEXT: v_cndmask_b32_e64 v5, 0, 1.0, s[4:5]542; GFX8-NEXT: v_mov_b32_e32 v6, s15543; GFX8-NEXT: v_bfi_b32 v5, s6, v5, v6544; GFX8-NEXT: v_add_f32_e32 v7, v4, v5545; GFX8-NEXT: v_trunc_f32_e32 v4, s14546; GFX8-NEXT: v_sub_f32_e32 v5, s14, v4547; GFX8-NEXT: v_cmp_ge_f32_e64 s[4:5], |v5|, 0.5548; GFX8-NEXT: v_cndmask_b32_e64 v5, 0, 1.0, s[4:5]549; GFX8-NEXT: v_mov_b32_e32 v6, s14550; GFX8-NEXT: v_bfi_b32 v5, s6, v5, v6551; GFX8-NEXT: v_add_f32_e32 v6, v4, v5552; GFX8-NEXT: v_trunc_f32_e32 v4, s13553; GFX8-NEXT: v_sub_f32_e32 v5, s13, v4554; GFX8-NEXT: v_cmp_ge_f32_e64 s[4:5], |v5|, 0.5555; GFX8-NEXT: v_cndmask_b32_e64 v5, 0, 1.0, s[4:5]556; GFX8-NEXT: v_mov_b32_e32 v8, s13557; GFX8-NEXT: v_bfi_b32 v5, s6, v5, v8558; GFX8-NEXT: v_add_f32_e32 v5, v4, v5559; GFX8-NEXT: v_trunc_f32_e32 v4, s12560; GFX8-NEXT: v_sub_f32_e32 v8, s12, v4561; GFX8-NEXT: v_cmp_ge_f32_e64 s[4:5], |v8|, 0.5562; GFX8-NEXT: v_cndmask_b32_e64 v8, 0, 1.0, s[4:5]563; GFX8-NEXT: v_mov_b32_e32 v9, s12564; GFX8-NEXT: v_bfi_b32 v8, s6, v8, v9565; GFX8-NEXT: v_add_f32_e32 v4, v4, v8566; GFX8-NEXT: buffer_store_dwordx4 v[4:7], off, s[0:3], 0 offset:16567; GFX8-NEXT: buffer_store_dwordx4 v[0:3], off, s[0:3], 0568; GFX8-NEXT: s_endpgm569;570; GFX9-LABEL: round_v8f32:571; GFX9: ; %bb.0:572; GFX9-NEXT: s_load_dwordx8 s[8:15], s[4:5], 0x44573; GFX9-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x24574; GFX9-NEXT: s_brev_b32 s6, -2575; GFX9-NEXT: s_mov_b32 s3, 0xf000576; GFX9-NEXT: s_mov_b32 s2, -1577; GFX9-NEXT: s_waitcnt lgkmcnt(0)578; GFX9-NEXT: v_trunc_f32_e32 v0, s11579; GFX9-NEXT: v_sub_f32_e32 v1, s11, v0580; GFX9-NEXT: v_cmp_ge_f32_e64 s[4:5], |v1|, 0.5581; GFX9-NEXT: v_cndmask_b32_e64 v1, 0, 1.0, s[4:5]582; GFX9-NEXT: v_mov_b32_e32 v2, s11583; GFX9-NEXT: v_bfi_b32 v1, s6, v1, v2584; GFX9-NEXT: v_add_f32_e32 v3, v0, v1585; GFX9-NEXT: v_trunc_f32_e32 v0, s10586; GFX9-NEXT: v_sub_f32_e32 v1, s10, v0587; GFX9-NEXT: v_cmp_ge_f32_e64 s[4:5], |v1|, 0.5588; GFX9-NEXT: v_cndmask_b32_e64 v1, 0, 1.0, s[4:5]589; GFX9-NEXT: v_mov_b32_e32 v2, s10590; GFX9-NEXT: v_bfi_b32 v1, s6, v1, v2591; GFX9-NEXT: v_add_f32_e32 v2, v0, v1592; GFX9-NEXT: v_trunc_f32_e32 v0, s9593; GFX9-NEXT: v_sub_f32_e32 v1, s9, v0594; GFX9-NEXT: v_cmp_ge_f32_e64 s[4:5], |v1|, 0.5595; GFX9-NEXT: v_cndmask_b32_e64 v1, 0, 1.0, s[4:5]596; GFX9-NEXT: v_mov_b32_e32 v4, s9597; GFX9-NEXT: v_bfi_b32 v1, s6, v1, v4598; GFX9-NEXT: v_add_f32_e32 v1, v0, v1599; GFX9-NEXT: v_trunc_f32_e32 v0, s8600; GFX9-NEXT: v_sub_f32_e32 v4, s8, v0601; GFX9-NEXT: v_cmp_ge_f32_e64 s[4:5], |v4|, 0.5602; GFX9-NEXT: v_cndmask_b32_e64 v4, 0, 1.0, s[4:5]603; GFX9-NEXT: v_mov_b32_e32 v5, s8604; GFX9-NEXT: v_bfi_b32 v4, s6, v4, v5605; GFX9-NEXT: v_add_f32_e32 v0, v0, v4606; GFX9-NEXT: v_trunc_f32_e32 v4, s15607; GFX9-NEXT: v_sub_f32_e32 v5, s15, v4608; GFX9-NEXT: v_cmp_ge_f32_e64 s[4:5], |v5|, 0.5609; GFX9-NEXT: v_cndmask_b32_e64 v5, 0, 1.0, s[4:5]610; GFX9-NEXT: v_mov_b32_e32 v6, s15611; GFX9-NEXT: v_bfi_b32 v5, s6, v5, v6612; GFX9-NEXT: v_add_f32_e32 v7, v4, v5613; GFX9-NEXT: v_trunc_f32_e32 v4, s14614; GFX9-NEXT: v_sub_f32_e32 v5, s14, v4615; GFX9-NEXT: v_cmp_ge_f32_e64 s[4:5], |v5|, 0.5616; GFX9-NEXT: v_cndmask_b32_e64 v5, 0, 1.0, s[4:5]617; GFX9-NEXT: v_mov_b32_e32 v6, s14618; GFX9-NEXT: v_bfi_b32 v5, s6, v5, v6619; GFX9-NEXT: v_add_f32_e32 v6, v4, v5620; GFX9-NEXT: v_trunc_f32_e32 v4, s13621; GFX9-NEXT: v_sub_f32_e32 v5, s13, v4622; GFX9-NEXT: v_cmp_ge_f32_e64 s[4:5], |v5|, 0.5623; GFX9-NEXT: v_cndmask_b32_e64 v5, 0, 1.0, s[4:5]624; GFX9-NEXT: v_mov_b32_e32 v8, s13625; GFX9-NEXT: v_bfi_b32 v5, s6, v5, v8626; GFX9-NEXT: v_add_f32_e32 v5, v4, v5627; GFX9-NEXT: v_trunc_f32_e32 v4, s12628; GFX9-NEXT: v_sub_f32_e32 v8, s12, v4629; GFX9-NEXT: v_cmp_ge_f32_e64 s[4:5], |v8|, 0.5630; GFX9-NEXT: v_cndmask_b32_e64 v8, 0, 1.0, s[4:5]631; GFX9-NEXT: v_mov_b32_e32 v9, s12632; GFX9-NEXT: v_bfi_b32 v8, s6, v8, v9633; GFX9-NEXT: v_add_f32_e32 v4, v4, v8634; GFX9-NEXT: buffer_store_dwordx4 v[4:7], off, s[0:3], 0 offset:16635; GFX9-NEXT: buffer_store_dwordx4 v[0:3], off, s[0:3], 0636; GFX9-NEXT: s_endpgm637;638; GFX11-LABEL: round_v8f32:639; GFX11: ; %bb.0:640; GFX11-NEXT: s_clause 0x1641; GFX11-NEXT: s_load_b256 s[8:15], s[4:5], 0x44642; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x24643; GFX11-NEXT: s_mov_b32 s3, 0x31016000644; GFX11-NEXT: s_waitcnt lgkmcnt(0)645; GFX11-NEXT: v_trunc_f32_e32 v0, s11646; GFX11-NEXT: v_trunc_f32_e32 v1, s10647; GFX11-NEXT: v_trunc_f32_e32 v4, s9648; GFX11-NEXT: v_trunc_f32_e32 v8, s8649; GFX11-NEXT: v_trunc_f32_e32 v5, s15650; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4)651; GFX11-NEXT: v_dual_sub_f32 v2, s11, v0 :: v_dual_sub_f32 v3, s10, v1652; GFX11-NEXT: v_sub_f32_e32 v7, s9, v4653; GFX11-NEXT: v_trunc_f32_e32 v9, s13654; GFX11-NEXT: v_sub_f32_e32 v11, s8, v8655; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_4)656; GFX11-NEXT: v_cmp_ge_f32_e64 s2, |v2|, 0.5657; GFX11-NEXT: v_sub_f32_e32 v12, s15, v5658; GFX11-NEXT: v_trunc_f32_e32 v6, s14659; GFX11-NEXT: v_sub_f32_e32 v14, s13, v9660; GFX11-NEXT: v_trunc_f32_e32 v10, s12661; GFX11-NEXT: v_cndmask_b32_e64 v2, 0, 1.0, s2662; GFX11-NEXT: v_cmp_ge_f32_e64 s2, |v3|, 0.5663; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)664; GFX11-NEXT: v_bfi_b32 v2, 0x7fffffff, v2, s11665; GFX11-NEXT: v_cndmask_b32_e64 v3, 0, 1.0, s2666; GFX11-NEXT: v_cmp_ge_f32_e64 s2, |v7|, 0.5667; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)668; GFX11-NEXT: v_bfi_b32 v16, 0x7fffffff, v3, s10669; GFX11-NEXT: v_cndmask_b32_e64 v7, 0, 1.0, s2670; GFX11-NEXT: v_cmp_ge_f32_e64 s2, |v11|, 0.5671; GFX11-NEXT: v_sub_f32_e32 v13, s14, v6672; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4)673; GFX11-NEXT: v_dual_add_f32 v3, v0, v2 :: v_dual_add_f32 v2, v1, v16674; GFX11-NEXT: v_bfi_b32 v7, 0x7fffffff, v7, s9675; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(SKIP_1) | instid1(VALU_DEP_3)676; GFX11-NEXT: v_cndmask_b32_e64 v11, 0, 1.0, s2677; GFX11-NEXT: v_cmp_ge_f32_e64 s2, |v12|, 0.5678; GFX11-NEXT: v_add_f32_e32 v1, v4, v7679; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_3)680; GFX11-NEXT: v_bfi_b32 v11, 0x7fffffff, v11, s8681; GFX11-NEXT: v_cndmask_b32_e64 v12, 0, 1.0, s2682; GFX11-NEXT: v_cmp_ge_f32_e64 s2, |v13|, 0.5683; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)684; GFX11-NEXT: v_bfi_b32 v12, 0x7fffffff, v12, s15685; GFX11-NEXT: v_cndmask_b32_e64 v13, 0, 1.0, s2686; GFX11-NEXT: v_cmp_ge_f32_e64 s2, |v14|, 0.5687; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_3)688; GFX11-NEXT: v_add_f32_e32 v7, v5, v12689; GFX11-NEXT: v_bfi_b32 v13, 0x7fffffff, v13, s14690; GFX11-NEXT: v_sub_f32_e32 v15, s12, v10691; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_3)692; GFX11-NEXT: v_cndmask_b32_e64 v14, 0, 1.0, s2693; GFX11-NEXT: v_add_f32_e32 v6, v6, v13694; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_3)695; GFX11-NEXT: v_cmp_ge_f32_e64 s2, |v15|, 0.5696; GFX11-NEXT: v_bfi_b32 v0, 0x7fffffff, v14, s13697; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)698; GFX11-NEXT: v_cndmask_b32_e64 v15, 0, 1.0, s2699; GFX11-NEXT: v_dual_add_f32 v5, v9, v0 :: v_dual_add_f32 v0, v8, v11700; GFX11-NEXT: s_mov_b32 s2, -1701; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)702; GFX11-NEXT: v_bfi_b32 v4, 0x7fffffff, v15, s12703; GFX11-NEXT: v_add_f32_e32 v4, v10, v4704; GFX11-NEXT: s_clause 0x1705; GFX11-NEXT: buffer_store_b128 v[4:7], off, s[0:3], 0 offset:16706; GFX11-NEXT: buffer_store_b128 v[0:3], off, s[0:3], 0707; GFX11-NEXT: s_endpgm708;709; R600-LABEL: round_v8f32:710; R600: ; %bb.0:711; R600-NEXT: ALU 50, @4, KC0[CB0:0-32], KC1[]712; R600-NEXT: MEM_RAT_CACHELESS STORE_RAW T0.XYZW, T2.X, 0713; R600-NEXT: MEM_RAT_CACHELESS STORE_RAW T3.XYZW, T1.X, 1714; R600-NEXT: CF_END715; R600-NEXT: ALU clause starting at 4:716; R600-NEXT: TRUNC * T0.W, KC0[6].X,717; R600-NEXT: ADD T0.Z, KC0[6].X, -PV.W,718; R600-NEXT: TRUNC * T1.W, KC0[5].X,719; R600-NEXT: TRUNC * T2.W, KC0[4].W,720; R600-NEXT: ADD T1.Z, KC0[4].W, -PV.W,721; R600-NEXT: ADD T3.W, KC0[5].X, -T1.W,722; R600-NEXT: SETGE * T4.W, |T0.Z|, 0.5,723; R600-NEXT: BFI_INT T0.Y, literal.x, PS, KC0[6].X,724; R600-NEXT: SETGE T0.Z, |PV.W|, 0.5,725; R600-NEXT: SETGE T3.W, |PV.Z|, 0.5,726; R600-NEXT: TRUNC * T4.W, KC0[5].Y,727; R600-NEXT: 2147483647(nan), 0(0.000000e+00)728; R600-NEXT: ADD T1.Y, KC0[5].Y, -PS,729; R600-NEXT: BFI_INT T1.Z, literal.x, PV.W, KC0[4].W,730; R600-NEXT: BFI_INT T3.W, literal.x, PV.Z, KC0[5].X,731; R600-NEXT: TRUNC * T5.W, KC0[4].Z,732; R600-NEXT: 2147483647(nan), 0(0.000000e+00)733; R600-NEXT: TRUNC T0.Z, KC0[4].Y,734; R600-NEXT: TRUNC * T6.W, KC0[5].W,735; R600-NEXT: ADD * T7.W, KC0[4].Z, -T5.W,736; R600-NEXT: TRUNC T0.X, KC0[5].Z,737; R600-NEXT: SETGE T2.Y, |PV.W|, 0.5,738; R600-NEXT: ADD T2.Z, KC0[5].W, -T6.W, BS:VEC_102/SCL_221739; R600-NEXT: ADD T7.W, KC0[4].Y, -T0.Z,740; R600-NEXT: ADD * T3.W, T1.W, T3.W,741; R600-NEXT: SETGE T1.X, |PV.W|, 0.5,742; R600-NEXT: SETGE T4.Y, |PV.Z|, 0.5,743; R600-NEXT: ADD T3.Z, T2.W, T1.Z,744; R600-NEXT: BFI_INT T1.W, literal.x, PV.Y, KC0[4].Z,745; R600-NEXT: ADD * T2.W, KC0[5].Z, -PV.X,746; R600-NEXT: 2147483647(nan), 0(0.000000e+00)747; R600-NEXT: SETGE T2.X, |PS|, 0.5,748; R600-NEXT: ADD T3.Y, T5.W, PV.W,749; R600-NEXT: BFI_INT T1.Z, literal.x, PV.Y, KC0[5].W,750; R600-NEXT: BFI_INT T1.W, literal.x, PV.X, KC0[4].Y,751; R600-NEXT: ADD * T0.W, T0.W, T0.Y,752; R600-NEXT: 2147483647(nan), 0(0.000000e+00)753; R600-NEXT: ADD T3.X, T0.Z, PV.W,754; R600-NEXT: ADD T0.Z, T6.W, PV.Z,755; R600-NEXT: BFI_INT T1.W, literal.x, PV.X, KC0[5].Z,756; R600-NEXT: SETGE * T2.W, |T1.Y|, 0.5,757; R600-NEXT: 2147483647(nan), 0(0.000000e+00)758; R600-NEXT: LSHR T1.X, KC0[2].Y, literal.x,759; R600-NEXT: ADD T0.Y, T0.X, PV.W,760; R600-NEXT: BFI_INT * T1.W, literal.y, PS, KC0[5].Y,761; R600-NEXT: 2(2.802597e-45), 2147483647(nan)762; R600-NEXT: ADD T0.X, T4.W, PV.W,763; R600-NEXT: ADD_INT * T1.W, KC0[2].Y, literal.x,764; R600-NEXT: 16(2.242078e-44), 0(0.000000e+00)765; R600-NEXT: LSHR * T2.X, PV.W, literal.x,766; R600-NEXT: 2(2.802597e-45), 0(0.000000e+00)767 %result = call <8 x float> @llvm.round.v8f32(<8 x float> %in) #1768 store <8 x float> %result, ptr addrspace(1) %out769 ret void770}771 772define amdgpu_kernel void @round_f16(ptr addrspace(1) %out, i32 %x.arg) #0 {773; GFX6-LABEL: round_f16:774; GFX6: ; %bb.0:775; GFX6-NEXT: s_load_dword s0, s[4:5], 0xb776; GFX6-NEXT: s_waitcnt lgkmcnt(0)777; GFX6-NEXT: v_cvt_f32_f16_e32 v0, s0778; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x9779; GFX6-NEXT: v_trunc_f32_e32 v1, v0780; GFX6-NEXT: v_sub_f32_e32 v2, v0, v1781; GFX6-NEXT: v_cmp_ge_f32_e64 s[2:3], |v2|, 0.5782; GFX6-NEXT: v_cndmask_b32_e64 v2, 0, 1.0, s[2:3]783; GFX6-NEXT: s_brev_b32 s2, -2784; GFX6-NEXT: v_bfi_b32 v0, s2, v2, v0785; GFX6-NEXT: v_add_f32_e32 v0, v1, v0786; GFX6-NEXT: v_cvt_f16_f32_e32 v0, v0787; GFX6-NEXT: s_mov_b32 s3, 0xf000788; GFX6-NEXT: s_mov_b32 s2, -1789; GFX6-NEXT: s_waitcnt lgkmcnt(0)790; GFX6-NEXT: buffer_store_short v0, off, s[0:3], 0791; GFX6-NEXT: s_endpgm792;793; GFX8-LABEL: round_f16:794; GFX8: ; %bb.0:795; GFX8-NEXT: s_load_dword s6, s[4:5], 0x2c796; GFX8-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x24797; GFX8-NEXT: v_mov_b32_e32 v0, 0x3c00798; GFX8-NEXT: s_movk_i32 s4, 0x7fff799; GFX8-NEXT: s_mov_b32 s3, 0xf000800; GFX8-NEXT: s_waitcnt lgkmcnt(0)801; GFX8-NEXT: v_trunc_f16_e32 v1, s6802; GFX8-NEXT: v_sub_f16_e32 v2, s6, v1803; GFX8-NEXT: v_cmp_ge_f16_e64 vcc, |v2|, 0.5804; GFX8-NEXT: v_cndmask_b32_e32 v0, 0, v0, vcc805; GFX8-NEXT: v_mov_b32_e32 v2, s6806; GFX8-NEXT: v_bfi_b32 v0, s4, v0, v2807; GFX8-NEXT: s_mov_b32 s2, -1808; GFX8-NEXT: v_add_f16_e32 v0, v1, v0809; GFX8-NEXT: buffer_store_short v0, off, s[0:3], 0810; GFX8-NEXT: s_endpgm811;812; GFX9-LABEL: round_f16:813; GFX9: ; %bb.0:814; GFX9-NEXT: s_load_dword s6, s[4:5], 0x2c815; GFX9-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x24816; GFX9-NEXT: v_mov_b32_e32 v0, 0x3c00817; GFX9-NEXT: s_movk_i32 s4, 0x7fff818; GFX9-NEXT: s_mov_b32 s3, 0xf000819; GFX9-NEXT: s_waitcnt lgkmcnt(0)820; GFX9-NEXT: v_trunc_f16_e32 v1, s6821; GFX9-NEXT: v_sub_f16_e32 v2, s6, v1822; GFX9-NEXT: v_cmp_ge_f16_e64 vcc, |v2|, 0.5823; GFX9-NEXT: v_cndmask_b32_e32 v0, 0, v0, vcc824; GFX9-NEXT: v_mov_b32_e32 v2, s6825; GFX9-NEXT: v_bfi_b32 v0, s4, v0, v2826; GFX9-NEXT: s_mov_b32 s2, -1827; GFX9-NEXT: v_add_f16_e32 v0, v1, v0828; GFX9-NEXT: buffer_store_short v0, off, s[0:3], 0829; GFX9-NEXT: s_endpgm830;831; GFX11-TRUE16-LABEL: round_f16:832; GFX11-TRUE16: ; %bb.0:833; GFX11-TRUE16-NEXT: s_clause 0x1834; GFX11-TRUE16-NEXT: s_load_b32 s2, s[4:5], 0x2c835; GFX11-TRUE16-NEXT: s_load_b64 s[0:1], s[4:5], 0x24836; GFX11-TRUE16-NEXT: s_waitcnt lgkmcnt(0)837; GFX11-TRUE16-NEXT: v_trunc_f16_e32 v0.l, s2838; GFX11-TRUE16-NEXT: v_mov_b16_e32 v1.l, s2839; GFX11-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_1)840; GFX11-TRUE16-NEXT: v_sub_f16_e32 v0.h, s2, v0.l841; GFX11-TRUE16-NEXT: s_mov_b32 s2, -1842; GFX11-TRUE16-NEXT: v_cmp_ge_f16_e64 s3, |v0.h|, 0.5843; GFX11-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_1)844; GFX11-TRUE16-NEXT: v_cndmask_b16 v2.l, 0, 0x3c00, s3845; GFX11-TRUE16-NEXT: s_mov_b32 s3, 0x31016000846; GFX11-TRUE16-NEXT: v_bfi_b32 v1, 0x7fff, v2, v1847; GFX11-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1)848; GFX11-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v1.l849; GFX11-TRUE16-NEXT: buffer_store_b16 v0, off, s[0:3], 0850; GFX11-TRUE16-NEXT: s_endpgm851;852; GFX11-FAKE16-LABEL: round_f16:853; GFX11-FAKE16: ; %bb.0:854; GFX11-FAKE16-NEXT: s_clause 0x1855; GFX11-FAKE16-NEXT: s_load_b32 s2, s[4:5], 0x2c856; GFX11-FAKE16-NEXT: s_load_b64 s[0:1], s[4:5], 0x24857; GFX11-FAKE16-NEXT: s_waitcnt lgkmcnt(0)858; GFX11-FAKE16-NEXT: v_trunc_f16_e32 v0, s2859; GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)860; GFX11-FAKE16-NEXT: v_sub_f16_e32 v1, s2, v0861; GFX11-FAKE16-NEXT: v_cmp_ge_f16_e64 s3, |v1|, 0.5862; GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_1)863; GFX11-FAKE16-NEXT: v_cndmask_b32_e64 v1, 0, 0x3c00, s3864; GFX11-FAKE16-NEXT: s_mov_b32 s3, 0x31016000865; GFX11-FAKE16-NEXT: v_bfi_b32 v1, 0x7fff, v1, s2866; GFX11-FAKE16-NEXT: s_mov_b32 s2, -1867; GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1)868; GFX11-FAKE16-NEXT: v_add_f16_e32 v0, v0, v1869; GFX11-FAKE16-NEXT: buffer_store_b16 v0, off, s[0:3], 0870; GFX11-FAKE16-NEXT: s_endpgm871;872; R600-LABEL: round_f16:873; R600: ; %bb.0:874; R600-NEXT: ALU 17, @4, KC0[CB0:0-32], KC1[]875; R600-NEXT: MEM_RAT MSKOR T0.XW, T1.X876; R600-NEXT: CF_END877; R600-NEXT: PAD878; R600-NEXT: ALU clause starting at 4:879; R600-NEXT: FLT16_TO_FLT32 * T0.W, KC0[2].Z,880; R600-NEXT: TRUNC * T1.W, PV.W,881; R600-NEXT: ADD * T2.W, T0.W, -PV.W,882; R600-NEXT: SETGE * T2.W, |PV.W|, 0.5,883; R600-NEXT: BFI_INT T0.W, literal.x, PV.W, T0.W,884; R600-NEXT: AND_INT * T2.W, KC0[2].Y, literal.y,885; R600-NEXT: 2147483647(nan), 3(4.203895e-45)886; R600-NEXT: ADD * T0.W, T1.W, PV.W,887; R600-NEXT: FLT32_TO_FLT16 T0.W, PV.W,888; R600-NEXT: LSHL * T1.W, T2.W, literal.x,889; R600-NEXT: 3(4.203895e-45), 0(0.000000e+00)890; R600-NEXT: LSHL T0.X, PV.W, PS,891; R600-NEXT: LSHL * T0.W, literal.x, PS,892; R600-NEXT: 65535(9.183409e-41), 0(0.000000e+00)893; R600-NEXT: MOV T0.Y, 0.0,894; R600-NEXT: MOV * T0.Z, 0.0,895; R600-NEXT: LSHR * T1.X, KC0[2].Y, literal.x,896; R600-NEXT: 2(2.802597e-45), 0(0.000000e+00)897 %x.arg.trunc = trunc i32 %x.arg to i16898 %x = bitcast i16 %x.arg.trunc to half899 %result = call half @llvm.round.f16(half %x) #1900 store half %result, ptr addrspace(1) %out901 ret void902}903 904; Should be scalarized905define amdgpu_kernel void @round_v2f16(ptr addrspace(1) %out, i32 %in.arg) #0 {906; GFX6-LABEL: round_v2f16:907; GFX6: ; %bb.0:908; GFX6-NEXT: s_load_dword s0, s[4:5], 0xb909; GFX6-NEXT: s_waitcnt lgkmcnt(0)910; GFX6-NEXT: s_lshr_b32 s1, s0, 16911; GFX6-NEXT: v_cvt_f32_f16_e32 v1, s1912; GFX6-NEXT: v_cvt_f32_f16_e32 v0, s0913; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x9914; GFX6-NEXT: s_brev_b32 s4, -2915; GFX6-NEXT: v_trunc_f32_e32 v3, v1916; GFX6-NEXT: v_sub_f32_e32 v5, v1, v3917; GFX6-NEXT: v_trunc_f32_e32 v2, v0918; GFX6-NEXT: v_cmp_ge_f32_e64 s[2:3], |v5|, 0.5919; GFX6-NEXT: v_sub_f32_e32 v4, v0, v2920; GFX6-NEXT: v_cndmask_b32_e64 v5, 0, 1.0, s[2:3]921; GFX6-NEXT: v_bfi_b32 v1, s4, v5, v1922; GFX6-NEXT: v_cmp_ge_f32_e64 s[2:3], |v4|, 0.5923; GFX6-NEXT: v_add_f32_e32 v1, v3, v1924; GFX6-NEXT: v_cndmask_b32_e64 v3, 0, 1.0, s[2:3]925; GFX6-NEXT: v_bfi_b32 v0, s4, v3, v0926; GFX6-NEXT: v_cvt_f16_f32_e32 v1, v1927; GFX6-NEXT: v_add_f32_e32 v0, v2, v0928; GFX6-NEXT: v_cvt_f16_f32_e32 v0, v0929; GFX6-NEXT: s_mov_b32 s3, 0xf000930; GFX6-NEXT: v_lshlrev_b32_e32 v1, 16, v1931; GFX6-NEXT: s_mov_b32 s2, -1932; GFX6-NEXT: v_or_b32_e32 v0, v0, v1933; GFX6-NEXT: s_waitcnt lgkmcnt(0)934; GFX6-NEXT: buffer_store_dword v0, off, s[0:3], 0935; GFX6-NEXT: s_endpgm936;937; GFX8-LABEL: round_v2f16:938; GFX8: ; %bb.0:939; GFX8-NEXT: s_load_dword s6, s[4:5], 0x2c940; GFX8-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x24941; GFX8-NEXT: v_mov_b32_e32 v0, 0x3c00942; GFX8-NEXT: s_movk_i32 s5, 0x7fff943; GFX8-NEXT: s_mov_b32 s3, 0xf000944; GFX8-NEXT: s_waitcnt lgkmcnt(0)945; GFX8-NEXT: s_lshr_b32 s4, s6, 16946; GFX8-NEXT: v_trunc_f16_e32 v1, s4947; GFX8-NEXT: v_sub_f16_e32 v2, s4, v1948; GFX8-NEXT: v_cmp_ge_f16_e64 vcc, |v2|, 0.5949; GFX8-NEXT: v_cndmask_b32_e32 v2, 0, v0, vcc950; GFX8-NEXT: v_mov_b32_e32 v3, s4951; GFX8-NEXT: v_bfi_b32 v2, s5, v2, v3952; GFX8-NEXT: v_add_f16_sdwa v1, v1, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD953; GFX8-NEXT: v_trunc_f16_e32 v2, s6954; GFX8-NEXT: v_sub_f16_e32 v3, s6, v2955; GFX8-NEXT: v_cmp_ge_f16_e64 vcc, |v3|, 0.5956; GFX8-NEXT: v_cndmask_b32_e32 v0, 0, v0, vcc957; GFX8-NEXT: v_mov_b32_e32 v3, s6958; GFX8-NEXT: v_bfi_b32 v0, s5, v0, v3959; GFX8-NEXT: v_add_f16_e32 v0, v2, v0960; GFX8-NEXT: s_mov_b32 s2, -1961; GFX8-NEXT: v_or_b32_e32 v0, v0, v1962; GFX8-NEXT: buffer_store_dword v0, off, s[0:3], 0963; GFX8-NEXT: s_endpgm964;965; GFX9-LABEL: round_v2f16:966; GFX9: ; %bb.0:967; GFX9-NEXT: s_load_dword s6, s[4:5], 0x2c968; GFX9-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x24969; GFX9-NEXT: v_mov_b32_e32 v0, 0x3c00970; GFX9-NEXT: s_movk_i32 s5, 0x7fff971; GFX9-NEXT: s_mov_b32 s3, 0xf000972; GFX9-NEXT: s_waitcnt lgkmcnt(0)973; GFX9-NEXT: s_lshr_b32 s4, s6, 16974; GFX9-NEXT: v_trunc_f16_e32 v1, s4975; GFX9-NEXT: v_sub_f16_e32 v2, s4, v1976; GFX9-NEXT: v_cmp_ge_f16_e64 vcc, |v2|, 0.5977; GFX9-NEXT: v_cndmask_b32_e32 v2, 0, v0, vcc978; GFX9-NEXT: v_mov_b32_e32 v3, s4979; GFX9-NEXT: v_bfi_b32 v2, s5, v2, v3980; GFX9-NEXT: v_add_f16_e32 v1, v1, v2981; GFX9-NEXT: v_trunc_f16_e32 v2, s6982; GFX9-NEXT: v_sub_f16_e32 v3, s6, v2983; GFX9-NEXT: v_cmp_ge_f16_e64 vcc, |v3|, 0.5984; GFX9-NEXT: v_cndmask_b32_e32 v0, 0, v0, vcc985; GFX9-NEXT: v_mov_b32_e32 v3, s6986; GFX9-NEXT: v_bfi_b32 v0, s5, v0, v3987; GFX9-NEXT: v_add_f16_e32 v0, v2, v0988; GFX9-NEXT: s_mov_b32 s2, -1989; GFX9-NEXT: v_pack_b32_f16 v0, v0, v1990; GFX9-NEXT: buffer_store_dword v0, off, s[0:3], 0991; GFX9-NEXT: s_endpgm992;993; GFX11-TRUE16-LABEL: round_v2f16:994; GFX11-TRUE16: ; %bb.0:995; GFX11-TRUE16-NEXT: s_clause 0x1996; GFX11-TRUE16-NEXT: s_load_b32 s2, s[4:5], 0x2c997; GFX11-TRUE16-NEXT: s_load_b64 s[0:1], s[4:5], 0x24998; GFX11-TRUE16-NEXT: s_waitcnt lgkmcnt(0)999; GFX11-TRUE16-NEXT: s_lshr_b32 s3, s2, 161000; GFX11-TRUE16-NEXT: v_trunc_f16_e32 v0.l, s21001; GFX11-TRUE16-NEXT: v_trunc_f16_e32 v0.h, s31002; GFX11-TRUE16-NEXT: v_mov_b16_e32 v4.l, s31003; GFX11-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_3)1004; GFX11-TRUE16-NEXT: v_sub_f16_e32 v1.l, s2, v0.l1005; GFX11-TRUE16-NEXT: v_sub_f16_e32 v1.h, s3, v0.h1006; GFX11-TRUE16-NEXT: s_mov_b32 s3, 0x310160001007; GFX11-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)1008; GFX11-TRUE16-NEXT: v_cmp_ge_f16_e64 s6, |v1.l|, 0.51009; GFX11-TRUE16-NEXT: v_cmp_ge_f16_e64 s7, |v1.h|, 0.51010; GFX11-TRUE16-NEXT: v_mov_b16_e32 v1.l, s21011; GFX11-TRUE16-NEXT: s_mov_b32 s2, -11012; GFX11-TRUE16-NEXT: v_cndmask_b16 v2.l, 0, 0x3c00, s61013; GFX11-TRUE16-NEXT: v_cndmask_b16 v3.l, 0, 0x3c00, s71014; GFX11-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)1015; GFX11-TRUE16-NEXT: v_bfi_b32 v1, 0x7fff, v2, v11016; GFX11-TRUE16-NEXT: v_bfi_b32 v2, 0x7fff, v3, v41017; GFX11-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)1018; GFX11-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v1.l1019; GFX11-TRUE16-NEXT: v_add_f16_e32 v0.h, v0.h, v2.l1020; GFX11-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1)1021; GFX11-TRUE16-NEXT: v_pack_b32_f16 v0, v0.l, v0.h1022; GFX11-TRUE16-NEXT: buffer_store_b32 v0, off, s[0:3], 01023; GFX11-TRUE16-NEXT: s_endpgm1024;1025; GFX11-FAKE16-LABEL: round_v2f16:1026; GFX11-FAKE16: ; %bb.0:1027; GFX11-FAKE16-NEXT: s_clause 0x11028; GFX11-FAKE16-NEXT: s_load_b32 s2, s[4:5], 0x2c1029; GFX11-FAKE16-NEXT: s_load_b64 s[0:1], s[4:5], 0x241030; GFX11-FAKE16-NEXT: s_waitcnt lgkmcnt(0)1031; GFX11-FAKE16-NEXT: s_lshr_b32 s3, s2, 161032; GFX11-FAKE16-NEXT: v_trunc_f16_e32 v1, s21033; GFX11-FAKE16-NEXT: v_trunc_f16_e32 v0, s31034; GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)1035; GFX11-FAKE16-NEXT: v_sub_f16_e32 v3, s2, v11036; GFX11-FAKE16-NEXT: v_sub_f16_e32 v2, s3, v01037; GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)1038; GFX11-FAKE16-NEXT: v_cmp_ge_f16_e64 s4, |v2|, 0.51039; GFX11-FAKE16-NEXT: v_cndmask_b32_e64 v2, 0, 0x3c00, s41040; GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_2)1041; GFX11-FAKE16-NEXT: v_cmp_ge_f16_e64 s4, |v3|, 0.51042; GFX11-FAKE16-NEXT: v_bfi_b32 v2, 0x7fff, v2, s31043; GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2)1044; GFX11-FAKE16-NEXT: v_cndmask_b32_e64 v3, 0, 0x3c00, s41045; GFX11-FAKE16-NEXT: s_mov_b32 s3, 0x310160001046; GFX11-FAKE16-NEXT: v_add_f16_e32 v0, v0, v21047; GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_1)1048; GFX11-FAKE16-NEXT: v_bfi_b32 v3, 0x7fff, v3, s21049; GFX11-FAKE16-NEXT: s_mov_b32 s2, -11050; GFX11-FAKE16-NEXT: v_add_f16_e32 v1, v1, v31051; GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1)1052; GFX11-FAKE16-NEXT: v_pack_b32_f16 v0, v1, v01053; GFX11-FAKE16-NEXT: buffer_store_b32 v0, off, s[0:3], 01054; GFX11-FAKE16-NEXT: s_endpgm1055;1056; R600-LABEL: round_v2f16:1057; R600: ; %bb.0:1058; R600-NEXT: ALU 22, @4, KC0[CB0:0-32], KC1[]1059; R600-NEXT: MEM_RAT_CACHELESS STORE_RAW T0.X, T1.X, 11060; R600-NEXT: CF_END1061; R600-NEXT: PAD1062; R600-NEXT: ALU clause starting at 4:1063; R600-NEXT: LSHR * T0.W, KC0[2].Z, literal.x,1064; R600-NEXT: 16(2.242078e-44), 0(0.000000e+00)1065; R600-NEXT: FLT16_TO_FLT32 * T0.W, PV.W,1066; R600-NEXT: FLT16_TO_FLT32 T1.W, KC0[2].Z,1067; R600-NEXT: TRUNC * T2.W, PV.W,1068; R600-NEXT: ADD T3.W, T0.W, -PS,1069; R600-NEXT: TRUNC * T4.W, PV.W,1070; R600-NEXT: ADD T5.W, T1.W, -PS,1071; R600-NEXT: SETGE * T3.W, |PV.W|, 0.5,1072; R600-NEXT: BFI_INT T0.W, literal.x, PS, T0.W,1073; R600-NEXT: SETGE * T3.W, |PV.W|, 0.5,1074; R600-NEXT: 2147483647(nan), 0(0.000000e+00)1075; R600-NEXT: BFI_INT T1.W, literal.x, PS, T1.W, BS:VEC_021/SCL_1221076; R600-NEXT: ADD * T0.W, T2.W, PV.W,1077; R600-NEXT: 2147483647(nan), 0(0.000000e+00)1078; R600-NEXT: FLT32_TO_FLT16 T0.W, PS,1079; R600-NEXT: ADD * T1.W, T4.W, PV.W,1080; R600-NEXT: FLT32_TO_FLT16 T1.W, PS,1081; R600-NEXT: LSHL * T0.W, PV.W, literal.x,1082; R600-NEXT: 16(2.242078e-44), 0(0.000000e+00)1083; R600-NEXT: OR_INT T0.X, PV.W, PS,1084; R600-NEXT: LSHR * T1.X, KC0[2].Y, literal.x,1085; R600-NEXT: 2(2.802597e-45), 0(0.000000e+00)1086 %in = bitcast i32 %in.arg to <2 x half>1087 %result = call <2 x half> @llvm.round.v2f16(<2 x half> %in)1088 store <2 x half> %result, ptr addrspace(1) %out1089 ret void1090}1091 1092declare float @llvm.round.f32(float) #11093declare <2 x float> @llvm.round.v2f32(<2 x float>) #11094declare <4 x float> @llvm.round.v4f32(<4 x float>) #11095declare <8 x float> @llvm.round.v8f32(<8 x float>) #11096 1097declare half @llvm.round.f16(half) #11098declare <2 x half> @llvm.round.v2f16(<2 x half>) #11099declare <4 x half> @llvm.round.v4f16(<4 x half>) #11100declare <8 x half> @llvm.round.v8f16(<8 x half>) #11101 1102attributes #0 = { nounwind }1103attributes #1 = { nounwind readnone }1104