mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-01 13:11:39 +01:00
854153de5a
The VSX versions have the advantage of a full 64-register target whereas the FP ones have the advantage of lower latency and higher throughput. So what we’re after is using the faster instructions in low register pressure situations and using the larger register file in high register pressure situations. The heuristic chooses between the following 7 pairs of instructions. PPC::LXSSPX vs PPC::LFSX PPC::LXSDX vs PPC::LFDX PPC::STXSSPX vs PPC::STFSX PPC::STXSDX vs PPC::STFDX PPC::LXSIWAX vs PPC::LFIWAX PPC::LXSIWZX vs PPC::LFIWZX PPC::STXSIWX vs PPC::STFIWX Differential Revision: https://reviews.llvm.org/D38486 llvm-svn: 318651
62 lines
2.2 KiB
LLVM
62 lines
2.2 KiB
LLVM
; Verify that small structures and float arguments are passed in the
|
|
; least significant part of a stack slot doubleword.
|
|
|
|
; RUN: llc -verify-machineinstrs < %s | FileCheck %s
|
|
|
|
target datalayout = "e-m:e-i64:64-n32:64"
|
|
target triple = "powerpc64le-unknown-linux-gnu"
|
|
|
|
%struct.large_arg = type { [8 x i64] }
|
|
%struct.small_arg = type { i16, i8 }
|
|
|
|
@gl = common global %struct.large_arg zeroinitializer, align 8
|
|
@gs = common global %struct.small_arg zeroinitializer, align 2
|
|
@gf = common global float 0.000000e+00, align 4
|
|
|
|
define void @callee1(%struct.small_arg* noalias nocapture sret %agg.result, %struct.large_arg* byval nocapture readnone %pad, %struct.small_arg* byval nocapture readonly %x) {
|
|
entry:
|
|
%0 = bitcast %struct.small_arg* %x to i32*
|
|
%1 = bitcast %struct.small_arg* %agg.result to i32*
|
|
%2 = load i32, i32* %0, align 2
|
|
store i32 %2, i32* %1, align 2
|
|
ret void
|
|
}
|
|
; CHECK: @callee1
|
|
; CHECK: lwz {{[0-9]+}}, 104(1)
|
|
; CHECK: blr
|
|
|
|
define void @caller1() {
|
|
entry:
|
|
%tmp = alloca %struct.small_arg, align 2
|
|
call void @test1(%struct.small_arg* sret %tmp, %struct.large_arg* byval @gl, %struct.small_arg* byval @gs)
|
|
ret void
|
|
}
|
|
; CHECK: @caller1
|
|
; CHECK: stw {{[0-9]+}}, 104(1)
|
|
; CHECK: bl test1
|
|
|
|
declare void @test1(%struct.small_arg* sret, %struct.large_arg* byval, %struct.small_arg* byval)
|
|
|
|
define float @callee2(float %pad1, float %pad2, float %pad3, float %pad4, float %pad5, float %pad6, float %pad7, float %pad8, float %pad9, float %pad10, float %pad11, float %pad12, float %pad13, float %x) {
|
|
entry:
|
|
ret float %x
|
|
}
|
|
; CHECK: @callee2
|
|
; CHECK: addi [[TOCREG:[0-9]+]], 1, 136
|
|
; CHECK: lfsx {{[0-9]+}}, {{[0-9]+}}, [[TOCREG]]
|
|
; CHECK: blr
|
|
|
|
define void @caller2() {
|
|
entry:
|
|
%0 = load float, float* @gf, align 4
|
|
%call = tail call float @test2(float 0.000000e+00, float 0.000000e+00, float 0.000000e+00, float 0.000000e+00, float 0.000000e+00, float 0.000000e+00, float 0.000000e+00, float 0.000000e+00, float 0.000000e+00, float 0.000000e+00, float 0.000000e+00, float 0.000000e+00, float 0.000000e+00, float %0)
|
|
ret void
|
|
}
|
|
; CHECK: @caller2
|
|
; CHECK: addi [[TOCOFF:[0-9]+]], {{[0-9]+}}, 136
|
|
; CHECK: stfsx {{[0-9]+}}, 0, [[TOCOFF]]
|
|
; CHECK: bl test2
|
|
|
|
declare float @test2(float, float, float, float, float, float, float, float, float, float, float, float, float, float)
|
|
|