mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-16 11:30:51 +00:00
6a7770b7ae
This changes the SelectionDAG scheduling preference to source order. Soon, the SelectionDAG scheduler can be bypassed saving a nice chunk of compile time. Performance differences that result from this change are often a consequence of register coalescing. The register coalescer is far from perfect. Bugs can be filed for deficiencies. On x86 SandyBridge/Haswell, the source order schedule is often preserved, particularly for small blocks. Register pressure is generally improved over the SD scheduler's ILP mode. However, we are still able to handle large blocks that require latency hiding, unlike the SD scheduler's BURR mode. MI scheduler also attempts to discover the critical path in single-block loops and adjust heuristics accordingly. The MI scheduler relies on the new machine model. This is currently unimplemented for AVX, so we may not be generating the best code yet. Unit tests are updated so they don't depend on SD scheduling heuristics. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@192750 91177308-0d34-0410-b5e6-96231b3b80d8
218 lines
4.5 KiB
LLVM
218 lines
4.5 KiB
LLVM
; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=knl | FileCheck %s
|
|
|
|
; CHECK-LABEL: sitof32
|
|
; CHECK: vcvtdq2ps %zmm
|
|
; CHECK: ret
|
|
define <16 x float> @sitof32(<16 x i32> %a) nounwind {
|
|
%b = sitofp <16 x i32> %a to <16 x float>
|
|
ret <16 x float> %b
|
|
}
|
|
|
|
; CHECK-LABEL: fptosi00
|
|
; CHECK: vcvttps2dq %zmm
|
|
; CHECK: ret
|
|
define <16 x i32> @fptosi00(<16 x float> %a) nounwind {
|
|
%b = fptosi <16 x float> %a to <16 x i32>
|
|
ret <16 x i32> %b
|
|
}
|
|
|
|
; CHECK-LABEL: fptoui00
|
|
; CHECK: vcvttps2udq
|
|
; CHECK: ret
|
|
define <16 x i32> @fptoui00(<16 x float> %a) nounwind {
|
|
%b = fptoui <16 x float> %a to <16 x i32>
|
|
ret <16 x i32> %b
|
|
}
|
|
|
|
; CHECK-LABEL: fptoui01
|
|
; CHECK: vcvttpd2udq
|
|
; CHECK: ret
|
|
define <8 x i32> @fptoui01(<8 x double> %a) nounwind {
|
|
%b = fptoui <8 x double> %a to <8 x i32>
|
|
ret <8 x i32> %b
|
|
}
|
|
|
|
; CHECK-LABEL: sitof64
|
|
; CHECK: vcvtdq2pd %ymm
|
|
; CHECK: ret
|
|
define <8 x double> @sitof64(<8 x i32> %a) {
|
|
%b = sitofp <8 x i32> %a to <8 x double>
|
|
ret <8 x double> %b
|
|
}
|
|
|
|
; CHECK-LABEL: fptosi01
|
|
; CHECK: vcvttpd2dq %zmm
|
|
; CHECK: ret
|
|
define <8 x i32> @fptosi01(<8 x double> %a) {
|
|
%b = fptosi <8 x double> %a to <8 x i32>
|
|
ret <8 x i32> %b
|
|
}
|
|
|
|
; CHECK-LABEL: fptrunc00
|
|
; CHECK: vcvtpd2ps %zmm
|
|
; CHECK-NEXT: vcvtpd2ps %zmm
|
|
; CHECK-NEXT: vinsertf64x4 $1
|
|
; CHECK: ret
|
|
define <16 x float> @fptrunc00(<16 x double> %b) nounwind {
|
|
%a = fptrunc <16 x double> %b to <16 x float>
|
|
ret <16 x float> %a
|
|
}
|
|
|
|
; CHECK-LABEL: fpext00
|
|
; CHECK: vcvtps2pd %ymm0, %zmm0
|
|
; CHECK: ret
|
|
define <8 x double> @fpext00(<8 x float> %b) nounwind {
|
|
%a = fpext <8 x float> %b to <8 x double>
|
|
ret <8 x double> %a
|
|
}
|
|
|
|
; CHECK-LABEL: funcA
|
|
; CHECK: vcvtsi2sdqz (%
|
|
; CHECK: ret
|
|
define double @funcA(i64* nocapture %e) {
|
|
entry:
|
|
%tmp1 = load i64* %e, align 8
|
|
%conv = sitofp i64 %tmp1 to double
|
|
ret double %conv
|
|
}
|
|
|
|
; CHECK-LABEL: funcB
|
|
; CHECK: vcvtsi2sdlz (%
|
|
; CHECK: ret
|
|
define double @funcB(i32* %e) {
|
|
entry:
|
|
%tmp1 = load i32* %e, align 4
|
|
%conv = sitofp i32 %tmp1 to double
|
|
ret double %conv
|
|
}
|
|
|
|
; CHECK-LABEL: funcC
|
|
; CHECK: vcvtsi2sslz (%
|
|
; CHECK: ret
|
|
define float @funcC(i32* %e) {
|
|
entry:
|
|
%tmp1 = load i32* %e, align 4
|
|
%conv = sitofp i32 %tmp1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; CHECK-LABEL: i64tof32
|
|
; CHECK: vcvtsi2ssqz (%
|
|
; CHECK: ret
|
|
define float @i64tof32(i64* %e) {
|
|
entry:
|
|
%tmp1 = load i64* %e, align 8
|
|
%conv = sitofp i64 %tmp1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; CHECK-LABEL: fpext
|
|
; CHECK: vcvtss2sdz
|
|
; CHECK: ret
|
|
define void @fpext() {
|
|
entry:
|
|
%f = alloca float, align 4
|
|
%d = alloca double, align 8
|
|
%tmp = load float* %f, align 4
|
|
%conv = fpext float %tmp to double
|
|
store double %conv, double* %d, align 8
|
|
ret void
|
|
}
|
|
|
|
; CHECK-LABEL: fpround_scalar
|
|
; CHECK: vmovsdz
|
|
; CHECK: vcvtsd2ssz
|
|
; CHECK: vmovssz
|
|
; CHECK: ret
|
|
define void @fpround_scalar() nounwind uwtable {
|
|
entry:
|
|
%f = alloca float, align 4
|
|
%d = alloca double, align 8
|
|
%tmp = load double* %d, align 8
|
|
%conv = fptrunc double %tmp to float
|
|
store float %conv, float* %f, align 4
|
|
ret void
|
|
}
|
|
|
|
; CHECK-LABEL: long_to_double
|
|
; CHECK: vmovqz
|
|
; CHECK: ret
|
|
define double @long_to_double(i64 %x) {
|
|
%res = bitcast i64 %x to double
|
|
ret double %res
|
|
}
|
|
|
|
; CHECK-LABEL: double_to_long
|
|
; CHECK: vmovqz
|
|
; CHECK: ret
|
|
define i64 @double_to_long(double %x) {
|
|
%res = bitcast double %x to i64
|
|
ret i64 %res
|
|
}
|
|
|
|
; CHECK-LABEL: int_to_float
|
|
; CHECK: vmovdz
|
|
; CHECK: ret
|
|
define float @int_to_float(i32 %x) {
|
|
%res = bitcast i32 %x to float
|
|
ret float %res
|
|
}
|
|
|
|
; CHECK-LABEL: float_to_int
|
|
; CHECK: vmovdz
|
|
; CHECK: ret
|
|
define i32 @float_to_int(float %x) {
|
|
%res = bitcast float %x to i32
|
|
ret i32 %res
|
|
}
|
|
|
|
; CHECK-LABEL: uitof64
|
|
; CHECK: vcvtudq2pd
|
|
; CHECK: vextracti64x4
|
|
; CHECK: vcvtudq2pd
|
|
; CHECK: ret
|
|
define <16 x double> @uitof64(<16 x i32> %a) nounwind {
|
|
%b = uitofp <16 x i32> %a to <16 x double>
|
|
ret <16 x double> %b
|
|
}
|
|
|
|
; CHECK-LABEL: uitof32
|
|
; CHECK: vcvtudq2ps
|
|
; CHECK: ret
|
|
define <16 x float> @uitof32(<16 x i32> %a) nounwind {
|
|
%b = uitofp <16 x i32> %a to <16 x float>
|
|
ret <16 x float> %b
|
|
}
|
|
|
|
; CHECK-LABEL: @fptosi02
|
|
; CHECK vcvttss2siz
|
|
; CHECK: ret
|
|
define i32 @fptosi02(float %a) nounwind {
|
|
%b = fptosi float %a to i32
|
|
ret i32 %b
|
|
}
|
|
|
|
; CHECK-LABEL: @fptoui02
|
|
; CHECK vcvttss2usiz
|
|
; CHECK: ret
|
|
define i32 @fptoui02(float %a) nounwind {
|
|
%b = fptoui float %a to i32
|
|
ret i32 %b
|
|
}
|
|
|
|
; CHECK-LABEL: @uitofp02
|
|
; CHECK vcvtusi2ss
|
|
; CHECK: ret
|
|
define float @uitofp02(i32 %a) nounwind {
|
|
%b = uitofp i32 %a to float
|
|
ret float %b
|
|
}
|
|
|
|
; CHECK-LABEL: @uitofp03
|
|
; CHECK vcvtusi2sd
|
|
; CHECK: ret
|
|
define double @uitofp03(i32 %a) nounwind {
|
|
%b = uitofp i32 %a to double
|
|
ret double %b
|
|
}
|