mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
f83e7bf498
Summary: Some constants can be handled with less instructions than our current results. And it seems our original approach is not very easy to extend. Therefore this patch proposes to materialize all 64-bit constants by enumerated patterns. I traversed almost all constants to verified the functionality of these pattens. A traversed comparison of the number of instructions used by the original method and the new method has also been completed, where no degradation was caused by this patch. This patch also passed Bootstrap test and SPEC test. Improvements of this patch are shown in llvm/test/CodeGen/PowerPC/constants-i64.ll Reviewed By: steven.zhang, stefanp Differential Revision: https://reviews.llvm.org/D92089
782 lines
27 KiB
LLVM
782 lines
27 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
|
; RUN: llc -mcpu=pwr9 -mtriple=powerpc64le-unknown-unknown -ppc-vsr-nums-as-vr \
|
|
; RUN: -verify-machineinstrs -ppc-asm-full-reg-names < %s | FileCheck %s
|
|
; RUN: llc -mcpu=pwr8 -mtriple=powerpc64le-unknown-unknown -ppc-vsr-nums-as-vr \
|
|
; RUN: -verify-machineinstrs -ppc-asm-full-reg-names < %s | FileCheck %s \
|
|
; RUN: -check-prefix=CHECK-P8
|
|
|
|
; Function Attrs: norecurse nounwind readnone
|
|
define fp128 @loadConstant() {
|
|
; CHECK-LABEL: loadConstant:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: addis r3, r2, .LCPI0_0@toc@ha
|
|
; CHECK-NEXT: addi r3, r3, .LCPI0_0@toc@l
|
|
; CHECK-NEXT: lxvx v2, 0, r3
|
|
; CHECK-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: loadConstant:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: lis r3, 1
|
|
; CHECK-P8-NEXT: ori r3, r3, 5
|
|
; CHECK-P8-NEXT: rldic r4, r3, 46, 1
|
|
; CHECK-P8-NEXT: li r3, 0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
ret fp128 0xL00000000000000004001400000000000
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readnone
|
|
define fp128 @loadConstant2(fp128 %a, fp128 %b) {
|
|
; CHECK-LABEL: loadConstant2:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: xsaddqp v2, v2, v3
|
|
; CHECK-NEXT: addis r3, r2, .LCPI1_0@toc@ha
|
|
; CHECK-NEXT: addi r3, r3, .LCPI1_0@toc@l
|
|
; CHECK-NEXT: lxvx v3, 0, r3
|
|
; CHECK-NEXT: xsaddqp v2, v2, v3
|
|
; CHECK-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: loadConstant2:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: mflr r0
|
|
; CHECK-P8-NEXT: std r0, 16(r1)
|
|
; CHECK-P8-NEXT: stdu r1, -32(r1)
|
|
; CHECK-P8-NEXT: .cfi_def_cfa_offset 32
|
|
; CHECK-P8-NEXT: .cfi_offset lr, 16
|
|
; CHECK-P8-NEXT: bl __addkf3
|
|
; CHECK-P8-NEXT: nop
|
|
; CHECK-P8-NEXT: lis r5, 1
|
|
; CHECK-P8-NEXT: ori r5, r5, 5
|
|
; CHECK-P8-NEXT: rldic r6, r5, 46, 1
|
|
; CHECK-P8-NEXT: li r5, 0
|
|
; CHECK-P8-NEXT: bl __addkf3
|
|
; CHECK-P8-NEXT: nop
|
|
; CHECK-P8-NEXT: addi r1, r1, 32
|
|
; CHECK-P8-NEXT: ld r0, 16(r1)
|
|
; CHECK-P8-NEXT: mtlr r0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%add = fadd fp128 %a, %b
|
|
%add1 = fadd fp128 %add, 0xL00000000000000004001400000000000
|
|
ret fp128 %add1
|
|
}
|
|
|
|
; Test passing float128 by value.
|
|
; Function Attrs: norecurse nounwind readnone
|
|
define signext i32 @fp128Param(fp128 %a) {
|
|
; CHECK-LABEL: fp128Param:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: xscvqpswz v2, v2
|
|
; CHECK-NEXT: mfvsrwz r3, v2
|
|
; CHECK-NEXT: extsw r3, r3
|
|
; CHECK-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: fp128Param:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: mflr r0
|
|
; CHECK-P8-NEXT: std r0, 16(r1)
|
|
; CHECK-P8-NEXT: stdu r1, -32(r1)
|
|
; CHECK-P8-NEXT: .cfi_def_cfa_offset 32
|
|
; CHECK-P8-NEXT: .cfi_offset lr, 16
|
|
; CHECK-P8-NEXT: bl __fixkfsi
|
|
; CHECK-P8-NEXT: nop
|
|
; CHECK-P8-NEXT: extsw r3, r3
|
|
; CHECK-P8-NEXT: addi r1, r1, 32
|
|
; CHECK-P8-NEXT: ld r0, 16(r1)
|
|
; CHECK-P8-NEXT: mtlr r0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptosi fp128 %a to i32
|
|
ret i32 %conv
|
|
}
|
|
|
|
; Test float128 as return value.
|
|
; Function Attrs: norecurse nounwind readnone
|
|
define fp128 @fp128Return(fp128 %a, fp128 %b) {
|
|
; CHECK-LABEL: fp128Return:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: xsaddqp v2, v2, v3
|
|
; CHECK-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: fp128Return:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: mflr r0
|
|
; CHECK-P8-NEXT: std r0, 16(r1)
|
|
; CHECK-P8-NEXT: stdu r1, -32(r1)
|
|
; CHECK-P8-NEXT: .cfi_def_cfa_offset 32
|
|
; CHECK-P8-NEXT: .cfi_offset lr, 16
|
|
; CHECK-P8-NEXT: bl __addkf3
|
|
; CHECK-P8-NEXT: nop
|
|
; CHECK-P8-NEXT: addi r1, r1, 32
|
|
; CHECK-P8-NEXT: ld r0, 16(r1)
|
|
; CHECK-P8-NEXT: mtlr r0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%add = fadd fp128 %a, %b
|
|
ret fp128 %add
|
|
}
|
|
|
|
; array of float128 types
|
|
; Function Attrs: norecurse nounwind readonly
|
|
define fp128 @fp128Array(fp128* nocapture readonly %farray,
|
|
; CHECK-LABEL: fp128Array:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: sldi r4, r4, 4
|
|
; CHECK-NEXT: lxv v2, 0(r3)
|
|
; CHECK-NEXT: add r3, r3, r4
|
|
; CHECK-NEXT: lxv v3, -16(r3)
|
|
; CHECK-NEXT: xsaddqp v2, v2, v3
|
|
; CHECK-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: fp128Array:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: mflr r0
|
|
; CHECK-P8-NEXT: std r0, 16(r1)
|
|
; CHECK-P8-NEXT: stdu r1, -32(r1)
|
|
; CHECK-P8-NEXT: .cfi_def_cfa_offset 32
|
|
; CHECK-P8-NEXT: .cfi_offset lr, 16
|
|
; CHECK-P8-NEXT: sldi r4, r4, 4
|
|
; CHECK-P8-NEXT: ld r7, 0(r3)
|
|
; CHECK-P8-NEXT: add r6, r3, r4
|
|
; CHECK-P8-NEXT: ld r4, 8(r3)
|
|
; CHECK-P8-NEXT: ld r5, -16(r6)
|
|
; CHECK-P8-NEXT: ld r6, -8(r6)
|
|
; CHECK-P8-NEXT: mr r3, r7
|
|
; CHECK-P8-NEXT: bl __addkf3
|
|
; CHECK-P8-NEXT: nop
|
|
; CHECK-P8-NEXT: addi r1, r1, 32
|
|
; CHECK-P8-NEXT: ld r0, 16(r1)
|
|
; CHECK-P8-NEXT: mtlr r0
|
|
; CHECK-P8-NEXT: blr
|
|
i32 signext %loopcnt, fp128* nocapture readnone %sum) {
|
|
entry:
|
|
%0 = load fp128, fp128* %farray, align 16
|
|
%sub = add nsw i32 %loopcnt, -1
|
|
%idxprom = sext i32 %sub to i64
|
|
%arrayidx1 = getelementptr inbounds fp128, fp128* %farray, i64 %idxprom
|
|
%1 = load fp128, fp128* %arrayidx1, align 16
|
|
%add = fadd fp128 %0, %1
|
|
ret fp128 %add
|
|
}
|
|
|
|
; Up to 12 qualified floating-point arguments can be passed in v2-v13.
|
|
; Function to test passing 13 float128 parameters.
|
|
; Function Attrs: norecurse nounwind readnone
|
|
define fp128 @maxVecParam(fp128 %p1, fp128 %p2, fp128 %p3, fp128 %p4, fp128 %p5,
|
|
; CHECK-LABEL: maxVecParam:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: xsaddqp v2, v2, v3
|
|
; CHECK-NEXT: lxv v0, 224(r1)
|
|
; CHECK-NEXT: xsaddqp v2, v2, v4
|
|
; CHECK-NEXT: xsaddqp v2, v2, v5
|
|
; CHECK-NEXT: xsaddqp v2, v2, v6
|
|
; CHECK-NEXT: xsaddqp v2, v2, v7
|
|
; CHECK-NEXT: xsaddqp v2, v2, v8
|
|
; CHECK-NEXT: xsaddqp v2, v2, v9
|
|
; CHECK-NEXT: xsaddqp v2, v2, v10
|
|
; CHECK-NEXT: xsaddqp v2, v2, v11
|
|
; CHECK-NEXT: xsaddqp v2, v2, v12
|
|
; CHECK-NEXT: xsaddqp v2, v2, v13
|
|
; CHECK-NEXT: xssubqp v2, v2, v0
|
|
; CHECK-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: maxVecParam:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: mflr r0
|
|
; CHECK-P8-NEXT: .cfi_def_cfa_offset 208
|
|
; CHECK-P8-NEXT: .cfi_offset lr, 16
|
|
; CHECK-P8-NEXT: .cfi_offset r14, -144
|
|
; CHECK-P8-NEXT: .cfi_offset r15, -136
|
|
; CHECK-P8-NEXT: .cfi_offset r16, -128
|
|
; CHECK-P8-NEXT: .cfi_offset r17, -120
|
|
; CHECK-P8-NEXT: .cfi_offset r18, -112
|
|
; CHECK-P8-NEXT: .cfi_offset r19, -104
|
|
; CHECK-P8-NEXT: .cfi_offset r20, -96
|
|
; CHECK-P8-NEXT: .cfi_offset r21, -88
|
|
; CHECK-P8-NEXT: .cfi_offset r22, -80
|
|
; CHECK-P8-NEXT: .cfi_offset r23, -72
|
|
; CHECK-P8-NEXT: .cfi_offset r24, -64
|
|
; CHECK-P8-NEXT: .cfi_offset r25, -56
|
|
; CHECK-P8-NEXT: .cfi_offset r26, -48
|
|
; CHECK-P8-NEXT: .cfi_offset r27, -40
|
|
; CHECK-P8-NEXT: .cfi_offset r28, -32
|
|
; CHECK-P8-NEXT: .cfi_offset r29, -24
|
|
; CHECK-P8-NEXT: .cfi_offset r30, -16
|
|
; CHECK-P8-NEXT: .cfi_offset r31, -8
|
|
; CHECK-P8-NEXT: std r14, -144(r1) # 8-byte Folded Spill
|
|
; CHECK-P8-NEXT: std r15, -136(r1) # 8-byte Folded Spill
|
|
; CHECK-P8-NEXT: std r16, -128(r1) # 8-byte Folded Spill
|
|
; CHECK-P8-NEXT: std r17, -120(r1) # 8-byte Folded Spill
|
|
; CHECK-P8-NEXT: std r18, -112(r1) # 8-byte Folded Spill
|
|
; CHECK-P8-NEXT: std r19, -104(r1) # 8-byte Folded Spill
|
|
; CHECK-P8-NEXT: std r20, -96(r1) # 8-byte Folded Spill
|
|
; CHECK-P8-NEXT: std r21, -88(r1) # 8-byte Folded Spill
|
|
; CHECK-P8-NEXT: std r22, -80(r1) # 8-byte Folded Spill
|
|
; CHECK-P8-NEXT: std r23, -72(r1) # 8-byte Folded Spill
|
|
; CHECK-P8-NEXT: std r24, -64(r1) # 8-byte Folded Spill
|
|
; CHECK-P8-NEXT: std r25, -56(r1) # 8-byte Folded Spill
|
|
; CHECK-P8-NEXT: std r26, -48(r1) # 8-byte Folded Spill
|
|
; CHECK-P8-NEXT: std r27, -40(r1) # 8-byte Folded Spill
|
|
; CHECK-P8-NEXT: std r28, -32(r1) # 8-byte Folded Spill
|
|
; CHECK-P8-NEXT: std r29, -24(r1) # 8-byte Folded Spill
|
|
; CHECK-P8-NEXT: std r30, -16(r1) # 8-byte Folded Spill
|
|
; CHECK-P8-NEXT: std r31, -8(r1) # 8-byte Folded Spill
|
|
; CHECK-P8-NEXT: std r0, 16(r1)
|
|
; CHECK-P8-NEXT: stdu r1, -208(r1)
|
|
; CHECK-P8-NEXT: mr r17, r7
|
|
; CHECK-P8-NEXT: ld r7, 432(r1)
|
|
; CHECK-P8-NEXT: ld r26, 400(r1)
|
|
; CHECK-P8-NEXT: ld r25, 408(r1)
|
|
; CHECK-P8-NEXT: ld r24, 384(r1)
|
|
; CHECK-P8-NEXT: mr r20, r10
|
|
; CHECK-P8-NEXT: ld r23, 392(r1)
|
|
; CHECK-P8-NEXT: ld r22, 368(r1)
|
|
; CHECK-P8-NEXT: ld r21, 376(r1)
|
|
; CHECK-P8-NEXT: ld r16, 352(r1)
|
|
; CHECK-P8-NEXT: mr r19, r9
|
|
; CHECK-P8-NEXT: mr r18, r8
|
|
; CHECK-P8-NEXT: ld r15, 360(r1)
|
|
; CHECK-P8-NEXT: ld r14, 336(r1)
|
|
; CHECK-P8-NEXT: ld r31, 344(r1)
|
|
; CHECK-P8-NEXT: ld r30, 320(r1)
|
|
; CHECK-P8-NEXT: std r7, 56(r1) # 8-byte Folded Spill
|
|
; CHECK-P8-NEXT: ld r7, 440(r1)
|
|
; CHECK-P8-NEXT: ld r29, 328(r1)
|
|
; CHECK-P8-NEXT: ld r28, 304(r1)
|
|
; CHECK-P8-NEXT: ld r27, 312(r1)
|
|
; CHECK-P8-NEXT: std r7, 48(r1) # 8-byte Folded Spill
|
|
; CHECK-P8-NEXT: ld r7, 416(r1)
|
|
; CHECK-P8-NEXT: std r7, 40(r1) # 8-byte Folded Spill
|
|
; CHECK-P8-NEXT: ld r7, 424(r1)
|
|
; CHECK-P8-NEXT: std r7, 32(r1) # 8-byte Folded Spill
|
|
; CHECK-P8-NEXT: bl __addkf3
|
|
; CHECK-P8-NEXT: nop
|
|
; CHECK-P8-NEXT: mr r5, r17
|
|
; CHECK-P8-NEXT: mr r6, r18
|
|
; CHECK-P8-NEXT: bl __addkf3
|
|
; CHECK-P8-NEXT: nop
|
|
; CHECK-P8-NEXT: mr r5, r19
|
|
; CHECK-P8-NEXT: mr r6, r20
|
|
; CHECK-P8-NEXT: bl __addkf3
|
|
; CHECK-P8-NEXT: nop
|
|
; CHECK-P8-NEXT: mr r5, r28
|
|
; CHECK-P8-NEXT: mr r6, r27
|
|
; CHECK-P8-NEXT: bl __addkf3
|
|
; CHECK-P8-NEXT: nop
|
|
; CHECK-P8-NEXT: mr r5, r30
|
|
; CHECK-P8-NEXT: mr r6, r29
|
|
; CHECK-P8-NEXT: bl __addkf3
|
|
; CHECK-P8-NEXT: nop
|
|
; CHECK-P8-NEXT: mr r5, r14
|
|
; CHECK-P8-NEXT: mr r6, r31
|
|
; CHECK-P8-NEXT: bl __addkf3
|
|
; CHECK-P8-NEXT: nop
|
|
; CHECK-P8-NEXT: mr r5, r16
|
|
; CHECK-P8-NEXT: mr r6, r15
|
|
; CHECK-P8-NEXT: bl __addkf3
|
|
; CHECK-P8-NEXT: nop
|
|
; CHECK-P8-NEXT: mr r5, r22
|
|
; CHECK-P8-NEXT: mr r6, r21
|
|
; CHECK-P8-NEXT: bl __addkf3
|
|
; CHECK-P8-NEXT: nop
|
|
; CHECK-P8-NEXT: mr r5, r24
|
|
; CHECK-P8-NEXT: mr r6, r23
|
|
; CHECK-P8-NEXT: bl __addkf3
|
|
; CHECK-P8-NEXT: nop
|
|
; CHECK-P8-NEXT: mr r5, r26
|
|
; CHECK-P8-NEXT: mr r6, r25
|
|
; CHECK-P8-NEXT: bl __addkf3
|
|
; CHECK-P8-NEXT: nop
|
|
; CHECK-P8-NEXT: ld r5, 40(r1) # 8-byte Folded Reload
|
|
; CHECK-P8-NEXT: ld r6, 32(r1) # 8-byte Folded Reload
|
|
; CHECK-P8-NEXT: bl __addkf3
|
|
; CHECK-P8-NEXT: nop
|
|
; CHECK-P8-NEXT: ld r5, 56(r1) # 8-byte Folded Reload
|
|
; CHECK-P8-NEXT: ld r6, 48(r1) # 8-byte Folded Reload
|
|
; CHECK-P8-NEXT: bl __subkf3
|
|
; CHECK-P8-NEXT: nop
|
|
; CHECK-P8-NEXT: addi r1, r1, 208
|
|
; CHECK-P8-NEXT: ld r0, 16(r1)
|
|
; CHECK-P8-NEXT: ld r31, -8(r1) # 8-byte Folded Reload
|
|
; CHECK-P8-NEXT: ld r30, -16(r1) # 8-byte Folded Reload
|
|
; CHECK-P8-NEXT: ld r29, -24(r1) # 8-byte Folded Reload
|
|
; CHECK-P8-NEXT: ld r28, -32(r1) # 8-byte Folded Reload
|
|
; CHECK-P8-NEXT: ld r27, -40(r1) # 8-byte Folded Reload
|
|
; CHECK-P8-NEXT: ld r26, -48(r1) # 8-byte Folded Reload
|
|
; CHECK-P8-NEXT: ld r25, -56(r1) # 8-byte Folded Reload
|
|
; CHECK-P8-NEXT: ld r24, -64(r1) # 8-byte Folded Reload
|
|
; CHECK-P8-NEXT: ld r23, -72(r1) # 8-byte Folded Reload
|
|
; CHECK-P8-NEXT: ld r22, -80(r1) # 8-byte Folded Reload
|
|
; CHECK-P8-NEXT: ld r21, -88(r1) # 8-byte Folded Reload
|
|
; CHECK-P8-NEXT: mtlr r0
|
|
; CHECK-P8-NEXT: ld r20, -96(r1) # 8-byte Folded Reload
|
|
; CHECK-P8-NEXT: ld r19, -104(r1) # 8-byte Folded Reload
|
|
; CHECK-P8-NEXT: ld r18, -112(r1) # 8-byte Folded Reload
|
|
; CHECK-P8-NEXT: ld r17, -120(r1) # 8-byte Folded Reload
|
|
; CHECK-P8-NEXT: ld r16, -128(r1) # 8-byte Folded Reload
|
|
; CHECK-P8-NEXT: ld r15, -136(r1) # 8-byte Folded Reload
|
|
; CHECK-P8-NEXT: ld r14, -144(r1) # 8-byte Folded Reload
|
|
; CHECK-P8-NEXT: blr
|
|
fp128 %p6, fp128 %p7, fp128 %p8, fp128 %p9, fp128 %p10,
|
|
fp128 %p11, fp128 %p12, fp128 %p13) {
|
|
entry:
|
|
%add = fadd fp128 %p1, %p2
|
|
%add1 = fadd fp128 %add, %p3
|
|
%add2 = fadd fp128 %add1, %p4
|
|
%add3 = fadd fp128 %add2, %p5
|
|
%add4 = fadd fp128 %add3, %p6
|
|
%add5 = fadd fp128 %add4, %p7
|
|
%add6 = fadd fp128 %add5, %p8
|
|
%add7 = fadd fp128 %add6, %p9
|
|
%add8 = fadd fp128 %add7, %p10
|
|
%add9 = fadd fp128 %add8, %p11
|
|
%add10 = fadd fp128 %add9, %p12
|
|
%sub = fsub fp128 %add10, %p13
|
|
ret fp128 %sub
|
|
}
|
|
|
|
; Passing a mix of float128 and other type parameters.
|
|
; Function Attrs: norecurse nounwind readnone
|
|
define fp128 @mixParam_01(fp128 %a, i32 signext %i, fp128 %b) {
|
|
; CHECK-LABEL: mixParam_01:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: xsaddqp v2, v2, v3
|
|
; CHECK-NEXT: mtvsrwa v3, r5
|
|
; CHECK-NEXT: xscvsdqp v3, v3
|
|
; CHECK-NEXT: xsaddqp v2, v2, v3
|
|
; CHECK-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: mixParam_01:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: mflr r0
|
|
; CHECK-P8-NEXT: .cfi_def_cfa_offset 64
|
|
; CHECK-P8-NEXT: .cfi_offset lr, 16
|
|
; CHECK-P8-NEXT: .cfi_offset r28, -32
|
|
; CHECK-P8-NEXT: .cfi_offset r29, -24
|
|
; CHECK-P8-NEXT: .cfi_offset r30, -16
|
|
; CHECK-P8-NEXT: std r28, -32(r1) # 8-byte Folded Spill
|
|
; CHECK-P8-NEXT: std r29, -24(r1) # 8-byte Folded Spill
|
|
; CHECK-P8-NEXT: std r30, -16(r1) # 8-byte Folded Spill
|
|
; CHECK-P8-NEXT: std r0, 16(r1)
|
|
; CHECK-P8-NEXT: stdu r1, -64(r1)
|
|
; CHECK-P8-NEXT: mr r30, r5
|
|
; CHECK-P8-NEXT: mr r5, r6
|
|
; CHECK-P8-NEXT: mr r6, r7
|
|
; CHECK-P8-NEXT: bl __addkf3
|
|
; CHECK-P8-NEXT: nop
|
|
; CHECK-P8-NEXT: mr r29, r3
|
|
; CHECK-P8-NEXT: mr r3, r30
|
|
; CHECK-P8-NEXT: mr r28, r4
|
|
; CHECK-P8-NEXT: bl __floatsikf
|
|
; CHECK-P8-NEXT: nop
|
|
; CHECK-P8-NEXT: mr r5, r3
|
|
; CHECK-P8-NEXT: mr r6, r4
|
|
; CHECK-P8-NEXT: mr r3, r29
|
|
; CHECK-P8-NEXT: mr r4, r28
|
|
; CHECK-P8-NEXT: bl __addkf3
|
|
; CHECK-P8-NEXT: nop
|
|
; CHECK-P8-NEXT: addi r1, r1, 64
|
|
; CHECK-P8-NEXT: ld r0, 16(r1)
|
|
; CHECK-P8-NEXT: ld r30, -16(r1) # 8-byte Folded Reload
|
|
; CHECK-P8-NEXT: ld r29, -24(r1) # 8-byte Folded Reload
|
|
; CHECK-P8-NEXT: ld r28, -32(r1) # 8-byte Folded Reload
|
|
; CHECK-P8-NEXT: mtlr r0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%add = fadd fp128 %a, %b
|
|
%conv = sitofp i32 %i to fp128
|
|
%add1 = fadd fp128 %add, %conv
|
|
ret fp128 %add1
|
|
}
|
|
; Function Attrs: norecurse nounwind readnone
|
|
define fastcc fp128 @mixParam_01f(fp128 %a, i32 signext %i, fp128 %b) {
|
|
; CHECK-LABEL: mixParam_01f:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: xsaddqp v2, v2, v3
|
|
; CHECK-NEXT: mtvsrwa v3, r3
|
|
; CHECK-NEXT: xscvsdqp v3, v3
|
|
; CHECK-NEXT: xsaddqp v2, v2, v3
|
|
; CHECK-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: mixParam_01f:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: mflr r0
|
|
; CHECK-P8-NEXT: .cfi_def_cfa_offset 64
|
|
; CHECK-P8-NEXT: .cfi_offset lr, 16
|
|
; CHECK-P8-NEXT: .cfi_offset r28, -32
|
|
; CHECK-P8-NEXT: .cfi_offset r29, -24
|
|
; CHECK-P8-NEXT: .cfi_offset r30, -16
|
|
; CHECK-P8-NEXT: std r28, -32(r1) # 8-byte Folded Spill
|
|
; CHECK-P8-NEXT: std r29, -24(r1) # 8-byte Folded Spill
|
|
; CHECK-P8-NEXT: std r30, -16(r1) # 8-byte Folded Spill
|
|
; CHECK-P8-NEXT: std r0, 16(r1)
|
|
; CHECK-P8-NEXT: stdu r1, -64(r1)
|
|
; CHECK-P8-NEXT: mr r30, r5
|
|
; CHECK-P8-NEXT: mr r5, r6
|
|
; CHECK-P8-NEXT: mr r6, r7
|
|
; CHECK-P8-NEXT: bl __addkf3
|
|
; CHECK-P8-NEXT: nop
|
|
; CHECK-P8-NEXT: mr r29, r3
|
|
; CHECK-P8-NEXT: mr r3, r30
|
|
; CHECK-P8-NEXT: mr r28, r4
|
|
; CHECK-P8-NEXT: bl __floatsikf
|
|
; CHECK-P8-NEXT: nop
|
|
; CHECK-P8-NEXT: mr r5, r3
|
|
; CHECK-P8-NEXT: mr r6, r4
|
|
; CHECK-P8-NEXT: mr r3, r29
|
|
; CHECK-P8-NEXT: mr r4, r28
|
|
; CHECK-P8-NEXT: bl __addkf3
|
|
; CHECK-P8-NEXT: nop
|
|
; CHECK-P8-NEXT: addi r1, r1, 64
|
|
; CHECK-P8-NEXT: ld r0, 16(r1)
|
|
; CHECK-P8-NEXT: ld r30, -16(r1) # 8-byte Folded Reload
|
|
; CHECK-P8-NEXT: ld r29, -24(r1) # 8-byte Folded Reload
|
|
; CHECK-P8-NEXT: ld r28, -32(r1) # 8-byte Folded Reload
|
|
; CHECK-P8-NEXT: mtlr r0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%add = fadd fp128 %a, %b
|
|
%conv = sitofp i32 %i to fp128
|
|
%add1 = fadd fp128 %add, %conv
|
|
ret fp128 %add1
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind
|
|
define fp128 @mixParam_02(fp128 %p1, double %p2, i64* nocapture %p3,
|
|
; CHECK-LABEL: mixParam_02:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: lwz r3, 96(r1)
|
|
; CHECK-NEXT: add r4, r7, r9
|
|
; CHECK-NEXT: xscpsgndp v3, f1, f1
|
|
; CHECK-NEXT: add r4, r4, r10
|
|
; CHECK-NEXT: xscvdpqp v3, v3
|
|
; CHECK-NEXT: add r3, r4, r3
|
|
; CHECK-NEXT: clrldi r3, r3, 32
|
|
; CHECK-NEXT: std r3, 0(r6)
|
|
; CHECK-NEXT: lxv v4, 0(r8)
|
|
; CHECK-NEXT: xsaddqp v2, v4, v2
|
|
; CHECK-NEXT: xsaddqp v2, v2, v3
|
|
; CHECK-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: mixParam_02:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: mflr r0
|
|
; CHECK-P8-NEXT: .cfi_def_cfa_offset 64
|
|
; CHECK-P8-NEXT: .cfi_offset lr, 16
|
|
; CHECK-P8-NEXT: .cfi_offset r29, -32
|
|
; CHECK-P8-NEXT: .cfi_offset r30, -24
|
|
; CHECK-P8-NEXT: .cfi_offset f31, -8
|
|
; CHECK-P8-NEXT: std r29, -32(r1) # 8-byte Folded Spill
|
|
; CHECK-P8-NEXT: std r30, -24(r1) # 8-byte Folded Spill
|
|
; CHECK-P8-NEXT: stfd f31, -8(r1) # 8-byte Folded Spill
|
|
; CHECK-P8-NEXT: std r0, 16(r1)
|
|
; CHECK-P8-NEXT: stdu r1, -64(r1)
|
|
; CHECK-P8-NEXT: mr r11, r4
|
|
; CHECK-P8-NEXT: lwz r4, 160(r1)
|
|
; CHECK-P8-NEXT: add r5, r7, r9
|
|
; CHECK-P8-NEXT: fmr f31, f1
|
|
; CHECK-P8-NEXT: add r5, r5, r10
|
|
; CHECK-P8-NEXT: add r4, r5, r4
|
|
; CHECK-P8-NEXT: clrldi r4, r4, 32
|
|
; CHECK-P8-NEXT: std r4, 0(r6)
|
|
; CHECK-P8-NEXT: mr r6, r3
|
|
; CHECK-P8-NEXT: ld r5, 0(r8)
|
|
; CHECK-P8-NEXT: ld r4, 8(r8)
|
|
; CHECK-P8-NEXT: mr r3, r5
|
|
; CHECK-P8-NEXT: mr r5, r6
|
|
; CHECK-P8-NEXT: mr r6, r11
|
|
; CHECK-P8-NEXT: bl __addkf3
|
|
; CHECK-P8-NEXT: nop
|
|
; CHECK-P8-NEXT: fmr f1, f31
|
|
; CHECK-P8-NEXT: mr r30, r3
|
|
; CHECK-P8-NEXT: mr r29, r4
|
|
; CHECK-P8-NEXT: bl __extenddfkf2
|
|
; CHECK-P8-NEXT: nop
|
|
; CHECK-P8-NEXT: mr r5, r3
|
|
; CHECK-P8-NEXT: mr r6, r4
|
|
; CHECK-P8-NEXT: mr r3, r30
|
|
; CHECK-P8-NEXT: mr r4, r29
|
|
; CHECK-P8-NEXT: bl __addkf3
|
|
; CHECK-P8-NEXT: nop
|
|
; CHECK-P8-NEXT: addi r1, r1, 64
|
|
; CHECK-P8-NEXT: ld r0, 16(r1)
|
|
; CHECK-P8-NEXT: lfd f31, -8(r1) # 8-byte Folded Reload
|
|
; CHECK-P8-NEXT: ld r30, -24(r1) # 8-byte Folded Reload
|
|
; CHECK-P8-NEXT: ld r29, -32(r1) # 8-byte Folded Reload
|
|
; CHECK-P8-NEXT: mtlr r0
|
|
; CHECK-P8-NEXT: blr
|
|
i16 signext %p4, fp128* nocapture readonly %p5,
|
|
i32 signext %p6, i8 zeroext %p7, i32 zeroext %p8) {
|
|
entry:
|
|
%conv = sext i16 %p4 to i32
|
|
%add = add nsw i32 %conv, %p6
|
|
%conv1 = zext i8 %p7 to i32
|
|
%add2 = add nsw i32 %add, %conv1
|
|
%add3 = add i32 %add2, %p8
|
|
%conv4 = zext i32 %add3 to i64
|
|
store i64 %conv4, i64* %p3, align 8
|
|
%0 = load fp128, fp128* %p5, align 16
|
|
%add5 = fadd fp128 %0, %p1
|
|
%conv6 = fpext double %p2 to fp128
|
|
%add7 = fadd fp128 %add5, %conv6
|
|
ret fp128 %add7
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind
|
|
define fastcc fp128 @mixParam_02f(fp128 %p1, double %p2, i64* nocapture %p3,
|
|
; CHECK-LABEL: mixParam_02f:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: add r4, r4, r6
|
|
; CHECK-NEXT: xscpsgndp v3, f1, f1
|
|
; CHECK-NEXT: add r4, r4, r7
|
|
; CHECK-NEXT: xscvdpqp v3, v3
|
|
; CHECK-NEXT: add r4, r4, r8
|
|
; CHECK-NEXT: clrldi r4, r4, 32
|
|
; CHECK-NEXT: std r4, 0(r3)
|
|
; CHECK-NEXT: lxv v4, 0(r5)
|
|
; CHECK-NEXT: xsaddqp v2, v4, v2
|
|
; CHECK-NEXT: xsaddqp v2, v2, v3
|
|
; CHECK-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: mixParam_02f:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: mflr r0
|
|
; CHECK-P8-NEXT: .cfi_def_cfa_offset 64
|
|
; CHECK-P8-NEXT: .cfi_offset lr, 16
|
|
; CHECK-P8-NEXT: .cfi_offset r29, -32
|
|
; CHECK-P8-NEXT: .cfi_offset r30, -24
|
|
; CHECK-P8-NEXT: .cfi_offset f31, -8
|
|
; CHECK-P8-NEXT: std r29, -32(r1) # 8-byte Folded Spill
|
|
; CHECK-P8-NEXT: std r30, -24(r1) # 8-byte Folded Spill
|
|
; CHECK-P8-NEXT: stfd f31, -8(r1) # 8-byte Folded Spill
|
|
; CHECK-P8-NEXT: std r0, 16(r1)
|
|
; CHECK-P8-NEXT: stdu r1, -64(r1)
|
|
; CHECK-P8-NEXT: mr r11, r4
|
|
; CHECK-P8-NEXT: add r4, r6, r8
|
|
; CHECK-P8-NEXT: mr r6, r3
|
|
; CHECK-P8-NEXT: fmr f31, f1
|
|
; CHECK-P8-NEXT: add r4, r4, r9
|
|
; CHECK-P8-NEXT: add r4, r4, r10
|
|
; CHECK-P8-NEXT: clrldi r4, r4, 32
|
|
; CHECK-P8-NEXT: std r4, 0(r5)
|
|
; CHECK-P8-NEXT: ld r5, 0(r7)
|
|
; CHECK-P8-NEXT: ld r4, 8(r7)
|
|
; CHECK-P8-NEXT: mr r3, r5
|
|
; CHECK-P8-NEXT: mr r5, r6
|
|
; CHECK-P8-NEXT: mr r6, r11
|
|
; CHECK-P8-NEXT: bl __addkf3
|
|
; CHECK-P8-NEXT: nop
|
|
; CHECK-P8-NEXT: fmr f1, f31
|
|
; CHECK-P8-NEXT: mr r30, r3
|
|
; CHECK-P8-NEXT: mr r29, r4
|
|
; CHECK-P8-NEXT: bl __extenddfkf2
|
|
; CHECK-P8-NEXT: nop
|
|
; CHECK-P8-NEXT: mr r5, r3
|
|
; CHECK-P8-NEXT: mr r6, r4
|
|
; CHECK-P8-NEXT: mr r3, r30
|
|
; CHECK-P8-NEXT: mr r4, r29
|
|
; CHECK-P8-NEXT: bl __addkf3
|
|
; CHECK-P8-NEXT: nop
|
|
; CHECK-P8-NEXT: addi r1, r1, 64
|
|
; CHECK-P8-NEXT: ld r0, 16(r1)
|
|
; CHECK-P8-NEXT: lfd f31, -8(r1) # 8-byte Folded Reload
|
|
; CHECK-P8-NEXT: ld r30, -24(r1) # 8-byte Folded Reload
|
|
; CHECK-P8-NEXT: ld r29, -32(r1) # 8-byte Folded Reload
|
|
; CHECK-P8-NEXT: mtlr r0
|
|
; CHECK-P8-NEXT: blr
|
|
i16 signext %p4, fp128* nocapture readonly %p5,
|
|
i32 signext %p6, i8 zeroext %p7, i32 zeroext %p8) {
|
|
entry:
|
|
%conv = sext i16 %p4 to i32
|
|
%add = add nsw i32 %conv, %p6
|
|
%conv1 = zext i8 %p7 to i32
|
|
%add2 = add nsw i32 %add, %conv1
|
|
%add3 = add i32 %add2, %p8
|
|
%conv4 = zext i32 %add3 to i64
|
|
store i64 %conv4, i64* %p3, align 8
|
|
%0 = load fp128, fp128* %p5, align 16
|
|
%add5 = fadd fp128 %0, %p1
|
|
%conv6 = fpext double %p2 to fp128
|
|
%add7 = fadd fp128 %add5, %conv6
|
|
ret fp128 %add7
|
|
}
|
|
|
|
; Passing a mix of float128 and vector parameters.
|
|
; Function Attrs: norecurse nounwind
|
|
define void @mixParam_03(fp128 %f1, double* nocapture %d1, <4 x i32> %vec1,
|
|
; CHECK-LABEL: mixParam_03:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: ld r3, 104(r1)
|
|
; CHECK-NEXT: stxv v2, 0(r9)
|
|
; CHECK-NEXT: stxvx v3, 0, r3
|
|
; CHECK-NEXT: mtvsrwa v3, r10
|
|
; CHECK-NEXT: lxv v2, 0(r9)
|
|
; CHECK-NEXT: xscvsdqp v3, v3
|
|
; CHECK-NEXT: xsaddqp v2, v2, v3
|
|
; CHECK-NEXT: xscvqpdp v2, v2
|
|
; CHECK-NEXT: stxsd v2, 0(r5)
|
|
; CHECK-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: mixParam_03:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: mflr r0
|
|
; CHECK-P8-NEXT: .cfi_def_cfa_offset 64
|
|
; CHECK-P8-NEXT: .cfi_offset lr, 16
|
|
; CHECK-P8-NEXT: .cfi_offset r28, -32
|
|
; CHECK-P8-NEXT: .cfi_offset r29, -24
|
|
; CHECK-P8-NEXT: .cfi_offset r30, -16
|
|
; CHECK-P8-NEXT: std r28, -32(r1) # 8-byte Folded Spill
|
|
; CHECK-P8-NEXT: std r29, -24(r1) # 8-byte Folded Spill
|
|
; CHECK-P8-NEXT: std r30, -16(r1) # 8-byte Folded Spill
|
|
; CHECK-P8-NEXT: std r0, 16(r1)
|
|
; CHECK-P8-NEXT: stdu r1, -64(r1)
|
|
; CHECK-P8-NEXT: ld r6, 168(r1)
|
|
; CHECK-P8-NEXT: std r4, 8(r9)
|
|
; CHECK-P8-NEXT: std r3, 0(r9)
|
|
; CHECK-P8-NEXT: mr r3, r10
|
|
; CHECK-P8-NEXT: mr r28, r5
|
|
; CHECK-P8-NEXT: stvx v2, 0, r6
|
|
; CHECK-P8-NEXT: ld r30, 0(r9)
|
|
; CHECK-P8-NEXT: ld r29, 8(r9)
|
|
; CHECK-P8-NEXT: bl __floatsikf
|
|
; CHECK-P8-NEXT: nop
|
|
; CHECK-P8-NEXT: mr r5, r3
|
|
; CHECK-P8-NEXT: mr r6, r4
|
|
; CHECK-P8-NEXT: mr r3, r30
|
|
; CHECK-P8-NEXT: mr r4, r29
|
|
; CHECK-P8-NEXT: bl __addkf3
|
|
; CHECK-P8-NEXT: nop
|
|
; CHECK-P8-NEXT: bl __trunckfdf2
|
|
; CHECK-P8-NEXT: nop
|
|
; CHECK-P8-NEXT: stfdx f1, 0, r28
|
|
; CHECK-P8-NEXT: addi r1, r1, 64
|
|
; CHECK-P8-NEXT: ld r0, 16(r1)
|
|
; CHECK-P8-NEXT: ld r30, -16(r1) # 8-byte Folded Reload
|
|
; CHECK-P8-NEXT: ld r29, -24(r1) # 8-byte Folded Reload
|
|
; CHECK-P8-NEXT: ld r28, -32(r1) # 8-byte Folded Reload
|
|
; CHECK-P8-NEXT: mtlr r0
|
|
; CHECK-P8-NEXT: blr
|
|
fp128* nocapture %f2, i32 signext %i1, i8 zeroext %c1,
|
|
<4 x i32>* nocapture %vec2) {
|
|
entry:
|
|
store fp128 %f1, fp128* %f2, align 16
|
|
store <4 x i32> %vec1, <4 x i32>* %vec2, align 16
|
|
%0 = load fp128, fp128* %f2, align 16
|
|
%conv = sitofp i32 %i1 to fp128
|
|
%add = fadd fp128 %0, %conv
|
|
%conv1 = fptrunc fp128 %add to double
|
|
store double %conv1, double* %d1, align 8
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind
|
|
define fastcc void @mixParam_03f(fp128 %f1, double* nocapture %d1, <4 x i32> %vec1,
|
|
; CHECK-LABEL: mixParam_03f:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: stxv v2, 0(r4)
|
|
; CHECK-NEXT: stxv v3, 0(r7)
|
|
; CHECK-NEXT: lxv v2, 0(r4)
|
|
; CHECK-NEXT: mtvsrwa v3, r5
|
|
; CHECK-NEXT: xscvsdqp v3, v3
|
|
; CHECK-NEXT: xsaddqp v2, v2, v3
|
|
; CHECK-NEXT: xscvqpdp v2, v2
|
|
; CHECK-NEXT: stxsd v2, 0(r3)
|
|
; CHECK-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: mixParam_03f:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: mflr r0
|
|
; CHECK-P8-NEXT: .cfi_def_cfa_offset 64
|
|
; CHECK-P8-NEXT: .cfi_offset lr, 16
|
|
; CHECK-P8-NEXT: .cfi_offset r28, -32
|
|
; CHECK-P8-NEXT: .cfi_offset r29, -24
|
|
; CHECK-P8-NEXT: .cfi_offset r30, -16
|
|
; CHECK-P8-NEXT: std r28, -32(r1) # 8-byte Folded Spill
|
|
; CHECK-P8-NEXT: std r29, -24(r1) # 8-byte Folded Spill
|
|
; CHECK-P8-NEXT: std r30, -16(r1) # 8-byte Folded Spill
|
|
; CHECK-P8-NEXT: std r0, 16(r1)
|
|
; CHECK-P8-NEXT: stdu r1, -64(r1)
|
|
; CHECK-P8-NEXT: std r4, 8(r6)
|
|
; CHECK-P8-NEXT: std r3, 0(r6)
|
|
; CHECK-P8-NEXT: mr r3, r7
|
|
; CHECK-P8-NEXT: mr r28, r5
|
|
; CHECK-P8-NEXT: stvx v2, 0, r9
|
|
; CHECK-P8-NEXT: ld r30, 0(r6)
|
|
; CHECK-P8-NEXT: ld r29, 8(r6)
|
|
; CHECK-P8-NEXT: bl __floatsikf
|
|
; CHECK-P8-NEXT: nop
|
|
; CHECK-P8-NEXT: mr r5, r3
|
|
; CHECK-P8-NEXT: mr r6, r4
|
|
; CHECK-P8-NEXT: mr r3, r30
|
|
; CHECK-P8-NEXT: mr r4, r29
|
|
; CHECK-P8-NEXT: bl __addkf3
|
|
; CHECK-P8-NEXT: nop
|
|
; CHECK-P8-NEXT: bl __trunckfdf2
|
|
; CHECK-P8-NEXT: nop
|
|
; CHECK-P8-NEXT: stfdx f1, 0, r28
|
|
; CHECK-P8-NEXT: addi r1, r1, 64
|
|
; CHECK-P8-NEXT: ld r0, 16(r1)
|
|
; CHECK-P8-NEXT: ld r30, -16(r1) # 8-byte Folded Reload
|
|
; CHECK-P8-NEXT: ld r29, -24(r1) # 8-byte Folded Reload
|
|
; CHECK-P8-NEXT: ld r28, -32(r1) # 8-byte Folded Reload
|
|
; CHECK-P8-NEXT: mtlr r0
|
|
; CHECK-P8-NEXT: blr
|
|
fp128* nocapture %f2, i32 signext %i1, i8 zeroext %c1,
|
|
<4 x i32>* nocapture %vec2) {
|
|
entry:
|
|
store fp128 %f1, fp128* %f2, align 16
|
|
store <4 x i32> %vec1, <4 x i32>* %vec2, align 16
|
|
%0 = load fp128, fp128* %f2, align 16
|
|
%conv = sitofp i32 %i1 to fp128
|
|
%add = fadd fp128 %0, %conv
|
|
%conv1 = fptrunc fp128 %add to double
|
|
store double %conv1, double* %d1, align 8
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: noinline optnone
|
|
define signext i32 @noopt_call_crash() #0 {
|
|
; CHECK-LABEL: noopt_call_crash:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: mflr r0
|
|
; CHECK-NEXT: std r0, 16(r1)
|
|
; CHECK-NEXT: stdu r1, -96(r1)
|
|
; CHECK-NEXT: .cfi_def_cfa_offset 96
|
|
; CHECK-NEXT: .cfi_offset lr, 16
|
|
; CHECK-NEXT: bl in
|
|
; CHECK-NEXT: nop
|
|
; CHECK-NEXT: bl out
|
|
; CHECK-NEXT: nop
|
|
; CHECK-NEXT: li r3, 0
|
|
; CHECK-NEXT: addi r1, r1, 96
|
|
; CHECK-NEXT: ld r0, 16(r1)
|
|
; CHECK-NEXT: mtlr r0
|
|
; CHECK-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: noopt_call_crash:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: mflr r0
|
|
; CHECK-P8-NEXT: std r0, 16(r1)
|
|
; CHECK-P8-NEXT: stdu r1, -32(r1)
|
|
; CHECK-P8-NEXT: .cfi_def_cfa_offset 32
|
|
; CHECK-P8-NEXT: .cfi_offset lr, 16
|
|
; CHECK-P8-NEXT: bl in
|
|
; CHECK-P8-NEXT: nop
|
|
; CHECK-P8-NEXT: bl out
|
|
; CHECK-P8-NEXT: nop
|
|
; CHECK-P8-NEXT: li r3, 0
|
|
; CHECK-P8-NEXT: addi r1, r1, 32
|
|
; CHECK-P8-NEXT: ld r0, 16(r1)
|
|
; CHECK-P8-NEXT: mtlr r0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%call = call fp128 @in()
|
|
call void @out(fp128 %call)
|
|
ret i32 0
|
|
}
|
|
|
|
declare void @out(fp128)
|
|
declare fp128 @in()
|
|
|
|
attributes #0 = { noinline optnone }
|