mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-26 04:32:44 +01:00
d53e3aade2
This patch adds additional load/store test cases involving scalars, vectors, and PC-Rel in preparation for the refactored load and store implementation introduced in D93370. Differential Revision: https://reviews.llvm.org/D97391
7813 lines
257 KiB
LLVM
7813 lines
257 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
|
; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu \
|
|
; RUN: -mcpu=pwr10 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \
|
|
; RUN: < %s | FileCheck %s --check-prefixes=CHECK,CHECK-POSTP8,CHECK-P10
|
|
; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu \
|
|
; RUN: -mcpu=pwr10 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \
|
|
; RUN: < %s | FileCheck %s --check-prefixes=CHECK,CHECK-POSTP8,CHECK-P10
|
|
; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu \
|
|
; RUN: -mcpu=pwr9 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \
|
|
; RUN: < %s | FileCheck %s --check-prefixes=CHECK,CHECK-POSTP8,CHECK-PREP10,CHECK-P9
|
|
; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu \
|
|
; RUN: -mcpu=pwr9 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \
|
|
; RUN: < %s | FileCheck %s --check-prefixes=CHECK,CHECK-POSTP8,CHECK-PREP10,CHECK-P9
|
|
; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu \
|
|
; RUN: -mcpu=pwr8 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \
|
|
; RUN: < %s | FileCheck %s --check-prefixes=CHECK,CHECK-PREP10,CHECK-P8
|
|
; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu \
|
|
; RUN: -mcpu=pwr8 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \
|
|
; RUN: < %s | FileCheck %s --check-prefixes=CHECK,CHECK-PREP10,CHECK-P8
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_0_float_uint8_t(i64 %ptr) {
|
|
; CHECK-POSTP8-LABEL: ld_0_float_uint8_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: lxsibzx f0, 0, r3
|
|
; CHECK-POSTP8-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_0_float_uint8_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: lbz r3, 0(r3)
|
|
; CHECK-P8-NEXT: mtfprwz f0, r3
|
|
; CHECK-P8-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%0 = inttoptr i64 %ptr to i8*
|
|
%1 = load i8, i8* %0, align 1
|
|
%conv = uitofp i8 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_align16_float_uint8_t(i8* nocapture readonly %ptr) {
|
|
; CHECK-POSTP8-LABEL: ld_align16_float_uint8_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: addi r3, r3, 8
|
|
; CHECK-POSTP8-NEXT: lxsibzx f0, 0, r3
|
|
; CHECK-POSTP8-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_align16_float_uint8_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: lbz r3, 8(r3)
|
|
; CHECK-P8-NEXT: mtfprwz f0, r3
|
|
; CHECK-P8-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 8
|
|
%0 = load i8, i8* %add.ptr, align 1
|
|
%conv = uitofp i8 %0 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_align32_float_uint8_t(i8* nocapture readonly %ptr) {
|
|
; CHECK-P10-LABEL: ld_align32_float_uint8_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: pli r4, 99999000
|
|
; CHECK-P10-NEXT: lxsibzx f0, r3, r4
|
|
; CHECK-P10-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: ld_align32_float_uint8_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: lis r4, 1525
|
|
; CHECK-P9-NEXT: ori r4, r4, 56600
|
|
; CHECK-P9-NEXT: lxsibzx f0, r3, r4
|
|
; CHECK-P9-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_align32_float_uint8_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: lis r4, 1525
|
|
; CHECK-P8-NEXT: ori r4, r4, 56600
|
|
; CHECK-P8-NEXT: lbzx r3, r3, r4
|
|
; CHECK-P8-NEXT: mtfprwz f0, r3
|
|
; CHECK-P8-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 99999000
|
|
%0 = load i8, i8* %add.ptr, align 1
|
|
%conv = uitofp i8 %0 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_align64_float_uint8_t(i8* nocapture readonly %ptr) {
|
|
; CHECK-P10-LABEL: ld_align64_float_uint8_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: pli r4, 244140625
|
|
; CHECK-P10-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P10-NEXT: lxsibzx f0, r3, r4
|
|
; CHECK-P10-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: ld_align64_float_uint8_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: lis r4, 3725
|
|
; CHECK-P9-NEXT: ori r4, r4, 19025
|
|
; CHECK-P9-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P9-NEXT: lxsibzx f0, r3, r4
|
|
; CHECK-P9-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_align64_float_uint8_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: lis r4, 3725
|
|
; CHECK-P8-NEXT: ori r4, r4, 19025
|
|
; CHECK-P8-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P8-NEXT: lbzx r3, r3, r4
|
|
; CHECK-P8-NEXT: mtfprwz f0, r3
|
|
; CHECK-P8-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1000000000000
|
|
%0 = load i8, i8* %add.ptr, align 1
|
|
%conv = uitofp i8 %0 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_reg_float_uint8_t(i8* nocapture readonly %ptr, i64 %off) {
|
|
; CHECK-POSTP8-LABEL: ld_reg_float_uint8_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: lxsibzx f0, r3, r4
|
|
; CHECK-POSTP8-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_reg_float_uint8_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: lbzx r3, r3, r4
|
|
; CHECK-P8-NEXT: mtfprwz f0, r3
|
|
; CHECK-P8-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 %off
|
|
%0 = load i8, i8* %add.ptr, align 1
|
|
%conv = uitofp i8 %0 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_or_float_uint8_t(i64 %ptr, i8 zeroext %off) {
|
|
; CHECK-POSTP8-LABEL: ld_or_float_uint8_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: or r3, r4, r3
|
|
; CHECK-POSTP8-NEXT: lxsibzx f0, 0, r3
|
|
; CHECK-POSTP8-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_or_float_uint8_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: or r3, r4, r3
|
|
; CHECK-P8-NEXT: lbz r3, 0(r3)
|
|
; CHECK-P8-NEXT: mtfprwz f0, r3
|
|
; CHECK-P8-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = zext i8 %off to i64
|
|
%or = or i64 %conv, %ptr
|
|
%0 = inttoptr i64 %or to i8*
|
|
%1 = load i8, i8* %0, align 1
|
|
%conv1 = uitofp i8 %1 to float
|
|
ret float %conv1
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_not_disjoint16_float_uint8_t(i64 %ptr) {
|
|
; CHECK-POSTP8-LABEL: ld_not_disjoint16_float_uint8_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: ori r3, r3, 6
|
|
; CHECK-POSTP8-NEXT: lxsibzx f0, 0, r3
|
|
; CHECK-POSTP8-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_not_disjoint16_float_uint8_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: ori r3, r3, 6
|
|
; CHECK-P8-NEXT: lbz r3, 0(r3)
|
|
; CHECK-P8-NEXT: mtfprwz f0, r3
|
|
; CHECK-P8-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%or = or i64 %ptr, 6
|
|
%0 = inttoptr i64 %or to i8*
|
|
%1 = load i8, i8* %0, align 1
|
|
%conv = uitofp i8 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_disjoint_align16_float_uint8_t(i64 %ptr) {
|
|
; CHECK-POSTP8-LABEL: ld_disjoint_align16_float_uint8_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: rldicr r3, r3, 0, 51
|
|
; CHECK-POSTP8-NEXT: ori r3, r3, 24
|
|
; CHECK-POSTP8-NEXT: lxsibzx f0, 0, r3
|
|
; CHECK-POSTP8-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_disjoint_align16_float_uint8_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: rldicr r3, r3, 0, 51
|
|
; CHECK-P8-NEXT: lbz r3, 24(r3)
|
|
; CHECK-P8-NEXT: mtfprwz f0, r3
|
|
; CHECK-P8-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%and = and i64 %ptr, -4096
|
|
%or = or i64 %and, 24
|
|
%0 = inttoptr i64 %or to i8*
|
|
%1 = load i8, i8* %0, align 8
|
|
%conv = uitofp i8 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_not_disjoint32_float_uint8_t(i64 %ptr) {
|
|
; CHECK-POSTP8-LABEL: ld_not_disjoint32_float_uint8_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: ori r3, r3, 34463
|
|
; CHECK-POSTP8-NEXT: oris r3, r3, 1
|
|
; CHECK-POSTP8-NEXT: lxsibzx f0, 0, r3
|
|
; CHECK-POSTP8-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_not_disjoint32_float_uint8_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: ori r3, r3, 34463
|
|
; CHECK-P8-NEXT: oris r3, r3, 1
|
|
; CHECK-P8-NEXT: lbz r3, 0(r3)
|
|
; CHECK-P8-NEXT: mtfprwz f0, r3
|
|
; CHECK-P8-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%or = or i64 %ptr, 99999
|
|
%0 = inttoptr i64 %or to i8*
|
|
%1 = load i8, i8* %0, align 1
|
|
%conv = uitofp i8 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_disjoint_align32_float_uint8_t(i64 %ptr) {
|
|
; CHECK-P10-LABEL: ld_disjoint_align32_float_uint8_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: lis r4, -15264
|
|
; CHECK-P10-NEXT: and r3, r3, r4
|
|
; CHECK-P10-NEXT: pli r4, 999990000
|
|
; CHECK-P10-NEXT: lxsibzx f0, r3, r4
|
|
; CHECK-P10-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: ld_disjoint_align32_float_uint8_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: lis r4, -15264
|
|
; CHECK-P9-NEXT: and r3, r3, r4
|
|
; CHECK-P9-NEXT: lis r4, 15258
|
|
; CHECK-P9-NEXT: ori r4, r4, 41712
|
|
; CHECK-P9-NEXT: lxsibzx f0, r3, r4
|
|
; CHECK-P9-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_disjoint_align32_float_uint8_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: lis r4, -15264
|
|
; CHECK-P8-NEXT: lis r5, 15258
|
|
; CHECK-P8-NEXT: and r3, r3, r4
|
|
; CHECK-P8-NEXT: ori r4, r5, 41712
|
|
; CHECK-P8-NEXT: lbzx r3, r3, r4
|
|
; CHECK-P8-NEXT: mtfprwz f0, r3
|
|
; CHECK-P8-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%and = and i64 %ptr, -1000341504
|
|
%or = or i64 %and, 999990000
|
|
%0 = inttoptr i64 %or to i8*
|
|
%1 = load i8, i8* %0, align 16
|
|
%conv = uitofp i8 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_not_disjoint64_float_uint8_t(i64 %ptr) {
|
|
; CHECK-P10-LABEL: ld_not_disjoint64_float_uint8_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: pli r4, 232
|
|
; CHECK-P10-NEXT: pli r5, 3567587329
|
|
; CHECK-P10-NEXT: rldimi r5, r4, 32, 0
|
|
; CHECK-P10-NEXT: or r3, r3, r5
|
|
; CHECK-P10-NEXT: lxsibzx f0, 0, r3
|
|
; CHECK-P10-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: ld_not_disjoint64_float_uint8_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: li r4, 29
|
|
; CHECK-P9-NEXT: rldic r4, r4, 35, 24
|
|
; CHECK-P9-NEXT: oris r4, r4, 54437
|
|
; CHECK-P9-NEXT: ori r4, r4, 4097
|
|
; CHECK-P9-NEXT: or r3, r3, r4
|
|
; CHECK-P9-NEXT: lxsibzx f0, 0, r3
|
|
; CHECK-P9-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_not_disjoint64_float_uint8_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: li r4, 29
|
|
; CHECK-P8-NEXT: rldic r4, r4, 35, 24
|
|
; CHECK-P8-NEXT: oris r4, r4, 54437
|
|
; CHECK-P8-NEXT: ori r4, r4, 4097
|
|
; CHECK-P8-NEXT: or r3, r3, r4
|
|
; CHECK-P8-NEXT: lbz r3, 0(r3)
|
|
; CHECK-P8-NEXT: mtfprwz f0, r3
|
|
; CHECK-P8-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%or = or i64 %ptr, 1000000000001
|
|
%0 = inttoptr i64 %or to i8*
|
|
%1 = load i8, i8* %0, align 1
|
|
%conv = uitofp i8 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_disjoint_align64_float_uint8_t(i64 %ptr) {
|
|
; CHECK-P10-LABEL: ld_disjoint_align64_float_uint8_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: pli r4, 244140625
|
|
; CHECK-P10-NEXT: rldicr r3, r3, 0, 23
|
|
; CHECK-P10-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P10-NEXT: lxsibzx f0, r3, r4
|
|
; CHECK-P10-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: ld_disjoint_align64_float_uint8_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: lis r4, 3725
|
|
; CHECK-P9-NEXT: rldicr r3, r3, 0, 23
|
|
; CHECK-P9-NEXT: ori r4, r4, 19025
|
|
; CHECK-P9-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P9-NEXT: lxsibzx f0, r3, r4
|
|
; CHECK-P9-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_disjoint_align64_float_uint8_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: lis r4, 3725
|
|
; CHECK-P8-NEXT: rldicr r3, r3, 0, 23
|
|
; CHECK-P8-NEXT: ori r4, r4, 19025
|
|
; CHECK-P8-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P8-NEXT: lbzx r3, r3, r4
|
|
; CHECK-P8-NEXT: mtfprwz f0, r3
|
|
; CHECK-P8-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%and = and i64 %ptr, -1099511627776
|
|
%or = or i64 %and, 1000000000000
|
|
%0 = inttoptr i64 %or to i8*
|
|
%1 = load i8, i8* %0, align 4096
|
|
%conv = uitofp i8 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_cst_align16_float_uint8_t() {
|
|
; CHECK-POSTP8-LABEL: ld_cst_align16_float_uint8_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: li r3, 4080
|
|
; CHECK-POSTP8-NEXT: lxsibzx f0, 0, r3
|
|
; CHECK-POSTP8-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_cst_align16_float_uint8_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: lbz r3, 4080(0)
|
|
; CHECK-P8-NEXT: mtfprwz f0, r3
|
|
; CHECK-P8-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%0 = load i8, i8* inttoptr (i64 4080 to i8*), align 16
|
|
%conv = uitofp i8 %0 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_cst_align32_float_uint8_t() {
|
|
; CHECK-P10-LABEL: ld_cst_align32_float_uint8_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: pli r3, 9999900
|
|
; CHECK-P10-NEXT: lxsibzx f0, 0, r3
|
|
; CHECK-P10-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: ld_cst_align32_float_uint8_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: lis r3, 152
|
|
; CHECK-P9-NEXT: ori r3, r3, 38428
|
|
; CHECK-P9-NEXT: lxsibzx f0, 0, r3
|
|
; CHECK-P9-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_cst_align32_float_uint8_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: lis r3, 153
|
|
; CHECK-P8-NEXT: lbz r3, -27108(r3)
|
|
; CHECK-P8-NEXT: mtfprwz f0, r3
|
|
; CHECK-P8-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%0 = load i8, i8* inttoptr (i64 9999900 to i8*), align 4
|
|
%conv = uitofp i8 %0 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_cst_align64_float_uint8_t() {
|
|
; CHECK-P10-LABEL: ld_cst_align64_float_uint8_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: pli r3, 244140625
|
|
; CHECK-P10-NEXT: rldic r3, r3, 12, 24
|
|
; CHECK-P10-NEXT: lxsibzx f0, 0, r3
|
|
; CHECK-P10-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: ld_cst_align64_float_uint8_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: lis r3, 3725
|
|
; CHECK-P9-NEXT: ori r3, r3, 19025
|
|
; CHECK-P9-NEXT: rldic r3, r3, 12, 24
|
|
; CHECK-P9-NEXT: lxsibzx f0, 0, r3
|
|
; CHECK-P9-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_cst_align64_float_uint8_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: lis r3, 3725
|
|
; CHECK-P8-NEXT: ori r3, r3, 19025
|
|
; CHECK-P8-NEXT: rldic r3, r3, 12, 24
|
|
; CHECK-P8-NEXT: lbz r3, 0(r3)
|
|
; CHECK-P8-NEXT: mtfprwz f0, r3
|
|
; CHECK-P8-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%0 = load i8, i8* inttoptr (i64 1000000000000 to i8*), align 4096
|
|
%conv = uitofp i8 %0 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_0_float_int8_t(i64 %ptr) {
|
|
; CHECK-POSTP8-LABEL: ld_0_float_int8_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: lxsibzx v2, 0, r3
|
|
; CHECK-POSTP8-NEXT: vextsb2d v2, v2
|
|
; CHECK-POSTP8-NEXT: xscvsxdsp f1, v2
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_0_float_int8_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: lbz r3, 0(r3)
|
|
; CHECK-P8-NEXT: extsb r3, r3
|
|
; CHECK-P8-NEXT: mtfprwa f0, r3
|
|
; CHECK-P8-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%0 = inttoptr i64 %ptr to i8*
|
|
%1 = load i8, i8* %0, align 1
|
|
%conv = sitofp i8 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_align16_float_int8_t(i8* nocapture readonly %ptr) {
|
|
; CHECK-POSTP8-LABEL: ld_align16_float_int8_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: addi r3, r3, 8
|
|
; CHECK-POSTP8-NEXT: lxsibzx v2, 0, r3
|
|
; CHECK-POSTP8-NEXT: vextsb2d v2, v2
|
|
; CHECK-POSTP8-NEXT: xscvsxdsp f1, v2
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_align16_float_int8_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: lbz r3, 8(r3)
|
|
; CHECK-P8-NEXT: extsb r3, r3
|
|
; CHECK-P8-NEXT: mtfprwa f0, r3
|
|
; CHECK-P8-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 8
|
|
%0 = load i8, i8* %add.ptr, align 1
|
|
%conv = sitofp i8 %0 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_align32_float_int8_t(i8* nocapture readonly %ptr) {
|
|
; CHECK-P10-LABEL: ld_align32_float_int8_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: pli r4, 99999000
|
|
; CHECK-P10-NEXT: lxsibzx v2, r3, r4
|
|
; CHECK-P10-NEXT: vextsb2d v2, v2
|
|
; CHECK-P10-NEXT: xscvsxdsp f1, v2
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: ld_align32_float_int8_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: lis r4, 1525
|
|
; CHECK-P9-NEXT: ori r4, r4, 56600
|
|
; CHECK-P9-NEXT: lxsibzx v2, r3, r4
|
|
; CHECK-P9-NEXT: vextsb2d v2, v2
|
|
; CHECK-P9-NEXT: xscvsxdsp f1, v2
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_align32_float_int8_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: lis r4, 1525
|
|
; CHECK-P8-NEXT: ori r4, r4, 56600
|
|
; CHECK-P8-NEXT: lbzx r3, r3, r4
|
|
; CHECK-P8-NEXT: extsb r3, r3
|
|
; CHECK-P8-NEXT: mtfprwa f0, r3
|
|
; CHECK-P8-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 99999000
|
|
%0 = load i8, i8* %add.ptr, align 1
|
|
%conv = sitofp i8 %0 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_align64_float_int8_t(i8* nocapture readonly %ptr) {
|
|
; CHECK-P10-LABEL: ld_align64_float_int8_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: pli r4, 244140625
|
|
; CHECK-P10-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P10-NEXT: lxsibzx v2, r3, r4
|
|
; CHECK-P10-NEXT: vextsb2d v2, v2
|
|
; CHECK-P10-NEXT: xscvsxdsp f1, v2
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: ld_align64_float_int8_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: lis r4, 3725
|
|
; CHECK-P9-NEXT: ori r4, r4, 19025
|
|
; CHECK-P9-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P9-NEXT: lxsibzx v2, r3, r4
|
|
; CHECK-P9-NEXT: vextsb2d v2, v2
|
|
; CHECK-P9-NEXT: xscvsxdsp f1, v2
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_align64_float_int8_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: lis r4, 3725
|
|
; CHECK-P8-NEXT: ori r4, r4, 19025
|
|
; CHECK-P8-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P8-NEXT: lbzx r3, r3, r4
|
|
; CHECK-P8-NEXT: extsb r3, r3
|
|
; CHECK-P8-NEXT: mtfprwa f0, r3
|
|
; CHECK-P8-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1000000000000
|
|
%0 = load i8, i8* %add.ptr, align 1
|
|
%conv = sitofp i8 %0 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_reg_float_int8_t(i8* nocapture readonly %ptr, i64 %off) {
|
|
; CHECK-POSTP8-LABEL: ld_reg_float_int8_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: lxsibzx v2, r3, r4
|
|
; CHECK-POSTP8-NEXT: vextsb2d v2, v2
|
|
; CHECK-POSTP8-NEXT: xscvsxdsp f1, v2
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_reg_float_int8_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: lbzx r3, r3, r4
|
|
; CHECK-P8-NEXT: extsb r3, r3
|
|
; CHECK-P8-NEXT: mtfprwa f0, r3
|
|
; CHECK-P8-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 %off
|
|
%0 = load i8, i8* %add.ptr, align 1
|
|
%conv = sitofp i8 %0 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_or_float_int8_t(i64 %ptr, i8 zeroext %off) {
|
|
; CHECK-POSTP8-LABEL: ld_or_float_int8_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: or r3, r4, r3
|
|
; CHECK-POSTP8-NEXT: lxsibzx v2, 0, r3
|
|
; CHECK-POSTP8-NEXT: vextsb2d v2, v2
|
|
; CHECK-POSTP8-NEXT: xscvsxdsp f1, v2
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_or_float_int8_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: or r3, r4, r3
|
|
; CHECK-P8-NEXT: lbz r3, 0(r3)
|
|
; CHECK-P8-NEXT: extsb r3, r3
|
|
; CHECK-P8-NEXT: mtfprwa f0, r3
|
|
; CHECK-P8-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = zext i8 %off to i64
|
|
%or = or i64 %conv, %ptr
|
|
%0 = inttoptr i64 %or to i8*
|
|
%1 = load i8, i8* %0, align 1
|
|
%conv1 = sitofp i8 %1 to float
|
|
ret float %conv1
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_not_disjoint16_float_int8_t(i64 %ptr) {
|
|
; CHECK-POSTP8-LABEL: ld_not_disjoint16_float_int8_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: ori r3, r3, 6
|
|
; CHECK-POSTP8-NEXT: lxsibzx v2, 0, r3
|
|
; CHECK-POSTP8-NEXT: vextsb2d v2, v2
|
|
; CHECK-POSTP8-NEXT: xscvsxdsp f1, v2
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_not_disjoint16_float_int8_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: ori r3, r3, 6
|
|
; CHECK-P8-NEXT: lbz r3, 0(r3)
|
|
; CHECK-P8-NEXT: extsb r3, r3
|
|
; CHECK-P8-NEXT: mtfprwa f0, r3
|
|
; CHECK-P8-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%or = or i64 %ptr, 6
|
|
%0 = inttoptr i64 %or to i8*
|
|
%1 = load i8, i8* %0, align 1
|
|
%conv = sitofp i8 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_disjoint_align16_float_int8_t(i64 %ptr) {
|
|
; CHECK-POSTP8-LABEL: ld_disjoint_align16_float_int8_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: rldicr r3, r3, 0, 51
|
|
; CHECK-POSTP8-NEXT: ori r3, r3, 24
|
|
; CHECK-POSTP8-NEXT: lxsibzx v2, 0, r3
|
|
; CHECK-POSTP8-NEXT: vextsb2d v2, v2
|
|
; CHECK-POSTP8-NEXT: xscvsxdsp f1, v2
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_disjoint_align16_float_int8_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: rldicr r3, r3, 0, 51
|
|
; CHECK-P8-NEXT: lbz r3, 24(r3)
|
|
; CHECK-P8-NEXT: extsb r3, r3
|
|
; CHECK-P8-NEXT: mtfprwa f0, r3
|
|
; CHECK-P8-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%and = and i64 %ptr, -4096
|
|
%or = or i64 %and, 24
|
|
%0 = inttoptr i64 %or to i8*
|
|
%1 = load i8, i8* %0, align 8
|
|
%conv = sitofp i8 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_not_disjoint32_float_int8_t(i64 %ptr) {
|
|
; CHECK-POSTP8-LABEL: ld_not_disjoint32_float_int8_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: ori r3, r3, 34463
|
|
; CHECK-POSTP8-NEXT: oris r3, r3, 1
|
|
; CHECK-POSTP8-NEXT: lxsibzx v2, 0, r3
|
|
; CHECK-POSTP8-NEXT: vextsb2d v2, v2
|
|
; CHECK-POSTP8-NEXT: xscvsxdsp f1, v2
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_not_disjoint32_float_int8_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: ori r3, r3, 34463
|
|
; CHECK-P8-NEXT: oris r3, r3, 1
|
|
; CHECK-P8-NEXT: lbz r3, 0(r3)
|
|
; CHECK-P8-NEXT: extsb r3, r3
|
|
; CHECK-P8-NEXT: mtfprwa f0, r3
|
|
; CHECK-P8-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%or = or i64 %ptr, 99999
|
|
%0 = inttoptr i64 %or to i8*
|
|
%1 = load i8, i8* %0, align 1
|
|
%conv = sitofp i8 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_disjoint_align32_float_int8_t(i64 %ptr) {
|
|
; CHECK-P10-LABEL: ld_disjoint_align32_float_int8_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: lis r4, -15264
|
|
; CHECK-P10-NEXT: and r3, r3, r4
|
|
; CHECK-P10-NEXT: pli r4, 999990000
|
|
; CHECK-P10-NEXT: lxsibzx v2, r3, r4
|
|
; CHECK-P10-NEXT: vextsb2d v2, v2
|
|
; CHECK-P10-NEXT: xscvsxdsp f1, v2
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: ld_disjoint_align32_float_int8_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: lis r4, -15264
|
|
; CHECK-P9-NEXT: and r3, r3, r4
|
|
; CHECK-P9-NEXT: lis r4, 15258
|
|
; CHECK-P9-NEXT: ori r4, r4, 41712
|
|
; CHECK-P9-NEXT: lxsibzx v2, r3, r4
|
|
; CHECK-P9-NEXT: vextsb2d v2, v2
|
|
; CHECK-P9-NEXT: xscvsxdsp f1, v2
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_disjoint_align32_float_int8_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: lis r4, -15264
|
|
; CHECK-P8-NEXT: lis r5, 15258
|
|
; CHECK-P8-NEXT: and r3, r3, r4
|
|
; CHECK-P8-NEXT: ori r4, r5, 41712
|
|
; CHECK-P8-NEXT: lbzx r3, r3, r4
|
|
; CHECK-P8-NEXT: extsb r3, r3
|
|
; CHECK-P8-NEXT: mtfprwa f0, r3
|
|
; CHECK-P8-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%and = and i64 %ptr, -1000341504
|
|
%or = or i64 %and, 999990000
|
|
%0 = inttoptr i64 %or to i8*
|
|
%1 = load i8, i8* %0, align 16
|
|
%conv = sitofp i8 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_not_disjoint64_float_int8_t(i64 %ptr) {
|
|
; CHECK-P10-LABEL: ld_not_disjoint64_float_int8_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: pli r4, 232
|
|
; CHECK-P10-NEXT: pli r5, 3567587329
|
|
; CHECK-P10-NEXT: rldimi r5, r4, 32, 0
|
|
; CHECK-P10-NEXT: or r3, r3, r5
|
|
; CHECK-P10-NEXT: lxsibzx v2, 0, r3
|
|
; CHECK-P10-NEXT: vextsb2d v2, v2
|
|
; CHECK-P10-NEXT: xscvsxdsp f1, v2
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: ld_not_disjoint64_float_int8_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: li r4, 29
|
|
; CHECK-P9-NEXT: rldic r4, r4, 35, 24
|
|
; CHECK-P9-NEXT: oris r4, r4, 54437
|
|
; CHECK-P9-NEXT: ori r4, r4, 4097
|
|
; CHECK-P9-NEXT: or r3, r3, r4
|
|
; CHECK-P9-NEXT: lxsibzx v2, 0, r3
|
|
; CHECK-P9-NEXT: vextsb2d v2, v2
|
|
; CHECK-P9-NEXT: xscvsxdsp f1, v2
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_not_disjoint64_float_int8_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: li r4, 29
|
|
; CHECK-P8-NEXT: rldic r4, r4, 35, 24
|
|
; CHECK-P8-NEXT: oris r4, r4, 54437
|
|
; CHECK-P8-NEXT: ori r4, r4, 4097
|
|
; CHECK-P8-NEXT: or r3, r3, r4
|
|
; CHECK-P8-NEXT: lbz r3, 0(r3)
|
|
; CHECK-P8-NEXT: extsb r3, r3
|
|
; CHECK-P8-NEXT: mtfprwa f0, r3
|
|
; CHECK-P8-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%or = or i64 %ptr, 1000000000001
|
|
%0 = inttoptr i64 %or to i8*
|
|
%1 = load i8, i8* %0, align 1
|
|
%conv = sitofp i8 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_disjoint_align64_float_int8_t(i64 %ptr) {
|
|
; CHECK-P10-LABEL: ld_disjoint_align64_float_int8_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: pli r4, 244140625
|
|
; CHECK-P10-NEXT: rldicr r3, r3, 0, 23
|
|
; CHECK-P10-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P10-NEXT: lxsibzx v2, r3, r4
|
|
; CHECK-P10-NEXT: vextsb2d v2, v2
|
|
; CHECK-P10-NEXT: xscvsxdsp f1, v2
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: ld_disjoint_align64_float_int8_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: lis r4, 3725
|
|
; CHECK-P9-NEXT: rldicr r3, r3, 0, 23
|
|
; CHECK-P9-NEXT: ori r4, r4, 19025
|
|
; CHECK-P9-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P9-NEXT: lxsibzx v2, r3, r4
|
|
; CHECK-P9-NEXT: vextsb2d v2, v2
|
|
; CHECK-P9-NEXT: xscvsxdsp f1, v2
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_disjoint_align64_float_int8_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: lis r4, 3725
|
|
; CHECK-P8-NEXT: rldicr r3, r3, 0, 23
|
|
; CHECK-P8-NEXT: ori r4, r4, 19025
|
|
; CHECK-P8-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P8-NEXT: lbzx r3, r3, r4
|
|
; CHECK-P8-NEXT: extsb r3, r3
|
|
; CHECK-P8-NEXT: mtfprwa f0, r3
|
|
; CHECK-P8-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%and = and i64 %ptr, -1099511627776
|
|
%or = or i64 %and, 1000000000000
|
|
%0 = inttoptr i64 %or to i8*
|
|
%1 = load i8, i8* %0, align 4096
|
|
%conv = sitofp i8 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_cst_align16_float_int8_t() {
|
|
; CHECK-POSTP8-LABEL: ld_cst_align16_float_int8_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: li r3, 4080
|
|
; CHECK-POSTP8-NEXT: lxsibzx v2, 0, r3
|
|
; CHECK-POSTP8-NEXT: vextsb2d v2, v2
|
|
; CHECK-POSTP8-NEXT: xscvsxdsp f1, v2
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_cst_align16_float_int8_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: lbz r3, 4080(0)
|
|
; CHECK-P8-NEXT: extsb r3, r3
|
|
; CHECK-P8-NEXT: mtfprwa f0, r3
|
|
; CHECK-P8-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%0 = load i8, i8* inttoptr (i64 4080 to i8*), align 16
|
|
%conv = sitofp i8 %0 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_cst_align32_float_int8_t() {
|
|
; CHECK-P10-LABEL: ld_cst_align32_float_int8_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: pli r3, 9999900
|
|
; CHECK-P10-NEXT: lxsibzx v2, 0, r3
|
|
; CHECK-P10-NEXT: vextsb2d v2, v2
|
|
; CHECK-P10-NEXT: xscvsxdsp f1, v2
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: ld_cst_align32_float_int8_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: lis r3, 152
|
|
; CHECK-P9-NEXT: ori r3, r3, 38428
|
|
; CHECK-P9-NEXT: lxsibzx v2, 0, r3
|
|
; CHECK-P9-NEXT: vextsb2d v2, v2
|
|
; CHECK-P9-NEXT: xscvsxdsp f1, v2
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_cst_align32_float_int8_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: lis r3, 153
|
|
; CHECK-P8-NEXT: lbz r3, -27108(r3)
|
|
; CHECK-P8-NEXT: extsb r3, r3
|
|
; CHECK-P8-NEXT: mtfprwa f0, r3
|
|
; CHECK-P8-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%0 = load i8, i8* inttoptr (i64 9999900 to i8*), align 4
|
|
%conv = sitofp i8 %0 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_cst_align64_float_int8_t() {
|
|
; CHECK-P10-LABEL: ld_cst_align64_float_int8_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: pli r3, 244140625
|
|
; CHECK-P10-NEXT: rldic r3, r3, 12, 24
|
|
; CHECK-P10-NEXT: lxsibzx v2, 0, r3
|
|
; CHECK-P10-NEXT: vextsb2d v2, v2
|
|
; CHECK-P10-NEXT: xscvsxdsp f1, v2
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: ld_cst_align64_float_int8_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: lis r3, 3725
|
|
; CHECK-P9-NEXT: ori r3, r3, 19025
|
|
; CHECK-P9-NEXT: rldic r3, r3, 12, 24
|
|
; CHECK-P9-NEXT: lxsibzx v2, 0, r3
|
|
; CHECK-P9-NEXT: vextsb2d v2, v2
|
|
; CHECK-P9-NEXT: xscvsxdsp f1, v2
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_cst_align64_float_int8_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: lis r3, 3725
|
|
; CHECK-P8-NEXT: ori r3, r3, 19025
|
|
; CHECK-P8-NEXT: rldic r3, r3, 12, 24
|
|
; CHECK-P8-NEXT: lbz r3, 0(r3)
|
|
; CHECK-P8-NEXT: extsb r3, r3
|
|
; CHECK-P8-NEXT: mtfprwa f0, r3
|
|
; CHECK-P8-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%0 = load i8, i8* inttoptr (i64 1000000000000 to i8*), align 4096
|
|
%conv = sitofp i8 %0 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_0_float_uint16_t(i64 %ptr) {
|
|
; CHECK-POSTP8-LABEL: ld_0_float_uint16_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: lxsihzx f0, 0, r3
|
|
; CHECK-POSTP8-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_0_float_uint16_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: lhz r3, 0(r3)
|
|
; CHECK-P8-NEXT: mtfprwz f0, r3
|
|
; CHECK-P8-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%0 = inttoptr i64 %ptr to i16*
|
|
%1 = load i16, i16* %0, align 2
|
|
%conv = uitofp i16 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_align16_float_uint16_t(i8* nocapture readonly %ptr) {
|
|
; CHECK-POSTP8-LABEL: ld_align16_float_uint16_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: addi r3, r3, 8
|
|
; CHECK-POSTP8-NEXT: lxsihzx f0, 0, r3
|
|
; CHECK-POSTP8-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_align16_float_uint16_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: lhz r3, 8(r3)
|
|
; CHECK-P8-NEXT: mtfprwz f0, r3
|
|
; CHECK-P8-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 8
|
|
%0 = bitcast i8* %add.ptr to i16*
|
|
%1 = load i16, i16* %0, align 2
|
|
%conv = uitofp i16 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_align32_float_uint16_t(i8* nocapture readonly %ptr) {
|
|
; CHECK-P10-LABEL: ld_align32_float_uint16_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: pli r4, 99999000
|
|
; CHECK-P10-NEXT: lxsihzx f0, r3, r4
|
|
; CHECK-P10-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: ld_align32_float_uint16_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: lis r4, 1525
|
|
; CHECK-P9-NEXT: ori r4, r4, 56600
|
|
; CHECK-P9-NEXT: lxsihzx f0, r3, r4
|
|
; CHECK-P9-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_align32_float_uint16_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: lis r4, 1525
|
|
; CHECK-P8-NEXT: ori r4, r4, 56600
|
|
; CHECK-P8-NEXT: lhzx r3, r3, r4
|
|
; CHECK-P8-NEXT: mtfprwz f0, r3
|
|
; CHECK-P8-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 99999000
|
|
%0 = bitcast i8* %add.ptr to i16*
|
|
%1 = load i16, i16* %0, align 2
|
|
%conv = uitofp i16 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_align64_float_uint16_t(i8* nocapture readonly %ptr) {
|
|
; CHECK-P10-LABEL: ld_align64_float_uint16_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: pli r4, 244140625
|
|
; CHECK-P10-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P10-NEXT: lxsihzx f0, r3, r4
|
|
; CHECK-P10-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: ld_align64_float_uint16_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: lis r4, 3725
|
|
; CHECK-P9-NEXT: ori r4, r4, 19025
|
|
; CHECK-P9-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P9-NEXT: lxsihzx f0, r3, r4
|
|
; CHECK-P9-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_align64_float_uint16_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: lis r4, 3725
|
|
; CHECK-P8-NEXT: ori r4, r4, 19025
|
|
; CHECK-P8-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P8-NEXT: lhzx r3, r3, r4
|
|
; CHECK-P8-NEXT: mtfprwz f0, r3
|
|
; CHECK-P8-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1000000000000
|
|
%0 = bitcast i8* %add.ptr to i16*
|
|
%1 = load i16, i16* %0, align 2
|
|
%conv = uitofp i16 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_reg_float_uint16_t(i8* nocapture readonly %ptr, i64 %off) {
|
|
; CHECK-POSTP8-LABEL: ld_reg_float_uint16_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: lxsihzx f0, r3, r4
|
|
; CHECK-POSTP8-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_reg_float_uint16_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: lhzx r3, r3, r4
|
|
; CHECK-P8-NEXT: mtfprwz f0, r3
|
|
; CHECK-P8-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 %off
|
|
%0 = bitcast i8* %add.ptr to i16*
|
|
%1 = load i16, i16* %0, align 2
|
|
%conv = uitofp i16 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_or_float_uint16_t(i64 %ptr, i8 zeroext %off) {
|
|
; CHECK-POSTP8-LABEL: ld_or_float_uint16_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: or r3, r4, r3
|
|
; CHECK-POSTP8-NEXT: lxsihzx f0, 0, r3
|
|
; CHECK-POSTP8-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_or_float_uint16_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: or r3, r4, r3
|
|
; CHECK-P8-NEXT: lhz r3, 0(r3)
|
|
; CHECK-P8-NEXT: mtfprwz f0, r3
|
|
; CHECK-P8-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = zext i8 %off to i64
|
|
%or = or i64 %conv, %ptr
|
|
%0 = inttoptr i64 %or to i16*
|
|
%1 = load i16, i16* %0, align 2
|
|
%conv1 = uitofp i16 %1 to float
|
|
ret float %conv1
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_not_disjoint16_float_uint16_t(i64 %ptr) {
|
|
; CHECK-POSTP8-LABEL: ld_not_disjoint16_float_uint16_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: ori r3, r3, 6
|
|
; CHECK-POSTP8-NEXT: lxsihzx f0, 0, r3
|
|
; CHECK-POSTP8-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_not_disjoint16_float_uint16_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: ori r3, r3, 6
|
|
; CHECK-P8-NEXT: lhz r3, 0(r3)
|
|
; CHECK-P8-NEXT: mtfprwz f0, r3
|
|
; CHECK-P8-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%or = or i64 %ptr, 6
|
|
%0 = inttoptr i64 %or to i16*
|
|
%1 = load i16, i16* %0, align 2
|
|
%conv = uitofp i16 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_disjoint_align16_float_uint16_t(i64 %ptr) {
|
|
; CHECK-POSTP8-LABEL: ld_disjoint_align16_float_uint16_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: rldicr r3, r3, 0, 51
|
|
; CHECK-POSTP8-NEXT: ori r3, r3, 24
|
|
; CHECK-POSTP8-NEXT: lxsihzx f0, 0, r3
|
|
; CHECK-POSTP8-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_disjoint_align16_float_uint16_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: rldicr r3, r3, 0, 51
|
|
; CHECK-P8-NEXT: lhz r3, 24(r3)
|
|
; CHECK-P8-NEXT: mtfprwz f0, r3
|
|
; CHECK-P8-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%and = and i64 %ptr, -4096
|
|
%or = or i64 %and, 24
|
|
%0 = inttoptr i64 %or to i16*
|
|
%1 = load i16, i16* %0, align 8
|
|
%conv = uitofp i16 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_not_disjoint32_float_uint16_t(i64 %ptr) {
|
|
; CHECK-POSTP8-LABEL: ld_not_disjoint32_float_uint16_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: ori r3, r3, 34463
|
|
; CHECK-POSTP8-NEXT: oris r3, r3, 1
|
|
; CHECK-POSTP8-NEXT: lxsihzx f0, 0, r3
|
|
; CHECK-POSTP8-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_not_disjoint32_float_uint16_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: ori r3, r3, 34463
|
|
; CHECK-P8-NEXT: oris r3, r3, 1
|
|
; CHECK-P8-NEXT: lhz r3, 0(r3)
|
|
; CHECK-P8-NEXT: mtfprwz f0, r3
|
|
; CHECK-P8-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%or = or i64 %ptr, 99999
|
|
%0 = inttoptr i64 %or to i16*
|
|
%1 = load i16, i16* %0, align 2
|
|
%conv = uitofp i16 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_disjoint_align32_float_uint16_t(i64 %ptr) {
|
|
; CHECK-P10-LABEL: ld_disjoint_align32_float_uint16_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: lis r4, -15264
|
|
; CHECK-P10-NEXT: and r3, r3, r4
|
|
; CHECK-P10-NEXT: pli r4, 999990000
|
|
; CHECK-P10-NEXT: lxsihzx f0, r3, r4
|
|
; CHECK-P10-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: ld_disjoint_align32_float_uint16_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: lis r4, -15264
|
|
; CHECK-P9-NEXT: and r3, r3, r4
|
|
; CHECK-P9-NEXT: lis r4, 15258
|
|
; CHECK-P9-NEXT: ori r4, r4, 41712
|
|
; CHECK-P9-NEXT: lxsihzx f0, r3, r4
|
|
; CHECK-P9-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_disjoint_align32_float_uint16_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: lis r4, -15264
|
|
; CHECK-P8-NEXT: lis r5, 15258
|
|
; CHECK-P8-NEXT: and r3, r3, r4
|
|
; CHECK-P8-NEXT: ori r4, r5, 41712
|
|
; CHECK-P8-NEXT: lhzx r3, r3, r4
|
|
; CHECK-P8-NEXT: mtfprwz f0, r3
|
|
; CHECK-P8-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%and = and i64 %ptr, -1000341504
|
|
%or = or i64 %and, 999990000
|
|
%0 = inttoptr i64 %or to i16*
|
|
%1 = load i16, i16* %0, align 16
|
|
%conv = uitofp i16 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_not_disjoint64_float_uint16_t(i64 %ptr) {
|
|
; CHECK-P10-LABEL: ld_not_disjoint64_float_uint16_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: pli r4, 232
|
|
; CHECK-P10-NEXT: pli r5, 3567587329
|
|
; CHECK-P10-NEXT: rldimi r5, r4, 32, 0
|
|
; CHECK-P10-NEXT: or r3, r3, r5
|
|
; CHECK-P10-NEXT: lxsihzx f0, 0, r3
|
|
; CHECK-P10-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: ld_not_disjoint64_float_uint16_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: li r4, 29
|
|
; CHECK-P9-NEXT: rldic r4, r4, 35, 24
|
|
; CHECK-P9-NEXT: oris r4, r4, 54437
|
|
; CHECK-P9-NEXT: ori r4, r4, 4097
|
|
; CHECK-P9-NEXT: or r3, r3, r4
|
|
; CHECK-P9-NEXT: lxsihzx f0, 0, r3
|
|
; CHECK-P9-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_not_disjoint64_float_uint16_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: li r4, 29
|
|
; CHECK-P8-NEXT: rldic r4, r4, 35, 24
|
|
; CHECK-P8-NEXT: oris r4, r4, 54437
|
|
; CHECK-P8-NEXT: ori r4, r4, 4097
|
|
; CHECK-P8-NEXT: or r3, r3, r4
|
|
; CHECK-P8-NEXT: lhz r3, 0(r3)
|
|
; CHECK-P8-NEXT: mtfprwz f0, r3
|
|
; CHECK-P8-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%or = or i64 %ptr, 1000000000001
|
|
%0 = inttoptr i64 %or to i16*
|
|
%1 = load i16, i16* %0, align 2
|
|
%conv = uitofp i16 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_disjoint_align64_float_uint16_t(i64 %ptr) {
|
|
; CHECK-P10-LABEL: ld_disjoint_align64_float_uint16_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: pli r4, 244140625
|
|
; CHECK-P10-NEXT: rldicr r3, r3, 0, 23
|
|
; CHECK-P10-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P10-NEXT: lxsihzx f0, r3, r4
|
|
; CHECK-P10-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: ld_disjoint_align64_float_uint16_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: lis r4, 3725
|
|
; CHECK-P9-NEXT: rldicr r3, r3, 0, 23
|
|
; CHECK-P9-NEXT: ori r4, r4, 19025
|
|
; CHECK-P9-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P9-NEXT: lxsihzx f0, r3, r4
|
|
; CHECK-P9-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_disjoint_align64_float_uint16_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: lis r4, 3725
|
|
; CHECK-P8-NEXT: rldicr r3, r3, 0, 23
|
|
; CHECK-P8-NEXT: ori r4, r4, 19025
|
|
; CHECK-P8-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P8-NEXT: lhzx r3, r3, r4
|
|
; CHECK-P8-NEXT: mtfprwz f0, r3
|
|
; CHECK-P8-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%and = and i64 %ptr, -1099511627776
|
|
%or = or i64 %and, 1000000000000
|
|
%0 = inttoptr i64 %or to i16*
|
|
%1 = load i16, i16* %0, align 4096
|
|
%conv = uitofp i16 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_cst_align16_float_uint16_t() {
|
|
; CHECK-POSTP8-LABEL: ld_cst_align16_float_uint16_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: li r3, 4080
|
|
; CHECK-POSTP8-NEXT: lxsihzx f0, 0, r3
|
|
; CHECK-POSTP8-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_cst_align16_float_uint16_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: lhz r3, 4080(0)
|
|
; CHECK-P8-NEXT: mtfprwz f0, r3
|
|
; CHECK-P8-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%0 = load i16, i16* inttoptr (i64 4080 to i16*), align 16
|
|
%conv = uitofp i16 %0 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_cst_align32_float_uint16_t() {
|
|
; CHECK-P10-LABEL: ld_cst_align32_float_uint16_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: pli r3, 9999900
|
|
; CHECK-P10-NEXT: lxsihzx f0, 0, r3
|
|
; CHECK-P10-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: ld_cst_align32_float_uint16_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: lis r3, 152
|
|
; CHECK-P9-NEXT: ori r3, r3, 38428
|
|
; CHECK-P9-NEXT: lxsihzx f0, 0, r3
|
|
; CHECK-P9-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_cst_align32_float_uint16_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: lis r3, 153
|
|
; CHECK-P8-NEXT: lhz r3, -27108(r3)
|
|
; CHECK-P8-NEXT: mtfprwz f0, r3
|
|
; CHECK-P8-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%0 = load i16, i16* inttoptr (i64 9999900 to i16*), align 4
|
|
%conv = uitofp i16 %0 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_cst_align64_float_uint16_t() {
|
|
; CHECK-P10-LABEL: ld_cst_align64_float_uint16_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: pli r3, 244140625
|
|
; CHECK-P10-NEXT: rldic r3, r3, 12, 24
|
|
; CHECK-P10-NEXT: lxsihzx f0, 0, r3
|
|
; CHECK-P10-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: ld_cst_align64_float_uint16_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: lis r3, 3725
|
|
; CHECK-P9-NEXT: ori r3, r3, 19025
|
|
; CHECK-P9-NEXT: rldic r3, r3, 12, 24
|
|
; CHECK-P9-NEXT: lxsihzx f0, 0, r3
|
|
; CHECK-P9-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_cst_align64_float_uint16_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: lis r3, 3725
|
|
; CHECK-P8-NEXT: ori r3, r3, 19025
|
|
; CHECK-P8-NEXT: rldic r3, r3, 12, 24
|
|
; CHECK-P8-NEXT: lhz r3, 0(r3)
|
|
; CHECK-P8-NEXT: mtfprwz f0, r3
|
|
; CHECK-P8-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%0 = load i16, i16* inttoptr (i64 1000000000000 to i16*), align 4096
|
|
%conv = uitofp i16 %0 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_0_float_int16_t(i64 %ptr) {
|
|
; CHECK-POSTP8-LABEL: ld_0_float_int16_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: lxsihzx v2, 0, r3
|
|
; CHECK-POSTP8-NEXT: vextsh2d v2, v2
|
|
; CHECK-POSTP8-NEXT: xscvsxdsp f1, v2
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_0_float_int16_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: lha r3, 0(r3)
|
|
; CHECK-P8-NEXT: mtfprwa f0, r3
|
|
; CHECK-P8-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%0 = inttoptr i64 %ptr to i16*
|
|
%1 = load i16, i16* %0, align 2
|
|
%conv = sitofp i16 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_align16_float_int16_t(i8* nocapture readonly %ptr) {
|
|
; CHECK-POSTP8-LABEL: ld_align16_float_int16_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: addi r3, r3, 8
|
|
; CHECK-POSTP8-NEXT: lxsihzx v2, 0, r3
|
|
; CHECK-POSTP8-NEXT: vextsh2d v2, v2
|
|
; CHECK-POSTP8-NEXT: xscvsxdsp f1, v2
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_align16_float_int16_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: lha r3, 8(r3)
|
|
; CHECK-P8-NEXT: mtfprwa f0, r3
|
|
; CHECK-P8-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 8
|
|
%0 = bitcast i8* %add.ptr to i16*
|
|
%1 = load i16, i16* %0, align 2
|
|
%conv = sitofp i16 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_align32_float_int16_t(i8* nocapture readonly %ptr) {
|
|
; CHECK-P10-LABEL: ld_align32_float_int16_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: pli r4, 99999000
|
|
; CHECK-P10-NEXT: lxsihzx v2, r3, r4
|
|
; CHECK-P10-NEXT: vextsh2d v2, v2
|
|
; CHECK-P10-NEXT: xscvsxdsp f1, v2
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: ld_align32_float_int16_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: lis r4, 1525
|
|
; CHECK-P9-NEXT: ori r4, r4, 56600
|
|
; CHECK-P9-NEXT: lxsihzx v2, r3, r4
|
|
; CHECK-P9-NEXT: vextsh2d v2, v2
|
|
; CHECK-P9-NEXT: xscvsxdsp f1, v2
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_align32_float_int16_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: lis r4, 1525
|
|
; CHECK-P8-NEXT: ori r4, r4, 56600
|
|
; CHECK-P8-NEXT: lhax r3, r3, r4
|
|
; CHECK-P8-NEXT: mtfprwa f0, r3
|
|
; CHECK-P8-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 99999000
|
|
%0 = bitcast i8* %add.ptr to i16*
|
|
%1 = load i16, i16* %0, align 2
|
|
%conv = sitofp i16 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_align64_float_int16_t(i8* nocapture readonly %ptr) {
|
|
; CHECK-P10-LABEL: ld_align64_float_int16_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: pli r4, 244140625
|
|
; CHECK-P10-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P10-NEXT: lxsihzx v2, r3, r4
|
|
; CHECK-P10-NEXT: vextsh2d v2, v2
|
|
; CHECK-P10-NEXT: xscvsxdsp f1, v2
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: ld_align64_float_int16_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: lis r4, 3725
|
|
; CHECK-P9-NEXT: ori r4, r4, 19025
|
|
; CHECK-P9-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P9-NEXT: lxsihzx v2, r3, r4
|
|
; CHECK-P9-NEXT: vextsh2d v2, v2
|
|
; CHECK-P9-NEXT: xscvsxdsp f1, v2
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_align64_float_int16_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: lis r4, 3725
|
|
; CHECK-P8-NEXT: ori r4, r4, 19025
|
|
; CHECK-P8-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P8-NEXT: lhax r3, r3, r4
|
|
; CHECK-P8-NEXT: mtfprwa f0, r3
|
|
; CHECK-P8-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1000000000000
|
|
%0 = bitcast i8* %add.ptr to i16*
|
|
%1 = load i16, i16* %0, align 2
|
|
%conv = sitofp i16 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_reg_float_int16_t(i8* nocapture readonly %ptr, i64 %off) {
|
|
; CHECK-POSTP8-LABEL: ld_reg_float_int16_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: lxsihzx v2, r3, r4
|
|
; CHECK-POSTP8-NEXT: vextsh2d v2, v2
|
|
; CHECK-POSTP8-NEXT: xscvsxdsp f1, v2
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_reg_float_int16_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: lhax r3, r3, r4
|
|
; CHECK-P8-NEXT: mtfprwa f0, r3
|
|
; CHECK-P8-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 %off
|
|
%0 = bitcast i8* %add.ptr to i16*
|
|
%1 = load i16, i16* %0, align 2
|
|
%conv = sitofp i16 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_or_float_int16_t(i64 %ptr, i8 zeroext %off) {
|
|
; CHECK-POSTP8-LABEL: ld_or_float_int16_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: or r3, r4, r3
|
|
; CHECK-POSTP8-NEXT: lxsihzx v2, 0, r3
|
|
; CHECK-POSTP8-NEXT: vextsh2d v2, v2
|
|
; CHECK-POSTP8-NEXT: xscvsxdsp f1, v2
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_or_float_int16_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: or r3, r4, r3
|
|
; CHECK-P8-NEXT: lha r3, 0(r3)
|
|
; CHECK-P8-NEXT: mtfprwa f0, r3
|
|
; CHECK-P8-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = zext i8 %off to i64
|
|
%or = or i64 %conv, %ptr
|
|
%0 = inttoptr i64 %or to i16*
|
|
%1 = load i16, i16* %0, align 2
|
|
%conv1 = sitofp i16 %1 to float
|
|
ret float %conv1
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_not_disjoint16_float_int16_t(i64 %ptr) {
|
|
; CHECK-POSTP8-LABEL: ld_not_disjoint16_float_int16_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: ori r3, r3, 6
|
|
; CHECK-POSTP8-NEXT: lxsihzx v2, 0, r3
|
|
; CHECK-POSTP8-NEXT: vextsh2d v2, v2
|
|
; CHECK-POSTP8-NEXT: xscvsxdsp f1, v2
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_not_disjoint16_float_int16_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: ori r3, r3, 6
|
|
; CHECK-P8-NEXT: lha r3, 0(r3)
|
|
; CHECK-P8-NEXT: mtfprwa f0, r3
|
|
; CHECK-P8-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%or = or i64 %ptr, 6
|
|
%0 = inttoptr i64 %or to i16*
|
|
%1 = load i16, i16* %0, align 2
|
|
%conv = sitofp i16 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_disjoint_align16_float_int16_t(i64 %ptr) {
|
|
; CHECK-POSTP8-LABEL: ld_disjoint_align16_float_int16_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: rldicr r3, r3, 0, 51
|
|
; CHECK-POSTP8-NEXT: ori r3, r3, 24
|
|
; CHECK-POSTP8-NEXT: lxsihzx v2, 0, r3
|
|
; CHECK-POSTP8-NEXT: vextsh2d v2, v2
|
|
; CHECK-POSTP8-NEXT: xscvsxdsp f1, v2
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_disjoint_align16_float_int16_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: rldicr r3, r3, 0, 51
|
|
; CHECK-P8-NEXT: lha r3, 24(r3)
|
|
; CHECK-P8-NEXT: mtfprwa f0, r3
|
|
; CHECK-P8-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%and = and i64 %ptr, -4096
|
|
%or = or i64 %and, 24
|
|
%0 = inttoptr i64 %or to i16*
|
|
%1 = load i16, i16* %0, align 8
|
|
%conv = sitofp i16 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_not_disjoint32_float_int16_t(i64 %ptr) {
|
|
; CHECK-POSTP8-LABEL: ld_not_disjoint32_float_int16_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: ori r3, r3, 34463
|
|
; CHECK-POSTP8-NEXT: oris r3, r3, 1
|
|
; CHECK-POSTP8-NEXT: lxsihzx v2, 0, r3
|
|
; CHECK-POSTP8-NEXT: vextsh2d v2, v2
|
|
; CHECK-POSTP8-NEXT: xscvsxdsp f1, v2
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_not_disjoint32_float_int16_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: ori r3, r3, 34463
|
|
; CHECK-P8-NEXT: oris r3, r3, 1
|
|
; CHECK-P8-NEXT: lha r3, 0(r3)
|
|
; CHECK-P8-NEXT: mtfprwa f0, r3
|
|
; CHECK-P8-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%or = or i64 %ptr, 99999
|
|
%0 = inttoptr i64 %or to i16*
|
|
%1 = load i16, i16* %0, align 2
|
|
%conv = sitofp i16 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_disjoint_align32_float_int16_t(i64 %ptr) {
|
|
; CHECK-P10-LABEL: ld_disjoint_align32_float_int16_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: lis r4, -15264
|
|
; CHECK-P10-NEXT: and r3, r3, r4
|
|
; CHECK-P10-NEXT: pli r4, 999990000
|
|
; CHECK-P10-NEXT: lxsihzx v2, r3, r4
|
|
; CHECK-P10-NEXT: vextsh2d v2, v2
|
|
; CHECK-P10-NEXT: xscvsxdsp f1, v2
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: ld_disjoint_align32_float_int16_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: lis r4, -15264
|
|
; CHECK-P9-NEXT: and r3, r3, r4
|
|
; CHECK-P9-NEXT: lis r4, 15258
|
|
; CHECK-P9-NEXT: ori r4, r4, 41712
|
|
; CHECK-P9-NEXT: lxsihzx v2, r3, r4
|
|
; CHECK-P9-NEXT: vextsh2d v2, v2
|
|
; CHECK-P9-NEXT: xscvsxdsp f1, v2
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_disjoint_align32_float_int16_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: lis r4, -15264
|
|
; CHECK-P8-NEXT: lis r5, 15258
|
|
; CHECK-P8-NEXT: and r3, r3, r4
|
|
; CHECK-P8-NEXT: ori r4, r5, 41712
|
|
; CHECK-P8-NEXT: lhax r3, r3, r4
|
|
; CHECK-P8-NEXT: mtfprwa f0, r3
|
|
; CHECK-P8-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%and = and i64 %ptr, -1000341504
|
|
%or = or i64 %and, 999990000
|
|
%0 = inttoptr i64 %or to i16*
|
|
%1 = load i16, i16* %0, align 16
|
|
%conv = sitofp i16 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_not_disjoint64_float_int16_t(i64 %ptr) {
|
|
; CHECK-P10-LABEL: ld_not_disjoint64_float_int16_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: pli r4, 232
|
|
; CHECK-P10-NEXT: pli r5, 3567587329
|
|
; CHECK-P10-NEXT: rldimi r5, r4, 32, 0
|
|
; CHECK-P10-NEXT: or r3, r3, r5
|
|
; CHECK-P10-NEXT: lxsihzx v2, 0, r3
|
|
; CHECK-P10-NEXT: vextsh2d v2, v2
|
|
; CHECK-P10-NEXT: xscvsxdsp f1, v2
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: ld_not_disjoint64_float_int16_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: li r4, 29
|
|
; CHECK-P9-NEXT: rldic r4, r4, 35, 24
|
|
; CHECK-P9-NEXT: oris r4, r4, 54437
|
|
; CHECK-P9-NEXT: ori r4, r4, 4097
|
|
; CHECK-P9-NEXT: or r3, r3, r4
|
|
; CHECK-P9-NEXT: lxsihzx v2, 0, r3
|
|
; CHECK-P9-NEXT: vextsh2d v2, v2
|
|
; CHECK-P9-NEXT: xscvsxdsp f1, v2
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_not_disjoint64_float_int16_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: li r4, 29
|
|
; CHECK-P8-NEXT: rldic r4, r4, 35, 24
|
|
; CHECK-P8-NEXT: oris r4, r4, 54437
|
|
; CHECK-P8-NEXT: ori r4, r4, 4097
|
|
; CHECK-P8-NEXT: or r3, r3, r4
|
|
; CHECK-P8-NEXT: lha r3, 0(r3)
|
|
; CHECK-P8-NEXT: mtfprwa f0, r3
|
|
; CHECK-P8-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%or = or i64 %ptr, 1000000000001
|
|
%0 = inttoptr i64 %or to i16*
|
|
%1 = load i16, i16* %0, align 2
|
|
%conv = sitofp i16 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_disjoint_align64_float_int16_t(i64 %ptr) {
|
|
; CHECK-P10-LABEL: ld_disjoint_align64_float_int16_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: pli r4, 244140625
|
|
; CHECK-P10-NEXT: rldicr r3, r3, 0, 23
|
|
; CHECK-P10-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P10-NEXT: lxsihzx v2, r3, r4
|
|
; CHECK-P10-NEXT: vextsh2d v2, v2
|
|
; CHECK-P10-NEXT: xscvsxdsp f1, v2
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: ld_disjoint_align64_float_int16_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: lis r4, 3725
|
|
; CHECK-P9-NEXT: rldicr r3, r3, 0, 23
|
|
; CHECK-P9-NEXT: ori r4, r4, 19025
|
|
; CHECK-P9-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P9-NEXT: lxsihzx v2, r3, r4
|
|
; CHECK-P9-NEXT: vextsh2d v2, v2
|
|
; CHECK-P9-NEXT: xscvsxdsp f1, v2
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_disjoint_align64_float_int16_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: lis r4, 3725
|
|
; CHECK-P8-NEXT: rldicr r3, r3, 0, 23
|
|
; CHECK-P8-NEXT: ori r4, r4, 19025
|
|
; CHECK-P8-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P8-NEXT: lhax r3, r3, r4
|
|
; CHECK-P8-NEXT: mtfprwa f0, r3
|
|
; CHECK-P8-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%and = and i64 %ptr, -1099511627776
|
|
%or = or i64 %and, 1000000000000
|
|
%0 = inttoptr i64 %or to i16*
|
|
%1 = load i16, i16* %0, align 4096
|
|
%conv = sitofp i16 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_cst_align16_float_int16_t() {
|
|
; CHECK-POSTP8-LABEL: ld_cst_align16_float_int16_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: li r3, 4080
|
|
; CHECK-POSTP8-NEXT: lxsihzx v2, 0, r3
|
|
; CHECK-POSTP8-NEXT: vextsh2d v2, v2
|
|
; CHECK-POSTP8-NEXT: xscvsxdsp f1, v2
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_cst_align16_float_int16_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: lha r3, 4080(0)
|
|
; CHECK-P8-NEXT: mtfprwa f0, r3
|
|
; CHECK-P8-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%0 = load i16, i16* inttoptr (i64 4080 to i16*), align 16
|
|
%conv = sitofp i16 %0 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_cst_align32_float_int16_t() {
|
|
; CHECK-P10-LABEL: ld_cst_align32_float_int16_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: pli r3, 9999900
|
|
; CHECK-P10-NEXT: lxsihzx v2, 0, r3
|
|
; CHECK-P10-NEXT: vextsh2d v2, v2
|
|
; CHECK-P10-NEXT: xscvsxdsp f1, v2
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: ld_cst_align32_float_int16_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: lis r3, 152
|
|
; CHECK-P9-NEXT: ori r3, r3, 38428
|
|
; CHECK-P9-NEXT: lxsihzx v2, 0, r3
|
|
; CHECK-P9-NEXT: vextsh2d v2, v2
|
|
; CHECK-P9-NEXT: xscvsxdsp f1, v2
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_cst_align32_float_int16_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: lis r3, 153
|
|
; CHECK-P8-NEXT: lha r3, -27108(r3)
|
|
; CHECK-P8-NEXT: mtfprwa f0, r3
|
|
; CHECK-P8-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%0 = load i16, i16* inttoptr (i64 9999900 to i16*), align 4
|
|
%conv = sitofp i16 %0 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_cst_align64_float_int16_t() {
|
|
; CHECK-P10-LABEL: ld_cst_align64_float_int16_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: pli r3, 244140625
|
|
; CHECK-P10-NEXT: rldic r3, r3, 12, 24
|
|
; CHECK-P10-NEXT: lxsihzx v2, 0, r3
|
|
; CHECK-P10-NEXT: vextsh2d v2, v2
|
|
; CHECK-P10-NEXT: xscvsxdsp f1, v2
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: ld_cst_align64_float_int16_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: lis r3, 3725
|
|
; CHECK-P9-NEXT: ori r3, r3, 19025
|
|
; CHECK-P9-NEXT: rldic r3, r3, 12, 24
|
|
; CHECK-P9-NEXT: lxsihzx v2, 0, r3
|
|
; CHECK-P9-NEXT: vextsh2d v2, v2
|
|
; CHECK-P9-NEXT: xscvsxdsp f1, v2
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_cst_align64_float_int16_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: lis r3, 3725
|
|
; CHECK-P8-NEXT: ori r3, r3, 19025
|
|
; CHECK-P8-NEXT: rldic r3, r3, 12, 24
|
|
; CHECK-P8-NEXT: lha r3, 0(r3)
|
|
; CHECK-P8-NEXT: mtfprwa f0, r3
|
|
; CHECK-P8-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%0 = load i16, i16* inttoptr (i64 1000000000000 to i16*), align 4096
|
|
%conv = sitofp i16 %0 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_0_float_uint32_t(i64 %ptr) {
|
|
; CHECK-LABEL: ld_0_float_uint32_t:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: lfiwzx f0, 0, r3
|
|
; CHECK-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%0 = inttoptr i64 %ptr to i32*
|
|
%1 = load i32, i32* %0, align 4
|
|
%conv = uitofp i32 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_align16_float_uint32_t(i8* nocapture readonly %ptr) {
|
|
; CHECK-LABEL: ld_align16_float_uint32_t:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: addi r3, r3, 8
|
|
; CHECK-NEXT: lfiwzx f0, 0, r3
|
|
; CHECK-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 8
|
|
%0 = bitcast i8* %add.ptr to i32*
|
|
%1 = load i32, i32* %0, align 4
|
|
%conv = uitofp i32 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_align32_float_uint32_t(i8* nocapture readonly %ptr) {
|
|
; CHECK-P10-LABEL: ld_align32_float_uint32_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: pli r4, 99999000
|
|
; CHECK-P10-NEXT: lfiwzx f0, r3, r4
|
|
; CHECK-P10-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-PREP10-LABEL: ld_align32_float_uint32_t:
|
|
; CHECK-PREP10: # %bb.0: # %entry
|
|
; CHECK-PREP10-NEXT: lis r4, 1525
|
|
; CHECK-PREP10-NEXT: ori r4, r4, 56600
|
|
; CHECK-PREP10-NEXT: lfiwzx f0, r3, r4
|
|
; CHECK-PREP10-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-PREP10-NEXT: blr
|
|
entry:
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 99999000
|
|
%0 = bitcast i8* %add.ptr to i32*
|
|
%1 = load i32, i32* %0, align 4
|
|
%conv = uitofp i32 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_align64_float_uint32_t(i8* nocapture readonly %ptr) {
|
|
; CHECK-P10-LABEL: ld_align64_float_uint32_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: pli r4, 244140625
|
|
; CHECK-P10-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P10-NEXT: lfiwzx f0, r3, r4
|
|
; CHECK-P10-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-PREP10-LABEL: ld_align64_float_uint32_t:
|
|
; CHECK-PREP10: # %bb.0: # %entry
|
|
; CHECK-PREP10-NEXT: lis r4, 3725
|
|
; CHECK-PREP10-NEXT: ori r4, r4, 19025
|
|
; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-PREP10-NEXT: lfiwzx f0, r3, r4
|
|
; CHECK-PREP10-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-PREP10-NEXT: blr
|
|
entry:
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1000000000000
|
|
%0 = bitcast i8* %add.ptr to i32*
|
|
%1 = load i32, i32* %0, align 4
|
|
%conv = uitofp i32 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_reg_float_uint32_t(i8* nocapture readonly %ptr, i64 %off) {
|
|
; CHECK-LABEL: ld_reg_float_uint32_t:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: lfiwzx f0, r3, r4
|
|
; CHECK-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 %off
|
|
%0 = bitcast i8* %add.ptr to i32*
|
|
%1 = load i32, i32* %0, align 4
|
|
%conv = uitofp i32 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_or_float_uint32_t(i64 %ptr, i8 zeroext %off) {
|
|
; CHECK-LABEL: ld_or_float_uint32_t:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: or r3, r4, r3
|
|
; CHECK-NEXT: lfiwzx f0, 0, r3
|
|
; CHECK-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%conv = zext i8 %off to i64
|
|
%or = or i64 %conv, %ptr
|
|
%0 = inttoptr i64 %or to i32*
|
|
%1 = load i32, i32* %0, align 4
|
|
%conv1 = uitofp i32 %1 to float
|
|
ret float %conv1
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_not_disjoint16_float_uint32_t(i64 %ptr) {
|
|
; CHECK-LABEL: ld_not_disjoint16_float_uint32_t:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: ori r3, r3, 6
|
|
; CHECK-NEXT: lfiwzx f0, 0, r3
|
|
; CHECK-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%or = or i64 %ptr, 6
|
|
%0 = inttoptr i64 %or to i32*
|
|
%1 = load i32, i32* %0, align 4
|
|
%conv = uitofp i32 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_disjoint_align16_float_uint32_t(i64 %ptr) {
|
|
; CHECK-LABEL: ld_disjoint_align16_float_uint32_t:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: rldicr r3, r3, 0, 51
|
|
; CHECK-NEXT: ori r3, r3, 24
|
|
; CHECK-NEXT: lfiwzx f0, 0, r3
|
|
; CHECK-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%and = and i64 %ptr, -4096
|
|
%or = or i64 %and, 24
|
|
%0 = inttoptr i64 %or to i32*
|
|
%1 = load i32, i32* %0, align 8
|
|
%conv = uitofp i32 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_not_disjoint32_float_uint32_t(i64 %ptr) {
|
|
; CHECK-LABEL: ld_not_disjoint32_float_uint32_t:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: ori r3, r3, 34463
|
|
; CHECK-NEXT: oris r3, r3, 1
|
|
; CHECK-NEXT: lfiwzx f0, 0, r3
|
|
; CHECK-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%or = or i64 %ptr, 99999
|
|
%0 = inttoptr i64 %or to i32*
|
|
%1 = load i32, i32* %0, align 4
|
|
%conv = uitofp i32 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_disjoint_align32_float_uint32_t(i64 %ptr) {
|
|
; CHECK-P10-LABEL: ld_disjoint_align32_float_uint32_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: lis r4, -15264
|
|
; CHECK-P10-NEXT: and r3, r3, r4
|
|
; CHECK-P10-NEXT: pli r4, 999990000
|
|
; CHECK-P10-NEXT: lfiwzx f0, r3, r4
|
|
; CHECK-P10-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: ld_disjoint_align32_float_uint32_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: lis r4, -15264
|
|
; CHECK-P9-NEXT: and r3, r3, r4
|
|
; CHECK-P9-NEXT: lis r4, 15258
|
|
; CHECK-P9-NEXT: ori r4, r4, 41712
|
|
; CHECK-P9-NEXT: lfiwzx f0, r3, r4
|
|
; CHECK-P9-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_disjoint_align32_float_uint32_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: lis r4, -15264
|
|
; CHECK-P8-NEXT: lis r5, 15258
|
|
; CHECK-P8-NEXT: and r3, r3, r4
|
|
; CHECK-P8-NEXT: ori r4, r5, 41712
|
|
; CHECK-P8-NEXT: lfiwzx f0, r3, r4
|
|
; CHECK-P8-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%and = and i64 %ptr, -1000341504
|
|
%or = or i64 %and, 999990000
|
|
%0 = inttoptr i64 %or to i32*
|
|
%1 = load i32, i32* %0, align 16
|
|
%conv = uitofp i32 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_not_disjoint64_float_uint32_t(i64 %ptr) {
|
|
; CHECK-P10-LABEL: ld_not_disjoint64_float_uint32_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: pli r4, 232
|
|
; CHECK-P10-NEXT: pli r5, 3567587329
|
|
; CHECK-P10-NEXT: rldimi r5, r4, 32, 0
|
|
; CHECK-P10-NEXT: or r3, r3, r5
|
|
; CHECK-P10-NEXT: lfiwzx f0, 0, r3
|
|
; CHECK-P10-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-PREP10-LABEL: ld_not_disjoint64_float_uint32_t:
|
|
; CHECK-PREP10: # %bb.0: # %entry
|
|
; CHECK-PREP10-NEXT: li r4, 29
|
|
; CHECK-PREP10-NEXT: rldic r4, r4, 35, 24
|
|
; CHECK-PREP10-NEXT: oris r4, r4, 54437
|
|
; CHECK-PREP10-NEXT: ori r4, r4, 4097
|
|
; CHECK-PREP10-NEXT: or r3, r3, r4
|
|
; CHECK-PREP10-NEXT: lfiwzx f0, 0, r3
|
|
; CHECK-PREP10-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-PREP10-NEXT: blr
|
|
entry:
|
|
%or = or i64 %ptr, 1000000000001
|
|
%0 = inttoptr i64 %or to i32*
|
|
%1 = load i32, i32* %0, align 4
|
|
%conv = uitofp i32 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_disjoint_align64_float_uint32_t(i64 %ptr) {
|
|
; CHECK-P10-LABEL: ld_disjoint_align64_float_uint32_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: pli r4, 244140625
|
|
; CHECK-P10-NEXT: rldicr r3, r3, 0, 23
|
|
; CHECK-P10-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P10-NEXT: lfiwzx f0, r3, r4
|
|
; CHECK-P10-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-PREP10-LABEL: ld_disjoint_align64_float_uint32_t:
|
|
; CHECK-PREP10: # %bb.0: # %entry
|
|
; CHECK-PREP10-NEXT: lis r4, 3725
|
|
; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23
|
|
; CHECK-PREP10-NEXT: ori r4, r4, 19025
|
|
; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-PREP10-NEXT: lfiwzx f0, r3, r4
|
|
; CHECK-PREP10-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-PREP10-NEXT: blr
|
|
entry:
|
|
%and = and i64 %ptr, -1099511627776
|
|
%or = or i64 %and, 1000000000000
|
|
%0 = inttoptr i64 %or to i32*
|
|
%1 = load i32, i32* %0, align 4096
|
|
%conv = uitofp i32 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_cst_align16_float_uint32_t() {
|
|
; CHECK-LABEL: ld_cst_align16_float_uint32_t:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: li r3, 4080
|
|
; CHECK-NEXT: lfiwzx f0, 0, r3
|
|
; CHECK-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%0 = load i32, i32* inttoptr (i64 4080 to i32*), align 16
|
|
%conv = uitofp i32 %0 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_cst_align32_float_uint32_t() {
|
|
; CHECK-P10-LABEL: ld_cst_align32_float_uint32_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: pli r3, 9999900
|
|
; CHECK-P10-NEXT: lfiwzx f0, 0, r3
|
|
; CHECK-P10-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-PREP10-LABEL: ld_cst_align32_float_uint32_t:
|
|
; CHECK-PREP10: # %bb.0: # %entry
|
|
; CHECK-PREP10-NEXT: lis r3, 152
|
|
; CHECK-PREP10-NEXT: ori r3, r3, 38428
|
|
; CHECK-PREP10-NEXT: lfiwzx f0, 0, r3
|
|
; CHECK-PREP10-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-PREP10-NEXT: blr
|
|
entry:
|
|
%0 = load i32, i32* inttoptr (i64 9999900 to i32*), align 4
|
|
%conv = uitofp i32 %0 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_cst_align64_float_uint32_t() {
|
|
; CHECK-P10-LABEL: ld_cst_align64_float_uint32_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: pli r3, 244140625
|
|
; CHECK-P10-NEXT: rldic r3, r3, 12, 24
|
|
; CHECK-P10-NEXT: lfiwzx f0, 0, r3
|
|
; CHECK-P10-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-PREP10-LABEL: ld_cst_align64_float_uint32_t:
|
|
; CHECK-PREP10: # %bb.0: # %entry
|
|
; CHECK-PREP10-NEXT: lis r3, 3725
|
|
; CHECK-PREP10-NEXT: ori r3, r3, 19025
|
|
; CHECK-PREP10-NEXT: rldic r3, r3, 12, 24
|
|
; CHECK-PREP10-NEXT: lfiwzx f0, 0, r3
|
|
; CHECK-PREP10-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-PREP10-NEXT: blr
|
|
entry:
|
|
%0 = load i32, i32* inttoptr (i64 1000000000000 to i32*), align 4096
|
|
%conv = uitofp i32 %0 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_0_float_int32_t(i64 %ptr) {
|
|
; CHECK-LABEL: ld_0_float_int32_t:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: lfiwax f0, 0, r3
|
|
; CHECK-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%0 = inttoptr i64 %ptr to i32*
|
|
%1 = load i32, i32* %0, align 4
|
|
%conv = sitofp i32 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_align16_float_int32_t(i8* nocapture readonly %ptr) {
|
|
; CHECK-LABEL: ld_align16_float_int32_t:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: addi r3, r3, 8
|
|
; CHECK-NEXT: lfiwax f0, 0, r3
|
|
; CHECK-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 8
|
|
%0 = bitcast i8* %add.ptr to i32*
|
|
%1 = load i32, i32* %0, align 4
|
|
%conv = sitofp i32 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_align32_float_int32_t(i8* nocapture readonly %ptr) {
|
|
; CHECK-P10-LABEL: ld_align32_float_int32_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: pli r4, 99999000
|
|
; CHECK-P10-NEXT: lfiwax f0, r3, r4
|
|
; CHECK-P10-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-PREP10-LABEL: ld_align32_float_int32_t:
|
|
; CHECK-PREP10: # %bb.0: # %entry
|
|
; CHECK-PREP10-NEXT: lis r4, 1525
|
|
; CHECK-PREP10-NEXT: ori r4, r4, 56600
|
|
; CHECK-PREP10-NEXT: lfiwax f0, r3, r4
|
|
; CHECK-PREP10-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-PREP10-NEXT: blr
|
|
entry:
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 99999000
|
|
%0 = bitcast i8* %add.ptr to i32*
|
|
%1 = load i32, i32* %0, align 4
|
|
%conv = sitofp i32 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_align64_float_int32_t(i8* nocapture readonly %ptr) {
|
|
; CHECK-P10-LABEL: ld_align64_float_int32_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: pli r4, 244140625
|
|
; CHECK-P10-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P10-NEXT: lfiwax f0, r3, r4
|
|
; CHECK-P10-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-PREP10-LABEL: ld_align64_float_int32_t:
|
|
; CHECK-PREP10: # %bb.0: # %entry
|
|
; CHECK-PREP10-NEXT: lis r4, 3725
|
|
; CHECK-PREP10-NEXT: ori r4, r4, 19025
|
|
; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-PREP10-NEXT: lfiwax f0, r3, r4
|
|
; CHECK-PREP10-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-PREP10-NEXT: blr
|
|
entry:
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1000000000000
|
|
%0 = bitcast i8* %add.ptr to i32*
|
|
%1 = load i32, i32* %0, align 4
|
|
%conv = sitofp i32 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_reg_float_int32_t(i8* nocapture readonly %ptr, i64 %off) {
|
|
; CHECK-LABEL: ld_reg_float_int32_t:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: lfiwax f0, r3, r4
|
|
; CHECK-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 %off
|
|
%0 = bitcast i8* %add.ptr to i32*
|
|
%1 = load i32, i32* %0, align 4
|
|
%conv = sitofp i32 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_or_float_int32_t(i64 %ptr, i8 zeroext %off) {
|
|
; CHECK-LABEL: ld_or_float_int32_t:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: or r3, r4, r3
|
|
; CHECK-NEXT: lfiwax f0, 0, r3
|
|
; CHECK-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%conv = zext i8 %off to i64
|
|
%or = or i64 %conv, %ptr
|
|
%0 = inttoptr i64 %or to i32*
|
|
%1 = load i32, i32* %0, align 4
|
|
%conv1 = sitofp i32 %1 to float
|
|
ret float %conv1
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_not_disjoint16_float_int32_t(i64 %ptr) {
|
|
; CHECK-LABEL: ld_not_disjoint16_float_int32_t:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: ori r3, r3, 6
|
|
; CHECK-NEXT: lfiwax f0, 0, r3
|
|
; CHECK-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%or = or i64 %ptr, 6
|
|
%0 = inttoptr i64 %or to i32*
|
|
%1 = load i32, i32* %0, align 4
|
|
%conv = sitofp i32 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_disjoint_align16_float_int32_t(i64 %ptr) {
|
|
; CHECK-LABEL: ld_disjoint_align16_float_int32_t:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: rldicr r3, r3, 0, 51
|
|
; CHECK-NEXT: ori r3, r3, 24
|
|
; CHECK-NEXT: lfiwax f0, 0, r3
|
|
; CHECK-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%and = and i64 %ptr, -4096
|
|
%or = or i64 %and, 24
|
|
%0 = inttoptr i64 %or to i32*
|
|
%1 = load i32, i32* %0, align 8
|
|
%conv = sitofp i32 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_not_disjoint32_float_int32_t(i64 %ptr) {
|
|
; CHECK-LABEL: ld_not_disjoint32_float_int32_t:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: ori r3, r3, 34463
|
|
; CHECK-NEXT: oris r3, r3, 1
|
|
; CHECK-NEXT: lfiwax f0, 0, r3
|
|
; CHECK-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%or = or i64 %ptr, 99999
|
|
%0 = inttoptr i64 %or to i32*
|
|
%1 = load i32, i32* %0, align 4
|
|
%conv = sitofp i32 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_disjoint_align32_float_int32_t(i64 %ptr) {
|
|
; CHECK-P10-LABEL: ld_disjoint_align32_float_int32_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: lis r4, -15264
|
|
; CHECK-P10-NEXT: and r3, r3, r4
|
|
; CHECK-P10-NEXT: pli r4, 999990000
|
|
; CHECK-P10-NEXT: lfiwax f0, r3, r4
|
|
; CHECK-P10-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: ld_disjoint_align32_float_int32_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: lis r4, -15264
|
|
; CHECK-P9-NEXT: and r3, r3, r4
|
|
; CHECK-P9-NEXT: lis r4, 15258
|
|
; CHECK-P9-NEXT: ori r4, r4, 41712
|
|
; CHECK-P9-NEXT: lfiwax f0, r3, r4
|
|
; CHECK-P9-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_disjoint_align32_float_int32_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: lis r4, -15264
|
|
; CHECK-P8-NEXT: lis r5, 15258
|
|
; CHECK-P8-NEXT: and r3, r3, r4
|
|
; CHECK-P8-NEXT: ori r4, r5, 41712
|
|
; CHECK-P8-NEXT: lfiwax f0, r3, r4
|
|
; CHECK-P8-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%and = and i64 %ptr, -1000341504
|
|
%or = or i64 %and, 999990000
|
|
%0 = inttoptr i64 %or to i32*
|
|
%1 = load i32, i32* %0, align 16
|
|
%conv = sitofp i32 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_not_disjoint64_float_int32_t(i64 %ptr) {
|
|
; CHECK-P10-LABEL: ld_not_disjoint64_float_int32_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: pli r4, 232
|
|
; CHECK-P10-NEXT: pli r5, 3567587329
|
|
; CHECK-P10-NEXT: rldimi r5, r4, 32, 0
|
|
; CHECK-P10-NEXT: or r3, r3, r5
|
|
; CHECK-P10-NEXT: lfiwax f0, 0, r3
|
|
; CHECK-P10-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-PREP10-LABEL: ld_not_disjoint64_float_int32_t:
|
|
; CHECK-PREP10: # %bb.0: # %entry
|
|
; CHECK-PREP10-NEXT: li r4, 29
|
|
; CHECK-PREP10-NEXT: rldic r4, r4, 35, 24
|
|
; CHECK-PREP10-NEXT: oris r4, r4, 54437
|
|
; CHECK-PREP10-NEXT: ori r4, r4, 4097
|
|
; CHECK-PREP10-NEXT: or r3, r3, r4
|
|
; CHECK-PREP10-NEXT: lfiwax f0, 0, r3
|
|
; CHECK-PREP10-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-PREP10-NEXT: blr
|
|
entry:
|
|
%or = or i64 %ptr, 1000000000001
|
|
%0 = inttoptr i64 %or to i32*
|
|
%1 = load i32, i32* %0, align 4
|
|
%conv = sitofp i32 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_disjoint_align64_float_int32_t(i64 %ptr) {
|
|
; CHECK-P10-LABEL: ld_disjoint_align64_float_int32_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: pli r4, 244140625
|
|
; CHECK-P10-NEXT: rldicr r3, r3, 0, 23
|
|
; CHECK-P10-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P10-NEXT: lfiwax f0, r3, r4
|
|
; CHECK-P10-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-PREP10-LABEL: ld_disjoint_align64_float_int32_t:
|
|
; CHECK-PREP10: # %bb.0: # %entry
|
|
; CHECK-PREP10-NEXT: lis r4, 3725
|
|
; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23
|
|
; CHECK-PREP10-NEXT: ori r4, r4, 19025
|
|
; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-PREP10-NEXT: lfiwax f0, r3, r4
|
|
; CHECK-PREP10-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-PREP10-NEXT: blr
|
|
entry:
|
|
%and = and i64 %ptr, -1099511627776
|
|
%or = or i64 %and, 1000000000000
|
|
%0 = inttoptr i64 %or to i32*
|
|
%1 = load i32, i32* %0, align 4096
|
|
%conv = sitofp i32 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_cst_align16_float_int32_t() {
|
|
; CHECK-LABEL: ld_cst_align16_float_int32_t:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: li r3, 4080
|
|
; CHECK-NEXT: lfiwax f0, 0, r3
|
|
; CHECK-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%0 = load i32, i32* inttoptr (i64 4080 to i32*), align 16
|
|
%conv = sitofp i32 %0 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_cst_align32_float_int32_t() {
|
|
; CHECK-P10-LABEL: ld_cst_align32_float_int32_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: pli r3, 9999900
|
|
; CHECK-P10-NEXT: lfiwax f0, 0, r3
|
|
; CHECK-P10-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-PREP10-LABEL: ld_cst_align32_float_int32_t:
|
|
; CHECK-PREP10: # %bb.0: # %entry
|
|
; CHECK-PREP10-NEXT: lis r3, 152
|
|
; CHECK-PREP10-NEXT: ori r3, r3, 38428
|
|
; CHECK-PREP10-NEXT: lfiwax f0, 0, r3
|
|
; CHECK-PREP10-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-PREP10-NEXT: blr
|
|
entry:
|
|
%0 = load i32, i32* inttoptr (i64 9999900 to i32*), align 4
|
|
%conv = sitofp i32 %0 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_cst_align64_float_int32_t() {
|
|
; CHECK-P10-LABEL: ld_cst_align64_float_int32_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: pli r3, 244140625
|
|
; CHECK-P10-NEXT: rldic r3, r3, 12, 24
|
|
; CHECK-P10-NEXT: lfiwax f0, 0, r3
|
|
; CHECK-P10-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-PREP10-LABEL: ld_cst_align64_float_int32_t:
|
|
; CHECK-PREP10: # %bb.0: # %entry
|
|
; CHECK-PREP10-NEXT: lis r3, 3725
|
|
; CHECK-PREP10-NEXT: ori r3, r3, 19025
|
|
; CHECK-PREP10-NEXT: rldic r3, r3, 12, 24
|
|
; CHECK-PREP10-NEXT: lfiwax f0, 0, r3
|
|
; CHECK-PREP10-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-PREP10-NEXT: blr
|
|
entry:
|
|
%0 = load i32, i32* inttoptr (i64 1000000000000 to i32*), align 4096
|
|
%conv = sitofp i32 %0 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_0_float_uint64_t(i64 %ptr) {
|
|
; CHECK-POSTP8-LABEL: ld_0_float_uint64_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: lfd f0, 0(r3)
|
|
; CHECK-POSTP8-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_0_float_uint64_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: lfdx f0, 0, r3
|
|
; CHECK-P8-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%0 = inttoptr i64 %ptr to i64*
|
|
%1 = load i64, i64* %0, align 8
|
|
%conv = uitofp i64 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_align16_float_uint64_t(i8* nocapture readonly %ptr) {
|
|
; CHECK-LABEL: ld_align16_float_uint64_t:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: lfd f0, 8(r3)
|
|
; CHECK-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 8
|
|
%0 = bitcast i8* %add.ptr to i64*
|
|
%1 = load i64, i64* %0, align 8
|
|
%conv = uitofp i64 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_align32_float_uint64_t(i8* nocapture readonly %ptr) {
|
|
; CHECK-P10-LABEL: ld_align32_float_uint64_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: pli r4, 99999000
|
|
; CHECK-P10-NEXT: lfdx f0, r3, r4
|
|
; CHECK-P10-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-PREP10-LABEL: ld_align32_float_uint64_t:
|
|
; CHECK-PREP10: # %bb.0: # %entry
|
|
; CHECK-PREP10-NEXT: lis r4, 1525
|
|
; CHECK-PREP10-NEXT: ori r4, r4, 56600
|
|
; CHECK-PREP10-NEXT: lfdx f0, r3, r4
|
|
; CHECK-PREP10-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-PREP10-NEXT: blr
|
|
entry:
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 99999000
|
|
%0 = bitcast i8* %add.ptr to i64*
|
|
%1 = load i64, i64* %0, align 8
|
|
%conv = uitofp i64 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_align64_float_uint64_t(i8* nocapture readonly %ptr) {
|
|
; CHECK-P10-LABEL: ld_align64_float_uint64_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: pli r4, 244140625
|
|
; CHECK-P10-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P10-NEXT: lfdx f0, r3, r4
|
|
; CHECK-P10-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-PREP10-LABEL: ld_align64_float_uint64_t:
|
|
; CHECK-PREP10: # %bb.0: # %entry
|
|
; CHECK-PREP10-NEXT: lis r4, 3725
|
|
; CHECK-PREP10-NEXT: ori r4, r4, 19025
|
|
; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-PREP10-NEXT: lfdx f0, r3, r4
|
|
; CHECK-PREP10-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-PREP10-NEXT: blr
|
|
entry:
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1000000000000
|
|
%0 = bitcast i8* %add.ptr to i64*
|
|
%1 = load i64, i64* %0, align 8
|
|
%conv = uitofp i64 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_reg_float_uint64_t(i8* nocapture readonly %ptr, i64 %off) {
|
|
; CHECK-LABEL: ld_reg_float_uint64_t:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: lfdx f0, r3, r4
|
|
; CHECK-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 %off
|
|
%0 = bitcast i8* %add.ptr to i64*
|
|
%1 = load i64, i64* %0, align 8
|
|
%conv = uitofp i64 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_or_float_uint64_t(i64 %ptr, i8 zeroext %off) {
|
|
; CHECK-POSTP8-LABEL: ld_or_float_uint64_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: or r3, r4, r3
|
|
; CHECK-POSTP8-NEXT: lfd f0, 0(r3)
|
|
; CHECK-POSTP8-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_or_float_uint64_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: or r3, r4, r3
|
|
; CHECK-P8-NEXT: lfdx f0, 0, r3
|
|
; CHECK-P8-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = zext i8 %off to i64
|
|
%or = or i64 %conv, %ptr
|
|
%0 = inttoptr i64 %or to i64*
|
|
%1 = load i64, i64* %0, align 8
|
|
%conv1 = uitofp i64 %1 to float
|
|
ret float %conv1
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_not_disjoint16_float_uint64_t(i64 %ptr) {
|
|
; CHECK-POSTP8-LABEL: ld_not_disjoint16_float_uint64_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: ori r3, r3, 6
|
|
; CHECK-POSTP8-NEXT: lfd f0, 0(r3)
|
|
; CHECK-POSTP8-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_not_disjoint16_float_uint64_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: ori r3, r3, 6
|
|
; CHECK-P8-NEXT: lfdx f0, 0, r3
|
|
; CHECK-P8-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%or = or i64 %ptr, 6
|
|
%0 = inttoptr i64 %or to i64*
|
|
%1 = load i64, i64* %0, align 8
|
|
%conv = uitofp i64 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_disjoint_align16_float_uint64_t(i64 %ptr) {
|
|
; CHECK-POSTP8-LABEL: ld_disjoint_align16_float_uint64_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: rldicr r3, r3, 0, 51
|
|
; CHECK-POSTP8-NEXT: lfd f0, 24(r3)
|
|
; CHECK-POSTP8-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_disjoint_align16_float_uint64_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: rldicr r3, r3, 0, 51
|
|
; CHECK-P8-NEXT: ori r3, r3, 24
|
|
; CHECK-P8-NEXT: lfdx f0, 0, r3
|
|
; CHECK-P8-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%and = and i64 %ptr, -4096
|
|
%or = or i64 %and, 24
|
|
%0 = inttoptr i64 %or to i64*
|
|
%1 = load i64, i64* %0, align 8
|
|
%conv = uitofp i64 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_not_disjoint32_float_uint64_t(i64 %ptr) {
|
|
; CHECK-POSTP8-LABEL: ld_not_disjoint32_float_uint64_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: ori r3, r3, 34463
|
|
; CHECK-POSTP8-NEXT: oris r3, r3, 1
|
|
; CHECK-POSTP8-NEXT: lfd f0, 0(r3)
|
|
; CHECK-POSTP8-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_not_disjoint32_float_uint64_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: ori r3, r3, 34463
|
|
; CHECK-P8-NEXT: oris r3, r3, 1
|
|
; CHECK-P8-NEXT: lfdx f0, 0, r3
|
|
; CHECK-P8-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%or = or i64 %ptr, 99999
|
|
%0 = inttoptr i64 %or to i64*
|
|
%1 = load i64, i64* %0, align 8
|
|
%conv = uitofp i64 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_disjoint_align32_float_uint64_t(i64 %ptr) {
|
|
; CHECK-P10-LABEL: ld_disjoint_align32_float_uint64_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: lis r4, -15264
|
|
; CHECK-P10-NEXT: and r3, r3, r4
|
|
; CHECK-P10-NEXT: pli r4, 999990000
|
|
; CHECK-P10-NEXT: lfdx f0, r3, r4
|
|
; CHECK-P10-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: ld_disjoint_align32_float_uint64_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: lis r4, -15264
|
|
; CHECK-P9-NEXT: and r3, r3, r4
|
|
; CHECK-P9-NEXT: lis r4, 15258
|
|
; CHECK-P9-NEXT: ori r4, r4, 41712
|
|
; CHECK-P9-NEXT: lfdx f0, r3, r4
|
|
; CHECK-P9-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_disjoint_align32_float_uint64_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: lis r4, -15264
|
|
; CHECK-P8-NEXT: lis r5, 15258
|
|
; CHECK-P8-NEXT: and r3, r3, r4
|
|
; CHECK-P8-NEXT: ori r4, r5, 41712
|
|
; CHECK-P8-NEXT: lfdx f0, r3, r4
|
|
; CHECK-P8-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%and = and i64 %ptr, -1000341504
|
|
%or = or i64 %and, 999990000
|
|
%0 = inttoptr i64 %or to i64*
|
|
%1 = load i64, i64* %0, align 16
|
|
%conv = uitofp i64 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_not_disjoint64_float_uint64_t(i64 %ptr) {
|
|
; CHECK-P10-LABEL: ld_not_disjoint64_float_uint64_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: pli r4, 232
|
|
; CHECK-P10-NEXT: pli r5, 3567587329
|
|
; CHECK-P10-NEXT: rldimi r5, r4, 32, 0
|
|
; CHECK-P10-NEXT: or r3, r3, r5
|
|
; CHECK-P10-NEXT: lfd f0, 0(r3)
|
|
; CHECK-P10-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: ld_not_disjoint64_float_uint64_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: li r4, 29
|
|
; CHECK-P9-NEXT: rldic r4, r4, 35, 24
|
|
; CHECK-P9-NEXT: oris r4, r4, 54437
|
|
; CHECK-P9-NEXT: ori r4, r4, 4097
|
|
; CHECK-P9-NEXT: or r3, r3, r4
|
|
; CHECK-P9-NEXT: lfd f0, 0(r3)
|
|
; CHECK-P9-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_not_disjoint64_float_uint64_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: li r4, 29
|
|
; CHECK-P8-NEXT: rldic r4, r4, 35, 24
|
|
; CHECK-P8-NEXT: oris r4, r4, 54437
|
|
; CHECK-P8-NEXT: ori r4, r4, 4097
|
|
; CHECK-P8-NEXT: or r3, r3, r4
|
|
; CHECK-P8-NEXT: lfdx f0, 0, r3
|
|
; CHECK-P8-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%or = or i64 %ptr, 1000000000001
|
|
%0 = inttoptr i64 %or to i64*
|
|
%1 = load i64, i64* %0, align 8
|
|
%conv = uitofp i64 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_disjoint_align64_float_uint64_t(i64 %ptr) {
|
|
; CHECK-P10-LABEL: ld_disjoint_align64_float_uint64_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: pli r4, 244140625
|
|
; CHECK-P10-NEXT: rldicr r3, r3, 0, 23
|
|
; CHECK-P10-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P10-NEXT: lfdx f0, r3, r4
|
|
; CHECK-P10-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-PREP10-LABEL: ld_disjoint_align64_float_uint64_t:
|
|
; CHECK-PREP10: # %bb.0: # %entry
|
|
; CHECK-PREP10-NEXT: lis r4, 3725
|
|
; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23
|
|
; CHECK-PREP10-NEXT: ori r4, r4, 19025
|
|
; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-PREP10-NEXT: lfdx f0, r3, r4
|
|
; CHECK-PREP10-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-PREP10-NEXT: blr
|
|
entry:
|
|
%and = and i64 %ptr, -1099511627776
|
|
%or = or i64 %and, 1000000000000
|
|
%0 = inttoptr i64 %or to i64*
|
|
%1 = load i64, i64* %0, align 4096
|
|
%conv = uitofp i64 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_cst_align16_float_uint64_t() {
|
|
; CHECK-LABEL: ld_cst_align16_float_uint64_t:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: lfd f0, 4080(0)
|
|
; CHECK-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%0 = load i64, i64* inttoptr (i64 4080 to i64*), align 16
|
|
%conv = uitofp i64 %0 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_cst_align32_float_uint64_t() {
|
|
; CHECK-POSTP8-LABEL: ld_cst_align32_float_uint64_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: lis r3, 153
|
|
; CHECK-POSTP8-NEXT: lfd f0, -27108(r3)
|
|
; CHECK-POSTP8-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_cst_align32_float_uint64_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: lis r3, 152
|
|
; CHECK-P8-NEXT: ori r3, r3, 38428
|
|
; CHECK-P8-NEXT: lfdx f0, 0, r3
|
|
; CHECK-P8-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%0 = load i64, i64* inttoptr (i64 9999900 to i64*), align 8
|
|
%conv = uitofp i64 %0 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_cst_align64_float_uint64_t() {
|
|
; CHECK-P10-LABEL: ld_cst_align64_float_uint64_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: pli r3, 244140625
|
|
; CHECK-P10-NEXT: rldic r3, r3, 12, 24
|
|
; CHECK-P10-NEXT: lfd f0, 0(r3)
|
|
; CHECK-P10-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: ld_cst_align64_float_uint64_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: lis r3, 3725
|
|
; CHECK-P9-NEXT: ori r3, r3, 19025
|
|
; CHECK-P9-NEXT: rldic r3, r3, 12, 24
|
|
; CHECK-P9-NEXT: lfd f0, 0(r3)
|
|
; CHECK-P9-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_cst_align64_float_uint64_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: lis r3, 3725
|
|
; CHECK-P8-NEXT: ori r3, r3, 19025
|
|
; CHECK-P8-NEXT: rldic r3, r3, 12, 24
|
|
; CHECK-P8-NEXT: lfdx f0, 0, r3
|
|
; CHECK-P8-NEXT: xscvuxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%0 = load i64, i64* inttoptr (i64 1000000000000 to i64*), align 4096
|
|
%conv = uitofp i64 %0 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_0_float_int64_t(i64 %ptr) {
|
|
; CHECK-POSTP8-LABEL: ld_0_float_int64_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: lfd f0, 0(r3)
|
|
; CHECK-POSTP8-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_0_float_int64_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: lfdx f0, 0, r3
|
|
; CHECK-P8-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%0 = inttoptr i64 %ptr to i64*
|
|
%1 = load i64, i64* %0, align 8
|
|
%conv = sitofp i64 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_align16_float_int64_t(i8* nocapture readonly %ptr) {
|
|
; CHECK-LABEL: ld_align16_float_int64_t:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: lfd f0, 8(r3)
|
|
; CHECK-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 8
|
|
%0 = bitcast i8* %add.ptr to i64*
|
|
%1 = load i64, i64* %0, align 8
|
|
%conv = sitofp i64 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_align32_float_int64_t(i8* nocapture readonly %ptr) {
|
|
; CHECK-P10-LABEL: ld_align32_float_int64_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: pli r4, 99999000
|
|
; CHECK-P10-NEXT: lfdx f0, r3, r4
|
|
; CHECK-P10-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-PREP10-LABEL: ld_align32_float_int64_t:
|
|
; CHECK-PREP10: # %bb.0: # %entry
|
|
; CHECK-PREP10-NEXT: lis r4, 1525
|
|
; CHECK-PREP10-NEXT: ori r4, r4, 56600
|
|
; CHECK-PREP10-NEXT: lfdx f0, r3, r4
|
|
; CHECK-PREP10-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-PREP10-NEXT: blr
|
|
entry:
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 99999000
|
|
%0 = bitcast i8* %add.ptr to i64*
|
|
%1 = load i64, i64* %0, align 8
|
|
%conv = sitofp i64 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_align64_float_int64_t(i8* nocapture readonly %ptr) {
|
|
; CHECK-P10-LABEL: ld_align64_float_int64_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: pli r4, 244140625
|
|
; CHECK-P10-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P10-NEXT: lfdx f0, r3, r4
|
|
; CHECK-P10-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-PREP10-LABEL: ld_align64_float_int64_t:
|
|
; CHECK-PREP10: # %bb.0: # %entry
|
|
; CHECK-PREP10-NEXT: lis r4, 3725
|
|
; CHECK-PREP10-NEXT: ori r4, r4, 19025
|
|
; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-PREP10-NEXT: lfdx f0, r3, r4
|
|
; CHECK-PREP10-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-PREP10-NEXT: blr
|
|
entry:
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1000000000000
|
|
%0 = bitcast i8* %add.ptr to i64*
|
|
%1 = load i64, i64* %0, align 8
|
|
%conv = sitofp i64 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_reg_float_int64_t(i8* nocapture readonly %ptr, i64 %off) {
|
|
; CHECK-LABEL: ld_reg_float_int64_t:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: lfdx f0, r3, r4
|
|
; CHECK-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 %off
|
|
%0 = bitcast i8* %add.ptr to i64*
|
|
%1 = load i64, i64* %0, align 8
|
|
%conv = sitofp i64 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_or_float_int64_t(i64 %ptr, i8 zeroext %off) {
|
|
; CHECK-POSTP8-LABEL: ld_or_float_int64_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: or r3, r4, r3
|
|
; CHECK-POSTP8-NEXT: lfd f0, 0(r3)
|
|
; CHECK-POSTP8-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_or_float_int64_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: or r3, r4, r3
|
|
; CHECK-P8-NEXT: lfdx f0, 0, r3
|
|
; CHECK-P8-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = zext i8 %off to i64
|
|
%or = or i64 %conv, %ptr
|
|
%0 = inttoptr i64 %or to i64*
|
|
%1 = load i64, i64* %0, align 8
|
|
%conv1 = sitofp i64 %1 to float
|
|
ret float %conv1
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_not_disjoint16_float_int64_t(i64 %ptr) {
|
|
; CHECK-POSTP8-LABEL: ld_not_disjoint16_float_int64_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: ori r3, r3, 6
|
|
; CHECK-POSTP8-NEXT: lfd f0, 0(r3)
|
|
; CHECK-POSTP8-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_not_disjoint16_float_int64_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: ori r3, r3, 6
|
|
; CHECK-P8-NEXT: lfdx f0, 0, r3
|
|
; CHECK-P8-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%or = or i64 %ptr, 6
|
|
%0 = inttoptr i64 %or to i64*
|
|
%1 = load i64, i64* %0, align 8
|
|
%conv = sitofp i64 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_disjoint_align16_float_int64_t(i64 %ptr) {
|
|
; CHECK-POSTP8-LABEL: ld_disjoint_align16_float_int64_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: rldicr r3, r3, 0, 51
|
|
; CHECK-POSTP8-NEXT: lfd f0, 24(r3)
|
|
; CHECK-POSTP8-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_disjoint_align16_float_int64_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: rldicr r3, r3, 0, 51
|
|
; CHECK-P8-NEXT: ori r3, r3, 24
|
|
; CHECK-P8-NEXT: lfdx f0, 0, r3
|
|
; CHECK-P8-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%and = and i64 %ptr, -4096
|
|
%or = or i64 %and, 24
|
|
%0 = inttoptr i64 %or to i64*
|
|
%1 = load i64, i64* %0, align 8
|
|
%conv = sitofp i64 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_not_disjoint32_float_int64_t(i64 %ptr) {
|
|
; CHECK-POSTP8-LABEL: ld_not_disjoint32_float_int64_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: ori r3, r3, 34463
|
|
; CHECK-POSTP8-NEXT: oris r3, r3, 1
|
|
; CHECK-POSTP8-NEXT: lfd f0, 0(r3)
|
|
; CHECK-POSTP8-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_not_disjoint32_float_int64_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: ori r3, r3, 34463
|
|
; CHECK-P8-NEXT: oris r3, r3, 1
|
|
; CHECK-P8-NEXT: lfdx f0, 0, r3
|
|
; CHECK-P8-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%or = or i64 %ptr, 99999
|
|
%0 = inttoptr i64 %or to i64*
|
|
%1 = load i64, i64* %0, align 8
|
|
%conv = sitofp i64 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_disjoint_align32_float_int64_t(i64 %ptr) {
|
|
; CHECK-P10-LABEL: ld_disjoint_align32_float_int64_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: lis r4, -15264
|
|
; CHECK-P10-NEXT: and r3, r3, r4
|
|
; CHECK-P10-NEXT: pli r4, 999990000
|
|
; CHECK-P10-NEXT: lfdx f0, r3, r4
|
|
; CHECK-P10-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: ld_disjoint_align32_float_int64_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: lis r4, -15264
|
|
; CHECK-P9-NEXT: and r3, r3, r4
|
|
; CHECK-P9-NEXT: lis r4, 15258
|
|
; CHECK-P9-NEXT: ori r4, r4, 41712
|
|
; CHECK-P9-NEXT: lfdx f0, r3, r4
|
|
; CHECK-P9-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_disjoint_align32_float_int64_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: lis r4, -15264
|
|
; CHECK-P8-NEXT: lis r5, 15258
|
|
; CHECK-P8-NEXT: and r3, r3, r4
|
|
; CHECK-P8-NEXT: ori r4, r5, 41712
|
|
; CHECK-P8-NEXT: lfdx f0, r3, r4
|
|
; CHECK-P8-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%and = and i64 %ptr, -1000341504
|
|
%or = or i64 %and, 999990000
|
|
%0 = inttoptr i64 %or to i64*
|
|
%1 = load i64, i64* %0, align 16
|
|
%conv = sitofp i64 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_not_disjoint64_float_int64_t(i64 %ptr) {
|
|
; CHECK-P10-LABEL: ld_not_disjoint64_float_int64_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: pli r4, 232
|
|
; CHECK-P10-NEXT: pli r5, 3567587329
|
|
; CHECK-P10-NEXT: rldimi r5, r4, 32, 0
|
|
; CHECK-P10-NEXT: or r3, r3, r5
|
|
; CHECK-P10-NEXT: lfd f0, 0(r3)
|
|
; CHECK-P10-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: ld_not_disjoint64_float_int64_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: li r4, 29
|
|
; CHECK-P9-NEXT: rldic r4, r4, 35, 24
|
|
; CHECK-P9-NEXT: oris r4, r4, 54437
|
|
; CHECK-P9-NEXT: ori r4, r4, 4097
|
|
; CHECK-P9-NEXT: or r3, r3, r4
|
|
; CHECK-P9-NEXT: lfd f0, 0(r3)
|
|
; CHECK-P9-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_not_disjoint64_float_int64_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: li r4, 29
|
|
; CHECK-P8-NEXT: rldic r4, r4, 35, 24
|
|
; CHECK-P8-NEXT: oris r4, r4, 54437
|
|
; CHECK-P8-NEXT: ori r4, r4, 4097
|
|
; CHECK-P8-NEXT: or r3, r3, r4
|
|
; CHECK-P8-NEXT: lfdx f0, 0, r3
|
|
; CHECK-P8-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%or = or i64 %ptr, 1000000000001
|
|
%0 = inttoptr i64 %or to i64*
|
|
%1 = load i64, i64* %0, align 8
|
|
%conv = sitofp i64 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_disjoint_align64_float_int64_t(i64 %ptr) {
|
|
; CHECK-P10-LABEL: ld_disjoint_align64_float_int64_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: pli r4, 244140625
|
|
; CHECK-P10-NEXT: rldicr r3, r3, 0, 23
|
|
; CHECK-P10-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P10-NEXT: lfdx f0, r3, r4
|
|
; CHECK-P10-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-PREP10-LABEL: ld_disjoint_align64_float_int64_t:
|
|
; CHECK-PREP10: # %bb.0: # %entry
|
|
; CHECK-PREP10-NEXT: lis r4, 3725
|
|
; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23
|
|
; CHECK-PREP10-NEXT: ori r4, r4, 19025
|
|
; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-PREP10-NEXT: lfdx f0, r3, r4
|
|
; CHECK-PREP10-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-PREP10-NEXT: blr
|
|
entry:
|
|
%and = and i64 %ptr, -1099511627776
|
|
%or = or i64 %and, 1000000000000
|
|
%0 = inttoptr i64 %or to i64*
|
|
%1 = load i64, i64* %0, align 4096
|
|
%conv = sitofp i64 %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_cst_align16_float_int64_t() {
|
|
; CHECK-LABEL: ld_cst_align16_float_int64_t:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: lfd f0, 4080(0)
|
|
; CHECK-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%0 = load i64, i64* inttoptr (i64 4080 to i64*), align 16
|
|
%conv = sitofp i64 %0 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_cst_align32_float_int64_t() {
|
|
; CHECK-POSTP8-LABEL: ld_cst_align32_float_int64_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: lis r3, 153
|
|
; CHECK-POSTP8-NEXT: lfd f0, -27108(r3)
|
|
; CHECK-POSTP8-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_cst_align32_float_int64_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: lis r3, 152
|
|
; CHECK-P8-NEXT: ori r3, r3, 38428
|
|
; CHECK-P8-NEXT: lfdx f0, 0, r3
|
|
; CHECK-P8-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%0 = load i64, i64* inttoptr (i64 9999900 to i64*), align 8
|
|
%conv = sitofp i64 %0 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_cst_align64_float_int64_t() {
|
|
; CHECK-P10-LABEL: ld_cst_align64_float_int64_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: pli r3, 244140625
|
|
; CHECK-P10-NEXT: rldic r3, r3, 12, 24
|
|
; CHECK-P10-NEXT: lfd f0, 0(r3)
|
|
; CHECK-P10-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: ld_cst_align64_float_int64_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: lis r3, 3725
|
|
; CHECK-P9-NEXT: ori r3, r3, 19025
|
|
; CHECK-P9-NEXT: rldic r3, r3, 12, 24
|
|
; CHECK-P9-NEXT: lfd f0, 0(r3)
|
|
; CHECK-P9-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_cst_align64_float_int64_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: lis r3, 3725
|
|
; CHECK-P8-NEXT: ori r3, r3, 19025
|
|
; CHECK-P8-NEXT: rldic r3, r3, 12, 24
|
|
; CHECK-P8-NEXT: lfdx f0, 0, r3
|
|
; CHECK-P8-NEXT: xscvsxdsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%0 = load i64, i64* inttoptr (i64 1000000000000 to i64*), align 4096
|
|
%conv = sitofp i64 %0 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_0_float_float(i64 %ptr) {
|
|
; CHECK-POSTP8-LABEL: ld_0_float_float:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: lfs f1, 0(r3)
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_0_float_float:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: lfsx f1, 0, r3
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%0 = inttoptr i64 %ptr to float*
|
|
%1 = load float, float* %0, align 4
|
|
ret float %1
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_align16_float_float(i8* nocapture readonly %ptr) {
|
|
; CHECK-LABEL: ld_align16_float_float:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: lfs f1, 8(r3)
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 8
|
|
%0 = bitcast i8* %add.ptr to float*
|
|
%1 = load float, float* %0, align 4
|
|
ret float %1
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_align32_float_float(i8* nocapture readonly %ptr) {
|
|
; CHECK-P10-LABEL: ld_align32_float_float:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: pli r4, 99999000
|
|
; CHECK-P10-NEXT: lfsx f1, r3, r4
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-PREP10-LABEL: ld_align32_float_float:
|
|
; CHECK-PREP10: # %bb.0: # %entry
|
|
; CHECK-PREP10-NEXT: lis r4, 1525
|
|
; CHECK-PREP10-NEXT: ori r4, r4, 56600
|
|
; CHECK-PREP10-NEXT: lfsx f1, r3, r4
|
|
; CHECK-PREP10-NEXT: blr
|
|
entry:
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 99999000
|
|
%0 = bitcast i8* %add.ptr to float*
|
|
%1 = load float, float* %0, align 4
|
|
ret float %1
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_align64_float_float(i8* nocapture readonly %ptr) {
|
|
; CHECK-P10-LABEL: ld_align64_float_float:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: pli r4, 244140625
|
|
; CHECK-P10-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P10-NEXT: lfsx f1, r3, r4
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-PREP10-LABEL: ld_align64_float_float:
|
|
; CHECK-PREP10: # %bb.0: # %entry
|
|
; CHECK-PREP10-NEXT: lis r4, 3725
|
|
; CHECK-PREP10-NEXT: ori r4, r4, 19025
|
|
; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-PREP10-NEXT: lfsx f1, r3, r4
|
|
; CHECK-PREP10-NEXT: blr
|
|
entry:
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1000000000000
|
|
%0 = bitcast i8* %add.ptr to float*
|
|
%1 = load float, float* %0, align 4
|
|
ret float %1
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_reg_float_float(i8* nocapture readonly %ptr, i64 %off) {
|
|
; CHECK-LABEL: ld_reg_float_float:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: lfsx f1, r3, r4
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 %off
|
|
%0 = bitcast i8* %add.ptr to float*
|
|
%1 = load float, float* %0, align 4
|
|
ret float %1
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_or_float_float(i64 %ptr, i8 zeroext %off) {
|
|
; CHECK-POSTP8-LABEL: ld_or_float_float:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: or r3, r4, r3
|
|
; CHECK-POSTP8-NEXT: lfs f1, 0(r3)
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_or_float_float:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: or r3, r4, r3
|
|
; CHECK-P8-NEXT: lfsx f1, 0, r3
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = zext i8 %off to i64
|
|
%or = or i64 %conv, %ptr
|
|
%0 = inttoptr i64 %or to float*
|
|
%1 = load float, float* %0, align 4
|
|
ret float %1
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_not_disjoint16_float_float(i64 %ptr) {
|
|
; CHECK-POSTP8-LABEL: ld_not_disjoint16_float_float:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: ori r3, r3, 6
|
|
; CHECK-POSTP8-NEXT: lfs f1, 0(r3)
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_not_disjoint16_float_float:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: ori r3, r3, 6
|
|
; CHECK-P8-NEXT: lfsx f1, 0, r3
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%or = or i64 %ptr, 6
|
|
%0 = inttoptr i64 %or to float*
|
|
%1 = load float, float* %0, align 4
|
|
ret float %1
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_disjoint_align16_float_float(i64 %ptr) {
|
|
; CHECK-POSTP8-LABEL: ld_disjoint_align16_float_float:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: rldicr r3, r3, 0, 51
|
|
; CHECK-POSTP8-NEXT: lfs f1, 24(r3)
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_disjoint_align16_float_float:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: rldicr r3, r3, 0, 51
|
|
; CHECK-P8-NEXT: ori r3, r3, 24
|
|
; CHECK-P8-NEXT: lfsx f1, 0, r3
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%and = and i64 %ptr, -4096
|
|
%or = or i64 %and, 24
|
|
%0 = inttoptr i64 %or to float*
|
|
%1 = load float, float* %0, align 8
|
|
ret float %1
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_not_disjoint32_float_float(i64 %ptr) {
|
|
; CHECK-POSTP8-LABEL: ld_not_disjoint32_float_float:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: ori r3, r3, 34463
|
|
; CHECK-POSTP8-NEXT: oris r3, r3, 1
|
|
; CHECK-POSTP8-NEXT: lfs f1, 0(r3)
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_not_disjoint32_float_float:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: ori r3, r3, 34463
|
|
; CHECK-P8-NEXT: oris r3, r3, 1
|
|
; CHECK-P8-NEXT: lfsx f1, 0, r3
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%or = or i64 %ptr, 99999
|
|
%0 = inttoptr i64 %or to float*
|
|
%1 = load float, float* %0, align 4
|
|
ret float %1
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_disjoint_align32_float_float(i64 %ptr) {
|
|
; CHECK-P10-LABEL: ld_disjoint_align32_float_float:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: lis r4, -15264
|
|
; CHECK-P10-NEXT: and r3, r3, r4
|
|
; CHECK-P10-NEXT: pli r4, 999990000
|
|
; CHECK-P10-NEXT: lfsx f1, r3, r4
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: ld_disjoint_align32_float_float:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: lis r4, -15264
|
|
; CHECK-P9-NEXT: and r3, r3, r4
|
|
; CHECK-P9-NEXT: lis r4, 15258
|
|
; CHECK-P9-NEXT: ori r4, r4, 41712
|
|
; CHECK-P9-NEXT: lfsx f1, r3, r4
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_disjoint_align32_float_float:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: lis r4, -15264
|
|
; CHECK-P8-NEXT: lis r5, 15258
|
|
; CHECK-P8-NEXT: and r3, r3, r4
|
|
; CHECK-P8-NEXT: ori r4, r5, 41712
|
|
; CHECK-P8-NEXT: lfsx f1, r3, r4
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%and = and i64 %ptr, -1000341504
|
|
%or = or i64 %and, 999990000
|
|
%0 = inttoptr i64 %or to float*
|
|
%1 = load float, float* %0, align 16
|
|
ret float %1
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_not_disjoint64_float_float(i64 %ptr) {
|
|
; CHECK-P10-LABEL: ld_not_disjoint64_float_float:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: pli r4, 232
|
|
; CHECK-P10-NEXT: pli r5, 3567587329
|
|
; CHECK-P10-NEXT: rldimi r5, r4, 32, 0
|
|
; CHECK-P10-NEXT: or r3, r3, r5
|
|
; CHECK-P10-NEXT: lfs f1, 0(r3)
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: ld_not_disjoint64_float_float:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: li r4, 29
|
|
; CHECK-P9-NEXT: rldic r4, r4, 35, 24
|
|
; CHECK-P9-NEXT: oris r4, r4, 54437
|
|
; CHECK-P9-NEXT: ori r4, r4, 4097
|
|
; CHECK-P9-NEXT: or r3, r3, r4
|
|
; CHECK-P9-NEXT: lfs f1, 0(r3)
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_not_disjoint64_float_float:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: li r4, 29
|
|
; CHECK-P8-NEXT: rldic r4, r4, 35, 24
|
|
; CHECK-P8-NEXT: oris r4, r4, 54437
|
|
; CHECK-P8-NEXT: ori r4, r4, 4097
|
|
; CHECK-P8-NEXT: or r3, r3, r4
|
|
; CHECK-P8-NEXT: lfsx f1, 0, r3
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%or = or i64 %ptr, 1000000000001
|
|
%0 = inttoptr i64 %or to float*
|
|
%1 = load float, float* %0, align 4
|
|
ret float %1
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_disjoint_align64_float_float(i64 %ptr) {
|
|
; CHECK-P10-LABEL: ld_disjoint_align64_float_float:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: pli r4, 244140625
|
|
; CHECK-P10-NEXT: rldicr r3, r3, 0, 23
|
|
; CHECK-P10-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P10-NEXT: lfsx f1, r3, r4
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-PREP10-LABEL: ld_disjoint_align64_float_float:
|
|
; CHECK-PREP10: # %bb.0: # %entry
|
|
; CHECK-PREP10-NEXT: lis r4, 3725
|
|
; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23
|
|
; CHECK-PREP10-NEXT: ori r4, r4, 19025
|
|
; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-PREP10-NEXT: lfsx f1, r3, r4
|
|
; CHECK-PREP10-NEXT: blr
|
|
entry:
|
|
%and = and i64 %ptr, -1099511627776
|
|
%or = or i64 %and, 1000000000000
|
|
%0 = inttoptr i64 %or to float*
|
|
%1 = load float, float* %0, align 4096
|
|
ret float %1
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_cst_align16_float_float() {
|
|
; CHECK-LABEL: ld_cst_align16_float_float:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: lfs f1, 4080(0)
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%0 = load float, float* inttoptr (i64 4080 to float*), align 16
|
|
ret float %0
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_cst_align32_float_float() {
|
|
; CHECK-POSTP8-LABEL: ld_cst_align32_float_float:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: lis r3, 153
|
|
; CHECK-POSTP8-NEXT: lfs f1, -27108(r3)
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_cst_align32_float_float:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: lis r3, 152
|
|
; CHECK-P8-NEXT: ori r3, r3, 38428
|
|
; CHECK-P8-NEXT: lfsx f1, 0, r3
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%0 = load float, float* inttoptr (i64 9999900 to float*), align 4
|
|
ret float %0
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_cst_align64_float_float() {
|
|
; CHECK-P10-LABEL: ld_cst_align64_float_float:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: pli r3, 244140625
|
|
; CHECK-P10-NEXT: rldic r3, r3, 12, 24
|
|
; CHECK-P10-NEXT: lfs f1, 0(r3)
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: ld_cst_align64_float_float:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: lis r3, 3725
|
|
; CHECK-P9-NEXT: ori r3, r3, 19025
|
|
; CHECK-P9-NEXT: rldic r3, r3, 12, 24
|
|
; CHECK-P9-NEXT: lfs f1, 0(r3)
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_cst_align64_float_float:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: lis r3, 3725
|
|
; CHECK-P8-NEXT: ori r3, r3, 19025
|
|
; CHECK-P8-NEXT: rldic r3, r3, 12, 24
|
|
; CHECK-P8-NEXT: lfsx f1, 0, r3
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%0 = load float, float* inttoptr (i64 1000000000000 to float*), align 4096
|
|
ret float %0
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_0_float_double(i64 %ptr) {
|
|
; CHECK-POSTP8-LABEL: ld_0_float_double:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: lfd f0, 0(r3)
|
|
; CHECK-POSTP8-NEXT: xsrsp f1, f0
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_0_float_double:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: lfdx f0, 0, r3
|
|
; CHECK-P8-NEXT: xsrsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%0 = inttoptr i64 %ptr to double*
|
|
%1 = load double, double* %0, align 8
|
|
%conv = fptrunc double %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_align16_float_double(i8* nocapture readonly %ptr) {
|
|
; CHECK-LABEL: ld_align16_float_double:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: lfd f0, 8(r3)
|
|
; CHECK-NEXT: xsrsp f1, f0
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 8
|
|
%0 = bitcast i8* %add.ptr to double*
|
|
%1 = load double, double* %0, align 8
|
|
%conv = fptrunc double %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_align32_float_double(i8* nocapture readonly %ptr) {
|
|
; CHECK-P10-LABEL: ld_align32_float_double:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: pli r4, 99999000
|
|
; CHECK-P10-NEXT: lfdx f0, r3, r4
|
|
; CHECK-P10-NEXT: xsrsp f1, f0
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-PREP10-LABEL: ld_align32_float_double:
|
|
; CHECK-PREP10: # %bb.0: # %entry
|
|
; CHECK-PREP10-NEXT: lis r4, 1525
|
|
; CHECK-PREP10-NEXT: ori r4, r4, 56600
|
|
; CHECK-PREP10-NEXT: lfdx f0, r3, r4
|
|
; CHECK-PREP10-NEXT: xsrsp f1, f0
|
|
; CHECK-PREP10-NEXT: blr
|
|
entry:
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 99999000
|
|
%0 = bitcast i8* %add.ptr to double*
|
|
%1 = load double, double* %0, align 8
|
|
%conv = fptrunc double %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_align64_float_double(i8* nocapture readonly %ptr) {
|
|
; CHECK-P10-LABEL: ld_align64_float_double:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: pli r4, 244140625
|
|
; CHECK-P10-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P10-NEXT: lfdx f0, r3, r4
|
|
; CHECK-P10-NEXT: xsrsp f1, f0
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-PREP10-LABEL: ld_align64_float_double:
|
|
; CHECK-PREP10: # %bb.0: # %entry
|
|
; CHECK-PREP10-NEXT: lis r4, 3725
|
|
; CHECK-PREP10-NEXT: ori r4, r4, 19025
|
|
; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-PREP10-NEXT: lfdx f0, r3, r4
|
|
; CHECK-PREP10-NEXT: xsrsp f1, f0
|
|
; CHECK-PREP10-NEXT: blr
|
|
entry:
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1000000000000
|
|
%0 = bitcast i8* %add.ptr to double*
|
|
%1 = load double, double* %0, align 8
|
|
%conv = fptrunc double %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_reg_float_double(i8* nocapture readonly %ptr, i64 %off) {
|
|
; CHECK-LABEL: ld_reg_float_double:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: lfdx f0, r3, r4
|
|
; CHECK-NEXT: xsrsp f1, f0
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 %off
|
|
%0 = bitcast i8* %add.ptr to double*
|
|
%1 = load double, double* %0, align 8
|
|
%conv = fptrunc double %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_or_float_double(i64 %ptr, i8 zeroext %off) {
|
|
; CHECK-POSTP8-LABEL: ld_or_float_double:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: or r3, r4, r3
|
|
; CHECK-POSTP8-NEXT: lfd f0, 0(r3)
|
|
; CHECK-POSTP8-NEXT: xsrsp f1, f0
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_or_float_double:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: or r3, r4, r3
|
|
; CHECK-P8-NEXT: lfdx f0, 0, r3
|
|
; CHECK-P8-NEXT: xsrsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = zext i8 %off to i64
|
|
%or = or i64 %conv, %ptr
|
|
%0 = inttoptr i64 %or to double*
|
|
%1 = load double, double* %0, align 8
|
|
%conv1 = fptrunc double %1 to float
|
|
ret float %conv1
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_not_disjoint16_float_double(i64 %ptr) {
|
|
; CHECK-POSTP8-LABEL: ld_not_disjoint16_float_double:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: ori r3, r3, 6
|
|
; CHECK-POSTP8-NEXT: lfd f0, 0(r3)
|
|
; CHECK-POSTP8-NEXT: xsrsp f1, f0
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_not_disjoint16_float_double:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: ori r3, r3, 6
|
|
; CHECK-P8-NEXT: lfdx f0, 0, r3
|
|
; CHECK-P8-NEXT: xsrsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%or = or i64 %ptr, 6
|
|
%0 = inttoptr i64 %or to double*
|
|
%1 = load double, double* %0, align 8
|
|
%conv = fptrunc double %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_disjoint_align16_float_double(i64 %ptr) {
|
|
; CHECK-POSTP8-LABEL: ld_disjoint_align16_float_double:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: rldicr r3, r3, 0, 51
|
|
; CHECK-POSTP8-NEXT: lfd f0, 24(r3)
|
|
; CHECK-POSTP8-NEXT: xsrsp f1, f0
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_disjoint_align16_float_double:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: rldicr r3, r3, 0, 51
|
|
; CHECK-P8-NEXT: ori r3, r3, 24
|
|
; CHECK-P8-NEXT: lfdx f0, 0, r3
|
|
; CHECK-P8-NEXT: xsrsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%and = and i64 %ptr, -4096
|
|
%or = or i64 %and, 24
|
|
%0 = inttoptr i64 %or to double*
|
|
%1 = load double, double* %0, align 8
|
|
%conv = fptrunc double %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_not_disjoint32_float_double(i64 %ptr) {
|
|
; CHECK-POSTP8-LABEL: ld_not_disjoint32_float_double:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: ori r3, r3, 34463
|
|
; CHECK-POSTP8-NEXT: oris r3, r3, 1
|
|
; CHECK-POSTP8-NEXT: lfd f0, 0(r3)
|
|
; CHECK-POSTP8-NEXT: xsrsp f1, f0
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_not_disjoint32_float_double:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: ori r3, r3, 34463
|
|
; CHECK-P8-NEXT: oris r3, r3, 1
|
|
; CHECK-P8-NEXT: lfdx f0, 0, r3
|
|
; CHECK-P8-NEXT: xsrsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%or = or i64 %ptr, 99999
|
|
%0 = inttoptr i64 %or to double*
|
|
%1 = load double, double* %0, align 8
|
|
%conv = fptrunc double %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_disjoint_align32_float_double(i64 %ptr) {
|
|
; CHECK-P10-LABEL: ld_disjoint_align32_float_double:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: lis r4, -15264
|
|
; CHECK-P10-NEXT: and r3, r3, r4
|
|
; CHECK-P10-NEXT: pli r4, 999990000
|
|
; CHECK-P10-NEXT: lfdx f0, r3, r4
|
|
; CHECK-P10-NEXT: xsrsp f1, f0
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: ld_disjoint_align32_float_double:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: lis r4, -15264
|
|
; CHECK-P9-NEXT: and r3, r3, r4
|
|
; CHECK-P9-NEXT: lis r4, 15258
|
|
; CHECK-P9-NEXT: ori r4, r4, 41712
|
|
; CHECK-P9-NEXT: lfdx f0, r3, r4
|
|
; CHECK-P9-NEXT: xsrsp f1, f0
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_disjoint_align32_float_double:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: lis r4, -15264
|
|
; CHECK-P8-NEXT: lis r5, 15258
|
|
; CHECK-P8-NEXT: and r3, r3, r4
|
|
; CHECK-P8-NEXT: ori r4, r5, 41712
|
|
; CHECK-P8-NEXT: lfdx f0, r3, r4
|
|
; CHECK-P8-NEXT: xsrsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%and = and i64 %ptr, -1000341504
|
|
%or = or i64 %and, 999990000
|
|
%0 = inttoptr i64 %or to double*
|
|
%1 = load double, double* %0, align 16
|
|
%conv = fptrunc double %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_not_disjoint64_float_double(i64 %ptr) {
|
|
; CHECK-P10-LABEL: ld_not_disjoint64_float_double:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: pli r4, 232
|
|
; CHECK-P10-NEXT: pli r5, 3567587329
|
|
; CHECK-P10-NEXT: rldimi r5, r4, 32, 0
|
|
; CHECK-P10-NEXT: or r3, r3, r5
|
|
; CHECK-P10-NEXT: lfd f0, 0(r3)
|
|
; CHECK-P10-NEXT: xsrsp f1, f0
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: ld_not_disjoint64_float_double:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: li r4, 29
|
|
; CHECK-P9-NEXT: rldic r4, r4, 35, 24
|
|
; CHECK-P9-NEXT: oris r4, r4, 54437
|
|
; CHECK-P9-NEXT: ori r4, r4, 4097
|
|
; CHECK-P9-NEXT: or r3, r3, r4
|
|
; CHECK-P9-NEXT: lfd f0, 0(r3)
|
|
; CHECK-P9-NEXT: xsrsp f1, f0
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_not_disjoint64_float_double:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: li r4, 29
|
|
; CHECK-P8-NEXT: rldic r4, r4, 35, 24
|
|
; CHECK-P8-NEXT: oris r4, r4, 54437
|
|
; CHECK-P8-NEXT: ori r4, r4, 4097
|
|
; CHECK-P8-NEXT: or r3, r3, r4
|
|
; CHECK-P8-NEXT: lfdx f0, 0, r3
|
|
; CHECK-P8-NEXT: xsrsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%or = or i64 %ptr, 1000000000001
|
|
%0 = inttoptr i64 %or to double*
|
|
%1 = load double, double* %0, align 8
|
|
%conv = fptrunc double %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_disjoint_align64_float_double(i64 %ptr) {
|
|
; CHECK-P10-LABEL: ld_disjoint_align64_float_double:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: pli r4, 244140625
|
|
; CHECK-P10-NEXT: rldicr r3, r3, 0, 23
|
|
; CHECK-P10-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P10-NEXT: lfdx f0, r3, r4
|
|
; CHECK-P10-NEXT: xsrsp f1, f0
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-PREP10-LABEL: ld_disjoint_align64_float_double:
|
|
; CHECK-PREP10: # %bb.0: # %entry
|
|
; CHECK-PREP10-NEXT: lis r4, 3725
|
|
; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23
|
|
; CHECK-PREP10-NEXT: ori r4, r4, 19025
|
|
; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-PREP10-NEXT: lfdx f0, r3, r4
|
|
; CHECK-PREP10-NEXT: xsrsp f1, f0
|
|
; CHECK-PREP10-NEXT: blr
|
|
entry:
|
|
%and = and i64 %ptr, -1099511627776
|
|
%or = or i64 %and, 1000000000000
|
|
%0 = inttoptr i64 %or to double*
|
|
%1 = load double, double* %0, align 4096
|
|
%conv = fptrunc double %1 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_cst_align16_float_double() {
|
|
; CHECK-LABEL: ld_cst_align16_float_double:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: lfd f0, 4080(0)
|
|
; CHECK-NEXT: xsrsp f1, f0
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%0 = load double, double* inttoptr (i64 4080 to double*), align 16
|
|
%conv = fptrunc double %0 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_cst_align32_float_double() {
|
|
; CHECK-POSTP8-LABEL: ld_cst_align32_float_double:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: lis r3, 153
|
|
; CHECK-POSTP8-NEXT: lfd f0, -27108(r3)
|
|
; CHECK-POSTP8-NEXT: xsrsp f1, f0
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_cst_align32_float_double:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: lis r3, 152
|
|
; CHECK-P8-NEXT: ori r3, r3, 38428
|
|
; CHECK-P8-NEXT: lfdx f0, 0, r3
|
|
; CHECK-P8-NEXT: xsrsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%0 = load double, double* inttoptr (i64 9999900 to double*), align 8
|
|
%conv = fptrunc double %0 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: norecurse nounwind readonly uwtable willreturn
|
|
define dso_local float @ld_cst_align64_float_double() {
|
|
; CHECK-P10-LABEL: ld_cst_align64_float_double:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: pli r3, 244140625
|
|
; CHECK-P10-NEXT: rldic r3, r3, 12, 24
|
|
; CHECK-P10-NEXT: lfd f0, 0(r3)
|
|
; CHECK-P10-NEXT: xsrsp f1, f0
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: ld_cst_align64_float_double:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: lis r3, 3725
|
|
; CHECK-P9-NEXT: ori r3, r3, 19025
|
|
; CHECK-P9-NEXT: rldic r3, r3, 12, 24
|
|
; CHECK-P9-NEXT: lfd f0, 0(r3)
|
|
; CHECK-P9-NEXT: xsrsp f1, f0
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: ld_cst_align64_float_double:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: lis r3, 3725
|
|
; CHECK-P8-NEXT: ori r3, r3, 19025
|
|
; CHECK-P8-NEXT: rldic r3, r3, 12, 24
|
|
; CHECK-P8-NEXT: lfdx f0, 0, r3
|
|
; CHECK-P8-NEXT: xsrsp f1, f0
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%0 = load double, double* inttoptr (i64 1000000000000 to double*), align 4096
|
|
%conv = fptrunc double %0 to float
|
|
ret float %conv
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_0_float_uint8_t(i64 %ptr, float %str) {
|
|
; CHECK-POSTP8-LABEL: st_0_float_uint8_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-POSTP8-NEXT: stxsibx f0, 0, r3
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_0_float_uint8_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P8-NEXT: mffprwz r4, f0
|
|
; CHECK-P8-NEXT: stb r4, 0(r3)
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptoui float %str to i8
|
|
%0 = inttoptr i64 %ptr to i8*
|
|
store i8 %conv, i8* %0, align 1
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_align16_float_uint8_t(i8* nocapture %ptr, float %str) {
|
|
; CHECK-POSTP8-LABEL: st_align16_float_uint8_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-POSTP8-NEXT: addi r3, r3, 8
|
|
; CHECK-POSTP8-NEXT: stxsibx f0, 0, r3
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_align16_float_uint8_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P8-NEXT: mffprwz r4, f0
|
|
; CHECK-P8-NEXT: stb r4, 8(r3)
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptoui float %str to i8
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 8
|
|
store i8 %conv, i8* %add.ptr, align 1
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_align32_float_uint8_t(i8* nocapture %ptr, float %str) {
|
|
; CHECK-P10-LABEL: st_align32_float_uint8_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-P10-NEXT: pli r4, 99999000
|
|
; CHECK-P10-NEXT: stxsibx f0, r3, r4
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: st_align32_float_uint8_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-P9-NEXT: lis r4, 1525
|
|
; CHECK-P9-NEXT: ori r4, r4, 56600
|
|
; CHECK-P9-NEXT: stxsibx f0, r3, r4
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_align32_float_uint8_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P8-NEXT: lis r4, 1525
|
|
; CHECK-P8-NEXT: ori r4, r4, 56600
|
|
; CHECK-P8-NEXT: mffprwz r5, f0
|
|
; CHECK-P8-NEXT: stbx r5, r3, r4
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptoui float %str to i8
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 99999000
|
|
store i8 %conv, i8* %add.ptr, align 1
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_align64_float_uint8_t(i8* nocapture %ptr, float %str) {
|
|
; CHECK-P10-LABEL: st_align64_float_uint8_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-P10-NEXT: pli r4, 244140625
|
|
; CHECK-P10-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P10-NEXT: stxsibx f0, r3, r4
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: st_align64_float_uint8_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-P9-NEXT: lis r4, 3725
|
|
; CHECK-P9-NEXT: ori r4, r4, 19025
|
|
; CHECK-P9-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P9-NEXT: stxsibx f0, r3, r4
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_align64_float_uint8_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P8-NEXT: lis r4, 3725
|
|
; CHECK-P8-NEXT: ori r4, r4, 19025
|
|
; CHECK-P8-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P8-NEXT: mffprwz r5, f0
|
|
; CHECK-P8-NEXT: stbx r5, r3, r4
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptoui float %str to i8
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1000000000000
|
|
store i8 %conv, i8* %add.ptr, align 1
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_reg_float_uint8_t(i8* nocapture %ptr, i64 %off, float %str) {
|
|
; CHECK-POSTP8-LABEL: st_reg_float_uint8_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-POSTP8-NEXT: stxsibx f0, r3, r4
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_reg_float_uint8_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P8-NEXT: mffprwz r5, f0
|
|
; CHECK-P8-NEXT: stbx r5, r3, r4
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptoui float %str to i8
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 %off
|
|
store i8 %conv, i8* %add.ptr, align 1
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_or1_float_uint8_t(i64 %ptr, i8 zeroext %off, float %str) {
|
|
; CHECK-POSTP8-LABEL: st_or1_float_uint8_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-POSTP8-NEXT: or r3, r4, r3
|
|
; CHECK-POSTP8-NEXT: stxsibx f0, 0, r3
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_or1_float_uint8_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P8-NEXT: or r3, r4, r3
|
|
; CHECK-P8-NEXT: mffprwz r5, f0
|
|
; CHECK-P8-NEXT: stb r5, 0(r3)
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptoui float %str to i8
|
|
%conv1 = zext i8 %off to i64
|
|
%or = or i64 %conv1, %ptr
|
|
%0 = inttoptr i64 %or to i8*
|
|
store i8 %conv, i8* %0, align 1
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_not_disjoint16_float_uint8_t(i64 %ptr, float %str) {
|
|
; CHECK-POSTP8-LABEL: st_not_disjoint16_float_uint8_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-POSTP8-NEXT: ori r3, r3, 6
|
|
; CHECK-POSTP8-NEXT: stxsibx f0, 0, r3
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_not_disjoint16_float_uint8_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P8-NEXT: ori r3, r3, 6
|
|
; CHECK-P8-NEXT: mffprwz r4, f0
|
|
; CHECK-P8-NEXT: stb r4, 0(r3)
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptoui float %str to i8
|
|
%or = or i64 %ptr, 6
|
|
%0 = inttoptr i64 %or to i8*
|
|
store i8 %conv, i8* %0, align 1
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_disjoint_align16_float_uint8_t(i64 %ptr, float %str) {
|
|
; CHECK-POSTP8-LABEL: st_disjoint_align16_float_uint8_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-POSTP8-NEXT: rldicr r3, r3, 0, 51
|
|
; CHECK-POSTP8-NEXT: ori r3, r3, 24
|
|
; CHECK-POSTP8-NEXT: stxsibx f0, 0, r3
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_disjoint_align16_float_uint8_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P8-NEXT: rldicr r3, r3, 0, 51
|
|
; CHECK-P8-NEXT: mffprwz r4, f0
|
|
; CHECK-P8-NEXT: stb r4, 24(r3)
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%and = and i64 %ptr, -4096
|
|
%conv = fptoui float %str to i8
|
|
%or = or i64 %and, 24
|
|
%0 = inttoptr i64 %or to i8*
|
|
store i8 %conv, i8* %0, align 8
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_not_disjoint32_float_uint8_t(i64 %ptr, float %str) {
|
|
; CHECK-POSTP8-LABEL: st_not_disjoint32_float_uint8_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-POSTP8-NEXT: ori r3, r3, 34463
|
|
; CHECK-POSTP8-NEXT: oris r3, r3, 1
|
|
; CHECK-POSTP8-NEXT: stxsibx f0, 0, r3
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_not_disjoint32_float_uint8_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P8-NEXT: ori r3, r3, 34463
|
|
; CHECK-P8-NEXT: oris r3, r3, 1
|
|
; CHECK-P8-NEXT: mffprwz r4, f0
|
|
; CHECK-P8-NEXT: stb r4, 0(r3)
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptoui float %str to i8
|
|
%or = or i64 %ptr, 99999
|
|
%0 = inttoptr i64 %or to i8*
|
|
store i8 %conv, i8* %0, align 1
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_disjoint_align32_float_uint8_t(i64 %ptr, float %str) {
|
|
; CHECK-P10-LABEL: st_disjoint_align32_float_uint8_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-P10-NEXT: lis r4, -15264
|
|
; CHECK-P10-NEXT: and r3, r3, r4
|
|
; CHECK-P10-NEXT: pli r4, 999990000
|
|
; CHECK-P10-NEXT: stxsibx f0, r3, r4
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: st_disjoint_align32_float_uint8_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-P9-NEXT: lis r4, -15264
|
|
; CHECK-P9-NEXT: and r3, r3, r4
|
|
; CHECK-P9-NEXT: lis r4, 15258
|
|
; CHECK-P9-NEXT: ori r4, r4, 41712
|
|
; CHECK-P9-NEXT: stxsibx f0, r3, r4
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_disjoint_align32_float_uint8_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P8-NEXT: lis r4, -15264
|
|
; CHECK-P8-NEXT: lis r6, 15258
|
|
; CHECK-P8-NEXT: and r3, r3, r4
|
|
; CHECK-P8-NEXT: ori r4, r6, 41712
|
|
; CHECK-P8-NEXT: mffprwz r5, f0
|
|
; CHECK-P8-NEXT: stbx r5, r3, r4
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%and = and i64 %ptr, -1000341504
|
|
%conv = fptoui float %str to i8
|
|
%or = or i64 %and, 999990000
|
|
%0 = inttoptr i64 %or to i8*
|
|
store i8 %conv, i8* %0, align 16
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_not_disjoint64_float_uint8_t(i64 %ptr, float %str) {
|
|
; CHECK-P10-LABEL: st_not_disjoint64_float_uint8_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-P10-NEXT: pli r4, 232
|
|
; CHECK-P10-NEXT: pli r5, 3567587329
|
|
; CHECK-P10-NEXT: rldimi r5, r4, 32, 0
|
|
; CHECK-P10-NEXT: or r3, r3, r5
|
|
; CHECK-P10-NEXT: stxsibx f0, 0, r3
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: st_not_disjoint64_float_uint8_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: li r4, 29
|
|
; CHECK-P9-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-P9-NEXT: rldic r4, r4, 35, 24
|
|
; CHECK-P9-NEXT: oris r4, r4, 54437
|
|
; CHECK-P9-NEXT: ori r4, r4, 4097
|
|
; CHECK-P9-NEXT: or r3, r3, r4
|
|
; CHECK-P9-NEXT: stxsibx f0, 0, r3
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_not_disjoint64_float_uint8_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P8-NEXT: li r4, 29
|
|
; CHECK-P8-NEXT: rldic r4, r4, 35, 24
|
|
; CHECK-P8-NEXT: oris r4, r4, 54437
|
|
; CHECK-P8-NEXT: ori r4, r4, 4097
|
|
; CHECK-P8-NEXT: or r3, r3, r4
|
|
; CHECK-P8-NEXT: mffprwz r5, f0
|
|
; CHECK-P8-NEXT: stb r5, 0(r3)
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptoui float %str to i8
|
|
%or = or i64 %ptr, 1000000000001
|
|
%0 = inttoptr i64 %or to i8*
|
|
store i8 %conv, i8* %0, align 1
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_disjoint_align64_float_uint8_t(i64 %ptr, float %str) {
|
|
; CHECK-P10-LABEL: st_disjoint_align64_float_uint8_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-P10-NEXT: pli r4, 244140625
|
|
; CHECK-P10-NEXT: rldicr r3, r3, 0, 23
|
|
; CHECK-P10-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P10-NEXT: stxsibx f0, r3, r4
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: st_disjoint_align64_float_uint8_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-P9-NEXT: lis r4, 3725
|
|
; CHECK-P9-NEXT: rldicr r3, r3, 0, 23
|
|
; CHECK-P9-NEXT: ori r4, r4, 19025
|
|
; CHECK-P9-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P9-NEXT: stxsibx f0, r3, r4
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_disjoint_align64_float_uint8_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P8-NEXT: lis r4, 3725
|
|
; CHECK-P8-NEXT: rldicr r3, r3, 0, 23
|
|
; CHECK-P8-NEXT: ori r4, r4, 19025
|
|
; CHECK-P8-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P8-NEXT: mffprwz r5, f0
|
|
; CHECK-P8-NEXT: stbx r5, r3, r4
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%and = and i64 %ptr, -1099511627776
|
|
%conv = fptoui float %str to i8
|
|
%or = or i64 %and, 1000000000000
|
|
%0 = inttoptr i64 %or to i8*
|
|
store i8 %conv, i8* %0, align 4096
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_cst_align16_float_uint8_t(float %str) {
|
|
; CHECK-POSTP8-LABEL: st_cst_align16_float_uint8_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-POSTP8-NEXT: li r3, 4080
|
|
; CHECK-POSTP8-NEXT: stxsibx f0, 0, r3
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_cst_align16_float_uint8_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P8-NEXT: mffprwz r3, f0
|
|
; CHECK-P8-NEXT: stb r3, 4080(0)
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptoui float %str to i8
|
|
store i8 %conv, i8* inttoptr (i64 4080 to i8*), align 16
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_cst_align32_float_uint8_t(float %str) {
|
|
; CHECK-P10-LABEL: st_cst_align32_float_uint8_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-P10-NEXT: pli r3, 9999900
|
|
; CHECK-P10-NEXT: stxsibx f0, 0, r3
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: st_cst_align32_float_uint8_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-P9-NEXT: lis r3, 152
|
|
; CHECK-P9-NEXT: ori r3, r3, 38428
|
|
; CHECK-P9-NEXT: stxsibx f0, 0, r3
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_cst_align32_float_uint8_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P8-NEXT: lis r4, 153
|
|
; CHECK-P8-NEXT: mffprwz r3, f0
|
|
; CHECK-P8-NEXT: stb r3, -27108(r4)
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptoui float %str to i8
|
|
store i8 %conv, i8* inttoptr (i64 9999900 to i8*), align 4
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_cst_align64_float_uint8_t(float %str) {
|
|
; CHECK-P10-LABEL: st_cst_align64_float_uint8_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-P10-NEXT: pli r3, 244140625
|
|
; CHECK-P10-NEXT: rldic r3, r3, 12, 24
|
|
; CHECK-P10-NEXT: stxsibx f0, 0, r3
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: st_cst_align64_float_uint8_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-P9-NEXT: lis r3, 3725
|
|
; CHECK-P9-NEXT: ori r3, r3, 19025
|
|
; CHECK-P9-NEXT: rldic r3, r3, 12, 24
|
|
; CHECK-P9-NEXT: stxsibx f0, 0, r3
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_cst_align64_float_uint8_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P8-NEXT: lis r3, 3725
|
|
; CHECK-P8-NEXT: ori r3, r3, 19025
|
|
; CHECK-P8-NEXT: rldic r3, r3, 12, 24
|
|
; CHECK-P8-NEXT: mffprwz r4, f0
|
|
; CHECK-P8-NEXT: stb r4, 0(r3)
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptoui float %str to i8
|
|
store i8 %conv, i8* inttoptr (i64 1000000000000 to i8*), align 4096
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_0_float_int8_t(i64 %ptr, float %str) {
|
|
; CHECK-POSTP8-LABEL: st_0_float_int8_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-POSTP8-NEXT: stxsibx f0, 0, r3
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_0_float_int8_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P8-NEXT: mffprwz r4, f0
|
|
; CHECK-P8-NEXT: stb r4, 0(r3)
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptosi float %str to i8
|
|
%0 = inttoptr i64 %ptr to i8*
|
|
store i8 %conv, i8* %0, align 1
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_align16_float_int8_t(i8* nocapture %ptr, float %str) {
|
|
; CHECK-POSTP8-LABEL: st_align16_float_int8_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-POSTP8-NEXT: addi r3, r3, 8
|
|
; CHECK-POSTP8-NEXT: stxsibx f0, 0, r3
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_align16_float_int8_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P8-NEXT: mffprwz r4, f0
|
|
; CHECK-P8-NEXT: stb r4, 8(r3)
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptosi float %str to i8
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 8
|
|
store i8 %conv, i8* %add.ptr, align 1
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_align32_float_int8_t(i8* nocapture %ptr, float %str) {
|
|
; CHECK-P10-LABEL: st_align32_float_int8_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P10-NEXT: pli r4, 99999000
|
|
; CHECK-P10-NEXT: stxsibx f0, r3, r4
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: st_align32_float_int8_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P9-NEXT: lis r4, 1525
|
|
; CHECK-P9-NEXT: ori r4, r4, 56600
|
|
; CHECK-P9-NEXT: stxsibx f0, r3, r4
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_align32_float_int8_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P8-NEXT: lis r4, 1525
|
|
; CHECK-P8-NEXT: ori r4, r4, 56600
|
|
; CHECK-P8-NEXT: mffprwz r5, f0
|
|
; CHECK-P8-NEXT: stbx r5, r3, r4
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptosi float %str to i8
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 99999000
|
|
store i8 %conv, i8* %add.ptr, align 1
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_align64_float_int8_t(i8* nocapture %ptr, float %str) {
|
|
; CHECK-P10-LABEL: st_align64_float_int8_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P10-NEXT: pli r4, 244140625
|
|
; CHECK-P10-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P10-NEXT: stxsibx f0, r3, r4
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: st_align64_float_int8_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P9-NEXT: lis r4, 3725
|
|
; CHECK-P9-NEXT: ori r4, r4, 19025
|
|
; CHECK-P9-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P9-NEXT: stxsibx f0, r3, r4
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_align64_float_int8_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P8-NEXT: lis r4, 3725
|
|
; CHECK-P8-NEXT: ori r4, r4, 19025
|
|
; CHECK-P8-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P8-NEXT: mffprwz r5, f0
|
|
; CHECK-P8-NEXT: stbx r5, r3, r4
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptosi float %str to i8
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1000000000000
|
|
store i8 %conv, i8* %add.ptr, align 1
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_reg_float_int8_t(i8* nocapture %ptr, i64 %off, float %str) {
|
|
; CHECK-POSTP8-LABEL: st_reg_float_int8_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-POSTP8-NEXT: stxsibx f0, r3, r4
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_reg_float_int8_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P8-NEXT: mffprwz r5, f0
|
|
; CHECK-P8-NEXT: stbx r5, r3, r4
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptosi float %str to i8
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 %off
|
|
store i8 %conv, i8* %add.ptr, align 1
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_or1_float_int8_t(i64 %ptr, i8 zeroext %off, float %str) {
|
|
; CHECK-POSTP8-LABEL: st_or1_float_int8_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-POSTP8-NEXT: or r3, r4, r3
|
|
; CHECK-POSTP8-NEXT: stxsibx f0, 0, r3
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_or1_float_int8_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P8-NEXT: or r3, r4, r3
|
|
; CHECK-P8-NEXT: mffprwz r5, f0
|
|
; CHECK-P8-NEXT: stb r5, 0(r3)
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptosi float %str to i8
|
|
%conv1 = zext i8 %off to i64
|
|
%or = or i64 %conv1, %ptr
|
|
%0 = inttoptr i64 %or to i8*
|
|
store i8 %conv, i8* %0, align 1
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_not_disjoint16_float_int8_t(i64 %ptr, float %str) {
|
|
; CHECK-POSTP8-LABEL: st_not_disjoint16_float_int8_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-POSTP8-NEXT: ori r3, r3, 6
|
|
; CHECK-POSTP8-NEXT: stxsibx f0, 0, r3
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_not_disjoint16_float_int8_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P8-NEXT: ori r3, r3, 6
|
|
; CHECK-P8-NEXT: mffprwz r4, f0
|
|
; CHECK-P8-NEXT: stb r4, 0(r3)
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptosi float %str to i8
|
|
%or = or i64 %ptr, 6
|
|
%0 = inttoptr i64 %or to i8*
|
|
store i8 %conv, i8* %0, align 1
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_disjoint_align16_float_int8_t(i64 %ptr, float %str) {
|
|
; CHECK-POSTP8-LABEL: st_disjoint_align16_float_int8_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-POSTP8-NEXT: rldicr r3, r3, 0, 51
|
|
; CHECK-POSTP8-NEXT: ori r3, r3, 24
|
|
; CHECK-POSTP8-NEXT: stxsibx f0, 0, r3
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_disjoint_align16_float_int8_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P8-NEXT: rldicr r3, r3, 0, 51
|
|
; CHECK-P8-NEXT: mffprwz r4, f0
|
|
; CHECK-P8-NEXT: stb r4, 24(r3)
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%and = and i64 %ptr, -4096
|
|
%conv = fptosi float %str to i8
|
|
%or = or i64 %and, 24
|
|
%0 = inttoptr i64 %or to i8*
|
|
store i8 %conv, i8* %0, align 8
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_not_disjoint32_float_int8_t(i64 %ptr, float %str) {
|
|
; CHECK-POSTP8-LABEL: st_not_disjoint32_float_int8_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-POSTP8-NEXT: ori r3, r3, 34463
|
|
; CHECK-POSTP8-NEXT: oris r3, r3, 1
|
|
; CHECK-POSTP8-NEXT: stxsibx f0, 0, r3
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_not_disjoint32_float_int8_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P8-NEXT: ori r3, r3, 34463
|
|
; CHECK-P8-NEXT: oris r3, r3, 1
|
|
; CHECK-P8-NEXT: mffprwz r4, f0
|
|
; CHECK-P8-NEXT: stb r4, 0(r3)
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptosi float %str to i8
|
|
%or = or i64 %ptr, 99999
|
|
%0 = inttoptr i64 %or to i8*
|
|
store i8 %conv, i8* %0, align 1
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_disjoint_align32_float_int8_t(i64 %ptr, float %str) {
|
|
; CHECK-P10-LABEL: st_disjoint_align32_float_int8_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P10-NEXT: lis r4, -15264
|
|
; CHECK-P10-NEXT: and r3, r3, r4
|
|
; CHECK-P10-NEXT: pli r4, 999990000
|
|
; CHECK-P10-NEXT: stxsibx f0, r3, r4
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: st_disjoint_align32_float_int8_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P9-NEXT: lis r4, -15264
|
|
; CHECK-P9-NEXT: and r3, r3, r4
|
|
; CHECK-P9-NEXT: lis r4, 15258
|
|
; CHECK-P9-NEXT: ori r4, r4, 41712
|
|
; CHECK-P9-NEXT: stxsibx f0, r3, r4
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_disjoint_align32_float_int8_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P8-NEXT: lis r4, -15264
|
|
; CHECK-P8-NEXT: lis r6, 15258
|
|
; CHECK-P8-NEXT: and r3, r3, r4
|
|
; CHECK-P8-NEXT: ori r4, r6, 41712
|
|
; CHECK-P8-NEXT: mffprwz r5, f0
|
|
; CHECK-P8-NEXT: stbx r5, r3, r4
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%and = and i64 %ptr, -1000341504
|
|
%conv = fptosi float %str to i8
|
|
%or = or i64 %and, 999990000
|
|
%0 = inttoptr i64 %or to i8*
|
|
store i8 %conv, i8* %0, align 16
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_not_disjoint64_float_int8_t(i64 %ptr, float %str) {
|
|
; CHECK-P10-LABEL: st_not_disjoint64_float_int8_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P10-NEXT: pli r4, 232
|
|
; CHECK-P10-NEXT: pli r5, 3567587329
|
|
; CHECK-P10-NEXT: rldimi r5, r4, 32, 0
|
|
; CHECK-P10-NEXT: or r3, r3, r5
|
|
; CHECK-P10-NEXT: stxsibx f0, 0, r3
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: st_not_disjoint64_float_int8_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: li r4, 29
|
|
; CHECK-P9-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P9-NEXT: rldic r4, r4, 35, 24
|
|
; CHECK-P9-NEXT: oris r4, r4, 54437
|
|
; CHECK-P9-NEXT: ori r4, r4, 4097
|
|
; CHECK-P9-NEXT: or r3, r3, r4
|
|
; CHECK-P9-NEXT: stxsibx f0, 0, r3
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_not_disjoint64_float_int8_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P8-NEXT: li r4, 29
|
|
; CHECK-P8-NEXT: rldic r4, r4, 35, 24
|
|
; CHECK-P8-NEXT: oris r4, r4, 54437
|
|
; CHECK-P8-NEXT: ori r4, r4, 4097
|
|
; CHECK-P8-NEXT: or r3, r3, r4
|
|
; CHECK-P8-NEXT: mffprwz r5, f0
|
|
; CHECK-P8-NEXT: stb r5, 0(r3)
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptosi float %str to i8
|
|
%or = or i64 %ptr, 1000000000001
|
|
%0 = inttoptr i64 %or to i8*
|
|
store i8 %conv, i8* %0, align 1
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_disjoint_align64_float_int8_t(i64 %ptr, float %str) {
|
|
; CHECK-P10-LABEL: st_disjoint_align64_float_int8_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P10-NEXT: pli r4, 244140625
|
|
; CHECK-P10-NEXT: rldicr r3, r3, 0, 23
|
|
; CHECK-P10-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P10-NEXT: stxsibx f0, r3, r4
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: st_disjoint_align64_float_int8_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P9-NEXT: lis r4, 3725
|
|
; CHECK-P9-NEXT: rldicr r3, r3, 0, 23
|
|
; CHECK-P9-NEXT: ori r4, r4, 19025
|
|
; CHECK-P9-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P9-NEXT: stxsibx f0, r3, r4
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_disjoint_align64_float_int8_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P8-NEXT: lis r4, 3725
|
|
; CHECK-P8-NEXT: rldicr r3, r3, 0, 23
|
|
; CHECK-P8-NEXT: ori r4, r4, 19025
|
|
; CHECK-P8-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P8-NEXT: mffprwz r5, f0
|
|
; CHECK-P8-NEXT: stbx r5, r3, r4
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%and = and i64 %ptr, -1099511627776
|
|
%conv = fptosi float %str to i8
|
|
%or = or i64 %and, 1000000000000
|
|
%0 = inttoptr i64 %or to i8*
|
|
store i8 %conv, i8* %0, align 4096
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_cst_align16_float_int8_t(float %str) {
|
|
; CHECK-POSTP8-LABEL: st_cst_align16_float_int8_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-POSTP8-NEXT: li r3, 4080
|
|
; CHECK-POSTP8-NEXT: stxsibx f0, 0, r3
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_cst_align16_float_int8_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P8-NEXT: mffprwz r3, f0
|
|
; CHECK-P8-NEXT: stb r3, 4080(0)
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptosi float %str to i8
|
|
store i8 %conv, i8* inttoptr (i64 4080 to i8*), align 16
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_cst_align32_float_int8_t(float %str) {
|
|
; CHECK-P10-LABEL: st_cst_align32_float_int8_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P10-NEXT: pli r3, 9999900
|
|
; CHECK-P10-NEXT: stxsibx f0, 0, r3
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: st_cst_align32_float_int8_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P9-NEXT: lis r3, 152
|
|
; CHECK-P9-NEXT: ori r3, r3, 38428
|
|
; CHECK-P9-NEXT: stxsibx f0, 0, r3
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_cst_align32_float_int8_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P8-NEXT: lis r4, 153
|
|
; CHECK-P8-NEXT: mffprwz r3, f0
|
|
; CHECK-P8-NEXT: stb r3, -27108(r4)
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptosi float %str to i8
|
|
store i8 %conv, i8* inttoptr (i64 9999900 to i8*), align 4
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_cst_align64_float_int8_t(float %str) {
|
|
; CHECK-P10-LABEL: st_cst_align64_float_int8_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P10-NEXT: pli r3, 244140625
|
|
; CHECK-P10-NEXT: rldic r3, r3, 12, 24
|
|
; CHECK-P10-NEXT: stxsibx f0, 0, r3
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: st_cst_align64_float_int8_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P9-NEXT: lis r3, 3725
|
|
; CHECK-P9-NEXT: ori r3, r3, 19025
|
|
; CHECK-P9-NEXT: rldic r3, r3, 12, 24
|
|
; CHECK-P9-NEXT: stxsibx f0, 0, r3
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_cst_align64_float_int8_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P8-NEXT: lis r3, 3725
|
|
; CHECK-P8-NEXT: ori r3, r3, 19025
|
|
; CHECK-P8-NEXT: rldic r3, r3, 12, 24
|
|
; CHECK-P8-NEXT: mffprwz r4, f0
|
|
; CHECK-P8-NEXT: stb r4, 0(r3)
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptosi float %str to i8
|
|
store i8 %conv, i8* inttoptr (i64 1000000000000 to i8*), align 4096
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_0_float_uint16_t(i64 %ptr, float %str) {
|
|
; CHECK-POSTP8-LABEL: st_0_float_uint16_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-POSTP8-NEXT: stxsihx f0, 0, r3
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_0_float_uint16_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P8-NEXT: mffprwz r4, f0
|
|
; CHECK-P8-NEXT: sth r4, 0(r3)
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptoui float %str to i16
|
|
%0 = inttoptr i64 %ptr to i16*
|
|
store i16 %conv, i16* %0, align 2
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_align16_float_uint16_t(i8* nocapture %ptr, float %str) {
|
|
; CHECK-POSTP8-LABEL: st_align16_float_uint16_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-POSTP8-NEXT: addi r3, r3, 8
|
|
; CHECK-POSTP8-NEXT: stxsihx f0, 0, r3
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_align16_float_uint16_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P8-NEXT: mffprwz r4, f0
|
|
; CHECK-P8-NEXT: sth r4, 8(r3)
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptoui float %str to i16
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 8
|
|
%0 = bitcast i8* %add.ptr to i16*
|
|
store i16 %conv, i16* %0, align 2
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_align32_float_uint16_t(i8* nocapture %ptr, float %str) {
|
|
; CHECK-P10-LABEL: st_align32_float_uint16_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-P10-NEXT: pli r4, 99999000
|
|
; CHECK-P10-NEXT: stxsihx f0, r3, r4
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: st_align32_float_uint16_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-P9-NEXT: lis r4, 1525
|
|
; CHECK-P9-NEXT: ori r4, r4, 56600
|
|
; CHECK-P9-NEXT: stxsihx f0, r3, r4
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_align32_float_uint16_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P8-NEXT: lis r4, 1525
|
|
; CHECK-P8-NEXT: ori r4, r4, 56600
|
|
; CHECK-P8-NEXT: mffprwz r5, f0
|
|
; CHECK-P8-NEXT: sthx r5, r3, r4
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptoui float %str to i16
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 99999000
|
|
%0 = bitcast i8* %add.ptr to i16*
|
|
store i16 %conv, i16* %0, align 2
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_align64_float_uint16_t(i8* nocapture %ptr, float %str) {
|
|
; CHECK-P10-LABEL: st_align64_float_uint16_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-P10-NEXT: pli r4, 244140625
|
|
; CHECK-P10-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P10-NEXT: stxsihx f0, r3, r4
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: st_align64_float_uint16_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-P9-NEXT: lis r4, 3725
|
|
; CHECK-P9-NEXT: ori r4, r4, 19025
|
|
; CHECK-P9-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P9-NEXT: stxsihx f0, r3, r4
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_align64_float_uint16_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P8-NEXT: lis r4, 3725
|
|
; CHECK-P8-NEXT: ori r4, r4, 19025
|
|
; CHECK-P8-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P8-NEXT: mffprwz r5, f0
|
|
; CHECK-P8-NEXT: sthx r5, r3, r4
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptoui float %str to i16
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1000000000000
|
|
%0 = bitcast i8* %add.ptr to i16*
|
|
store i16 %conv, i16* %0, align 2
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_reg_float_uint16_t(i8* nocapture %ptr, i64 %off, float %str) {
|
|
; CHECK-POSTP8-LABEL: st_reg_float_uint16_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-POSTP8-NEXT: stxsihx f0, r3, r4
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_reg_float_uint16_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P8-NEXT: mffprwz r5, f0
|
|
; CHECK-P8-NEXT: sthx r5, r3, r4
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptoui float %str to i16
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 %off
|
|
%0 = bitcast i8* %add.ptr to i16*
|
|
store i16 %conv, i16* %0, align 2
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_or1_float_uint16_t(i64 %ptr, i8 zeroext %off, float %str) {
|
|
; CHECK-POSTP8-LABEL: st_or1_float_uint16_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-POSTP8-NEXT: or r3, r4, r3
|
|
; CHECK-POSTP8-NEXT: stxsihx f0, 0, r3
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_or1_float_uint16_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P8-NEXT: or r3, r4, r3
|
|
; CHECK-P8-NEXT: mffprwz r5, f0
|
|
; CHECK-P8-NEXT: sth r5, 0(r3)
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptoui float %str to i16
|
|
%conv1 = zext i8 %off to i64
|
|
%or = or i64 %conv1, %ptr
|
|
%0 = inttoptr i64 %or to i16*
|
|
store i16 %conv, i16* %0, align 2
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_not_disjoint16_float_uint16_t(i64 %ptr, float %str) {
|
|
; CHECK-POSTP8-LABEL: st_not_disjoint16_float_uint16_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-POSTP8-NEXT: ori r3, r3, 6
|
|
; CHECK-POSTP8-NEXT: stxsihx f0, 0, r3
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_not_disjoint16_float_uint16_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P8-NEXT: ori r3, r3, 6
|
|
; CHECK-P8-NEXT: mffprwz r4, f0
|
|
; CHECK-P8-NEXT: sth r4, 0(r3)
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptoui float %str to i16
|
|
%or = or i64 %ptr, 6
|
|
%0 = inttoptr i64 %or to i16*
|
|
store i16 %conv, i16* %0, align 2
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_disjoint_align16_float_uint16_t(i64 %ptr, float %str) {
|
|
; CHECK-POSTP8-LABEL: st_disjoint_align16_float_uint16_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-POSTP8-NEXT: rldicr r3, r3, 0, 51
|
|
; CHECK-POSTP8-NEXT: ori r3, r3, 24
|
|
; CHECK-POSTP8-NEXT: stxsihx f0, 0, r3
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_disjoint_align16_float_uint16_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P8-NEXT: rldicr r3, r3, 0, 51
|
|
; CHECK-P8-NEXT: mffprwz r4, f0
|
|
; CHECK-P8-NEXT: sth r4, 24(r3)
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%and = and i64 %ptr, -4096
|
|
%conv = fptoui float %str to i16
|
|
%or = or i64 %and, 24
|
|
%0 = inttoptr i64 %or to i16*
|
|
store i16 %conv, i16* %0, align 8
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_not_disjoint32_float_uint16_t(i64 %ptr, float %str) {
|
|
; CHECK-POSTP8-LABEL: st_not_disjoint32_float_uint16_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-POSTP8-NEXT: ori r3, r3, 34463
|
|
; CHECK-POSTP8-NEXT: oris r3, r3, 1
|
|
; CHECK-POSTP8-NEXT: stxsihx f0, 0, r3
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_not_disjoint32_float_uint16_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P8-NEXT: ori r3, r3, 34463
|
|
; CHECK-P8-NEXT: oris r3, r3, 1
|
|
; CHECK-P8-NEXT: mffprwz r4, f0
|
|
; CHECK-P8-NEXT: sth r4, 0(r3)
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptoui float %str to i16
|
|
%or = or i64 %ptr, 99999
|
|
%0 = inttoptr i64 %or to i16*
|
|
store i16 %conv, i16* %0, align 2
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_disjoint_align32_float_uint16_t(i64 %ptr, float %str) {
|
|
; CHECK-P10-LABEL: st_disjoint_align32_float_uint16_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-P10-NEXT: lis r4, -15264
|
|
; CHECK-P10-NEXT: and r3, r3, r4
|
|
; CHECK-P10-NEXT: pli r4, 999990000
|
|
; CHECK-P10-NEXT: stxsihx f0, r3, r4
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: st_disjoint_align32_float_uint16_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-P9-NEXT: lis r4, -15264
|
|
; CHECK-P9-NEXT: and r3, r3, r4
|
|
; CHECK-P9-NEXT: lis r4, 15258
|
|
; CHECK-P9-NEXT: ori r4, r4, 41712
|
|
; CHECK-P9-NEXT: stxsihx f0, r3, r4
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_disjoint_align32_float_uint16_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P8-NEXT: lis r4, -15264
|
|
; CHECK-P8-NEXT: lis r6, 15258
|
|
; CHECK-P8-NEXT: and r3, r3, r4
|
|
; CHECK-P8-NEXT: ori r4, r6, 41712
|
|
; CHECK-P8-NEXT: mffprwz r5, f0
|
|
; CHECK-P8-NEXT: sthx r5, r3, r4
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%and = and i64 %ptr, -1000341504
|
|
%conv = fptoui float %str to i16
|
|
%or = or i64 %and, 999990000
|
|
%0 = inttoptr i64 %or to i16*
|
|
store i16 %conv, i16* %0, align 16
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_not_disjoint64_float_uint16_t(i64 %ptr, float %str) {
|
|
; CHECK-P10-LABEL: st_not_disjoint64_float_uint16_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-P10-NEXT: pli r4, 232
|
|
; CHECK-P10-NEXT: pli r5, 3567587329
|
|
; CHECK-P10-NEXT: rldimi r5, r4, 32, 0
|
|
; CHECK-P10-NEXT: or r3, r3, r5
|
|
; CHECK-P10-NEXT: stxsihx f0, 0, r3
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: st_not_disjoint64_float_uint16_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: li r4, 29
|
|
; CHECK-P9-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-P9-NEXT: rldic r4, r4, 35, 24
|
|
; CHECK-P9-NEXT: oris r4, r4, 54437
|
|
; CHECK-P9-NEXT: ori r4, r4, 4097
|
|
; CHECK-P9-NEXT: or r3, r3, r4
|
|
; CHECK-P9-NEXT: stxsihx f0, 0, r3
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_not_disjoint64_float_uint16_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P8-NEXT: li r4, 29
|
|
; CHECK-P8-NEXT: rldic r4, r4, 35, 24
|
|
; CHECK-P8-NEXT: oris r4, r4, 54437
|
|
; CHECK-P8-NEXT: ori r4, r4, 4097
|
|
; CHECK-P8-NEXT: or r3, r3, r4
|
|
; CHECK-P8-NEXT: mffprwz r5, f0
|
|
; CHECK-P8-NEXT: sth r5, 0(r3)
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptoui float %str to i16
|
|
%or = or i64 %ptr, 1000000000001
|
|
%0 = inttoptr i64 %or to i16*
|
|
store i16 %conv, i16* %0, align 2
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_disjoint_align64_float_uint16_t(i64 %ptr, float %str) {
|
|
; CHECK-P10-LABEL: st_disjoint_align64_float_uint16_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-P10-NEXT: pli r4, 244140625
|
|
; CHECK-P10-NEXT: rldicr r3, r3, 0, 23
|
|
; CHECK-P10-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P10-NEXT: stxsihx f0, r3, r4
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: st_disjoint_align64_float_uint16_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-P9-NEXT: lis r4, 3725
|
|
; CHECK-P9-NEXT: rldicr r3, r3, 0, 23
|
|
; CHECK-P9-NEXT: ori r4, r4, 19025
|
|
; CHECK-P9-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P9-NEXT: stxsihx f0, r3, r4
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_disjoint_align64_float_uint16_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P8-NEXT: lis r4, 3725
|
|
; CHECK-P8-NEXT: rldicr r3, r3, 0, 23
|
|
; CHECK-P8-NEXT: ori r4, r4, 19025
|
|
; CHECK-P8-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P8-NEXT: mffprwz r5, f0
|
|
; CHECK-P8-NEXT: sthx r5, r3, r4
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%and = and i64 %ptr, -1099511627776
|
|
%conv = fptoui float %str to i16
|
|
%or = or i64 %and, 1000000000000
|
|
%0 = inttoptr i64 %or to i16*
|
|
store i16 %conv, i16* %0, align 4096
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_cst_align16_float_uint16_t(float %str) {
|
|
; CHECK-POSTP8-LABEL: st_cst_align16_float_uint16_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-POSTP8-NEXT: li r3, 4080
|
|
; CHECK-POSTP8-NEXT: stxsihx f0, 0, r3
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_cst_align16_float_uint16_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P8-NEXT: mffprwz r3, f0
|
|
; CHECK-P8-NEXT: sth r3, 4080(0)
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptoui float %str to i16
|
|
store i16 %conv, i16* inttoptr (i64 4080 to i16*), align 16
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_cst_align32_float_uint16_t(float %str) {
|
|
; CHECK-P10-LABEL: st_cst_align32_float_uint16_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-P10-NEXT: pli r3, 9999900
|
|
; CHECK-P10-NEXT: stxsihx f0, 0, r3
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: st_cst_align32_float_uint16_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-P9-NEXT: lis r3, 152
|
|
; CHECK-P9-NEXT: ori r3, r3, 38428
|
|
; CHECK-P9-NEXT: stxsihx f0, 0, r3
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_cst_align32_float_uint16_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P8-NEXT: lis r4, 153
|
|
; CHECK-P8-NEXT: mffprwz r3, f0
|
|
; CHECK-P8-NEXT: sth r3, -27108(r4)
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptoui float %str to i16
|
|
store i16 %conv, i16* inttoptr (i64 9999900 to i16*), align 4
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_cst_align64_float_uint16_t(float %str) {
|
|
; CHECK-P10-LABEL: st_cst_align64_float_uint16_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-P10-NEXT: pli r3, 244140625
|
|
; CHECK-P10-NEXT: rldic r3, r3, 12, 24
|
|
; CHECK-P10-NEXT: stxsihx f0, 0, r3
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: st_cst_align64_float_uint16_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-P9-NEXT: lis r3, 3725
|
|
; CHECK-P9-NEXT: ori r3, r3, 19025
|
|
; CHECK-P9-NEXT: rldic r3, r3, 12, 24
|
|
; CHECK-P9-NEXT: stxsihx f0, 0, r3
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_cst_align64_float_uint16_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P8-NEXT: lis r3, 3725
|
|
; CHECK-P8-NEXT: ori r3, r3, 19025
|
|
; CHECK-P8-NEXT: rldic r3, r3, 12, 24
|
|
; CHECK-P8-NEXT: mffprwz r4, f0
|
|
; CHECK-P8-NEXT: sth r4, 0(r3)
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptoui float %str to i16
|
|
store i16 %conv, i16* inttoptr (i64 1000000000000 to i16*), align 4096
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_0_float_int16_t(i64 %ptr, float %str) {
|
|
; CHECK-POSTP8-LABEL: st_0_float_int16_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-POSTP8-NEXT: stxsihx f0, 0, r3
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_0_float_int16_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P8-NEXT: mffprwz r4, f0
|
|
; CHECK-P8-NEXT: sth r4, 0(r3)
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptosi float %str to i16
|
|
%0 = inttoptr i64 %ptr to i16*
|
|
store i16 %conv, i16* %0, align 2
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_align16_float_int16_t(i8* nocapture %ptr, float %str) {
|
|
; CHECK-POSTP8-LABEL: st_align16_float_int16_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-POSTP8-NEXT: addi r3, r3, 8
|
|
; CHECK-POSTP8-NEXT: stxsihx f0, 0, r3
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_align16_float_int16_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P8-NEXT: mffprwz r4, f0
|
|
; CHECK-P8-NEXT: sth r4, 8(r3)
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptosi float %str to i16
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 8
|
|
%0 = bitcast i8* %add.ptr to i16*
|
|
store i16 %conv, i16* %0, align 2
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_align32_float_int16_t(i8* nocapture %ptr, float %str) {
|
|
; CHECK-P10-LABEL: st_align32_float_int16_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P10-NEXT: pli r4, 99999000
|
|
; CHECK-P10-NEXT: stxsihx f0, r3, r4
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: st_align32_float_int16_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P9-NEXT: lis r4, 1525
|
|
; CHECK-P9-NEXT: ori r4, r4, 56600
|
|
; CHECK-P9-NEXT: stxsihx f0, r3, r4
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_align32_float_int16_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P8-NEXT: lis r4, 1525
|
|
; CHECK-P8-NEXT: ori r4, r4, 56600
|
|
; CHECK-P8-NEXT: mffprwz r5, f0
|
|
; CHECK-P8-NEXT: sthx r5, r3, r4
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptosi float %str to i16
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 99999000
|
|
%0 = bitcast i8* %add.ptr to i16*
|
|
store i16 %conv, i16* %0, align 2
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_align64_float_int16_t(i8* nocapture %ptr, float %str) {
|
|
; CHECK-P10-LABEL: st_align64_float_int16_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P10-NEXT: pli r4, 244140625
|
|
; CHECK-P10-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P10-NEXT: stxsihx f0, r3, r4
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: st_align64_float_int16_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P9-NEXT: lis r4, 3725
|
|
; CHECK-P9-NEXT: ori r4, r4, 19025
|
|
; CHECK-P9-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P9-NEXT: stxsihx f0, r3, r4
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_align64_float_int16_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P8-NEXT: lis r4, 3725
|
|
; CHECK-P8-NEXT: ori r4, r4, 19025
|
|
; CHECK-P8-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P8-NEXT: mffprwz r5, f0
|
|
; CHECK-P8-NEXT: sthx r5, r3, r4
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptosi float %str to i16
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1000000000000
|
|
%0 = bitcast i8* %add.ptr to i16*
|
|
store i16 %conv, i16* %0, align 2
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_reg_float_int16_t(i8* nocapture %ptr, i64 %off, float %str) {
|
|
; CHECK-POSTP8-LABEL: st_reg_float_int16_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-POSTP8-NEXT: stxsihx f0, r3, r4
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_reg_float_int16_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P8-NEXT: mffprwz r5, f0
|
|
; CHECK-P8-NEXT: sthx r5, r3, r4
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptosi float %str to i16
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 %off
|
|
%0 = bitcast i8* %add.ptr to i16*
|
|
store i16 %conv, i16* %0, align 2
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_or1_float_int16_t(i64 %ptr, i8 zeroext %off, float %str) {
|
|
; CHECK-POSTP8-LABEL: st_or1_float_int16_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-POSTP8-NEXT: or r3, r4, r3
|
|
; CHECK-POSTP8-NEXT: stxsihx f0, 0, r3
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_or1_float_int16_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P8-NEXT: or r3, r4, r3
|
|
; CHECK-P8-NEXT: mffprwz r5, f0
|
|
; CHECK-P8-NEXT: sth r5, 0(r3)
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptosi float %str to i16
|
|
%conv1 = zext i8 %off to i64
|
|
%or = or i64 %conv1, %ptr
|
|
%0 = inttoptr i64 %or to i16*
|
|
store i16 %conv, i16* %0, align 2
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_not_disjoint16_float_int16_t(i64 %ptr, float %str) {
|
|
; CHECK-POSTP8-LABEL: st_not_disjoint16_float_int16_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-POSTP8-NEXT: ori r3, r3, 6
|
|
; CHECK-POSTP8-NEXT: stxsihx f0, 0, r3
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_not_disjoint16_float_int16_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P8-NEXT: ori r3, r3, 6
|
|
; CHECK-P8-NEXT: mffprwz r4, f0
|
|
; CHECK-P8-NEXT: sth r4, 0(r3)
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptosi float %str to i16
|
|
%or = or i64 %ptr, 6
|
|
%0 = inttoptr i64 %or to i16*
|
|
store i16 %conv, i16* %0, align 2
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_disjoint_align16_float_int16_t(i64 %ptr, float %str) {
|
|
; CHECK-POSTP8-LABEL: st_disjoint_align16_float_int16_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-POSTP8-NEXT: rldicr r3, r3, 0, 51
|
|
; CHECK-POSTP8-NEXT: ori r3, r3, 24
|
|
; CHECK-POSTP8-NEXT: stxsihx f0, 0, r3
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_disjoint_align16_float_int16_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P8-NEXT: rldicr r3, r3, 0, 51
|
|
; CHECK-P8-NEXT: mffprwz r4, f0
|
|
; CHECK-P8-NEXT: sth r4, 24(r3)
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%and = and i64 %ptr, -4096
|
|
%conv = fptosi float %str to i16
|
|
%or = or i64 %and, 24
|
|
%0 = inttoptr i64 %or to i16*
|
|
store i16 %conv, i16* %0, align 8
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_not_disjoint32_float_int16_t(i64 %ptr, float %str) {
|
|
; CHECK-POSTP8-LABEL: st_not_disjoint32_float_int16_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-POSTP8-NEXT: ori r3, r3, 34463
|
|
; CHECK-POSTP8-NEXT: oris r3, r3, 1
|
|
; CHECK-POSTP8-NEXT: stxsihx f0, 0, r3
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_not_disjoint32_float_int16_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P8-NEXT: ori r3, r3, 34463
|
|
; CHECK-P8-NEXT: oris r3, r3, 1
|
|
; CHECK-P8-NEXT: mffprwz r4, f0
|
|
; CHECK-P8-NEXT: sth r4, 0(r3)
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptosi float %str to i16
|
|
%or = or i64 %ptr, 99999
|
|
%0 = inttoptr i64 %or to i16*
|
|
store i16 %conv, i16* %0, align 2
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_disjoint_align32_float_int16_t(i64 %ptr, float %str) {
|
|
; CHECK-P10-LABEL: st_disjoint_align32_float_int16_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P10-NEXT: lis r4, -15264
|
|
; CHECK-P10-NEXT: and r3, r3, r4
|
|
; CHECK-P10-NEXT: pli r4, 999990000
|
|
; CHECK-P10-NEXT: stxsihx f0, r3, r4
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: st_disjoint_align32_float_int16_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P9-NEXT: lis r4, -15264
|
|
; CHECK-P9-NEXT: and r3, r3, r4
|
|
; CHECK-P9-NEXT: lis r4, 15258
|
|
; CHECK-P9-NEXT: ori r4, r4, 41712
|
|
; CHECK-P9-NEXT: stxsihx f0, r3, r4
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_disjoint_align32_float_int16_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P8-NEXT: lis r4, -15264
|
|
; CHECK-P8-NEXT: lis r6, 15258
|
|
; CHECK-P8-NEXT: and r3, r3, r4
|
|
; CHECK-P8-NEXT: ori r4, r6, 41712
|
|
; CHECK-P8-NEXT: mffprwz r5, f0
|
|
; CHECK-P8-NEXT: sthx r5, r3, r4
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%and = and i64 %ptr, -1000341504
|
|
%conv = fptosi float %str to i16
|
|
%or = or i64 %and, 999990000
|
|
%0 = inttoptr i64 %or to i16*
|
|
store i16 %conv, i16* %0, align 16
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_not_disjoint64_float_int16_t(i64 %ptr, float %str) {
|
|
; CHECK-P10-LABEL: st_not_disjoint64_float_int16_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P10-NEXT: pli r4, 232
|
|
; CHECK-P10-NEXT: pli r5, 3567587329
|
|
; CHECK-P10-NEXT: rldimi r5, r4, 32, 0
|
|
; CHECK-P10-NEXT: or r3, r3, r5
|
|
; CHECK-P10-NEXT: stxsihx f0, 0, r3
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: st_not_disjoint64_float_int16_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: li r4, 29
|
|
; CHECK-P9-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P9-NEXT: rldic r4, r4, 35, 24
|
|
; CHECK-P9-NEXT: oris r4, r4, 54437
|
|
; CHECK-P9-NEXT: ori r4, r4, 4097
|
|
; CHECK-P9-NEXT: or r3, r3, r4
|
|
; CHECK-P9-NEXT: stxsihx f0, 0, r3
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_not_disjoint64_float_int16_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P8-NEXT: li r4, 29
|
|
; CHECK-P8-NEXT: rldic r4, r4, 35, 24
|
|
; CHECK-P8-NEXT: oris r4, r4, 54437
|
|
; CHECK-P8-NEXT: ori r4, r4, 4097
|
|
; CHECK-P8-NEXT: or r3, r3, r4
|
|
; CHECK-P8-NEXT: mffprwz r5, f0
|
|
; CHECK-P8-NEXT: sth r5, 0(r3)
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptosi float %str to i16
|
|
%or = or i64 %ptr, 1000000000001
|
|
%0 = inttoptr i64 %or to i16*
|
|
store i16 %conv, i16* %0, align 2
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_disjoint_align64_float_int16_t(i64 %ptr, float %str) {
|
|
; CHECK-P10-LABEL: st_disjoint_align64_float_int16_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P10-NEXT: pli r4, 244140625
|
|
; CHECK-P10-NEXT: rldicr r3, r3, 0, 23
|
|
; CHECK-P10-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P10-NEXT: stxsihx f0, r3, r4
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: st_disjoint_align64_float_int16_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P9-NEXT: lis r4, 3725
|
|
; CHECK-P9-NEXT: rldicr r3, r3, 0, 23
|
|
; CHECK-P9-NEXT: ori r4, r4, 19025
|
|
; CHECK-P9-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P9-NEXT: stxsihx f0, r3, r4
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_disjoint_align64_float_int16_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P8-NEXT: lis r4, 3725
|
|
; CHECK-P8-NEXT: rldicr r3, r3, 0, 23
|
|
; CHECK-P8-NEXT: ori r4, r4, 19025
|
|
; CHECK-P8-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P8-NEXT: mffprwz r5, f0
|
|
; CHECK-P8-NEXT: sthx r5, r3, r4
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%and = and i64 %ptr, -1099511627776
|
|
%conv = fptosi float %str to i16
|
|
%or = or i64 %and, 1000000000000
|
|
%0 = inttoptr i64 %or to i16*
|
|
store i16 %conv, i16* %0, align 4096
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_cst_align16_float_int16_t(float %str) {
|
|
; CHECK-POSTP8-LABEL: st_cst_align16_float_int16_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-POSTP8-NEXT: li r3, 4080
|
|
; CHECK-POSTP8-NEXT: stxsihx f0, 0, r3
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_cst_align16_float_int16_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P8-NEXT: mffprwz r3, f0
|
|
; CHECK-P8-NEXT: sth r3, 4080(0)
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptosi float %str to i16
|
|
store i16 %conv, i16* inttoptr (i64 4080 to i16*), align 16
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_cst_align32_float_int16_t(float %str) {
|
|
; CHECK-P10-LABEL: st_cst_align32_float_int16_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P10-NEXT: pli r3, 9999900
|
|
; CHECK-P10-NEXT: stxsihx f0, 0, r3
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: st_cst_align32_float_int16_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P9-NEXT: lis r3, 152
|
|
; CHECK-P9-NEXT: ori r3, r3, 38428
|
|
; CHECK-P9-NEXT: stxsihx f0, 0, r3
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_cst_align32_float_int16_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P8-NEXT: lis r4, 153
|
|
; CHECK-P8-NEXT: mffprwz r3, f0
|
|
; CHECK-P8-NEXT: sth r3, -27108(r4)
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptosi float %str to i16
|
|
store i16 %conv, i16* inttoptr (i64 9999900 to i16*), align 4
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_cst_align64_float_int16_t(float %str) {
|
|
; CHECK-P10-LABEL: st_cst_align64_float_int16_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P10-NEXT: pli r3, 244140625
|
|
; CHECK-P10-NEXT: rldic r3, r3, 12, 24
|
|
; CHECK-P10-NEXT: stxsihx f0, 0, r3
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: st_cst_align64_float_int16_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P9-NEXT: lis r3, 3725
|
|
; CHECK-P9-NEXT: ori r3, r3, 19025
|
|
; CHECK-P9-NEXT: rldic r3, r3, 12, 24
|
|
; CHECK-P9-NEXT: stxsihx f0, 0, r3
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_cst_align64_float_int16_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P8-NEXT: lis r3, 3725
|
|
; CHECK-P8-NEXT: ori r3, r3, 19025
|
|
; CHECK-P8-NEXT: rldic r3, r3, 12, 24
|
|
; CHECK-P8-NEXT: mffprwz r4, f0
|
|
; CHECK-P8-NEXT: sth r4, 0(r3)
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptosi float %str to i16
|
|
store i16 %conv, i16* inttoptr (i64 1000000000000 to i16*), align 4096
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_0_float_uint32_t(i64 %ptr, float %str) {
|
|
; CHECK-LABEL: st_0_float_uint32_t:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-NEXT: stfiwx f0, 0, r3
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%conv = fptoui float %str to i32
|
|
%0 = inttoptr i64 %ptr to i32*
|
|
store i32 %conv, i32* %0, align 4
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_align16_float_uint32_t(i8* nocapture %ptr, float %str) {
|
|
; CHECK-LABEL: st_align16_float_uint32_t:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-NEXT: addi r3, r3, 8
|
|
; CHECK-NEXT: stfiwx f0, 0, r3
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%conv = fptoui float %str to i32
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 8
|
|
%0 = bitcast i8* %add.ptr to i32*
|
|
store i32 %conv, i32* %0, align 4
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_align32_float_uint32_t(i8* nocapture %ptr, float %str) {
|
|
; CHECK-P10-LABEL: st_align32_float_uint32_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-P10-NEXT: pli r4, 99999000
|
|
; CHECK-P10-NEXT: stfiwx f0, r3, r4
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-PREP10-LABEL: st_align32_float_uint32_t:
|
|
; CHECK-PREP10: # %bb.0: # %entry
|
|
; CHECK-PREP10-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-PREP10-NEXT: lis r4, 1525
|
|
; CHECK-PREP10-NEXT: ori r4, r4, 56600
|
|
; CHECK-PREP10-NEXT: stfiwx f0, r3, r4
|
|
; CHECK-PREP10-NEXT: blr
|
|
entry:
|
|
%conv = fptoui float %str to i32
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 99999000
|
|
%0 = bitcast i8* %add.ptr to i32*
|
|
store i32 %conv, i32* %0, align 4
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_align64_float_uint32_t(i8* nocapture %ptr, float %str) {
|
|
; CHECK-P10-LABEL: st_align64_float_uint32_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-P10-NEXT: pli r4, 244140625
|
|
; CHECK-P10-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P10-NEXT: stfiwx f0, r3, r4
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-PREP10-LABEL: st_align64_float_uint32_t:
|
|
; CHECK-PREP10: # %bb.0: # %entry
|
|
; CHECK-PREP10-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-PREP10-NEXT: lis r4, 3725
|
|
; CHECK-PREP10-NEXT: ori r4, r4, 19025
|
|
; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-PREP10-NEXT: stfiwx f0, r3, r4
|
|
; CHECK-PREP10-NEXT: blr
|
|
entry:
|
|
%conv = fptoui float %str to i32
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1000000000000
|
|
%0 = bitcast i8* %add.ptr to i32*
|
|
store i32 %conv, i32* %0, align 4
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_reg_float_uint32_t(i8* nocapture %ptr, i64 %off, float %str) {
|
|
; CHECK-LABEL: st_reg_float_uint32_t:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-NEXT: stfiwx f0, r3, r4
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%conv = fptoui float %str to i32
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 %off
|
|
%0 = bitcast i8* %add.ptr to i32*
|
|
store i32 %conv, i32* %0, align 4
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_or1_float_uint32_t(i64 %ptr, i8 zeroext %off, float %str) {
|
|
; CHECK-LABEL: st_or1_float_uint32_t:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-NEXT: or r3, r4, r3
|
|
; CHECK-NEXT: stfiwx f0, 0, r3
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%conv = fptoui float %str to i32
|
|
%conv1 = zext i8 %off to i64
|
|
%or = or i64 %conv1, %ptr
|
|
%0 = inttoptr i64 %or to i32*
|
|
store i32 %conv, i32* %0, align 4
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_not_disjoint16_float_uint32_t(i64 %ptr, float %str) {
|
|
; CHECK-LABEL: st_not_disjoint16_float_uint32_t:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-NEXT: ori r3, r3, 6
|
|
; CHECK-NEXT: stfiwx f0, 0, r3
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%conv = fptoui float %str to i32
|
|
%or = or i64 %ptr, 6
|
|
%0 = inttoptr i64 %or to i32*
|
|
store i32 %conv, i32* %0, align 4
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_disjoint_align16_float_uint32_t(i64 %ptr, float %str) {
|
|
; CHECK-LABEL: st_disjoint_align16_float_uint32_t:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-NEXT: rldicr r3, r3, 0, 51
|
|
; CHECK-NEXT: ori r3, r3, 24
|
|
; CHECK-NEXT: stfiwx f0, 0, r3
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%and = and i64 %ptr, -4096
|
|
%conv = fptoui float %str to i32
|
|
%or = or i64 %and, 24
|
|
%0 = inttoptr i64 %or to i32*
|
|
store i32 %conv, i32* %0, align 8
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_not_disjoint32_float_uint32_t(i64 %ptr, float %str) {
|
|
; CHECK-LABEL: st_not_disjoint32_float_uint32_t:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-NEXT: ori r3, r3, 34463
|
|
; CHECK-NEXT: oris r3, r3, 1
|
|
; CHECK-NEXT: stfiwx f0, 0, r3
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%conv = fptoui float %str to i32
|
|
%or = or i64 %ptr, 99999
|
|
%0 = inttoptr i64 %or to i32*
|
|
store i32 %conv, i32* %0, align 4
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_disjoint_align32_float_uint32_t(i64 %ptr, float %str) {
|
|
; CHECK-P10-LABEL: st_disjoint_align32_float_uint32_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-P10-NEXT: lis r4, -15264
|
|
; CHECK-P10-NEXT: and r3, r3, r4
|
|
; CHECK-P10-NEXT: pli r4, 999990000
|
|
; CHECK-P10-NEXT: stfiwx f0, r3, r4
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: st_disjoint_align32_float_uint32_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-P9-NEXT: lis r4, -15264
|
|
; CHECK-P9-NEXT: and r3, r3, r4
|
|
; CHECK-P9-NEXT: lis r4, 15258
|
|
; CHECK-P9-NEXT: ori r4, r4, 41712
|
|
; CHECK-P9-NEXT: stfiwx f0, r3, r4
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_disjoint_align32_float_uint32_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-P8-NEXT: lis r4, -15264
|
|
; CHECK-P8-NEXT: lis r5, 15258
|
|
; CHECK-P8-NEXT: and r3, r3, r4
|
|
; CHECK-P8-NEXT: ori r4, r5, 41712
|
|
; CHECK-P8-NEXT: stfiwx f0, r3, r4
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%and = and i64 %ptr, -1000341504
|
|
%conv = fptoui float %str to i32
|
|
%or = or i64 %and, 999990000
|
|
%0 = inttoptr i64 %or to i32*
|
|
store i32 %conv, i32* %0, align 16
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_not_disjoint64_float_uint32_t(i64 %ptr, float %str) {
|
|
; CHECK-P10-LABEL: st_not_disjoint64_float_uint32_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-P10-NEXT: pli r4, 232
|
|
; CHECK-P10-NEXT: pli r5, 3567587329
|
|
; CHECK-P10-NEXT: rldimi r5, r4, 32, 0
|
|
; CHECK-P10-NEXT: or r3, r3, r5
|
|
; CHECK-P10-NEXT: stfiwx f0, 0, r3
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: st_not_disjoint64_float_uint32_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: li r4, 29
|
|
; CHECK-P9-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-P9-NEXT: rldic r4, r4, 35, 24
|
|
; CHECK-P9-NEXT: oris r4, r4, 54437
|
|
; CHECK-P9-NEXT: ori r4, r4, 4097
|
|
; CHECK-P9-NEXT: or r3, r3, r4
|
|
; CHECK-P9-NEXT: stfiwx f0, 0, r3
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_not_disjoint64_float_uint32_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-P8-NEXT: li r4, 29
|
|
; CHECK-P8-NEXT: rldic r4, r4, 35, 24
|
|
; CHECK-P8-NEXT: oris r4, r4, 54437
|
|
; CHECK-P8-NEXT: ori r4, r4, 4097
|
|
; CHECK-P8-NEXT: or r3, r3, r4
|
|
; CHECK-P8-NEXT: stfiwx f0, 0, r3
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptoui float %str to i32
|
|
%or = or i64 %ptr, 1000000000001
|
|
%0 = inttoptr i64 %or to i32*
|
|
store i32 %conv, i32* %0, align 4
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_disjoint_align64_float_uint32_t(i64 %ptr, float %str) {
|
|
; CHECK-P10-LABEL: st_disjoint_align64_float_uint32_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-P10-NEXT: pli r4, 244140625
|
|
; CHECK-P10-NEXT: rldicr r3, r3, 0, 23
|
|
; CHECK-P10-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P10-NEXT: stfiwx f0, r3, r4
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-PREP10-LABEL: st_disjoint_align64_float_uint32_t:
|
|
; CHECK-PREP10: # %bb.0: # %entry
|
|
; CHECK-PREP10-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-PREP10-NEXT: lis r4, 3725
|
|
; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23
|
|
; CHECK-PREP10-NEXT: ori r4, r4, 19025
|
|
; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-PREP10-NEXT: stfiwx f0, r3, r4
|
|
; CHECK-PREP10-NEXT: blr
|
|
entry:
|
|
%and = and i64 %ptr, -1099511627776
|
|
%conv = fptoui float %str to i32
|
|
%or = or i64 %and, 1000000000000
|
|
%0 = inttoptr i64 %or to i32*
|
|
store i32 %conv, i32* %0, align 4096
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_cst_align16_float_uint32_t(float %str) {
|
|
; CHECK-LABEL: st_cst_align16_float_uint32_t:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-NEXT: li r3, 4080
|
|
; CHECK-NEXT: stfiwx f0, 0, r3
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%conv = fptoui float %str to i32
|
|
store i32 %conv, i32* inttoptr (i64 4080 to i32*), align 16
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_cst_align32_float_uint32_t(float %str) {
|
|
; CHECK-P10-LABEL: st_cst_align32_float_uint32_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-P10-NEXT: pli r3, 9999900
|
|
; CHECK-P10-NEXT: stfiwx f0, 0, r3
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-PREP10-LABEL: st_cst_align32_float_uint32_t:
|
|
; CHECK-PREP10: # %bb.0: # %entry
|
|
; CHECK-PREP10-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-PREP10-NEXT: lis r3, 152
|
|
; CHECK-PREP10-NEXT: ori r3, r3, 38428
|
|
; CHECK-PREP10-NEXT: stfiwx f0, 0, r3
|
|
; CHECK-PREP10-NEXT: blr
|
|
entry:
|
|
%conv = fptoui float %str to i32
|
|
store i32 %conv, i32* inttoptr (i64 9999900 to i32*), align 4
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_cst_align64_float_uint32_t(float %str) {
|
|
; CHECK-P10-LABEL: st_cst_align64_float_uint32_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-P10-NEXT: pli r3, 244140625
|
|
; CHECK-P10-NEXT: rldic r3, r3, 12, 24
|
|
; CHECK-P10-NEXT: stfiwx f0, 0, r3
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-PREP10-LABEL: st_cst_align64_float_uint32_t:
|
|
; CHECK-PREP10: # %bb.0: # %entry
|
|
; CHECK-PREP10-NEXT: xscvdpuxws f0, f1
|
|
; CHECK-PREP10-NEXT: lis r3, 3725
|
|
; CHECK-PREP10-NEXT: ori r3, r3, 19025
|
|
; CHECK-PREP10-NEXT: rldic r3, r3, 12, 24
|
|
; CHECK-PREP10-NEXT: stfiwx f0, 0, r3
|
|
; CHECK-PREP10-NEXT: blr
|
|
entry:
|
|
%conv = fptoui float %str to i32
|
|
store i32 %conv, i32* inttoptr (i64 1000000000000 to i32*), align 4096
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_0_float_int32_t(i64 %ptr, float %str) {
|
|
; CHECK-LABEL: st_0_float_int32_t:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-NEXT: stfiwx f0, 0, r3
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%conv = fptosi float %str to i32
|
|
%0 = inttoptr i64 %ptr to i32*
|
|
store i32 %conv, i32* %0, align 4
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_align16_float_int32_t(i8* nocapture %ptr, float %str) {
|
|
; CHECK-LABEL: st_align16_float_int32_t:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-NEXT: addi r3, r3, 8
|
|
; CHECK-NEXT: stfiwx f0, 0, r3
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%conv = fptosi float %str to i32
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 8
|
|
%0 = bitcast i8* %add.ptr to i32*
|
|
store i32 %conv, i32* %0, align 4
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_align32_float_int32_t(i8* nocapture %ptr, float %str) {
|
|
; CHECK-P10-LABEL: st_align32_float_int32_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P10-NEXT: pli r4, 99999000
|
|
; CHECK-P10-NEXT: stfiwx f0, r3, r4
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-PREP10-LABEL: st_align32_float_int32_t:
|
|
; CHECK-PREP10: # %bb.0: # %entry
|
|
; CHECK-PREP10-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-PREP10-NEXT: lis r4, 1525
|
|
; CHECK-PREP10-NEXT: ori r4, r4, 56600
|
|
; CHECK-PREP10-NEXT: stfiwx f0, r3, r4
|
|
; CHECK-PREP10-NEXT: blr
|
|
entry:
|
|
%conv = fptosi float %str to i32
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 99999000
|
|
%0 = bitcast i8* %add.ptr to i32*
|
|
store i32 %conv, i32* %0, align 4
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_align64_float_int32_t(i8* nocapture %ptr, float %str) {
|
|
; CHECK-P10-LABEL: st_align64_float_int32_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P10-NEXT: pli r4, 244140625
|
|
; CHECK-P10-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P10-NEXT: stfiwx f0, r3, r4
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-PREP10-LABEL: st_align64_float_int32_t:
|
|
; CHECK-PREP10: # %bb.0: # %entry
|
|
; CHECK-PREP10-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-PREP10-NEXT: lis r4, 3725
|
|
; CHECK-PREP10-NEXT: ori r4, r4, 19025
|
|
; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-PREP10-NEXT: stfiwx f0, r3, r4
|
|
; CHECK-PREP10-NEXT: blr
|
|
entry:
|
|
%conv = fptosi float %str to i32
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1000000000000
|
|
%0 = bitcast i8* %add.ptr to i32*
|
|
store i32 %conv, i32* %0, align 4
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_reg_float_int32_t(i8* nocapture %ptr, i64 %off, float %str) {
|
|
; CHECK-LABEL: st_reg_float_int32_t:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-NEXT: stfiwx f0, r3, r4
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%conv = fptosi float %str to i32
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 %off
|
|
%0 = bitcast i8* %add.ptr to i32*
|
|
store i32 %conv, i32* %0, align 4
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_or1_float_int32_t(i64 %ptr, i8 zeroext %off, float %str) {
|
|
; CHECK-LABEL: st_or1_float_int32_t:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-NEXT: or r3, r4, r3
|
|
; CHECK-NEXT: stfiwx f0, 0, r3
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%conv = fptosi float %str to i32
|
|
%conv1 = zext i8 %off to i64
|
|
%or = or i64 %conv1, %ptr
|
|
%0 = inttoptr i64 %or to i32*
|
|
store i32 %conv, i32* %0, align 4
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_not_disjoint16_float_int32_t(i64 %ptr, float %str) {
|
|
; CHECK-LABEL: st_not_disjoint16_float_int32_t:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-NEXT: ori r3, r3, 6
|
|
; CHECK-NEXT: stfiwx f0, 0, r3
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%conv = fptosi float %str to i32
|
|
%or = or i64 %ptr, 6
|
|
%0 = inttoptr i64 %or to i32*
|
|
store i32 %conv, i32* %0, align 4
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_disjoint_align16_float_int32_t(i64 %ptr, float %str) {
|
|
; CHECK-LABEL: st_disjoint_align16_float_int32_t:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-NEXT: rldicr r3, r3, 0, 51
|
|
; CHECK-NEXT: ori r3, r3, 24
|
|
; CHECK-NEXT: stfiwx f0, 0, r3
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%and = and i64 %ptr, -4096
|
|
%conv = fptosi float %str to i32
|
|
%or = or i64 %and, 24
|
|
%0 = inttoptr i64 %or to i32*
|
|
store i32 %conv, i32* %0, align 8
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_not_disjoint32_float_int32_t(i64 %ptr, float %str) {
|
|
; CHECK-LABEL: st_not_disjoint32_float_int32_t:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-NEXT: ori r3, r3, 34463
|
|
; CHECK-NEXT: oris r3, r3, 1
|
|
; CHECK-NEXT: stfiwx f0, 0, r3
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%conv = fptosi float %str to i32
|
|
%or = or i64 %ptr, 99999
|
|
%0 = inttoptr i64 %or to i32*
|
|
store i32 %conv, i32* %0, align 4
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_disjoint_align32_float_int32_t(i64 %ptr, float %str) {
|
|
; CHECK-P10-LABEL: st_disjoint_align32_float_int32_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P10-NEXT: lis r4, -15264
|
|
; CHECK-P10-NEXT: and r3, r3, r4
|
|
; CHECK-P10-NEXT: pli r4, 999990000
|
|
; CHECK-P10-NEXT: stfiwx f0, r3, r4
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: st_disjoint_align32_float_int32_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P9-NEXT: lis r4, -15264
|
|
; CHECK-P9-NEXT: and r3, r3, r4
|
|
; CHECK-P9-NEXT: lis r4, 15258
|
|
; CHECK-P9-NEXT: ori r4, r4, 41712
|
|
; CHECK-P9-NEXT: stfiwx f0, r3, r4
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_disjoint_align32_float_int32_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P8-NEXT: lis r4, -15264
|
|
; CHECK-P8-NEXT: lis r5, 15258
|
|
; CHECK-P8-NEXT: and r3, r3, r4
|
|
; CHECK-P8-NEXT: ori r4, r5, 41712
|
|
; CHECK-P8-NEXT: stfiwx f0, r3, r4
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%and = and i64 %ptr, -1000341504
|
|
%conv = fptosi float %str to i32
|
|
%or = or i64 %and, 999990000
|
|
%0 = inttoptr i64 %or to i32*
|
|
store i32 %conv, i32* %0, align 16
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_not_disjoint64_float_int32_t(i64 %ptr, float %str) {
|
|
; CHECK-P10-LABEL: st_not_disjoint64_float_int32_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P10-NEXT: pli r4, 232
|
|
; CHECK-P10-NEXT: pli r5, 3567587329
|
|
; CHECK-P10-NEXT: rldimi r5, r4, 32, 0
|
|
; CHECK-P10-NEXT: or r3, r3, r5
|
|
; CHECK-P10-NEXT: stfiwx f0, 0, r3
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: st_not_disjoint64_float_int32_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: li r4, 29
|
|
; CHECK-P9-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P9-NEXT: rldic r4, r4, 35, 24
|
|
; CHECK-P9-NEXT: oris r4, r4, 54437
|
|
; CHECK-P9-NEXT: ori r4, r4, 4097
|
|
; CHECK-P9-NEXT: or r3, r3, r4
|
|
; CHECK-P9-NEXT: stfiwx f0, 0, r3
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_not_disjoint64_float_int32_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P8-NEXT: li r4, 29
|
|
; CHECK-P8-NEXT: rldic r4, r4, 35, 24
|
|
; CHECK-P8-NEXT: oris r4, r4, 54437
|
|
; CHECK-P8-NEXT: ori r4, r4, 4097
|
|
; CHECK-P8-NEXT: or r3, r3, r4
|
|
; CHECK-P8-NEXT: stfiwx f0, 0, r3
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptosi float %str to i32
|
|
%or = or i64 %ptr, 1000000000001
|
|
%0 = inttoptr i64 %or to i32*
|
|
store i32 %conv, i32* %0, align 4
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_disjoint_align64_float_int32_t(i64 %ptr, float %str) {
|
|
; CHECK-P10-LABEL: st_disjoint_align64_float_int32_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P10-NEXT: pli r4, 244140625
|
|
; CHECK-P10-NEXT: rldicr r3, r3, 0, 23
|
|
; CHECK-P10-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P10-NEXT: stfiwx f0, r3, r4
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-PREP10-LABEL: st_disjoint_align64_float_int32_t:
|
|
; CHECK-PREP10: # %bb.0: # %entry
|
|
; CHECK-PREP10-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-PREP10-NEXT: lis r4, 3725
|
|
; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23
|
|
; CHECK-PREP10-NEXT: ori r4, r4, 19025
|
|
; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-PREP10-NEXT: stfiwx f0, r3, r4
|
|
; CHECK-PREP10-NEXT: blr
|
|
entry:
|
|
%and = and i64 %ptr, -1099511627776
|
|
%conv = fptosi float %str to i32
|
|
%or = or i64 %and, 1000000000000
|
|
%0 = inttoptr i64 %or to i32*
|
|
store i32 %conv, i32* %0, align 4096
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_cst_align16_float_int32_t(float %str) {
|
|
; CHECK-LABEL: st_cst_align16_float_int32_t:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-NEXT: li r3, 4080
|
|
; CHECK-NEXT: stfiwx f0, 0, r3
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%conv = fptosi float %str to i32
|
|
store i32 %conv, i32* inttoptr (i64 4080 to i32*), align 16
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_cst_align32_float_int32_t(float %str) {
|
|
; CHECK-P10-LABEL: st_cst_align32_float_int32_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P10-NEXT: pli r3, 9999900
|
|
; CHECK-P10-NEXT: stfiwx f0, 0, r3
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-PREP10-LABEL: st_cst_align32_float_int32_t:
|
|
; CHECK-PREP10: # %bb.0: # %entry
|
|
; CHECK-PREP10-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-PREP10-NEXT: lis r3, 152
|
|
; CHECK-PREP10-NEXT: ori r3, r3, 38428
|
|
; CHECK-PREP10-NEXT: stfiwx f0, 0, r3
|
|
; CHECK-PREP10-NEXT: blr
|
|
entry:
|
|
%conv = fptosi float %str to i32
|
|
store i32 %conv, i32* inttoptr (i64 9999900 to i32*), align 4
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_cst_align64_float_int32_t(float %str) {
|
|
; CHECK-P10-LABEL: st_cst_align64_float_int32_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-P10-NEXT: pli r3, 244140625
|
|
; CHECK-P10-NEXT: rldic r3, r3, 12, 24
|
|
; CHECK-P10-NEXT: stfiwx f0, 0, r3
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-PREP10-LABEL: st_cst_align64_float_int32_t:
|
|
; CHECK-PREP10: # %bb.0: # %entry
|
|
; CHECK-PREP10-NEXT: xscvdpsxws f0, f1
|
|
; CHECK-PREP10-NEXT: lis r3, 3725
|
|
; CHECK-PREP10-NEXT: ori r3, r3, 19025
|
|
; CHECK-PREP10-NEXT: rldic r3, r3, 12, 24
|
|
; CHECK-PREP10-NEXT: stfiwx f0, 0, r3
|
|
; CHECK-PREP10-NEXT: blr
|
|
entry:
|
|
%conv = fptosi float %str to i32
|
|
store i32 %conv, i32* inttoptr (i64 1000000000000 to i32*), align 4096
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_0_float_uint64_t(i64 %ptr, float %str) {
|
|
; CHECK-POSTP8-LABEL: st_0_float_uint64_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: xscvdpuxds v2, f1
|
|
; CHECK-POSTP8-NEXT: stxsd v2, 0(r3)
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_0_float_uint64_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpuxds f0, f1
|
|
; CHECK-P8-NEXT: stxsdx f0, 0, r3
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptoui float %str to i64
|
|
%0 = inttoptr i64 %ptr to i64*
|
|
store i64 %conv, i64* %0, align 8
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_align16_float_uint64_t(i8* nocapture %ptr, float %str) {
|
|
; CHECK-POSTP8-LABEL: st_align16_float_uint64_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: xscvdpuxds v2, f1
|
|
; CHECK-POSTP8-NEXT: stxsd v2, 8(r3)
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_align16_float_uint64_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpuxds f0, f1
|
|
; CHECK-P8-NEXT: li r4, 8
|
|
; CHECK-P8-NEXT: stxsdx f0, r3, r4
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptoui float %str to i64
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 8
|
|
%0 = bitcast i8* %add.ptr to i64*
|
|
store i64 %conv, i64* %0, align 8
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_align32_float_uint64_t(i8* nocapture %ptr, float %str) {
|
|
; CHECK-P10-LABEL: st_align32_float_uint64_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: xscvdpuxds f0, f1
|
|
; CHECK-P10-NEXT: pli r4, 99999000
|
|
; CHECK-P10-NEXT: stxsdx f0, r3, r4
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-PREP10-LABEL: st_align32_float_uint64_t:
|
|
; CHECK-PREP10: # %bb.0: # %entry
|
|
; CHECK-PREP10-NEXT: xscvdpuxds f0, f1
|
|
; CHECK-PREP10-NEXT: lis r4, 1525
|
|
; CHECK-PREP10-NEXT: ori r4, r4, 56600
|
|
; CHECK-PREP10-NEXT: stxsdx f0, r3, r4
|
|
; CHECK-PREP10-NEXT: blr
|
|
entry:
|
|
%conv = fptoui float %str to i64
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 99999000
|
|
%0 = bitcast i8* %add.ptr to i64*
|
|
store i64 %conv, i64* %0, align 8
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_align64_float_uint64_t(i8* nocapture %ptr, float %str) {
|
|
; CHECK-P10-LABEL: st_align64_float_uint64_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: xscvdpuxds f0, f1
|
|
; CHECK-P10-NEXT: pli r4, 244140625
|
|
; CHECK-P10-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P10-NEXT: stxsdx f0, r3, r4
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-PREP10-LABEL: st_align64_float_uint64_t:
|
|
; CHECK-PREP10: # %bb.0: # %entry
|
|
; CHECK-PREP10-NEXT: xscvdpuxds f0, f1
|
|
; CHECK-PREP10-NEXT: lis r4, 3725
|
|
; CHECK-PREP10-NEXT: ori r4, r4, 19025
|
|
; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-PREP10-NEXT: stxsdx f0, r3, r4
|
|
; CHECK-PREP10-NEXT: blr
|
|
entry:
|
|
%conv = fptoui float %str to i64
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1000000000000
|
|
%0 = bitcast i8* %add.ptr to i64*
|
|
store i64 %conv, i64* %0, align 8
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_reg_float_uint64_t(i8* nocapture %ptr, i64 %off, float %str) {
|
|
; CHECK-LABEL: st_reg_float_uint64_t:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: xscvdpuxds f0, f1
|
|
; CHECK-NEXT: stxsdx f0, r3, r4
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%conv = fptoui float %str to i64
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 %off
|
|
%0 = bitcast i8* %add.ptr to i64*
|
|
store i64 %conv, i64* %0, align 8
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_or1_float_uint64_t(i64 %ptr, i8 zeroext %off, float %str) {
|
|
; CHECK-POSTP8-LABEL: st_or1_float_uint64_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: xscvdpuxds v2, f1
|
|
; CHECK-POSTP8-NEXT: or r3, r4, r3
|
|
; CHECK-POSTP8-NEXT: stxsd v2, 0(r3)
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_or1_float_uint64_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpuxds f0, f1
|
|
; CHECK-P8-NEXT: or r3, r4, r3
|
|
; CHECK-P8-NEXT: stxsdx f0, 0, r3
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptoui float %str to i64
|
|
%conv1 = zext i8 %off to i64
|
|
%or = or i64 %conv1, %ptr
|
|
%0 = inttoptr i64 %or to i64*
|
|
store i64 %conv, i64* %0, align 8
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_not_disjoint16_float_uint64_t(i64 %ptr, float %str) {
|
|
; CHECK-POSTP8-LABEL: st_not_disjoint16_float_uint64_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: xscvdpuxds v2, f1
|
|
; CHECK-POSTP8-NEXT: ori r3, r3, 6
|
|
; CHECK-POSTP8-NEXT: stxsd v2, 0(r3)
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_not_disjoint16_float_uint64_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpuxds f0, f1
|
|
; CHECK-P8-NEXT: ori r3, r3, 6
|
|
; CHECK-P8-NEXT: stxsdx f0, 0, r3
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptoui float %str to i64
|
|
%or = or i64 %ptr, 6
|
|
%0 = inttoptr i64 %or to i64*
|
|
store i64 %conv, i64* %0, align 8
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_disjoint_align16_float_uint64_t(i64 %ptr, float %str) {
|
|
; CHECK-POSTP8-LABEL: st_disjoint_align16_float_uint64_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: xscvdpuxds v2, f1
|
|
; CHECK-POSTP8-NEXT: rldicr r3, r3, 0, 51
|
|
; CHECK-POSTP8-NEXT: stxsd v2, 24(r3)
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_disjoint_align16_float_uint64_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpuxds f0, f1
|
|
; CHECK-P8-NEXT: rldicr r3, r3, 0, 51
|
|
; CHECK-P8-NEXT: ori r3, r3, 24
|
|
; CHECK-P8-NEXT: stxsdx f0, 0, r3
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%and = and i64 %ptr, -4096
|
|
%conv = fptoui float %str to i64
|
|
%or = or i64 %and, 24
|
|
%0 = inttoptr i64 %or to i64*
|
|
store i64 %conv, i64* %0, align 8
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_not_disjoint32_float_uint64_t(i64 %ptr, float %str) {
|
|
; CHECK-POSTP8-LABEL: st_not_disjoint32_float_uint64_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: xscvdpuxds v2, f1
|
|
; CHECK-POSTP8-NEXT: ori r3, r3, 34463
|
|
; CHECK-POSTP8-NEXT: oris r3, r3, 1
|
|
; CHECK-POSTP8-NEXT: stxsd v2, 0(r3)
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_not_disjoint32_float_uint64_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpuxds f0, f1
|
|
; CHECK-P8-NEXT: ori r3, r3, 34463
|
|
; CHECK-P8-NEXT: oris r3, r3, 1
|
|
; CHECK-P8-NEXT: stxsdx f0, 0, r3
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptoui float %str to i64
|
|
%or = or i64 %ptr, 99999
|
|
%0 = inttoptr i64 %or to i64*
|
|
store i64 %conv, i64* %0, align 8
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_disjoint_align32_float_uint64_t(i64 %ptr, float %str) {
|
|
; CHECK-P10-LABEL: st_disjoint_align32_float_uint64_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: xscvdpuxds f0, f1
|
|
; CHECK-P10-NEXT: lis r4, -15264
|
|
; CHECK-P10-NEXT: and r3, r3, r4
|
|
; CHECK-P10-NEXT: pli r4, 999990000
|
|
; CHECK-P10-NEXT: stxsdx f0, r3, r4
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: st_disjoint_align32_float_uint64_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: xscvdpuxds f0, f1
|
|
; CHECK-P9-NEXT: lis r4, -15264
|
|
; CHECK-P9-NEXT: and r3, r3, r4
|
|
; CHECK-P9-NEXT: lis r4, 15258
|
|
; CHECK-P9-NEXT: ori r4, r4, 41712
|
|
; CHECK-P9-NEXT: stxsdx f0, r3, r4
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_disjoint_align32_float_uint64_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpuxds f0, f1
|
|
; CHECK-P8-NEXT: lis r4, -15264
|
|
; CHECK-P8-NEXT: lis r5, 15258
|
|
; CHECK-P8-NEXT: and r3, r3, r4
|
|
; CHECK-P8-NEXT: ori r4, r5, 41712
|
|
; CHECK-P8-NEXT: stxsdx f0, r3, r4
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%and = and i64 %ptr, -1000341504
|
|
%conv = fptoui float %str to i64
|
|
%or = or i64 %and, 999990000
|
|
%0 = inttoptr i64 %or to i64*
|
|
store i64 %conv, i64* %0, align 16
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_not_disjoint64_float_uint64_t(i64 %ptr, float %str) {
|
|
; CHECK-P10-LABEL: st_not_disjoint64_float_uint64_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: xscvdpuxds v2, f1
|
|
; CHECK-P10-NEXT: pli r4, 232
|
|
; CHECK-P10-NEXT: pli r5, 3567587329
|
|
; CHECK-P10-NEXT: rldimi r5, r4, 32, 0
|
|
; CHECK-P10-NEXT: or r3, r3, r5
|
|
; CHECK-P10-NEXT: stxsd v2, 0(r3)
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: st_not_disjoint64_float_uint64_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: li r4, 29
|
|
; CHECK-P9-NEXT: xscvdpuxds v2, f1
|
|
; CHECK-P9-NEXT: rldic r4, r4, 35, 24
|
|
; CHECK-P9-NEXT: oris r4, r4, 54437
|
|
; CHECK-P9-NEXT: ori r4, r4, 4097
|
|
; CHECK-P9-NEXT: or r3, r3, r4
|
|
; CHECK-P9-NEXT: stxsd v2, 0(r3)
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_not_disjoint64_float_uint64_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpuxds f0, f1
|
|
; CHECK-P8-NEXT: li r4, 29
|
|
; CHECK-P8-NEXT: rldic r4, r4, 35, 24
|
|
; CHECK-P8-NEXT: oris r4, r4, 54437
|
|
; CHECK-P8-NEXT: ori r4, r4, 4097
|
|
; CHECK-P8-NEXT: or r3, r3, r4
|
|
; CHECK-P8-NEXT: stxsdx f0, 0, r3
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptoui float %str to i64
|
|
%or = or i64 %ptr, 1000000000001
|
|
%0 = inttoptr i64 %or to i64*
|
|
store i64 %conv, i64* %0, align 8
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_disjoint_align64_float_uint64_t(i64 %ptr, float %str) {
|
|
; CHECK-P10-LABEL: st_disjoint_align64_float_uint64_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: xscvdpuxds f0, f1
|
|
; CHECK-P10-NEXT: pli r4, 244140625
|
|
; CHECK-P10-NEXT: rldicr r3, r3, 0, 23
|
|
; CHECK-P10-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P10-NEXT: stxsdx f0, r3, r4
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-PREP10-LABEL: st_disjoint_align64_float_uint64_t:
|
|
; CHECK-PREP10: # %bb.0: # %entry
|
|
; CHECK-PREP10-NEXT: xscvdpuxds f0, f1
|
|
; CHECK-PREP10-NEXT: lis r4, 3725
|
|
; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23
|
|
; CHECK-PREP10-NEXT: ori r4, r4, 19025
|
|
; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-PREP10-NEXT: stxsdx f0, r3, r4
|
|
; CHECK-PREP10-NEXT: blr
|
|
entry:
|
|
%and = and i64 %ptr, -1099511627776
|
|
%conv = fptoui float %str to i64
|
|
%or = or i64 %and, 1000000000000
|
|
%0 = inttoptr i64 %or to i64*
|
|
store i64 %conv, i64* %0, align 4096
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_cst_align16_float_uint64_t(float %str) {
|
|
; CHECK-POSTP8-LABEL: st_cst_align16_float_uint64_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: xscvdpuxds v2, f1
|
|
; CHECK-POSTP8-NEXT: stxsd v2, 4080(0)
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_cst_align16_float_uint64_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpuxds f0, f1
|
|
; CHECK-P8-NEXT: li r3, 4080
|
|
; CHECK-P8-NEXT: stxsdx f0, 0, r3
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptoui float %str to i64
|
|
store i64 %conv, i64* inttoptr (i64 4080 to i64*), align 16
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_cst_align32_float_uint64_t(float %str) {
|
|
; CHECK-POSTP8-LABEL: st_cst_align32_float_uint64_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: xscvdpuxds v2, f1
|
|
; CHECK-POSTP8-NEXT: lis r3, 153
|
|
; CHECK-POSTP8-NEXT: stxsd v2, -27108(r3)
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_cst_align32_float_uint64_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpuxds f0, f1
|
|
; CHECK-P8-NEXT: lis r3, 152
|
|
; CHECK-P8-NEXT: ori r3, r3, 38428
|
|
; CHECK-P8-NEXT: stxsdx f0, 0, r3
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptoui float %str to i64
|
|
store i64 %conv, i64* inttoptr (i64 9999900 to i64*), align 8
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_cst_align64_float_uint64_t(float %str) {
|
|
; CHECK-P10-LABEL: st_cst_align64_float_uint64_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: xscvdpuxds v2, f1
|
|
; CHECK-P10-NEXT: pli r3, 244140625
|
|
; CHECK-P10-NEXT: rldic r3, r3, 12, 24
|
|
; CHECK-P10-NEXT: stxsd v2, 0(r3)
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: st_cst_align64_float_uint64_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: xscvdpuxds v2, f1
|
|
; CHECK-P9-NEXT: lis r3, 3725
|
|
; CHECK-P9-NEXT: ori r3, r3, 19025
|
|
; CHECK-P9-NEXT: rldic r3, r3, 12, 24
|
|
; CHECK-P9-NEXT: stxsd v2, 0(r3)
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_cst_align64_float_uint64_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpuxds f0, f1
|
|
; CHECK-P8-NEXT: lis r3, 3725
|
|
; CHECK-P8-NEXT: ori r3, r3, 19025
|
|
; CHECK-P8-NEXT: rldic r3, r3, 12, 24
|
|
; CHECK-P8-NEXT: stxsdx f0, 0, r3
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptoui float %str to i64
|
|
store i64 %conv, i64* inttoptr (i64 1000000000000 to i64*), align 4096
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_0_float_int64_t(i64 %ptr, float %str) {
|
|
; CHECK-POSTP8-LABEL: st_0_float_int64_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: xscvdpsxds v2, f1
|
|
; CHECK-POSTP8-NEXT: stxsd v2, 0(r3)
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_0_float_int64_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxds f0, f1
|
|
; CHECK-P8-NEXT: stxsdx f0, 0, r3
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptosi float %str to i64
|
|
%0 = inttoptr i64 %ptr to i64*
|
|
store i64 %conv, i64* %0, align 8
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_align16_float_int64_t(i8* nocapture %ptr, float %str) {
|
|
; CHECK-POSTP8-LABEL: st_align16_float_int64_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: xscvdpsxds v2, f1
|
|
; CHECK-POSTP8-NEXT: stxsd v2, 8(r3)
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_align16_float_int64_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxds f0, f1
|
|
; CHECK-P8-NEXT: li r4, 8
|
|
; CHECK-P8-NEXT: stxsdx f0, r3, r4
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptosi float %str to i64
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 8
|
|
%0 = bitcast i8* %add.ptr to i64*
|
|
store i64 %conv, i64* %0, align 8
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_align32_float_int64_t(i8* nocapture %ptr, float %str) {
|
|
; CHECK-P10-LABEL: st_align32_float_int64_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: xscvdpsxds f0, f1
|
|
; CHECK-P10-NEXT: pli r4, 99999000
|
|
; CHECK-P10-NEXT: stxsdx f0, r3, r4
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-PREP10-LABEL: st_align32_float_int64_t:
|
|
; CHECK-PREP10: # %bb.0: # %entry
|
|
; CHECK-PREP10-NEXT: xscvdpsxds f0, f1
|
|
; CHECK-PREP10-NEXT: lis r4, 1525
|
|
; CHECK-PREP10-NEXT: ori r4, r4, 56600
|
|
; CHECK-PREP10-NEXT: stxsdx f0, r3, r4
|
|
; CHECK-PREP10-NEXT: blr
|
|
entry:
|
|
%conv = fptosi float %str to i64
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 99999000
|
|
%0 = bitcast i8* %add.ptr to i64*
|
|
store i64 %conv, i64* %0, align 8
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_align64_float_int64_t(i8* nocapture %ptr, float %str) {
|
|
; CHECK-P10-LABEL: st_align64_float_int64_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: xscvdpsxds f0, f1
|
|
; CHECK-P10-NEXT: pli r4, 244140625
|
|
; CHECK-P10-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P10-NEXT: stxsdx f0, r3, r4
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-PREP10-LABEL: st_align64_float_int64_t:
|
|
; CHECK-PREP10: # %bb.0: # %entry
|
|
; CHECK-PREP10-NEXT: xscvdpsxds f0, f1
|
|
; CHECK-PREP10-NEXT: lis r4, 3725
|
|
; CHECK-PREP10-NEXT: ori r4, r4, 19025
|
|
; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-PREP10-NEXT: stxsdx f0, r3, r4
|
|
; CHECK-PREP10-NEXT: blr
|
|
entry:
|
|
%conv = fptosi float %str to i64
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1000000000000
|
|
%0 = bitcast i8* %add.ptr to i64*
|
|
store i64 %conv, i64* %0, align 8
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_reg_float_int64_t(i8* nocapture %ptr, i64 %off, float %str) {
|
|
; CHECK-LABEL: st_reg_float_int64_t:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: xscvdpsxds f0, f1
|
|
; CHECK-NEXT: stxsdx f0, r3, r4
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%conv = fptosi float %str to i64
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 %off
|
|
%0 = bitcast i8* %add.ptr to i64*
|
|
store i64 %conv, i64* %0, align 8
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_or1_float_int64_t(i64 %ptr, i8 zeroext %off, float %str) {
|
|
; CHECK-POSTP8-LABEL: st_or1_float_int64_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: xscvdpsxds v2, f1
|
|
; CHECK-POSTP8-NEXT: or r3, r4, r3
|
|
; CHECK-POSTP8-NEXT: stxsd v2, 0(r3)
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_or1_float_int64_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxds f0, f1
|
|
; CHECK-P8-NEXT: or r3, r4, r3
|
|
; CHECK-P8-NEXT: stxsdx f0, 0, r3
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptosi float %str to i64
|
|
%conv1 = zext i8 %off to i64
|
|
%or = or i64 %conv1, %ptr
|
|
%0 = inttoptr i64 %or to i64*
|
|
store i64 %conv, i64* %0, align 8
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_not_disjoint16_float_int64_t(i64 %ptr, float %str) {
|
|
; CHECK-POSTP8-LABEL: st_not_disjoint16_float_int64_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: xscvdpsxds v2, f1
|
|
; CHECK-POSTP8-NEXT: ori r3, r3, 6
|
|
; CHECK-POSTP8-NEXT: stxsd v2, 0(r3)
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_not_disjoint16_float_int64_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxds f0, f1
|
|
; CHECK-P8-NEXT: ori r3, r3, 6
|
|
; CHECK-P8-NEXT: stxsdx f0, 0, r3
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptosi float %str to i64
|
|
%or = or i64 %ptr, 6
|
|
%0 = inttoptr i64 %or to i64*
|
|
store i64 %conv, i64* %0, align 8
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_disjoint_align16_float_int64_t(i64 %ptr, float %str) {
|
|
; CHECK-POSTP8-LABEL: st_disjoint_align16_float_int64_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: xscvdpsxds v2, f1
|
|
; CHECK-POSTP8-NEXT: rldicr r3, r3, 0, 51
|
|
; CHECK-POSTP8-NEXT: stxsd v2, 24(r3)
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_disjoint_align16_float_int64_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxds f0, f1
|
|
; CHECK-P8-NEXT: rldicr r3, r3, 0, 51
|
|
; CHECK-P8-NEXT: ori r3, r3, 24
|
|
; CHECK-P8-NEXT: stxsdx f0, 0, r3
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%and = and i64 %ptr, -4096
|
|
%conv = fptosi float %str to i64
|
|
%or = or i64 %and, 24
|
|
%0 = inttoptr i64 %or to i64*
|
|
store i64 %conv, i64* %0, align 8
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_not_disjoint32_float_int64_t(i64 %ptr, float %str) {
|
|
; CHECK-POSTP8-LABEL: st_not_disjoint32_float_int64_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: xscvdpsxds v2, f1
|
|
; CHECK-POSTP8-NEXT: ori r3, r3, 34463
|
|
; CHECK-POSTP8-NEXT: oris r3, r3, 1
|
|
; CHECK-POSTP8-NEXT: stxsd v2, 0(r3)
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_not_disjoint32_float_int64_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxds f0, f1
|
|
; CHECK-P8-NEXT: ori r3, r3, 34463
|
|
; CHECK-P8-NEXT: oris r3, r3, 1
|
|
; CHECK-P8-NEXT: stxsdx f0, 0, r3
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptosi float %str to i64
|
|
%or = or i64 %ptr, 99999
|
|
%0 = inttoptr i64 %or to i64*
|
|
store i64 %conv, i64* %0, align 8
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_disjoint_align32_float_int64_t(i64 %ptr, float %str) {
|
|
; CHECK-P10-LABEL: st_disjoint_align32_float_int64_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: xscvdpsxds f0, f1
|
|
; CHECK-P10-NEXT: lis r4, -15264
|
|
; CHECK-P10-NEXT: and r3, r3, r4
|
|
; CHECK-P10-NEXT: pli r4, 999990000
|
|
; CHECK-P10-NEXT: stxsdx f0, r3, r4
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: st_disjoint_align32_float_int64_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: xscvdpsxds f0, f1
|
|
; CHECK-P9-NEXT: lis r4, -15264
|
|
; CHECK-P9-NEXT: and r3, r3, r4
|
|
; CHECK-P9-NEXT: lis r4, 15258
|
|
; CHECK-P9-NEXT: ori r4, r4, 41712
|
|
; CHECK-P9-NEXT: stxsdx f0, r3, r4
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_disjoint_align32_float_int64_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxds f0, f1
|
|
; CHECK-P8-NEXT: lis r4, -15264
|
|
; CHECK-P8-NEXT: lis r5, 15258
|
|
; CHECK-P8-NEXT: and r3, r3, r4
|
|
; CHECK-P8-NEXT: ori r4, r5, 41712
|
|
; CHECK-P8-NEXT: stxsdx f0, r3, r4
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%and = and i64 %ptr, -1000341504
|
|
%conv = fptosi float %str to i64
|
|
%or = or i64 %and, 999990000
|
|
%0 = inttoptr i64 %or to i64*
|
|
store i64 %conv, i64* %0, align 16
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_not_disjoint64_float_int64_t(i64 %ptr, float %str) {
|
|
; CHECK-P10-LABEL: st_not_disjoint64_float_int64_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: xscvdpsxds v2, f1
|
|
; CHECK-P10-NEXT: pli r4, 232
|
|
; CHECK-P10-NEXT: pli r5, 3567587329
|
|
; CHECK-P10-NEXT: rldimi r5, r4, 32, 0
|
|
; CHECK-P10-NEXT: or r3, r3, r5
|
|
; CHECK-P10-NEXT: stxsd v2, 0(r3)
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: st_not_disjoint64_float_int64_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: li r4, 29
|
|
; CHECK-P9-NEXT: xscvdpsxds v2, f1
|
|
; CHECK-P9-NEXT: rldic r4, r4, 35, 24
|
|
; CHECK-P9-NEXT: oris r4, r4, 54437
|
|
; CHECK-P9-NEXT: ori r4, r4, 4097
|
|
; CHECK-P9-NEXT: or r3, r3, r4
|
|
; CHECK-P9-NEXT: stxsd v2, 0(r3)
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_not_disjoint64_float_int64_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxds f0, f1
|
|
; CHECK-P8-NEXT: li r4, 29
|
|
; CHECK-P8-NEXT: rldic r4, r4, 35, 24
|
|
; CHECK-P8-NEXT: oris r4, r4, 54437
|
|
; CHECK-P8-NEXT: ori r4, r4, 4097
|
|
; CHECK-P8-NEXT: or r3, r3, r4
|
|
; CHECK-P8-NEXT: stxsdx f0, 0, r3
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptosi float %str to i64
|
|
%or = or i64 %ptr, 1000000000001
|
|
%0 = inttoptr i64 %or to i64*
|
|
store i64 %conv, i64* %0, align 8
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_disjoint_align64_float_int64_t(i64 %ptr, float %str) {
|
|
; CHECK-P10-LABEL: st_disjoint_align64_float_int64_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: xscvdpsxds f0, f1
|
|
; CHECK-P10-NEXT: pli r4, 244140625
|
|
; CHECK-P10-NEXT: rldicr r3, r3, 0, 23
|
|
; CHECK-P10-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P10-NEXT: stxsdx f0, r3, r4
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-PREP10-LABEL: st_disjoint_align64_float_int64_t:
|
|
; CHECK-PREP10: # %bb.0: # %entry
|
|
; CHECK-PREP10-NEXT: xscvdpsxds f0, f1
|
|
; CHECK-PREP10-NEXT: lis r4, 3725
|
|
; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23
|
|
; CHECK-PREP10-NEXT: ori r4, r4, 19025
|
|
; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-PREP10-NEXT: stxsdx f0, r3, r4
|
|
; CHECK-PREP10-NEXT: blr
|
|
entry:
|
|
%and = and i64 %ptr, -1099511627776
|
|
%conv = fptosi float %str to i64
|
|
%or = or i64 %and, 1000000000000
|
|
%0 = inttoptr i64 %or to i64*
|
|
store i64 %conv, i64* %0, align 4096
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_cst_align16_float_int64_t(float %str) {
|
|
; CHECK-POSTP8-LABEL: st_cst_align16_float_int64_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: xscvdpsxds v2, f1
|
|
; CHECK-POSTP8-NEXT: stxsd v2, 4080(0)
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_cst_align16_float_int64_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxds f0, f1
|
|
; CHECK-P8-NEXT: li r3, 4080
|
|
; CHECK-P8-NEXT: stxsdx f0, 0, r3
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptosi float %str to i64
|
|
store i64 %conv, i64* inttoptr (i64 4080 to i64*), align 16
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_cst_align32_float_int64_t(float %str) {
|
|
; CHECK-POSTP8-LABEL: st_cst_align32_float_int64_t:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: xscvdpsxds v2, f1
|
|
; CHECK-POSTP8-NEXT: lis r3, 153
|
|
; CHECK-POSTP8-NEXT: stxsd v2, -27108(r3)
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_cst_align32_float_int64_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxds f0, f1
|
|
; CHECK-P8-NEXT: lis r3, 152
|
|
; CHECK-P8-NEXT: ori r3, r3, 38428
|
|
; CHECK-P8-NEXT: stxsdx f0, 0, r3
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptosi float %str to i64
|
|
store i64 %conv, i64* inttoptr (i64 9999900 to i64*), align 8
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_cst_align64_float_int64_t(float %str) {
|
|
; CHECK-P10-LABEL: st_cst_align64_float_int64_t:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: xscvdpsxds v2, f1
|
|
; CHECK-P10-NEXT: pli r3, 244140625
|
|
; CHECK-P10-NEXT: rldic r3, r3, 12, 24
|
|
; CHECK-P10-NEXT: stxsd v2, 0(r3)
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: st_cst_align64_float_int64_t:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: xscvdpsxds v2, f1
|
|
; CHECK-P9-NEXT: lis r3, 3725
|
|
; CHECK-P9-NEXT: ori r3, r3, 19025
|
|
; CHECK-P9-NEXT: rldic r3, r3, 12, 24
|
|
; CHECK-P9-NEXT: stxsd v2, 0(r3)
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_cst_align64_float_int64_t:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: xscvdpsxds f0, f1
|
|
; CHECK-P8-NEXT: lis r3, 3725
|
|
; CHECK-P8-NEXT: ori r3, r3, 19025
|
|
; CHECK-P8-NEXT: rldic r3, r3, 12, 24
|
|
; CHECK-P8-NEXT: stxsdx f0, 0, r3
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fptosi float %str to i64
|
|
store i64 %conv, i64* inttoptr (i64 1000000000000 to i64*), align 4096
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_0_float_float(i64 %ptr, float %str) {
|
|
; CHECK-POSTP8-LABEL: st_0_float_float:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: stfs f1, 0(r3)
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_0_float_float:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: stfsx f1, 0, r3
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%0 = inttoptr i64 %ptr to float*
|
|
store float %str, float* %0, align 4
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_align16_float_float(i8* nocapture %ptr, float %str) {
|
|
; CHECK-LABEL: st_align16_float_float:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: stfs f1, 8(r3)
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 8
|
|
%0 = bitcast i8* %add.ptr to float*
|
|
store float %str, float* %0, align 4
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_align32_float_float(i8* nocapture %ptr, float %str) {
|
|
; CHECK-P10-LABEL: st_align32_float_float:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: pli r4, 99999000
|
|
; CHECK-P10-NEXT: stfsx f1, r3, r4
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-PREP10-LABEL: st_align32_float_float:
|
|
; CHECK-PREP10: # %bb.0: # %entry
|
|
; CHECK-PREP10-NEXT: lis r4, 1525
|
|
; CHECK-PREP10-NEXT: ori r4, r4, 56600
|
|
; CHECK-PREP10-NEXT: stfsx f1, r3, r4
|
|
; CHECK-PREP10-NEXT: blr
|
|
entry:
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 99999000
|
|
%0 = bitcast i8* %add.ptr to float*
|
|
store float %str, float* %0, align 4
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_align64_float_float(i8* nocapture %ptr, float %str) {
|
|
; CHECK-P10-LABEL: st_align64_float_float:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: pli r4, 244140625
|
|
; CHECK-P10-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P10-NEXT: stfsx f1, r3, r4
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-PREP10-LABEL: st_align64_float_float:
|
|
; CHECK-PREP10: # %bb.0: # %entry
|
|
; CHECK-PREP10-NEXT: lis r4, 3725
|
|
; CHECK-PREP10-NEXT: ori r4, r4, 19025
|
|
; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-PREP10-NEXT: stfsx f1, r3, r4
|
|
; CHECK-PREP10-NEXT: blr
|
|
entry:
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1000000000000
|
|
%0 = bitcast i8* %add.ptr to float*
|
|
store float %str, float* %0, align 4
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_reg_float_float(i8* nocapture %ptr, i64 %off, float %str) {
|
|
; CHECK-LABEL: st_reg_float_float:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: stfsx f1, r3, r4
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 %off
|
|
%0 = bitcast i8* %add.ptr to float*
|
|
store float %str, float* %0, align 4
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_or1_float_float(i64 %ptr, i8 zeroext %off, float %str) {
|
|
; CHECK-POSTP8-LABEL: st_or1_float_float:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: or r3, r4, r3
|
|
; CHECK-POSTP8-NEXT: stfs f1, 0(r3)
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_or1_float_float:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: or r3, r4, r3
|
|
; CHECK-P8-NEXT: stfsx f1, 0, r3
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = zext i8 %off to i64
|
|
%or = or i64 %conv, %ptr
|
|
%0 = inttoptr i64 %or to float*
|
|
store float %str, float* %0, align 4
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_not_disjoint16_float_float(i64 %ptr, float %str) {
|
|
; CHECK-POSTP8-LABEL: st_not_disjoint16_float_float:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: ori r3, r3, 6
|
|
; CHECK-POSTP8-NEXT: stfs f1, 0(r3)
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_not_disjoint16_float_float:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: ori r3, r3, 6
|
|
; CHECK-P8-NEXT: stfsx f1, 0, r3
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%or = or i64 %ptr, 6
|
|
%0 = inttoptr i64 %or to float*
|
|
store float %str, float* %0, align 4
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_disjoint_align16_float_float(i64 %ptr, float %str) {
|
|
; CHECK-POSTP8-LABEL: st_disjoint_align16_float_float:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: rldicr r3, r3, 0, 51
|
|
; CHECK-POSTP8-NEXT: stfs f1, 24(r3)
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_disjoint_align16_float_float:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: rldicr r3, r3, 0, 51
|
|
; CHECK-P8-NEXT: ori r3, r3, 24
|
|
; CHECK-P8-NEXT: stfsx f1, 0, r3
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%and = and i64 %ptr, -4096
|
|
%or = or i64 %and, 24
|
|
%0 = inttoptr i64 %or to float*
|
|
store float %str, float* %0, align 8
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_not_disjoint32_float_float(i64 %ptr, float %str) {
|
|
; CHECK-POSTP8-LABEL: st_not_disjoint32_float_float:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: ori r3, r3, 34463
|
|
; CHECK-POSTP8-NEXT: oris r3, r3, 1
|
|
; CHECK-POSTP8-NEXT: stfs f1, 0(r3)
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_not_disjoint32_float_float:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: ori r3, r3, 34463
|
|
; CHECK-P8-NEXT: oris r3, r3, 1
|
|
; CHECK-P8-NEXT: stfsx f1, 0, r3
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%or = or i64 %ptr, 99999
|
|
%0 = inttoptr i64 %or to float*
|
|
store float %str, float* %0, align 4
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_disjoint_align32_float_float(i64 %ptr, float %str) {
|
|
; CHECK-P10-LABEL: st_disjoint_align32_float_float:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: lis r4, -15264
|
|
; CHECK-P10-NEXT: and r3, r3, r4
|
|
; CHECK-P10-NEXT: pli r4, 999990000
|
|
; CHECK-P10-NEXT: stfsx f1, r3, r4
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: st_disjoint_align32_float_float:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: lis r4, -15264
|
|
; CHECK-P9-NEXT: and r3, r3, r4
|
|
; CHECK-P9-NEXT: lis r4, 15258
|
|
; CHECK-P9-NEXT: ori r4, r4, 41712
|
|
; CHECK-P9-NEXT: stfsx f1, r3, r4
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_disjoint_align32_float_float:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: lis r4, -15264
|
|
; CHECK-P8-NEXT: lis r5, 15258
|
|
; CHECK-P8-NEXT: and r3, r3, r4
|
|
; CHECK-P8-NEXT: ori r4, r5, 41712
|
|
; CHECK-P8-NEXT: stfsx f1, r3, r4
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%and = and i64 %ptr, -1000341504
|
|
%or = or i64 %and, 999990000
|
|
%0 = inttoptr i64 %or to float*
|
|
store float %str, float* %0, align 16
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_not_disjoint64_float_float(i64 %ptr, float %str) {
|
|
; CHECK-P10-LABEL: st_not_disjoint64_float_float:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: pli r4, 232
|
|
; CHECK-P10-NEXT: pli r5, 3567587329
|
|
; CHECK-P10-NEXT: rldimi r5, r4, 32, 0
|
|
; CHECK-P10-NEXT: or r3, r3, r5
|
|
; CHECK-P10-NEXT: stfs f1, 0(r3)
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: st_not_disjoint64_float_float:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: li r4, 29
|
|
; CHECK-P9-NEXT: rldic r4, r4, 35, 24
|
|
; CHECK-P9-NEXT: oris r4, r4, 54437
|
|
; CHECK-P9-NEXT: ori r4, r4, 4097
|
|
; CHECK-P9-NEXT: or r3, r3, r4
|
|
; CHECK-P9-NEXT: stfs f1, 0(r3)
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_not_disjoint64_float_float:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: li r4, 29
|
|
; CHECK-P8-NEXT: rldic r4, r4, 35, 24
|
|
; CHECK-P8-NEXT: oris r4, r4, 54437
|
|
; CHECK-P8-NEXT: ori r4, r4, 4097
|
|
; CHECK-P8-NEXT: or r3, r3, r4
|
|
; CHECK-P8-NEXT: stfsx f1, 0, r3
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%or = or i64 %ptr, 1000000000001
|
|
%0 = inttoptr i64 %or to float*
|
|
store float %str, float* %0, align 4
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_disjoint_align64_float_float(i64 %ptr, float %str) {
|
|
; CHECK-P10-LABEL: st_disjoint_align64_float_float:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: pli r4, 244140625
|
|
; CHECK-P10-NEXT: rldicr r3, r3, 0, 23
|
|
; CHECK-P10-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P10-NEXT: stfsx f1, r3, r4
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-PREP10-LABEL: st_disjoint_align64_float_float:
|
|
; CHECK-PREP10: # %bb.0: # %entry
|
|
; CHECK-PREP10-NEXT: lis r4, 3725
|
|
; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23
|
|
; CHECK-PREP10-NEXT: ori r4, r4, 19025
|
|
; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-PREP10-NEXT: stfsx f1, r3, r4
|
|
; CHECK-PREP10-NEXT: blr
|
|
entry:
|
|
%and = and i64 %ptr, -1099511627776
|
|
%or = or i64 %and, 1000000000000
|
|
%0 = inttoptr i64 %or to float*
|
|
store float %str, float* %0, align 4096
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_cst_align16_float_float(float %str) {
|
|
; CHECK-LABEL: st_cst_align16_float_float:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: stfs f1, 4080(0)
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
store float %str, float* inttoptr (i64 4080 to float*), align 16
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_cst_align32_float_float(float %str) {
|
|
; CHECK-POSTP8-LABEL: st_cst_align32_float_float:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: lis r3, 153
|
|
; CHECK-POSTP8-NEXT: stfs f1, -27108(r3)
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_cst_align32_float_float:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: lis r3, 152
|
|
; CHECK-P8-NEXT: ori r3, r3, 38428
|
|
; CHECK-P8-NEXT: stfsx f1, 0, r3
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
store float %str, float* inttoptr (i64 9999900 to float*), align 4
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_cst_align64_float_float(float %str) {
|
|
; CHECK-P10-LABEL: st_cst_align64_float_float:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: pli r3, 244140625
|
|
; CHECK-P10-NEXT: rldic r3, r3, 12, 24
|
|
; CHECK-P10-NEXT: stfs f1, 0(r3)
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: st_cst_align64_float_float:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: lis r3, 3725
|
|
; CHECK-P9-NEXT: ori r3, r3, 19025
|
|
; CHECK-P9-NEXT: rldic r3, r3, 12, 24
|
|
; CHECK-P9-NEXT: stfs f1, 0(r3)
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_cst_align64_float_float:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: lis r3, 3725
|
|
; CHECK-P8-NEXT: ori r3, r3, 19025
|
|
; CHECK-P8-NEXT: rldic r3, r3, 12, 24
|
|
; CHECK-P8-NEXT: stfsx f1, 0, r3
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
store float %str, float* inttoptr (i64 1000000000000 to float*), align 4096
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_0_float_double(i64 %ptr, float %str) {
|
|
; CHECK-POSTP8-LABEL: st_0_float_double:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: stfd f1, 0(r3)
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_0_float_double:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: stfdx f1, 0, r3
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fpext float %str to double
|
|
%0 = inttoptr i64 %ptr to double*
|
|
store double %conv, double* %0, align 8
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_align16_float_double(i8* nocapture %ptr, float %str) {
|
|
; CHECK-LABEL: st_align16_float_double:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: stfd f1, 8(r3)
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%conv = fpext float %str to double
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 8
|
|
%0 = bitcast i8* %add.ptr to double*
|
|
store double %conv, double* %0, align 8
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_align32_float_double(i8* nocapture %ptr, float %str) {
|
|
; CHECK-P10-LABEL: st_align32_float_double:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: pli r4, 99999000
|
|
; CHECK-P10-NEXT: stfdx f1, r3, r4
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-PREP10-LABEL: st_align32_float_double:
|
|
; CHECK-PREP10: # %bb.0: # %entry
|
|
; CHECK-PREP10-NEXT: lis r4, 1525
|
|
; CHECK-PREP10-NEXT: ori r4, r4, 56600
|
|
; CHECK-PREP10-NEXT: stfdx f1, r3, r4
|
|
; CHECK-PREP10-NEXT: blr
|
|
entry:
|
|
%conv = fpext float %str to double
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 99999000
|
|
%0 = bitcast i8* %add.ptr to double*
|
|
store double %conv, double* %0, align 8
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_align64_float_double(i8* nocapture %ptr, float %str) {
|
|
; CHECK-P10-LABEL: st_align64_float_double:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: pli r4, 244140625
|
|
; CHECK-P10-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P10-NEXT: stfdx f1, r3, r4
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-PREP10-LABEL: st_align64_float_double:
|
|
; CHECK-PREP10: # %bb.0: # %entry
|
|
; CHECK-PREP10-NEXT: lis r4, 3725
|
|
; CHECK-PREP10-NEXT: ori r4, r4, 19025
|
|
; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-PREP10-NEXT: stfdx f1, r3, r4
|
|
; CHECK-PREP10-NEXT: blr
|
|
entry:
|
|
%conv = fpext float %str to double
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1000000000000
|
|
%0 = bitcast i8* %add.ptr to double*
|
|
store double %conv, double* %0, align 8
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_reg_float_double(i8* nocapture %ptr, i64 %off, float %str) {
|
|
; CHECK-LABEL: st_reg_float_double:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: stfdx f1, r3, r4
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%conv = fpext float %str to double
|
|
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 %off
|
|
%0 = bitcast i8* %add.ptr to double*
|
|
store double %conv, double* %0, align 8
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_or1_float_double(i64 %ptr, i8 zeroext %off, float %str) {
|
|
; CHECK-POSTP8-LABEL: st_or1_float_double:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: or r3, r4, r3
|
|
; CHECK-POSTP8-NEXT: stfd f1, 0(r3)
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_or1_float_double:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: or r3, r4, r3
|
|
; CHECK-P8-NEXT: stfdx f1, 0, r3
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fpext float %str to double
|
|
%conv1 = zext i8 %off to i64
|
|
%or = or i64 %conv1, %ptr
|
|
%0 = inttoptr i64 %or to double*
|
|
store double %conv, double* %0, align 8
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_not_disjoint16_float_double(i64 %ptr, float %str) {
|
|
; CHECK-POSTP8-LABEL: st_not_disjoint16_float_double:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: ori r3, r3, 6
|
|
; CHECK-POSTP8-NEXT: stfd f1, 0(r3)
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_not_disjoint16_float_double:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: ori r3, r3, 6
|
|
; CHECK-P8-NEXT: stfdx f1, 0, r3
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fpext float %str to double
|
|
%or = or i64 %ptr, 6
|
|
%0 = inttoptr i64 %or to double*
|
|
store double %conv, double* %0, align 8
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_disjoint_align16_float_double(i64 %ptr, float %str) {
|
|
; CHECK-POSTP8-LABEL: st_disjoint_align16_float_double:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: rldicr r3, r3, 0, 51
|
|
; CHECK-POSTP8-NEXT: stfd f1, 24(r3)
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_disjoint_align16_float_double:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: rldicr r3, r3, 0, 51
|
|
; CHECK-P8-NEXT: ori r3, r3, 24
|
|
; CHECK-P8-NEXT: stfdx f1, 0, r3
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%and = and i64 %ptr, -4096
|
|
%conv = fpext float %str to double
|
|
%or = or i64 %and, 24
|
|
%0 = inttoptr i64 %or to double*
|
|
store double %conv, double* %0, align 8
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_not_disjoint32_float_double(i64 %ptr, float %str) {
|
|
; CHECK-POSTP8-LABEL: st_not_disjoint32_float_double:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: ori r3, r3, 34463
|
|
; CHECK-POSTP8-NEXT: oris r3, r3, 1
|
|
; CHECK-POSTP8-NEXT: stfd f1, 0(r3)
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_not_disjoint32_float_double:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: ori r3, r3, 34463
|
|
; CHECK-P8-NEXT: oris r3, r3, 1
|
|
; CHECK-P8-NEXT: stfdx f1, 0, r3
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fpext float %str to double
|
|
%or = or i64 %ptr, 99999
|
|
%0 = inttoptr i64 %or to double*
|
|
store double %conv, double* %0, align 8
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_disjoint_align32_float_double(i64 %ptr, float %str) {
|
|
; CHECK-P10-LABEL: st_disjoint_align32_float_double:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: lis r4, -15264
|
|
; CHECK-P10-NEXT: and r3, r3, r4
|
|
; CHECK-P10-NEXT: pli r4, 999990000
|
|
; CHECK-P10-NEXT: stfdx f1, r3, r4
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: st_disjoint_align32_float_double:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: lis r4, -15264
|
|
; CHECK-P9-NEXT: and r3, r3, r4
|
|
; CHECK-P9-NEXT: lis r4, 15258
|
|
; CHECK-P9-NEXT: ori r4, r4, 41712
|
|
; CHECK-P9-NEXT: stfdx f1, r3, r4
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_disjoint_align32_float_double:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: lis r4, -15264
|
|
; CHECK-P8-NEXT: lis r5, 15258
|
|
; CHECK-P8-NEXT: and r3, r3, r4
|
|
; CHECK-P8-NEXT: ori r4, r5, 41712
|
|
; CHECK-P8-NEXT: stfdx f1, r3, r4
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%and = and i64 %ptr, -1000341504
|
|
%conv = fpext float %str to double
|
|
%or = or i64 %and, 999990000
|
|
%0 = inttoptr i64 %or to double*
|
|
store double %conv, double* %0, align 16
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_not_disjoint64_float_double(i64 %ptr, float %str) {
|
|
; CHECK-P10-LABEL: st_not_disjoint64_float_double:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: pli r4, 232
|
|
; CHECK-P10-NEXT: pli r5, 3567587329
|
|
; CHECK-P10-NEXT: rldimi r5, r4, 32, 0
|
|
; CHECK-P10-NEXT: or r3, r3, r5
|
|
; CHECK-P10-NEXT: stfd f1, 0(r3)
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: st_not_disjoint64_float_double:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: li r4, 29
|
|
; CHECK-P9-NEXT: rldic r4, r4, 35, 24
|
|
; CHECK-P9-NEXT: oris r4, r4, 54437
|
|
; CHECK-P9-NEXT: ori r4, r4, 4097
|
|
; CHECK-P9-NEXT: or r3, r3, r4
|
|
; CHECK-P9-NEXT: stfd f1, 0(r3)
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_not_disjoint64_float_double:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: li r4, 29
|
|
; CHECK-P8-NEXT: rldic r4, r4, 35, 24
|
|
; CHECK-P8-NEXT: oris r4, r4, 54437
|
|
; CHECK-P8-NEXT: ori r4, r4, 4097
|
|
; CHECK-P8-NEXT: or r3, r3, r4
|
|
; CHECK-P8-NEXT: stfdx f1, 0, r3
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fpext float %str to double
|
|
%or = or i64 %ptr, 1000000000001
|
|
%0 = inttoptr i64 %or to double*
|
|
store double %conv, double* %0, align 8
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_disjoint_align64_float_double(i64 %ptr, float %str) {
|
|
; CHECK-P10-LABEL: st_disjoint_align64_float_double:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: pli r4, 244140625
|
|
; CHECK-P10-NEXT: rldicr r3, r3, 0, 23
|
|
; CHECK-P10-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-P10-NEXT: stfdx f1, r3, r4
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-PREP10-LABEL: st_disjoint_align64_float_double:
|
|
; CHECK-PREP10: # %bb.0: # %entry
|
|
; CHECK-PREP10-NEXT: lis r4, 3725
|
|
; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23
|
|
; CHECK-PREP10-NEXT: ori r4, r4, 19025
|
|
; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24
|
|
; CHECK-PREP10-NEXT: stfdx f1, r3, r4
|
|
; CHECK-PREP10-NEXT: blr
|
|
entry:
|
|
%and = and i64 %ptr, -1099511627776
|
|
%conv = fpext float %str to double
|
|
%or = or i64 %and, 1000000000000
|
|
%0 = inttoptr i64 %or to double*
|
|
store double %conv, double* %0, align 4096
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_cst_align16_float_double(float %str) {
|
|
; CHECK-LABEL: st_cst_align16_float_double:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: stfd f1, 4080(0)
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%conv = fpext float %str to double
|
|
store double %conv, double* inttoptr (i64 4080 to double*), align 16
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_cst_align32_float_double(float %str) {
|
|
; CHECK-POSTP8-LABEL: st_cst_align32_float_double:
|
|
; CHECK-POSTP8: # %bb.0: # %entry
|
|
; CHECK-POSTP8-NEXT: lis r3, 153
|
|
; CHECK-POSTP8-NEXT: stfd f1, -27108(r3)
|
|
; CHECK-POSTP8-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_cst_align32_float_double:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: lis r3, 152
|
|
; CHECK-P8-NEXT: ori r3, r3, 38428
|
|
; CHECK-P8-NEXT: stfdx f1, 0, r3
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fpext float %str to double
|
|
store double %conv, double* inttoptr (i64 9999900 to double*), align 8
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
|
|
define dso_local void @st_cst_align64_float_double(float %str) {
|
|
; CHECK-P10-LABEL: st_cst_align64_float_double:
|
|
; CHECK-P10: # %bb.0: # %entry
|
|
; CHECK-P10-NEXT: pli r3, 244140625
|
|
; CHECK-P10-NEXT: rldic r3, r3, 12, 24
|
|
; CHECK-P10-NEXT: stfd f1, 0(r3)
|
|
; CHECK-P10-NEXT: blr
|
|
;
|
|
; CHECK-P9-LABEL: st_cst_align64_float_double:
|
|
; CHECK-P9: # %bb.0: # %entry
|
|
; CHECK-P9-NEXT: lis r3, 3725
|
|
; CHECK-P9-NEXT: ori r3, r3, 19025
|
|
; CHECK-P9-NEXT: rldic r3, r3, 12, 24
|
|
; CHECK-P9-NEXT: stfd f1, 0(r3)
|
|
; CHECK-P9-NEXT: blr
|
|
;
|
|
; CHECK-P8-LABEL: st_cst_align64_float_double:
|
|
; CHECK-P8: # %bb.0: # %entry
|
|
; CHECK-P8-NEXT: lis r3, 3725
|
|
; CHECK-P8-NEXT: ori r3, r3, 19025
|
|
; CHECK-P8-NEXT: rldic r3, r3, 12, 24
|
|
; CHECK-P8-NEXT: stfdx f1, 0, r3
|
|
; CHECK-P8-NEXT: blr
|
|
entry:
|
|
%conv = fpext float %str to double
|
|
store double %conv, double* inttoptr (i64 1000000000000 to double*), align 4096
|
|
ret void
|
|
}
|