; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -mcpu=pwr8 -mtriple=powerpc64le-unknown-unknown \
; RUN:   -verify-machineinstrs -ppc-asm-full-reg-names < %s | FileCheck %s \
; RUN:   --check-prefix=P8
; RUN: llc -mcpu=pwr9 -mtriple=powerpc64le-unknown-unknown \
; RUN:   -verify-machineinstrs -ppc-asm-full-reg-names < %s | FileCheck %s
; RUN: llc -mcpu=pwr9 -mtriple=powerpc64le-unknown-unknown -mattr=-hard-float \
; RUN:   -verify-machineinstrs -ppc-asm-full-reg-names < %s | FileCheck %s \
; RUN:   --check-prefix=SOFT

; Tests for various operations on half precison float. Much of the test is
; copied from test/CodeGen/X86/half.ll.
define dso_local double @loadd(i16* nocapture readonly %a) local_unnamed_addr #0 {
; P8-LABEL: loadd:
; P8:       # %bb.0: # %entry
; P8-NEXT:    mflr r0
; P8-NEXT:    std r0, 16(r1)
; P8-NEXT:    stdu r1, -32(r1)
; P8-NEXT:    lhz r3, 2(r3)
; P8-NEXT:    bl __gnu_h2f_ieee
; P8-NEXT:    nop
; P8-NEXT:    addi r1, r1, 32
; P8-NEXT:    ld r0, 16(r1)
; P8-NEXT:    mtlr r0
; P8-NEXT:    blr
;
; CHECK-LABEL: loadd:
; CHECK:       # %bb.0: # %entry
; CHECK-NEXT:    addi r3, r3, 2
; CHECK-NEXT:    lxsihzx f0, 0, r3
; CHECK-NEXT:    xscvhpdp f1, f0
; CHECK-NEXT:    blr
;
; SOFT-LABEL: loadd:
; SOFT:       # %bb.0: # %entry
; SOFT-NEXT:    mflr r0
; SOFT-NEXT:    std r0, 16(r1)
; SOFT-NEXT:    stdu r1, -32(r1)
; SOFT-NEXT:    lhz r3, 2(r3)
; SOFT-NEXT:    bl __gnu_h2f_ieee
; SOFT-NEXT:    nop
; SOFT-NEXT:    bl __extendsfdf2
; SOFT-NEXT:    nop
; SOFT-NEXT:    addi r1, r1, 32
; SOFT-NEXT:    ld r0, 16(r1)
; SOFT-NEXT:    mtlr r0
; SOFT-NEXT:    blr
entry:
  %arrayidx = getelementptr inbounds i16, i16* %a, i64 1
  %0 = load i16, i16* %arrayidx, align 2
  %1 = tail call double @llvm.convert.from.fp16.f64(i16 %0)
  ret double %1
}

declare double @llvm.convert.from.fp16.f64(i16)

define dso_local float @loadf(i16* nocapture readonly %a) local_unnamed_addr #0 {
; P8-LABEL: loadf:
; P8:       # %bb.0: # %entry
; P8-NEXT:    mflr r0
; P8-NEXT:    std r0, 16(r1)
; P8-NEXT:    stdu r1, -32(r1)
; P8-NEXT:    lhz r3, 2(r3)
; P8-NEXT:    bl __gnu_h2f_ieee
; P8-NEXT:    nop
; P8-NEXT:    addi r1, r1, 32
; P8-NEXT:    ld r0, 16(r1)
; P8-NEXT:    mtlr r0
; P8-NEXT:    blr
;
; CHECK-LABEL: loadf:
; CHECK:       # %bb.0: # %entry
; CHECK-NEXT:    addi r3, r3, 2
; CHECK-NEXT:    lxsihzx f0, 0, r3
; CHECK-NEXT:    xscvhpdp f1, f0
; CHECK-NEXT:    blr
;
; SOFT-LABEL: loadf:
; SOFT:       # %bb.0: # %entry
; SOFT-NEXT:    mflr r0
; SOFT-NEXT:    std r0, 16(r1)
; SOFT-NEXT:    stdu r1, -32(r1)
; SOFT-NEXT:    lhz r3, 2(r3)
; SOFT-NEXT:    bl __gnu_h2f_ieee
; SOFT-NEXT:    nop
; SOFT-NEXT:    addi r1, r1, 32
; SOFT-NEXT:    ld r0, 16(r1)
; SOFT-NEXT:    mtlr r0
; SOFT-NEXT:    blr
entry:
  %arrayidx = getelementptr inbounds i16, i16* %a, i64 1
  %0 = load i16, i16* %arrayidx, align 2
  %1 = tail call float @llvm.convert.from.fp16.f32(i16 %0)
  ret float %1
}

declare float @llvm.convert.from.fp16.f32(i16)

define dso_local void @stored(i16* nocapture %a, double %b) local_unnamed_addr #0 {
; P8-LABEL: stored:
; P8:       # %bb.0: # %entry
; P8-NEXT:    mflr r0
; P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
; P8-NEXT:    std r0, 16(r1)
; P8-NEXT:    stdu r1, -48(r1)
; P8-NEXT:    mr r30, r3
; P8-NEXT:    bl __truncdfhf2
; P8-NEXT:    nop
; P8-NEXT:    sth r3, 0(r30)
; P8-NEXT:    addi r1, r1, 48
; P8-NEXT:    ld r0, 16(r1)
; P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
; P8-NEXT:    mtlr r0
; P8-NEXT:    blr
;
; CHECK-LABEL: stored:
; CHECK:       # %bb.0: # %entry
; CHECK-NEXT:    xscvdphp f0, f1
; CHECK-NEXT:    stxsihx f0, 0, r3
; CHECK-NEXT:    blr
;
; SOFT-LABEL: stored:
; SOFT:       # %bb.0: # %entry
; SOFT-NEXT:    mflr r0
; SOFT-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
; SOFT-NEXT:    std r0, 16(r1)
; SOFT-NEXT:    stdu r1, -48(r1)
; SOFT-NEXT:    mr r30, r3
; SOFT-NEXT:    mr r3, r4
; SOFT-NEXT:    bl __truncdfhf2
; SOFT-NEXT:    nop
; SOFT-NEXT:    clrldi r3, r3, 48
; SOFT-NEXT:    bl __gnu_h2f_ieee
; SOFT-NEXT:    nop
; SOFT-NEXT:    bl __gnu_f2h_ieee
; SOFT-NEXT:    nop
; SOFT-NEXT:    sth r3, 0(r30)
; SOFT-NEXT:    addi r1, r1, 48
; SOFT-NEXT:    ld r0, 16(r1)
; SOFT-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
; SOFT-NEXT:    mtlr r0
; SOFT-NEXT:    blr
entry:
  %0 = tail call i16 @llvm.convert.to.fp16.f64(double %b)
  store i16 %0, i16* %a, align 2
  ret void
}

declare i16 @llvm.convert.to.fp16.f64(double)

