• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple powerpc64le < %s | FileCheck %s
3
4; Check constrained ops converted to call
5define void @test(double* %cast) {
6; CHECK-LABEL: test:
7; CHECK:       # %bb.0: # %root
8; CHECK-NEXT:    mflr 0
9; CHECK-NEXT:    .cfi_def_cfa_offset 64
10; CHECK-NEXT:    .cfi_offset lr, 16
11; CHECK-NEXT:    .cfi_offset r29, -24
12; CHECK-NEXT:    .cfi_offset r30, -16
13; CHECK-NEXT:    std 29, -24(1) # 8-byte Folded Spill
14; CHECK-NEXT:    std 30, -16(1) # 8-byte Folded Spill
15; CHECK-NEXT:    std 0, 16(1)
16; CHECK-NEXT:    stdu 1, -64(1)
17; CHECK-NEXT:    li 30, 0
18; CHECK-NEXT:    addi 29, 3, -8
19; CHECK-NEXT:    .p2align 5
20; CHECK-NEXT:  .LBB0_1: # %for.body
21; CHECK-NEXT:    #
22; CHECK-NEXT:    lfdu 1, 8(29)
23; CHECK-NEXT:    bl cos
24; CHECK-NEXT:    nop
25; CHECK-NEXT:    addi 30, 30, 8
26; CHECK-NEXT:    stfdx 1, 0, 29
27; CHECK-NEXT:    cmpldi 30, 2040
28; CHECK-NEXT:    bne 0, .LBB0_1
29; CHECK-NEXT:  # %bb.2: # %exit
30; CHECK-NEXT:    addi 1, 1, 64
31; CHECK-NEXT:    ld 0, 16(1)
32; CHECK-NEXT:    ld 30, -16(1) # 8-byte Folded Reload
33; CHECK-NEXT:    ld 29, -24(1) # 8-byte Folded Reload
34; CHECK-NEXT:    mtlr 0
35; CHECK-NEXT:    blr
36root:
37  br label %for.body
38
39exit:
40  ret void
41
42for.body:
43  %i = phi i64 [ 0, %root ], [ %next, %for.body ]
44  %idx = getelementptr inbounds double, double* %cast, i64 %i
45  %val = load double, double* %idx
46  %cos = tail call nnan ninf nsz arcp double @llvm.experimental.constrained.cos.f64(double %val, metadata !"round.dynamic", metadata !"fpexcept.strict")
47  store double %cos, double* %idx, align 8
48  %next = add nuw nsw i64 %i, 1
49  %cond = icmp eq i64 %next, 255
50  br i1 %cond, label %exit, label %for.body
51}
52
53; Check constrained ops converted to native instruction
54define void @test2(double* %cast) {
55; CHECK-LABEL: test2:
56; CHECK:       # %bb.0: # %entry
57; CHECK-NEXT:    li 4, 255
58; CHECK-NEXT:    addi 3, 3, -8
59; CHECK-NEXT:    mtctr 4
60; CHECK-NEXT:    .p2align 4
61; CHECK-NEXT:  .LBB1_1: # %for.body
62; CHECK-NEXT:    #
63; CHECK-NEXT:    lfdu 0, 8(3)
64; CHECK-NEXT:    xssqrtdp 0, 0
65; CHECK-NEXT:    stfdx 0, 0, 3
66; CHECK-NEXT:    bdnz .LBB1_1
67; CHECK-NEXT:  # %bb.2: # %exit
68; CHECK-NEXT:    blr
69entry:
70  br label %for.body
71
72for.body:
73  %i = phi i64 [ 0, %entry ], [ %next, %for.body ]
74  %idx = getelementptr inbounds double, double* %cast, i64 %i
75  %val = load double, double* %idx
76  %cos = tail call nnan ninf nsz arcp double @llvm.experimental.constrained.sqrt.f64(double %val, metadata !"round.dynamic", metadata !"fpexcept.strict")
77  store double %cos, double* %idx, align 8
78  %next = add nuw nsw i64 %i, 1
79  %cond = icmp eq i64 %next, 255
80  br i1 %cond, label %exit, label %for.body
81
82exit:
83  ret void
84}
85
86declare double @llvm.experimental.constrained.cos.f64(double, metadata, metadata)
87declare double @llvm.experimental.constrained.sqrt.f64(double, metadata, metadata)
88