brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.7 KiB · 552f6ed Raw
199 lines · plain
1; RUN: llc < %s -mtriple=ve | FileCheck %s2 3;;; Test ‘llvm.copysign.*’ Intrinsic4;;;5;;; Syntax:6;;;   This is an overloaded intrinsic. You can use llvm.copysign on any7;;;   floating-point or vector of floating-point type. Not all targets8;;;   support all types however.9;;;10;;; declare float     @llvm.copysign.f32(float  %Mag, float  %Sgn)11;;; declare double    @llvm.copysign.f64(double %Mag, double %Sgn)12;;; declare x86_fp80  @llvm.copysign.f80(x86_fp80  %Mag, x86_fp80  %Sgn)13;;; declare fp128     @llvm.copysign.f128(fp128 %Mag, fp128 %Sgn)14;;; declare ppc_fp128 @llvm.copysign.ppcf128(ppc_fp128  %Mag, ppc_fp128  %Sgn)15;;;16;;; Overview:17;;;   The ‘llvm.copysign.*’ intrinsics return a value with the magnitude of18;;;   the first operand and the sign of the second operand.19;;;20;;; Arguments:21;;;   The arguments and return value are floating-point numbers of the same22;;;   type.23;;;24;;; Semantics:25;;;   This function returns the same values as the libm copysign functions26;;;   would, and handles error conditions in the same way.27;;;28;;; Note:29;;;   We test only float/double/fp128.30 31; Function Attrs: nounwind readnone32define float @copysign_float_var(float %0, float %1) {33; CHECK-LABEL: copysign_float_var:34; CHECK:       # %bb.0:35; CHECK-NEXT:    sra.l %s1, %s1, 3236; CHECK-NEXT:    lea %s2, -214748364837; CHECK-NEXT:    and %s2, %s2, (32)038; CHECK-NEXT:    and %s1, %s1, %s239; CHECK-NEXT:    sra.l %s0, %s0, 3240; CHECK-NEXT:    and %s0, %s0, (33)041; CHECK-NEXT:    or %s0, %s0, %s142; CHECK-NEXT:    sll %s0, %s0, 3243; CHECK-NEXT:    b.l.t (, %s10)44  %3 = tail call fast float @llvm.copysign.f32(float %0, float %1)45  ret float %346}47 48; Function Attrs: nounwind readnone speculatable willreturn49declare float @llvm.copysign.f32(float, float)50 51; Function Attrs: nounwind readnone52define double @copysign_double_var(double %0, double %1) {53; CHECK-LABEL: copysign_double_var:54; CHECK:       # %bb.0:55; CHECK-NEXT:    and %s1, %s1, (1)156; CHECK-NEXT:    and %s0, %s0, (1)057; CHECK-NEXT:    or %s0, %s0, %s158; CHECK-NEXT:    b.l.t (, %s10)59  %3 = tail call fast double @llvm.copysign.f64(double %0, double %1)60  ret double %361}62 63; Function Attrs: nounwind readnone speculatable willreturn64declare double @llvm.copysign.f64(double, double)65 66; Function Attrs: nounwind readnone67define fp128 @copysign_quad_var(fp128 %0, fp128 %1) {68; CHECK-LABEL: copysign_quad_var:69; CHECK:       .LBB{{[0-9]+}}_2:70; CHECK-NEXT:    st %s3, 16(, %s11)71; CHECK-NEXT:    st %s2, 24(, %s11)72; CHECK-NEXT:    st %s1, (, %s11)73; CHECK-NEXT:    st %s0, 8(, %s11)74; CHECK-NEXT:    ld1b.zx %s0, 31(, %s11)75; CHECK-NEXT:    ld1b.zx %s1, 15(, %s11)76; CHECK-NEXT:    lea %s2, 12877; CHECK-NEXT:    and %s0, %s0, %s278; CHECK-NEXT:    and %s1, %s1, (57)079; CHECK-NEXT:    or %s0, %s1, %s080; CHECK-NEXT:    st1b %s0, 15(, %s11)81; CHECK-NEXT:    ld %s1, (, %s11)82; CHECK-NEXT:    ld %s0, 8(, %s11)83; CHECK-NEXT:    adds.l %s11, 32, %s1184; CHECK-NEXT:    b.l.t (, %s10)85  %3 = tail call fast fp128 @llvm.copysign.f128(fp128 %0, fp128 %1)86  ret fp128 %387}88 89; Function Attrs: nounwind readnone speculatable willreturn90declare fp128 @llvm.copysign.f128(fp128, fp128)91 92; Function Attrs: nounwind readnone93define float @copysign_float_zero(float %0) {94; CHECK-LABEL: copysign_float_zero:95; CHECK:       # %bb.0:96; CHECK-NEXT:    sra.l %s0, %s0, 3297; CHECK-NEXT:    lea %s1, -214748364898; CHECK-NEXT:    and %s1, %s1, (32)099; CHECK-NEXT:    and %s0, %s0, %s1100; CHECK-NEXT:    sll %s0, %s0, 32101; CHECK-NEXT:    b.l.t (, %s10)102  %2 = tail call fast float @llvm.copysign.f32(float 0.000000e+00, float %0)103  ret float %2104}105 106; Function Attrs: nounwind readnone107define double @copysign_double_zero(double %0) {108; CHECK-LABEL: copysign_double_zero:109; CHECK:       # %bb.0:110; CHECK-NEXT:    and %s0, %s0, (1)1111; CHECK-NEXT:    b.l.t (, %s10)112  %2 = tail call fast double @llvm.copysign.f64(double 0.000000e+00, double %0)113  ret double %2114}115 116; Function Attrs: nounwind readnone117define fp128 @copysign_quad_zero(fp128 %0) {118; CHECK-LABEL: copysign_quad_zero:119; CHECK:       .LBB{{[0-9]+}}_2:120; CHECK-NEXT:    lea %s2, .LCPI{{[0-9]+}}_0@lo121; CHECK-NEXT:    and %s2, %s2, (32)0122; CHECK-NEXT:    lea.sl %s2, .LCPI{{[0-9]+}}_0@hi(, %s2)123; CHECK-NEXT:    ld %s4, 8(, %s2)124; CHECK-NEXT:    ld %s5, (, %s2)125; CHECK-NEXT:    st %s1, 16(, %s11)126; CHECK-NEXT:    st %s0, 24(, %s11)127; CHECK-NEXT:    st %s5, (, %s11)128; CHECK-NEXT:    st %s4, 8(, %s11)129; CHECK-NEXT:    ld1b.zx %s0, 31(, %s11)130; CHECK-NEXT:    ld1b.zx %s1, 15(, %s11)131; CHECK-NEXT:    lea %s2, 128132; CHECK-NEXT:    and %s0, %s0, %s2133; CHECK-NEXT:    and %s1, %s1, (57)0134; CHECK-NEXT:    or %s0, %s1, %s0135; CHECK-NEXT:    st1b %s0, 15(, %s11)136; CHECK-NEXT:    ld %s1, (, %s11)137; CHECK-NEXT:    ld %s0, 8(, %s11)138; CHECK-NEXT:    adds.l %s11, 32, %s11139; CHECK-NEXT:    b.l.t (, %s10)140  %2 = tail call fast fp128 @llvm.copysign.f128(fp128 0xL00000000000000000000000000000000, fp128 %0)141  ret fp128 %2142}143 144; Function Attrs: nounwind readnone145define float @copysign_float_const(float %0) {146; CHECK-LABEL: copysign_float_const:147; CHECK:       # %bb.0:148; CHECK-NEXT:    sra.l %s0, %s0, 32149; CHECK-NEXT:    lea %s1, -2147483648150; CHECK-NEXT:    and %s1, %s1, (32)0151; CHECK-NEXT:    and %s0, %s0, %s1152; CHECK-NEXT:    lea %s1, 1073741824153; CHECK-NEXT:    or %s0, %s0, %s1154; CHECK-NEXT:    sll %s0, %s0, 32155; CHECK-NEXT:    b.l.t (, %s10)156  %2 = tail call fast float @llvm.copysign.f32(float -2.000000e+00, float %0)157  ret float %2158}159 160; Function Attrs: nounwind readnone161define double @copysign_double_const(double %0) {162; CHECK-LABEL: copysign_double_const:163; CHECK:       # %bb.0:164; CHECK-NEXT:    and %s0, %s0, (1)1165; CHECK-NEXT:    lea.sl %s1, 1073741824166; CHECK-NEXT:    or %s0, %s0, %s1167; CHECK-NEXT:    b.l.t (, %s10)168  %2 = tail call fast double @llvm.copysign.f64(double -2.000000e+00, double %0)169  ret double %2170}171 172; Function Attrs: nounwind readnone173define fp128 @copysign_quad_const(fp128 %0) {174; CHECK-LABEL: copysign_quad_const:175; CHECK:       .LBB{{[0-9]+}}_2:176; CHECK-NEXT:    lea %s2, .LCPI{{[0-9]+}}_0@lo177; CHECK-NEXT:    and %s2, %s2, (32)0178; CHECK-NEXT:    lea.sl %s2, .LCPI{{[0-9]+}}_0@hi(, %s2)179; CHECK-NEXT:    ld %s4, 8(, %s2)180; CHECK-NEXT:    ld %s5, (, %s2)181; CHECK-NEXT:    st %s1, 16(, %s11)182; CHECK-NEXT:    st %s0, 24(, %s11)183; CHECK-NEXT:    st %s5, (, %s11)184; CHECK-NEXT:    st %s4, 8(, %s11)185; CHECK-NEXT:    ld1b.zx %s0, 31(, %s11)186; CHECK-NEXT:    ld1b.zx %s1, 15(, %s11)187; CHECK-NEXT:    lea %s2, 128188; CHECK-NEXT:    and %s0, %s0, %s2189; CHECK-NEXT:    and %s1, %s1, (57)0190; CHECK-NEXT:    or %s0, %s1, %s0191; CHECK-NEXT:    st1b %s0, 15(, %s11)192; CHECK-NEXT:    ld %s1, (, %s11)193; CHECK-NEXT:    ld %s0, 8(, %s11)194; CHECK-NEXT:    adds.l %s11, 32, %s11195; CHECK-NEXT:    b.l.t (, %s10)196  %2 = tail call fast fp128 @llvm.copysign.f128(fp128 0xL0000000000000000C000000000000000, fp128 %0)197  ret fp128 %2198}199