xref: /llvm-project/llvm/test/CodeGen/ARM/fpscr-multi-use.ll (revision e0ed0333f0fed2e73f805afd58b61176a87aa3ad)
1ad9dcd96SSergei Barannikov; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2ad9dcd96SSergei Barannikov; RUN: llc -mtriple=armv7 %s -o - | FileCheck %s
3*e0ed0333SSergei Barannikov; RUN: llc -mtriple=thumbv7 %s -o - | FileCheck --check-prefix=THUMB %s
4ad9dcd96SSergei Barannikov
5ad9dcd96SSergei Barannikovdeclare double @fn()
6ad9dcd96SSergei Barannikov
7ad9dcd96SSergei Barannikovdefine void @test(ptr %p, ptr %res) nounwind {
8ad9dcd96SSergei Barannikov; CHECK-LABEL: test:
9ad9dcd96SSergei Barannikov; CHECK:       @ %bb.0: @ %entry
10*e0ed0333SSergei Barannikov; CHECK-NEXT:    push {r4, r5, r11, lr}
11*e0ed0333SSergei Barannikov; CHECK-NEXT:    vldr d16, [r0]
12ad9dcd96SSergei Barannikov; CHECK-NEXT:    mov r4, r1
13*e0ed0333SSergei Barannikov; CHECK-NEXT:    vcmp.f64 d16, #0
14ad9dcd96SSergei Barannikov; CHECK-NEXT:    vmrs APSR_nzcv, fpscr
15*e0ed0333SSergei Barannikov; CHECK-NEXT:    mrs r5, apsr
16*e0ed0333SSergei Barannikov; CHECK-NEXT:    vneg.f64 d17, d16
17*e0ed0333SSergei Barannikov; CHECK-NEXT:    vmovne.f64 d16, d17
18*e0ed0333SSergei Barannikov; CHECK-NEXT:    vstr d16, [r1]
19ad9dcd96SSergei Barannikov; CHECK-NEXT:    bl fn
20ad9dcd96SSergei Barannikov; CHECK-NEXT:    vmov d16, r0, r1
21ad9dcd96SSergei Barannikov; CHECK-NEXT:    eor r1, r1, #-2147483648
22*e0ed0333SSergei Barannikov; CHECK-NEXT:    msr APSR_nzcvq, r5
23ad9dcd96SSergei Barannikov; CHECK-NEXT:    vmov d17, r0, r1
24ad9dcd96SSergei Barannikov; CHECK-NEXT:    vmovne.f64 d16, d17
25ad9dcd96SSergei Barannikov; CHECK-NEXT:    vstr d16, [r4]
26*e0ed0333SSergei Barannikov; CHECK-NEXT:    pop {r4, r5, r11, pc}
27*e0ed0333SSergei Barannikov;
28*e0ed0333SSergei Barannikov; THUMB-LABEL: test:
29*e0ed0333SSergei Barannikov; THUMB:       @ %bb.0: @ %entry
30*e0ed0333SSergei Barannikov; THUMB-NEXT:    push {r4, r5, r7, lr}
31*e0ed0333SSergei Barannikov; THUMB-NEXT:    vldr d16, [r0]
32*e0ed0333SSergei Barannikov; THUMB-NEXT:    mov r4, r1
33*e0ed0333SSergei Barannikov; THUMB-NEXT:    vcmp.f64 d16, #0
34*e0ed0333SSergei Barannikov; THUMB-NEXT:    vmrs APSR_nzcv, fpscr
35*e0ed0333SSergei Barannikov; THUMB-NEXT:    mrs r5, apsr
36*e0ed0333SSergei Barannikov; THUMB-NEXT:    vneg.f64 d17, d16
37*e0ed0333SSergei Barannikov; THUMB-NEXT:    it ne
38*e0ed0333SSergei Barannikov; THUMB-NEXT:    vmovne.f64 d16, d17
39*e0ed0333SSergei Barannikov; THUMB-NEXT:    vstr d16, [r1]
40*e0ed0333SSergei Barannikov; THUMB-NEXT:    bl fn
41*e0ed0333SSergei Barannikov; THUMB-NEXT:    vmov d16, r0, r1
42*e0ed0333SSergei Barannikov; THUMB-NEXT:    eor r1, r1, #-2147483648
43*e0ed0333SSergei Barannikov; THUMB-NEXT:    msr APSR_nzcvq, r5
44*e0ed0333SSergei Barannikov; THUMB-NEXT:    vmov d17, r0, r1
45*e0ed0333SSergei Barannikov; THUMB-NEXT:    it ne
46*e0ed0333SSergei Barannikov; THUMB-NEXT:    vmovne.f64 d16, d17
47*e0ed0333SSergei Barannikov; THUMB-NEXT:    vstr d16, [r4]
48*e0ed0333SSergei Barannikov; THUMB-NEXT:    pop {r4, r5, r7, pc}
49ad9dcd96SSergei Barannikoventry:
50ad9dcd96SSergei Barannikov  %x = load double, ptr %p
51ad9dcd96SSergei Barannikov  %cmp = fcmp une double %x, 0.000000e+00
52ad9dcd96SSergei Barannikov  %nx = fneg double %x
53ad9dcd96SSergei Barannikov  %sx = select i1 %cmp, double %nx, double %x
54ad9dcd96SSergei Barannikov  store double %sx, ptr %res
55ad9dcd96SSergei Barannikov  %y = call double @fn()
56ad9dcd96SSergei Barannikov  %ny = fneg double %y
57ad9dcd96SSergei Barannikov  %sy = select i1 %cmp, double %ny, double %y
58ad9dcd96SSergei Barannikov  store double %sy, ptr %res
59ad9dcd96SSergei Barannikov  ret void
60ad9dcd96SSergei Barannikov}
61