define dso_local void @storef(i16* nocapture %a, float %b) local_unnamed_addr #0 {
; P8-LABEL: storef:
; P8:       # %bb.0: # %entry
; P8-NEXT:    mflr r0
; P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
; P8-NEXT:    std r0, 16(r1)
; P8-NEXT:    stdu r1, -48(r1)
; P8-NEXT:    mr r30, r3
; P8-NEXT:    bl __gnu_f2h_ieee
; P8-NEXT:    nop
; P8-NEXT:    sth r3, 0(r30)
; P8-NEXT:    addi r1, r1, 48
; P8-NEXT:    ld r0, 16(r1)
; P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
; P8-NEXT:    mtlr r0
; P8-NEXT:    blr
;
; CHECK-LABEL: storef:
; CHECK:       # %bb.0: # %entry
; CHECK-NEXT:    xscvdphp f0, f1
; CHECK-NEXT:    stxsihx f0, 0, r3
; CHECK-NEXT:    blr
;
; SOFT-LABEL: storef:
; SOFT:       # %bb.0: # %entry
; SOFT-NEXT:    mflr r0
; SOFT-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
; SOFT-NEXT:    std r0, 16(r1)
; SOFT-NEXT:    stdu r1, -48(r1)
; SOFT-NEXT:    mr r30, r3
; SOFT-NEXT:    clrldi r3, r4, 32
; SOFT-NEXT:    bl __gnu_f2h_ieee
; SOFT-NEXT:    nop
; SOFT-NEXT:    clrldi r3, r3, 48
; SOFT-NEXT:    bl __gnu_h2f_ieee
; SOFT-NEXT:    nop
; SOFT-NEXT:    bl __gnu_f2h_ieee
; SOFT-NEXT:    nop
; SOFT-NEXT:    sth r3, 0(r30)
; SOFT-NEXT:    addi r1, r1, 48
; SOFT-NEXT:    ld r0, 16(r1)
; SOFT-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
; SOFT-NEXT:    mtlr r0
; SOFT-NEXT:    blr
entry:
  %0 = tail call i16 @llvm.convert.to.fp16.f32(float %b)
  store i16 %0, i16* %a, align 2
  ret void
}

