xref: /llvm-project/llvm/test/CodeGen/AArch64/arm64-fcopysign.ll (revision db158c7c830807caeeb0691739c41f1d522029e9)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=aarch64-apple-darwin | FileCheck %s
3
4; rdar://9332258
5
6define float @test1(float %x, float %y) nounwind {
7; CHECK-LABEL: test1:
8; CHECK:       ; %bb.0: ; %entry
9; CHECK-NEXT:    mvni.4s v2, #128, lsl #24
10; CHECK-NEXT:    ; kill: def $s0 killed $s0 def $q0
11; CHECK-NEXT:    ; kill: def $s1 killed $s1 def $q1
12; CHECK-NEXT:    bif.16b v0, v1, v2
13; CHECK-NEXT:    ; kill: def $s0 killed $s0 killed $q0
14; CHECK-NEXT:    ret
15entry:
16  %0 = tail call float @copysignf(float %x, float %y) nounwind readnone
17  ret float %0
18}
19
20define double @test2(double %x, double %y) nounwind {
21; CHECK-LABEL: test2:
22; CHECK:       ; %bb.0: ; %entry
23; CHECK-NEXT:    movi.2d v2, #0xffffffffffffffff
24; CHECK-NEXT:    ; kill: def $d0 killed $d0 def $q0
25; CHECK-NEXT:    ; kill: def $d1 killed $d1 def $q1
26; CHECK-NEXT:    fneg.2d v2, v2
27; CHECK-NEXT:    bif.16b v0, v1, v2
28; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0
29; CHECK-NEXT:    ret
30entry:
31  %0 = tail call double @copysign(double %x, double %y) nounwind readnone
32  ret double %0
33}
34
35; rdar://9545768
36define double @test3(double %a, float %b, float %c) nounwind {
37; CHECK-LABEL: test3:
38; CHECK:       ; %bb.0:
39; CHECK-NEXT:    movi.2d v3, #0xffffffffffffffff
40; CHECK-NEXT:    fadd s1, s1, s2
41; CHECK-NEXT:    ; kill: def $d0 killed $d0 def $q0
42; CHECK-NEXT:    fneg.2d v2, v3
43; CHECK-NEXT:    fcvt d1, s1
44; CHECK-NEXT:    bif.16b v0, v1, v2
45; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0
46; CHECK-NEXT:    ret
47  %tmp1 = fadd float %b, %c
48  %tmp2 = fpext float %tmp1 to double
49  %tmp = tail call double @copysign( double %a, double %tmp2 ) nounwind readnone
50  ret double %tmp
51}
52
53define float @test4() nounwind {
54; CHECK-LABEL: test4:
55; CHECK:       ; %bb.0: ; %entry
56; CHECK-NEXT:    stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill
57; CHECK-NEXT:    bl _bar
58; CHECK-NEXT:    fcvt s0, d0
59; CHECK-NEXT:    fmov s1, #0.50000000
60; CHECK-NEXT:    mvni.4s v2, #128, lsl #24
61; CHECK-NEXT:    bif.16b v1, v0, v2
62; CHECK-NEXT:    fadd s0, s0, s1
63; CHECK-NEXT:    ldp x29, x30, [sp], #16 ; 16-byte Folded Reload
64; CHECK-NEXT:    ret
65entry:
66  %0 = tail call double (...) @bar() nounwind
67  %1 = fptrunc double %0 to float
68  %2 = tail call float @copysignf(float 5.000000e-01, float %1) nounwind readnone
69  %3 = fadd float %1, %2
70  ret float %3
71}
72
73declare double @bar(...)
74declare double @copysign(double, double) nounwind readnone
75declare float @copysignf(float, float) nounwind readnone
76