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