declare i16 @llvm.convert.to.fp16.f32(float)
define void @test_load_store(half* %in, half* %out) #0 {
; P8-LABEL: test_load_store:
; P8:       # %bb.0:
; P8-NEXT:    lhz r3, 0(r3)
; P8-NEXT:    sth r3, 0(r4)
; P8-NEXT:    blr
;
; CHECK-LABEL: test_load_store:
; CHECK:       # %bb.0:
; CHECK-NEXT:    lhz r3, 0(r3)
; CHECK-NEXT:    sth r3, 0(r4)
; CHECK-NEXT:    blr
;
; SOFT-LABEL: test_load_store:
; SOFT:       # %bb.0:
; SOFT-NEXT:    mflr r0
; SOFT-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
; SOFT-NEXT:    std r0, 16(r1)
; SOFT-NEXT:    stdu r1, -48(r1)
; SOFT-NEXT:    lhz r3, 0(r3)
; SOFT-NEXT:    mr r30, r4
; SOFT-NEXT:    bl __gnu_h2f_ieee
; SOFT-NEXT:    nop
; SOFT-NEXT:    bl __gnu_f2h_ieee
; SOFT-NEXT:    nop
; SOFT-NEXT:    sth r3, 0(r30)
; SOFT-NEXT:    addi r1, r1, 48
; SOFT-NEXT:    ld r0, 16(r1)
; SOFT-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
; SOFT-NEXT:    mtlr r0
; SOFT-NEXT:    blr
  %val = load half, half* %in
  store half %val, half* %out
  ret void
}
define i16 @test_bitcast_from_half(half* %addr) #0 {
; P8-LABEL: test_bitcast_from_half:
; P8:       # %bb.0:
; P8-NEXT:    lhz r3, 0(r3)
; P8-NEXT:    blr
;
; CHECK-LABEL: test_bitcast_from_half:
; CHECK:       # %bb.0:
; CHECK-NEXT:    lhz r3, 0(r3)
; CHECK-NEXT:    blr
;
; SOFT-LABEL: test_bitcast_from_half:
; SOFT:       # %bb.0:
; SOFT-NEXT:    lhz r3, 0(r3)
; SOFT-NEXT:    blr
  %val = load half, half* %addr
  %val_int = bitcast half %val to i16
  ret i16 %val_int
}
define void @test_bitcast_to_half(half* %addr, i16 %in) #0 {
; P8-LABEL: test_bitcast_to_half:
; P8:       # %bb.0:
; P8-NEXT:    sth r4, 0(r3)
; P8-NEXT:    blr
;
; CHECK-LABEL: test_bitcast_to_half:
; CHECK:       # %bb.0:
; CHECK-NEXT:    sth r4, 0(r3)
; CHECK-NEXT:    blr
;
; SOFT-LABEL: test_bitcast_to_half:
; SOFT:       # %bb.0:
; SOFT-NEXT:    sth r4, 0(r3)
; SOFT-NEXT:    blr
  %val_fp = bitcast i16 %in to half
  store half %val_fp, half* %addr
  ret void
}
define float @test_extend32(half* %addr) #0 {
; P8-LABEL: test_extend32:
; P8:       # %bb.0:
; P8-NEXT:    mflr r0
; P8-NEXT:    std r0, 16(r1)
; P8-NEXT:    stdu r1, -32(r1)
; P8-NEXT:    lhz r3, 0(r3)
; P8-NEXT:    bl __gnu_h2f_ieee
; P8-NEXT:    nop
; P8-NEXT:    addi r1, r1, 32
; P8-NEXT:    ld r0, 16(r1)
; P8-NEXT:    mtlr r0
; P8-NEXT:    blr
;
; CHECK-LABEL: test_extend32:
; CHECK:       # %bb.0:
; CHECK-NEXT:    lxsihzx f0, 0, r3
; CHECK-NEXT:    xscvhpdp f1, f0
; CHECK-NEXT:    blr
;
; SOFT-LABEL: test_extend32:
; SOFT:       # %bb.0:
; SOFT-NEXT:    mflr r0
; SOFT-NEXT:    std r0, 16(r1)
; SOFT-NEXT:    stdu r1, -32(r1)
; SOFT-NEXT:    lhz r3, 0(r3)
; SOFT-NEXT:    bl __gnu_h2f_ieee
; SOFT-NEXT:    nop
; SOFT-NEXT:    addi r1, r1, 32
; SOFT-NEXT:    ld r0, 16(r1)
; SOFT-NEXT:    mtlr r0
; SOFT-NEXT:    blr
  %val16 = load half, half* %addr
  %val32 = fpext half %val16 to float
  ret float %val32
}
define double @test_extend64(half* %addr) #0 {
; P8-LABEL: test_extend64:
; P8:       # %bb.0:
; P8-NEXT:    mflr r0
; P8-NEXT:    std r0, 16(r1)
; P8-NEXT:    stdu r1, -32(r1)
; P8-NEXT:    lhz r3, 0(r3)
; P8-NEXT:    bl __gnu_h2f_ieee
; P8-NEXT:    nop
; P8-NEXT:    addi r1, r1, 32
; P8-NEXT:    ld r0, 16(r1)
; P8-NEXT:    mtlr r0
; P8-NEXT:    blr
;
; CHECK-LABEL: test_extend64:
; CHECK:       # %bb.0:
; CHECK-NEXT:    lxsihzx f0, 0, r3
; CHECK-NEXT:    xscvhpdp f1, f0
; CHECK-NEXT:    blr
;
; SOFT-LABEL: test_extend64:
; SOFT:       # %bb.0:
; SOFT-NEXT:    mflr r0
; SOFT-NEXT:    std r0, 16(r1)
; SOFT-NEXT:    stdu r1, -32(r1)
; SOFT-NEXT:    lhz r3, 0(r3)
; SOFT-NEXT:    bl __gnu_h2f_ieee
; SOFT-NEXT:    nop
; SOFT-NEXT:    bl __extendsfdf2
; SOFT-NEXT:    nop
; SOFT-NEXT:    addi r1, r1, 32
; SOFT-NEXT:    ld r0, 16(r1)
; SOFT-NEXT:    mtlr r0
; SOFT-NEXT:    blr
  %val16 = load half, half* %addr
  %val32 = fpext half %val16 to double
  ret double %val32
}
define void @test_trunc32(float %in, half* %addr) #0 {
; P8-LABEL: test_trunc32:
; P8:       # %bb.0:
; P8-NEXT:    mflr r0
; P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
; P8-NEXT:    std r0, 16(r1)
; P8-NEXT:    stdu r1, -48(r1)
; P8-NEXT:    mr r30, r4
; P8-NEXT:    bl __gnu_f2h_ieee
; P8-NEXT:    nop
; P8-NEXT:    sth r3, 0(r30)
; P8-NEXT:    addi r1, r1, 48
; P8-NEXT:    ld r0, 16(r1)
; P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
; P8-NEXT:    mtlr r0
; P8-NEXT:    blr
;
; CHECK-LABEL: test_trunc32:
; CHECK:       # %bb.0:
; CHECK-NEXT:    xscvdphp f0, f1
; CHECK-NEXT:    stxsihx f0, 0, r4
; CHECK-NEXT:    blr
;
; SOFT-LABEL: test_trunc32:
; SOFT:       # %bb.0:
; SOFT-NEXT:    mflr r0
; SOFT-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
; SOFT-NEXT:    std r0, 16(r1)
; SOFT-NEXT:    stdu r1, -48(r1)
; SOFT-NEXT:    clrldi r3, r3, 32
; SOFT-NEXT:    mr r30, r4
; SOFT-NEXT:    bl __gnu_f2h_ieee
; SOFT-NEXT:    nop
; SOFT-NEXT:    clrldi r3, r3, 48
; SOFT-NEXT:    bl __gnu_h2f_ieee
; SOFT-NEXT:    nop
; SOFT-NEXT:    bl __gnu_f2h_ieee
; SOFT-NEXT:    nop
; SOFT-NEXT:    sth r3, 0(r30)
; SOFT-NEXT:    addi r1, r1, 48
; SOFT-NEXT:    ld r0, 16(r1)
; SOFT-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
; SOFT-NEXT:    mtlr r0
; SOFT-NEXT:    blr
  %val16 = fptrunc float %in to half
  store half %val16, half* %addr
  ret void
}
define void @test_trunc64(double %in, half* %addr) #0 {
; P8-LABEL: test_trunc64:
; P8:       # %bb.0:
; P8-NEXT:    mflr r0
; P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
; P8-NEXT:    std r0, 16(r1)
; P8-NEXT:    stdu r1, -48(r1)
; P8-NEXT:    mr r30, r4
; P8-NEXT:    bl __truncdfhf2
; P8-NEXT:    nop
; P8-NEXT:    sth r3, 0(r30)
; P8-NEXT:    addi r1, r1, 48
; P8-NEXT:    ld r0, 16(r1)
; P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
; P8-NEXT:    mtlr r0
; P8-NEXT:    blr
;
; CHECK-LABEL: test_trunc64:
; CHECK:       # %bb.0:
; CHECK-NEXT:    xscvdphp f0, f1
; CHECK-NEXT:    stxsihx f0, 0, r4
; CHECK-NEXT:    blr
;
; SOFT-LABEL: test_trunc64:
; SOFT:       # %bb.0:
; SOFT-NEXT:    mflr r0
; SOFT-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
; SOFT-NEXT:    std r0, 16(r1)
; SOFT-NEXT:    stdu r1, -48(r1)
; SOFT-NEXT:    mr r30, r4
; SOFT-NEXT:    bl __truncdfhf2
; SOFT-NEXT:    nop
; SOFT-NEXT:    clrldi r3, r3, 48
; SOFT-NEXT:    bl __gnu_h2f_ieee
; SOFT-NEXT:    nop
; SOFT-NEXT:    bl __gnu_f2h_ieee
; SOFT-NEXT:    nop
; SOFT-NEXT:    sth r3, 0(r30)
; SOFT-NEXT:    addi r1, r1, 48
; SOFT-NEXT:    ld r0, 16(r1)
; SOFT-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
; SOFT-NEXT:    mtlr r0
; SOFT-NEXT:    blr
  %val16 = fptrunc double %in to half
  store half %val16, half* %addr
  ret void
}
define i64 @test_fptosi_i64(half* %p) #0 {
; P8-LABEL: test_fptosi_i64:
; P8:       # %bb.0:
; P8-NEXT:    mflr r0
; P8-NEXT:    std r0, 16(r1)
; P8-NEXT:    stdu r1, -32(r1)
; P8-NEXT:    lhz r3, 0(r3)
; P8-NEXT:    bl __gnu_h2f_ieee
; P8-NEXT:    nop
; P8-NEXT:    xscvdpsxds f0, f1
; P8-NEXT:    mffprd r3, f0
; P8-NEXT:    addi r1, r1, 32
; P8-NEXT:    ld r0, 16(r1)
; P8-NEXT:    mtlr r0
; P8-NEXT:    blr
;
; CHECK-LABEL: test_fptosi_i64:
; CHECK:       # %bb.0:
; CHECK-NEXT:    lhz r3, 0(r3)
; CHECK-NEXT:    mtfprwz f0, r3
; CHECK-NEXT:    xscvhpdp f0, f0
; CHECK-NEXT:    xscvdpsxds f0, f0
; CHECK-NEXT:    mffprd r3, f0
; CHECK-NEXT:    blr
;
; SOFT-LABEL: test_fptosi_i64:
; SOFT:       # %bb.0:
; SOFT-NEXT:    mflr r0
; SOFT-NEXT:    std r0, 16(r1)
; SOFT-NEXT:    stdu r1, -32(r1)
; SOFT-NEXT:    lhz r3, 0(r3)
; SOFT-NEXT:    bl __gnu_h2f_ieee
; SOFT-NEXT:    nop
; SOFT-NEXT:    bl __fixsfdi
; SOFT-NEXT:    nop
; SOFT-NEXT:    addi r1, r1, 32
; SOFT-NEXT:    ld r0, 16(r1)
; SOFT-NEXT:    mtlr r0
; SOFT-NEXT:    blr
  %a = load half, half* %p, align 2
  %r = fptosi half %a to i64
  ret i64 %r
}
define void @test_sitofp_i64(i64 %a, half* %p) #0 {
; P8-LABEL: test_sitofp_i64:
; P8:       # %bb.0:
; P8-NEXT:    mflr r0
; P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
; P8-NEXT:    std r0, 16(r1)
; P8-NEXT:    stdu r1, -48(r1)
; P8-NEXT:    mtfprd f0, r3
; P8-NEXT:    mr r30, r4
; P8-NEXT:    xscvsxdsp f1, f0
; P8-NEXT:    bl __gnu_f2h_ieee
; P8-NEXT:    nop
; P8-NEXT:    sth r3, 0(r30)
; P8-NEXT:    addi r1, r1, 48
; P8-NEXT:    ld r0, 16(r1)
; P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
; P8-NEXT:    mtlr r0
; P8-NEXT:    blr
;
; CHECK-LABEL: test_sitofp_i64:
; CHECK:       # %bb.0:
; CHECK-NEXT:    mtfprd f0, r3
; CHECK-NEXT:    xscvsxdsp f0, f0
; CHECK-NEXT:    xscvdphp f0, f0
; CHECK-NEXT:    mffprwz r3, f0
; CHECK-NEXT:    sth r3, 0(r4)
; CHECK-NEXT:    blr
;
; SOFT-LABEL: test_sitofp_i64:
; SOFT:       # %bb.0:
; SOFT-NEXT:    mflr r0
; SOFT-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
; SOFT-NEXT:    std r0, 16(r1)
; SOFT-NEXT:    stdu r1, -48(r1)
; SOFT-NEXT:    mr r30, r4
; SOFT-NEXT:    bl __floatdisf
; SOFT-NEXT:    nop
; SOFT-NEXT:    clrldi r3, r3, 32
; SOFT-NEXT:    bl __gnu_f2h_ieee
; SOFT-NEXT:    nop
; SOFT-NEXT:    clrldi r3, r3, 48
; SOFT-NEXT:    bl __gnu_h2f_ieee
; SOFT-NEXT:    nop
; SOFT-NEXT:    bl __gnu_f2h_ieee
; SOFT-NEXT:    nop
; SOFT-NEXT:    sth r3, 0(r30)
; SOFT-NEXT:    addi r1, r1, 48
; SOFT-NEXT:    ld r0, 16(r1)
; SOFT-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
; SOFT-NEXT:    mtlr r0
; SOFT-NEXT:    blr
  %r = sitofp i64 %a to half
  store half %r, half* %p
  ret void
}
define i64 @test_fptoui_i64(half* %p) #0 {
; P8-LABEL: test_fptoui_i64:
; P8:       # %bb.0:
; P8-NEXT:    mflr r0
; P8-NEXT:    std r0, 16(r1)
; P8-NEXT:    stdu r1, -32(r1)
; P8-NEXT:    lhz r3, 0(r3)
; P8-NEXT:    bl __gnu_h2f_ieee
; P8-NEXT:    nop
; P8-NEXT:    xscvdpuxds f0, f1
; P8-NEXT:    mffprd r3, f0
; P8-NEXT:    addi r1, r1, 32
; P8-NEXT:    ld r0, 16(r1)
; P8-NEXT:    mtlr r0
; P8-NEXT:    blr
;
; CHECK-LABEL: test_fptoui_i64:
; CHECK:       # %bb.0:
; CHECK-NEXT:    lhz r3, 0(r3)
; CHECK-NEXT:    mtfprwz f0, r3
; CHECK-NEXT:    xscvhpdp f0, f0
; CHECK-NEXT:    xscvdpuxds f0, f0
; CHECK-NEXT:    mffprd r3, f0
; CHECK-NEXT:    blr
;
; SOFT-LABEL: test_fptoui_i64:
; SOFT:       # %bb.0:
; SOFT-NEXT:    mflr r0
; SOFT-NEXT:    std r0, 16(r1)
; SOFT-NEXT:    stdu r1, -32(r1)
; SOFT-NEXT:    lhz r3, 0(r3)
; SOFT-NEXT:    bl __gnu_h2f_ieee
; SOFT-NEXT:    nop
; SOFT-NEXT:    bl __fixunssfdi
; SOFT-NEXT:    nop
; SOFT-NEXT:    addi r1, r1, 32
; SOFT-NEXT:    ld r0, 16(r1)
; SOFT-NEXT:    mtlr r0
; SOFT-NEXT:    blr
  %a = load half, half* %p, align 2
  %r = fptoui half %a to i64
  ret i64 %r
}
define void @test_uitofp_i64(i64 %a, half* %p) #0 {
; P8-LABEL: test_uitofp_i64:
; P8:       # %bb.0:
; P8-NEXT:    mflr r0
; P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
; P8-NEXT:    std r0, 16(r1)
; P8-NEXT:    stdu r1, -48(r1)
; P8-NEXT:    mtfprd f0, r3
; P8-NEXT:    mr r30, r4
; P8-NEXT:    xscvuxdsp f1, f0
; P8-NEXT:    bl __gnu_f2h_ieee
; P8-NEXT:    nop
; P8-NEXT:    sth r3, 0(r30)
; P8-NEXT:    addi r1, r1, 48
; P8-NEXT:    ld r0, 16(r1)
; P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
; P8-NEXT:    mtlr r0
; P8-NEXT:    blr
;
; CHECK-LABEL: test_uitofp_i64:
; CHECK:       # %bb.0:
; CHECK-NEXT:    mtfprd f0, r3
; CHECK-NEXT:    xscvuxdsp f0, f0
; CHECK-NEXT:    xscvdphp f0, f0
; CHECK-NEXT:    mffprwz r3, f0
; CHECK-NEXT:    sth r3, 0(r4)
; CHECK-NEXT:    blr
;
; SOFT-LABEL: test_uitofp_i64:
; SOFT:       # %bb.0:
; SOFT-NEXT:    mflr r0
; SOFT-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
; SOFT-NEXT:    std r0, 16(r1)
; SOFT-NEXT:    stdu r1, -48(r1)
; SOFT-NEXT:    mr r30, r4
; SOFT-NEXT:    bl __floatundisf
; SOFT-NEXT:    nop
; SOFT-NEXT:    bl __gnu_f2h_ieee
; SOFT-NEXT:    nop
; SOFT-NEXT:    clrldi r3, r3, 48
; SOFT-NEXT:    bl __gnu_h2f_ieee
; SOFT-NEXT:    nop
; SOFT-NEXT:    bl __gnu_f2h_ieee
; SOFT-NEXT:    nop
; SOFT-NEXT:    sth r3, 0(r30)
; SOFT-NEXT:    addi r1, r1, 48
; SOFT-NEXT:    ld r0, 16(r1)
; SOFT-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
; SOFT-NEXT:    mtlr r0
; SOFT-NEXT:    blr
  %r = uitofp i64 %a to half
  store half %r, half* %p
  ret void
}
define <4 x float> @test_extend32_vec4(<4 x half>* %p) #0 {
; P8-LABEL: test_extend32_vec4:
; P8:       # %bb.0:
; P8-NEXT:    mflr r0
; P8-NEXT:    std r0, 16(r1)
; P8-NEXT:    stdu r1, -112(r1)
; P8-NEXT:    li r4, 48
; P8-NEXT:    std r30, 96(r1) # 8-byte Folded Spill
; P8-NEXT:    mr r30, r3
; P8-NEXT:    lhz r3, 6(r3)
; P8-NEXT:    stxvd2x vs61, r1, r4 # 16-byte Folded Spill
; P8-NEXT:    li r4, 64
; P8-NEXT:    stxvd2x vs62, r1, r4 # 16-byte Folded Spill
; P8-NEXT:    li r4, 80
; P8-NEXT:    stxvd2x vs63, r1, r4 # 16-byte Folded Spill
; P8-NEXT:    bl __gnu_h2f_ieee
; P8-NEXT:    nop
; P8-NEXT:    lhz r3, 2(r30)
; P8-NEXT:    xxlor vs63, f1, f1
; P8-NEXT:    bl __gnu_h2f_ieee
; P8-NEXT:    nop
; P8-NEXT:    lhz r3, 4(r30)
; P8-NEXT:    xxlor vs62, f1, f1
; P8-NEXT:    bl __gnu_h2f_ieee
; P8-NEXT:    nop
; P8-NEXT:    lhz r3, 0(r30)
; P8-NEXT:    xxlor vs61, f1, f1
; P8-NEXT:    bl __gnu_h2f_ieee
; P8-NEXT:    nop
; P8-NEXT:    # kill: def $f1 killed $f1 def $vsl1
; P8-NEXT:    xxmrghd vs0, vs63, vs62
; P8-NEXT:    li r3, 80
; P8-NEXT:    ld r30, 96(r1) # 8-byte Folded Reload
; P8-NEXT:    xxmrghd vs1, vs61, vs1
; P8-NEXT:    lxvd2x vs63, r1, r3 # 16-byte Folded Reload
; P8-NEXT:    li r3, 64
; P8-NEXT:    lxvd2x vs62, r1, r3 # 16-byte Folded Reload
; P8-NEXT:    li r3, 48
; P8-NEXT:    xvcvdpsp vs34, vs0
; P8-NEXT:    lxvd2x vs61, r1, r3 # 16-byte Folded Reload
; P8-NEXT:    xvcvdpsp vs35, vs1
; P8-NEXT:    vmrgew v2, v2, v3
; P8-NEXT:    addi r1, r1, 112
; P8-NEXT:    ld r0, 16(r1)
; P8-NEXT:    mtlr r0
; P8-NEXT:    blr
;
; CHECK-LABEL: test_extend32_vec4:
; CHECK:       # %bb.0:
; CHECK-NEXT:    lhz r4, 6(r3)
; CHECK-NEXT:    mtfprwz f0, r4
; CHECK-NEXT:    xscvhpdp f0, f0
; CHECK-NEXT:    lhz r4, 2(r3)
; CHECK-NEXT:    mtfprwz f1, r4
; CHECK-NEXT:    xscvhpdp f1, f1
; CHECK-NEXT:    lhz r4, 4(r3)
; CHECK-NEXT:    mtfprwz f2, r4
; CHECK-NEXT:    xscvhpdp f2, f2
; CHECK-NEXT:    lhz r3, 0(r3)
; CHECK-NEXT:    xxmrghd vs0, vs0, vs1
; CHECK-NEXT:    mtfprwz f3, r3
; CHECK-NEXT:    xvcvdpsp vs35, vs0
; CHECK-NEXT:    xscvhpdp f3, f3
; CHECK-NEXT:    xxmrghd vs2, vs2, vs3
; CHECK-NEXT:    xvcvdpsp vs34, vs2
; CHECK-NEXT:    vmrgew v2, v3, v2
; CHECK-NEXT:    blr
;
; SOFT-LABEL: test_extend32_vec4:
; SOFT:       # %bb.0:
; SOFT-NEXT:    mflr r0
; SOFT-NEXT:    std r27, -40(r1) # 8-byte Folded Spill
; SOFT-NEXT:    std r28, -32(r1) # 8-byte Folded Spill
; SOFT-NEXT:    std r29, -24(r1) # 8-byte Folded Spill
; SOFT-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
; SOFT-NEXT:    std r0, 16(r1)
; SOFT-NEXT:    stdu r1, -80(r1)
; SOFT-NEXT:    mr r30, r3
; SOFT-NEXT:    lhz r3, 0(r3)
; SOFT-NEXT:    bl __gnu_h2f_ieee
; SOFT-NEXT:    nop
; SOFT-NEXT:    mr r29, r3
; SOFT-NEXT:    lhz r3, 2(r30)
; SOFT-NEXT:    bl __gnu_h2f_ieee
; SOFT-NEXT:    nop
; SOFT-NEXT:    mr r28, r3
; SOFT-NEXT:    lhz r3, 4(r30)
; SOFT-NEXT:    bl __gnu_h2f_ieee
; SOFT-NEXT:    nop
; SOFT-NEXT:    mr r27, r3
; SOFT-NEXT:    lhz r3, 6(r30)
; SOFT-NEXT:    bl __gnu_h2f_ieee
; SOFT-NEXT:    nop
; SOFT-NEXT:    mr r6, r3
; SOFT-NEXT:    mr r3, r29
; SOFT-NEXT:    mr r4, r28
; SOFT-NEXT:    mr r5, r27
; SOFT-NEXT:    addi r1, r1, 80
; SOFT-NEXT:    ld r0, 16(r1)
; SOFT-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
; SOFT-NEXT:    ld r29, -24(r1) # 8-byte Folded Reload
; SOFT-NEXT:    ld r28, -32(r1) # 8-byte Folded Reload
; SOFT-NEXT:    mtlr r0
; SOFT-NEXT:    ld r27, -40(r1) # 8-byte Folded Reload
; SOFT-NEXT:    blr
  %a = load <4 x half>, <4 x half>* %p, align 8
  %b = fpext <4 x half> %a to <4 x float>
  ret <4 x float> %b
}
define <4 x double> @test_extend64_vec4(<4 x half>* %p) #0 {
; P8-LABEL: test_extend64_vec4:
; P8:       # %bb.0:
; P8-NEXT:    mflr r0
; P8-NEXT:    std r0, 16(r1)
; P8-NEXT:    stdu r1, -112(r1)
; P8-NEXT:    li r4, 48
; P8-NEXT:    std r30, 96(r1) # 8-byte Folded Spill
; P8-NEXT:    mr r30, r3
; P8-NEXT:    lhz r3, 6(r3)
; P8-NEXT:    stxvd2x vs61, r1, r4 # 16-byte Folded Spill
; P8-NEXT:    li r4, 64
; P8-NEXT:    stxvd2x vs62, r1, r4 # 16-byte Folded Spill
; P8-NEXT:    li r4, 80
; P8-NEXT:    stxvd2x vs63, r1, r4 # 16-byte Folded Spill
; P8-NEXT:    bl __gnu_h2f_ieee
; P8-NEXT:    nop
; P8-NEXT:    lhz r3, 4(r30)
; P8-NEXT:    xxlor vs63, f1, f1
; P8-NEXT:    bl __gnu_h2f_ieee
; P8-NEXT:    nop
; P8-NEXT:    lhz r3, 2(r30)
; P8-NEXT:    xxlor vs62, f1, f1
; P8-NEXT:    bl __gnu_h2f_ieee
; P8-NEXT:    nop
; P8-NEXT:    lhz r3, 0(r30)
; P8-NEXT:    xxlor vs61, f1, f1
; P8-NEXT:    bl __gnu_h2f_ieee
; P8-NEXT:    nop
; P8-NEXT:    li r3, 80
; P8-NEXT:    xxmrghd vs35, vs63, vs62
; P8-NEXT:    # kill: def $f1 killed $f1 def $vsl1
; P8-NEXT:    xxmrghd vs34, vs61, vs1
; P8-NEXT:    ld r30, 96(r1) # 8-byte Folded Reload
; P8-NEXT:    lxvd2x vs63, r1, r3 # 16-byte Folded Reload
; P8-NEXT:    li r3, 64
; P8-NEXT:    lxvd2x vs62, r1, r3 # 16-byte Folded Reload
; P8-NEXT:    li r3, 48
; P8-NEXT:    lxvd2x vs61, r1, r3 # 16-byte Folded Reload
; P8-NEXT:    addi r1, r1, 112
; P8-NEXT:    ld r0, 16(r1)
; P8-NEXT:    mtlr r0
; P8-NEXT:    blr
;
; CHECK-LABEL: test_extend64_vec4:
; CHECK:       # %bb.0:
; CHECK-NEXT:    lhz r4, 6(r3)
; CHECK-NEXT:    lhz r5, 4(r3)
; CHECK-NEXT:    lhz r6, 2(r3)
; CHECK-NEXT:    lhz r3, 0(r3)
; CHECK-NEXT:    mtfprwz f0, r3
; CHECK-NEXT:    mtfprwz f1, r6
; CHECK-NEXT:    xscvhpdp f0, f0
; CHECK-NEXT:    xscvhpdp f1, f1
; CHECK-NEXT:    xxmrghd vs34, vs1, vs0
; CHECK-NEXT:    mtfprwz f0, r5
; CHECK-NEXT:    mtfprwz f1, r4
; CHECK-NEXT:    xscvhpdp f0, f0
; CHECK-NEXT:    xscvhpdp f1, f1
; CHECK-NEXT:    xxmrghd vs35, vs1, vs0
; CHECK-NEXT:    blr
;
; SOFT-LABEL: test_extend64_vec4:
; SOFT:       # %bb.0:
; SOFT-NEXT:    mflr r0
; SOFT-NEXT:    std r27, -40(r1) # 8-byte Folded Spill
; SOFT-NEXT:    std r28, -32(r1) # 8-byte Folded Spill
; SOFT-NEXT:    std r29, -24(r1) # 8-byte Folded Spill
; SOFT-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
; SOFT-NEXT:    std r0, 16(r1)
; SOFT-NEXT:    stdu r1, -80(r1)
; SOFT-NEXT:    mr r30, r3
; SOFT-NEXT:    lhz r3, 0(r3)
; SOFT-NEXT:    bl __gnu_h2f_ieee
; SOFT-NEXT:    nop
; SOFT-NEXT:    bl __extendsfdf2
; SOFT-NEXT:    nop
; SOFT-NEXT:    mr r29, r3
; SOFT-NEXT:    lhz r3, 2(r30)
; SOFT-NEXT:    bl __gnu_h2f_ieee
; SOFT-NEXT:    nop
; SOFT-NEXT:    bl __extendsfdf2
; SOFT-NEXT:    nop
; SOFT-NEXT:    mr r28, r3
; SOFT-NEXT:    lhz r3, 4(r30)
; SOFT-NEXT:    bl __gnu_h2f_ieee
; SOFT-NEXT:    nop
; SOFT-NEXT:    bl __extendsfdf2
; SOFT-NEXT:    nop
; SOFT-NEXT:    mr r27, r3
; SOFT-NEXT:    lhz r3, 6(r30)
; SOFT-NEXT:    bl __gnu_h2f_ieee
; SOFT-NEXT:    nop
; SOFT-NEXT:    bl __extendsfdf2
; SOFT-NEXT:    nop
; SOFT-NEXT:    mr r6, r3
; SOFT-NEXT:    mr r3, r29
; SOFT-NEXT:    mr r4, r28
; SOFT-NEXT:    mr r5, r27
; SOFT-NEXT:    addi r1, r1, 80
; SOFT-NEXT:    ld r0, 16(r1)
; SOFT-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
; SOFT-NEXT:    ld r29, -24(r1) # 8-byte Folded Reload
; SOFT-NEXT:    ld r28, -32(r1) # 8-byte Folded Reload
; SOFT-NEXT:    mtlr r0
; SOFT-NEXT:    ld r27, -40(r1) # 8-byte Folded Reload
; SOFT-NEXT:    blr
  %a = load <4 x half>, <4 x half>* %p, align 8
  %b = fpext <4 x half> %a to <4 x double>
  ret <4 x double> %b
}
define void @test_trunc32_vec4(<4 x float> %a, <4 x half>* %p) #0 {
; P8-LABEL: test_trunc32_vec4:
; P8:       # %bb.0:
; P8-NEXT:    mflr r0
; P8-NEXT:    std r0, 16(r1)
; P8-NEXT:    stdu r1, -112(r1)
; P8-NEXT:    xxsldwi vs0, vs34, vs34, 3
; P8-NEXT:    li r3, 48
; P8-NEXT:    std r27, 72(r1) # 8-byte Folded Spill
; P8-NEXT:    std r28, 80(r1) # 8-byte Folded Spill
; P8-NEXT:    std r29, 88(r1) # 8-byte Folded Spill
; P8-NEXT:    std r30, 96(r1) # 8-byte Folded Spill
; P8-NEXT:    mr r30, r5
; P8-NEXT:    xscvspdpn f1, vs0
; P8-NEXT:    stxvd2x vs63, r1, r3 # 16-byte Folded Spill
; P8-NEXT:    vmr v31, v2
; P8-NEXT:    bl __gnu_f2h_ieee
; P8-NEXT:    nop
; P8-NEXT:    xxswapd vs0, vs63
; P8-NEXT:    mr r29, r3
; P8-NEXT:    xscvspdpn f1, vs0
; P8-NEXT:    bl __gnu_f2h_ieee
; P8-NEXT:    nop
; P8-NEXT:    xxsldwi vs0, vs63, vs63, 1
; P8-NEXT:    mr r28, r3
; P8-NEXT:    xscvspdpn f1, vs0
; P8-NEXT:    bl __gnu_f2h_ieee
; P8-NEXT:    nop
; P8-NEXT:    xscvspdpn f1, vs63
; P8-NEXT:    mr r27, r3
; P8-NEXT:    bl __gnu_f2h_ieee
; P8-NEXT:    nop
; P8-NEXT:    sth r3, 6(r30)
; P8-NEXT:    li r3, 48
; P8-NEXT:    sth r27, 4(r30)
; P8-NEXT:    ld r27, 72(r1) # 8-byte Folded Reload
; P8-NEXT:    sth r28, 2(r30)
; P8-NEXT:    sth r29, 0(r30)
; P8-NEXT:    ld r30, 96(r1) # 8-byte Folded Reload
; P8-NEXT:    ld r29, 88(r1) # 8-byte Folded Reload
; P8-NEXT:    lxvd2x vs63, r1, r3 # 16-byte Folded Reload
; P8-NEXT:    ld r28, 80(r1) # 8-byte Folded Reload
; P8-NEXT:    addi r1, r1, 112
; P8-NEXT:    ld r0, 16(r1)
; P8-NEXT:    mtlr r0
; P8-NEXT:    blr
;
; CHECK-LABEL: test_trunc32_vec4:
; CHECK:       # %bb.0:
; CHECK-NEXT:    xxsldwi vs0, vs34, vs34, 3
; CHECK-NEXT:    xxsldwi vs1, vs34, vs34, 1
; CHECK-NEXT:    xscvspdpn f0, vs0
; CHECK-NEXT:    xscvspdpn f1, vs1
; CHECK-NEXT:    xscvdphp f0, f0
; CHECK-NEXT:    mffprwz r3, f0
; CHECK-NEXT:    xxswapd vs0, vs34
; CHECK-NEXT:    xscvspdpn f0, vs0
; CHECK-NEXT:    xscvdphp f0, f0
; CHECK-NEXT:    xscvdphp f1, f1
; CHECK-NEXT:    mffprwz r4, f1
; CHECK-NEXT:    xscvspdpn f1, vs34
; CHECK-NEXT:    xscvdphp f1, f1
; CHECK-NEXT:    sth r4, 4(r5)
; CHECK-NEXT:    mffprwz r4, f0
; CHECK-NEXT:    sth r3, 0(r5)
; CHECK-NEXT:    sth r4, 2(r5)
; CHECK-NEXT:    mffprwz r6, f1
; CHECK-NEXT:    sth r6, 6(r5)
; CHECK-NEXT:    blr
;
; SOFT-LABEL: test_trunc32_vec4:
; SOFT:       # %bb.0:
; SOFT-NEXT:    mflr r0
; SOFT-NEXT:    std r26, -48(r1) # 8-byte Folded Spill
; SOFT-NEXT:    std r27, -40(r1) # 8-byte Folded Spill
; SOFT-NEXT:    std r28, -32(r1) # 8-byte Folded Spill
; SOFT-NEXT:    std r29, -24(r1) # 8-byte Folded Spill
; SOFT-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
; SOFT-NEXT:    std r0, 16(r1)
; SOFT-NEXT:    stdu r1, -80(r1)
; SOFT-NEXT:    mr r27, r3
; SOFT-NEXT:    clrldi r3, r6, 32
; SOFT-NEXT:    mr r30, r7
; SOFT-NEXT:    mr r29, r5
; SOFT-NEXT:    mr r28, r4
; SOFT-NEXT:    bl __gnu_f2h_ieee
; SOFT-NEXT:    nop
; SOFT-NEXT:    mr r26, r3
; SOFT-NEXT:    clrldi r3, r29, 32
; SOFT-NEXT:    bl __gnu_f2h_ieee
; SOFT-NEXT:    nop
; SOFT-NEXT:    mr r29, r3
; SOFT-NEXT:    clrldi r3, r28, 32
; SOFT-NEXT:    bl __gnu_f2h_ieee
; SOFT-NEXT:    nop
; SOFT-NEXT:    mr r28, r3
; SOFT-NEXT:    clrldi r3, r27, 32
; SOFT-NEXT:    bl __gnu_f2h_ieee
; SOFT-NEXT:    nop
; SOFT-NEXT:    clrldi r3, r3, 48
; SOFT-NEXT:    bl __gnu_h2f_ieee
; SOFT-NEXT:    nop
; SOFT-NEXT:    mr r27, r3
; SOFT-NEXT:    clrldi r3, r28, 48
; SOFT-NEXT:    bl __gnu_h2f_ieee
; SOFT-NEXT:    nop
; SOFT-NEXT:    mr r28, r3
; SOFT-NEXT:    clrldi r3, r29, 48
; SOFT-NEXT:    bl __gnu_h2f_ieee
; SOFT-NEXT:    nop
; SOFT-NEXT:    mr r29, r3
; SOFT-NEXT:    clrldi r3, r26, 48
; SOFT-NEXT:    bl __gnu_h2f_ieee
; SOFT-NEXT:    nop
; SOFT-NEXT:    bl __gnu_f2h_ieee
; SOFT-NEXT:    nop
; SOFT-NEXT:    sth r3, 6(r30)
; SOFT-NEXT:    mr r3, r29
; SOFT-NEXT:    bl __gnu_f2h_ieee
; SOFT-NEXT:    nop
; SOFT-NEXT:    sth r3, 4(r30)
; SOFT-NEXT:    mr r3, r28
; SOFT-NEXT:    bl __gnu_f2h_ieee
; SOFT-NEXT:    nop
; SOFT-NEXT:    sth r3, 2(r30)
; SOFT-NEXT:    mr r3, r27
; SOFT-NEXT:    bl __gnu_f2h_ieee
; SOFT-NEXT:    nop
; SOFT-NEXT:    sth r3, 0(r30)
; SOFT-NEXT:    addi r1, r1, 80
; SOFT-NEXT:    ld r0, 16(r1)
; SOFT-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
; SOFT-NEXT:    ld r29, -24(r1) # 8-byte Folded Reload
; SOFT-NEXT:    ld r28, -32(r1) # 8-byte Folded Reload
; SOFT-NEXT:    mtlr r0
; SOFT-NEXT:    ld r27, -40(r1) # 8-byte Folded Reload
; SOFT-NEXT:    ld r26, -48(r1) # 8-byte Folded Reload
; SOFT-NEXT:    blr
  %v = fptrunc <4 x float> %a to <4 x half>
  store <4 x half> %v, <4 x half>* %p
  ret void
}
define void @test_trunc64_vec4(<4 x double> %a, <4 x half>* %p) #0 {
; P8-LABEL: test_trunc64_vec4:
; P8:       # %bb.0:
; P8-NEXT:    mflr r0
; P8-NEXT:    std r0, 16(r1)
; P8-NEXT:    stdu r1, -128(r1)
; P8-NEXT:    li r3, 48
; P8-NEXT:    xxswapd vs1, vs34
; P8-NEXT:    std r27, 88(r1) # 8-byte Folded Spill
; P8-NEXT:    std r28, 96(r1) # 8-byte Folded Spill
; P8-NEXT:    std r29, 104(r1) # 8-byte Folded Spill
; P8-NEXT:    std r30, 112(r1) # 8-byte Folded Spill
; P8-NEXT:    mr r30, r7
; P8-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
; P8-NEXT:    stxvd2x vs62, r1, r3 # 16-byte Folded Spill
; P8-NEXT:    li r3, 64
; P8-NEXT:    vmr v30, v2
; P8-NEXT:    stxvd2x vs63, r1, r3 # 16-byte Folded Spill
; P8-NEXT:    vmr v31, v3
; P8-NEXT:    bl __truncdfhf2
; P8-NEXT:    nop
; P8-NEXT:    xxswapd vs1, vs63
; P8-NEXT:    mr r29, r3
; P8-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
; P8-NEXT:    bl __truncdfhf2
; P8-NEXT:    nop
; P8-NEXT:    xxlor f1, vs62, vs62
; P8-NEXT:    mr r28, r3
; P8-NEXT:    bl __truncdfhf2
; P8-NEXT:    nop
; P8-NEXT:    xxlor f1, vs63, vs63
; P8-NEXT:    mr r27, r3
; P8-NEXT:    bl __truncdfhf2
; P8-NEXT:    nop
; P8-NEXT:    sth r3, 6(r30)
; P8-NEXT:    li r3, 64
; P8-NEXT:    sth r27, 2(r30)
; P8-NEXT:    ld r27, 88(r1) # 8-byte Folded Reload
; P8-NEXT:    sth r28, 4(r30)
; P8-NEXT:    sth r29, 0(r30)
; P8-NEXT:    ld r30, 112(r1) # 8-byte Folded Reload
; P8-NEXT:    ld r29, 104(r1) # 8-byte Folded Reload
; P8-NEXT:    lxvd2x vs63, r1, r3 # 16-byte Folded Reload
; P8-NEXT:    li r3, 48
; P8-NEXT:    ld r28, 96(r1) # 8-byte Folded Reload
; P8-NEXT:    lxvd2x vs62, r1, r3 # 16-byte Folded Reload
; P8-NEXT:    addi r1, r1, 128
; P8-NEXT:    ld r0, 16(r1)
; P8-NEXT:    mtlr r0
; P8-NEXT:    blr
;
; CHECK-LABEL: test_trunc64_vec4:
; CHECK:       # %bb.0:
; CHECK-NEXT:    xxswapd vs0, vs34
; CHECK-NEXT:    xscvdphp f0, f0
; CHECK-NEXT:    mffprwz r3, f0
; CHECK-NEXT:    xxswapd vs0, vs35
; CHECK-NEXT:    xscvdphp f0, f0
; CHECK-NEXT:    xscvdphp f1, vs34
; CHECK-NEXT:    mffprwz r4, f1
; CHECK-NEXT:    xscvdphp f1, vs35
; CHECK-NEXT:    sth r3, 0(r7)
; CHECK-NEXT:    sth r4, 2(r7)
; CHECK-NEXT:    mffprwz r4, f0
; CHECK-NEXT:    sth r4, 4(r7)
; CHECK-NEXT:    mffprwz r5, f1
; CHECK-NEXT:    sth r5, 6(r7)
; CHECK-NEXT:    blr
;
; SOFT-LABEL: test_trunc64_vec4:
; SOFT:       # %bb.0:
; SOFT-NEXT:    mflr r0
; SOFT-NEXT:    std r26, -48(r1) # 8-byte Folded Spill
; SOFT-NEXT:    std r27, -40(r1) # 8-byte Folded Spill
; SOFT-NEXT:    std r28, -32(r1) # 8-byte Folded Spill
; SOFT-NEXT:    std r29, -24(r1) # 8-byte Folded Spill
; SOFT-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
; SOFT-NEXT:    std r0, 16(r1)
; SOFT-NEXT:    stdu r1, -80(r1)
; SOFT-NEXT:    mr r27, r3
; SOFT-NEXT:    mr r3, r6
; SOFT-NEXT:    mr r30, r7
; SOFT-NEXT:    mr r29, r5
; SOFT-NEXT:    mr r28, r4
; SOFT-NEXT:    bl __truncdfhf2
; SOFT-NEXT:    nop
; SOFT-NEXT:    mr r26, r3
; SOFT-NEXT:    mr r3, r29
; SOFT-NEXT:    bl __truncdfhf2
; SOFT-NEXT:    nop
; SOFT-NEXT:    mr r29, r3
; SOFT-NEXT:    mr r3, r28
; SOFT-NEXT:    bl __truncdfhf2
; SOFT-NEXT:    nop
; SOFT-NEXT:    mr r28, r3
; SOFT-NEXT:    mr r3, r27
; SOFT-NEXT:    bl __truncdfhf2
; SOFT-NEXT:    nop
; SOFT-NEXT:    clrldi r3, r3, 48
; SOFT-NEXT:    bl __gnu_h2f_ieee
; SOFT-NEXT:    nop
; SOFT-NEXT:    mr r27, r3
; SOFT-NEXT:    clrldi r3, r28, 48
; SOFT-NEXT:    bl __gnu_h2f_ieee
; SOFT-NEXT:    nop
; SOFT-NEXT:    mr r28, r3
; SOFT-NEXT:    clrldi r3, r29, 48
; SOFT-NEXT:    bl __gnu_h2f_ieee
; SOFT-NEXT:    nop
; SOFT-NEXT:    mr r29, r3
; SOFT-NEXT:    clrldi r3, r26, 48
; SOFT-NEXT:    bl __gnu_h2f_ieee
; SOFT-NEXT:    nop
; SOFT-NEXT:    bl __gnu_f2h_ieee
; SOFT-NEXT:    nop
; SOFT-NEXT:    sth r3, 6(r30)
; SOFT-NEXT:    mr r3, r29
; SOFT-NEXT:    bl __gnu_f2h_ieee
; SOFT-NEXT:    nop
; SOFT-NEXT:    sth r3, 4(r30)
; SOFT-NEXT:    mr r3, r28
; SOFT-NEXT:    bl __gnu_f2h_ieee
; SOFT-NEXT:    nop
; SOFT-NEXT:    sth r3, 2(r30)
; SOFT-NEXT:    mr r3, r27
; SOFT-NEXT:    bl __gnu_f2h_ieee
; SOFT-NEXT:    nop
; SOFT-NEXT:    sth r3, 0(r30)
; SOFT-NEXT:    addi r1, r1, 80
; SOFT-NEXT:    ld r0, 16(r1)
; SOFT-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
; SOFT-NEXT:    ld r29, -24(r1) # 8-byte Folded Reload
; SOFT-NEXT:    ld r28, -32(r1) # 8-byte Folded Reload
; SOFT-NEXT:    mtlr r0
; SOFT-NEXT:    ld r27, -40(r1) # 8-byte Folded Reload
; SOFT-NEXT:    ld r26, -48(r1) # 8-byte Folded Reload
; SOFT-NEXT:    blr
  %v = fptrunc <4 x double> %a to <4 x half>
  store <4 x half> %v, <4 x half>* %p
  ret void
}
define float @test_sitofp_fadd_i32(i32 %a, half* %b) #0 {
; P8-LABEL: test_sitofp_fadd_i32:
; P8:       # %bb.0:
; P8-NEXT:    mflr r0
; P8-NEXT:    std r30, -24(r1) # 8-byte Folded Spill
; P8-NEXT:    stfd f31, -8(r1) # 8-byte Folded Spill
; P8-NEXT:    std r0, 16(r1)
; P8-NEXT:    stdu r1, -64(r1)
; P8-NEXT:    mr r30, r3
; P8-NEXT:    lhz r3, 0(r4)
; P8-NEXT:    bl __gnu_h2f_ieee
; P8-NEXT:    nop
; P8-NEXT:    mtfprwa f0, r30
; P8-NEXT:    fmr f31, f1
; P8-NEXT:    xscvsxdsp f1, f0
; P8-NEXT:    bl __gnu_f2h_ieee
; P8-NEXT:    nop
; P8-NEXT:    clrldi r3, r3, 48
; P8-NEXT:    bl __gnu_h2f_ieee
; P8-NEXT:    nop
; P8-NEXT:    xsaddsp f1, f31, f1
; P8-NEXT:    addi r1, r1, 64
; P8-NEXT:    ld r0, 16(r1)
; P8-NEXT:    lfd f31, -8(r1) # 8-byte Folded Reload
; P8-NEXT:    ld r30, -24(r1) # 8-byte Folded Reload
; P8-NEXT:    mtlr r0
; P8-NEXT:    blr
;
; CHECK-LABEL: test_sitofp_fadd_i32:
; CHECK:       # %bb.0:
; CHECK-NEXT:    mtfprwa f1, r3
; CHECK-NEXT:    lhz r4, 0(r4)
; CHECK-NEXT:    xscvsxdsp f1, f1
; CHECK-NEXT:    mtfprwz f0, r4
; CHECK-NEXT:    xscvhpdp f0, f0
; CHECK-NEXT:    xscvdphp f1, f1
; CHECK-NEXT:    mffprwz r3, f1
; CHECK-NEXT:    clrlwi r3, r3, 16
; CHECK-NEXT:    mtfprwz f1, r3
; CHECK-NEXT:    xscvhpdp f1, f1
; CHECK-NEXT:    xsaddsp f1, f0, f1
; CHECK-NEXT:    blr
;
; SOFT-LABEL: test_sitofp_fadd_i32:
; SOFT:       # %bb.0:
; SOFT-NEXT:    mflr r0
; SOFT-NEXT:    std r29, -24(r1) # 8-byte Folded Spill
; SOFT-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
; SOFT-NEXT:    std r0, 16(r1)
; SOFT-NEXT:    stdu r1, -64(r1)
; SOFT-NEXT:    mr r30, r3
; SOFT-NEXT:    lhz r3, 0(r4)
; SOFT-NEXT:    bl __gnu_h2f_ieee
; SOFT-NEXT:    nop
; SOFT-NEXT:    mr r29, r3
; SOFT-NEXT:    extsw r3, r30
; SOFT-NEXT:    bl __floatsisf
; SOFT-NEXT:    nop
; SOFT-NEXT:    clrldi r3, r3, 32
; SOFT-NEXT:    bl __gnu_f2h_ieee
; SOFT-NEXT:    nop
; SOFT-NEXT:    clrldi r3, r3, 48
; SOFT-NEXT:    bl __gnu_h2f_ieee
; SOFT-NEXT:    nop
; SOFT-NEXT:    mr r4, r3
; SOFT-NEXT:    mr r3, r29
; SOFT-NEXT:    bl __addsf3
; SOFT-NEXT:    nop
; SOFT-NEXT:    addi r1, r1, 64
; SOFT-NEXT:    ld r0, 16(r1)
; SOFT-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
; SOFT-NEXT:    ld r29, -24(r1) # 8-byte Folded Reload
; SOFT-NEXT:    mtlr r0
; SOFT-NEXT:    blr
  %tmp0 = load half, half* %b
  %tmp1 = sitofp i32 %a to half
  %tmp2 = fadd half %tmp0, %tmp1
  %tmp3 = fpext half %tmp2 to float
  ret float %tmp3
}
define half @PR40273(half) #0 {
; P8-LABEL: PR40273:
; P8:       # %bb.0:
; P8-NEXT:    mflr r0
; P8-NEXT:    std r0, 16(r1)
; P8-NEXT:    stdu r1, -32(r1)
; P8-NEXT:    bl __gnu_f2h_ieee
; P8-NEXT:    nop
; P8-NEXT:    clrldi r3, r3, 48
; P8-NEXT:    bl __gnu_h2f_ieee
; P8-NEXT:    nop
; P8-NEXT:    xxlxor f0, f0, f0
; P8-NEXT:    fcmpu cr0, f1, f0
; P8-NEXT:    beq cr0, .LBB20_2
; P8-NEXT:  # %bb.1:
; P8-NEXT:    addis r3, r2, .LCPI20_0@toc@ha
; P8-NEXT:    lfs f0, .LCPI20_0@toc@l(r3)
; P8-NEXT:  .LBB20_2:
; P8-NEXT:    fmr f1, f0
; P8-NEXT:    addi r1, r1, 32
; P8-NEXT:    ld r0, 16(r1)
; P8-NEXT:    mtlr r0
; P8-NEXT:    blr
;
; CHECK-LABEL: PR40273:
; CHECK:       # %bb.0:
; CHECK-NEXT:    xscvdphp f0, f1
; CHECK-NEXT:    xxlxor f1, f1, f1
; CHECK-NEXT:    mffprwz r3, f0
; CHECK-NEXT:    clrlwi r3, r3, 16
; CHECK-NEXT:    mtfprwz f0, r3
; CHECK-NEXT:    xscvhpdp f0, f0
; CHECK-NEXT:    fcmpu cr0, f0, f1
; CHECK-NEXT:    beqlr cr0
; CHECK-NEXT:  # %bb.1:
; CHECK-NEXT:    addis r3, r2, .LCPI20_0@toc@ha
; CHECK-NEXT:    lfs f1, .LCPI20_0@toc@l(r3)
; CHECK-NEXT:    blr
;
; SOFT-LABEL: PR40273:
; SOFT:       # %bb.0:
; SOFT-NEXT:    mflr r0
; SOFT-NEXT:    std r0, 16(r1)
; SOFT-NEXT:    stdu r1, -32(r1)
; SOFT-NEXT:    clrldi r3, r3, 48
; SOFT-NEXT:    bl __gnu_h2f_ieee
; SOFT-NEXT:    nop
; SOFT-NEXT:    li r4, 0
; SOFT-NEXT:    bl __nesf2
; SOFT-NEXT:    nop
; SOFT-NEXT:    cmplwi r3, 0
; SOFT-NEXT:    lis r3, 16256
; SOFT-NEXT:    iseleq r3, 0, r3
; SOFT-NEXT:    bl __gnu_f2h_ieee
; SOFT-NEXT:    nop
; SOFT-NEXT:    addi r1, r1, 32
; SOFT-NEXT:    ld r0, 16(r1)
; SOFT-NEXT:    mtlr r0
; SOFT-NEXT:    blr
  %2 = fcmp une half %0, 0xH0000
  %3 = uitofp i1 %2 to half
  ret half %3
}
attributes #0 = { nounwind }
