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