mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-26 12:43:36 +01:00
20170400f4
Summary: Currently bitcasting constants from f64 to v2i32 is done by storing the value to the stack and then loading it again. This is not necessary, but seems to happen because v2i32 is a valid type for Sparc V8. If it had not been legal, we would have gotten help from the type legalizer. This patch tries to do the same work as the legalizer would have done by bitcasting the floating point constant and splitting the value up into a vector of two i32 values. Reviewers: venkatra, jyknight Reviewed By: jyknight Subscribers: glaubitz, fedor.sergeev, jrtc27, llvm-commits Differential Revision: https://reviews.llvm.org/D49219 llvm-svn: 340723
48 lines
1.3 KiB
LLVM
48 lines
1.3 KiB
LLVM
; RUN: llc < %s -march=sparc | FileCheck %s
|
|
; RUN: llc < %s -march=sparcel | FileCheck %s --check-prefix=CHECK-LE
|
|
|
|
;; Bitcast should not do a runtime conversion, but rather emit a
|
|
;; constant into integer registers directly.
|
|
|
|
; CHECK-LABEL: bitcast:
|
|
; CHECK: sethi 1049856, %o0
|
|
; CHECK: mov %g0, %o1
|
|
; CHECK-LE: mov %g0, %o0
|
|
; CHECK-LE: sethi 1049856, %o1
|
|
define <2 x i32> @bitcast() {
|
|
%1 = bitcast double 5.0 to <2 x i32>
|
|
ret <2 x i32> %1
|
|
}
|
|
|
|
;; Same thing for a call using a double (which gets passed in integer
|
|
;; registers)
|
|
|
|
; CHECK-LABEL: test_call
|
|
; CHECK: sethi 1049856, %o0
|
|
; CHECK: mov %g0, %o1
|
|
; CHECK-LE: mov %g0, %o0
|
|
; CHECK-LE: sethi 1049856, %o1
|
|
declare void @a(double)
|
|
define void @test_call() {
|
|
call void @a(double 5.0)
|
|
ret void
|
|
}
|
|
|
|
;; And for a libcall emitted from the pow intrinsic. (libcall
|
|
;; emission happens after SelectionDAG type legalization, so is a bit
|
|
;; different than a normal function call. This was crashing before,
|
|
;; due to an earlier broken workaround for this issue.)
|
|
|
|
; CHECK-LABEL: test_intrins_call
|
|
; CHECK: sethi 1048576, %o0
|
|
; CHECK: mov %g0, %o1
|
|
; CHECK: mov %o0, %o2
|
|
; CHECK: mov %o1, %o3
|
|
; CHECK-LE: mov %g0, %o0
|
|
; CHECK-LE: sethi 1048576, %o1
|
|
declare double @llvm.pow.f64(double, double)
|
|
define double @test_intrins_call() {
|
|
%1 = call double @llvm.pow.f64(double 2.0, double 2.0)
|
|
ret double %1
|
|
}
|