248 lines
5.8 KiB
LLVM
248 lines
5.8 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
|
; RUN: llc -mtriple=powerpc64le-unknown-linux-gnu -global-isel -o - \
|
|
; RUN: -ppc-vsr-nums-as-vr -ppc-asm-full-reg-names -verify-machineinstrs < %s | FileCheck %s
|
|
|
|
define i64 @load_i64(ptr %p) {
|
|
; CHECK-LABEL: load_i64:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: ld r3, 0(r3)
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%ret = load i64, ptr %p, align 8
|
|
ret i64 %ret
|
|
}
|
|
|
|
define i64 @load2_i64(ptr %p, i64 %a) {
|
|
; CHECK-LABEL: load2_i64:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: ld r3, 0(r3)
|
|
; CHECK-NEXT: add r3, r3, r4
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%load = load i64, ptr %p, align 8
|
|
%ret = add i64 %load, %a
|
|
ret i64 %ret
|
|
}
|
|
|
|
define float @load3_i64(ptr %p) {
|
|
; CHECK-LABEL: load3_i64:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: ld r3, 0(r3)
|
|
; CHECK-NEXT: mtfprd f0, r3
|
|
; CHECK-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%load = load i64, ptr %p, align 8
|
|
%ret = sitofp i64 %load to float
|
|
ret float %ret
|
|
}
|
|
|
|
define double @load4_i64(ptr %p) {
|
|
; CHECK-LABEL: load4_i64:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: ld r3, 0(r3)
|
|
; CHECK-NEXT: mtfprd f0, r3
|
|
; CHECK-NEXT: xscvsxddp f1, f0
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%load = load i64, ptr %p, align 8
|
|
%ret = sitofp i64 %load to double
|
|
ret double %ret
|
|
}
|
|
|
|
define float @load5_i64(ptr %p) {
|
|
; CHECK-LABEL: load5_i64:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: ld r3, 0(r3)
|
|
; CHECK-NEXT: mtfprd f0, r3
|
|
; CHECK-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%load = load i64, ptr %p, align 8
|
|
%ret = uitofp i64 %load to float
|
|
ret float %ret
|
|
}
|
|
|
|
define double @load6_i64(ptr %p) {
|
|
; CHECK-LABEL: load6_i64:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: ld r3, 0(r3)
|
|
; CHECK-NEXT: mtfprd f0, r3
|
|
; CHECK-NEXT: xscvuxddp f1, f0
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%load = load i64, ptr %p, align 8
|
|
%ret = uitofp i64 %load to double
|
|
ret double %ret
|
|
}
|
|
|
|
define double @load_f64(ptr %p) {
|
|
; CHECK-LABEL: load_f64:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: lfd f1, 0(r3)
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%ret = load double, ptr %p, align 8
|
|
ret double %ret
|
|
}
|
|
|
|
define double @load2_f64(ptr %p, double %a) {
|
|
; CHECK-LABEL: load2_f64:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: lfd f0, 0(r3)
|
|
; CHECK-NEXT: xsadddp f1, f0, f1
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%load = load double, ptr %p, align 8
|
|
%ret = fadd double %load, %a
|
|
ret double %ret
|
|
}
|
|
|
|
define i64 @load3_f64(ptr %p) {
|
|
; CHECK-LABEL: load3_f64:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: lfd f0, 0(r3)
|
|
; CHECK-NEXT: xscvdpsxds f0, f0
|
|
; CHECK-NEXT: mffprd r3, f0
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%load = load double, ptr %p, align 8
|
|
%ret = fptosi double %load to i64
|
|
ret i64 %ret
|
|
}
|
|
|
|
define i64 @load4_f64(ptr %p) {
|
|
; CHECK-LABEL: load4_f64:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: lfd f0, 0(r3)
|
|
; CHECK-NEXT: xscvdpuxds f0, f0
|
|
; CHECK-NEXT: mffprd r3, f0
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%load = load double, ptr %p, align 8
|
|
%ret = fptoui double %load to i64
|
|
ret i64 %ret
|
|
}
|
|
|
|
define void @store_i64(ptr %p) {
|
|
; CHECK-LABEL: store_i64:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: li r4, 100
|
|
; CHECK-NEXT: std r4, 0(r3)
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
store i64 100, ptr %p, align 8
|
|
ret void
|
|
}
|
|
|
|
define void @store2_i64(ptr %p, i64 %a, i64 %b) {
|
|
; CHECK-LABEL: store2_i64:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: add r4, r4, r5
|
|
; CHECK-NEXT: std r4, 0(r3)
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%add = add i64 %a, %b
|
|
store i64 %add, ptr %p, align 8
|
|
ret void
|
|
}
|
|
|
|
define void @store3_i64(ptr %p, float %a) {
|
|
; CHECK-LABEL: store3_i64:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: xscvdpsxds f0, f1
|
|
; CHECK-NEXT: mffprd r4, f0
|
|
; CHECK-NEXT: std r4, 0(r3)
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%conv = fptosi float %a to i64
|
|
store i64 %conv, ptr %p, align 8
|
|
ret void
|
|
}
|
|
|
|
define void @store4_i64(ptr %p, double %a) {
|
|
; CHECK-LABEL: store4_i64:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: xscvdpsxds f0, f1
|
|
; CHECK-NEXT: mffprd r4, f0
|
|
; CHECK-NEXT: std r4, 0(r3)
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%conv = fptosi double %a to i64
|
|
store i64 %conv, ptr %p, align 8
|
|
ret void
|
|
}
|
|
|
|
define void @store5_i64(ptr %p, float %a) {
|
|
; CHECK-LABEL: store5_i64:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: xscvdpuxds f0, f1
|
|
; CHECK-NEXT: mffprd r4, f0
|
|
; CHECK-NEXT: std r4, 0(r3)
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%conv = fptoui float %a to i64
|
|
store i64 %conv, ptr %p, align 8
|
|
ret void
|
|
}
|
|
|
|
define void @store6_i64(ptr %p, double %a) {
|
|
; CHECK-LABEL: store6_i64:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: xscvdpuxds f0, f1
|
|
; CHECK-NEXT: mffprd r4, f0
|
|
; CHECK-NEXT: std r4, 0(r3)
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%conv = fptoui double %a to i64
|
|
store i64 %conv, ptr %p, align 8
|
|
ret void
|
|
}
|
|
|
|
define void @store_f64(ptr %p, double %a) {
|
|
; CHECK-LABEL: store_f64:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: stfd f1, 0(r3)
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
store double %a, ptr %p, align 8
|
|
ret void
|
|
}
|
|
|
|
define void @store2_f64(ptr %p, double %a, double %b) {
|
|
; CHECK-LABEL: store2_f64:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: xsadddp f0, f1, f2
|
|
; CHECK-NEXT: stfd f0, 0(r3)
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%fadd = fadd double %a, %b
|
|
store double %fadd, ptr %p, align 8
|
|
ret void
|
|
}
|
|
|
|
define void @store3_f64(ptr %p, i64 %a) {
|
|
; CHECK-LABEL: store3_f64:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: mtfprd f0, r4
|
|
; CHECK-NEXT: xscvsxddp f0, f0
|
|
; CHECK-NEXT: stfd f0, 0(r3)
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%conv = sitofp i64 %a to double
|
|
store double %conv, ptr %p, align 8
|
|
ret void
|
|
}
|
|
|
|
define void @store4_f64(ptr %p, i64 %a) {
|
|
; CHECK-LABEL: store4_f64:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: mtfprd f0, r4
|
|
; CHECK-NEXT: xscvuxddp f0, f0
|
|
; CHECK-NEXT: stfd f0, 0(r3)
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%conv = uitofp i64 %a to double
|
|
store double %conv, ptr %p, align 8
|
|
ret void
|
|
}
|