199 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 62; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 < %s | FileCheck -check-prefix=GFX9 %s3 4; Negative test, don't know %x is positive5define half @copysign_known_signmask_f16(half %x, i16 %sign) {6; GFX9-LABEL: copysign_known_signmask_f16:7; GFX9: ; %bb.0:8; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)9; GFX9-NEXT: v_lshlrev_b16_e32 v1, 15, v110; GFX9-NEXT: s_movk_i32 s4, 0x7fff11; GFX9-NEXT: v_bfi_b32 v0, s4, v0, v112; GFX9-NEXT: s_setpc_b64 s[30:31]13 %signmask = shl i16 %sign, 1514 %signmask.bitcast = bitcast i16 %signmask to half15 %result = call half @llvm.copysign.f16(half %x, half %signmask.bitcast)16 ret half %result17}18 19; Negative test, don't know %x is positive20define float @copysign_known_signmask_f32(float %x, i32 %sign) {21; GFX9-LABEL: copysign_known_signmask_f32:22; GFX9: ; %bb.0:23; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)24; GFX9-NEXT: v_lshlrev_b32_e32 v1, 31, v125; GFX9-NEXT: s_brev_b32 s4, -226; GFX9-NEXT: v_bfi_b32 v0, s4, v0, v127; GFX9-NEXT: s_setpc_b64 s[30:31]28 %signmask = shl i32 %sign, 3129 %signmask.bitcast = bitcast i32 %signmask to float30 %result = call float @llvm.copysign.f32(float %x, float %signmask.bitcast)31 ret float %result32}33 34; Negative test, don't know %x is positive35define double @copysign_known_signmask_f64(double %x, i64 %sign) {36; GFX9-LABEL: copysign_known_signmask_f64:37; GFX9: ; %bb.0:38; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)39; GFX9-NEXT: v_lshlrev_b32_e32 v2, 31, v240; GFX9-NEXT: s_brev_b32 s4, -241; GFX9-NEXT: v_bfi_b32 v1, s4, v1, v242; GFX9-NEXT: s_setpc_b64 s[30:31]43 %signmask = shl i64 %sign, 6344 %signmask.bitcast = bitcast i64 %signmask to double45 %result = call double @llvm.copysign.f64(double %x, double %signmask.bitcast)46 ret double %result47}48 49; Negative test, don't know %x is positive50define float @copysign_known_signmask_f32_known_not_known_positive_mag_maybe_nan(float nofpclass(ninf nzero nsub nnorm) %sign.bit.known.zero, i32 %sign) {51; GFX9-LABEL: copysign_known_signmask_f32_known_not_known_positive_mag_maybe_nan:52; GFX9: ; %bb.0:53; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)54; GFX9-NEXT: v_lshlrev_b32_e32 v1, 31, v155; GFX9-NEXT: s_brev_b32 s4, -256; GFX9-NEXT: v_bfi_b32 v0, s4, v0, v157; GFX9-NEXT: s_setpc_b64 s[30:31]58 %signmask = shl i32 %sign, 3159 %signmask.bitcast = bitcast i32 %signmask to float60 %result = call float @llvm.copysign.f32(float %sign.bit.known.zero, float %signmask.bitcast)61 ret float %result62}63 64; Negative test, don't know %x is positive65define float @copysign_known_signmask_f32_known_not_known_positive_mag_maybe_negzero(float nofpclass(nan ninf nsub nnorm) %sign.bit.known.zero, i32 %sign) {66; GFX9-LABEL: copysign_known_signmask_f32_known_not_known_positive_mag_maybe_negzero:67; GFX9: ; %bb.0:68; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)69; GFX9-NEXT: v_lshlrev_b32_e32 v1, 31, v170; GFX9-NEXT: s_brev_b32 s4, -271; GFX9-NEXT: v_bfi_b32 v0, s4, v0, v172; GFX9-NEXT: s_setpc_b64 s[30:31]73 %signmask = shl i32 %sign, 3174 %signmask.bitcast = bitcast i32 %signmask to float75 %result = call float @llvm.copysign.f32(float %sign.bit.known.zero, float %signmask.bitcast)76 ret float %result77}78 79define half @copysign_known_signmask_f16_known_positive_mag(half nofpclass(nan ninf nzero nsub nnorm) %sign.bit.known.zero, i16 %sign) {80; GFX9-LABEL: copysign_known_signmask_f16_known_positive_mag:81; GFX9: ; %bb.0:82; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)83; GFX9-NEXT: v_lshlrev_b16_e32 v1, 15, v184; GFX9-NEXT: v_or_b32_e32 v0, v0, v185; GFX9-NEXT: s_setpc_b64 s[30:31]86 %signmask = shl i16 %sign, 1587 %signmask.bitcast = bitcast i16 %signmask to half88 %result = call half @llvm.copysign.f16(half %sign.bit.known.zero, half %signmask.bitcast)89 ret half %result90}91 92define float @copysign_known_signmask_f32_known_positive_mag(float nofpclass(nan ninf nzero nsub nnorm) %sign.bit.known.zero, i32 %sign) {93; GFX9-LABEL: copysign_known_signmask_f32_known_positive_mag:94; GFX9: ; %bb.0:95; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)96; GFX9-NEXT: v_lshl_or_b32 v0, v1, 31, v097; GFX9-NEXT: s_setpc_b64 s[30:31]98 %signmask = shl i32 %sign, 3199 %signmask.bitcast = bitcast i32 %signmask to float100 %result = call float @llvm.copysign.f32(float %sign.bit.known.zero, float %signmask.bitcast)101 ret float %result102}103 104define double @copysign_known_signmask_f64_known_positive_mag(double nofpclass(nan ninf nzero nsub nnorm) %sign.bit.known.zero, i64 %sign) {105; GFX9-LABEL: copysign_known_signmask_f64_known_positive_mag:106; GFX9: ; %bb.0:107; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)108; GFX9-NEXT: v_lshlrev_b32_e32 v2, 31, v2109; GFX9-NEXT: v_or_b32_e32 v1, v1, v2110; GFX9-NEXT: s_setpc_b64 s[30:31]111 %signmask = shl i64 %sign, 63112 %signmask.bitcast = bitcast i64 %signmask to double113 %result = call double @llvm.copysign.f64(double %sign.bit.known.zero, double %signmask.bitcast)114 ret double %result115}116 117; exp always returns a positive result, excluding the unknown nan sign118; bit.119define float @copysign_known_signmask_f32_known_positive_mag__nnan_exp(float %x, i32 %sign) {120; GFX9-LABEL: copysign_known_signmask_f32_known_positive_mag__nnan_exp:121; GFX9: ; %bb.0:122; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)123; GFX9-NEXT: s_mov_b32 s4, 0xc2aeac50124; GFX9-NEXT: v_add_f32_e32 v2, 0x42800000, v0125; GFX9-NEXT: v_cmp_gt_f32_e32 vcc, s4, v0126; GFX9-NEXT: v_cndmask_b32_e32 v0, v0, v2, vcc127; GFX9-NEXT: v_mul_f32_e32 v0, 0x3fb8aa3b, v0128; GFX9-NEXT: v_exp_f32_e32 v0, v0129; GFX9-NEXT: v_mul_f32_e32 v2, 0x114b4ea4, v0130; GFX9-NEXT: v_cndmask_b32_e32 v0, v0, v2, vcc131; GFX9-NEXT: v_lshl_or_b32 v0, v1, 31, v0132; GFX9-NEXT: s_setpc_b64 s[30:31]133 %signbit.known.zero = call nnan afn float @llvm.exp.f32(float %x)134 %signmask = shl i32 %sign, 31135 %signmask.bitcast = bitcast i32 %signmask to float136 %result = call float @llvm.copysign.f32(float %signbit.known.zero, float %signmask.bitcast)137 ret float %result138}139 140define float @copysign_known_signmask_f32_known_positive_mag__nnan_exp2(float %x, i32 %sign) {141; GFX9-LABEL: copysign_known_signmask_f32_known_positive_mag__nnan_exp2:142; GFX9: ; %bb.0:143; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)144; GFX9-NEXT: s_mov_b32 s4, 0xc2fc0000145; GFX9-NEXT: v_cmp_gt_f32_e32 vcc, s4, v0146; GFX9-NEXT: v_mov_b32_e32 v3, 0x42800000147; GFX9-NEXT: v_cndmask_b32_e32 v3, 0, v3, vcc148; GFX9-NEXT: v_add_f32_e32 v0, v0, v3149; GFX9-NEXT: v_exp_f32_e32 v0, v0150; GFX9-NEXT: v_not_b32_e32 v2, 63151; GFX9-NEXT: v_cndmask_b32_e32 v2, 0, v2, vcc152; GFX9-NEXT: v_ldexp_f32 v0, v0, v2153; GFX9-NEXT: v_lshl_or_b32 v0, v1, 31, v0154; GFX9-NEXT: s_setpc_b64 s[30:31]155 %signbit.known.zero = call nnan afn float @llvm.exp2.f32(float %x)156 %signmask = shl i32 %sign, 31157 %signmask.bitcast = bitcast i32 %signmask to float158 %result = call float @llvm.copysign.f32(float %signbit.known.zero, float %signmask.bitcast)159 ret float %result160}161 162define float @copysign_known_signmask_f32_known_positive_mag__nnan_exp10(float %x, i32 %sign) {163; GFX9-LABEL: copysign_known_signmask_f32_known_positive_mag__nnan_exp10:164; GFX9: ; %bb.0:165; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)166; GFX9-NEXT: s_mov_b32 s4, 0xc2fc0000167; GFX9-NEXT: v_cmp_gt_f32_e32 vcc, s4, v0168; GFX9-NEXT: v_mov_b32_e32 v3, 0x42800000169; GFX9-NEXT: v_cndmask_b32_e32 v3, 0, v3, vcc170; GFX9-NEXT: v_add_f32_e32 v0, v0, v3171; GFX9-NEXT: v_exp_f32_e32 v0, v0172; GFX9-NEXT: v_not_b32_e32 v2, 63173; GFX9-NEXT: v_cndmask_b32_e32 v2, 0, v2, vcc174; GFX9-NEXT: v_ldexp_f32 v0, v0, v2175; GFX9-NEXT: v_lshl_or_b32 v0, v1, 31, v0176; GFX9-NEXT: s_setpc_b64 s[30:31]177 %signbit.known.zero = call nnan afn float @llvm.exp2.f32(float %x)178 %signmask = shl i32 %sign, 31179 %signmask.bitcast = bitcast i32 %signmask to float180 %result = call float @llvm.copysign.f32(float %signbit.known.zero, float %signmask.bitcast)181 ret float %result182}183 184define float @copysign_known_signmask_f32_known_positive_mag_through_fence(float nofpclass(nan ninf nzero nsub nnorm) %sign.bit.known.zero, i32 %sign) {185; GFX9-LABEL: copysign_known_signmask_f32_known_positive_mag_through_fence:186; GFX9: ; %bb.0:187; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)188; GFX9-NEXT: v_lshlrev_b32_e32 v1, 31, v1189; GFX9-NEXT: ;ARITH_FENCE190; GFX9-NEXT: s_brev_b32 s4, -2191; GFX9-NEXT: v_bfi_b32 v0, s4, v0, v1192; GFX9-NEXT: s_setpc_b64 s[30:31]193 %signmask = shl i32 %sign, 31194 %signmask.bitcast = bitcast i32 %signmask to float195 %fence = call float @llvm.arithmetic.fence.f32(float %sign.bit.known.zero)196 %result = call float @llvm.copysign.f32(float %fence, float %signmask.bitcast)197 ret float %result198}199