297 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 62; RUN: llc -mtriple=amdgcn -mcpu=gfx600 < %s | FileCheck -check-prefix=GFX6 %s3; RUN: llc -mtriple=amdgcn -mcpu=gfx900 < %s | FileCheck -check-prefix=GFX9 %s4 5define amdgpu_kernel void @fptoui_f32_to_i16_to_f32(ptr addrspace(1) %out, float %x) {6; GFX6-LABEL: fptoui_f32_to_i16_to_f32:7; GFX6: ; %bb.0: ; %entry8; GFX6-NEXT: s_load_dword s6, s[4:5], 0xb9; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x910; GFX6-NEXT: s_mov_b32 s3, 0xf00011; GFX6-NEXT: s_mov_b32 s2, -112; GFX6-NEXT: s_waitcnt lgkmcnt(0)13; GFX6-NEXT: v_trunc_f32_e64 v0, |s6|14; GFX6-NEXT: buffer_store_dword v0, off, s[0:3], 015; GFX6-NEXT: s_endpgm16;17; GFX9-LABEL: fptoui_f32_to_i16_to_f32:18; GFX9: ; %bb.0: ; %entry19; GFX9-NEXT: s_load_dword s2, s[4:5], 0x2c20; GFX9-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x2421; GFX9-NEXT: v_mov_b32_e32 v0, 022; GFX9-NEXT: s_waitcnt lgkmcnt(0)23; GFX9-NEXT: v_trunc_f32_e64 v1, |s2|24; GFX9-NEXT: global_store_dword v0, v1, s[0:1]25; GFX9-NEXT: s_endpgm26entry:27 %ui = fptoui float %x to i1628 %fp = uitofp i16 %ui to float29 store float %fp, ptr addrspace(1) %out30 ret void31}32 33define amdgpu_kernel void @fptoui_f32_to_i32_to_f32(ptr addrspace(1) %out, float %x) {34; GFX6-LABEL: fptoui_f32_to_i32_to_f32:35; GFX6: ; %bb.0: ; %entry36; GFX6-NEXT: s_load_dword s6, s[4:5], 0xb37; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x938; GFX6-NEXT: s_mov_b32 s3, 0xf00039; GFX6-NEXT: s_mov_b32 s2, -140; GFX6-NEXT: s_waitcnt lgkmcnt(0)41; GFX6-NEXT: v_trunc_f32_e64 v0, |s6|42; GFX6-NEXT: buffer_store_dword v0, off, s[0:3], 043; GFX6-NEXT: s_endpgm44;45; GFX9-LABEL: fptoui_f32_to_i32_to_f32:46; GFX9: ; %bb.0: ; %entry47; GFX9-NEXT: s_load_dword s2, s[4:5], 0x2c48; GFX9-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x2449; GFX9-NEXT: v_mov_b32_e32 v0, 050; GFX9-NEXT: s_waitcnt lgkmcnt(0)51; GFX9-NEXT: v_trunc_f32_e64 v1, |s2|52; GFX9-NEXT: global_store_dword v0, v1, s[0:1]53; GFX9-NEXT: s_endpgm54entry:55 %ui = fptoui float %x to i3256 %fp = uitofp i32 %ui to float57 store float %fp, ptr addrspace(1) %out58 ret void59}60 61define amdgpu_kernel void @fptoui_f32_to_i64_to_f32(ptr addrspace(1) %out, float %x) {62; GFX6-LABEL: fptoui_f32_to_i64_to_f32:63; GFX6: ; %bb.0: ; %entry64; GFX6-NEXT: s_load_dword s6, s[4:5], 0xb65; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x966; GFX6-NEXT: s_mov_b32 s3, 0xf00067; GFX6-NEXT: s_mov_b32 s2, -168; GFX6-NEXT: s_waitcnt lgkmcnt(0)69; GFX6-NEXT: v_trunc_f32_e64 v0, |s6|70; GFX6-NEXT: buffer_store_dword v0, off, s[0:3], 071; GFX6-NEXT: s_endpgm72;73; GFX9-LABEL: fptoui_f32_to_i64_to_f32:74; GFX9: ; %bb.0: ; %entry75; GFX9-NEXT: s_load_dword s2, s[4:5], 0x2c76; GFX9-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x2477; GFX9-NEXT: v_mov_b32_e32 v0, 078; GFX9-NEXT: s_waitcnt lgkmcnt(0)79; GFX9-NEXT: v_trunc_f32_e64 v1, |s2|80; GFX9-NEXT: global_store_dword v0, v1, s[0:1]81; GFX9-NEXT: s_endpgm82entry:83 %ui = fptoui float %x to i6484 %fp = uitofp i64 %ui to float85 store float %fp, ptr addrspace(1) %out86 ret void87}88 89define amdgpu_kernel void @fptoui_f16_to_i16_to_f16(ptr addrspace(1) %out, half %x) {90; GFX6-LABEL: fptoui_f16_to_i16_to_f16:91; GFX6: ; %bb.0: ; %entry92; GFX6-NEXT: s_load_dword s0, s[4:5], 0xb93; GFX6-NEXT: s_mov_b32 s3, 0xf00094; GFX6-NEXT: s_mov_b32 s2, -195; GFX6-NEXT: s_waitcnt lgkmcnt(0)96; GFX6-NEXT: v_cvt_f32_f16_e32 v0, s097; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x998; GFX6-NEXT: v_cvt_u32_f32_e32 v0, v099; GFX6-NEXT: v_cvt_f32_u32_e32 v0, v0100; GFX6-NEXT: v_cvt_f16_f32_e32 v0, v0101; GFX6-NEXT: s_waitcnt lgkmcnt(0)102; GFX6-NEXT: buffer_store_short v0, off, s[0:3], 0103; GFX6-NEXT: s_endpgm104;105; GFX9-LABEL: fptoui_f16_to_i16_to_f16:106; GFX9: ; %bb.0: ; %entry107; GFX9-NEXT: s_load_dword s2, s[4:5], 0x2c108; GFX9-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x24109; GFX9-NEXT: v_mov_b32_e32 v0, 0110; GFX9-NEXT: s_waitcnt lgkmcnt(0)111; GFX9-NEXT: v_trunc_f16_e64 v1, |s2|112; GFX9-NEXT: global_store_short v0, v1, s[0:1]113; GFX9-NEXT: s_endpgm114entry:115 %ui = fptoui half %x to i16116 %fp = uitofp i16 %ui to half117 store half %fp, ptr addrspace(1) %out118 ret void119}120 121define amdgpu_kernel void @fptoui_f16_to_i32_to_f16(ptr addrspace(1) %out, half %x) {122; GFX6-LABEL: fptoui_f16_to_i32_to_f16:123; GFX6: ; %bb.0: ; %entry124; GFX6-NEXT: s_load_dword s0, s[4:5], 0xb125; GFX6-NEXT: s_mov_b32 s3, 0xf000126; GFX6-NEXT: s_mov_b32 s2, -1127; GFX6-NEXT: s_waitcnt lgkmcnt(0)128; GFX6-NEXT: v_cvt_f32_f16_e64 v0, |s0|129; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x9130; GFX6-NEXT: v_trunc_f32_e32 v0, v0131; GFX6-NEXT: v_cvt_f16_f32_e32 v0, v0132; GFX6-NEXT: s_waitcnt lgkmcnt(0)133; GFX6-NEXT: buffer_store_short v0, off, s[0:3], 0134; GFX6-NEXT: s_endpgm135;136; GFX9-LABEL: fptoui_f16_to_i32_to_f16:137; GFX9: ; %bb.0: ; %entry138; GFX9-NEXT: s_load_dword s2, s[4:5], 0x2c139; GFX9-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x24140; GFX9-NEXT: v_mov_b32_e32 v0, 0141; GFX9-NEXT: s_waitcnt lgkmcnt(0)142; GFX9-NEXT: v_trunc_f16_e64 v1, |s2|143; GFX9-NEXT: global_store_short v0, v1, s[0:1]144; GFX9-NEXT: s_endpgm145entry:146 %ui = fptoui half %x to i32147 %fp = uitofp i32 %ui to half148 store half %fp, ptr addrspace(1) %out149 ret void150}151 152define amdgpu_kernel void @fptoui_f16_to_i64_to_f16(ptr addrspace(1) %out, half %x) {153; GFX6-LABEL: fptoui_f16_to_i64_to_f16:154; GFX6: ; %bb.0: ; %entry155; GFX6-NEXT: s_load_dword s0, s[4:5], 0xb156; GFX6-NEXT: s_mov_b32 s3, 0xf000157; GFX6-NEXT: s_mov_b32 s2, -1158; GFX6-NEXT: s_waitcnt lgkmcnt(0)159; GFX6-NEXT: v_cvt_f32_f16_e64 v0, |s0|160; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x9161; GFX6-NEXT: v_trunc_f32_e32 v0, v0162; GFX6-NEXT: v_cvt_f16_f32_e32 v0, v0163; GFX6-NEXT: s_waitcnt lgkmcnt(0)164; GFX6-NEXT: buffer_store_short v0, off, s[0:3], 0165; GFX6-NEXT: s_endpgm166;167; GFX9-LABEL: fptoui_f16_to_i64_to_f16:168; GFX9: ; %bb.0: ; %entry169; GFX9-NEXT: s_load_dword s2, s[4:5], 0x2c170; GFX9-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x24171; GFX9-NEXT: v_mov_b32_e32 v0, 0172; GFX9-NEXT: s_waitcnt lgkmcnt(0)173; GFX9-NEXT: v_trunc_f16_e64 v1, |s2|174; GFX9-NEXT: global_store_short v0, v1, s[0:1]175; GFX9-NEXT: s_endpgm176entry:177 %ui = fptoui half %x to i64178 %fp = uitofp i64 %ui to half179 store half %fp, ptr addrspace(1) %out180 ret void181}182 183define amdgpu_kernel void @fptoui_f64_to_i16_to_f64(ptr addrspace(1) %out, double %x) {184; GFX6-LABEL: fptoui_f64_to_i16_to_f64:185; GFX6: ; %bb.0: ; %entry186; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9187; GFX6-NEXT: s_waitcnt lgkmcnt(0)188; GFX6-NEXT: v_cvt_u32_f64_e32 v0, s[2:3]189; GFX6-NEXT: s_mov_b32 s3, 0xf000190; GFX6-NEXT: s_mov_b32 s2, -1191; GFX6-NEXT: v_cvt_f64_u32_e32 v[0:1], v0192; GFX6-NEXT: buffer_store_dwordx2 v[0:1], off, s[0:3], 0193; GFX6-NEXT: s_endpgm194;195; GFX9-LABEL: fptoui_f64_to_i16_to_f64:196; GFX9: ; %bb.0: ; %entry197; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24198; GFX9-NEXT: v_mov_b32_e32 v2, 0199; GFX9-NEXT: s_waitcnt lgkmcnt(0)200; GFX9-NEXT: v_trunc_f64_e64 v[0:1], |s[2:3]|201; GFX9-NEXT: global_store_dwordx2 v2, v[0:1], s[0:1]202; GFX9-NEXT: s_endpgm203entry:204 %ui = fptoui double %x to i16205 %fp = uitofp i16 %ui to double206 store double %fp, ptr addrspace(1) %out207 ret void208}209 210define amdgpu_kernel void @fptoui_f64_to_i32_to_f64(ptr addrspace(1) %out, double %x) {211; GFX6-LABEL: fptoui_f64_to_i32_to_f64:212; GFX6: ; %bb.0: ; %entry213; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9214; GFX6-NEXT: s_waitcnt lgkmcnt(0)215; GFX6-NEXT: v_cvt_u32_f64_e32 v0, s[2:3]216; GFX6-NEXT: s_mov_b32 s3, 0xf000217; GFX6-NEXT: s_mov_b32 s2, -1218; GFX6-NEXT: v_cvt_f64_u32_e32 v[0:1], v0219; GFX6-NEXT: buffer_store_dwordx2 v[0:1], off, s[0:3], 0220; GFX6-NEXT: s_endpgm221;222; GFX9-LABEL: fptoui_f64_to_i32_to_f64:223; GFX9: ; %bb.0: ; %entry224; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24225; GFX9-NEXT: v_mov_b32_e32 v2, 0226; GFX9-NEXT: s_waitcnt lgkmcnt(0)227; GFX9-NEXT: v_trunc_f64_e64 v[0:1], |s[2:3]|228; GFX9-NEXT: global_store_dwordx2 v2, v[0:1], s[0:1]229; GFX9-NEXT: s_endpgm230entry:231 %ui = fptoui double %x to i32232 %fp = uitofp i32 %ui to double233 store double %fp, ptr addrspace(1) %out234 ret void235}236 237define amdgpu_kernel void @fptoui_f64_to_i64_to_f64(ptr addrspace(1) %out, double %x) {238; GFX6-LABEL: fptoui_f64_to_i64_to_f64:239; GFX6: ; %bb.0: ; %entry240; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9241; GFX6-NEXT: s_mov_b32 s6, -1242; GFX6-NEXT: s_mov_b32 s5, 0xfffff243; GFX6-NEXT: s_mov_b32 s4, s6244; GFX6-NEXT: v_not_b32_e32 v0, 31245; GFX6-NEXT: s_waitcnt lgkmcnt(0)246; GFX6-NEXT: s_bfe_u32 s7, s3, 0xb0014247; GFX6-NEXT: s_addk_i32 s7, 0xfc01248; GFX6-NEXT: s_lshr_b64 s[4:5], s[4:5], s7249; GFX6-NEXT: s_and_b32 s8, s3, 0x80000000250; GFX6-NEXT: s_andn2_b64 s[4:5], s[2:3], s[4:5]251; GFX6-NEXT: s_cmp_lt_i32 s7, 0252; GFX6-NEXT: s_cselect_b32 s4, 0, s4253; GFX6-NEXT: s_cselect_b32 s5, s8, s5254; GFX6-NEXT: s_cmp_gt_i32 s7, 51255; GFX6-NEXT: s_cselect_b32 s3, s3, s5256; GFX6-NEXT: s_cselect_b32 s2, s2, s4257; GFX6-NEXT: v_ldexp_f64 v[0:1], s[2:3], v0258; GFX6-NEXT: v_mov_b32_e32 v4, -1259; GFX6-NEXT: v_fract_f64_e32 v[2:3], v[0:1]260; GFX6-NEXT: v_mov_b32_e32 v5, 0x3fefffff261; GFX6-NEXT: v_min_f64 v[2:3], v[2:3], v[4:5]262; GFX6-NEXT: v_cmp_class_f64_e64 vcc, v[0:1], 3263; GFX6-NEXT: s_mov_b32 s4, 0264; GFX6-NEXT: v_cndmask_b32_e32 v2, v2, v0, vcc265; GFX6-NEXT: v_cndmask_b32_e32 v3, v3, v1, vcc266; GFX6-NEXT: v_add_f64 v[0:1], v[0:1], -v[2:3]267; GFX6-NEXT: v_mov_b32_e32 v2, s2268; GFX6-NEXT: s_mov_b32 s5, 0xc1f00000269; GFX6-NEXT: v_mov_b32_e32 v3, s3270; GFX6-NEXT: v_fma_f64 v[2:3], v[0:1], s[4:5], v[2:3]271; GFX6-NEXT: v_cvt_u32_f64_e32 v0, v[0:1]272; GFX6-NEXT: v_cvt_u32_f64_e32 v2, v[2:3]273; GFX6-NEXT: s_mov_b32 s7, 0xf000274; GFX6-NEXT: s_mov_b32 s4, s0275; GFX6-NEXT: v_cvt_f64_u32_e32 v[0:1], v0276; GFX6-NEXT: v_cvt_f64_u32_e32 v[2:3], v2277; GFX6-NEXT: s_mov_b32 s5, s1278; GFX6-NEXT: v_ldexp_f64 v[0:1], v[0:1], 32279; GFX6-NEXT: v_add_f64 v[0:1], v[0:1], v[2:3]280; GFX6-NEXT: buffer_store_dwordx2 v[0:1], off, s[4:7], 0281; GFX6-NEXT: s_endpgm282;283; GFX9-LABEL: fptoui_f64_to_i64_to_f64:284; GFX9: ; %bb.0: ; %entry285; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24286; GFX9-NEXT: v_mov_b32_e32 v2, 0287; GFX9-NEXT: s_waitcnt lgkmcnt(0)288; GFX9-NEXT: v_trunc_f64_e64 v[0:1], |s[2:3]|289; GFX9-NEXT: global_store_dwordx2 v2, v[0:1], s[0:1]290; GFX9-NEXT: s_endpgm291entry:292 %ui = fptoui double %x to i64293 %fp = uitofp i64 %ui to double294 store double %fp, ptr addrspace(1) %out295 ret void296}297