mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-26 04:32:44 +01:00
29ffba4b56
This can be seen as a follow up to commit 0ee439b705e82a4fe20e2, that changed the second argument of __powidf2, __powisf2 and __powitf2 in compiler-rt from si_int to int. That was to align with how those runtimes are defined in libgcc. One thing that seem to have been missing in that patch was to make sure that the rest of LLVM also handle that the argument now depends on the size of int (not using the si_int machine mode for 32-bit). When using __builtin_powi for a target with 16-bit int clang crashed. And when emitting libcalls to those rtlib functions, typically when lowering @llvm.powi), the backend would always prepare the exponent argument as an i32 which caused miscompiles when the rtlib was compiled with 16-bit int. The solution used here is to use an overloaded type for the second argument in @llvm.powi. This way clang can use the "correct" type when lowering __builtin_powi, and then later when emitting the libcall it is assumed that the type used in @llvm.powi matches the rtlib function. One thing that needed some extra attention was that when vectorizing calls several passes did not support that several arguments could be overloaded in the intrinsics. This patch allows overload of a scalar operand by adding hasVectorInstrinsicOverloadedScalarOpd, with an entry for powi. Differential Revision: https://reviews.llvm.org/D99439
687 lines
16 KiB
LLVM
687 lines
16 KiB
LLVM
; RUN: llc -mtriple=mips64el-unknown-unknown -mcpu=mips4 -mattr=+soft-float -O1 \
|
|
; RUN: -disable-mips-delay-filler -relocation-model=pic < %s | FileCheck \
|
|
; RUN: %s -check-prefixes=ALL,C_CC_FMT,PRER6,NOT-R2R6
|
|
; RUN: llc -mtriple=mips64el-unknown-unknown -mcpu=mips64 -mattr=+soft-float -O1 \
|
|
; RUN: -disable-mips-delay-filler -relocation-model=pic < %s | FileCheck \
|
|
; RUN: %s -check-prefixes=ALL,C_CC_FMT,PRER6,NOT-R2R6
|
|
; RUN: llc -mtriple=mips64el-unknown-unknown -mcpu=mips64r2 -mattr=+soft-float \
|
|
; RUN: -O1 -disable-mips-delay-filler -relocation-model=pic < %s | FileCheck \
|
|
; RUN: %s -check-prefixes=ALL,C_CC_FMT,PRER6,R2R6
|
|
; RUN: llc -mtriple=mips64el-unknown-unknown -mcpu=mips64r6 -mattr=+soft-float \
|
|
; RUN: -O1 -disable-mips-delay-filler -relocation-model=pic < %s | FileCheck \
|
|
; RUN: %s -check-prefixes=ALL,CMP_CC_FMT,R6,R2R6
|
|
|
|
@gld0 = external global fp128
|
|
@gld1 = external global fp128
|
|
@gld2 = external global fp128
|
|
@gf1 = external global float
|
|
@gd1 = external global double
|
|
|
|
; ALL-LABEL: addLD:
|
|
; ALL: ld $25, %call16(__addtf3)
|
|
|
|
define fp128 @addLD() {
|
|
entry:
|
|
%0 = load fp128, fp128* @gld0, align 16
|
|
%1 = load fp128, fp128* @gld1, align 16
|
|
%add = fadd fp128 %0, %1
|
|
ret fp128 %add
|
|
}
|
|
|
|
; ALL-LABEL: subLD:
|
|
; ALL: ld $25, %call16(__subtf3)
|
|
|
|
define fp128 @subLD() {
|
|
entry:
|
|
%0 = load fp128, fp128* @gld0, align 16
|
|
%1 = load fp128, fp128* @gld1, align 16
|
|
%sub = fsub fp128 %0, %1
|
|
ret fp128 %sub
|
|
}
|
|
|
|
; ALL-LABEL: mulLD:
|
|
; ALL: ld $25, %call16(__multf3)
|
|
|
|
define fp128 @mulLD() {
|
|
entry:
|
|
%0 = load fp128, fp128* @gld0, align 16
|
|
%1 = load fp128, fp128* @gld1, align 16
|
|
%mul = fmul fp128 %0, %1
|
|
ret fp128 %mul
|
|
}
|
|
|
|
; ALL-LABEL: divLD:
|
|
; ALL: ld $25, %call16(__divtf3)
|
|
|
|
define fp128 @divLD() {
|
|
entry:
|
|
%0 = load fp128, fp128* @gld0, align 16
|
|
%1 = load fp128, fp128* @gld1, align 16
|
|
%div = fdiv fp128 %0, %1
|
|
ret fp128 %div
|
|
}
|
|
|
|
; ALL-LABEL: conv_LD_char:
|
|
; ALL: ld $25, %call16(__floatsitf)
|
|
|
|
define fp128 @conv_LD_char(i8 signext %a) {
|
|
entry:
|
|
%conv = sitofp i8 %a to fp128
|
|
ret fp128 %conv
|
|
}
|
|
|
|
; ALL-LABEL: conv_LD_short:
|
|
; ALL: ld $25, %call16(__floatsitf)
|
|
|
|
define fp128 @conv_LD_short(i16 signext %a) {
|
|
entry:
|
|
%conv = sitofp i16 %a to fp128
|
|
ret fp128 %conv
|
|
}
|
|
|
|
; ALL-LABEL: conv_LD_int:
|
|
; ALL: ld $25, %call16(__floatsitf)
|
|
|
|
define fp128 @conv_LD_int(i32 %a) {
|
|
entry:
|
|
%conv = sitofp i32 %a to fp128
|
|
ret fp128 %conv
|
|
}
|
|
|
|
; ALL-LABEL: conv_LD_LL:
|
|
; ALL: ld $25, %call16(__floatditf)
|
|
|
|
define fp128 @conv_LD_LL(i64 %a) {
|
|
entry:
|
|
%conv = sitofp i64 %a to fp128
|
|
ret fp128 %conv
|
|
}
|
|
|
|
; ALL-LABEL: conv_LD_UChar:
|
|
; ALL: ld $25, %call16(__floatunsitf)
|
|
|
|
define fp128 @conv_LD_UChar(i8 zeroext %a) {
|
|
entry:
|
|
%conv = uitofp i8 %a to fp128
|
|
ret fp128 %conv
|
|
}
|
|
|
|
; ALL-LABEL: conv_LD_UShort:
|
|
; ALL: ld $25, %call16(__floatunsitf)
|
|
|
|
define fp128 @conv_LD_UShort(i16 zeroext %a) {
|
|
entry:
|
|
%conv = uitofp i16 %a to fp128
|
|
ret fp128 %conv
|
|
}
|
|
|
|
; ALL-LABEL: conv_LD_UInt:
|
|
; ALL: ld $25, %call16(__floatunsitf)
|
|
|
|
define fp128 @conv_LD_UInt(i32 signext %a) {
|
|
entry:
|
|
%conv = uitofp i32 %a to fp128
|
|
ret fp128 %conv
|
|
}
|
|
|
|
; ALL-LABEL: conv_LD_ULL:
|
|
; ALL: ld $25, %call16(__floatunditf)
|
|
|
|
define fp128 @conv_LD_ULL(i64 %a) {
|
|
entry:
|
|
%conv = uitofp i64 %a to fp128
|
|
ret fp128 %conv
|
|
}
|
|
|
|
; ALL-LABEL: conv_char_LD:
|
|
; ALL: ld $25, %call16(__fixtfsi)
|
|
|
|
define signext i8 @conv_char_LD(fp128 %a) {
|
|
entry:
|
|
%conv = fptosi fp128 %a to i8
|
|
ret i8 %conv
|
|
}
|
|
|
|
; ALL-LABEL: conv_short_LD:
|
|
; ALL: ld $25, %call16(__fixtfsi)
|
|
|
|
define signext i16 @conv_short_LD(fp128 %a) {
|
|
entry:
|
|
%conv = fptosi fp128 %a to i16
|
|
ret i16 %conv
|
|
}
|
|
|
|
; ALL-LABEL: conv_int_LD:
|
|
; ALL: ld $25, %call16(__fixtfsi)
|
|
|
|
define i32 @conv_int_LD(fp128 %a) {
|
|
entry:
|
|
%conv = fptosi fp128 %a to i32
|
|
ret i32 %conv
|
|
}
|
|
|
|
; ALL-LABEL: conv_LL_LD:
|
|
; ALL: ld $25, %call16(__fixtfdi)
|
|
|
|
define i64 @conv_LL_LD(fp128 %a) {
|
|
entry:
|
|
%conv = fptosi fp128 %a to i64
|
|
ret i64 %conv
|
|
}
|
|
|
|
; ALL-LABEL: conv_UChar_LD:
|
|
; ALL: ld $25, %call16(__fixtfsi)
|
|
|
|
define zeroext i8 @conv_UChar_LD(fp128 %a) {
|
|
entry:
|
|
%conv = fptoui fp128 %a to i8
|
|
ret i8 %conv
|
|
}
|
|
|
|
; ALL-LABEL: conv_UShort_LD:
|
|
; ALL: ld $25, %call16(__fixtfsi)
|
|
|
|
define zeroext i16 @conv_UShort_LD(fp128 %a) {
|
|
entry:
|
|
%conv = fptoui fp128 %a to i16
|
|
ret i16 %conv
|
|
}
|
|
|
|
; ALL-LABEL: conv_UInt_LD:
|
|
; ALL: ld $25, %call16(__fixunstfsi)
|
|
|
|
define i32 @conv_UInt_LD(fp128 %a) {
|
|
entry:
|
|
%conv = fptoui fp128 %a to i32
|
|
ret i32 %conv
|
|
}
|
|
|
|
; ALL-LABEL: conv_ULL_LD:
|
|
; ALL: ld $25, %call16(__fixunstfdi)
|
|
|
|
define i64 @conv_ULL_LD(fp128 %a) {
|
|
entry:
|
|
%conv = fptoui fp128 %a to i64
|
|
ret i64 %conv
|
|
}
|
|
|
|
; ALL-LABEL: conv_LD_float:
|
|
; ALL: ld $25, %call16(__extendsftf2)
|
|
|
|
define fp128 @conv_LD_float(float %a) {
|
|
entry:
|
|
%conv = fpext float %a to fp128
|
|
ret fp128 %conv
|
|
}
|
|
|
|
; ALL-LABEL: conv_LD_double:
|
|
; ALL: ld $25, %call16(__extenddftf2)
|
|
|
|
define fp128 @conv_LD_double(double %a) {
|
|
entry:
|
|
%conv = fpext double %a to fp128
|
|
ret fp128 %conv
|
|
}
|
|
|
|
; ALL-LABEL: conv_float_LD:
|
|
; ALL: ld $25, %call16(__trunctfsf2)
|
|
|
|
define float @conv_float_LD(fp128 %a) {
|
|
entry:
|
|
%conv = fptrunc fp128 %a to float
|
|
ret float %conv
|
|
}
|
|
|
|
; ALL-LABEL: conv_double_LD:
|
|
; ALL: ld $25, %call16(__trunctfdf2)
|
|
|
|
define double @conv_double_LD(fp128 %a) {
|
|
entry:
|
|
%conv = fptrunc fp128 %a to double
|
|
ret double %conv
|
|
}
|
|
|
|
; ALL-LABEL: libcall1_fabsl:
|
|
; NOT-R2R6-DAG: ld $[[R0:[0-9]+]], 8($[[R4:[0-9]+]])
|
|
; NOT-R2R6-DAG: daddiu $[[R1:[0-9]+]], $zero, 1
|
|
; NOT-R2R6-DAG: dsll $[[R2:[0-9]+]], $[[R1]], 63
|
|
; NOT-R2R6-DAG: daddiu $[[R3:[0-9]+]], $[[R2]], -1
|
|
; NOT-R2R6-DAG: and $4, $[[R0]], $[[R3]]
|
|
; NOT-R2R6-DAG: ld $2, 0($[[R4]])
|
|
|
|
; R2R6-DAG: ld $[[R0:[0-9]+]], 0($[[R3:[0-9]+]])
|
|
; R2R6-DAG: ld $[[R1:[0-9]+]], 8($[[R3]])
|
|
; R2R6-DAG: dextm $[[R2:[0-9]+]], $[[R1]], 0, 63
|
|
|
|
define fp128 @libcall1_fabsl() {
|
|
entry:
|
|
%0 = load fp128, fp128* @gld0, align 16
|
|
%call = tail call fp128 @fabsl(fp128 %0) nounwind readnone
|
|
ret fp128 %call
|
|
}
|
|
|
|
declare fp128 @fabsl(fp128) #1
|
|
|
|
; ALL-LABEL: libcall1_ceill:
|
|
; ALL: ld $25, %call16(ceill)
|
|
|
|
define fp128 @libcall1_ceill() {
|
|
entry:
|
|
%0 = load fp128, fp128* @gld0, align 16
|
|
%call = tail call fp128 @ceill(fp128 %0) nounwind readnone
|
|
ret fp128 %call
|
|
}
|
|
|
|
declare fp128 @ceill(fp128) #1
|
|
|
|
; ALL-LABEL: libcall1_sinl:
|
|
; ALL: ld $25, %call16(sinl)
|
|
|
|
define fp128 @libcall1_sinl() {
|
|
entry:
|
|
%0 = load fp128, fp128* @gld0, align 16
|
|
%call = tail call fp128 @sinl(fp128 %0) nounwind
|
|
ret fp128 %call
|
|
}
|
|
|
|
declare fp128 @sinl(fp128) #2
|
|
|
|
; ALL-LABEL: libcall1_cosl:
|
|
; ALL: ld $25, %call16(cosl)
|
|
|
|
define fp128 @libcall1_cosl() {
|
|
entry:
|
|
%0 = load fp128, fp128* @gld0, align 16
|
|
%call = tail call fp128 @cosl(fp128 %0) nounwind
|
|
ret fp128 %call
|
|
}
|
|
|
|
declare fp128 @cosl(fp128) #2
|
|
|
|
; ALL-LABEL: libcall1_expl:
|
|
; ALL: ld $25, %call16(expl)
|
|
|
|
define fp128 @libcall1_expl() {
|
|
entry:
|
|
%0 = load fp128, fp128* @gld0, align 16
|
|
%call = tail call fp128 @expl(fp128 %0) nounwind
|
|
ret fp128 %call
|
|
}
|
|
|
|
declare fp128 @expl(fp128) #2
|
|
|
|
; ALL-LABEL: libcall1_exp2l:
|
|
; ALL: ld $25, %call16(exp2l)
|
|
|
|
define fp128 @libcall1_exp2l() {
|
|
entry:
|
|
%0 = load fp128, fp128* @gld0, align 16
|
|
%call = tail call fp128 @exp2l(fp128 %0) nounwind
|
|
ret fp128 %call
|
|
}
|
|
|
|
declare fp128 @exp2l(fp128) #2
|
|
|
|
; ALL-LABEL: libcall1_logl:
|
|
; ALL: ld $25, %call16(logl)
|
|
|
|
define fp128 @libcall1_logl() {
|
|
entry:
|
|
%0 = load fp128, fp128* @gld0, align 16
|
|
%call = tail call fp128 @logl(fp128 %0) nounwind
|
|
ret fp128 %call
|
|
}
|
|
|
|
declare fp128 @logl(fp128) #2
|
|
|
|
; ALL-LABEL: libcall1_log2l:
|
|
; ALL: ld $25, %call16(log2l)
|
|
|
|
define fp128 @libcall1_log2l() {
|
|
entry:
|
|
%0 = load fp128, fp128* @gld0, align 16
|
|
%call = tail call fp128 @log2l(fp128 %0) nounwind
|
|
ret fp128 %call
|
|
}
|
|
|
|
declare fp128 @log2l(fp128) #2
|
|
|
|
; ALL-LABEL: libcall1_log10l:
|
|
; ALL: ld $25, %call16(log10l)
|
|
|
|
define fp128 @libcall1_log10l() {
|
|
entry:
|
|
%0 = load fp128, fp128* @gld0, align 16
|
|
%call = tail call fp128 @log10l(fp128 %0) nounwind
|
|
ret fp128 %call
|
|
}
|
|
|
|
declare fp128 @log10l(fp128) #2
|
|
|
|
; ALL-LABEL: libcall1_nearbyintl:
|
|
; ALL: ld $25, %call16(nearbyintl)
|
|
|
|
define fp128 @libcall1_nearbyintl() {
|
|
entry:
|
|
%0 = load fp128, fp128* @gld0, align 16
|
|
%call = tail call fp128 @nearbyintl(fp128 %0) nounwind readnone
|
|
ret fp128 %call
|
|
}
|
|
|
|
declare fp128 @nearbyintl(fp128) #1
|
|
|
|
; ALL-LABEL: libcall1_floorl:
|
|
; ALL: ld $25, %call16(floorl)
|
|
|
|
define fp128 @libcall1_floorl() {
|
|
entry:
|
|
%0 = load fp128, fp128* @gld0, align 16
|
|
%call = tail call fp128 @floorl(fp128 %0) nounwind readnone
|
|
ret fp128 %call
|
|
}
|
|
|
|
declare fp128 @floorl(fp128) #1
|
|
|
|
; ALL-LABEL: libcall1_sqrtl:
|
|
; ALL: ld $25, %call16(sqrtl)
|
|
|
|
define fp128 @libcall1_sqrtl() {
|
|
entry:
|
|
%0 = load fp128, fp128* @gld0, align 16
|
|
%call = tail call fp128 @sqrtl(fp128 %0) nounwind
|
|
ret fp128 %call
|
|
}
|
|
|
|
declare fp128 @sqrtl(fp128) #2
|
|
|
|
; ALL-LABEL: libcall1_rintl:
|
|
; ALL: ld $25, %call16(rintl)
|
|
|
|
define fp128 @libcall1_rintl() {
|
|
entry:
|
|
%0 = load fp128, fp128* @gld0, align 16
|
|
%call = tail call fp128 @rintl(fp128 %0) nounwind readnone
|
|
ret fp128 %call
|
|
}
|
|
|
|
declare fp128 @rintl(fp128) #1
|
|
|
|
; ALL-LABEL: libcall_powil:
|
|
; ALL: ld $25, %call16(__powitf2)
|
|
|
|
define fp128 @libcall_powil(fp128 %a, i32 %b) {
|
|
entry:
|
|
%0 = tail call fp128 @llvm.powi.f128.i32(fp128 %a, i32 %b)
|
|
ret fp128 %0
|
|
}
|
|
|
|
declare fp128 @llvm.powi.f128.i32(fp128, i32) #3
|
|
|
|
; ALL-LABEL: libcall2_copysignl:
|
|
; NOT-R2R6-DAG: daddiu $[[R2:[0-9]+]], $zero, 1
|
|
; NOT-R2R6-DAG: dsll $[[R3:[0-9]+]], $[[R2]], 63
|
|
; ALL-DAG: ld $[[R0:[0-9]+]], %got_disp(gld1)
|
|
; ALL-DAG: ld $[[R1:[0-9]+]], 8($[[R0]])
|
|
; NOT-R2R6-DAG: and $[[R4:[0-9]+]], $[[R1]], $[[R3]]
|
|
; ALL-DAG: ld $[[R5:[0-9]+]], %got_disp(gld0)
|
|
; ALL-DAG: ld $[[R6:[0-9]+]], 8($[[R5]])
|
|
; R2R6: dinsu $[[R0:[0-9]+]], $[[R1:[0-9]+]], 63, 1
|
|
; NOT-R2R6-DAG: daddiu $[[R7:[0-9]+]], $[[R3]], -1
|
|
; NOT-R2R6-DAG: and $[[R8:[0-9]+]], $[[R6]], $[[R7]]
|
|
; NOT-R2R6-DAG: or $4, $[[R8]], $[[R4]]
|
|
; ALL-DAG: ld $2, 0($[[R5]])
|
|
|
|
define fp128 @libcall2_copysignl() {
|
|
entry:
|
|
%0 = load fp128, fp128* @gld0, align 16
|
|
%1 = load fp128, fp128* @gld1, align 16
|
|
%call = tail call fp128 @copysignl(fp128 %0, fp128 %1) nounwind readnone
|
|
ret fp128 %call
|
|
}
|
|
|
|
declare fp128 @copysignl(fp128, fp128) #1
|
|
|
|
; ALL-LABEL: libcall2_powl:
|
|
; ALL: ld $25, %call16(powl)
|
|
|
|
define fp128 @libcall2_powl() {
|
|
entry:
|
|
%0 = load fp128, fp128* @gld0, align 16
|
|
%1 = load fp128, fp128* @gld1, align 16
|
|
%call = tail call fp128 @powl(fp128 %0, fp128 %1) nounwind
|
|
ret fp128 %call
|
|
}
|
|
|
|
declare fp128 @powl(fp128, fp128) #2
|
|
|
|
; ALL-LABEL: libcall2_fmodl:
|
|
; ALL: ld $25, %call16(fmodl)
|
|
|
|
define fp128 @libcall2_fmodl() {
|
|
entry:
|
|
%0 = load fp128, fp128* @gld0, align 16
|
|
%1 = load fp128, fp128* @gld1, align 16
|
|
%call = tail call fp128 @fmodl(fp128 %0, fp128 %1) nounwind
|
|
ret fp128 %call
|
|
}
|
|
|
|
declare fp128 @fmodl(fp128, fp128) #2
|
|
|
|
; ALL-LABEL: libcall3_fmal:
|
|
; ALL: ld $25, %call16(fmal)
|
|
|
|
define fp128 @libcall3_fmal() {
|
|
entry:
|
|
%0 = load fp128, fp128* @gld0, align 16
|
|
%1 = load fp128, fp128* @gld2, align 16
|
|
%2 = load fp128, fp128* @gld1, align 16
|
|
%3 = tail call fp128 @llvm.fma.f128(fp128 %0, fp128 %2, fp128 %1)
|
|
ret fp128 %3
|
|
}
|
|
|
|
declare fp128 @llvm.fma.f128(fp128, fp128, fp128) #4
|
|
|
|
; ALL-LABEL: cmp_lt:
|
|
; ALL: ld $25, %call16(__lttf2)
|
|
|
|
define i32 @cmp_lt(fp128 %a, fp128 %b) {
|
|
entry:
|
|
%cmp = fcmp olt fp128 %a, %b
|
|
%conv = zext i1 %cmp to i32
|
|
ret i32 %conv
|
|
}
|
|
|
|
; ALL-LABEL: cmp_le:
|
|
; ALL: ld $25, %call16(__letf2)
|
|
|
|
define i32 @cmp_le(fp128 %a, fp128 %b) {
|
|
entry:
|
|
%cmp = fcmp ole fp128 %a, %b
|
|
%conv = zext i1 %cmp to i32
|
|
ret i32 %conv
|
|
}
|
|
|
|
; ALL-LABEL: cmp_gt:
|
|
; ALL: ld $25, %call16(__gttf2)
|
|
|
|
define i32 @cmp_gt(fp128 %a, fp128 %b) {
|
|
entry:
|
|
%cmp = fcmp ogt fp128 %a, %b
|
|
%conv = zext i1 %cmp to i32
|
|
ret i32 %conv
|
|
}
|
|
|
|
; ALL-LABEL: cmp_ge:
|
|
; ALL: ld $25, %call16(__getf2)
|
|
|
|
define i32 @cmp_ge(fp128 %a, fp128 %b) {
|
|
entry:
|
|
%cmp = fcmp oge fp128 %a, %b
|
|
%conv = zext i1 %cmp to i32
|
|
ret i32 %conv
|
|
}
|
|
|
|
; ALL-LABEL: cmp_eq:
|
|
; ALL: ld $25, %call16(__eqtf2)
|
|
|
|
define i32 @cmp_eq(fp128 %a, fp128 %b) {
|
|
entry:
|
|
%cmp = fcmp oeq fp128 %a, %b
|
|
%conv = zext i1 %cmp to i32
|
|
ret i32 %conv
|
|
}
|
|
|
|
; ALL-LABEL: cmp_ne:
|
|
; ALL: ld $25, %call16(__netf2)
|
|
|
|
define i32 @cmp_ne(fp128 %a, fp128 %b) {
|
|
entry:
|
|
%cmp = fcmp une fp128 %a, %b
|
|
%conv = zext i1 %cmp to i32
|
|
ret i32 %conv
|
|
}
|
|
|
|
; ALL-LABEL: load_LD_LD:
|
|
; ALL: ld $[[R0:[0-9]+]], %got_disp(gld1)
|
|
; ALL: ld $2, 0($[[R0]])
|
|
; ALL: ld $4, 8($[[R0]])
|
|
|
|
define fp128 @load_LD_LD() {
|
|
entry:
|
|
%0 = load fp128, fp128* @gld1, align 16
|
|
ret fp128 %0
|
|
}
|
|
|
|
; ALL-LABEL: load_LD_float:
|
|
; ALL: ld $[[R0:[0-9]+]], %got_disp(gf1)
|
|
; ALL: lw $4, 0($[[R0]])
|
|
; ALL: ld $25, %call16(__extendsftf2)
|
|
; PRER6: jalr $25
|
|
; R6: jalrc $25
|
|
|
|
define fp128 @load_LD_float() {
|
|
entry:
|
|
%0 = load float, float* @gf1, align 4
|
|
%conv = fpext float %0 to fp128
|
|
ret fp128 %conv
|
|
}
|
|
|
|
; ALL-LABEL: load_LD_double:
|
|
; ALL: ld $[[R0:[0-9]+]], %got_disp(gd1)
|
|
; ALL: ld $4, 0($[[R0]])
|
|
; ALL: ld $25, %call16(__extenddftf2)
|
|
; PRER6: jalr $25
|
|
; R6: jalrc $25
|
|
|
|
define fp128 @load_LD_double() {
|
|
entry:
|
|
%0 = load double, double* @gd1, align 8
|
|
%conv = fpext double %0 to fp128
|
|
ret fp128 %conv
|
|
}
|
|
|
|
; ALL-LABEL: store_LD_LD:
|
|
; ALL: ld $[[R0:[0-9]+]], %got_disp(gld1)
|
|
; ALL: ld $[[R2:[0-9]+]], 8($[[R0]])
|
|
; ALL: ld $[[R3:[0-9]+]], %got_disp(gld0)
|
|
; ALL: sd $[[R2]], 8($[[R3]])
|
|
; ALL: ld $[[R1:[0-9]+]], 0($[[R0]])
|
|
; ALL: sd $[[R1]], 0($[[R3]])
|
|
|
|
define void @store_LD_LD() {
|
|
entry:
|
|
%0 = load fp128, fp128* @gld1, align 16
|
|
store fp128 %0, fp128* @gld0, align 16
|
|
ret void
|
|
}
|
|
|
|
; ALL-LABEL: store_LD_float:
|
|
; ALL: ld $[[R0:[0-9]+]], %got_disp(gld1)
|
|
; ALL: ld $4, 0($[[R0]])
|
|
; ALL: ld $5, 8($[[R0]])
|
|
; ALL: ld $25, %call16(__trunctfsf2)
|
|
; PRER6: jalr $25
|
|
; R6: jalrc $25
|
|
; ALL: ld $[[R1:[0-9]+]], %got_disp(gf1)
|
|
; ALL: sw $2, 0($[[R1]])
|
|
|
|
define void @store_LD_float() {
|
|
entry:
|
|
%0 = load fp128, fp128* @gld1, align 16
|
|
%conv = fptrunc fp128 %0 to float
|
|
store float %conv, float* @gf1, align 4
|
|
ret void
|
|
}
|
|
|
|
; ALL-LABEL: store_LD_double:
|
|
; ALL: ld $[[R0:[0-9]+]], %got_disp(gld1)
|
|
; ALL: ld $4, 0($[[R0]])
|
|
; ALL: ld $5, 8($[[R0]])
|
|
; ALL: ld $25, %call16(__trunctfdf2)
|
|
; PRER6: jalr $25
|
|
; R6: jalrc $25
|
|
; ALL: ld $[[R1:[0-9]+]], %got_disp(gd1)
|
|
; ALL: sd $2, 0($[[R1]])
|
|
|
|
define void @store_LD_double() {
|
|
entry:
|
|
%0 = load fp128, fp128* @gld1, align 16
|
|
%conv = fptrunc fp128 %0 to double
|
|
store double %conv, double* @gd1, align 8
|
|
ret void
|
|
}
|
|
|
|
; ALL-LABEL: select_LD:
|
|
; C_CC_FMT: movn $8, $6, $4
|
|
; C_CC_FMT: movn $9, $7, $4
|
|
; C_CC_FMT: move $2, $8
|
|
; C_CC_FMT: move $4, $9
|
|
|
|
; FIXME: This sll works around an implementation detail in the code generator
|
|
; (setcc's result is i32 so bits 32-63 are undefined). It's not really
|
|
; needed.
|
|
; CMP_CC_FMT-DAG: sll $[[CC:[0-9]+]], $4, 0
|
|
; CMP_CC_FMT-DAG: seleqz $[[EQ1:[0-9]+]], $8, $[[CC]]
|
|
; CMP_CC_FMT-DAG: selnez $[[NE1:[0-9]+]], $6, $[[CC]]
|
|
; CMP_CC_FMT-DAG: or $2, $[[NE1]], $[[EQ1]]
|
|
; CMP_CC_FMT-DAG: seleqz $[[EQ2:[0-9]+]], $9, $[[CC]]
|
|
; CMP_CC_FMT-DAG: selnez $[[NE2:[0-9]+]], $7, $[[CC]]
|
|
; CMP_CC_FMT-DAG: or $4, $[[NE2]], $[[EQ2]]
|
|
|
|
define fp128 @select_LD(i32 signext %a, i64, fp128 %b, fp128 %c) {
|
|
entry:
|
|
%tobool = icmp ne i32 %a, 0
|
|
%cond = select i1 %tobool, fp128 %b, fp128 %c
|
|
ret fp128 %cond
|
|
}
|
|
|
|
; ALL-LABEL: selectCC_LD:
|
|
; ALL: move $[[R0:[0-9]+]], $11
|
|
; ALL: move $[[R1:[0-9]+]], $10
|
|
; ALL: move $[[R2:[0-9]+]], $9
|
|
; ALL: move $[[R3:[0-9]+]], $8
|
|
; ALL: ld $25, %call16(__gttf2)($gp)
|
|
; PRER6: jalr $25
|
|
; R6: jalrc $25
|
|
|
|
; C_CC_FMT: slti $[[CC:[0-9]+]], $2, 1
|
|
; C_CC_FMT: movz $[[R1]], $[[R3]], $[[CC]]
|
|
; C_CC_FMT: movz $[[R0]], $[[R2]], $[[CC]]
|
|
; C_CC_FMT: move $2, $[[R1]]
|
|
; C_CC_FMT: move $4, $[[R0]]
|
|
|
|
; CMP_CC_FMT: slt $[[CC:[0-9]+]], $zero, $2
|
|
; CMP_CC_FMT: seleqz $[[EQ1:[0-9]+]], $[[R1]], $[[CC]]
|
|
; CMP_CC_FMT: selnez $[[NE1:[0-9]+]], $[[R3]], $[[CC]]
|
|
; CMP_CC_FMT: or $2, $[[NE1]], $[[EQ1]]
|
|
; CMP_CC_FMT: seleqz $[[EQ2:[0-9]+]], $[[R0]], $[[CC]]
|
|
; CMP_CC_FMT: selnez $[[NE2:[0-9]+]], $[[R2]], $[[CC]]
|
|
; CMP_CC_FMT: or $4, $[[NE2]], $[[EQ2]]
|
|
|
|
define fp128 @selectCC_LD(fp128 %a, fp128 %b, fp128 %c, fp128 %d) {
|
|
entry:
|
|
%cmp = fcmp ogt fp128 %a, %b
|
|
%cond = select i1 %cmp, fp128 %c, fp128 %d
|
|
ret fp128 %cond
|
|
}
|