blob: 473e3e644205b1683f1cd22fa716a39842057f3e [file] [log] [blame]
; 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-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-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-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-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 i64 @ld_0_int64_t_float(i64 %ptr) {
; CHECK-P10-LABEL: ld_0_int64_t_float:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: lfs f0, 0(r3)
; CHECK-P10-NEXT: xscvdpsxds f0, f0
; CHECK-P10-NEXT: mffprd r3, f0
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: ld_0_int64_t_float:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: lfs f0, 0(r3)
; CHECK-P9-NEXT: xscvdpsxds f0, f0
; CHECK-P9-NEXT: mffprd r3, f0
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: ld_0_int64_t_float:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: lfsx f0, 0, r3
; CHECK-P8-NEXT: xscvdpsxds f0, f0
; CHECK-P8-NEXT: mffprd r3, f0
; CHECK-P8-NEXT: blr
entry:
%0 = inttoptr i64 %ptr to float*
%1 = load float, float* %0, align 4
%conv = fptosi float %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_align16_int64_t_float(i8* nocapture readonly %ptr) {
; CHECK-LABEL: ld_align16_int64_t_float:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lfs f0, 8(r3)
; CHECK-NEXT: xscvdpsxds f0, f0
; CHECK-NEXT: mffprd r3, f0
; 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
%conv = fptosi float %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_align32_int64_t_float(i8* nocapture readonly %ptr) {
; CHECK-P10-LABEL: ld_align32_int64_t_float:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r4, 99999000
; CHECK-P10-NEXT: lfsx f0, r3, r4
; CHECK-P10-NEXT: xscvdpsxds f0, f0
; CHECK-P10-NEXT: mffprd r3, f0
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_align32_int64_t_float:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: lis r4, 1525
; CHECK-PREP10-NEXT: ori r4, r4, 56600
; CHECK-PREP10-NEXT: lfsx f0, r3, r4
; CHECK-PREP10-NEXT: xscvdpsxds f0, f0
; CHECK-PREP10-NEXT: mffprd r3, f0
; 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
%conv = fptosi float %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_align64_int64_t_float(i8* nocapture readonly %ptr) {
; CHECK-P10-LABEL: ld_align64_int64_t_float:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r4, 244140625
; CHECK-P10-NEXT: rldic r4, r4, 12, 24
; CHECK-P10-NEXT: lfsx f0, r3, r4
; CHECK-P10-NEXT: xscvdpsxds f0, f0
; CHECK-P10-NEXT: mffprd r3, f0
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_align64_int64_t_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 f0, r3, r4
; CHECK-PREP10-NEXT: xscvdpsxds f0, f0
; CHECK-PREP10-NEXT: mffprd r3, f0
; 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
%conv = fptosi float %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_reg_int64_t_float(i8* nocapture readonly %ptr, i64 %off) {
; CHECK-LABEL: ld_reg_int64_t_float:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lfsx f0, r3, r4
; CHECK-NEXT: xscvdpsxds f0, f0
; CHECK-NEXT: mffprd r3, f0
; 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
%conv = fptosi float %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_or_int64_t_float(i64 %ptr, i8 zeroext %off) {
; CHECK-P10-LABEL: ld_or_int64_t_float:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: or r3, r4, r3
; CHECK-P10-NEXT: lfs f0, 0(r3)
; CHECK-P10-NEXT: xscvdpsxds f0, f0
; CHECK-P10-NEXT: mffprd r3, f0
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: ld_or_int64_t_float:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: or r3, r4, r3
; CHECK-P9-NEXT: lfs f0, 0(r3)
; CHECK-P9-NEXT: xscvdpsxds f0, f0
; CHECK-P9-NEXT: mffprd r3, f0
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: ld_or_int64_t_float:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: or r3, r4, r3
; CHECK-P8-NEXT: lfsx f0, 0, r3
; CHECK-P8-NEXT: xscvdpsxds f0, f0
; CHECK-P8-NEXT: mffprd r3, f0
; 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
%conv1 = fptosi float %1 to i64
ret i64 %conv1
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_not_disjoint16_int64_t_float(i64 %ptr) {
; CHECK-P10-LABEL: ld_not_disjoint16_int64_t_float:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: ori r3, r3, 6
; CHECK-P10-NEXT: lfs f0, 0(r3)
; CHECK-P10-NEXT: xscvdpsxds f0, f0
; CHECK-P10-NEXT: mffprd r3, f0
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: ld_not_disjoint16_int64_t_float:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: ori r3, r3, 6
; CHECK-P9-NEXT: lfs f0, 0(r3)
; CHECK-P9-NEXT: xscvdpsxds f0, f0
; CHECK-P9-NEXT: mffprd r3, f0
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: ld_not_disjoint16_int64_t_float:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: ori r3, r3, 6
; CHECK-P8-NEXT: lfsx f0, 0, r3
; CHECK-P8-NEXT: xscvdpsxds f0, f0
; CHECK-P8-NEXT: mffprd r3, f0
; CHECK-P8-NEXT: blr
entry:
%or = or i64 %ptr, 6
%0 = inttoptr i64 %or to float*
%1 = load float, float* %0, align 4
%conv = fptosi float %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_disjoint_align16_int64_t_float(i64 %ptr) {
; CHECK-P10-LABEL: ld_disjoint_align16_int64_t_float:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: rldicr r3, r3, 0, 51
; CHECK-P10-NEXT: lfs f0, 24(r3)
; CHECK-P10-NEXT: xscvdpsxds f0, f0
; CHECK-P10-NEXT: mffprd r3, f0
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: ld_disjoint_align16_int64_t_float:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: rldicr r3, r3, 0, 51
; CHECK-P9-NEXT: lfs f0, 24(r3)
; CHECK-P9-NEXT: xscvdpsxds f0, f0
; CHECK-P9-NEXT: mffprd r3, f0
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: ld_disjoint_align16_int64_t_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 f0, 0, r3
; CHECK-P8-NEXT: xscvdpsxds f0, f0
; CHECK-P8-NEXT: mffprd r3, f0
; 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
%conv = fptosi float %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_not_disjoint32_int64_t_float(i64 %ptr) {
; CHECK-P10-LABEL: ld_not_disjoint32_int64_t_float:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: ori r3, r3, 34463
; CHECK-P10-NEXT: oris r3, r3, 1
; CHECK-P10-NEXT: lfs f0, 0(r3)
; CHECK-P10-NEXT: xscvdpsxds f0, f0
; CHECK-P10-NEXT: mffprd r3, f0
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: ld_not_disjoint32_int64_t_float:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: ori r3, r3, 34463
; CHECK-P9-NEXT: oris r3, r3, 1
; CHECK-P9-NEXT: lfs f0, 0(r3)
; CHECK-P9-NEXT: xscvdpsxds f0, f0
; CHECK-P9-NEXT: mffprd r3, f0
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: ld_not_disjoint32_int64_t_float:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: ori r3, r3, 34463
; CHECK-P8-NEXT: oris r3, r3, 1
; CHECK-P8-NEXT: lfsx f0, 0, r3
; CHECK-P8-NEXT: xscvdpsxds f0, f0
; CHECK-P8-NEXT: mffprd r3, f0
; CHECK-P8-NEXT: blr
entry:
%or = or i64 %ptr, 99999
%0 = inttoptr i64 %or to float*
%1 = load float, float* %0, align 4
%conv = fptosi float %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_disjoint_align32_int64_t_float(i64 %ptr) {
; CHECK-P10-LABEL: ld_disjoint_align32_int64_t_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 f0, r3, r4
; CHECK-P10-NEXT: xscvdpsxds f0, f0
; CHECK-P10-NEXT: mffprd r3, f0
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: ld_disjoint_align32_int64_t_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 f0, r3, r4
; CHECK-P9-NEXT: xscvdpsxds f0, f0
; CHECK-P9-NEXT: mffprd r3, f0
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: ld_disjoint_align32_int64_t_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 f0, r3, r4
; CHECK-P8-NEXT: xscvdpsxds f0, f0
; CHECK-P8-NEXT: mffprd r3, f0
; 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
%conv = fptosi float %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_not_disjoint64_int64_t_float(i64 %ptr) {
; CHECK-P10-LABEL: ld_not_disjoint64_int64_t_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 f0, 0(r3)
; CHECK-P10-NEXT: xscvdpsxds f0, f0
; CHECK-P10-NEXT: mffprd r3, f0
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: ld_not_disjoint64_int64_t_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 f0, 0(r3)
; CHECK-P9-NEXT: xscvdpsxds f0, f0
; CHECK-P9-NEXT: mffprd r3, f0
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: ld_not_disjoint64_int64_t_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 f0, 0, r3
; CHECK-P8-NEXT: xscvdpsxds f0, f0
; CHECK-P8-NEXT: mffprd r3, f0
; CHECK-P8-NEXT: blr
entry:
%or = or i64 %ptr, 1000000000001
%0 = inttoptr i64 %or to float*
%1 = load float, float* %0, align 4
%conv = fptosi float %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_disjoint_align64_int64_t_float(i64 %ptr) {
; CHECK-P10-LABEL: ld_disjoint_align64_int64_t_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 f0, r3, r4
; CHECK-P10-NEXT: xscvdpsxds f0, f0
; CHECK-P10-NEXT: mffprd r3, f0
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_disjoint_align64_int64_t_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 f0, r3, r4
; CHECK-PREP10-NEXT: xscvdpsxds f0, f0
; CHECK-PREP10-NEXT: mffprd r3, f0
; 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
%conv = fptosi float %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_cst_align16_int64_t_float() {
; CHECK-LABEL: ld_cst_align16_int64_t_float:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lfs f0, 4080(0)
; CHECK-NEXT: xscvdpsxds f0, f0
; CHECK-NEXT: mffprd r3, f0
; CHECK-NEXT: blr
entry:
%0 = load float, float* inttoptr (i64 4080 to float*), align 16
%conv = fptosi float %0 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_cst_align32_int64_t_float() {
; CHECK-P10-LABEL: ld_cst_align32_int64_t_float:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: lis r3, 153
; CHECK-P10-NEXT: lfs f0, -27108(r3)
; CHECK-P10-NEXT: xscvdpsxds f0, f0
; CHECK-P10-NEXT: mffprd r3, f0
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: ld_cst_align32_int64_t_float:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: lis r3, 153
; CHECK-P9-NEXT: lfs f0, -27108(r3)
; CHECK-P9-NEXT: xscvdpsxds f0, f0
; CHECK-P9-NEXT: mffprd r3, f0
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: ld_cst_align32_int64_t_float:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: lis r3, 152
; CHECK-P8-NEXT: ori r3, r3, 38428
; CHECK-P8-NEXT: lfsx f0, 0, r3
; CHECK-P8-NEXT: xscvdpsxds f0, f0
; CHECK-P8-NEXT: mffprd r3, f0
; CHECK-P8-NEXT: blr
entry:
%0 = load float, float* inttoptr (i64 9999900 to float*), align 4
%conv = fptosi float %0 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_cst_align64_int64_t_float() {
; CHECK-P10-LABEL: ld_cst_align64_int64_t_float:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r3, 244140625
; CHECK-P10-NEXT: rldic r3, r3, 12, 24
; CHECK-P10-NEXT: lfs f0, 0(r3)
; CHECK-P10-NEXT: xscvdpsxds f0, f0
; CHECK-P10-NEXT: mffprd r3, f0
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: ld_cst_align64_int64_t_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 f0, 0(r3)
; CHECK-P9-NEXT: xscvdpsxds f0, f0
; CHECK-P9-NEXT: mffprd r3, f0
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: ld_cst_align64_int64_t_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 f0, 0, r3
; CHECK-P8-NEXT: xscvdpsxds f0, f0
; CHECK-P8-NEXT: mffprd r3, f0
; CHECK-P8-NEXT: blr
entry:
%0 = load float, float* inttoptr (i64 1000000000000 to float*), align 4096
%conv = fptosi float %0 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_0_int64_t_double(i64 %ptr) {
; CHECK-P10-LABEL: ld_0_int64_t_double:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: lfd f0, 0(r3)
; CHECK-P10-NEXT: xscvdpsxds f0, f0
; CHECK-P10-NEXT: mffprd r3, f0
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: ld_0_int64_t_double:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: lfd f0, 0(r3)
; CHECK-P9-NEXT: xscvdpsxds f0, f0
; CHECK-P9-NEXT: mffprd r3, f0
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: ld_0_int64_t_double:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: lfdx f0, 0, r3
; CHECK-P8-NEXT: xscvdpsxds f0, f0
; CHECK-P8-NEXT: mffprd r3, f0
; CHECK-P8-NEXT: blr
entry:
%0 = inttoptr i64 %ptr to double*
%1 = load double, double* %0, align 8
%conv = fptosi double %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_align16_int64_t_double(i8* nocapture readonly %ptr) {
; CHECK-LABEL: ld_align16_int64_t_double:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lfd f0, 8(r3)
; CHECK-NEXT: xscvdpsxds f0, f0
; CHECK-NEXT: mffprd r3, 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 = fptosi double %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_align32_int64_t_double(i8* nocapture readonly %ptr) {
; CHECK-P10-LABEL: ld_align32_int64_t_double:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r4, 99999000
; CHECK-P10-NEXT: lfdx f0, r3, r4
; CHECK-P10-NEXT: xscvdpsxds f0, f0
; CHECK-P10-NEXT: mffprd r3, f0
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_align32_int64_t_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: xscvdpsxds f0, f0
; CHECK-PREP10-NEXT: mffprd r3, 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 = fptosi double %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_align64_int64_t_double(i8* nocapture readonly %ptr) {
; CHECK-P10-LABEL: ld_align64_int64_t_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: xscvdpsxds f0, f0
; CHECK-P10-NEXT: mffprd r3, f0
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_align64_int64_t_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: xscvdpsxds f0, f0
; CHECK-PREP10-NEXT: mffprd r3, 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 = fptosi double %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_reg_int64_t_double(i8* nocapture readonly %ptr, i64 %off) {
; CHECK-LABEL: ld_reg_int64_t_double:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lfdx f0, r3, r4
; CHECK-NEXT: xscvdpsxds f0, f0
; CHECK-NEXT: mffprd r3, 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 = fptosi double %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_or_int64_t_double(i64 %ptr, i8 zeroext %off) {
; CHECK-P10-LABEL: ld_or_int64_t_double:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: or r3, r4, r3
; CHECK-P10-NEXT: lfd f0, 0(r3)
; CHECK-P10-NEXT: xscvdpsxds f0, f0
; CHECK-P10-NEXT: mffprd r3, f0
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: ld_or_int64_t_double:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: or r3, r4, r3
; CHECK-P9-NEXT: lfd f0, 0(r3)
; CHECK-P9-NEXT: xscvdpsxds f0, f0
; CHECK-P9-NEXT: mffprd r3, f0
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: ld_or_int64_t_double:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: or r3, r4, r3
; CHECK-P8-NEXT: lfdx f0, 0, r3
; CHECK-P8-NEXT: xscvdpsxds f0, f0
; CHECK-P8-NEXT: mffprd r3, 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 = fptosi double %1 to i64
ret i64 %conv1
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_not_disjoint16_int64_t_double(i64 %ptr) {
; CHECK-P10-LABEL: ld_not_disjoint16_int64_t_double:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: ori r3, r3, 6
; CHECK-P10-NEXT: lfd f0, 0(r3)
; CHECK-P10-NEXT: xscvdpsxds f0, f0
; CHECK-P10-NEXT: mffprd r3, f0
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: ld_not_disjoint16_int64_t_double:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: ori r3, r3, 6
; CHECK-P9-NEXT: lfd f0, 0(r3)
; CHECK-P9-NEXT: xscvdpsxds f0, f0
; CHECK-P9-NEXT: mffprd r3, f0
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: ld_not_disjoint16_int64_t_double:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: ori r3, r3, 6
; CHECK-P8-NEXT: lfdx f0, 0, r3
; CHECK-P8-NEXT: xscvdpsxds f0, f0
; CHECK-P8-NEXT: mffprd r3, 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 = fptosi double %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_disjoint_align16_int64_t_double(i64 %ptr) {
; CHECK-P10-LABEL: ld_disjoint_align16_int64_t_double:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: rldicr r3, r3, 0, 51
; CHECK-P10-NEXT: lfd f0, 24(r3)
; CHECK-P10-NEXT: xscvdpsxds f0, f0
; CHECK-P10-NEXT: mffprd r3, f0
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: ld_disjoint_align16_int64_t_double:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: rldicr r3, r3, 0, 51
; CHECK-P9-NEXT: lfd f0, 24(r3)
; CHECK-P9-NEXT: xscvdpsxds f0, f0
; CHECK-P9-NEXT: mffprd r3, f0
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: ld_disjoint_align16_int64_t_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: xscvdpsxds f0, f0
; CHECK-P8-NEXT: mffprd r3, 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 = fptosi double %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_not_disjoint32_int64_t_double(i64 %ptr) {
; CHECK-P10-LABEL: ld_not_disjoint32_int64_t_double:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: ori r3, r3, 34463
; CHECK-P10-NEXT: oris r3, r3, 1
; CHECK-P10-NEXT: lfd f0, 0(r3)
; CHECK-P10-NEXT: xscvdpsxds f0, f0
; CHECK-P10-NEXT: mffprd r3, f0
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: ld_not_disjoint32_int64_t_double:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: ori r3, r3, 34463
; CHECK-P9-NEXT: oris r3, r3, 1
; CHECK-P9-NEXT: lfd f0, 0(r3)
; CHECK-P9-NEXT: xscvdpsxds f0, f0
; CHECK-P9-NEXT: mffprd r3, f0
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: ld_not_disjoint32_int64_t_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: xscvdpsxds f0, f0
; CHECK-P8-NEXT: mffprd r3, 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 = fptosi double %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_disjoint_align32_int64_t_double(i64 %ptr) {
; CHECK-P10-LABEL: ld_disjoint_align32_int64_t_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: xscvdpsxds f0, f0
; CHECK-P10-NEXT: mffprd r3, f0
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: ld_disjoint_align32_int64_t_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: xscvdpsxds f0, f0
; CHECK-P9-NEXT: mffprd r3, f0
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: ld_disjoint_align32_int64_t_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: xscvdpsxds f0, f0
; CHECK-P8-NEXT: mffprd r3, 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 = fptosi double %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_not_disjoint64_int64_t_double(i64 %ptr) {
; CHECK-P10-LABEL: ld_not_disjoint64_int64_t_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: xscvdpsxds f0, f0
; CHECK-P10-NEXT: mffprd r3, f0
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: ld_not_disjoint64_int64_t_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: xscvdpsxds f0, f0
; CHECK-P9-NEXT: mffprd r3, f0
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: ld_not_disjoint64_int64_t_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: xscvdpsxds f0, f0
; CHECK-P8-NEXT: mffprd r3, 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 = fptosi double %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_disjoint_align64_int64_t_double(i64 %ptr) {
; CHECK-P10-LABEL: ld_disjoint_align64_int64_t_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: xscvdpsxds f0, f0
; CHECK-P10-NEXT: mffprd r3, f0
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_disjoint_align64_int64_t_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: xscvdpsxds f0, f0
; CHECK-PREP10-NEXT: mffprd r3, 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 = fptosi double %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_cst_align16_int64_t_double() {
; CHECK-LABEL: ld_cst_align16_int64_t_double:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lfd f0, 4080(0)
; CHECK-NEXT: xscvdpsxds f0, f0
; CHECK-NEXT: mffprd r3, f0
; CHECK-NEXT: blr
entry:
%0 = load double, double* inttoptr (i64 4080 to double*), align 16
%conv = fptosi double %0 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_cst_align32_int64_t_double() {
; CHECK-P10-LABEL: ld_cst_align32_int64_t_double:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: lis r3, 153
; CHECK-P10-NEXT: lfd f0, -27108(r3)
; CHECK-P10-NEXT: xscvdpsxds f0, f0
; CHECK-P10-NEXT: mffprd r3, f0
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: ld_cst_align32_int64_t_double:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: lis r3, 153
; CHECK-P9-NEXT: lfd f0, -27108(r3)
; CHECK-P9-NEXT: xscvdpsxds f0, f0
; CHECK-P9-NEXT: mffprd r3, f0
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: ld_cst_align32_int64_t_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: xscvdpsxds f0, f0
; CHECK-P8-NEXT: mffprd r3, f0
; CHECK-P8-NEXT: blr
entry:
%0 = load double, double* inttoptr (i64 9999900 to double*), align 8
%conv = fptosi double %0 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_cst_align64_int64_t_double() {
; CHECK-P10-LABEL: ld_cst_align64_int64_t_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: xscvdpsxds f0, f0
; CHECK-P10-NEXT: mffprd r3, f0
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: ld_cst_align64_int64_t_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: xscvdpsxds f0, f0
; CHECK-P9-NEXT: mffprd r3, f0
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: ld_cst_align64_int64_t_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: xscvdpsxds f0, f0
; CHECK-P8-NEXT: mffprd r3, f0
; CHECK-P8-NEXT: blr
entry:
%0 = load double, double* inttoptr (i64 1000000000000 to double*), align 4096
%conv = fptosi double %0 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_0_uint64_t_uint8_t(i64 %ptr) {
; CHECK-LABEL: ld_0_uint64_t_uint8_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lbz r3, 0(r3)
; CHECK-NEXT: blr
entry:
%0 = inttoptr i64 %ptr to i8*
%1 = load i8, i8* %0, align 1
%conv = zext i8 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_unalign16_uint64_t_uint8_t(i8* nocapture readonly %ptr) {
; CHECK-LABEL: ld_unalign16_uint64_t_uint8_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lbz r3, 1(r3)
; CHECK-NEXT: blr
entry:
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1
%0 = load i8, i8* %add.ptr, align 1
%conv = zext i8 %0 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_align16_uint64_t_uint8_t(i8* nocapture readonly %ptr) {
; CHECK-LABEL: ld_align16_uint64_t_uint8_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lbz r3, 8(r3)
; CHECK-NEXT: blr
entry:
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 8
%0 = load i8, i8* %add.ptr, align 1
%conv = zext i8 %0 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_unalign32_uint64_t_uint8_t(i8* nocapture readonly %ptr) {
; CHECK-P10-LABEL: ld_unalign32_uint64_t_uint8_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r4, 99999
; CHECK-P10-NEXT: lbzx r3, r3, r4
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_unalign32_uint64_t_uint8_t:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: lis r4, 1
; CHECK-PREP10-NEXT: ori r4, r4, 34463
; CHECK-PREP10-NEXT: lbzx r3, r3, r4
; CHECK-PREP10-NEXT: blr
entry:
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 99999
%0 = load i8, i8* %add.ptr, align 1
%conv = zext i8 %0 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_align32_uint64_t_uint8_t(i8* nocapture readonly %ptr) {
; CHECK-P10-LABEL: ld_align32_uint64_t_uint8_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r4, 99999000
; CHECK-P10-NEXT: lbzx r3, r3, r4
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_align32_uint64_t_uint8_t:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: lis r4, 1525
; CHECK-PREP10-NEXT: ori r4, r4, 56600
; CHECK-PREP10-NEXT: lbzx r3, r3, r4
; CHECK-PREP10-NEXT: blr
entry:
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 99999000
%0 = load i8, i8* %add.ptr, align 1
%conv = zext i8 %0 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_unalign64_uint64_t_uint8_t(i8* nocapture readonly %ptr) {
; CHECK-P10-LABEL: ld_unalign64_uint64_t_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: lbzx r3, r3, r5
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_unalign64_uint64_t_uint8_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: lbzx r3, r3, r4
; CHECK-PREP10-NEXT: blr
entry:
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1000000000001
%0 = load i8, i8* %add.ptr, align 1
%conv = zext i8 %0 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_align64_uint64_t_uint8_t(i8* nocapture readonly %ptr) {
; CHECK-P10-LABEL: ld_align64_uint64_t_uint8_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r4, 244140625
; CHECK-P10-NEXT: rldic r4, r4, 12, 24
; CHECK-P10-NEXT: lbzx r3, r3, r4
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_align64_uint64_t_uint8_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: lbzx r3, r3, r4
; CHECK-PREP10-NEXT: blr
entry:
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1000000000000
%0 = load i8, i8* %add.ptr, align 1
%conv = zext i8 %0 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_reg_uint64_t_uint8_t(i8* nocapture readonly %ptr, i64 %off) {
; CHECK-LABEL: ld_reg_uint64_t_uint8_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lbzx r3, r3, r4
; CHECK-NEXT: blr
entry:
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 %off
%0 = load i8, i8* %add.ptr, align 1
%conv = zext i8 %0 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_or_uint64_t_uint8_t(i64 %ptr, i8 zeroext %off) {
; CHECK-LABEL: ld_or_uint64_t_uint8_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: or r3, r4, r3
; CHECK-NEXT: lbz r3, 0(r3)
; CHECK-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 = zext i8 %1 to i64
ret i64 %conv1
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_or2_uint64_t_uint8_t(i64 %ptr, i8 zeroext %off) {
; CHECK-LABEL: ld_or2_uint64_t_uint8_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: rldicr r3, r3, 0, 51
; CHECK-NEXT: lbzx r3, r3, r4
; CHECK-NEXT: blr
entry:
%and = and i64 %ptr, -4096
%conv = zext i8 %off to i64
%or = or i64 %and, %conv
%0 = inttoptr i64 %or to i8*
%1 = load i8, i8* %0, align 1
%conv1 = zext i8 %1 to i64
ret i64 %conv1
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_not_disjoint16_uint64_t_uint8_t(i64 %ptr) {
; CHECK-LABEL: ld_not_disjoint16_uint64_t_uint8_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: ori r3, r3, 6
; CHECK-NEXT: lbz r3, 0(r3)
; CHECK-NEXT: blr
entry:
%or = or i64 %ptr, 6
%0 = inttoptr i64 %or to i8*
%1 = load i8, i8* %0, align 1
%conv = zext i8 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_disjoint_unalign16_uint64_t_uint8_t(i64 %ptr) {
; CHECK-LABEL: ld_disjoint_unalign16_uint64_t_uint8_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: rldicr r3, r3, 0, 51
; CHECK-NEXT: lbz r3, 6(r3)
; CHECK-NEXT: blr
entry:
%and = and i64 %ptr, -4096
%or = or i64 %and, 6
%0 = inttoptr i64 %or to i8*
%1 = load i8, i8* %0, align 2
%conv = zext i8 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_disjoint_align16_uint64_t_uint8_t(i64 %ptr) {
; CHECK-LABEL: ld_disjoint_align16_uint64_t_uint8_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: rldicr r3, r3, 0, 51
; CHECK-NEXT: lbz r3, 24(r3)
; CHECK-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 = zext i8 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_not_disjoint32_uint64_t_uint8_t(i64 %ptr) {
; CHECK-LABEL: ld_not_disjoint32_uint64_t_uint8_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: ori r3, r3, 34463
; CHECK-NEXT: oris r3, r3, 1
; CHECK-NEXT: lbz r3, 0(r3)
; CHECK-NEXT: blr
entry:
%or = or i64 %ptr, 99999
%0 = inttoptr i64 %or to i8*
%1 = load i8, i8* %0, align 1
%conv = zext i8 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_disjoint_unalign32_uint64_t_uint8_t(i64 %ptr) {
; CHECK-P10-LABEL: ld_disjoint_unalign32_uint64_t_uint8_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: rldicr r3, r3, 0, 43
; CHECK-P10-NEXT: pli r4, 99999
; CHECK-P10-NEXT: lbzx r3, r3, r4
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_disjoint_unalign32_uint64_t_uint8_t:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: lis r4, 1
; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 43
; CHECK-PREP10-NEXT: ori r4, r4, 34463
; CHECK-PREP10-NEXT: lbzx r3, r3, r4
; CHECK-PREP10-NEXT: blr
entry:
%and = and i64 %ptr, -1048576
%or = or i64 %and, 99999
%0 = inttoptr i64 %or to i8*
%1 = load i8, i8* %0, align 1
%conv = zext i8 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_disjoint_align32_uint64_t_uint8_t(i64 %ptr) {
; CHECK-P10-LABEL: ld_disjoint_align32_uint64_t_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: lbzx r3, r3, r4
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: ld_disjoint_align32_uint64_t_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: lbzx r3, r3, r4
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: ld_disjoint_align32_uint64_t_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: 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 = zext i8 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_not_disjoint64_uint64_t_uint8_t(i64 %ptr) {
; CHECK-P10-LABEL: ld_not_disjoint64_uint64_t_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: lbz r3, 0(r3)
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_not_disjoint64_uint64_t_uint8_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: lbz r3, 0(r3)
; CHECK-PREP10-NEXT: blr
entry:
%or = or i64 %ptr, 1000000000001
%0 = inttoptr i64 %or to i8*
%1 = load i8, i8* %0, align 1
%conv = zext i8 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_disjoint_unalign64_uint64_t_uint8_t(i64 %ptr) {
; CHECK-P10-LABEL: ld_disjoint_unalign64_uint64_t_uint8_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r4, 232
; CHECK-P10-NEXT: pli r5, 3567587329
; CHECK-P10-NEXT: rldicr r3, r3, 0, 23
; CHECK-P10-NEXT: rldimi r5, r4, 32, 0
; CHECK-P10-NEXT: lbzx r3, r3, r5
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_disjoint_unalign64_uint64_t_uint8_t:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: li r4, 29
; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23
; 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: lbzx r3, r3, r4
; CHECK-PREP10-NEXT: blr
entry:
%and = and i64 %ptr, -1099511627776
%or = or i64 %and, 1000000000001
%0 = inttoptr i64 %or to i8*
%1 = load i8, i8* %0, align 1
%conv = zext i8 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_disjoint_align64_uint64_t_uint8_t(i64 %ptr) {
; CHECK-P10-LABEL: ld_disjoint_align64_uint64_t_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: lbzx r3, r3, r4
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_disjoint_align64_uint64_t_uint8_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: lbzx r3, r3, r4
; CHECK-PREP10-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 = zext i8 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_cst_unalign16_uint64_t_uint8_t() {
; CHECK-LABEL: ld_cst_unalign16_uint64_t_uint8_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lbz r3, 255(0)
; CHECK-NEXT: blr
entry:
%0 = load i8, i8* inttoptr (i64 255 to i8*), align 1
%conv = zext i8 %0 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_cst_align16_uint64_t_uint8_t() {
; CHECK-LABEL: ld_cst_align16_uint64_t_uint8_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lbz r3, 4080(0)
; CHECK-NEXT: blr
entry:
%0 = load i8, i8* inttoptr (i64 4080 to i8*), align 16
%conv = zext i8 %0 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_cst_unalign32_uint64_t_uint8_t() {
; CHECK-LABEL: ld_cst_unalign32_uint64_t_uint8_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lis r3, 2
; CHECK-NEXT: lbz r3, -31073(r3)
; CHECK-NEXT: blr
entry:
%0 = load i8, i8* inttoptr (i64 99999 to i8*), align 1
%conv = zext i8 %0 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_cst_align32_uint64_t_uint8_t() {
; CHECK-LABEL: ld_cst_align32_uint64_t_uint8_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lis r3, 153
; CHECK-NEXT: lbz r3, -27108(r3)
; CHECK-NEXT: blr
entry:
%0 = load i8, i8* inttoptr (i64 9999900 to i8*), align 4
%conv = zext i8 %0 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_cst_unalign64_uint64_t_uint8_t() {
; CHECK-P10-LABEL: ld_cst_unalign64_uint64_t_uint8_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r3, 232
; CHECK-P10-NEXT: pli r4, 3567587329
; CHECK-P10-NEXT: rldimi r4, r3, 32, 0
; CHECK-P10-NEXT: lbz r3, 0(r4)
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_cst_unalign64_uint64_t_uint8_t:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: li r3, 29
; CHECK-PREP10-NEXT: rldic r3, r3, 35, 24
; CHECK-PREP10-NEXT: oris r3, r3, 54437
; CHECK-PREP10-NEXT: ori r3, r3, 4097
; CHECK-PREP10-NEXT: lbz r3, 0(r3)
; CHECK-PREP10-NEXT: blr
entry:
%0 = load i8, i8* inttoptr (i64 1000000000001 to i8*), align 1
%conv = zext i8 %0 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_cst_align64_uint64_t_uint8_t() {
; CHECK-P10-LABEL: ld_cst_align64_uint64_t_uint8_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r3, 244140625
; CHECK-P10-NEXT: rldic r3, r3, 12, 24
; CHECK-P10-NEXT: lbz r3, 0(r3)
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_cst_align64_uint64_t_uint8_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: lbz r3, 0(r3)
; CHECK-PREP10-NEXT: blr
entry:
%0 = load i8, i8* inttoptr (i64 1000000000000 to i8*), align 4096
%conv = zext i8 %0 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_0_uint64_t_int8_t(i64 %ptr) {
; CHECK-LABEL: ld_0_uint64_t_int8_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lbz r3, 0(r3)
; CHECK-NEXT: extsb r3, r3
; CHECK-NEXT: blr
entry:
%0 = inttoptr i64 %ptr to i8*
%1 = load i8, i8* %0, align 1
%conv = sext i8 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_unalign16_uint64_t_int8_t(i8* nocapture readonly %ptr) {
; CHECK-LABEL: ld_unalign16_uint64_t_int8_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lbz r3, 1(r3)
; CHECK-NEXT: extsb r3, r3
; CHECK-NEXT: blr
entry:
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1
%0 = load i8, i8* %add.ptr, align 1
%conv = sext i8 %0 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_align16_uint64_t_int8_t(i8* nocapture readonly %ptr) {
; CHECK-LABEL: ld_align16_uint64_t_int8_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lbz r3, 8(r3)
; CHECK-NEXT: extsb r3, r3
; CHECK-NEXT: blr
entry:
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 8
%0 = load i8, i8* %add.ptr, align 1
%conv = sext i8 %0 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_unalign32_uint64_t_int8_t(i8* nocapture readonly %ptr) {
; CHECK-P10-LABEL: ld_unalign32_uint64_t_int8_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r4, 99999
; CHECK-P10-NEXT: lbzx r3, r3, r4
; CHECK-P10-NEXT: extsb r3, r3
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_unalign32_uint64_t_int8_t:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: lis r4, 1
; CHECK-PREP10-NEXT: ori r4, r4, 34463
; CHECK-PREP10-NEXT: lbzx r3, r3, r4
; CHECK-PREP10-NEXT: extsb r3, r3
; CHECK-PREP10-NEXT: blr
entry:
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 99999
%0 = load i8, i8* %add.ptr, align 1
%conv = sext i8 %0 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_align32_uint64_t_int8_t(i8* nocapture readonly %ptr) {
; CHECK-P10-LABEL: ld_align32_uint64_t_int8_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r4, 99999000
; CHECK-P10-NEXT: lbzx r3, r3, r4
; CHECK-P10-NEXT: extsb r3, r3
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_align32_uint64_t_int8_t:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: lis r4, 1525
; CHECK-PREP10-NEXT: ori r4, r4, 56600
; CHECK-PREP10-NEXT: lbzx r3, r3, r4
; CHECK-PREP10-NEXT: extsb r3, r3
; CHECK-PREP10-NEXT: blr
entry:
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 99999000
%0 = load i8, i8* %add.ptr, align 1
%conv = sext i8 %0 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_unalign64_uint64_t_int8_t(i8* nocapture readonly %ptr) {
; CHECK-P10-LABEL: ld_unalign64_uint64_t_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: lbzx r3, r3, r5
; CHECK-P10-NEXT: extsb r3, r3
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_unalign64_uint64_t_int8_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: lbzx r3, r3, r4
; CHECK-PREP10-NEXT: extsb r3, r3
; CHECK-PREP10-NEXT: blr
entry:
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1000000000001
%0 = load i8, i8* %add.ptr, align 1
%conv = sext i8 %0 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_align64_uint64_t_int8_t(i8* nocapture readonly %ptr) {
; CHECK-P10-LABEL: ld_align64_uint64_t_int8_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r4, 244140625
; CHECK-P10-NEXT: rldic r4, r4, 12, 24
; CHECK-P10-NEXT: lbzx r3, r3, r4
; CHECK-P10-NEXT: extsb r3, r3
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_align64_uint64_t_int8_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: lbzx r3, r3, r4
; CHECK-PREP10-NEXT: extsb r3, r3
; CHECK-PREP10-NEXT: blr
entry:
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1000000000000
%0 = load i8, i8* %add.ptr, align 1
%conv = sext i8 %0 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_reg_uint64_t_int8_t(i8* nocapture readonly %ptr, i64 %off) {
; CHECK-LABEL: ld_reg_uint64_t_int8_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lbzx r3, r3, r4
; CHECK-NEXT: extsb r3, r3
; CHECK-NEXT: blr
entry:
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 %off
%0 = load i8, i8* %add.ptr, align 1
%conv = sext i8 %0 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_or_uint64_t_int8_t(i64 %ptr, i8 zeroext %off) {
; CHECK-LABEL: ld_or_uint64_t_int8_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: or r3, r4, r3
; CHECK-NEXT: lbz r3, 0(r3)
; CHECK-NEXT: extsb r3, r3
; CHECK-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 = sext i8 %1 to i64
ret i64 %conv1
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_or2_uint64_t_int8_t(i64 %ptr, i8 zeroext %off) {
; CHECK-LABEL: ld_or2_uint64_t_int8_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: rldicr r3, r3, 0, 51
; CHECK-NEXT: lbzx r3, r3, r4
; CHECK-NEXT: extsb r3, r3
; CHECK-NEXT: blr
entry:
%and = and i64 %ptr, -4096
%conv = zext i8 %off to i64
%or = or i64 %and, %conv
%0 = inttoptr i64 %or to i8*
%1 = load i8, i8* %0, align 1
%conv1 = sext i8 %1 to i64
ret i64 %conv1
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_not_disjoint16_uint64_t_int8_t(i64 %ptr) {
; CHECK-LABEL: ld_not_disjoint16_uint64_t_int8_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: ori r3, r3, 6
; CHECK-NEXT: lbz r3, 0(r3)
; CHECK-NEXT: extsb r3, r3
; CHECK-NEXT: blr
entry:
%or = or i64 %ptr, 6
%0 = inttoptr i64 %or to i8*
%1 = load i8, i8* %0, align 1
%conv = sext i8 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_disjoint_unalign16_uint64_t_int8_t(i64 %ptr) {
; CHECK-LABEL: ld_disjoint_unalign16_uint64_t_int8_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: rldicr r3, r3, 0, 51
; CHECK-NEXT: lbz r3, 6(r3)
; CHECK-NEXT: extsb r3, r3
; CHECK-NEXT: blr
entry:
%and = and i64 %ptr, -4096
%or = or i64 %and, 6
%0 = inttoptr i64 %or to i8*
%1 = load i8, i8* %0, align 2
%conv = sext i8 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_disjoint_align16_uint64_t_int8_t(i64 %ptr) {
; CHECK-LABEL: ld_disjoint_align16_uint64_t_int8_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: rldicr r3, r3, 0, 51
; CHECK-NEXT: lbz r3, 24(r3)
; CHECK-NEXT: extsb r3, r3
; CHECK-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 = sext i8 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_not_disjoint32_uint64_t_int8_t(i64 %ptr) {
; CHECK-LABEL: ld_not_disjoint32_uint64_t_int8_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: ori r3, r3, 34463
; CHECK-NEXT: oris r3, r3, 1
; CHECK-NEXT: lbz r3, 0(r3)
; CHECK-NEXT: extsb r3, r3
; CHECK-NEXT: blr
entry:
%or = or i64 %ptr, 99999
%0 = inttoptr i64 %or to i8*
%1 = load i8, i8* %0, align 1
%conv = sext i8 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_disjoint_unalign32_uint64_t_int8_t(i64 %ptr) {
; CHECK-P10-LABEL: ld_disjoint_unalign32_uint64_t_int8_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: rldicr r3, r3, 0, 43
; CHECK-P10-NEXT: pli r4, 99999
; CHECK-P10-NEXT: lbzx r3, r3, r4
; CHECK-P10-NEXT: extsb r3, r3
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_disjoint_unalign32_uint64_t_int8_t:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: lis r4, 1
; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 43
; CHECK-PREP10-NEXT: ori r4, r4, 34463
; CHECK-PREP10-NEXT: lbzx r3, r3, r4
; CHECK-PREP10-NEXT: extsb r3, r3
; CHECK-PREP10-NEXT: blr
entry:
%and = and i64 %ptr, -1048576
%or = or i64 %and, 99999
%0 = inttoptr i64 %or to i8*
%1 = load i8, i8* %0, align 1
%conv = sext i8 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_disjoint_align32_uint64_t_int8_t(i64 %ptr) {
; CHECK-P10-LABEL: ld_disjoint_align32_uint64_t_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: lbzx r3, r3, r4
; CHECK-P10-NEXT: extsb r3, r3
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: ld_disjoint_align32_uint64_t_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: lbzx r3, r3, r4
; CHECK-P9-NEXT: extsb r3, r3
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: ld_disjoint_align32_uint64_t_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: 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 = sext i8 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_not_disjoint64_uint64_t_int8_t(i64 %ptr) {
; CHECK-P10-LABEL: ld_not_disjoint64_uint64_t_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: lbz r3, 0(r3)
; CHECK-P10-NEXT: extsb r3, r3
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_not_disjoint64_uint64_t_int8_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: lbz r3, 0(r3)
; CHECK-PREP10-NEXT: extsb r3, r3
; CHECK-PREP10-NEXT: blr
entry:
%or = or i64 %ptr, 1000000000001
%0 = inttoptr i64 %or to i8*
%1 = load i8, i8* %0, align 1
%conv = sext i8 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_disjoint_unalign64_uint64_t_int8_t(i64 %ptr) {
; CHECK-P10-LABEL: ld_disjoint_unalign64_uint64_t_int8_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r4, 232
; CHECK-P10-NEXT: pli r5, 3567587329
; CHECK-P10-NEXT: rldicr r3, r3, 0, 23
; CHECK-P10-NEXT: rldimi r5, r4, 32, 0
; CHECK-P10-NEXT: lbzx r3, r3, r5
; CHECK-P10-NEXT: extsb r3, r3
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_disjoint_unalign64_uint64_t_int8_t:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: li r4, 29
; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23
; 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: lbzx r3, r3, r4
; CHECK-PREP10-NEXT: extsb r3, r3
; CHECK-PREP10-NEXT: blr
entry:
%and = and i64 %ptr, -1099511627776
%or = or i64 %and, 1000000000001
%0 = inttoptr i64 %or to i8*
%1 = load i8, i8* %0, align 1
%conv = sext i8 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_disjoint_align64_uint64_t_int8_t(i64 %ptr) {
; CHECK-P10-LABEL: ld_disjoint_align64_uint64_t_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: lbzx r3, r3, r4
; CHECK-P10-NEXT: extsb r3, r3
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_disjoint_align64_uint64_t_int8_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: lbzx r3, r3, r4
; CHECK-PREP10-NEXT: extsb r3, r3
; CHECK-PREP10-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 = sext i8 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_cst_unalign16_uint64_t_int8_t() {
; CHECK-LABEL: ld_cst_unalign16_uint64_t_int8_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lbz r3, 255(0)
; CHECK-NEXT: extsb r3, r3
; CHECK-NEXT: blr
entry:
%0 = load i8, i8* inttoptr (i64 255 to i8*), align 1
%conv = sext i8 %0 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_cst_align16_uint64_t_int8_t() {
; CHECK-LABEL: ld_cst_align16_uint64_t_int8_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lbz r3, 4080(0)
; CHECK-NEXT: extsb r3, r3
; CHECK-NEXT: blr
entry:
%0 = load i8, i8* inttoptr (i64 4080 to i8*), align 16
%conv = sext i8 %0 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_cst_unalign32_uint64_t_int8_t() {
; CHECK-LABEL: ld_cst_unalign32_uint64_t_int8_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lis r3, 2
; CHECK-NEXT: lbz r3, -31073(r3)
; CHECK-NEXT: extsb r3, r3
; CHECK-NEXT: blr
entry:
%0 = load i8, i8* inttoptr (i64 99999 to i8*), align 1
%conv = sext i8 %0 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_cst_align32_uint64_t_int8_t() {
; CHECK-LABEL: ld_cst_align32_uint64_t_int8_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lis r3, 153
; CHECK-NEXT: lbz r3, -27108(r3)
; CHECK-NEXT: extsb r3, r3
; CHECK-NEXT: blr
entry:
%0 = load i8, i8* inttoptr (i64 9999900 to i8*), align 4
%conv = sext i8 %0 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_cst_unalign64_uint64_t_int8_t() {
; CHECK-P10-LABEL: ld_cst_unalign64_uint64_t_int8_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r3, 232
; CHECK-P10-NEXT: pli r4, 3567587329
; CHECK-P10-NEXT: rldimi r4, r3, 32, 0
; CHECK-P10-NEXT: lbz r3, 0(r4)
; CHECK-P10-NEXT: extsb r3, r3
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_cst_unalign64_uint64_t_int8_t:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: li r3, 29
; CHECK-PREP10-NEXT: rldic r3, r3, 35, 24
; CHECK-PREP10-NEXT: oris r3, r3, 54437
; CHECK-PREP10-NEXT: ori r3, r3, 4097
; CHECK-PREP10-NEXT: lbz r3, 0(r3)
; CHECK-PREP10-NEXT: extsb r3, r3
; CHECK-PREP10-NEXT: blr
entry:
%0 = load i8, i8* inttoptr (i64 1000000000001 to i8*), align 1
%conv = sext i8 %0 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_cst_align64_uint64_t_int8_t() {
; CHECK-P10-LABEL: ld_cst_align64_uint64_t_int8_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r3, 244140625
; CHECK-P10-NEXT: rldic r3, r3, 12, 24
; CHECK-P10-NEXT: lbz r3, 0(r3)
; CHECK-P10-NEXT: extsb r3, r3
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_cst_align64_uint64_t_int8_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: lbz r3, 0(r3)
; CHECK-PREP10-NEXT: extsb r3, r3
; CHECK-PREP10-NEXT: blr
entry:
%0 = load i8, i8* inttoptr (i64 1000000000000 to i8*), align 4096
%conv = sext i8 %0 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_0_uint64_t_uint16_t(i64 %ptr) {
; CHECK-LABEL: ld_0_uint64_t_uint16_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lhz r3, 0(r3)
; CHECK-NEXT: blr
entry:
%0 = inttoptr i64 %ptr to i16*
%1 = load i16, i16* %0, align 2
%conv = zext i16 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_unalign16_uint64_t_uint16_t(i8* nocapture readonly %ptr) {
; CHECK-LABEL: ld_unalign16_uint64_t_uint16_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lhz r3, 1(r3)
; CHECK-NEXT: blr
entry:
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1
%0 = bitcast i8* %add.ptr to i16*
%1 = load i16, i16* %0, align 2
%conv = zext i16 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_align16_uint64_t_uint16_t(i8* nocapture readonly %ptr) {
; CHECK-LABEL: ld_align16_uint64_t_uint16_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lhz r3, 8(r3)
; CHECK-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 = zext i16 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_unalign32_uint64_t_uint16_t(i8* nocapture readonly %ptr) {
; CHECK-P10-LABEL: ld_unalign32_uint64_t_uint16_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r4, 99999
; CHECK-P10-NEXT: lhzx r3, r3, r4
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_unalign32_uint64_t_uint16_t:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: lis r4, 1
; CHECK-PREP10-NEXT: ori r4, r4, 34463
; CHECK-PREP10-NEXT: lhzx r3, r3, r4
; CHECK-PREP10-NEXT: blr
entry:
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 99999
%0 = bitcast i8* %add.ptr to i16*
%1 = load i16, i16* %0, align 2
%conv = zext i16 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_align32_uint64_t_uint16_t(i8* nocapture readonly %ptr) {
; CHECK-P10-LABEL: ld_align32_uint64_t_uint16_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r4, 99999000
; CHECK-P10-NEXT: lhzx r3, r3, r4
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_align32_uint64_t_uint16_t:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: lis r4, 1525
; CHECK-PREP10-NEXT: ori r4, r4, 56600
; CHECK-PREP10-NEXT: lhzx r3, r3, r4
; CHECK-PREP10-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 = zext i16 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_unalign64_uint64_t_uint16_t(i8* nocapture readonly %ptr) {
; CHECK-P10-LABEL: ld_unalign64_uint64_t_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: lhzx r3, r3, r5
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_unalign64_uint64_t_uint16_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: lhzx r3, r3, r4
; CHECK-PREP10-NEXT: blr
entry:
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1000000000001
%0 = bitcast i8* %add.ptr to i16*
%1 = load i16, i16* %0, align 2
%conv = zext i16 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_align64_uint64_t_uint16_t(i8* nocapture readonly %ptr) {
; CHECK-P10-LABEL: ld_align64_uint64_t_uint16_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r4, 244140625
; CHECK-P10-NEXT: rldic r4, r4, 12, 24
; CHECK-P10-NEXT: lhzx r3, r3, r4
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_align64_uint64_t_uint16_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: lhzx r3, r3, r4
; CHECK-PREP10-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 = zext i16 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_reg_uint64_t_uint16_t(i8* nocapture readonly %ptr, i64 %off) {
; CHECK-LABEL: ld_reg_uint64_t_uint16_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lhzx r3, r3, r4
; CHECK-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 = zext i16 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_or_uint64_t_uint16_t(i64 %ptr, i8 zeroext %off) {
; CHECK-LABEL: ld_or_uint64_t_uint16_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: or r3, r4, r3
; CHECK-NEXT: lhz r3, 0(r3)
; CHECK-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 = zext i16 %1 to i64
ret i64 %conv1
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_or2_uint64_t_uint16_t(i64 %ptr, i8 zeroext %off) {
; CHECK-LABEL: ld_or2_uint64_t_uint16_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: rldicr r3, r3, 0, 51
; CHECK-NEXT: lhzx r3, r3, r4
; CHECK-NEXT: blr
entry:
%and = and i64 %ptr, -4096
%conv = zext i8 %off to i64
%or = or i64 %and, %conv
%0 = inttoptr i64 %or to i16*
%1 = load i16, i16* %0, align 2
%conv1 = zext i16 %1 to i64
ret i64 %conv1
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_not_disjoint16_uint64_t_uint16_t(i64 %ptr) {
; CHECK-LABEL: ld_not_disjoint16_uint64_t_uint16_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: ori r3, r3, 6
; CHECK-NEXT: lhz r3, 0(r3)
; CHECK-NEXT: blr
entry:
%or = or i64 %ptr, 6
%0 = inttoptr i64 %or to i16*
%1 = load i16, i16* %0, align 2
%conv = zext i16 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_disjoint_unalign16_uint64_t_uint16_t(i64 %ptr) {
; CHECK-LABEL: ld_disjoint_unalign16_uint64_t_uint16_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: rldicr r3, r3, 0, 51
; CHECK-NEXT: lhz r3, 6(r3)
; CHECK-NEXT: blr
entry:
%and = and i64 %ptr, -4096
%or = or i64 %and, 6
%0 = inttoptr i64 %or to i16*
%1 = load i16, i16* %0, align 2
%conv = zext i16 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_disjoint_align16_uint64_t_uint16_t(i64 %ptr) {
; CHECK-LABEL: ld_disjoint_align16_uint64_t_uint16_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: rldicr r3, r3, 0, 51
; CHECK-NEXT: lhz r3, 24(r3)
; CHECK-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 = zext i16 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_not_disjoint32_uint64_t_uint16_t(i64 %ptr) {
; CHECK-LABEL: ld_not_disjoint32_uint64_t_uint16_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: ori r3, r3, 34463
; CHECK-NEXT: oris r3, r3, 1
; CHECK-NEXT: lhz r3, 0(r3)
; CHECK-NEXT: blr
entry:
%or = or i64 %ptr, 99999
%0 = inttoptr i64 %or to i16*
%1 = load i16, i16* %0, align 2
%conv = zext i16 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_disjoint_unalign32_uint64_t_uint16_t(i64 %ptr) {
; CHECK-P10-LABEL: ld_disjoint_unalign32_uint64_t_uint16_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: rldicr r3, r3, 0, 43
; CHECK-P10-NEXT: pli r4, 99999
; CHECK-P10-NEXT: lhzx r3, r3, r4
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_disjoint_unalign32_uint64_t_uint16_t:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: lis r4, 1
; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 43
; CHECK-PREP10-NEXT: ori r4, r4, 34463
; CHECK-PREP10-NEXT: lhzx r3, r3, r4
; CHECK-PREP10-NEXT: blr
entry:
%and = and i64 %ptr, -1048576
%or = or i64 %and, 99999
%0 = inttoptr i64 %or to i16*
%1 = load i16, i16* %0, align 2
%conv = zext i16 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_disjoint_align32_uint64_t_uint16_t(i64 %ptr) {
; CHECK-P10-LABEL: ld_disjoint_align32_uint64_t_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: lhzx r3, r3, r4
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: ld_disjoint_align32_uint64_t_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: lhzx r3, r3, r4
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: ld_disjoint_align32_uint64_t_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: 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 = zext i16 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_not_disjoint64_uint64_t_uint16_t(i64 %ptr) {
; CHECK-P10-LABEL: ld_not_disjoint64_uint64_t_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: lhz r3, 0(r3)
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_not_disjoint64_uint64_t_uint16_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: lhz r3, 0(r3)
; CHECK-PREP10-NEXT: blr
entry:
%or = or i64 %ptr, 1000000000001
%0 = inttoptr i64 %or to i16*
%1 = load i16, i16* %0, align 2
%conv = zext i16 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_disjoint_unalign64_uint64_t_uint16_t(i64 %ptr) {
; CHECK-P10-LABEL: ld_disjoint_unalign64_uint64_t_uint16_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r4, 232
; CHECK-P10-NEXT: pli r5, 3567587329
; CHECK-P10-NEXT: rldicr r3, r3, 0, 23
; CHECK-P10-NEXT: rldimi r5, r4, 32, 0
; CHECK-P10-NEXT: lhzx r3, r3, r5
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_disjoint_unalign64_uint64_t_uint16_t:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: li r4, 29
; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23
; 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: lhzx r3, r3, r4
; CHECK-PREP10-NEXT: blr
entry:
%and = and i64 %ptr, -1099511627776
%or = or i64 %and, 1000000000001
%0 = inttoptr i64 %or to i16*
%1 = load i16, i16* %0, align 2
%conv = zext i16 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_disjoint_align64_uint64_t_uint16_t(i64 %ptr) {
; CHECK-P10-LABEL: ld_disjoint_align64_uint64_t_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: lhzx r3, r3, r4
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_disjoint_align64_uint64_t_uint16_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: lhzx r3, r3, r4
; CHECK-PREP10-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 = zext i16 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_cst_unalign16_uint64_t_uint16_t() {
; CHECK-LABEL: ld_cst_unalign16_uint64_t_uint16_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lhz r3, 255(0)
; CHECK-NEXT: blr
entry:
%0 = load i16, i16* inttoptr (i64 255 to i16*), align 2
%conv = zext i16 %0 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_cst_align16_uint64_t_uint16_t() {
; CHECK-LABEL: ld_cst_align16_uint64_t_uint16_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lhz r3, 4080(0)
; CHECK-NEXT: blr
entry:
%0 = load i16, i16* inttoptr (i64 4080 to i16*), align 16
%conv = zext i16 %0 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_cst_unalign32_uint64_t_uint16_t() {
; CHECK-LABEL: ld_cst_unalign32_uint64_t_uint16_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lis r3, 2
; CHECK-NEXT: lhz r3, -31073(r3)
; CHECK-NEXT: blr
entry:
%0 = load i16, i16* inttoptr (i64 99999 to i16*), align 2
%conv = zext i16 %0 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_cst_align32_uint64_t_uint16_t() {
; CHECK-LABEL: ld_cst_align32_uint64_t_uint16_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lis r3, 153
; CHECK-NEXT: lhz r3, -27108(r3)
; CHECK-NEXT: blr
entry:
%0 = load i16, i16* inttoptr (i64 9999900 to i16*), align 4
%conv = zext i16 %0 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_cst_unalign64_uint64_t_uint16_t() {
; CHECK-P10-LABEL: ld_cst_unalign64_uint64_t_uint16_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r3, 232
; CHECK-P10-NEXT: pli r4, 3567587329
; CHECK-P10-NEXT: rldimi r4, r3, 32, 0
; CHECK-P10-NEXT: lhz r3, 0(r4)
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_cst_unalign64_uint64_t_uint16_t:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: li r3, 29
; CHECK-PREP10-NEXT: rldic r3, r3, 35, 24
; CHECK-PREP10-NEXT: oris r3, r3, 54437
; CHECK-PREP10-NEXT: ori r3, r3, 4097
; CHECK-PREP10-NEXT: lhz r3, 0(r3)
; CHECK-PREP10-NEXT: blr
entry:
%0 = load i16, i16* inttoptr (i64 1000000000001 to i16*), align 2
%conv = zext i16 %0 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_cst_align64_uint64_t_uint16_t() {
; CHECK-P10-LABEL: ld_cst_align64_uint64_t_uint16_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r3, 244140625
; CHECK-P10-NEXT: rldic r3, r3, 12, 24
; CHECK-P10-NEXT: lhz r3, 0(r3)
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_cst_align64_uint64_t_uint16_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: lhz r3, 0(r3)
; CHECK-PREP10-NEXT: blr
entry:
%0 = load i16, i16* inttoptr (i64 1000000000000 to i16*), align 4096
%conv = zext i16 %0 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_0_uint64_t_int16_t(i64 %ptr) {
; CHECK-LABEL: ld_0_uint64_t_int16_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lha r3, 0(r3)
; CHECK-NEXT: blr
entry:
%0 = inttoptr i64 %ptr to i16*
%1 = load i16, i16* %0, align 2
%conv = sext i16 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_unalign16_uint64_t_int16_t(i8* nocapture readonly %ptr) {
; CHECK-LABEL: ld_unalign16_uint64_t_int16_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lha r3, 1(r3)
; CHECK-NEXT: blr
entry:
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1
%0 = bitcast i8* %add.ptr to i16*
%1 = load i16, i16* %0, align 2
%conv = sext i16 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_align16_uint64_t_int16_t(i8* nocapture readonly %ptr) {
; CHECK-LABEL: ld_align16_uint64_t_int16_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lha r3, 8(r3)
; CHECK-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 = sext i16 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_unalign32_uint64_t_int16_t(i8* nocapture readonly %ptr) {
; CHECK-P10-LABEL: ld_unalign32_uint64_t_int16_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r4, 99999
; CHECK-P10-NEXT: lhax r3, r3, r4
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_unalign32_uint64_t_int16_t:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: lis r4, 1
; CHECK-PREP10-NEXT: ori r4, r4, 34463
; CHECK-PREP10-NEXT: lhax r3, r3, r4
; CHECK-PREP10-NEXT: blr
entry:
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 99999
%0 = bitcast i8* %add.ptr to i16*
%1 = load i16, i16* %0, align 2
%conv = sext i16 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_align32_uint64_t_int16_t(i8* nocapture readonly %ptr) {
; CHECK-P10-LABEL: ld_align32_uint64_t_int16_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r4, 99999000
; CHECK-P10-NEXT: lhax r3, r3, r4
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_align32_uint64_t_int16_t:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: lis r4, 1525
; CHECK-PREP10-NEXT: ori r4, r4, 56600
; CHECK-PREP10-NEXT: lhax r3, r3, r4
; CHECK-PREP10-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 = sext i16 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_unalign64_uint64_t_int16_t(i8* nocapture readonly %ptr) {
; CHECK-P10-LABEL: ld_unalign64_uint64_t_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: lhax r3, r3, r5
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_unalign64_uint64_t_int16_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: lhax r3, r3, r4
; CHECK-PREP10-NEXT: blr
entry:
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1000000000001
%0 = bitcast i8* %add.ptr to i16*
%1 = load i16, i16* %0, align 2
%conv = sext i16 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_align64_uint64_t_int16_t(i8* nocapture readonly %ptr) {
; CHECK-P10-LABEL: ld_align64_uint64_t_int16_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r4, 244140625
; CHECK-P10-NEXT: rldic r4, r4, 12, 24
; CHECK-P10-NEXT: lhax r3, r3, r4
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_align64_uint64_t_int16_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: lhax r3, r3, r4
; CHECK-PREP10-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 = sext i16 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_reg_uint64_t_int16_t(i8* nocapture readonly %ptr, i64 %off) {
; CHECK-LABEL: ld_reg_uint64_t_int16_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lhax r3, r3, r4
; CHECK-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 = sext i16 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_or_uint64_t_int16_t(i64 %ptr, i8 zeroext %off) {
; CHECK-LABEL: ld_or_uint64_t_int16_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: or r3, r4, r3
; CHECK-NEXT: lha r3, 0(r3)
; CHECK-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 = sext i16 %1 to i64
ret i64 %conv1
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_or2_uint64_t_int16_t(i64 %ptr, i8 zeroext %off) {
; CHECK-LABEL: ld_or2_uint64_t_int16_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: rldicr r3, r3, 0, 51
; CHECK-NEXT: lhax r3, r3, r4
; CHECK-NEXT: blr
entry:
%and = and i64 %ptr, -4096
%conv = zext i8 %off to i64
%or = or i64 %and, %conv
%0 = inttoptr i64 %or to i16*
%1 = load i16, i16* %0, align 2
%conv1 = sext i16 %1 to i64
ret i64 %conv1
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_not_disjoint16_uint64_t_int16_t(i64 %ptr) {
; CHECK-LABEL: ld_not_disjoint16_uint64_t_int16_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: ori r3, r3, 6
; CHECK-NEXT: lha r3, 0(r3)
; CHECK-NEXT: blr
entry:
%or = or i64 %ptr, 6
%0 = inttoptr i64 %or to i16*
%1 = load i16, i16* %0, align 2
%conv = sext i16 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_disjoint_unalign16_uint64_t_int16_t(i64 %ptr) {
; CHECK-LABEL: ld_disjoint_unalign16_uint64_t_int16_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: rldicr r3, r3, 0, 51
; CHECK-NEXT: lha r3, 6(r3)
; CHECK-NEXT: blr
entry:
%and = and i64 %ptr, -4096
%or = or i64 %and, 6
%0 = inttoptr i64 %or to i16*
%1 = load i16, i16* %0, align 2
%conv = sext i16 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_disjoint_align16_uint64_t_int16_t(i64 %ptr) {
; CHECK-LABEL: ld_disjoint_align16_uint64_t_int16_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: rldicr r3, r3, 0, 51
; CHECK-NEXT: lha r3, 24(r3)
; CHECK-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 = sext i16 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_not_disjoint32_uint64_t_int16_t(i64 %ptr) {
; CHECK-LABEL: ld_not_disjoint32_uint64_t_int16_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: ori r3, r3, 34463
; CHECK-NEXT: oris r3, r3, 1
; CHECK-NEXT: lha r3, 0(r3)
; CHECK-NEXT: blr
entry:
%or = or i64 %ptr, 99999
%0 = inttoptr i64 %or to i16*
%1 = load i16, i16* %0, align 2
%conv = sext i16 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_disjoint_unalign32_uint64_t_int16_t(i64 %ptr) {
; CHECK-P10-LABEL: ld_disjoint_unalign32_uint64_t_int16_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: rldicr r3, r3, 0, 43
; CHECK-P10-NEXT: pli r4, 99999
; CHECK-P10-NEXT: lhax r3, r3, r4
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_disjoint_unalign32_uint64_t_int16_t:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: lis r4, 1
; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 43
; CHECK-PREP10-NEXT: ori r4, r4, 34463
; CHECK-PREP10-NEXT: lhax r3, r3, r4
; CHECK-PREP10-NEXT: blr
entry:
%and = and i64 %ptr, -1048576
%or = or i64 %and, 99999
%0 = inttoptr i64 %or to i16*
%1 = load i16, i16* %0, align 2
%conv = sext i16 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_disjoint_align32_uint64_t_int16_t(i64 %ptr) {
; CHECK-P10-LABEL: ld_disjoint_align32_uint64_t_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: lhax r3, r3, r4
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: ld_disjoint_align32_uint64_t_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: lhax r3, r3, r4
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: ld_disjoint_align32_uint64_t_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: 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 = sext i16 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_not_disjoint64_uint64_t_int16_t(i64 %ptr) {
; CHECK-P10-LABEL: ld_not_disjoint64_uint64_t_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: lha r3, 0(r3)
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_not_disjoint64_uint64_t_int16_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: lha r3, 0(r3)
; CHECK-PREP10-NEXT: blr
entry:
%or = or i64 %ptr, 1000000000001
%0 = inttoptr i64 %or to i16*
%1 = load i16, i16* %0, align 2
%conv = sext i16 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_disjoint_unalign64_uint64_t_int16_t(i64 %ptr) {
; CHECK-P10-LABEL: ld_disjoint_unalign64_uint64_t_int16_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r4, 232
; CHECK-P10-NEXT: pli r5, 3567587329
; CHECK-P10-NEXT: rldicr r3, r3, 0, 23
; CHECK-P10-NEXT: rldimi r5, r4, 32, 0
; CHECK-P10-NEXT: lhax r3, r3, r5
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_disjoint_unalign64_uint64_t_int16_t:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: li r4, 29
; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23
; 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: lhax r3, r3, r4
; CHECK-PREP10-NEXT: blr
entry:
%and = and i64 %ptr, -1099511627776
%or = or i64 %and, 1000000000001
%0 = inttoptr i64 %or to i16*
%1 = load i16, i16* %0, align 2
%conv = sext i16 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_disjoint_align64_uint64_t_int16_t(i64 %ptr) {
; CHECK-P10-LABEL: ld_disjoint_align64_uint64_t_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: lhax r3, r3, r4
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_disjoint_align64_uint64_t_int16_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: lhax r3, r3, r4
; CHECK-PREP10-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 = sext i16 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_cst_unalign16_uint64_t_int16_t() {
; CHECK-LABEL: ld_cst_unalign16_uint64_t_int16_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lha r3, 255(0)
; CHECK-NEXT: blr
entry:
%0 = load i16, i16* inttoptr (i64 255 to i16*), align 2
%conv = sext i16 %0 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_cst_align16_uint64_t_int16_t() {
; CHECK-LABEL: ld_cst_align16_uint64_t_int16_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lha r3, 4080(0)
; CHECK-NEXT: blr
entry:
%0 = load i16, i16* inttoptr (i64 4080 to i16*), align 16
%conv = sext i16 %0 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_cst_unalign32_uint64_t_int16_t() {
; CHECK-LABEL: ld_cst_unalign32_uint64_t_int16_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lis r3, 2
; CHECK-NEXT: lha r3, -31073(r3)
; CHECK-NEXT: blr
entry:
%0 = load i16, i16* inttoptr (i64 99999 to i16*), align 2
%conv = sext i16 %0 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_cst_align32_uint64_t_int16_t() {
; CHECK-LABEL: ld_cst_align32_uint64_t_int16_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lis r3, 153
; CHECK-NEXT: lha r3, -27108(r3)
; CHECK-NEXT: blr
entry:
%0 = load i16, i16* inttoptr (i64 9999900 to i16*), align 4
%conv = sext i16 %0 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_cst_unalign64_uint64_t_int16_t() {
; CHECK-P10-LABEL: ld_cst_unalign64_uint64_t_int16_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r3, 232
; CHECK-P10-NEXT: pli r4, 3567587329
; CHECK-P10-NEXT: rldimi r4, r3, 32, 0
; CHECK-P10-NEXT: lha r3, 0(r4)
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_cst_unalign64_uint64_t_int16_t:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: li r3, 29
; CHECK-PREP10-NEXT: rldic r3, r3, 35, 24
; CHECK-PREP10-NEXT: oris r3, r3, 54437
; CHECK-PREP10-NEXT: ori r3, r3, 4097
; CHECK-PREP10-NEXT: lha r3, 0(r3)
; CHECK-PREP10-NEXT: blr
entry:
%0 = load i16, i16* inttoptr (i64 1000000000001 to i16*), align 2
%conv = sext i16 %0 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_cst_align64_uint64_t_int16_t() {
; CHECK-P10-LABEL: ld_cst_align64_uint64_t_int16_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r3, 244140625
; CHECK-P10-NEXT: rldic r3, r3, 12, 24
; CHECK-P10-NEXT: lha r3, 0(r3)
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_cst_align64_uint64_t_int16_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: lha r3, 0(r3)
; CHECK-PREP10-NEXT: blr
entry:
%0 = load i16, i16* inttoptr (i64 1000000000000 to i16*), align 4096
%conv = sext i16 %0 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_0_uint64_t_uint32_t(i64 %ptr) {
; CHECK-LABEL: ld_0_uint64_t_uint32_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lwz r3, 0(r3)
; CHECK-NEXT: blr
entry:
%0 = inttoptr i64 %ptr to i32*
%1 = load i32, i32* %0, align 4
%conv = zext i32 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_unalign16_uint64_t_uint32_t(i8* nocapture readonly %ptr) {
; CHECK-LABEL: ld_unalign16_uint64_t_uint32_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lwz r3, 1(r3)
; CHECK-NEXT: blr
entry:
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1
%0 = bitcast i8* %add.ptr to i32*
%1 = load i32, i32* %0, align 4
%conv = zext i32 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_align16_uint64_t_uint32_t(i8* nocapture readonly %ptr) {
; CHECK-LABEL: ld_align16_uint64_t_uint32_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lwz r3, 8(r3)
; 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 = zext i32 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_unalign32_uint64_t_uint32_t(i8* nocapture readonly %ptr) {
; CHECK-P10-LABEL: ld_unalign32_uint64_t_uint32_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r4, 99999
; CHECK-P10-NEXT: lwzx r3, r3, r4
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_unalign32_uint64_t_uint32_t:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: lis r4, 1
; CHECK-PREP10-NEXT: ori r4, r4, 34463
; CHECK-PREP10-NEXT: lwzx r3, r3, r4
; CHECK-PREP10-NEXT: blr
entry:
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 99999
%0 = bitcast i8* %add.ptr to i32*
%1 = load i32, i32* %0, align 4
%conv = zext i32 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_align32_uint64_t_uint32_t(i8* nocapture readonly %ptr) {
; CHECK-P10-LABEL: ld_align32_uint64_t_uint32_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r4, 99999000
; CHECK-P10-NEXT: lwzx r3, r3, r4
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_align32_uint64_t_uint32_t:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: lis r4, 1525
; CHECK-PREP10-NEXT: ori r4, r4, 56600
; CHECK-PREP10-NEXT: lwzx r3, r3, r4
; 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 = zext i32 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_unalign64_uint64_t_uint32_t(i8* nocapture readonly %ptr) {
; CHECK-P10-LABEL: ld_unalign64_uint64_t_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: lwzx r3, r3, r5
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_unalign64_uint64_t_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: lwzx r3, r3, r4
; CHECK-PREP10-NEXT: blr
entry:
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1000000000001
%0 = bitcast i8* %add.ptr to i32*
%1 = load i32, i32* %0, align 4
%conv = zext i32 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_align64_uint64_t_uint32_t(i8* nocapture readonly %ptr) {
; CHECK-P10-LABEL: ld_align64_uint64_t_uint32_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r4, 244140625
; CHECK-P10-NEXT: rldic r4, r4, 12, 24
; CHECK-P10-NEXT: lwzx r3, r3, r4
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_align64_uint64_t_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: lwzx r3, r3, r4
; 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 = zext i32 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_reg_uint64_t_uint32_t(i8* nocapture readonly %ptr, i64 %off) {
; CHECK-LABEL: ld_reg_uint64_t_uint32_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lwzx r3, r3, r4
; 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 = zext i32 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_or_uint64_t_uint32_t(i64 %ptr, i8 zeroext %off) {
; CHECK-LABEL: ld_or_uint64_t_uint32_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: or r3, r4, r3
; CHECK-NEXT: lwz r3, 0(r3)
; 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 = zext i32 %1 to i64
ret i64 %conv1
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_or2_uint64_t_uint32_t(i64 %ptr, i8 zeroext %off) {
; CHECK-LABEL: ld_or2_uint64_t_uint32_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: rldicr r3, r3, 0, 51
; CHECK-NEXT: lwzx r3, r3, r4
; CHECK-NEXT: blr
entry:
%and = and i64 %ptr, -4096
%conv = zext i8 %off to i64
%or = or i64 %and, %conv
%0 = inttoptr i64 %or to i32*
%1 = load i32, i32* %0, align 4
%conv1 = zext i32 %1 to i64
ret i64 %conv1
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_not_disjoint16_uint64_t_uint32_t(i64 %ptr) {
; CHECK-LABEL: ld_not_disjoint16_uint64_t_uint32_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: ori r3, r3, 6
; CHECK-NEXT: lwz r3, 0(r3)
; CHECK-NEXT: blr
entry:
%or = or i64 %ptr, 6
%0 = inttoptr i64 %or to i32*
%1 = load i32, i32* %0, align 4
%conv = zext i32 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_disjoint_unalign16_uint64_t_uint32_t(i64 %ptr) {
; CHECK-LABEL: ld_disjoint_unalign16_uint64_t_uint32_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: rldicr r3, r3, 0, 51
; CHECK-NEXT: lwz r3, 6(r3)
; CHECK-NEXT: blr
entry:
%and = and i64 %ptr, -4096
%or = or i64 %and, 6
%0 = inttoptr i64 %or to i32*
%1 = load i32, i32* %0, align 4
%conv = zext i32 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_disjoint_align16_uint64_t_uint32_t(i64 %ptr) {
; CHECK-LABEL: ld_disjoint_align16_uint64_t_uint32_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: rldicr r3, r3, 0, 51
; CHECK-NEXT: lwz r3, 24(r3)
; 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 = zext i32 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_not_disjoint32_uint64_t_uint32_t(i64 %ptr) {
; CHECK-LABEL: ld_not_disjoint32_uint64_t_uint32_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: ori r3, r3, 34463
; CHECK-NEXT: oris r3, r3, 1
; CHECK-NEXT: lwz r3, 0(r3)
; CHECK-NEXT: blr
entry:
%or = or i64 %ptr, 99999
%0 = inttoptr i64 %or to i32*
%1 = load i32, i32* %0, align 4
%conv = zext i32 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_disjoint_unalign32_uint64_t_uint32_t(i64 %ptr) {
; CHECK-P10-LABEL: ld_disjoint_unalign32_uint64_t_uint32_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: rldicr r3, r3, 0, 43
; CHECK-P10-NEXT: pli r4, 99999
; CHECK-P10-NEXT: lwzx r3, r3, r4
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_disjoint_unalign32_uint64_t_uint32_t:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: lis r4, 1
; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 43
; CHECK-PREP10-NEXT: ori r4, r4, 34463
; CHECK-PREP10-NEXT: lwzx r3, r3, r4
; CHECK-PREP10-NEXT: blr
entry:
%and = and i64 %ptr, -1048576
%or = or i64 %and, 99999
%0 = inttoptr i64 %or to i32*
%1 = load i32, i32* %0, align 4
%conv = zext i32 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_disjoint_align32_uint64_t_uint32_t(i64 %ptr) {
; CHECK-P10-LABEL: ld_disjoint_align32_uint64_t_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: lwzx r3, r3, r4
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: ld_disjoint_align32_uint64_t_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: lwzx r3, r3, r4
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: ld_disjoint_align32_uint64_t_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: lwzx r3, r3, r4
; 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 = zext i32 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_not_disjoint64_uint64_t_uint32_t(i64 %ptr) {
; CHECK-P10-LABEL: ld_not_disjoint64_uint64_t_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: lwz r3, 0(r3)
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_not_disjoint64_uint64_t_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: lwz r3, 0(r3)
; CHECK-PREP10-NEXT: blr
entry:
%or = or i64 %ptr, 1000000000001
%0 = inttoptr i64 %or to i32*
%1 = load i32, i32* %0, align 4
%conv = zext i32 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_disjoint_unalign64_uint64_t_uint32_t(i64 %ptr) {
; CHECK-P10-LABEL: ld_disjoint_unalign64_uint64_t_uint32_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r4, 232
; CHECK-P10-NEXT: pli r5, 3567587329
; CHECK-P10-NEXT: rldicr r3, r3, 0, 23
; CHECK-P10-NEXT: rldimi r5, r4, 32, 0
; CHECK-P10-NEXT: lwzx r3, r3, r5
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_disjoint_unalign64_uint64_t_uint32_t:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: li r4, 29
; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23
; 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: lwzx r3, r3, r4
; CHECK-PREP10-NEXT: blr
entry:
%and = and i64 %ptr, -1099511627776
%or = or i64 %and, 1000000000001
%0 = inttoptr i64 %or to i32*
%1 = load i32, i32* %0, align 4
%conv = zext i32 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_disjoint_align64_uint64_t_uint32_t(i64 %ptr) {
; CHECK-P10-LABEL: ld_disjoint_align64_uint64_t_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: lwzx r3, r3, r4
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_disjoint_align64_uint64_t_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: lwzx r3, r3, r4
; 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 = zext i32 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_cst_unalign16_uint64_t_uint32_t() {
; CHECK-LABEL: ld_cst_unalign16_uint64_t_uint32_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lwz r3, 255(0)
; CHECK-NEXT: blr
entry:
%0 = load i32, i32* inttoptr (i64 255 to i32*), align 4
%conv = zext i32 %0 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_cst_align16_uint64_t_uint32_t() {
; CHECK-LABEL: ld_cst_align16_uint64_t_uint32_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lwz r3, 4080(0)
; CHECK-NEXT: blr
entry:
%0 = load i32, i32* inttoptr (i64 4080 to i32*), align 16
%conv = zext i32 %0 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_cst_unalign32_uint64_t_uint32_t() {
; CHECK-LABEL: ld_cst_unalign32_uint64_t_uint32_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lis r3, 2
; CHECK-NEXT: lwz r3, -31073(r3)
; CHECK-NEXT: blr
entry:
%0 = load i32, i32* inttoptr (i64 99999 to i32*), align 4
%conv = zext i32 %0 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_cst_align32_uint64_t_uint32_t() {
; CHECK-LABEL: ld_cst_align32_uint64_t_uint32_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lis r3, 153
; CHECK-NEXT: lwz r3, -27108(r3)
; CHECK-NEXT: blr
entry:
%0 = load i32, i32* inttoptr (i64 9999900 to i32*), align 4
%conv = zext i32 %0 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_cst_unalign64_uint64_t_uint32_t() {
; CHECK-P10-LABEL: ld_cst_unalign64_uint64_t_uint32_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r3, 232
; CHECK-P10-NEXT: pli r4, 3567587329
; CHECK-P10-NEXT: rldimi r4, r3, 32, 0
; CHECK-P10-NEXT: lwz r3, 0(r4)
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_cst_unalign64_uint64_t_uint32_t:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: li r3, 29
; CHECK-PREP10-NEXT: rldic r3, r3, 35, 24
; CHECK-PREP10-NEXT: oris r3, r3, 54437
; CHECK-PREP10-NEXT: ori r3, r3, 4097
; CHECK-PREP10-NEXT: lwz r3, 0(r3)
; CHECK-PREP10-NEXT: blr
entry:
%0 = load i32, i32* inttoptr (i64 1000000000001 to i32*), align 4
%conv = zext i32 %0 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_cst_align64_uint64_t_uint32_t() {
; CHECK-P10-LABEL: ld_cst_align64_uint64_t_uint32_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r3, 244140625
; CHECK-P10-NEXT: rldic r3, r3, 12, 24
; CHECK-P10-NEXT: lwz r3, 0(r3)
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_cst_align64_uint64_t_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: lwz r3, 0(r3)
; CHECK-PREP10-NEXT: blr
entry:
%0 = load i32, i32* inttoptr (i64 1000000000000 to i32*), align 4096
%conv = zext i32 %0 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_0_uint64_t_int32_t(i64 %ptr) {
; CHECK-LABEL: ld_0_uint64_t_int32_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lwa r3, 0(r3)
; CHECK-NEXT: blr
entry:
%0 = inttoptr i64 %ptr to i32*
%1 = load i32, i32* %0, align 4
%conv = sext i32 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_unalign16_uint64_t_int32_t(i8* nocapture readonly %ptr) {
; CHECK-LABEL: ld_unalign16_uint64_t_int32_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: li r4, 1
; CHECK-NEXT: lwax r3, r3, r4
; CHECK-NEXT: blr
entry:
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1
%0 = bitcast i8* %add.ptr to i32*
%1 = load i32, i32* %0, align 4
%conv = sext i32 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_align16_uint64_t_int32_t(i8* nocapture readonly %ptr) {
; CHECK-LABEL: ld_align16_uint64_t_int32_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lwa r3, 8(r3)
; 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 = sext i32 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_unalign32_uint64_t_int32_t(i8* nocapture readonly %ptr) {
; CHECK-P10-LABEL: ld_unalign32_uint64_t_int32_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r4, 99999
; CHECK-P10-NEXT: lwax r3, r3, r4
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_unalign32_uint64_t_int32_t:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: lis r4, 1
; CHECK-PREP10-NEXT: ori r4, r4, 34463
; CHECK-PREP10-NEXT: lwax r3, r3, r4
; CHECK-PREP10-NEXT: blr
entry:
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 99999
%0 = bitcast i8* %add.ptr to i32*
%1 = load i32, i32* %0, align 4
%conv = sext i32 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_align32_uint64_t_int32_t(i8* nocapture readonly %ptr) {
; CHECK-P10-LABEL: ld_align32_uint64_t_int32_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r4, 99999000
; CHECK-P10-NEXT: lwax r3, r3, r4
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_align32_uint64_t_int32_t:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: lis r4, 1525
; CHECK-PREP10-NEXT: ori r4, r4, 56600
; CHECK-PREP10-NEXT: lwax r3, r3, r4
; 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 = sext i32 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_unalign64_uint64_t_int32_t(i8* nocapture readonly %ptr) {
; CHECK-P10-LABEL: ld_unalign64_uint64_t_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: lwax r3, r3, r5
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_unalign64_uint64_t_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: lwax r3, r3, r4
; CHECK-PREP10-NEXT: blr
entry:
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1000000000001
%0 = bitcast i8* %add.ptr to i32*
%1 = load i32, i32* %0, align 4
%conv = sext i32 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_align64_uint64_t_int32_t(i8* nocapture readonly %ptr) {
; CHECK-P10-LABEL: ld_align64_uint64_t_int32_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r4, 244140625
; CHECK-P10-NEXT: rldic r4, r4, 12, 24
; CHECK-P10-NEXT: lwax r3, r3, r4
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_align64_uint64_t_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: lwax r3, r3, r4
; 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 = sext i32 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_reg_uint64_t_int32_t(i8* nocapture readonly %ptr, i64 %off) {
; CHECK-LABEL: ld_reg_uint64_t_int32_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lwax r3, r3, r4
; 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 = sext i32 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_or_uint64_t_int32_t(i64 %ptr, i8 zeroext %off) {
; CHECK-LABEL: ld_or_uint64_t_int32_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: or r3, r4, r3
; CHECK-NEXT: lwa r3, 0(r3)
; 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 = sext i32 %1 to i64
ret i64 %conv1
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_or2_uint64_t_int32_t(i64 %ptr, i8 zeroext %off) {
; CHECK-LABEL: ld_or2_uint64_t_int32_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: rldicr r3, r3, 0, 51
; CHECK-NEXT: lwax r3, r3, r4
; CHECK-NEXT: blr
entry:
%and = and i64 %ptr, -4096
%conv = zext i8 %off to i64
%or = or i64 %and, %conv
%0 = inttoptr i64 %or to i32*
%1 = load i32, i32* %0, align 4
%conv1 = sext i32 %1 to i64
ret i64 %conv1
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_not_disjoint16_uint64_t_int32_t(i64 %ptr) {
; CHECK-LABEL: ld_not_disjoint16_uint64_t_int32_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: ori r3, r3, 6
; CHECK-NEXT: lwa r3, 0(r3)
; CHECK-NEXT: blr
entry:
%or = or i64 %ptr, 6
%0 = inttoptr i64 %or to i32*
%1 = load i32, i32* %0, align 4
%conv = sext i32 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_disjoint_unalign16_uint64_t_int32_t(i64 %ptr) {
; CHECK-P10-LABEL: ld_disjoint_unalign16_uint64_t_int32_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: rldicr r3, r3, 0, 51
; CHECK-P10-NEXT: li r4, 6
; CHECK-P10-NEXT: lwax r3, r3, r4
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: ld_disjoint_unalign16_uint64_t_int32_t:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: rldicr r3, r3, 0, 51
; CHECK-P9-NEXT: li r4, 6
; CHECK-P9-NEXT: lwax r3, r3, r4
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: ld_disjoint_unalign16_uint64_t_int32_t:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: li r4, 6
; CHECK-P8-NEXT: rldicr r3, r3, 0, 51
; CHECK-P8-NEXT: lwax r3, r3, r4
; CHECK-P8-NEXT: blr
entry:
%and = and i64 %ptr, -4096
%or = or i64 %and, 6
%0 = inttoptr i64 %or to i32*
%1 = load i32, i32* %0, align 4
%conv = sext i32 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_disjoint_align16_uint64_t_int32_t(i64 %ptr) {
; CHECK-LABEL: ld_disjoint_align16_uint64_t_int32_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: rldicr r3, r3, 0, 51
; CHECK-NEXT: lwa r3, 24(r3)
; 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 = sext i32 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_not_disjoint32_uint64_t_int32_t(i64 %ptr) {
; CHECK-LABEL: ld_not_disjoint32_uint64_t_int32_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: ori r3, r3, 34463
; CHECK-NEXT: oris r3, r3, 1
; CHECK-NEXT: lwa r3, 0(r3)
; CHECK-NEXT: blr
entry:
%or = or i64 %ptr, 99999
%0 = inttoptr i64 %or to i32*
%1 = load i32, i32* %0, align 4
%conv = sext i32 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_disjoint_unalign32_uint64_t_int32_t(i64 %ptr) {
; CHECK-P10-LABEL: ld_disjoint_unalign32_uint64_t_int32_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: rldicr r3, r3, 0, 43
; CHECK-P10-NEXT: pli r4, 99999
; CHECK-P10-NEXT: lwax r3, r3, r4
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_disjoint_unalign32_uint64_t_int32_t:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: lis r4, 1
; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 43
; CHECK-PREP10-NEXT: ori r4, r4, 34463
; CHECK-PREP10-NEXT: lwax r3, r3, r4
; CHECK-PREP10-NEXT: blr
entry:
%and = and i64 %ptr, -1048576
%or = or i64 %and, 99999
%0 = inttoptr i64 %or to i32*
%1 = load i32, i32* %0, align 4
%conv = sext i32 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_disjoint_align32_uint64_t_int32_t(i64 %ptr) {
; CHECK-P10-LABEL: ld_disjoint_align32_uint64_t_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: lwax r3, r3, r4
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: ld_disjoint_align32_uint64_t_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: lwax r3, r3, r4
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: ld_disjoint_align32_uint64_t_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: lwax r3, r3, r4
; 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 = sext i32 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_not_disjoint64_uint64_t_int32_t(i64 %ptr) {
; CHECK-P10-LABEL: ld_not_disjoint64_uint64_t_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: lwa r3, 0(r3)
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_not_disjoint64_uint64_t_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: lwa r3, 0(r3)
; CHECK-PREP10-NEXT: blr
entry:
%or = or i64 %ptr, 1000000000001
%0 = inttoptr i64 %or to i32*
%1 = load i32, i32* %0, align 4
%conv = sext i32 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_disjoint_unalign64_uint64_t_int32_t(i64 %ptr) {
; CHECK-P10-LABEL: ld_disjoint_unalign64_uint64_t_int32_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r4, 232
; CHECK-P10-NEXT: pli r5, 3567587329
; CHECK-P10-NEXT: rldicr r3, r3, 0, 23
; CHECK-P10-NEXT: rldimi r5, r4, 32, 0
; CHECK-P10-NEXT: lwax r3, r3, r5
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_disjoint_unalign64_uint64_t_int32_t:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: li r4, 29
; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23
; 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: lwax r3, r3, r4
; CHECK-PREP10-NEXT: blr
entry:
%and = and i64 %ptr, -1099511627776
%or = or i64 %and, 1000000000001
%0 = inttoptr i64 %or to i32*
%1 = load i32, i32* %0, align 4
%conv = sext i32 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_disjoint_align64_uint64_t_int32_t(i64 %ptr) {
; CHECK-P10-LABEL: ld_disjoint_align64_uint64_t_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: lwax r3, r3, r4
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_disjoint_align64_uint64_t_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: lwax r3, r3, r4
; 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 = sext i32 %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_cst_unalign16_uint64_t_int32_t() {
; CHECK-LABEL: ld_cst_unalign16_uint64_t_int32_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: li r3, 255
; CHECK-NEXT: lwa r3, 0(r3)
; CHECK-NEXT: blr
entry:
%0 = load i32, i32* inttoptr (i64 255 to i32*), align 4
%conv = sext i32 %0 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_cst_align16_uint64_t_int32_t() {
; CHECK-LABEL: ld_cst_align16_uint64_t_int32_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lwa r3, 4080(0)
; CHECK-NEXT: blr
entry:
%0 = load i32, i32* inttoptr (i64 4080 to i32*), align 16
%conv = sext i32 %0 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_cst_unalign32_uint64_t_int32_t() {
; CHECK-P10-LABEL: ld_cst_unalign32_uint64_t_int32_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r3, 99999
; CHECK-P10-NEXT: lwa r3, 0(r3)
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_cst_unalign32_uint64_t_int32_t:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: lis r3, 1
; CHECK-PREP10-NEXT: ori r3, r3, 34463
; CHECK-PREP10-NEXT: lwa r3, 0(r3)
; CHECK-PREP10-NEXT: blr
entry:
%0 = load i32, i32* inttoptr (i64 99999 to i32*), align 4
%conv = sext i32 %0 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_cst_align32_uint64_t_int32_t() {
; CHECK-LABEL: ld_cst_align32_uint64_t_int32_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lis r3, 153
; CHECK-NEXT: lwa r3, -27108(r3)
; CHECK-NEXT: blr
entry:
%0 = load i32, i32* inttoptr (i64 9999900 to i32*), align 4
%conv = sext i32 %0 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_cst_unalign64_uint64_t_int32_t() {
; CHECK-P10-LABEL: ld_cst_unalign64_uint64_t_int32_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r3, 232
; CHECK-P10-NEXT: pli r4, 3567587329
; CHECK-P10-NEXT: rldimi r4, r3, 32, 0
; CHECK-P10-NEXT: lwa r3, 0(r4)
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_cst_unalign64_uint64_t_int32_t:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: li r3, 29
; CHECK-PREP10-NEXT: rldic r3, r3, 35, 24
; CHECK-PREP10-NEXT: oris r3, r3, 54437
; CHECK-PREP10-NEXT: ori r3, r3, 4097
; CHECK-PREP10-NEXT: lwa r3, 0(r3)
; CHECK-PREP10-NEXT: blr
entry:
%0 = load i32, i32* inttoptr (i64 1000000000001 to i32*), align 4
%conv = sext i32 %0 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_cst_align64_uint64_t_int32_t() {
; CHECK-P10-LABEL: ld_cst_align64_uint64_t_int32_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r3, 244140625
; CHECK-P10-NEXT: rldic r3, r3, 12, 24
; CHECK-P10-NEXT: lwa r3, 0(r3)
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_cst_align64_uint64_t_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: lwa r3, 0(r3)
; CHECK-PREP10-NEXT: blr
entry:
%0 = load i32, i32* inttoptr (i64 1000000000000 to i32*), align 4096
%conv = sext i32 %0 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_0_uint64_t_uint64_t(i64 %ptr) {
; CHECK-LABEL: ld_0_uint64_t_uint64_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: ld r3, 0(r3)
; CHECK-NEXT: blr
entry:
%0 = inttoptr i64 %ptr to i64*
%1 = load i64, i64* %0, align 8
ret i64 %1
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_unalign16_uint64_t_uint64_t(i8* nocapture readonly %ptr) {
; CHECK-LABEL: ld_unalign16_uint64_t_uint64_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: li r4, 1
; CHECK-NEXT: ldx r3, r3, r4
; CHECK-NEXT: blr
entry:
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1
%0 = bitcast i8* %add.ptr to i64*
%1 = load i64, i64* %0, align 8
ret i64 %1
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_align16_uint64_t_uint64_t(i8* nocapture readonly %ptr) {
; CHECK-LABEL: ld_align16_uint64_t_uint64_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: ld r3, 8(r3)
; 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
ret i64 %1
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_unalign32_uint64_t_uint64_t(i8* nocapture readonly %ptr) {
; CHECK-P10-LABEL: ld_unalign32_uint64_t_uint64_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r4, 99999
; CHECK-P10-NEXT: ldx r3, r3, r4
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_unalign32_uint64_t_uint64_t:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: lis r4, 1
; CHECK-PREP10-NEXT: ori r4, r4, 34463
; CHECK-PREP10-NEXT: ldx r3, r3, r4
; CHECK-PREP10-NEXT: blr
entry:
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 99999
%0 = bitcast i8* %add.ptr to i64*
%1 = load i64, i64* %0, align 8
ret i64 %1
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_align32_uint64_t_uint64_t(i8* nocapture readonly %ptr) {
; CHECK-P10-LABEL: ld_align32_uint64_t_uint64_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r4, 99999000
; CHECK-P10-NEXT: ldx r3, r3, r4
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_align32_uint64_t_uint64_t:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: lis r4, 1525
; CHECK-PREP10-NEXT: ori r4, r4, 56600
; CHECK-PREP10-NEXT: ldx r3, r3, r4
; 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
ret i64 %1
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_unalign64_uint64_t_uint64_t(i8* nocapture readonly %ptr) {
; CHECK-P10-LABEL: ld_unalign64_uint64_t_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: ldx r3, r3, r5
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_unalign64_uint64_t_uint64_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: ldx r3, r3, r4
; CHECK-PREP10-NEXT: blr
entry:
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1000000000001
%0 = bitcast i8* %add.ptr to i64*
%1 = load i64, i64* %0, align 8
ret i64 %1
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_align64_uint64_t_uint64_t(i8* nocapture readonly %ptr) {
; CHECK-P10-LABEL: ld_align64_uint64_t_uint64_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r4, 244140625
; CHECK-P10-NEXT: rldic r4, r4, 12, 24
; CHECK-P10-NEXT: ldx r3, r3, r4
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_align64_uint64_t_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: ldx r3, r3, r4
; 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
ret i64 %1
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_reg_uint64_t_uint64_t(i8* nocapture readonly %ptr, i64 %off) {
; CHECK-LABEL: ld_reg_uint64_t_uint64_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: ldx r3, r3, r4
; 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
ret i64 %1
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_or_uint64_t_uint64_t(i64 %ptr, i8 zeroext %off) {
; CHECK-LABEL: ld_or_uint64_t_uint64_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: or r3, r4, r3
; CHECK-NEXT: ld r3, 0(r3)
; CHECK-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
ret i64 %1
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_or2_uint64_t_uint64_t(i64 %ptr, i8 zeroext %off) {
; CHECK-LABEL: ld_or2_uint64_t_uint64_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: rldicr r3, r3, 0, 51
; CHECK-NEXT: ldx r3, r3, r4
; CHECK-NEXT: blr
entry:
%and = and i64 %ptr, -4096
%conv = zext i8 %off to i64
%or = or i64 %and, %conv
%0 = inttoptr i64 %or to i64*
%1 = load i64, i64* %0, align 8
ret i64 %1
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_not_disjoint16_uint64_t_uint64_t(i64 %ptr) {
; CHECK-LABEL: ld_not_disjoint16_uint64_t_uint64_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: ori r3, r3, 6
; CHECK-NEXT: ld r3, 0(r3)
; CHECK-NEXT: blr
entry:
%or = or i64 %ptr, 6
%0 = inttoptr i64 %or to i64*
%1 = load i64, i64* %0, align 8
ret i64 %1
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_disjoint_unalign16_uint64_t_uint64_t(i64 %ptr) {
; CHECK-P10-LABEL: ld_disjoint_unalign16_uint64_t_uint64_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: rldicr r3, r3, 0, 51
; CHECK-P10-NEXT: li r4, 6
; CHECK-P10-NEXT: ldx r3, r3, r4
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: ld_disjoint_unalign16_uint64_t_uint64_t:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: rldicr r3, r3, 0, 51
; CHECK-P9-NEXT: li r4, 6
; CHECK-P9-NEXT: ldx r3, r3, r4
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: ld_disjoint_unalign16_uint64_t_uint64_t:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: li r4, 6
; CHECK-P8-NEXT: rldicr r3, r3, 0, 51
; CHECK-P8-NEXT: ldx r3, r3, r4
; CHECK-P8-NEXT: blr
entry:
%and = and i64 %ptr, -4096
%or = or i64 %and, 6
%0 = inttoptr i64 %or to i64*
%1 = load i64, i64* %0, align 8
ret i64 %1
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_disjoint_align16_uint64_t_uint64_t(i64 %ptr) {
; CHECK-LABEL: ld_disjoint_align16_uint64_t_uint64_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: rldicr r3, r3, 0, 51
; CHECK-NEXT: ld r3, 24(r3)
; CHECK-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
ret i64 %1
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_not_disjoint32_uint64_t_uint64_t(i64 %ptr) {
; CHECK-LABEL: ld_not_disjoint32_uint64_t_uint64_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: ori r3, r3, 34463
; CHECK-NEXT: oris r3, r3, 1
; CHECK-NEXT: ld r3, 0(r3)
; CHECK-NEXT: blr
entry:
%or = or i64 %ptr, 99999
%0 = inttoptr i64 %or to i64*
%1 = load i64, i64* %0, align 8
ret i64 %1
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_disjoint_unalign32_uint64_t_uint64_t(i64 %ptr) {
; CHECK-P10-LABEL: ld_disjoint_unalign32_uint64_t_uint64_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: rldicr r3, r3, 0, 43
; CHECK-P10-NEXT: pli r4, 99999
; CHECK-P10-NEXT: ldx r3, r3, r4
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_disjoint_unalign32_uint64_t_uint64_t:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: lis r4, 1
; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 43
; CHECK-PREP10-NEXT: ori r4, r4, 34463
; CHECK-PREP10-NEXT: ldx r3, r3, r4
; CHECK-PREP10-NEXT: blr
entry:
%and = and i64 %ptr, -1048576
%or = or i64 %and, 99999
%0 = inttoptr i64 %or to i64*
%1 = load i64, i64* %0, align 8
ret i64 %1
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_disjoint_align32_uint64_t_uint64_t(i64 %ptr) {
; CHECK-P10-LABEL: ld_disjoint_align32_uint64_t_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: ldx r3, r3, r4
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: ld_disjoint_align32_uint64_t_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: ldx r3, r3, r4
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: ld_disjoint_align32_uint64_t_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: ldx r3, r3, r4
; 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
ret i64 %1
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_not_disjoint64_uint64_t_uint64_t(i64 %ptr) {
; CHECK-P10-LABEL: ld_not_disjoint64_uint64_t_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: ld r3, 0(r3)
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_not_disjoint64_uint64_t_uint64_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: ld r3, 0(r3)
; CHECK-PREP10-NEXT: blr
entry:
%or = or i64 %ptr, 1000000000001
%0 = inttoptr i64 %or to i64*
%1 = load i64, i64* %0, align 8
ret i64 %1
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_disjoint_unalign64_uint64_t_uint64_t(i64 %ptr) {
; CHECK-P10-LABEL: ld_disjoint_unalign64_uint64_t_uint64_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r4, 232
; CHECK-P10-NEXT: pli r5, 3567587329
; CHECK-P10-NEXT: rldicr r3, r3, 0, 23
; CHECK-P10-NEXT: rldimi r5, r4, 32, 0
; CHECK-P10-NEXT: ldx r3, r3, r5
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_disjoint_unalign64_uint64_t_uint64_t:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: li r4, 29
; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23
; 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: ldx r3, r3, r4
; CHECK-PREP10-NEXT: blr
entry:
%and = and i64 %ptr, -1099511627776
%or = or i64 %and, 1000000000001
%0 = inttoptr i64 %or to i64*
%1 = load i64, i64* %0, align 8
ret i64 %1
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_disjoint_align64_uint64_t_uint64_t(i64 %ptr) {
; CHECK-P10-LABEL: ld_disjoint_align64_uint64_t_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: ldx r3, r3, r4
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_disjoint_align64_uint64_t_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: ldx r3, r3, r4
; 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
ret i64 %1
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_cst_unalign16_uint64_t_uint64_t() {
; CHECK-LABEL: ld_cst_unalign16_uint64_t_uint64_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: li r3, 255
; CHECK-NEXT: ld r3, 0(r3)
; CHECK-NEXT: blr
entry:
%0 = load i64, i64* inttoptr (i64 255 to i64*), align 8
ret i64 %0
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_cst_align16_uint64_t_uint64_t() {
; CHECK-LABEL: ld_cst_align16_uint64_t_uint64_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: ld r3, 4080(0)
; CHECK-NEXT: blr
entry:
%0 = load i64, i64* inttoptr (i64 4080 to i64*), align 16
ret i64 %0
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_cst_unalign32_uint64_t_uint64_t() {
; CHECK-P10-LABEL: ld_cst_unalign32_uint64_t_uint64_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r3, 99999
; CHECK-P10-NEXT: ld r3, 0(r3)
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_cst_unalign32_uint64_t_uint64_t:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: lis r3, 1
; CHECK-PREP10-NEXT: ori r3, r3, 34463
; CHECK-PREP10-NEXT: ld r3, 0(r3)
; CHECK-PREP10-NEXT: blr
entry:
%0 = load i64, i64* inttoptr (i64 99999 to i64*), align 8
ret i64 %0
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_cst_align32_uint64_t_uint64_t() {
; CHECK-LABEL: ld_cst_align32_uint64_t_uint64_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lis r3, 153
; CHECK-NEXT: ld r3, -27108(r3)
; CHECK-NEXT: blr
entry:
%0 = load i64, i64* inttoptr (i64 9999900 to i64*), align 8
ret i64 %0
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_cst_unalign64_uint64_t_uint64_t() {
; CHECK-P10-LABEL: ld_cst_unalign64_uint64_t_uint64_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r3, 232
; CHECK-P10-NEXT: pli r4, 3567587329
; CHECK-P10-NEXT: rldimi r4, r3, 32, 0
; CHECK-P10-NEXT: ld r3, 0(r4)
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_cst_unalign64_uint64_t_uint64_t:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: li r3, 29
; CHECK-PREP10-NEXT: rldic r3, r3, 35, 24
; CHECK-PREP10-NEXT: oris r3, r3, 54437
; CHECK-PREP10-NEXT: ori r3, r3, 4097
; CHECK-PREP10-NEXT: ld r3, 0(r3)
; CHECK-PREP10-NEXT: blr
entry:
%0 = load i64, i64* inttoptr (i64 1000000000001 to i64*), align 8
ret i64 %0
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_cst_align64_uint64_t_uint64_t() {
; CHECK-P10-LABEL: ld_cst_align64_uint64_t_uint64_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r3, 244140625
; CHECK-P10-NEXT: rldic r3, r3, 12, 24
; CHECK-P10-NEXT: ld r3, 0(r3)
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_cst_align64_uint64_t_uint64_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: ld r3, 0(r3)
; CHECK-PREP10-NEXT: blr
entry:
%0 = load i64, i64* inttoptr (i64 1000000000000 to i64*), align 4096
ret i64 %0
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_0_uint64_t_float(i64 %ptr) {
; CHECK-P10-LABEL: ld_0_uint64_t_float:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: lfs f0, 0(r3)
; CHECK-P10-NEXT: xscvdpuxds f0, f0
; CHECK-P10-NEXT: mffprd r3, f0
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: ld_0_uint64_t_float:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: lfs f0, 0(r3)
; CHECK-P9-NEXT: xscvdpuxds f0, f0
; CHECK-P9-NEXT: mffprd r3, f0
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: ld_0_uint64_t_float:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: lfsx f0, 0, r3
; CHECK-P8-NEXT: xscvdpuxds f0, f0
; CHECK-P8-NEXT: mffprd r3, f0
; CHECK-P8-NEXT: blr
entry:
%0 = inttoptr i64 %ptr to float*
%1 = load float, float* %0, align 4
%conv = fptoui float %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_unalign16_uint64_t_float(i8* nocapture readonly %ptr) {
; CHECK-LABEL: ld_unalign16_uint64_t_float:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lfs f0, 1(r3)
; CHECK-NEXT: xscvdpuxds f0, f0
; CHECK-NEXT: mffprd r3, f0
; CHECK-NEXT: blr
entry:
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1
%0 = bitcast i8* %add.ptr to float*
%1 = load float, float* %0, align 4
%conv = fptoui float %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_align16_uint64_t_float(i8* nocapture readonly %ptr) {
; CHECK-LABEL: ld_align16_uint64_t_float:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lfs f0, 8(r3)
; CHECK-NEXT: xscvdpuxds f0, f0
; CHECK-NEXT: mffprd r3, f0
; 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
%conv = fptoui float %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_unalign32_uint64_t_float(i8* nocapture readonly %ptr) {
; CHECK-P10-LABEL: ld_unalign32_uint64_t_float:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r4, 99999
; CHECK-P10-NEXT: lfsx f0, r3, r4
; CHECK-P10-NEXT: xscvdpuxds f0, f0
; CHECK-P10-NEXT: mffprd r3, f0
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_unalign32_uint64_t_float:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: lis r4, 1
; CHECK-PREP10-NEXT: ori r4, r4, 34463
; CHECK-PREP10-NEXT: lfsx f0, r3, r4
; CHECK-PREP10-NEXT: xscvdpuxds f0, f0
; CHECK-PREP10-NEXT: mffprd r3, f0
; CHECK-PREP10-NEXT: blr
entry:
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 99999
%0 = bitcast i8* %add.ptr to float*
%1 = load float, float* %0, align 4
%conv = fptoui float %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_align32_uint64_t_float(i8* nocapture readonly %ptr) {
; CHECK-P10-LABEL: ld_align32_uint64_t_float:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r4, 99999000
; CHECK-P10-NEXT: lfsx f0, r3, r4
; CHECK-P10-NEXT: xscvdpuxds f0, f0
; CHECK-P10-NEXT: mffprd r3, f0
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_align32_uint64_t_float:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: lis r4, 1525
; CHECK-PREP10-NEXT: ori r4, r4, 56600
; CHECK-PREP10-NEXT: lfsx f0, r3, r4
; CHECK-PREP10-NEXT: xscvdpuxds f0, f0
; CHECK-PREP10-NEXT: mffprd r3, f0
; 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
%conv = fptoui float %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_unalign64_uint64_t_float(i8* nocapture readonly %ptr) {
; CHECK-P10-LABEL: ld_unalign64_uint64_t_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: lfsx f0, r3, r5
; CHECK-P10-NEXT: xscvdpuxds f0, f0
; CHECK-P10-NEXT: mffprd r3, f0
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_unalign64_uint64_t_float:
; 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: lfsx f0, r3, r4
; CHECK-PREP10-NEXT: xscvdpuxds f0, f0
; CHECK-PREP10-NEXT: mffprd r3, f0
; CHECK-PREP10-NEXT: blr
entry:
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1000000000001
%0 = bitcast i8* %add.ptr to float*
%1 = load float, float* %0, align 4
%conv = fptoui float %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_align64_uint64_t_float(i8* nocapture readonly %ptr) {
; CHECK-P10-LABEL: ld_align64_uint64_t_float:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r4, 244140625
; CHECK-P10-NEXT: rldic r4, r4, 12, 24
; CHECK-P10-NEXT: lfsx f0, r3, r4
; CHECK-P10-NEXT: xscvdpuxds f0, f0
; CHECK-P10-NEXT: mffprd r3, f0
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_align64_uint64_t_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 f0, r3, r4
; CHECK-PREP10-NEXT: xscvdpuxds f0, f0
; CHECK-PREP10-NEXT: mffprd r3, f0
; 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
%conv = fptoui float %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_reg_uint64_t_float(i8* nocapture readonly %ptr, i64 %off) {
; CHECK-LABEL: ld_reg_uint64_t_float:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lfsx f0, r3, r4
; CHECK-NEXT: xscvdpuxds f0, f0
; CHECK-NEXT: mffprd r3, f0
; 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
%conv = fptoui float %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_or_uint64_t_float(i64 %ptr, i8 zeroext %off) {
; CHECK-P10-LABEL: ld_or_uint64_t_float:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: or r3, r4, r3
; CHECK-P10-NEXT: lfs f0, 0(r3)
; CHECK-P10-NEXT: xscvdpuxds f0, f0
; CHECK-P10-NEXT: mffprd r3, f0
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: ld_or_uint64_t_float:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: or r3, r4, r3
; CHECK-P9-NEXT: lfs f0, 0(r3)
; CHECK-P9-NEXT: xscvdpuxds f0, f0
; CHECK-P9-NEXT: mffprd r3, f0
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: ld_or_uint64_t_float:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: or r3, r4, r3
; CHECK-P8-NEXT: lfsx f0, 0, r3
; CHECK-P8-NEXT: xscvdpuxds f0, f0
; CHECK-P8-NEXT: mffprd r3, f0
; 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
%conv1 = fptoui float %1 to i64
ret i64 %conv1
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_or2_uint64_t_float(i64 %ptr, i8 zeroext %off) {
; CHECK-LABEL: ld_or2_uint64_t_float:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: rldicr r3, r3, 0, 51
; CHECK-NEXT: lfsx f0, r3, r4
; CHECK-NEXT: xscvdpuxds f0, f0
; CHECK-NEXT: mffprd r3, f0
; CHECK-NEXT: blr
entry:
%and = and i64 %ptr, -4096
%conv = zext i8 %off to i64
%or = or i64 %and, %conv
%0 = inttoptr i64 %or to float*
%1 = load float, float* %0, align 4
%conv1 = fptoui float %1 to i64
ret i64 %conv1
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_not_disjoint16_uint64_t_float(i64 %ptr) {
; CHECK-P10-LABEL: ld_not_disjoint16_uint64_t_float:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: ori r3, r3, 6
; CHECK-P10-NEXT: lfs f0, 0(r3)
; CHECK-P10-NEXT: xscvdpuxds f0, f0
; CHECK-P10-NEXT: mffprd r3, f0
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: ld_not_disjoint16_uint64_t_float:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: ori r3, r3, 6
; CHECK-P9-NEXT: lfs f0, 0(r3)
; CHECK-P9-NEXT: xscvdpuxds f0, f0
; CHECK-P9-NEXT: mffprd r3, f0
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: ld_not_disjoint16_uint64_t_float:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: ori r3, r3, 6
; CHECK-P8-NEXT: lfsx f0, 0, r3
; CHECK-P8-NEXT: xscvdpuxds f0, f0
; CHECK-P8-NEXT: mffprd r3, f0
; CHECK-P8-NEXT: blr
entry:
%or = or i64 %ptr, 6
%0 = inttoptr i64 %or to float*
%1 = load float, float* %0, align 4
%conv = fptoui float %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_disjoint_unalign16_uint64_t_float(i64 %ptr) {
; CHECK-LABEL: ld_disjoint_unalign16_uint64_t_float:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: rldicr r3, r3, 0, 51
; CHECK-NEXT: ori r3, r3, 6
; CHECK-NEXT: lfsx f0, 0, r3
; CHECK-NEXT: xscvdpuxds f0, f0
; CHECK-NEXT: mffprd r3, f0
; CHECK-NEXT: blr
entry:
%and = and i64 %ptr, -4096
%or = or i64 %and, 6
%0 = inttoptr i64 %or to float*
%1 = load float, float* %0, align 4
%conv = fptoui float %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_disjoint_align16_uint64_t_float(i64 %ptr) {
; CHECK-P10-LABEL: ld_disjoint_align16_uint64_t_float:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: rldicr r3, r3, 0, 51
; CHECK-P10-NEXT: lfs f0, 24(r3)
; CHECK-P10-NEXT: xscvdpuxds f0, f0
; CHECK-P10-NEXT: mffprd r3, f0
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: ld_disjoint_align16_uint64_t_float:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: rldicr r3, r3, 0, 51
; CHECK-P9-NEXT: lfs f0, 24(r3)
; CHECK-P9-NEXT: xscvdpuxds f0, f0
; CHECK-P9-NEXT: mffprd r3, f0
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: ld_disjoint_align16_uint64_t_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 f0, 0, r3
; CHECK-P8-NEXT: xscvdpuxds f0, f0
; CHECK-P8-NEXT: mffprd r3, f0
; 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
%conv = fptoui float %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_not_disjoint32_uint64_t_float(i64 %ptr) {
; CHECK-P10-LABEL: ld_not_disjoint32_uint64_t_float:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: ori r3, r3, 34463
; CHECK-P10-NEXT: oris r3, r3, 1
; CHECK-P10-NEXT: lfs f0, 0(r3)
; CHECK-P10-NEXT: xscvdpuxds f0, f0
; CHECK-P10-NEXT: mffprd r3, f0
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: ld_not_disjoint32_uint64_t_float:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: ori r3, r3, 34463
; CHECK-P9-NEXT: oris r3, r3, 1
; CHECK-P9-NEXT: lfs f0, 0(r3)
; CHECK-P9-NEXT: xscvdpuxds f0, f0
; CHECK-P9-NEXT: mffprd r3, f0
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: ld_not_disjoint32_uint64_t_float:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: ori r3, r3, 34463
; CHECK-P8-NEXT: oris r3, r3, 1
; CHECK-P8-NEXT: lfsx f0, 0, r3
; CHECK-P8-NEXT: xscvdpuxds f0, f0
; CHECK-P8-NEXT: mffprd r3, f0
; CHECK-P8-NEXT: blr
entry:
%or = or i64 %ptr, 99999
%0 = inttoptr i64 %or to float*
%1 = load float, float* %0, align 4
%conv = fptoui float %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_disjoint_unalign32_uint64_t_float(i64 %ptr) {
; CHECK-P10-LABEL: ld_disjoint_unalign32_uint64_t_float:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: rldicr r3, r3, 0, 43
; CHECK-P10-NEXT: pli r4, 99999
; CHECK-P10-NEXT: lfsx f0, r3, r4
; CHECK-P10-NEXT: xscvdpuxds f0, f0
; CHECK-P10-NEXT: mffprd r3, f0
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_disjoint_unalign32_uint64_t_float:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: lis r4, 1
; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 43
; CHECK-PREP10-NEXT: ori r4, r4, 34463
; CHECK-PREP10-NEXT: lfsx f0, r3, r4
; CHECK-PREP10-NEXT: xscvdpuxds f0, f0
; CHECK-PREP10-NEXT: mffprd r3, f0
; CHECK-PREP10-NEXT: blr
entry:
%and = and i64 %ptr, -1048576
%or = or i64 %and, 99999
%0 = inttoptr i64 %or to float*
%1 = load float, float* %0, align 4
%conv = fptoui float %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_disjoint_align32_uint64_t_float(i64 %ptr) {
; CHECK-P10-LABEL: ld_disjoint_align32_uint64_t_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 f0, r3, r4
; CHECK-P10-NEXT: xscvdpuxds f0, f0
; CHECK-P10-NEXT: mffprd r3, f0
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: ld_disjoint_align32_uint64_t_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 f0, r3, r4
; CHECK-P9-NEXT: xscvdpuxds f0, f0
; CHECK-P9-NEXT: mffprd r3, f0
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: ld_disjoint_align32_uint64_t_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 f0, r3, r4
; CHECK-P8-NEXT: xscvdpuxds f0, f0
; CHECK-P8-NEXT: mffprd r3, f0
; 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
%conv = fptoui float %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_not_disjoint64_uint64_t_float(i64 %ptr) {
; CHECK-P10-LABEL: ld_not_disjoint64_uint64_t_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 f0, 0(r3)
; CHECK-P10-NEXT: xscvdpuxds f0, f0
; CHECK-P10-NEXT: mffprd r3, f0
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: ld_not_disjoint64_uint64_t_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 f0, 0(r3)
; CHECK-P9-NEXT: xscvdpuxds f0, f0
; CHECK-P9-NEXT: mffprd r3, f0
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: ld_not_disjoint64_uint64_t_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 f0, 0, r3
; CHECK-P8-NEXT: xscvdpuxds f0, f0
; CHECK-P8-NEXT: mffprd r3, f0
; CHECK-P8-NEXT: blr
entry:
%or = or i64 %ptr, 1000000000001
%0 = inttoptr i64 %or to float*
%1 = load float, float* %0, align 4
%conv = fptoui float %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_disjoint_unalign64_uint64_t_float(i64 %ptr) {
; CHECK-P10-LABEL: ld_disjoint_unalign64_uint64_t_float:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r4, 232
; CHECK-P10-NEXT: pli r5, 3567587329
; CHECK-P10-NEXT: rldicr r3, r3, 0, 23
; CHECK-P10-NEXT: rldimi r5, r4, 32, 0
; CHECK-P10-NEXT: lfsx f0, r3, r5
; CHECK-P10-NEXT: xscvdpuxds f0, f0
; CHECK-P10-NEXT: mffprd r3, f0
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_disjoint_unalign64_uint64_t_float:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: li r4, 29
; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23
; 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: lfsx f0, r3, r4
; CHECK-PREP10-NEXT: xscvdpuxds f0, f0
; CHECK-PREP10-NEXT: mffprd r3, f0
; CHECK-PREP10-NEXT: blr
entry:
%and = and i64 %ptr, -1099511627776
%or = or i64 %and, 1000000000001
%0 = inttoptr i64 %or to float*
%1 = load float, float* %0, align 4
%conv = fptoui float %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_disjoint_align64_uint64_t_float(i64 %ptr) {
; CHECK-P10-LABEL: ld_disjoint_align64_uint64_t_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 f0, r3, r4
; CHECK-P10-NEXT: xscvdpuxds f0, f0
; CHECK-P10-NEXT: mffprd r3, f0
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_disjoint_align64_uint64_t_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 f0, r3, r4
; CHECK-PREP10-NEXT: xscvdpuxds f0, f0
; CHECK-PREP10-NEXT: mffprd r3, f0
; 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
%conv = fptoui float %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_cst_unalign16_uint64_t_float() {
; CHECK-P10-LABEL: ld_cst_unalign16_uint64_t_float:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: li r3, 255
; CHECK-P10-NEXT: lfs f0, 0(r3)
; CHECK-P10-NEXT: xscvdpuxds f0, f0
; CHECK-P10-NEXT: mffprd r3, f0
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: ld_cst_unalign16_uint64_t_float:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: li r3, 255
; CHECK-P9-NEXT: lfs f0, 0(r3)
; CHECK-P9-NEXT: xscvdpuxds f0, f0
; CHECK-P9-NEXT: mffprd r3, f0
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: ld_cst_unalign16_uint64_t_float:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: lfs f0, 255(0)
; CHECK-P8-NEXT: xscvdpuxds f0, f0
; CHECK-P8-NEXT: mffprd r3, f0
; CHECK-P8-NEXT: blr
entry:
%0 = load float, float* inttoptr (i64 255 to float*), align 4
%conv = fptoui float %0 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_cst_align16_uint64_t_float() {
; CHECK-LABEL: ld_cst_align16_uint64_t_float:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lfs f0, 4080(0)
; CHECK-NEXT: xscvdpuxds f0, f0
; CHECK-NEXT: mffprd r3, f0
; CHECK-NEXT: blr
entry:
%0 = load float, float* inttoptr (i64 4080 to float*), align 16
%conv = fptoui float %0 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_cst_unalign32_uint64_t_float() {
; CHECK-P10-LABEL: ld_cst_unalign32_uint64_t_float:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r3, 99999
; CHECK-P10-NEXT: lfs f0, 0(r3)
; CHECK-P10-NEXT: xscvdpuxds f0, f0
; CHECK-P10-NEXT: mffprd r3, f0
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: ld_cst_unalign32_uint64_t_float:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: lis r3, 1
; CHECK-P9-NEXT: ori r3, r3, 34463
; CHECK-P9-NEXT: lfs f0, 0(r3)
; CHECK-P9-NEXT: xscvdpuxds f0, f0
; CHECK-P9-NEXT: mffprd r3, f0
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: ld_cst_unalign32_uint64_t_float:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: lis r3, 1
; CHECK-P8-NEXT: ori r3, r3, 34463
; CHECK-P8-NEXT: lfsx f0, 0, r3
; CHECK-P8-NEXT: xscvdpuxds f0, f0
; CHECK-P8-NEXT: mffprd r3, f0
; CHECK-P8-NEXT: blr
entry:
%0 = load float, float* inttoptr (i64 99999 to float*), align 4
%conv = fptoui float %0 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_cst_align32_uint64_t_float() {
; CHECK-P10-LABEL: ld_cst_align32_uint64_t_float:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: lis r3, 153
; CHECK-P10-NEXT: lfs f0, -27108(r3)
; CHECK-P10-NEXT: xscvdpuxds f0, f0
; CHECK-P10-NEXT: mffprd r3, f0
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: ld_cst_align32_uint64_t_float:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: lis r3, 153
; CHECK-P9-NEXT: lfs f0, -27108(r3)
; CHECK-P9-NEXT: xscvdpuxds f0, f0
; CHECK-P9-NEXT: mffprd r3, f0
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: ld_cst_align32_uint64_t_float:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: lis r3, 152
; CHECK-P8-NEXT: ori r3, r3, 38428
; CHECK-P8-NEXT: lfsx f0, 0, r3
; CHECK-P8-NEXT: xscvdpuxds f0, f0
; CHECK-P8-NEXT: mffprd r3, f0
; CHECK-P8-NEXT: blr
entry:
%0 = load float, float* inttoptr (i64 9999900 to float*), align 4
%conv = fptoui float %0 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_cst_unalign64_uint64_t_float() {
; CHECK-P10-LABEL: ld_cst_unalign64_uint64_t_float:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r3, 232
; CHECK-P10-NEXT: pli r4, 3567587329
; CHECK-P10-NEXT: rldimi r4, r3, 32, 0
; CHECK-P10-NEXT: lfs f0, 0(r4)
; CHECK-P10-NEXT: xscvdpuxds f0, f0
; CHECK-P10-NEXT: mffprd r3, f0
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: ld_cst_unalign64_uint64_t_float:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: li r3, 29
; CHECK-P9-NEXT: rldic r3, r3, 35, 24
; CHECK-P9-NEXT: oris r3, r3, 54437
; CHECK-P9-NEXT: ori r3, r3, 4097
; CHECK-P9-NEXT: lfs f0, 0(r3)
; CHECK-P9-NEXT: xscvdpuxds f0, f0
; CHECK-P9-NEXT: mffprd r3, f0
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: ld_cst_unalign64_uint64_t_float:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: li r3, 29
; CHECK-P8-NEXT: rldic r3, r3, 35, 24
; CHECK-P8-NEXT: oris r3, r3, 54437
; CHECK-P8-NEXT: ori r3, r3, 4097
; CHECK-P8-NEXT: lfsx f0, 0, r3
; CHECK-P8-NEXT: xscvdpuxds f0, f0
; CHECK-P8-NEXT: mffprd r3, f0
; CHECK-P8-NEXT: blr
entry:
%0 = load float, float* inttoptr (i64 1000000000001 to float*), align 4
%conv = fptoui float %0 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_cst_align64_uint64_t_float() {
; CHECK-P10-LABEL: ld_cst_align64_uint64_t_float:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r3, 244140625
; CHECK-P10-NEXT: rldic r3, r3, 12, 24
; CHECK-P10-NEXT: lfs f0, 0(r3)
; CHECK-P10-NEXT: xscvdpuxds f0, f0
; CHECK-P10-NEXT: mffprd r3, f0
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: ld_cst_align64_uint64_t_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 f0, 0(r3)
; CHECK-P9-NEXT: xscvdpuxds f0, f0
; CHECK-P9-NEXT: mffprd r3, f0
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: ld_cst_align64_uint64_t_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 f0, 0, r3
; CHECK-P8-NEXT: xscvdpuxds f0, f0
; CHECK-P8-NEXT: mffprd r3, f0
; CHECK-P8-NEXT: blr
entry:
%0 = load float, float* inttoptr (i64 1000000000000 to float*), align 4096
%conv = fptoui float %0 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_0_uint64_t_double(i64 %ptr) {
; CHECK-P10-LABEL: ld_0_uint64_t_double:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: lfd f0, 0(r3)
; CHECK-P10-NEXT: xscvdpuxds f0, f0
; CHECK-P10-NEXT: mffprd r3, f0
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: ld_0_uint64_t_double:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: lfd f0, 0(r3)
; CHECK-P9-NEXT: xscvdpuxds f0, f0
; CHECK-P9-NEXT: mffprd r3, f0
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: ld_0_uint64_t_double:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: lfdx f0, 0, r3
; CHECK-P8-NEXT: xscvdpuxds f0, f0
; CHECK-P8-NEXT: mffprd r3, f0
; CHECK-P8-NEXT: blr
entry:
%0 = inttoptr i64 %ptr to double*
%1 = load double, double* %0, align 8
%conv = fptoui double %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_unalign16_uint64_t_double(i8* nocapture readonly %ptr) {
; CHECK-LABEL: ld_unalign16_uint64_t_double:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lfd f0, 1(r3)
; CHECK-NEXT: xscvdpuxds f0, f0
; CHECK-NEXT: mffprd r3, f0
; CHECK-NEXT: blr
entry:
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1
%0 = bitcast i8* %add.ptr to double*
%1 = load double, double* %0, align 8
%conv = fptoui double %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_align16_uint64_t_double(i8* nocapture readonly %ptr) {
; CHECK-LABEL: ld_align16_uint64_t_double:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lfd f0, 8(r3)
; CHECK-NEXT: xscvdpuxds f0, f0
; CHECK-NEXT: mffprd r3, 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 = fptoui double %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_unalign32_uint64_t_double(i8* nocapture readonly %ptr) {
; CHECK-P10-LABEL: ld_unalign32_uint64_t_double:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r4, 99999
; CHECK-P10-NEXT: lfdx f0, r3, r4
; CHECK-P10-NEXT: xscvdpuxds f0, f0
; CHECK-P10-NEXT: mffprd r3, f0
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_unalign32_uint64_t_double:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: lis r4, 1
; CHECK-PREP10-NEXT: ori r4, r4, 34463
; CHECK-PREP10-NEXT: lfdx f0, r3, r4
; CHECK-PREP10-NEXT: xscvdpuxds f0, f0
; CHECK-PREP10-NEXT: mffprd r3, f0
; CHECK-PREP10-NEXT: blr
entry:
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 99999
%0 = bitcast i8* %add.ptr to double*
%1 = load double, double* %0, align 8
%conv = fptoui double %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_align32_uint64_t_double(i8* nocapture readonly %ptr) {
; CHECK-P10-LABEL: ld_align32_uint64_t_double:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r4, 99999000
; CHECK-P10-NEXT: lfdx f0, r3, r4
; CHECK-P10-NEXT: xscvdpuxds f0, f0
; CHECK-P10-NEXT: mffprd r3, f0
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_align32_uint64_t_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: xscvdpuxds f0, f0
; CHECK-PREP10-NEXT: mffprd r3, 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 = fptoui double %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_unalign64_uint64_t_double(i8* nocapture readonly %ptr) {
; CHECK-P10-LABEL: ld_unalign64_uint64_t_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: lfdx f0, r3, r5
; CHECK-P10-NEXT: xscvdpuxds f0, f0
; CHECK-P10-NEXT: mffprd r3, f0
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_unalign64_uint64_t_double:
; 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: lfdx f0, r3, r4
; CHECK-PREP10-NEXT: xscvdpuxds f0, f0
; CHECK-PREP10-NEXT: mffprd r3, f0
; CHECK-PREP10-NEXT: blr
entry:
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1000000000001
%0 = bitcast i8* %add.ptr to double*
%1 = load double, double* %0, align 8
%conv = fptoui double %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_align64_uint64_t_double(i8* nocapture readonly %ptr) {
; CHECK-P10-LABEL: ld_align64_uint64_t_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: xscvdpuxds f0, f0
; CHECK-P10-NEXT: mffprd r3, f0
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_align64_uint64_t_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: xscvdpuxds f0, f0
; CHECK-PREP10-NEXT: mffprd r3, 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 = fptoui double %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_reg_uint64_t_double(i8* nocapture readonly %ptr, i64 %off) {
; CHECK-LABEL: ld_reg_uint64_t_double:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lfdx f0, r3, r4
; CHECK-NEXT: xscvdpuxds f0, f0
; CHECK-NEXT: mffprd r3, 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 = fptoui double %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_or_uint64_t_double(i64 %ptr, i8 zeroext %off) {
; CHECK-P10-LABEL: ld_or_uint64_t_double:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: or r3, r4, r3
; CHECK-P10-NEXT: lfd f0, 0(r3)
; CHECK-P10-NEXT: xscvdpuxds f0, f0
; CHECK-P10-NEXT: mffprd r3, f0
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: ld_or_uint64_t_double:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: or r3, r4, r3
; CHECK-P9-NEXT: lfd f0, 0(r3)
; CHECK-P9-NEXT: xscvdpuxds f0, f0
; CHECK-P9-NEXT: mffprd r3, f0
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: ld_or_uint64_t_double:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: or r3, r4, r3
; CHECK-P8-NEXT: lfdx f0, 0, r3
; CHECK-P8-NEXT: xscvdpuxds f0, f0
; CHECK-P8-NEXT: mffprd r3, 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 = fptoui double %1 to i64
ret i64 %conv1
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_or2_uint64_t_double(i64 %ptr, i8 zeroext %off) {
; CHECK-LABEL: ld_or2_uint64_t_double:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: rldicr r3, r3, 0, 51
; CHECK-NEXT: lfdx f0, r3, r4
; CHECK-NEXT: xscvdpuxds f0, f0
; CHECK-NEXT: mffprd r3, f0
; CHECK-NEXT: blr
entry:
%and = and i64 %ptr, -4096
%conv = zext i8 %off to i64
%or = or i64 %and, %conv
%0 = inttoptr i64 %or to double*
%1 = load double, double* %0, align 8
%conv1 = fptoui double %1 to i64
ret i64 %conv1
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_not_disjoint16_uint64_t_double(i64 %ptr) {
; CHECK-P10-LABEL: ld_not_disjoint16_uint64_t_double:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: ori r3, r3, 6
; CHECK-P10-NEXT: lfd f0, 0(r3)
; CHECK-P10-NEXT: xscvdpuxds f0, f0
; CHECK-P10-NEXT: mffprd r3, f0
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: ld_not_disjoint16_uint64_t_double:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: ori r3, r3, 6
; CHECK-P9-NEXT: lfd f0, 0(r3)
; CHECK-P9-NEXT: xscvdpuxds f0, f0
; CHECK-P9-NEXT: mffprd r3, f0
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: ld_not_disjoint16_uint64_t_double:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: ori r3, r3, 6
; CHECK-P8-NEXT: lfdx f0, 0, r3
; CHECK-P8-NEXT: xscvdpuxds f0, f0
; CHECK-P8-NEXT: mffprd r3, 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 = fptoui double %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_disjoint_unalign16_uint64_t_double(i64 %ptr) {
; CHECK-LABEL: ld_disjoint_unalign16_uint64_t_double:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: rldicr r3, r3, 0, 51
; CHECK-NEXT: ori r3, r3, 6
; CHECK-NEXT: lfdx f0, 0, r3
; CHECK-NEXT: xscvdpuxds f0, f0
; CHECK-NEXT: mffprd r3, f0
; CHECK-NEXT: blr
entry:
%and = and i64 %ptr, -4096
%or = or i64 %and, 6
%0 = inttoptr i64 %or to double*
%1 = load double, double* %0, align 8
%conv = fptoui double %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_disjoint_align16_uint64_t_double(i64 %ptr) {
; CHECK-P10-LABEL: ld_disjoint_align16_uint64_t_double:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: rldicr r3, r3, 0, 51
; CHECK-P10-NEXT: lfd f0, 24(r3)
; CHECK-P10-NEXT: xscvdpuxds f0, f0
; CHECK-P10-NEXT: mffprd r3, f0
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: ld_disjoint_align16_uint64_t_double:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: rldicr r3, r3, 0, 51
; CHECK-P9-NEXT: lfd f0, 24(r3)
; CHECK-P9-NEXT: xscvdpuxds f0, f0
; CHECK-P9-NEXT: mffprd r3, f0
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: ld_disjoint_align16_uint64_t_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: xscvdpuxds f0, f0
; CHECK-P8-NEXT: mffprd r3, 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 = fptoui double %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_not_disjoint32_uint64_t_double(i64 %ptr) {
; CHECK-P10-LABEL: ld_not_disjoint32_uint64_t_double:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: ori r3, r3, 34463
; CHECK-P10-NEXT: oris r3, r3, 1
; CHECK-P10-NEXT: lfd f0, 0(r3)
; CHECK-P10-NEXT: xscvdpuxds f0, f0
; CHECK-P10-NEXT: mffprd r3, f0
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: ld_not_disjoint32_uint64_t_double:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: ori r3, r3, 34463
; CHECK-P9-NEXT: oris r3, r3, 1
; CHECK-P9-NEXT: lfd f0, 0(r3)
; CHECK-P9-NEXT: xscvdpuxds f0, f0
; CHECK-P9-NEXT: mffprd r3, f0
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: ld_not_disjoint32_uint64_t_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: xscvdpuxds f0, f0
; CHECK-P8-NEXT: mffprd r3, 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 = fptoui double %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_disjoint_unalign32_uint64_t_double(i64 %ptr) {
; CHECK-P10-LABEL: ld_disjoint_unalign32_uint64_t_double:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: rldicr r3, r3, 0, 43
; CHECK-P10-NEXT: pli r4, 99999
; CHECK-P10-NEXT: lfdx f0, r3, r4
; CHECK-P10-NEXT: xscvdpuxds f0, f0
; CHECK-P10-NEXT: mffprd r3, f0
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_disjoint_unalign32_uint64_t_double:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: lis r4, 1
; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 43
; CHECK-PREP10-NEXT: ori r4, r4, 34463
; CHECK-PREP10-NEXT: lfdx f0, r3, r4
; CHECK-PREP10-NEXT: xscvdpuxds f0, f0
; CHECK-PREP10-NEXT: mffprd r3, f0
; CHECK-PREP10-NEXT: blr
entry:
%and = and i64 %ptr, -1048576
%or = or i64 %and, 99999
%0 = inttoptr i64 %or to double*
%1 = load double, double* %0, align 8
%conv = fptoui double %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_disjoint_align32_uint64_t_double(i64 %ptr) {
; CHECK-P10-LABEL: ld_disjoint_align32_uint64_t_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: xscvdpuxds f0, f0
; CHECK-P10-NEXT: mffprd r3, f0
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: ld_disjoint_align32_uint64_t_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: xscvdpuxds f0, f0
; CHECK-P9-NEXT: mffprd r3, f0
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: ld_disjoint_align32_uint64_t_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: xscvdpuxds f0, f0
; CHECK-P8-NEXT: mffprd r3, 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 = fptoui double %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_not_disjoint64_uint64_t_double(i64 %ptr) {
; CHECK-P10-LABEL: ld_not_disjoint64_uint64_t_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: xscvdpuxds f0, f0
; CHECK-P10-NEXT: mffprd r3, f0
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: ld_not_disjoint64_uint64_t_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: xscvdpuxds f0, f0
; CHECK-P9-NEXT: mffprd r3, f0
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: ld_not_disjoint64_uint64_t_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: xscvdpuxds f0, f0
; CHECK-P8-NEXT: mffprd r3, 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 = fptoui double %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_disjoint_unalign64_uint64_t_double(i64 %ptr) {
; CHECK-P10-LABEL: ld_disjoint_unalign64_uint64_t_double:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r4, 232
; CHECK-P10-NEXT: pli r5, 3567587329
; CHECK-P10-NEXT: rldicr r3, r3, 0, 23
; CHECK-P10-NEXT: rldimi r5, r4, 32, 0
; CHECK-P10-NEXT: lfdx f0, r3, r5
; CHECK-P10-NEXT: xscvdpuxds f0, f0
; CHECK-P10-NEXT: mffprd r3, f0
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_disjoint_unalign64_uint64_t_double:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: li r4, 29
; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23
; 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: lfdx f0, r3, r4
; CHECK-PREP10-NEXT: xscvdpuxds f0, f0
; CHECK-PREP10-NEXT: mffprd r3, f0
; CHECK-PREP10-NEXT: blr
entry:
%and = and i64 %ptr, -1099511627776
%or = or i64 %and, 1000000000001
%0 = inttoptr i64 %or to double*
%1 = load double, double* %0, align 8
%conv = fptoui double %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_disjoint_align64_uint64_t_double(i64 %ptr) {
; CHECK-P10-LABEL: ld_disjoint_align64_uint64_t_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: xscvdpuxds f0, f0
; CHECK-P10-NEXT: mffprd r3, f0
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_disjoint_align64_uint64_t_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: xscvdpuxds f0, f0
; CHECK-PREP10-NEXT: mffprd r3, 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 = fptoui double %1 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_cst_unalign16_uint64_t_double() {
; CHECK-P10-LABEL: ld_cst_unalign16_uint64_t_double:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: li r3, 255
; CHECK-P10-NEXT: lfd f0, 0(r3)
; CHECK-P10-NEXT: xscvdpuxds f0, f0
; CHECK-P10-NEXT: mffprd r3, f0
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: ld_cst_unalign16_uint64_t_double:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: li r3, 255
; CHECK-P9-NEXT: lfd f0, 0(r3)
; CHECK-P9-NEXT: xscvdpuxds f0, f0
; CHECK-P9-NEXT: mffprd r3, f0
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: ld_cst_unalign16_uint64_t_double:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: lfd f0, 255(0)
; CHECK-P8-NEXT: xscvdpuxds f0, f0
; CHECK-P8-NEXT: mffprd r3, f0
; CHECK-P8-NEXT: blr
entry:
%0 = load double, double* inttoptr (i64 255 to double*), align 8
%conv = fptoui double %0 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_cst_align16_uint64_t_double() {
; CHECK-LABEL: ld_cst_align16_uint64_t_double:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lfd f0, 4080(0)
; CHECK-NEXT: xscvdpuxds f0, f0
; CHECK-NEXT: mffprd r3, f0
; CHECK-NEXT: blr
entry:
%0 = load double, double* inttoptr (i64 4080 to double*), align 16
%conv = fptoui double %0 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_cst_unalign32_uint64_t_double() {
; CHECK-P10-LABEL: ld_cst_unalign32_uint64_t_double:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r3, 99999
; CHECK-P10-NEXT: lfd f0, 0(r3)
; CHECK-P10-NEXT: xscvdpuxds f0, f0
; CHECK-P10-NEXT: mffprd r3, f0
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: ld_cst_unalign32_uint64_t_double:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: lis r3, 1
; CHECK-P9-NEXT: ori r3, r3, 34463
; CHECK-P9-NEXT: lfd f0, 0(r3)
; CHECK-P9-NEXT: xscvdpuxds f0, f0
; CHECK-P9-NEXT: mffprd r3, f0
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: ld_cst_unalign32_uint64_t_double:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: lis r3, 1
; CHECK-P8-NEXT: ori r3, r3, 34463
; CHECK-P8-NEXT: lfdx f0, 0, r3
; CHECK-P8-NEXT: xscvdpuxds f0, f0
; CHECK-P8-NEXT: mffprd r3, f0
; CHECK-P8-NEXT: blr
entry:
%0 = load double, double* inttoptr (i64 99999 to double*), align 8
%conv = fptoui double %0 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_cst_align32_uint64_t_double() {
; CHECK-P10-LABEL: ld_cst_align32_uint64_t_double:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: lis r3, 153
; CHECK-P10-NEXT: lfd f0, -27108(r3)
; CHECK-P10-NEXT: xscvdpuxds f0, f0
; CHECK-P10-NEXT: mffprd r3, f0
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: ld_cst_align32_uint64_t_double:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: lis r3, 153
; CHECK-P9-NEXT: lfd f0, -27108(r3)
; CHECK-P9-NEXT: xscvdpuxds f0, f0
; CHECK-P9-NEXT: mffprd r3, f0
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: ld_cst_align32_uint64_t_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: xscvdpuxds f0, f0
; CHECK-P8-NEXT: mffprd r3, f0
; CHECK-P8-NEXT: blr
entry:
%0 = load double, double* inttoptr (i64 9999900 to double*), align 8
%conv = fptoui double %0 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_cst_unalign64_uint64_t_double() {
; CHECK-P10-LABEL: ld_cst_unalign64_uint64_t_double:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r3, 232
; CHECK-P10-NEXT: pli r4, 3567587329
; CHECK-P10-NEXT: rldimi r4, r3, 32, 0
; CHECK-P10-NEXT: lfd f0, 0(r4)
; CHECK-P10-NEXT: xscvdpuxds f0, f0
; CHECK-P10-NEXT: mffprd r3, f0
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: ld_cst_unalign64_uint64_t_double:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: li r3, 29
; CHECK-P9-NEXT: rldic r3, r3, 35, 24
; CHECK-P9-NEXT: oris r3, r3, 54437
; CHECK-P9-NEXT: ori r3, r3, 4097
; CHECK-P9-NEXT: lfd f0, 0(r3)
; CHECK-P9-NEXT: xscvdpuxds f0, f0
; CHECK-P9-NEXT: mffprd r3, f0
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: ld_cst_unalign64_uint64_t_double:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: li r3, 29
; CHECK-P8-NEXT: rldic r3, r3, 35, 24
; CHECK-P8-NEXT: oris r3, r3, 54437
; CHECK-P8-NEXT: ori r3, r3, 4097
; CHECK-P8-NEXT: lfdx f0, 0, r3
; CHECK-P8-NEXT: xscvdpuxds f0, f0
; CHECK-P8-NEXT: mffprd r3, f0
; CHECK-P8-NEXT: blr
entry:
%0 = load double, double* inttoptr (i64 1000000000001 to double*), align 8
%conv = fptoui double %0 to i64
ret i64 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local i64 @ld_cst_align64_uint64_t_double() {
; CHECK-P10-LABEL: ld_cst_align64_uint64_t_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: xscvdpuxds f0, f0
; CHECK-P10-NEXT: mffprd r3, f0
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: ld_cst_align64_uint64_t_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: xscvdpuxds f0, f0
; CHECK-P9-NEXT: mffprd r3, f0
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: ld_cst_align64_uint64_t_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: xscvdpuxds f0, f0
; CHECK-P8-NEXT: mffprd r3, f0
; CHECK-P8-NEXT: blr
entry:
%0 = load double, double* inttoptr (i64 1000000000000 to double*), align 4096
%conv = fptoui double %0 to i64
ret i64 %conv
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_0_uint64_t_uint8_t(i64 %ptr, i64 %str) {
; CHECK-LABEL: st_0_uint64_t_uint8_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: stb r4, 0(r3)
; CHECK-NEXT: blr
entry:
%conv = trunc i64 %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_uint64_t_uint8_t(i8* nocapture %ptr, i64 %str) {
; CHECK-LABEL: st_align16_uint64_t_uint8_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: stb r4, 8(r3)
; CHECK-NEXT: blr
entry:
%conv = trunc i64 %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_uint64_t_uint8_t(i8* nocapture %ptr, i64 %str) {
; CHECK-P10-LABEL: st_align32_uint64_t_uint8_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r5, 99999000
; CHECK-P10-NEXT: stbx r4, r3, r5
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: st_align32_uint64_t_uint8_t:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: lis r5, 1525
; CHECK-PREP10-NEXT: ori r5, r5, 56600
; CHECK-PREP10-NEXT: stbx r4, r3, r5
; CHECK-PREP10-NEXT: blr
entry:
%conv = trunc i64 %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_uint64_t_uint8_t(i8* nocapture %ptr, i64 %str) {
; CHECK-P10-LABEL: st_align64_uint64_t_uint8_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r5, 244140625
; CHECK-P10-NEXT: rldic r5, r5, 12, 24
; CHECK-P10-NEXT: stbx r4, r3, r5
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: st_align64_uint64_t_uint8_t:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: lis r5, 3725
; CHECK-PREP10-NEXT: ori r5, r5, 19025
; CHECK-PREP10-NEXT: rldic r5, r5, 12, 24
; CHECK-PREP10-NEXT: stbx r4, r3, r5
; CHECK-PREP10-NEXT: blr
entry:
%conv = trunc i64 %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_uint64_t_uint8_t(i8* nocapture %ptr, i64 %off, i64 %str) {
; CHECK-LABEL: st_reg_uint64_t_uint8_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: stbx r5, r3, r4
; CHECK-NEXT: blr
entry:
%conv = trunc i64 %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_uint64_t_uint8_t(i64 %ptr, i8 zeroext %off, i64 %str) {
; CHECK-LABEL: st_or1_uint64_t_uint8_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: or r3, r4, r3
; CHECK-NEXT: stb r5, 0(r3)
; CHECK-NEXT: blr
entry:
%conv = trunc i64 %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_or2_uint64_t_uint8_t(i64 %ptr, i8 zeroext %off, i64 %str) {
; CHECK-LABEL: st_or2_uint64_t_uint8_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: rldicr r3, r3, 0, 51
; CHECK-NEXT: stbx r5, r3, r4
; CHECK-NEXT: blr
entry:
%and = and i64 %ptr, -4096
%conv = trunc i64 %str to i8
%conv1 = zext i8 %off to i64
%or = or i64 %and, %conv1
%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_uint64_t_uint8_t(i64 %ptr, i64 %str) {
; CHECK-LABEL: st_not_disjoint16_uint64_t_uint8_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: ori r3, r3, 6
; CHECK-NEXT: stb r4, 0(r3)
; CHECK-NEXT: blr
entry:
%conv = trunc i64 %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_uint64_t_uint8_t(i64 %ptr, i64 %str) {
; CHECK-LABEL: st_disjoint_align16_uint64_t_uint8_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: rldicr r3, r3, 0, 51
; CHECK-NEXT: stb r4, 24(r3)
; CHECK-NEXT: blr
entry:
%and = and i64 %ptr, -4096
%conv = trunc i64 %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_uint64_t_uint8_t(i64 %ptr, i64 %str) {
; CHECK-LABEL: st_not_disjoint32_uint64_t_uint8_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: ori r3, r3, 34463
; CHECK-NEXT: oris r3, r3, 1
; CHECK-NEXT: stb r4, 0(r3)
; CHECK-NEXT: blr
entry:
%conv = trunc i64 %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_uint64_t_uint8_t(i64 %ptr, i64 %str) {
; CHECK-P10-LABEL: st_disjoint_align32_uint64_t_uint8_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: lis r5, -15264
; CHECK-P10-NEXT: and r3, r3, r5
; CHECK-P10-NEXT: pli r5, 999990000
; CHECK-P10-NEXT: stbx r4, r3, r5
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: st_disjoint_align32_uint64_t_uint8_t:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: lis r5, -15264
; CHECK-P9-NEXT: and r3, r3, r5
; CHECK-P9-NEXT: lis r5, 15258
; CHECK-P9-NEXT: ori r5, r5, 41712
; CHECK-P9-NEXT: stbx r4, r3, r5
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: st_disjoint_align32_uint64_t_uint8_t:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: lis r5, -15264
; CHECK-P8-NEXT: lis r6, 15258
; CHECK-P8-NEXT: and r3, r3, r5
; CHECK-P8-NEXT: ori r5, r6, 41712
; CHECK-P8-NEXT: stbx r4, r3, r5
; CHECK-P8-NEXT: blr
entry:
%and = and i64 %ptr, -1000341504
%conv = trunc i64 %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_uint64_t_uint8_t(i64 %ptr, i64 %str) {
; CHECK-P10-LABEL: st_not_disjoint64_uint64_t_uint8_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r5, 232
; CHECK-P10-NEXT: pli r6, 3567587329
; CHECK-P10-NEXT: rldimi r6, r5, 32, 0
; CHECK-P10-NEXT: or r3, r3, r6
; CHECK-P10-NEXT: stb r4, 0(r3)
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: st_not_disjoint64_uint64_t_uint8_t:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: li r5, 29
; CHECK-PREP10-NEXT: rldic r5, r5, 35, 24
; CHECK-PREP10-NEXT: oris r5, r5, 54437
; CHECK-PREP10-NEXT: ori r5, r5, 4097
; CHECK-PREP10-NEXT: or r3, r3, r5
; CHECK-PREP10-NEXT: stb r4, 0(r3)
; CHECK-PREP10-NEXT: blr
entry:
%conv = trunc i64 %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_uint64_t_uint8_t(i64 %ptr, i64 %str) {
; CHECK-P10-LABEL: st_disjoint_align64_uint64_t_uint8_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r5, 244140625
; CHECK-P10-NEXT: rldicr r3, r3, 0, 23
; CHECK-P10-NEXT: rldic r5, r5, 12, 24
; CHECK-P10-NEXT: stbx r4, r3, r5
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: st_disjoint_align64_uint64_t_uint8_t:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: lis r5, 3725
; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23
; CHECK-PREP10-NEXT: ori r5, r5, 19025
; CHECK-PREP10-NEXT: rldic r5, r5, 12, 24
; CHECK-PREP10-NEXT: stbx r4, r3, r5
; CHECK-PREP10-NEXT: blr
entry:
%and = and i64 %ptr, -1099511627776
%conv = trunc i64 %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_uint64_t_uint8_t(i64 %str) {
; CHECK-LABEL: st_cst_align16_uint64_t_uint8_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: stb r3, 4080(0)
; CHECK-NEXT: blr
entry:
%conv = trunc i64 %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_uint64_t_uint8_t(i64 %str) {
; CHECK-LABEL: st_cst_align32_uint64_t_uint8_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lis r4, 153
; CHECK-NEXT: stb r3, -27108(r4)
; CHECK-NEXT: blr
entry:
%conv = trunc i64 %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_uint64_t_uint8_t(i64 %str) {
; CHECK-P10-LABEL: st_cst_align64_uint64_t_uint8_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r4, 244140625
; CHECK-P10-NEXT: rldic r4, r4, 12, 24
; CHECK-P10-NEXT: stb r3, 0(r4)
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: st_cst_align64_uint64_t_uint8_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: stb r3, 0(r4)
; CHECK-PREP10-NEXT: blr
entry:
%conv = trunc i64 %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_uint64_t_uint16_t(i64 %ptr, i64 %str) {
; CHECK-LABEL: st_0_uint64_t_uint16_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: sth r4, 0(r3)
; CHECK-NEXT: blr
entry:
%conv = trunc i64 %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_uint64_t_uint16_t(i8* nocapture %ptr, i64 %str) {
; CHECK-LABEL: st_align16_uint64_t_uint16_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: sth r4, 8(r3)
; CHECK-NEXT: blr
entry:
%conv = trunc i64 %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_uint64_t_uint16_t(i8* nocapture %ptr, i64 %str) {
; CHECK-P10-LABEL: st_align32_uint64_t_uint16_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r5, 99999000
; CHECK-P10-NEXT: sthx r4, r3, r5
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: st_align32_uint64_t_uint16_t:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: lis r5, 1525
; CHECK-PREP10-NEXT: ori r5, r5, 56600
; CHECK-PREP10-NEXT: sthx r4, r3, r5
; CHECK-PREP10-NEXT: blr
entry:
%conv = trunc i64 %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_uint64_t_uint16_t(i8* nocapture %ptr, i64 %str) {
; CHECK-P10-LABEL: st_align64_uint64_t_uint16_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r5, 244140625
; CHECK-P10-NEXT: rldic r5, r5, 12, 24
; CHECK-P10-NEXT: sthx r4, r3, r5
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: st_align64_uint64_t_uint16_t:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: lis r5, 3725
; CHECK-PREP10-NEXT: ori r5, r5, 19025
; CHECK-PREP10-NEXT: rldic r5, r5, 12, 24
; CHECK-PREP10-NEXT: sthx r4, r3, r5
; CHECK-PREP10-NEXT: blr
entry:
%conv = trunc i64 %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_uint64_t_uint16_t(i8* nocapture %ptr, i64 %off, i64 %str) {
; CHECK-LABEL: st_reg_uint64_t_uint16_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: sthx r5, r3, r4
; CHECK-NEXT: blr
entry:
%conv = trunc i64 %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_uint64_t_uint16_t(i64 %ptr, i8 zeroext %off, i64 %str) {
; CHECK-LABEL: st_or1_uint64_t_uint16_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: or r3, r4, r3
; CHECK-NEXT: sth r5, 0(r3)
; CHECK-NEXT: blr
entry:
%conv = trunc i64 %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_or2_uint64_t_uint16_t(i64 %ptr, i8 zeroext %off, i64 %str) {
; CHECK-LABEL: st_or2_uint64_t_uint16_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: rldicr r3, r3, 0, 51
; CHECK-NEXT: sthx r5, r3, r4
; CHECK-NEXT: blr
entry:
%and = and i64 %ptr, -4096
%conv = trunc i64 %str to i16
%conv1 = zext i8 %off to i64
%or = or i64 %and, %conv1
%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_uint64_t_uint16_t(i64 %ptr, i64 %str) {
; CHECK-LABEL: st_not_disjoint16_uint64_t_uint16_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: ori r3, r3, 6
; CHECK-NEXT: sth r4, 0(r3)
; CHECK-NEXT: blr
entry:
%conv = trunc i64 %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_uint64_t_uint16_t(i64 %ptr, i64 %str) {
; CHECK-LABEL: st_disjoint_align16_uint64_t_uint16_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: rldicr r3, r3, 0, 51
; CHECK-NEXT: sth r4, 24(r3)
; CHECK-NEXT: blr
entry:
%and = and i64 %ptr, -4096
%conv = trunc i64 %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_uint64_t_uint16_t(i64 %ptr, i64 %str) {
; CHECK-LABEL: st_not_disjoint32_uint64_t_uint16_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: ori r3, r3, 34463
; CHECK-NEXT: oris r3, r3, 1
; CHECK-NEXT: sth r4, 0(r3)
; CHECK-NEXT: blr
entry:
%conv = trunc i64 %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_uint64_t_uint16_t(i64 %ptr, i64 %str) {
; CHECK-P10-LABEL: st_disjoint_align32_uint64_t_uint16_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: lis r5, -15264
; CHECK-P10-NEXT: and r3, r3, r5
; CHECK-P10-NEXT: pli r5, 999990000
; CHECK-P10-NEXT: sthx r4, r3, r5
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: st_disjoint_align32_uint64_t_uint16_t:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: lis r5, -15264
; CHECK-P9-NEXT: and r3, r3, r5
; CHECK-P9-NEXT: lis r5, 15258
; CHECK-P9-NEXT: ori r5, r5, 41712
; CHECK-P9-NEXT: sthx r4, r3, r5
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: st_disjoint_align32_uint64_t_uint16_t:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: lis r5, -15264
; CHECK-P8-NEXT: lis r6, 15258
; CHECK-P8-NEXT: and r3, r3, r5
; CHECK-P8-NEXT: ori r5, r6, 41712
; CHECK-P8-NEXT: sthx r4, r3, r5
; CHECK-P8-NEXT: blr
entry:
%and = and i64 %ptr, -1000341504
%conv = trunc i64 %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_uint64_t_uint16_t(i64 %ptr, i64 %str) {
; CHECK-P10-LABEL: st_not_disjoint64_uint64_t_uint16_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r5, 232
; CHECK-P10-NEXT: pli r6, 3567587329
; CHECK-P10-NEXT: rldimi r6, r5, 32, 0
; CHECK-P10-NEXT: or r3, r3, r6
; CHECK-P10-NEXT: sth r4, 0(r3)
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: st_not_disjoint64_uint64_t_uint16_t:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: li r5, 29
; CHECK-PREP10-NEXT: rldic r5, r5, 35, 24
; CHECK-PREP10-NEXT: oris r5, r5, 54437
; CHECK-PREP10-NEXT: ori r5, r5, 4097
; CHECK-PREP10-NEXT: or r3, r3, r5
; CHECK-PREP10-NEXT: sth r4, 0(r3)
; CHECK-PREP10-NEXT: blr
entry:
%conv = trunc i64 %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_uint64_t_uint16_t(i64 %ptr, i64 %str) {
; CHECK-P10-LABEL: st_disjoint_align64_uint64_t_uint16_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r5, 244140625
; CHECK-P10-NEXT: rldicr r3, r3, 0, 23
; CHECK-P10-NEXT: rldic r5, r5, 12, 24
; CHECK-P10-NEXT: sthx r4, r3, r5
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: st_disjoint_align64_uint64_t_uint16_t:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: lis r5, 3725
; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23
; CHECK-PREP10-NEXT: ori r5, r5, 19025
; CHECK-PREP10-NEXT: rldic r5, r5, 12, 24
; CHECK-PREP10-NEXT: sthx r4, r3, r5
; CHECK-PREP10-NEXT: blr
entry:
%and = and i64 %ptr, -1099511627776
%conv = trunc i64 %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_uint64_t_uint16_t(i64 %str) {
; CHECK-LABEL: st_cst_align16_uint64_t_uint16_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: sth r3, 4080(0)
; CHECK-NEXT: blr
entry:
%conv = trunc i64 %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_uint64_t_uint16_t(i64 %str) {
; CHECK-LABEL: st_cst_align32_uint64_t_uint16_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lis r4, 153
; CHECK-NEXT: sth r3, -27108(r4)
; CHECK-NEXT: blr
entry:
%conv = trunc i64 %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_uint64_t_uint16_t(i64 %str) {
; CHECK-P10-LABEL: st_cst_align64_uint64_t_uint16_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r4, 244140625
; CHECK-P10-NEXT: rldic r4, r4, 12, 24
; CHECK-P10-NEXT: sth r3, 0(r4)
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: st_cst_align64_uint64_t_uint16_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: sth r3, 0(r4)
; CHECK-PREP10-NEXT: blr
entry:
%conv = trunc i64 %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_uint64_t_int16_t(i64 %ptr, i64 %str) {
; CHECK-LABEL: st_0_uint64_t_int16_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: sth r4, 0(r3)
; CHECK-NEXT: blr
entry:
%conv = trunc i64 %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_uint64_t_int16_t(i8* nocapture %ptr, i64 %str) {
; CHECK-LABEL: st_align16_uint64_t_int16_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: sth r4, 8(r3)
; CHECK-NEXT: blr
entry:
%conv = trunc i64 %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_uint64_t_int16_t(i8* nocapture %ptr, i64 %str) {
; CHECK-P10-LABEL: st_align32_uint64_t_int16_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r5, 99999000
; CHECK-P10-NEXT: sthx r4, r3, r5
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: st_align32_uint64_t_int16_t:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: lis r5, 1525
; CHECK-PREP10-NEXT: ori r5, r5, 56600
; CHECK-PREP10-NEXT: sthx r4, r3, r5
; CHECK-PREP10-NEXT: blr
entry:
%conv = trunc i64 %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_uint64_t_int16_t(i8* nocapture %ptr, i64 %str) {
; CHECK-P10-LABEL: st_align64_uint64_t_int16_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r5, 244140625
; CHECK-P10-NEXT: rldic r5, r5, 12, 24
; CHECK-P10-NEXT: sthx r4, r3, r5
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: st_align64_uint64_t_int16_t:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: lis r5, 3725
; CHECK-PREP10-NEXT: ori r5, r5, 19025
; CHECK-PREP10-NEXT: rldic r5, r5, 12, 24
; CHECK-PREP10-NEXT: sthx r4, r3, r5
; CHECK-PREP10-NEXT: blr
entry:
%conv = trunc i64 %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_uint64_t_int16_t(i8* nocapture %ptr, i64 %off, i64 %str) {
; CHECK-LABEL: st_reg_uint64_t_int16_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: sthx r5, r3, r4
; CHECK-NEXT: blr
entry:
%conv = trunc i64 %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_uint64_t_int16_t(i64 %ptr, i8 zeroext %off, i64 %str) {
; CHECK-LABEL: st_or1_uint64_t_int16_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: or r3, r4, r3
; CHECK-NEXT: sth r5, 0(r3)
; CHECK-NEXT: blr
entry:
%conv = trunc i64 %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_or2_uint64_t_int16_t(i64 %ptr, i8 zeroext %off, i64 %str) {
; CHECK-LABEL: st_or2_uint64_t_int16_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: rldicr r3, r3, 0, 51
; CHECK-NEXT: sthx r5, r3, r4
; CHECK-NEXT: blr
entry:
%and = and i64 %ptr, -4096
%conv = trunc i64 %str to i16
%conv1 = zext i8 %off to i64
%or = or i64 %and, %conv1
%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_uint64_t_int16_t(i64 %ptr, i64 %str) {
; CHECK-LABEL: st_not_disjoint16_uint64_t_int16_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: ori r3, r3, 6
; CHECK-NEXT: sth r4, 0(r3)
; CHECK-NEXT: blr
entry:
%conv = trunc i64 %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_uint64_t_int16_t(i64 %ptr, i64 %str) {
; CHECK-LABEL: st_disjoint_align16_uint64_t_int16_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: rldicr r3, r3, 0, 51
; CHECK-NEXT: sth r4, 24(r3)
; CHECK-NEXT: blr
entry:
%and = and i64 %ptr, -4096
%conv = trunc i64 %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_uint64_t_int16_t(i64 %ptr, i64 %str) {
; CHECK-LABEL: st_not_disjoint32_uint64_t_int16_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: ori r3, r3, 34463
; CHECK-NEXT: oris r3, r3, 1
; CHECK-NEXT: sth r4, 0(r3)
; CHECK-NEXT: blr
entry:
%conv = trunc i64 %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_uint64_t_int16_t(i64 %ptr, i64 %str) {
; CHECK-P10-LABEL: st_disjoint_align32_uint64_t_int16_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: lis r5, -15264
; CHECK-P10-NEXT: and r3, r3, r5
; CHECK-P10-NEXT: pli r5, 999990000
; CHECK-P10-NEXT: sthx r4, r3, r5
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: st_disjoint_align32_uint64_t_int16_t:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: lis r5, -15264
; CHECK-P9-NEXT: and r3, r3, r5
; CHECK-P9-NEXT: lis r5, 15258
; CHECK-P9-NEXT: ori r5, r5, 41712
; CHECK-P9-NEXT: sthx r4, r3, r5
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: st_disjoint_align32_uint64_t_int16_t:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: lis r5, -15264
; CHECK-P8-NEXT: lis r6, 15258
; CHECK-P8-NEXT: and r3, r3, r5
; CHECK-P8-NEXT: ori r5, r6, 41712
; CHECK-P8-NEXT: sthx r4, r3, r5
; CHECK-P8-NEXT: blr
entry:
%and = and i64 %ptr, -1000341504
%conv = trunc i64 %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_uint64_t_int16_t(i64 %ptr, i64 %str) {
; CHECK-P10-LABEL: st_not_disjoint64_uint64_t_int16_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r5, 232
; CHECK-P10-NEXT: pli r6, 3567587329
; CHECK-P10-NEXT: rldimi r6, r5, 32, 0
; CHECK-P10-NEXT: or r3, r3, r6
; CHECK-P10-NEXT: sth r4, 0(r3)
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: st_not_disjoint64_uint64_t_int16_t:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: li r5, 29
; CHECK-PREP10-NEXT: rldic r5, r5, 35, 24
; CHECK-PREP10-NEXT: oris r5, r5, 54437
; CHECK-PREP10-NEXT: ori r5, r5, 4097
; CHECK-PREP10-NEXT: or r3, r3, r5
; CHECK-PREP10-NEXT: sth r4, 0(r3)
; CHECK-PREP10-NEXT: blr
entry:
%conv = trunc i64 %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_uint64_t_int16_t(i64 %ptr, i64 %str) {
; CHECK-P10-LABEL: st_disjoint_align64_uint64_t_int16_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r5, 244140625
; CHECK-P10-NEXT: rldicr r3, r3, 0, 23
; CHECK-P10-NEXT: rldic r5, r5, 12, 24
; CHECK-P10-NEXT: sthx r4, r3, r5
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: st_disjoint_align64_uint64_t_int16_t:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: lis r5, 3725
; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23
; CHECK-PREP10-NEXT: ori r5, r5, 19025
; CHECK-PREP10-NEXT: rldic r5, r5, 12, 24
; CHECK-PREP10-NEXT: sthx r4, r3, r5
; CHECK-PREP10-NEXT: blr
entry:
%and = and i64 %ptr, -1099511627776
%conv = trunc i64 %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_uint64_t_int16_t(i64 %str) {
; CHECK-LABEL: st_cst_align16_uint64_t_int16_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: sth r3, 4080(0)
; CHECK-NEXT: blr
entry:
%conv = trunc i64 %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_uint64_t_int16_t(i64 %str) {
; CHECK-LABEL: st_cst_align32_uint64_t_int16_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lis r4, 153
; CHECK-NEXT: sth r3, -27108(r4)
; CHECK-NEXT: blr
entry:
%conv = trunc i64 %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_uint64_t_int16_t(i64 %str) {
; CHECK-P10-LABEL: st_cst_align64_uint64_t_int16_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r4, 244140625
; CHECK-P10-NEXT: rldic r4, r4, 12, 24
; CHECK-P10-NEXT: sth r3, 0(r4)
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: st_cst_align64_uint64_t_int16_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: sth r3, 0(r4)
; CHECK-PREP10-NEXT: blr
entry:
%conv = trunc i64 %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_uint64_t_uint32_t(i64 %ptr, i64 %str) {
; CHECK-LABEL: st_0_uint64_t_uint32_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: stw r4, 0(r3)
; CHECK-NEXT: blr
entry:
%conv = trunc i64 %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_uint64_t_uint32_t(i8* nocapture %ptr, i64 %str) {
; CHECK-LABEL: st_align16_uint64_t_uint32_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: stw r4, 8(r3)
; CHECK-NEXT: blr
entry:
%conv = trunc i64 %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_uint64_t_uint32_t(i8* nocapture %ptr, i64 %str) {
; CHECK-P10-LABEL: st_align32_uint64_t_uint32_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r5, 99999000
; CHECK-P10-NEXT: stwx r4, r3, r5
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: st_align32_uint64_t_uint32_t:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: lis r5, 1525
; CHECK-PREP10-NEXT: ori r5, r5, 56600
; CHECK-PREP10-NEXT: stwx r4, r3, r5
; CHECK-PREP10-NEXT: blr
entry:
%conv = trunc i64 %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_uint64_t_uint32_t(i8* nocapture %ptr, i64 %str) {
; CHECK-P10-LABEL: st_align64_uint64_t_uint32_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r5, 244140625
; CHECK-P10-NEXT: rldic r5, r5, 12, 24
; CHECK-P10-NEXT: stwx r4, r3, r5
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: st_align64_uint64_t_uint32_t:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: lis r5, 3725
; CHECK-PREP10-NEXT: ori r5, r5, 19025
; CHECK-PREP10-NEXT: rldic r5, r5, 12, 24
; CHECK-PREP10-NEXT: stwx r4, r3, r5
; CHECK-PREP10-NEXT: blr
entry:
%conv = trunc i64 %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_uint64_t_uint32_t(i8* nocapture %ptr, i64 %off, i64 %str) {
; CHECK-LABEL: st_reg_uint64_t_uint32_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: stwx r5, r3, r4
; CHECK-NEXT: blr
entry:
%conv = trunc i64 %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_uint64_t_uint32_t(i64 %ptr, i8 zeroext %off, i64 %str) {
; CHECK-LABEL: st_or1_uint64_t_uint32_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: or r3, r4, r3
; CHECK-NEXT: stw r5, 0(r3)
; CHECK-NEXT: blr
entry:
%conv = trunc i64 %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_or2_uint64_t_uint32_t(i64 %ptr, i8 zeroext %off, i64 %str) {
; CHECK-LABEL: st_or2_uint64_t_uint32_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: rldicr r3, r3, 0, 51
; CHECK-NEXT: stwx r5, r3, r4
; CHECK-NEXT: blr
entry:
%and = and i64 %ptr, -4096
%conv = trunc i64 %str to i32
%conv1 = zext i8 %off to i64
%or = or i64 %and, %conv1
%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_uint64_t_uint32_t(i64 %ptr, i64 %str) {
; CHECK-LABEL: st_not_disjoint16_uint64_t_uint32_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: ori r3, r3, 6
; CHECK-NEXT: stw r4, 0(r3)
; CHECK-NEXT: blr
entry:
%conv = trunc i64 %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_uint64_t_uint32_t(i64 %ptr, i64 %str) {
; CHECK-LABEL: st_disjoint_align16_uint64_t_uint32_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: rldicr r3, r3, 0, 51
; CHECK-NEXT: stw r4, 24(r3)
; CHECK-NEXT: blr
entry:
%and = and i64 %ptr, -4096
%conv = trunc i64 %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_uint64_t_uint32_t(i64 %ptr, i64 %str) {
; CHECK-LABEL: st_not_disjoint32_uint64_t_uint32_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: ori r3, r3, 34463
; CHECK-NEXT: oris r3, r3, 1
; CHECK-NEXT: stw r4, 0(r3)
; CHECK-NEXT: blr
entry:
%conv = trunc i64 %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_uint64_t_uint32_t(i64 %ptr, i64 %str) {
; CHECK-P10-LABEL: st_disjoint_align32_uint64_t_uint32_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: lis r5, -15264
; CHECK-P10-NEXT: and r3, r3, r5
; CHECK-P10-NEXT: pli r5, 999990000
; CHECK-P10-NEXT: stwx r4, r3, r5
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: st_disjoint_align32_uint64_t_uint32_t:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: lis r5, -15264
; CHECK-P9-NEXT: and r3, r3, r5
; CHECK-P9-NEXT: lis r5, 15258
; CHECK-P9-NEXT: ori r5, r5, 41712
; CHECK-P9-NEXT: stwx r4, r3, r5
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: st_disjoint_align32_uint64_t_uint32_t:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: lis r5, -15264
; CHECK-P8-NEXT: lis r6, 15258
; CHECK-P8-NEXT: and r3, r3, r5
; CHECK-P8-NEXT: ori r5, r6, 41712
; CHECK-P8-NEXT: stwx r4, r3, r5
; CHECK-P8-NEXT: blr
entry:
%and = and i64 %ptr, -1000341504
%conv = trunc i64 %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_uint64_t_uint32_t(i64 %ptr, i64 %str) {
; CHECK-P10-LABEL: st_not_disjoint64_uint64_t_uint32_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r5, 232
; CHECK-P10-NEXT: pli r6, 3567587329
; CHECK-P10-NEXT: rldimi r6, r5, 32, 0
; CHECK-P10-NEXT: or r3, r3, r6
; CHECK-P10-NEXT: stw r4, 0(r3)
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: st_not_disjoint64_uint64_t_uint32_t:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: li r5, 29
; CHECK-PREP10-NEXT: rldic r5, r5, 35, 24
; CHECK-PREP10-NEXT: oris r5, r5, 54437
; CHECK-PREP10-NEXT: ori r5, r5, 4097
; CHECK-PREP10-NEXT: or r3, r3, r5
; CHECK-PREP10-NEXT: stw r4, 0(r3)
; CHECK-PREP10-NEXT: blr
entry:
%conv = trunc i64 %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_uint64_t_uint32_t(i64 %ptr, i64 %str) {
; CHECK-P10-LABEL: st_disjoint_align64_uint64_t_uint32_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r5, 244140625
; CHECK-P10-NEXT: rldicr r3, r3, 0, 23
; CHECK-P10-NEXT: rldic r5, r5, 12, 24
; CHECK-P10-NEXT: stwx r4, r3, r5
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: st_disjoint_align64_uint64_t_uint32_t:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: lis r5, 3725
; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23
; CHECK-PREP10-NEXT: ori r5, r5, 19025
; CHECK-PREP10-NEXT: rldic r5, r5, 12, 24
; CHECK-PREP10-NEXT: stwx r4, r3, r5
; CHECK-PREP10-NEXT: blr
entry:
%and = and i64 %ptr, -1099511627776
%conv = trunc i64 %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_uint64_t_uint32_t(i64 %str) {
; CHECK-LABEL: st_cst_align16_uint64_t_uint32_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: stw r3, 4080(0)
; CHECK-NEXT: blr
entry:
%conv = trunc i64 %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_uint64_t_uint32_t(i64 %str) {
; CHECK-LABEL: st_cst_align32_uint64_t_uint32_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lis r4, 153
; CHECK-NEXT: stw r3, -27108(r4)
; CHECK-NEXT: blr
entry:
%conv = trunc i64 %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_uint64_t_uint32_t(i64 %str) {
; CHECK-P10-LABEL: st_cst_align64_uint64_t_uint32_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r4, 244140625
; CHECK-P10-NEXT: rldic r4, r4, 12, 24
; CHECK-P10-NEXT: stw r3, 0(r4)
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: st_cst_align64_uint64_t_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: stw r3, 0(r4)
; CHECK-PREP10-NEXT: blr
entry:
%conv = trunc i64 %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_uint64_t_uint64_t(i64 %ptr, i64 %str) {
; CHECK-LABEL: st_0_uint64_t_uint64_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: std r4, 0(r3)
; CHECK-NEXT: blr
entry:
%0 = inttoptr i64 %ptr to i64*
store i64 %str, i64* %0, align 8
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_align16_uint64_t_uint64_t(i8* nocapture %ptr, i64 %str) {
; CHECK-LABEL: st_align16_uint64_t_uint64_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: std r4, 8(r3)
; CHECK-NEXT: blr
entry:
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 8
%0 = bitcast i8* %add.ptr to i64*
store i64 %str, i64* %0, align 8
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_align32_uint64_t_uint64_t(i8* nocapture %ptr, i64 %str) {
; CHECK-P10-LABEL: st_align32_uint64_t_uint64_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r5, 99999000
; CHECK-P10-NEXT: stdx r4, r3, r5
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: st_align32_uint64_t_uint64_t:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: lis r5, 1525
; CHECK-PREP10-NEXT: ori r5, r5, 56600
; CHECK-PREP10-NEXT: stdx r4, r3, r5
; CHECK-PREP10-NEXT: blr
entry:
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 99999000
%0 = bitcast i8* %add.ptr to i64*
store i64 %str, i64* %0, align 8
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_align64_uint64_t_uint64_t(i8* nocapture %ptr, i64 %str) {
; CHECK-P10-LABEL: st_align64_uint64_t_uint64_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r5, 244140625
; CHECK-P10-NEXT: rldic r5, r5, 12, 24
; CHECK-P10-NEXT: stdx r4, r3, r5
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: st_align64_uint64_t_uint64_t:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: lis r5, 3725
; CHECK-PREP10-NEXT: ori r5, r5, 19025
; CHECK-PREP10-NEXT: rldic r5, r5, 12, 24
; CHECK-PREP10-NEXT: stdx r4, r3, r5
; CHECK-PREP10-NEXT: blr
entry:
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1000000000000
%0 = bitcast i8* %add.ptr to i64*
store i64 %str, i64* %0, align 8
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_reg_uint64_t_uint64_t(i8* nocapture %ptr, i64 %off, i64 %str) {
; CHECK-LABEL: st_reg_uint64_t_uint64_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: stdx r5, r3, r4
; CHECK-NEXT: blr
entry:
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 %off
%0 = bitcast i8* %add.ptr to i64*
store i64 %str, i64* %0, align 8
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_or1_uint64_t_uint64_t(i64 %ptr, i8 zeroext %off, i64 %str) {
; CHECK-LABEL: st_or1_uint64_t_uint64_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: or r3, r4, r3
; CHECK-NEXT: std r5, 0(r3)
; CHECK-NEXT: blr
entry:
%conv = zext i8 %off to i64
%or = or i64 %conv, %ptr
%0 = inttoptr i64 %or to i64*
store i64 %str, i64* %0, align 8
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_or2_uint64_t_uint64_t(i64 %ptr, i8 zeroext %off, i64 %str) {
; CHECK-LABEL: st_or2_uint64_t_uint64_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: rldicr r3, r3, 0, 51
; CHECK-NEXT: stdx r5, r3, r4
; CHECK-NEXT: blr
entry:
%and = and i64 %ptr, -4096
%conv = zext i8 %off to i64
%or = or i64 %and, %conv
%0 = inttoptr i64 %or to i64*
store i64 %str, i64* %0, align 8
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_not_disjoint16_uint64_t_uint64_t(i64 %ptr, i64 %str) {
; CHECK-LABEL: st_not_disjoint16_uint64_t_uint64_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: ori r3, r3, 6
; CHECK-NEXT: std r4, 0(r3)
; CHECK-NEXT: blr
entry:
%or = or i64 %ptr, 6
%0 = inttoptr i64 %or to i64*
store i64 %str, i64* %0, align 8
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_disjoint_align16_uint64_t_uint64_t(i64 %ptr, i64 %str) {
; CHECK-LABEL: st_disjoint_align16_uint64_t_uint64_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: rldicr r3, r3, 0, 51
; CHECK-NEXT: std r4, 24(r3)
; CHECK-NEXT: blr
entry:
%and = and i64 %ptr, -4096
%or = or i64 %and, 24
%0 = inttoptr i64 %or to i64*
store i64 %str, i64* %0, align 8
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_not_disjoint32_uint64_t_uint64_t(i64 %ptr, i64 %str) {
; CHECK-LABEL: st_not_disjoint32_uint64_t_uint64_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: ori r3, r3, 34463
; CHECK-NEXT: oris r3, r3, 1
; CHECK-NEXT: std r4, 0(r3)
; CHECK-NEXT: blr
entry:
%or = or i64 %ptr, 99999
%0 = inttoptr i64 %or to i64*
store i64 %str, i64* %0, align 8
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_disjoint_align32_uint64_t_uint64_t(i64 %ptr, i64 %str) {
; CHECK-P10-LABEL: st_disjoint_align32_uint64_t_uint64_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: lis r5, -15264
; CHECK-P10-NEXT: and r3, r3, r5
; CHECK-P10-NEXT: pli r5, 999990000
; CHECK-P10-NEXT: stdx r4, r3, r5
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: st_disjoint_align32_uint64_t_uint64_t:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: lis r5, -15264
; CHECK-P9-NEXT: and r3, r3, r5
; CHECK-P9-NEXT: lis r5, 15258
; CHECK-P9-NEXT: ori r5, r5, 41712
; CHECK-P9-NEXT: stdx r4, r3, r5
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: st_disjoint_align32_uint64_t_uint64_t:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: lis r5, -15264
; CHECK-P8-NEXT: lis r6, 15258
; CHECK-P8-NEXT: and r3, r3, r5
; CHECK-P8-NEXT: ori r5, r6, 41712
; CHECK-P8-NEXT: stdx r4, r3, r5
; CHECK-P8-NEXT: blr
entry:
%and = and i64 %ptr, -1000341504
%or = or i64 %and, 999990000
%0 = inttoptr i64 %or to i64*
store i64 %str, i64* %0, align 16
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_not_disjoint64_uint64_t_uint64_t(i64 %ptr, i64 %str) {
; CHECK-P10-LABEL: st_not_disjoint64_uint64_t_uint64_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r5, 232
; CHECK-P10-NEXT: pli r6, 3567587329
; CHECK-P10-NEXT: rldimi r6, r5, 32, 0
; CHECK-P10-NEXT: or r3, r3, r6
; CHECK-P10-NEXT: std r4, 0(r3)
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: st_not_disjoint64_uint64_t_uint64_t:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: li r5, 29
; CHECK-PREP10-NEXT: rldic r5, r5, 35, 24
; CHECK-PREP10-NEXT: oris r5, r5, 54437
; CHECK-PREP10-NEXT: ori r5, r5, 4097
; CHECK-PREP10-NEXT: or r3, r3, r5
; CHECK-PREP10-NEXT: std r4, 0(r3)
; CHECK-PREP10-NEXT: blr
entry:
%or = or i64 %ptr, 1000000000001
%0 = inttoptr i64 %or to i64*
store i64 %str, i64* %0, align 8
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_disjoint_align64_uint64_t_uint64_t(i64 %ptr, i64 %str) {
; CHECK-P10-LABEL: st_disjoint_align64_uint64_t_uint64_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r5, 244140625
; CHECK-P10-NEXT: rldicr r3, r3, 0, 23
; CHECK-P10-NEXT: rldic r5, r5, 12, 24
; CHECK-P10-NEXT: stdx r4, r3, r5
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: st_disjoint_align64_uint64_t_uint64_t:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: lis r5, 3725
; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23
; CHECK-PREP10-NEXT: ori r5, r5, 19025
; CHECK-PREP10-NEXT: rldic r5, r5, 12, 24
; CHECK-PREP10-NEXT: stdx r4, r3, r5
; CHECK-PREP10-NEXT: blr
entry:
%and = and i64 %ptr, -1099511627776
%or = or i64 %and, 1000000000000
%0 = inttoptr i64 %or to i64*
store i64 %str, i64* %0, align 4096
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_cst_align16_uint64_t_uint64_t(i64 %str) {
; CHECK-LABEL: st_cst_align16_uint64_t_uint64_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: std r3, 4080(0)
; CHECK-NEXT: blr
entry:
store i64 %str, 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_uint64_t_uint64_t(i64 %str) {
; CHECK-LABEL: st_cst_align32_uint64_t_uint64_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lis r4, 153
; CHECK-NEXT: std r3, -27108(r4)
; CHECK-NEXT: blr
entry:
store i64 %str, 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_uint64_t_uint64_t(i64 %str) {
; CHECK-P10-LABEL: st_cst_align64_uint64_t_uint64_t:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r4, 244140625
; CHECK-P10-NEXT: rldic r4, r4, 12, 24
; CHECK-P10-NEXT: std r3, 0(r4)
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: st_cst_align64_uint64_t_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: std r3, 0(r4)
; CHECK-PREP10-NEXT: blr
entry:
store i64 %str, i64* inttoptr (i64 1000000000000 to i64*), align 4096
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_0_uint64_t_float(i64 %ptr, i64 %str) {
; CHECK-P10-LABEL: st_0_uint64_t_float:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprd f0, r4
; CHECK-P10-NEXT: xscvuxdsp f0, f0
; CHECK-P10-NEXT: stfs f0, 0(r3)
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: st_0_uint64_t_float:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprd f0, r4
; CHECK-P9-NEXT: xscvuxdsp f0, f0
; CHECK-P9-NEXT: stfs f0, 0(r3)
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: st_0_uint64_t_float:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprd f0, r4
; CHECK-P8-NEXT: xscvuxdsp f0, f0
; CHECK-P8-NEXT: stfsx f0, 0, r3
; CHECK-P8-NEXT: blr
entry:
%conv = uitofp i64 %str to float
%0 = inttoptr i64 %ptr to float*
store float %conv, float* %0, align 4
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_align16_uint64_t_float(i8* nocapture %ptr, i64 %str) {
; CHECK-LABEL: st_align16_uint64_t_float:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: mtfprd f0, r4
; CHECK-NEXT: xscvuxdsp f0, f0
; CHECK-NEXT: stfs f0, 8(r3)
; CHECK-NEXT: blr
entry:
%conv = uitofp i64 %str to float
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 8
%0 = bitcast i8* %add.ptr to float*
store float %conv, float* %0, align 4
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_align32_uint64_t_float(i8* nocapture %ptr, i64 %str) {
; CHECK-P10-LABEL: st_align32_uint64_t_float:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprd f0, r4
; CHECK-P10-NEXT: pli r4, 99999000
; CHECK-P10-NEXT: xscvuxdsp f0, f0
; CHECK-P10-NEXT: stfsx f0, r3, r4
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: st_align32_uint64_t_float:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprd f0, r4
; CHECK-P9-NEXT: lis r4, 1525
; CHECK-P9-NEXT: xscvuxdsp f0, f0
; CHECK-P9-NEXT: ori r4, r4, 56600
; CHECK-P9-NEXT: stfsx f0, r3, r4
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: st_align32_uint64_t_float:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprd f0, r4
; CHECK-P8-NEXT: lis r4, 1525
; CHECK-P8-NEXT: ori r4, r4, 56600
; CHECK-P8-NEXT: xscvuxdsp f0, f0
; CHECK-P8-NEXT: stfsx f0, r3, r4
; CHECK-P8-NEXT: blr
entry:
%conv = uitofp i64 %str to float
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 99999000
%0 = bitcast i8* %add.ptr to float*
store float %conv, float* %0, align 4
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_align64_uint64_t_float(i8* nocapture %ptr, i64 %str) {
; CHECK-P10-LABEL: st_align64_uint64_t_float:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprd f0, r4
; CHECK-P10-NEXT: pli r4, 244140625
; CHECK-P10-NEXT: rldic r4, r4, 12, 24
; CHECK-P10-NEXT: xscvuxdsp f0, f0
; CHECK-P10-NEXT: stfsx f0, r3, r4
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: st_align64_uint64_t_float:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprd f0, r4
; CHECK-P9-NEXT: lis r4, 3725
; CHECK-P9-NEXT: xscvuxdsp f0, f0
; CHECK-P9-NEXT: ori r4, r4, 19025
; CHECK-P9-NEXT: rldic r4, r4, 12, 24
; CHECK-P9-NEXT: stfsx f0, r3, r4
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: st_align64_uint64_t_float:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprd f0, r4
; CHECK-P8-NEXT: lis r4, 3725
; CHECK-P8-NEXT: ori r4, r4, 19025
; CHECK-P8-NEXT: xscvuxdsp f0, f0
; CHECK-P8-NEXT: rldic r4, r4, 12, 24
; CHECK-P8-NEXT: stfsx f0, r3, r4
; CHECK-P8-NEXT: blr
entry:
%conv = uitofp i64 %str to float
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1000000000000
%0 = bitcast i8* %add.ptr to float*
store float %conv, float* %0, align 4
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_reg_uint64_t_float(i8* nocapture %ptr, i64 %off, i64 %str) {
; CHECK-LABEL: st_reg_uint64_t_float:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: mtfprd f0, r5
; CHECK-NEXT: xscvuxdsp f0, f0
; CHECK-NEXT: stfsx f0, r3, r4
; CHECK-NEXT: blr
entry:
%conv = uitofp i64 %str to float
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 %off
%0 = bitcast i8* %add.ptr to float*
store float %conv, float* %0, align 4
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_or1_uint64_t_float(i64 %ptr, i8 zeroext %off, i64 %str) {
; CHECK-P10-LABEL: st_or1_uint64_t_float:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprd f0, r5
; CHECK-P10-NEXT: or r3, r4, r3
; CHECK-P10-NEXT: xscvuxdsp f0, f0
; CHECK-P10-NEXT: stfs f0, 0(r3)
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: st_or1_uint64_t_float:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprd f0, r5
; CHECK-P9-NEXT: or r3, r4, r3
; CHECK-P9-NEXT: xscvuxdsp f0, f0
; CHECK-P9-NEXT: stfs f0, 0(r3)
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: st_or1_uint64_t_float:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprd f0, r5
; CHECK-P8-NEXT: or r3, r4, r3
; CHECK-P8-NEXT: xscvuxdsp f0, f0
; CHECK-P8-NEXT: stfsx f0, 0, r3
; CHECK-P8-NEXT: blr
entry:
%conv = uitofp i64 %str to float
%conv1 = zext i8 %off to i64
%or = or i64 %conv1, %ptr
%0 = inttoptr i64 %or to float*
store float %conv, float* %0, align 4
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_or2_uint64_t_float(i64 %ptr, i8 zeroext %off, i64 %str) {
; CHECK-LABEL: st_or2_uint64_t_float:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: mtfprd f0, r5
; CHECK-NEXT: rldicr r3, r3, 0, 51
; CHECK-NEXT: xscvuxdsp f0, f0
; CHECK-NEXT: stfsx f0, r3, r4
; CHECK-NEXT: blr
entry:
%and = and i64 %ptr, -4096
%conv = uitofp i64 %str to float
%conv1 = zext i8 %off to i64
%or = or i64 %and, %conv1
%0 = inttoptr i64 %or to float*
store float %conv, float* %0, align 4
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_not_disjoint16_uint64_t_float(i64 %ptr, i64 %str) {
; CHECK-P10-LABEL: st_not_disjoint16_uint64_t_float:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprd f0, r4
; CHECK-P10-NEXT: ori r3, r3, 6
; CHECK-P10-NEXT: xscvuxdsp f0, f0
; CHECK-P10-NEXT: stfs f0, 0(r3)
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: st_not_disjoint16_uint64_t_float:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprd f0, r4
; CHECK-P9-NEXT: ori r3, r3, 6
; CHECK-P9-NEXT: xscvuxdsp f0, f0
; CHECK-P9-NEXT: stfs f0, 0(r3)
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: st_not_disjoint16_uint64_t_float:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprd f0, r4
; CHECK-P8-NEXT: ori r3, r3, 6
; CHECK-P8-NEXT: xscvuxdsp f0, f0
; CHECK-P8-NEXT: stfsx f0, 0, r3
; CHECK-P8-NEXT: blr
entry:
%conv = uitofp i64 %str to float
%or = or i64 %ptr, 6
%0 = inttoptr i64 %or to float*
store float %conv, float* %0, align 4
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_disjoint_align16_uint64_t_float(i64 %ptr, i64 %str) {
; CHECK-P10-LABEL: st_disjoint_align16_uint64_t_float:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprd f0, r4
; CHECK-P10-NEXT: rldicr r3, r3, 0, 51
; CHECK-P10-NEXT: xscvuxdsp f0, f0
; CHECK-P10-NEXT: stfs f0, 24(r3)
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: st_disjoint_align16_uint64_t_float:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprd f0, r4
; CHECK-P9-NEXT: rldicr r3, r3, 0, 51
; CHECK-P9-NEXT: xscvuxdsp f0, f0
; CHECK-P9-NEXT: stfs f0, 24(r3)
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: st_disjoint_align16_uint64_t_float:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprd f0, r4
; CHECK-P8-NEXT: rldicr r3, r3, 0, 51
; CHECK-P8-NEXT: ori r3, r3, 24
; CHECK-P8-NEXT: xscvuxdsp f0, f0
; CHECK-P8-NEXT: stfsx f0, 0, r3
; CHECK-P8-NEXT: blr
entry:
%and = and i64 %ptr, -4096
%conv = uitofp i64 %str to float
%or = or i64 %and, 24
%0 = inttoptr i64 %or to float*
store float %conv, float* %0, align 8
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_not_disjoint32_uint64_t_float(i64 %ptr, i64 %str) {
; CHECK-P10-LABEL: st_not_disjoint32_uint64_t_float:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprd f0, r4
; CHECK-P10-NEXT: ori r3, r3, 34463
; CHECK-P10-NEXT: xscvuxdsp f0, f0
; CHECK-P10-NEXT: oris r3, r3, 1
; CHECK-P10-NEXT: stfs f0, 0(r3)
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: st_not_disjoint32_uint64_t_float:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprd f0, r4
; CHECK-P9-NEXT: ori r3, r3, 34463
; CHECK-P9-NEXT: xscvuxdsp f0, f0
; CHECK-P9-NEXT: oris r3, r3, 1
; CHECK-P9-NEXT: stfs f0, 0(r3)
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: st_not_disjoint32_uint64_t_float:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprd f0, r4
; CHECK-P8-NEXT: ori r3, r3, 34463
; CHECK-P8-NEXT: oris r3, r3, 1
; CHECK-P8-NEXT: xscvuxdsp f0, f0
; CHECK-P8-NEXT: stfsx f0, 0, r3
; CHECK-P8-NEXT: blr
entry:
%conv = uitofp i64 %str to float
%or = or i64 %ptr, 99999
%0 = inttoptr i64 %or to float*
store float %conv, float* %0, align 4
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_disjoint_align32_uint64_t_float(i64 %ptr, i64 %str) {
; CHECK-P10-LABEL: st_disjoint_align32_uint64_t_float:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprd f0, r4
; CHECK-P10-NEXT: lis r5, -15264
; CHECK-P10-NEXT: pli r4, 999990000
; CHECK-P10-NEXT: xscvuxdsp f0, f0
; CHECK-P10-NEXT: and r3, r3, r5
; CHECK-P10-NEXT: stfsx f0, r3, r4
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: st_disjoint_align32_uint64_t_float:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprd f0, r4
; CHECK-P9-NEXT: lis r5, -15264
; CHECK-P9-NEXT: lis r4, 15258
; CHECK-P9-NEXT: xscvuxdsp f0, f0
; CHECK-P9-NEXT: and r3, r3, r5
; CHECK-P9-NEXT: ori r4, r4, 41712
; CHECK-P9-NEXT: stfsx f0, r3, r4
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: st_disjoint_align32_uint64_t_float:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprd f0, r4
; 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: xscvuxdsp f0, f0
; CHECK-P8-NEXT: stfsx f0, r3, r4
; CHECK-P8-NEXT: blr
entry:
%and = and i64 %ptr, -1000341504
%conv = uitofp i64 %str to float
%or = or i64 %and, 999990000
%0 = inttoptr i64 %or to float*
store float %conv, float* %0, align 16
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_not_disjoint64_uint64_t_float(i64 %ptr, i64 %str) {
; CHECK-P10-LABEL: st_not_disjoint64_uint64_t_float:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprd f0, r4
; CHECK-P10-NEXT: pli r4, 232
; CHECK-P10-NEXT: pli r5, 3567587329
; CHECK-P10-NEXT: rldimi r5, r4, 32, 0
; CHECK-P10-NEXT: xscvuxdsp f0, f0
; CHECK-P10-NEXT: or r3, r3, r5
; CHECK-P10-NEXT: stfs f0, 0(r3)
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: st_not_disjoint64_uint64_t_float:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprd f0, r4
; CHECK-P9-NEXT: li r4, 29
; CHECK-P9-NEXT: rldic r4, r4, 35, 24
; CHECK-P9-NEXT: xscvuxdsp f0, f0
; 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 f0, 0(r3)
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: st_not_disjoint64_uint64_t_float:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprd f0, r4
; CHECK-P8-NEXT: li r4, 29
; CHECK-P8-NEXT: rldic r4, r4, 35, 24
; CHECK-P8-NEXT: xscvuxdsp f0, f0
; 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 f0, 0, r3
; CHECK-P8-NEXT: blr
entry:
%conv = uitofp i64 %str to float
%or = or i64 %ptr, 1000000000001
%0 = inttoptr i64 %or to float*
store float %conv, float* %0, align 4
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_disjoint_align64_uint64_t_float(i64 %ptr, i64 %str) {
; CHECK-P10-LABEL: st_disjoint_align64_uint64_t_float:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprd f0, r4
; 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: xscvuxdsp f0, f0
; CHECK-P10-NEXT: stfsx f0, r3, r4
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: st_disjoint_align64_uint64_t_float:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprd f0, r4
; CHECK-P9-NEXT: lis r4, 3725
; CHECK-P9-NEXT: rldicr r3, r3, 0, 23
; CHECK-P9-NEXT: xscvuxdsp f0, f0
; CHECK-P9-NEXT: ori r4, r4, 19025
; CHECK-P9-NEXT: rldic r4, r4, 12, 24
; CHECK-P9-NEXT: stfsx f0, r3, r4
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: st_disjoint_align64_uint64_t_float:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprd f0, r4
; CHECK-P8-NEXT: lis r5, 3725
; CHECK-P8-NEXT: rldicr r3, r3, 0, 23
; CHECK-P8-NEXT: ori r4, r5, 19025
; CHECK-P8-NEXT: xscvuxdsp f0, f0
; CHECK-P8-NEXT: rldic r4, r4, 12, 24
; CHECK-P8-NEXT: stfsx f0, r3, r4
; CHECK-P8-NEXT: blr
entry:
%and = and i64 %ptr, -1099511627776
%conv = uitofp i64 %str to float
%or = or i64 %and, 1000000000000
%0 = inttoptr i64 %or to float*
store float %conv, float* %0, align 4096
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_cst_align16_uint64_t_float(i64 %str) {
; CHECK-LABEL: st_cst_align16_uint64_t_float:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: mtfprd f0, r3
; CHECK-NEXT: xscvuxdsp f0, f0
; CHECK-NEXT: stfs f0, 4080(0)
; CHECK-NEXT: blr
entry:
%conv = uitofp i64 %str to float
store float %conv, 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_uint64_t_float(i64 %str) {
; CHECK-P10-LABEL: st_cst_align32_uint64_t_float:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprd f0, r3
; CHECK-P10-NEXT: lis r3, 153
; CHECK-P10-NEXT: xscvuxdsp f0, f0
; CHECK-P10-NEXT: stfs f0, -27108(r3)
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: st_cst_align32_uint64_t_float:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprd f0, r3
; CHECK-P9-NEXT: lis r3, 153
; CHECK-P9-NEXT: xscvuxdsp f0, f0
; CHECK-P9-NEXT: stfs f0, -27108(r3)
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: st_cst_align32_uint64_t_float:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprd f0, r3
; CHECK-P8-NEXT: lis r3, 152
; CHECK-P8-NEXT: ori r3, r3, 38428
; CHECK-P8-NEXT: xscvuxdsp f0, f0
; CHECK-P8-NEXT: stfsx f0, 0, r3
; CHECK-P8-NEXT: blr
entry:
%conv = uitofp i64 %str to float
store float %conv, 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_uint64_t_float(i64 %str) {
; CHECK-P10-LABEL: st_cst_align64_uint64_t_float:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprd f0, r3
; CHECK-P10-NEXT: pli r3, 244140625
; CHECK-P10-NEXT: rldic r3, r3, 12, 24
; CHECK-P10-NEXT: xscvuxdsp f0, f0
; CHECK-P10-NEXT: stfs f0, 0(r3)
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: st_cst_align64_uint64_t_float:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprd f0, r3
; CHECK-P9-NEXT: lis r3, 3725
; CHECK-P9-NEXT: xscvuxdsp f0, f0
; CHECK-P9-NEXT: ori r3, r3, 19025
; CHECK-P9-NEXT: rldic r3, r3, 12, 24
; CHECK-P9-NEXT: stfs f0, 0(r3)
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: st_cst_align64_uint64_t_float:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprd f0, r3
; CHECK-P8-NEXT: lis r3, 3725
; CHECK-P8-NEXT: ori r3, r3, 19025
; CHECK-P8-NEXT: xscvuxdsp f0, f0
; CHECK-P8-NEXT: rldic r3, r3, 12, 24
; CHECK-P8-NEXT: stfsx f0, 0, r3
; CHECK-P8-NEXT: blr
entry:
%conv = uitofp i64 %str to float
store float %conv, float* inttoptr (i64 1000000000000 to float*), align 4096
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_0_uint64_t_double(i64 %ptr, i64 %str) {
; CHECK-P10-LABEL: st_0_uint64_t_double:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprd f0, r4
; CHECK-P10-NEXT: xscvuxddp f0, f0
; CHECK-P10-NEXT: stfd f0, 0(r3)
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: st_0_uint64_t_double:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprd f0, r4
; CHECK-P9-NEXT: xscvuxddp f0, f0
; CHECK-P9-NEXT: stfd f0, 0(r3)
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: st_0_uint64_t_double:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprd f0, r4
; CHECK-P8-NEXT: xscvuxddp f0, f0
; CHECK-P8-NEXT: stfdx f0, 0, r3
; CHECK-P8-NEXT: blr
entry:
%conv = uitofp i64 %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_uint64_t_double(i8* nocapture %ptr, i64 %str) {
; CHECK-LABEL: st_align16_uint64_t_double:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: mtfprd f0, r4
; CHECK-NEXT: xscvuxddp f0, f0
; CHECK-NEXT: stfd f0, 8(r3)
; CHECK-NEXT: blr
entry:
%conv = uitofp i64 %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_uint64_t_double(i8* nocapture %ptr, i64 %str) {
; CHECK-P10-LABEL: st_align32_uint64_t_double:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprd f0, r4
; CHECK-P10-NEXT: pli r4, 99999000
; CHECK-P10-NEXT: xscvuxddp f0, f0
; CHECK-P10-NEXT: stfdx f0, r3, r4
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: st_align32_uint64_t_double:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprd f0, r4
; CHECK-P9-NEXT: lis r4, 1525
; CHECK-P9-NEXT: xscvuxddp f0, f0
; CHECK-P9-NEXT: ori r4, r4, 56600
; CHECK-P9-NEXT: stfdx f0, r3, r4
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: st_align32_uint64_t_double:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprd f0, r4
; CHECK-P8-NEXT: lis r4, 1525
; CHECK-P8-NEXT: ori r4, r4, 56600
; CHECK-P8-NEXT: xscvuxddp f0, f0
; CHECK-P8-NEXT: stfdx f0, r3, r4
; CHECK-P8-NEXT: blr
entry:
%conv = uitofp i64 %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_uint64_t_double(i8* nocapture %ptr, i64 %str) {
; CHECK-P10-LABEL: st_align64_uint64_t_double:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprd f0, r4
; CHECK-P10-NEXT: pli r4, 244140625
; CHECK-P10-NEXT: rldic r4, r4, 12, 24
; CHECK-P10-NEXT: xscvuxddp f0, f0
; CHECK-P10-NEXT: stfdx f0, r3, r4
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: st_align64_uint64_t_double:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprd f0, r4
; CHECK-P9-NEXT: lis r4, 3725
; CHECK-P9-NEXT: xscvuxddp f0, f0
; CHECK-P9-NEXT: ori r4, r4, 19025
; CHECK-P9-NEXT: rldic r4, r4, 12, 24
; CHECK-P9-NEXT: stfdx f0, r3, r4
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: st_align64_uint64_t_double:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprd f0, r4
; CHECK-P8-NEXT: lis r4, 3725
; CHECK-P8-NEXT: ori r4, r4, 19025
; CHECK-P8-NEXT: xscvuxddp f0, f0
; CHECK-P8-NEXT: rldic r4, r4, 12, 24
; CHECK-P8-NEXT: stfdx f0, r3, r4
; CHECK-P8-NEXT: blr
entry:
%conv = uitofp i64 %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_uint64_t_double(i8* nocapture %ptr, i64 %off, i64 %str) {
; CHECK-LABEL: st_reg_uint64_t_double:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: mtfprd f0, r5
; CHECK-NEXT: xscvuxddp f0, f0
; CHECK-NEXT: stfdx f0, r3, r4
; CHECK-NEXT: blr
entry:
%conv = uitofp i64 %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_uint64_t_double(i64 %ptr, i8 zeroext %off, i64 %str) {
; CHECK-P10-LABEL: st_or1_uint64_t_double:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprd f0, r5
; CHECK-P10-NEXT: or r3, r4, r3
; CHECK-P10-NEXT: xscvuxddp f0, f0
; CHECK-P10-NEXT: stfd f0, 0(r3)
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: st_or1_uint64_t_double:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprd f0, r5
; CHECK-P9-NEXT: or r3, r4, r3
; CHECK-P9-NEXT: xscvuxddp f0, f0
; CHECK-P9-NEXT: stfd f0, 0(r3)
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: st_or1_uint64_t_double:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprd f0, r5
; CHECK-P8-NEXT: or r3, r4, r3
; CHECK-P8-NEXT: xscvuxddp f0, f0
; CHECK-P8-NEXT: stfdx f0, 0, r3
; CHECK-P8-NEXT: blr
entry:
%conv = uitofp i64 %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_or2_uint64_t_double(i64 %ptr, i8 zeroext %off, i64 %str) {
; CHECK-LABEL: st_or2_uint64_t_double:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: mtfprd f0, r5
; CHECK-NEXT: rldicr r3, r3, 0, 51
; CHECK-NEXT: xscvuxddp f0, f0
; CHECK-NEXT: stfdx f0, r3, r4
; CHECK-NEXT: blr
entry:
%and = and i64 %ptr, -4096
%conv = uitofp i64 %str to double
%conv1 = zext i8 %off to i64
%or = or i64 %and, %conv1
%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_uint64_t_double(i64 %ptr, i64 %str) {
; CHECK-P10-LABEL: st_not_disjoint16_uint64_t_double:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprd f0, r4
; CHECK-P10-NEXT: ori r3, r3, 6
; CHECK-P10-NEXT: xscvuxddp f0, f0
; CHECK-P10-NEXT: stfd f0, 0(r3)
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: st_not_disjoint16_uint64_t_double:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprd f0, r4
; CHECK-P9-NEXT: ori r3, r3, 6
; CHECK-P9-NEXT: xscvuxddp f0, f0
; CHECK-P9-NEXT: stfd f0, 0(r3)
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: st_not_disjoint16_uint64_t_double:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprd f0, r4
; CHECK-P8-NEXT: ori r3, r3, 6
; CHECK-P8-NEXT: xscvuxddp f0, f0
; CHECK-P8-NEXT: stfdx f0, 0, r3
; CHECK-P8-NEXT: blr
entry:
%conv = uitofp i64 %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_uint64_t_double(i64 %ptr, i64 %str) {
; CHECK-P10-LABEL: st_disjoint_align16_uint64_t_double:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprd f0, r4
; CHECK-P10-NEXT: rldicr r3, r3, 0, 51
; CHECK-P10-NEXT: xscvuxddp f0, f0
; CHECK-P10-NEXT: stfd f0, 24(r3)
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: st_disjoint_align16_uint64_t_double:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprd f0, r4
; CHECK-P9-NEXT: rldicr r3, r3, 0, 51
; CHECK-P9-NEXT: xscvuxddp f0, f0
; CHECK-P9-NEXT: stfd f0, 24(r3)
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: st_disjoint_align16_uint64_t_double:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprd f0, r4
; CHECK-P8-NEXT: rldicr r3, r3, 0, 51
; CHECK-P8-NEXT: ori r3, r3, 24
; CHECK-P8-NEXT: xscvuxddp f0, f0
; CHECK-P8-NEXT: stfdx f0, 0, r3
; CHECK-P8-NEXT: blr
entry:
%and = and i64 %ptr, -4096
%conv = uitofp i64 %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_uint64_t_double(i64 %ptr, i64 %str) {
; CHECK-P10-LABEL: st_not_disjoint32_uint64_t_double:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprd f0, r4
; CHECK-P10-NEXT: ori r3, r3, 34463
; CHECK-P10-NEXT: xscvuxddp f0, f0
; CHECK-P10-NEXT: oris r3, r3, 1
; CHECK-P10-NEXT: stfd f0, 0(r3)
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: st_not_disjoint32_uint64_t_double:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprd f0, r4
; CHECK-P9-NEXT: ori r3, r3, 34463
; CHECK-P9-NEXT: xscvuxddp f0, f0
; CHECK-P9-NEXT: oris r3, r3, 1
; CHECK-P9-NEXT: stfd f0, 0(r3)
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: st_not_disjoint32_uint64_t_double:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprd f0, r4
; CHECK-P8-NEXT: ori r3, r3, 34463
; CHECK-P8-NEXT: oris r3, r3, 1
; CHECK-P8-NEXT: xscvuxddp f0, f0
; CHECK-P8-NEXT: stfdx f0, 0, r3
; CHECK-P8-NEXT: blr
entry:
%conv = uitofp i64 %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_uint64_t_double(i64 %ptr, i64 %str) {
; CHECK-P10-LABEL: st_disjoint_align32_uint64_t_double:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprd f0, r4
; CHECK-P10-NEXT: lis r5, -15264
; CHECK-P10-NEXT: pli r4, 999990000
; CHECK-P10-NEXT: xscvuxddp f0, f0
; CHECK-P10-NEXT: and r3, r3, r5
; CHECK-P10-NEXT: stfdx f0, r3, r4
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: st_disjoint_align32_uint64_t_double:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprd f0, r4
; CHECK-P9-NEXT: lis r5, -15264
; CHECK-P9-NEXT: lis r4, 15258
; CHECK-P9-NEXT: xscvuxddp f0, f0
; CHECK-P9-NEXT: and r3, r3, r5
; CHECK-P9-NEXT: ori r4, r4, 41712
; CHECK-P9-NEXT: stfdx f0, r3, r4
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: st_disjoint_align32_uint64_t_double:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprd f0, r4
; 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: xscvuxddp f0, f0
; CHECK-P8-NEXT: stfdx f0, r3, r4
; CHECK-P8-NEXT: blr
entry:
%and = and i64 %ptr, -1000341504
%conv = uitofp i64 %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_uint64_t_double(i64 %ptr, i64 %str) {
; CHECK-P10-LABEL: st_not_disjoint64_uint64_t_double:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprd f0, r4
; CHECK-P10-NEXT: pli r4, 232
; CHECK-P10-NEXT: pli r5, 3567587329
; CHECK-P10-NEXT: rldimi r5, r4, 32, 0
; CHECK-P10-NEXT: xscvuxddp f0, f0
; CHECK-P10-NEXT: or r3, r3, r5
; CHECK-P10-NEXT: stfd f0, 0(r3)
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: st_not_disjoint64_uint64_t_double:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprd f0, r4
; CHECK-P9-NEXT: li r4, 29
; CHECK-P9-NEXT: rldic r4, r4, 35, 24
; CHECK-P9-NEXT: xscvuxddp f0, f0
; 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 f0, 0(r3)
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: st_not_disjoint64_uint64_t_double:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprd f0, r4
; CHECK-P8-NEXT: li r4, 29
; CHECK-P8-NEXT: rldic r4, r4, 35, 24
; CHECK-P8-NEXT: xscvuxddp f0, f0
; 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 f0, 0, r3
; CHECK-P8-NEXT: blr
entry:
%conv = uitofp i64 %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_uint64_t_double(i64 %ptr, i64 %str) {
; CHECK-P10-LABEL: st_disjoint_align64_uint64_t_double:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprd f0, r4
; 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: xscvuxddp f0, f0
; CHECK-P10-NEXT: stfdx f0, r3, r4
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: st_disjoint_align64_uint64_t_double:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprd f0, r4
; CHECK-P9-NEXT: lis r4, 3725
; CHECK-P9-NEXT: rldicr r3, r3, 0, 23
; CHECK-P9-NEXT: xscvuxddp f0, f0
; CHECK-P9-NEXT: ori r4, r4, 19025
; CHECK-P9-NEXT: rldic r4, r4, 12, 24
; CHECK-P9-NEXT: stfdx f0, r3, r4
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: st_disjoint_align64_uint64_t_double:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprd f0, r4
; CHECK-P8-NEXT: lis r5, 3725
; CHECK-P8-NEXT: rldicr r3, r3, 0, 23
; CHECK-P8-NEXT: ori r4, r5, 19025
; CHECK-P8-NEXT: xscvuxddp f0, f0
; CHECK-P8-NEXT: rldic r4, r4, 12, 24
; CHECK-P8-NEXT: stfdx f0, r3, r4
; CHECK-P8-NEXT: blr
entry:
%and = and i64 %ptr, -1099511627776
%conv = uitofp i64 %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_uint64_t_double(i64 %str) {
; CHECK-LABEL: st_cst_align16_uint64_t_double:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: mtfprd f0, r3
; CHECK-NEXT: xscvuxddp f0, f0
; CHECK-NEXT: stfd f0, 4080(0)
; CHECK-NEXT: blr
entry:
%conv = uitofp i64 %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_uint64_t_double(i64 %str) {
; CHECK-P10-LABEL: st_cst_align32_uint64_t_double:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprd f0, r3
; CHECK-P10-NEXT: lis r3, 153
; CHECK-P10-NEXT: xscvuxddp f0, f0
; CHECK-P10-NEXT: stfd f0, -27108(r3)
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: st_cst_align32_uint64_t_double:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprd f0, r3
; CHECK-P9-NEXT: lis r3, 153
; CHECK-P9-NEXT: xscvuxddp f0, f0
; CHECK-P9-NEXT: stfd f0, -27108(r3)
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: st_cst_align32_uint64_t_double:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprd f0, r3
; CHECK-P8-NEXT: lis r3, 152
; CHECK-P8-NEXT: ori r3, r3, 38428
; CHECK-P8-NEXT: xscvuxddp f0, f0
; CHECK-P8-NEXT: stfdx f0, 0, r3
; CHECK-P8-NEXT: blr
entry:
%conv = uitofp i64 %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_uint64_t_double(i64 %str) {
; CHECK-P10-LABEL: st_cst_align64_uint64_t_double:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprd f0, r3
; CHECK-P10-NEXT: pli r3, 244140625
; CHECK-P10-NEXT: rldic r3, r3, 12, 24
; CHECK-P10-NEXT: xscvuxddp f0, f0
; CHECK-P10-NEXT: stfd f0, 0(r3)
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: st_cst_align64_uint64_t_double:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprd f0, r3
; CHECK-P9-NEXT: lis r3, 3725
; CHECK-P9-NEXT: xscvuxddp f0, f0
; CHECK-P9-NEXT: ori r3, r3, 19025
; CHECK-P9-NEXT: rldic r3, r3, 12, 24
; CHECK-P9-NEXT: stfd f0, 0(r3)
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: st_cst_align64_uint64_t_double:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprd f0, r3
; CHECK-P8-NEXT: lis r3, 3725
; CHECK-P8-NEXT: ori r3, r3, 19025
; CHECK-P8-NEXT: xscvuxddp f0, f0
; CHECK-P8-NEXT: rldic r3, r3, 12, 24
; CHECK-P8-NEXT: stfdx f0, 0, r3
; CHECK-P8-NEXT: blr
entry:
%conv = uitofp i64 %str to double
store double %conv, double* inttoptr (i64 1000000000000 to double*), align 4096
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_0_int64_t_float(i64 %ptr, i64 %str) {
; CHECK-P10-LABEL: st_0_int64_t_float:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprd f0, r4
; CHECK-P10-NEXT: xscvsxdsp f0, f0
; CHECK-P10-NEXT: stfs f0, 0(r3)
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: st_0_int64_t_float:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprd f0, r4
; CHECK-P9-NEXT: xscvsxdsp f0, f0
; CHECK-P9-NEXT: stfs f0, 0(r3)
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: st_0_int64_t_float:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprd f0, r4
; CHECK-P8-NEXT: xscvsxdsp f0, f0
; CHECK-P8-NEXT: stfsx f0, 0, r3
; CHECK-P8-NEXT: blr
entry:
%conv = sitofp i64 %str to float
%0 = inttoptr i64 %ptr to float*
store float %conv, float* %0, align 4
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_align16_int64_t_float(i8* nocapture %ptr, i64 %str) {
; CHECK-LABEL: st_align16_int64_t_float:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: mtfprd f0, r4
; CHECK-NEXT: xscvsxdsp f0, f0
; CHECK-NEXT: stfs f0, 8(r3)
; CHECK-NEXT: blr
entry:
%conv = sitofp i64 %str to float
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 8
%0 = bitcast i8* %add.ptr to float*
store float %conv, float* %0, align 4
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_align32_int64_t_float(i8* nocapture %ptr, i64 %str) {
; CHECK-P10-LABEL: st_align32_int64_t_float:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprd f0, r4
; CHECK-P10-NEXT: pli r4, 99999000
; CHECK-P10-NEXT: xscvsxdsp f0, f0
; CHECK-P10-NEXT: stfsx f0, r3, r4
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: st_align32_int64_t_float:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprd f0, r4
; CHECK-P9-NEXT: lis r4, 1525
; CHECK-P9-NEXT: xscvsxdsp f0, f0
; CHECK-P9-NEXT: ori r4, r4, 56600
; CHECK-P9-NEXT: stfsx f0, r3, r4
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: st_align32_int64_t_float:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprd f0, r4
; CHECK-P8-NEXT: lis r4, 1525
; CHECK-P8-NEXT: ori r4, r4, 56600
; CHECK-P8-NEXT: xscvsxdsp f0, f0
; CHECK-P8-NEXT: stfsx f0, r3, r4
; CHECK-P8-NEXT: blr
entry:
%conv = sitofp i64 %str to float
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 99999000
%0 = bitcast i8* %add.ptr to float*
store float %conv, float* %0, align 4
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_align64_int64_t_float(i8* nocapture %ptr, i64 %str) {
; CHECK-P10-LABEL: st_align64_int64_t_float:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprd f0, r4
; CHECK-P10-NEXT: pli r4, 244140625
; CHECK-P10-NEXT: rldic r4, r4, 12, 24
; CHECK-P10-NEXT: xscvsxdsp f0, f0
; CHECK-P10-NEXT: stfsx f0, r3, r4
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: st_align64_int64_t_float:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprd f0, r4
; CHECK-P9-NEXT: lis r4, 3725
; CHECK-P9-NEXT: xscvsxdsp f0, f0
; CHECK-P9-NEXT: ori r4, r4, 19025
; CHECK-P9-NEXT: rldic r4, r4, 12, 24
; CHECK-P9-NEXT: stfsx f0, r3, r4
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: st_align64_int64_t_float:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprd f0, r4
; CHECK-P8-NEXT: lis r4, 3725
; CHECK-P8-NEXT: ori r4, r4, 19025
; CHECK-P8-NEXT: xscvsxdsp f0, f0
; CHECK-P8-NEXT: rldic r4, r4, 12, 24
; CHECK-P8-NEXT: stfsx f0, r3, r4
; CHECK-P8-NEXT: blr
entry:
%conv = sitofp i64 %str to float
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1000000000000
%0 = bitcast i8* %add.ptr to float*
store float %conv, float* %0, align 4
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_reg_int64_t_float(i8* nocapture %ptr, i64 %off, i64 %str) {
; CHECK-LABEL: st_reg_int64_t_float:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: mtfprd f0, r5
; CHECK-NEXT: xscvsxdsp f0, f0
; CHECK-NEXT: stfsx f0, r3, r4
; CHECK-NEXT: blr
entry:
%conv = sitofp i64 %str to float
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 %off
%0 = bitcast i8* %add.ptr to float*
store float %conv, float* %0, align 4
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_or1_int64_t_float(i64 %ptr, i8 zeroext %off, i64 %str) {
; CHECK-P10-LABEL: st_or1_int64_t_float:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprd f0, r5
; CHECK-P10-NEXT: or r3, r4, r3
; CHECK-P10-NEXT: xscvsxdsp f0, f0
; CHECK-P10-NEXT: stfs f0, 0(r3)
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: st_or1_int64_t_float:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprd f0, r5
; CHECK-P9-NEXT: or r3, r4, r3
; CHECK-P9-NEXT: xscvsxdsp f0, f0
; CHECK-P9-NEXT: stfs f0, 0(r3)
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: st_or1_int64_t_float:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprd f0, r5
; CHECK-P8-NEXT: or r3, r4, r3
; CHECK-P8-NEXT: xscvsxdsp f0, f0
; CHECK-P8-NEXT: stfsx f0, 0, r3
; CHECK-P8-NEXT: blr
entry:
%conv = sitofp i64 %str to float
%conv1 = zext i8 %off to i64
%or = or i64 %conv1, %ptr
%0 = inttoptr i64 %or to float*
store float %conv, float* %0, align 4
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_or2_int64_t_float(i64 %ptr, i8 zeroext %off, i64 %str) {
; CHECK-LABEL: st_or2_int64_t_float:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: mtfprd f0, r5
; CHECK-NEXT: rldicr r3, r3, 0, 51
; CHECK-NEXT: xscvsxdsp f0, f0
; CHECK-NEXT: stfsx f0, r3, r4
; CHECK-NEXT: blr
entry:
%and = and i64 %ptr, -4096
%conv = sitofp i64 %str to float
%conv1 = zext i8 %off to i64
%or = or i64 %and, %conv1
%0 = inttoptr i64 %or to float*
store float %conv, float* %0, align 4
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_not_disjoint16_int64_t_float(i64 %ptr, i64 %str) {
; CHECK-P10-LABEL: st_not_disjoint16_int64_t_float:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprd f0, r4
; CHECK-P10-NEXT: ori r3, r3, 6
; CHECK-P10-NEXT: xscvsxdsp f0, f0
; CHECK-P10-NEXT: stfs f0, 0(r3)
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: st_not_disjoint16_int64_t_float:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprd f0, r4
; CHECK-P9-NEXT: ori r3, r3, 6
; CHECK-P9-NEXT: xscvsxdsp f0, f0
; CHECK-P9-NEXT: stfs f0, 0(r3)
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: st_not_disjoint16_int64_t_float:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprd f0, r4
; CHECK-P8-NEXT: ori r3, r3, 6
; CHECK-P8-NEXT: xscvsxdsp f0, f0
; CHECK-P8-NEXT: stfsx f0, 0, r3
; CHECK-P8-NEXT: blr
entry:
%conv = sitofp i64 %str to float
%or = or i64 %ptr, 6
%0 = inttoptr i64 %or to float*
store float %conv, float* %0, align 4
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_disjoint_align16_int64_t_float(i64 %ptr, i64 %str) {
; CHECK-P10-LABEL: st_disjoint_align16_int64_t_float:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprd f0, r4
; CHECK-P10-NEXT: rldicr r3, r3, 0, 51
; CHECK-P10-NEXT: xscvsxdsp f0, f0
; CHECK-P10-NEXT: stfs f0, 24(r3)
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: st_disjoint_align16_int64_t_float:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprd f0, r4
; CHECK-P9-NEXT: rldicr r3, r3, 0, 51
; CHECK-P9-NEXT: xscvsxdsp f0, f0
; CHECK-P9-NEXT: stfs f0, 24(r3)
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: st_disjoint_align16_int64_t_float:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprd f0, r4
; CHECK-P8-NEXT: rldicr r3, r3, 0, 51
; CHECK-P8-NEXT: ori r3, r3, 24
; CHECK-P8-NEXT: xscvsxdsp f0, f0
; CHECK-P8-NEXT: stfsx f0, 0, r3
; CHECK-P8-NEXT: blr
entry:
%and = and i64 %ptr, -4096
%conv = sitofp i64 %str to float
%or = or i64 %and, 24
%0 = inttoptr i64 %or to float*
store float %conv, float* %0, align 8
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_not_disjoint32_int64_t_float(i64 %ptr, i64 %str) {
; CHECK-P10-LABEL: st_not_disjoint32_int64_t_float:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprd f0, r4
; CHECK-P10-NEXT: ori r3, r3, 34463
; CHECK-P10-NEXT: xscvsxdsp f0, f0
; CHECK-P10-NEXT: oris r3, r3, 1
; CHECK-P10-NEXT: stfs f0, 0(r3)
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: st_not_disjoint32_int64_t_float:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprd f0, r4
; CHECK-P9-NEXT: ori r3, r3, 34463
; CHECK-P9-NEXT: xscvsxdsp f0, f0
; CHECK-P9-NEXT: oris r3, r3, 1
; CHECK-P9-NEXT: stfs f0, 0(r3)
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: st_not_disjoint32_int64_t_float:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprd f0, r4
; CHECK-P8-NEXT: ori r3, r3, 34463
; CHECK-P8-NEXT: oris r3, r3, 1
; CHECK-P8-NEXT: xscvsxdsp f0, f0
; CHECK-P8-NEXT: stfsx f0, 0, r3
; CHECK-P8-NEXT: blr
entry:
%conv = sitofp i64 %str to float
%or = or i64 %ptr, 99999
%0 = inttoptr i64 %or to float*
store float %conv, float* %0, align 4
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_disjoint_align32_int64_t_float(i64 %ptr, i64 %str) {
; CHECK-P10-LABEL: st_disjoint_align32_int64_t_float:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprd f0, r4
; CHECK-P10-NEXT: lis r5, -15264
; CHECK-P10-NEXT: pli r4, 999990000
; CHECK-P10-NEXT: xscvsxdsp f0, f0
; CHECK-P10-NEXT: and r3, r3, r5
; CHECK-P10-NEXT: stfsx f0, r3, r4
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: st_disjoint_align32_int64_t_float:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprd f0, r4
; CHECK-P9-NEXT: lis r5, -15264
; CHECK-P9-NEXT: lis r4, 15258
; CHECK-P9-NEXT: xscvsxdsp f0, f0
; CHECK-P9-NEXT: and r3, r3, r5
; CHECK-P9-NEXT: ori r4, r4, 41712
; CHECK-P9-NEXT: stfsx f0, r3, r4
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: st_disjoint_align32_int64_t_float:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprd f0, r4
; 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: xscvsxdsp f0, f0
; CHECK-P8-NEXT: stfsx f0, r3, r4
; CHECK-P8-NEXT: blr
entry:
%and = and i64 %ptr, -1000341504
%conv = sitofp i64 %str to float
%or = or i64 %and, 999990000
%0 = inttoptr i64 %or to float*
store float %conv, float* %0, align 16
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_not_disjoint64_int64_t_float(i64 %ptr, i64 %str) {
; CHECK-P10-LABEL: st_not_disjoint64_int64_t_float:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprd f0, r4
; CHECK-P10-NEXT: pli r4, 232
; CHECK-P10-NEXT: pli r5, 3567587329
; CHECK-P10-NEXT: rldimi r5, r4, 32, 0
; CHECK-P10-NEXT: xscvsxdsp f0, f0
; CHECK-P10-NEXT: or r3, r3, r5
; CHECK-P10-NEXT: stfs f0, 0(r3)
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: st_not_disjoint64_int64_t_float:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprd f0, r4
; CHECK-P9-NEXT: li r4, 29
; CHECK-P9-NEXT: rldic r4, r4, 35, 24
; CHECK-P9-NEXT: xscvsxdsp f0, f0
; 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 f0, 0(r3)
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: st_not_disjoint64_int64_t_float:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprd f0, r4
; CHECK-P8-NEXT: li r4, 29
; CHECK-P8-NEXT: rldic r4, r4, 35, 24
; CHECK-P8-NEXT: xscvsxdsp f0, f0
; 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 f0, 0, r3
; CHECK-P8-NEXT: blr
entry:
%conv = sitofp i64 %str to float
%or = or i64 %ptr, 1000000000001
%0 = inttoptr i64 %or to float*
store float %conv, float* %0, align 4
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_disjoint_align64_int64_t_float(i64 %ptr, i64 %str) {
; CHECK-P10-LABEL: st_disjoint_align64_int64_t_float:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprd f0, r4
; 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: xscvsxdsp f0, f0
; CHECK-P10-NEXT: stfsx f0, r3, r4
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: st_disjoint_align64_int64_t_float:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprd f0, r4
; CHECK-P9-NEXT: lis r4, 3725
; CHECK-P9-NEXT: rldicr r3, r3, 0, 23
; CHECK-P9-NEXT: xscvsxdsp f0, f0
; CHECK-P9-NEXT: ori r4, r4, 19025
; CHECK-P9-NEXT: rldic r4, r4, 12, 24
; CHECK-P9-NEXT: stfsx f0, r3, r4
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: st_disjoint_align64_int64_t_float:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprd f0, r4
; CHECK-P8-NEXT: lis r5, 3725
; CHECK-P8-NEXT: rldicr r3, r3, 0, 23
; CHECK-P8-NEXT: ori r4, r5, 19025
; CHECK-P8-NEXT: xscvsxdsp f0, f0
; CHECK-P8-NEXT: rldic r4, r4, 12, 24
; CHECK-P8-NEXT: stfsx f0, r3, r4
; CHECK-P8-NEXT: blr
entry:
%and = and i64 %ptr, -1099511627776
%conv = sitofp i64 %str to float
%or = or i64 %and, 1000000000000
%0 = inttoptr i64 %or to float*
store float %conv, float* %0, align 4096
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_cst_align16_int64_t_float(i64 %str) {
; CHECK-LABEL: st_cst_align16_int64_t_float:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: mtfprd f0, r3
; CHECK-NEXT: xscvsxdsp f0, f0
; CHECK-NEXT: stfs f0, 4080(0)
; CHECK-NEXT: blr
entry:
%conv = sitofp i64 %str to float
store float %conv, 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_int64_t_float(i64 %str) {
; CHECK-P10-LABEL: st_cst_align32_int64_t_float:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprd f0, r3
; CHECK-P10-NEXT: lis r3, 153
; CHECK-P10-NEXT: xscvsxdsp f0, f0
; CHECK-P10-NEXT: stfs f0, -27108(r3)
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: st_cst_align32_int64_t_float:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprd f0, r3
; CHECK-P9-NEXT: lis r3, 153
; CHECK-P9-NEXT: xscvsxdsp f0, f0
; CHECK-P9-NEXT: stfs f0, -27108(r3)
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: st_cst_align32_int64_t_float:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprd f0, r3
; CHECK-P8-NEXT: lis r3, 152
; CHECK-P8-NEXT: ori r3, r3, 38428
; CHECK-P8-NEXT: xscvsxdsp f0, f0
; CHECK-P8-NEXT: stfsx f0, 0, r3
; CHECK-P8-NEXT: blr
entry:
%conv = sitofp i64 %str to float
store float %conv, 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_int64_t_float(i64 %str) {
; CHECK-P10-LABEL: st_cst_align64_int64_t_float:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprd f0, r3
; CHECK-P10-NEXT: pli r3, 244140625
; CHECK-P10-NEXT: rldic r3, r3, 12, 24
; CHECK-P10-NEXT: xscvsxdsp f0, f0
; CHECK-P10-NEXT: stfs f0, 0(r3)
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: st_cst_align64_int64_t_float:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprd f0, r3
; CHECK-P9-NEXT: lis r3, 3725
; CHECK-P9-NEXT: xscvsxdsp f0, f0
; CHECK-P9-NEXT: ori r3, r3, 19025
; CHECK-P9-NEXT: rldic r3, r3, 12, 24
; CHECK-P9-NEXT: stfs f0, 0(r3)
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: st_cst_align64_int64_t_float:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprd f0, r3
; CHECK-P8-NEXT: lis r3, 3725
; CHECK-P8-NEXT: ori r3, r3, 19025
; CHECK-P8-NEXT: xscvsxdsp f0, f0
; CHECK-P8-NEXT: rldic r3, r3, 12, 24
; CHECK-P8-NEXT: stfsx f0, 0, r3
; CHECK-P8-NEXT: blr
entry:
%conv = sitofp i64 %str to float
store float %conv, float* inttoptr (i64 1000000000000 to float*), align 4096
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_0_int64_t_double(i64 %ptr, i64 %str) {
; CHECK-P10-LABEL: st_0_int64_t_double:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprd f0, r4
; CHECK-P10-NEXT: xscvsxddp f0, f0
; CHECK-P10-NEXT: stfd f0, 0(r3)
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: st_0_int64_t_double:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprd f0, r4
; CHECK-P9-NEXT: xscvsxddp f0, f0
; CHECK-P9-NEXT: stfd f0, 0(r3)
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: st_0_int64_t_double:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprd f0, r4
; CHECK-P8-NEXT: xscvsxddp f0, f0
; CHECK-P8-NEXT: stfdx f0, 0, r3
; CHECK-P8-NEXT: blr
entry:
%conv = sitofp i64 %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_int64_t_double(i8* nocapture %ptr, i64 %str) {
; CHECK-LABEL: st_align16_int64_t_double:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: mtfprd f0, r4
; CHECK-NEXT: xscvsxddp f0, f0
; CHECK-NEXT: stfd f0, 8(r3)
; CHECK-NEXT: blr
entry:
%conv = sitofp i64 %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_int64_t_double(i8* nocapture %ptr, i64 %str) {
; CHECK-P10-LABEL: st_align32_int64_t_double:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprd f0, r4
; CHECK-P10-NEXT: pli r4, 99999000
; CHECK-P10-NEXT: xscvsxddp f0, f0
; CHECK-P10-NEXT: stfdx f0, r3, r4
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: st_align32_int64_t_double:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprd f0, r4
; CHECK-P9-NEXT: lis r4, 1525
; CHECK-P9-NEXT: xscvsxddp f0, f0
; CHECK-P9-NEXT: ori r4, r4, 56600
; CHECK-P9-NEXT: stfdx f0, r3, r4
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: st_align32_int64_t_double:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprd f0, r4
; CHECK-P8-NEXT: lis r4, 1525
; CHECK-P8-NEXT: ori r4, r4, 56600
; CHECK-P8-NEXT: xscvsxddp f0, f0
; CHECK-P8-NEXT: stfdx f0, r3, r4
; CHECK-P8-NEXT: blr
entry:
%conv = sitofp i64 %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_int64_t_double(i8* nocapture %ptr, i64 %str) {
; CHECK-P10-LABEL: st_align64_int64_t_double:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprd f0, r4
; CHECK-P10-NEXT: pli r4, 244140625
; CHECK-P10-NEXT: rldic r4, r4, 12, 24
; CHECK-P10-NEXT: xscvsxddp f0, f0
; CHECK-P10-NEXT: stfdx f0, r3, r4
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: st_align64_int64_t_double:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprd f0, r4
; CHECK-P9-NEXT: lis r4, 3725
; CHECK-P9-NEXT: xscvsxddp f0, f0
; CHECK-P9-NEXT: ori r4, r4, 19025
; CHECK-P9-NEXT: rldic r4, r4, 12, 24
; CHECK-P9-NEXT: stfdx f0, r3, r4
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: st_align64_int64_t_double:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprd f0, r4
; CHECK-P8-NEXT: lis r4, 3725
; CHECK-P8-NEXT: ori r4, r4, 19025
; CHECK-P8-NEXT: xscvsxddp f0, f0
; CHECK-P8-NEXT: rldic r4, r4, 12, 24
; CHECK-P8-NEXT: stfdx f0, r3, r4
; CHECK-P8-NEXT: blr
entry:
%conv = sitofp i64 %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_int64_t_double(i8* nocapture %ptr, i64 %off, i64 %str) {
; CHECK-LABEL: st_reg_int64_t_double:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: mtfprd f0, r5
; CHECK-NEXT: xscvsxddp f0, f0
; CHECK-NEXT: stfdx f0, r3, r4
; CHECK-NEXT: blr
entry:
%conv = sitofp i64 %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_int64_t_double(i64 %ptr, i8 zeroext %off, i64 %str) {
; CHECK-P10-LABEL: st_or1_int64_t_double:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprd f0, r5
; CHECK-P10-NEXT: or r3, r4, r3
; CHECK-P10-NEXT: xscvsxddp f0, f0
; CHECK-P10-NEXT: stfd f0, 0(r3)
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: st_or1_int64_t_double:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprd f0, r5
; CHECK-P9-NEXT: or r3, r4, r3
; CHECK-P9-NEXT: xscvsxddp f0, f0
; CHECK-P9-NEXT: stfd f0, 0(r3)
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: st_or1_int64_t_double:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprd f0, r5
; CHECK-P8-NEXT: or r3, r4, r3
; CHECK-P8-NEXT: xscvsxddp f0, f0
; CHECK-P8-NEXT: stfdx f0, 0, r3
; CHECK-P8-NEXT: blr
entry:
%conv = sitofp i64 %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_or2_int64_t_double(i64 %ptr, i8 zeroext %off, i64 %str) {
; CHECK-LABEL: st_or2_int64_t_double:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: mtfprd f0, r5
; CHECK-NEXT: rldicr r3, r3, 0, 51
; CHECK-NEXT: xscvsxddp f0, f0
; CHECK-NEXT: stfdx f0, r3, r4
; CHECK-NEXT: blr
entry:
%and = and i64 %ptr, -4096
%conv = sitofp i64 %str to double
%conv1 = zext i8 %off to i64
%or = or i64 %and, %conv1
%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_int64_t_double(i64 %ptr, i64 %str) {
; CHECK-P10-LABEL: st_not_disjoint16_int64_t_double:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprd f0, r4
; CHECK-P10-NEXT: ori r3, r3, 6
; CHECK-P10-NEXT: xscvsxddp f0, f0
; CHECK-P10-NEXT: stfd f0, 0(r3)
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: st_not_disjoint16_int64_t_double:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprd f0, r4
; CHECK-P9-NEXT: ori r3, r3, 6
; CHECK-P9-NEXT: xscvsxddp f0, f0
; CHECK-P9-NEXT: stfd f0, 0(r3)
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: st_not_disjoint16_int64_t_double:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprd f0, r4
; CHECK-P8-NEXT: ori r3, r3, 6
; CHECK-P8-NEXT: xscvsxddp f0, f0
; CHECK-P8-NEXT: stfdx f0, 0, r3
; CHECK-P8-NEXT: blr
entry:
%conv = sitofp i64 %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_int64_t_double(i64 %ptr, i64 %str) {
; CHECK-P10-LABEL: st_disjoint_align16_int64_t_double:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprd f0, r4
; CHECK-P10-NEXT: rldicr r3, r3, 0, 51
; CHECK-P10-NEXT: xscvsxddp f0, f0
; CHECK-P10-NEXT: stfd f0, 24(r3)
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: st_disjoint_align16_int64_t_double:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprd f0, r4
; CHECK-P9-NEXT: rldicr r3, r3, 0, 51
; CHECK-P9-NEXT: xscvsxddp f0, f0
; CHECK-P9-NEXT: stfd f0, 24(r3)
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: st_disjoint_align16_int64_t_double:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprd f0, r4
; CHECK-P8-NEXT: rldicr r3, r3, 0, 51
; CHECK-P8-NEXT: ori r3, r3, 24
; CHECK-P8-NEXT: xscvsxddp f0, f0
; CHECK-P8-NEXT: stfdx f0, 0, r3
; CHECK-P8-NEXT: blr
entry:
%and = and i64 %ptr, -4096
%conv = sitofp i64 %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_int64_t_double(i64 %ptr, i64 %str) {
; CHECK-P10-LABEL: st_not_disjoint32_int64_t_double:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprd f0, r4
; CHECK-P10-NEXT: ori r3, r3, 34463
; CHECK-P10-NEXT: xscvsxddp f0, f0
; CHECK-P10-NEXT: oris r3, r3, 1
; CHECK-P10-NEXT: stfd f0, 0(r3)
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: st_not_disjoint32_int64_t_double:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprd f0, r4
; CHECK-P9-NEXT: ori r3, r3, 34463
; CHECK-P9-NEXT: xscvsxddp f0, f0
; CHECK-P9-NEXT: oris r3, r3, 1
; CHECK-P9-NEXT: stfd f0, 0(r3)
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: st_not_disjoint32_int64_t_double:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprd f0, r4
; CHECK-P8-NEXT: ori r3, r3, 34463
; CHECK-P8-NEXT: oris r3, r3, 1
; CHECK-P8-NEXT: xscvsxddp f0, f0
; CHECK-P8-NEXT: stfdx f0, 0, r3
; CHECK-P8-NEXT: blr
entry:
%conv = sitofp i64 %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_int64_t_double(i64 %ptr, i64 %str) {
; CHECK-P10-LABEL: st_disjoint_align32_int64_t_double:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprd f0, r4
; CHECK-P10-NEXT: lis r5, -15264
; CHECK-P10-NEXT: pli r4, 999990000
; CHECK-P10-NEXT: xscvsxddp f0, f0
; CHECK-P10-NEXT: and r3, r3, r5
; CHECK-P10-NEXT: stfdx f0, r3, r4
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: st_disjoint_align32_int64_t_double:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprd f0, r4
; CHECK-P9-NEXT: lis r5, -15264
; CHECK-P9-NEXT: lis r4, 15258
; CHECK-P9-NEXT: xscvsxddp f0, f0
; CHECK-P9-NEXT: and r3, r3, r5
; CHECK-P9-NEXT: ori r4, r4, 41712
; CHECK-P9-NEXT: stfdx f0, r3, r4
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: st_disjoint_align32_int64_t_double:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprd f0, r4
; 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: xscvsxddp f0, f0
; CHECK-P8-NEXT: stfdx f0, r3, r4
; CHECK-P8-NEXT: blr
entry:
%and = and i64 %ptr, -1000341504
%conv = sitofp i64 %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_int64_t_double(i64 %ptr, i64 %str) {
; CHECK-P10-LABEL: st_not_disjoint64_int64_t_double:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprd f0, r4
; CHECK-P10-NEXT: pli r4, 232
; CHECK-P10-NEXT: pli r5, 3567587329
; CHECK-P10-NEXT: rldimi r5, r4, 32, 0
; CHECK-P10-NEXT: xscvsxddp f0, f0
; CHECK-P10-NEXT: or r3, r3, r5
; CHECK-P10-NEXT: stfd f0, 0(r3)
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: st_not_disjoint64_int64_t_double:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprd f0, r4
; CHECK-P9-NEXT: li r4, 29
; CHECK-P9-NEXT: rldic r4, r4, 35, 24
; CHECK-P9-NEXT: xscvsxddp f0, f0
; 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 f0, 0(r3)
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: st_not_disjoint64_int64_t_double:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprd f0, r4
; CHECK-P8-NEXT: li r4, 29
; CHECK-P8-NEXT: rldic r4, r4, 35, 24
; CHECK-P8-NEXT: xscvsxddp f0, f0
; 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 f0, 0, r3
; CHECK-P8-NEXT: blr
entry:
%conv = sitofp i64 %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_int64_t_double(i64 %ptr, i64 %str) {
; CHECK-P10-LABEL: st_disjoint_align64_int64_t_double:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprd f0, r4
; 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: xscvsxddp f0, f0
; CHECK-P10-NEXT: stfdx f0, r3, r4
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: st_disjoint_align64_int64_t_double:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprd f0, r4
; CHECK-P9-NEXT: lis r4, 3725
; CHECK-P9-NEXT: rldicr r3, r3, 0, 23
; CHECK-P9-NEXT: xscvsxddp f0, f0
; CHECK-P9-NEXT: ori r4, r4, 19025
; CHECK-P9-NEXT: rldic r4, r4, 12, 24
; CHECK-P9-NEXT: stfdx f0, r3, r4
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: st_disjoint_align64_int64_t_double:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprd f0, r4
; CHECK-P8-NEXT: lis r5, 3725
; CHECK-P8-NEXT: rldicr r3, r3, 0, 23
; CHECK-P8-NEXT: ori r4, r5, 19025
; CHECK-P8-NEXT: xscvsxddp f0, f0
; CHECK-P8-NEXT: rldic r4, r4, 12, 24
; CHECK-P8-NEXT: stfdx f0, r3, r4
; CHECK-P8-NEXT: blr
entry:
%and = and i64 %ptr, -1099511627776
%conv = sitofp i64 %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_int64_t_double(i64 %str) {
; CHECK-LABEL: st_cst_align16_int64_t_double:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: mtfprd f0, r3
; CHECK-NEXT: xscvsxddp f0, f0
; CHECK-NEXT: stfd f0, 4080(0)
; CHECK-NEXT: blr
entry:
%conv = sitofp i64 %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_int64_t_double(i64 %str) {
; CHECK-P10-LABEL: st_cst_align32_int64_t_double:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprd f0, r3
; CHECK-P10-NEXT: lis r3, 153
; CHECK-P10-NEXT: xscvsxddp f0, f0
; CHECK-P10-NEXT: stfd f0, -27108(r3)
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: st_cst_align32_int64_t_double:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprd f0, r3
; CHECK-P9-NEXT: lis r3, 153
; CHECK-P9-NEXT: xscvsxddp f0, f0
; CHECK-P9-NEXT: stfd f0, -27108(r3)
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: st_cst_align32_int64_t_double:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprd f0, r3
; CHECK-P8-NEXT: lis r3, 152
; CHECK-P8-NEXT: ori r3, r3, 38428
; CHECK-P8-NEXT: xscvsxddp f0, f0
; CHECK-P8-NEXT: stfdx f0, 0, r3
; CHECK-P8-NEXT: blr
entry:
%conv = sitofp i64 %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_int64_t_double(i64 %str) {
; CHECK-P10-LABEL: st_cst_align64_int64_t_double:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprd f0, r3
; CHECK-P10-NEXT: pli r3, 244140625
; CHECK-P10-NEXT: rldic r3, r3, 12, 24
; CHECK-P10-NEXT: xscvsxddp f0, f0
; CHECK-P10-NEXT: stfd f0, 0(r3)
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: st_cst_align64_int64_t_double:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprd f0, r3
; CHECK-P9-NEXT: lis r3, 3725
; CHECK-P9-NEXT: xscvsxddp f0, f0
; CHECK-P9-NEXT: ori r3, r3, 19025
; CHECK-P9-NEXT: rldic r3, r3, 12, 24
; CHECK-P9-NEXT: stfd f0, 0(r3)
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: st_cst_align64_int64_t_double:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprd f0, r3
; CHECK-P8-NEXT: lis r3, 3725
; CHECK-P8-NEXT: ori r3, r3, 19025
; CHECK-P8-NEXT: xscvsxddp f0, f0
; CHECK-P8-NEXT: rldic r3, r3, 12, 24
; CHECK-P8-NEXT: stfdx f0, 0, r3
; CHECK-P8-NEXT: blr
entry:
%conv = sitofp i64 %str to double
store double %conv, double* inttoptr (i64 1000000000000 to double*), align 4096
ret void
}