brintos

brintos / llvm-project-archived public Read only

0
0
Text · 8.7 KiB · afd610f Raw
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