1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-22 10:42:39 +01:00
llvm-mirror/test/CodeGen/PowerPC/scalar-i8-ldst.ll
Amy Kwan 9f4ca39c11 [PowerPC] Update Refactored Load/Store Implementation, XForm VSX Patterns, and Tests
This patch includes the following updates to the load/store refactoring effort introduced in D93370:
 - Update various VSX patterns that use to "force" an XForm, to instead just XForm.
   This allows the ability for the patterns to compute the most optimal addressing
   mode (and to produce a DForm instruction when possible)
- Update pattern and test case for the LXVD2X/STXVD2X intrinsics
- Update LIT test cases that use to use the XForm instruction to use the DForm instruction

Differential Revision: https://reviews.llvm.org/D95115
2021-07-16 09:28:48 -05:00

9776 lines
326 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu \
; RUN: -mcpu=pwr10 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \
; RUN: < %s | FileCheck %s --check-prefixes=CHECK,CHECK-P10,CHECK-LE,CHECK-P10-LE
; 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,CHECK-BE,CHECK-P10-BE
; 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,CHECK-LE,CHECK-P9-LE
; 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,CHECK-BE,CHECK-P9-BE
; 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,CHECK-LE,CHECK-P8-LE
; 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,CHECK-BE,CHECK-P8-BE
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_0_int8_t_uint8_t(i64 %ptr) {
; CHECK-LABEL: ld_0_int8_t_uint8_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
ret i8 %1
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_align16_int8_t_uint8_t(i8* nocapture readonly %ptr) {
; CHECK-LABEL: ld_align16_int8_t_uint8_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
ret i8 %0
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_align32_int8_t_uint8_t(i8* nocapture readonly %ptr) {
; CHECK-P10-LABEL: ld_align32_int8_t_uint8_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_int8_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: 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
ret i8 %0
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_align64_int8_t_uint8_t(i8* nocapture readonly %ptr) {
; CHECK-P10-LABEL: ld_align64_int8_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: extsb r3, r3
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_align64_int8_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: 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
ret i8 %0
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_reg_int8_t_uint8_t(i8* nocapture readonly %ptr, i64 %off) {
; CHECK-LABEL: ld_reg_int8_t_uint8_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
ret i8 %0
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_or_int8_t_uint8_t(i64 %ptr, i8 zeroext %off) {
; CHECK-LABEL: ld_or_int8_t_uint8_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
ret i8 %1
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_not_disjoint16_int8_t_uint8_t(i64 %ptr) {
; CHECK-LABEL: ld_not_disjoint16_int8_t_uint8_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
ret i8 %1
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_disjoint_align16_int8_t_uint8_t(i64 %ptr) {
; CHECK-LABEL: ld_disjoint_align16_int8_t_uint8_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
ret i8 %1
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_not_disjoint32_int8_t_uint8_t(i64 %ptr) {
; CHECK-LABEL: ld_not_disjoint32_int8_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: 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
ret i8 %1
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_disjoint_align32_int8_t_uint8_t(i64 %ptr) {
; CHECK-P10-LABEL: ld_disjoint_align32_int8_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: extsb r3, r3
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: ld_disjoint_align32_int8_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: extsb r3, r3
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: ld_disjoint_align32_int8_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: 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
ret i8 %1
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_not_disjoint64_int8_t_uint8_t(i64 %ptr) {
; CHECK-P10-LABEL: ld_not_disjoint64_int8_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: extsb r3, r3
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_not_disjoint64_int8_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: 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
ret i8 %1
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_disjoint_align64_int8_t_uint8_t(i64 %ptr) {
; CHECK-P10-LABEL: ld_disjoint_align64_int8_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: extsb r3, r3
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_disjoint_align64_int8_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: 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
ret i8 %1
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_cst_align16_int8_t_uint8_t() {
; CHECK-LABEL: ld_cst_align16_int8_t_uint8_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
ret i8 %0
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_cst_align32_int8_t_uint8_t() {
; CHECK-LABEL: ld_cst_align32_int8_t_uint8_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
ret i8 %0
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_cst_align64_int8_t_uint8_t() {
; CHECK-P10-LABEL: ld_cst_align64_int8_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: extsb r3, r3
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_cst_align64_int8_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: extsb r3, r3
; CHECK-PREP10-NEXT: blr
entry:
%0 = load i8, i8* inttoptr (i64 1000000000000 to i8*), align 4096
ret i8 %0
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_0_int8_t_uint16_t(i64 %ptr) {
; CHECK-LE-LABEL: ld_0_int8_t_uint16_t:
; CHECK-LE: # %bb.0: # %entry
; CHECK-LE-NEXT: lbz r3, 0(r3)
; CHECK-LE-NEXT: extsb r3, r3
; CHECK-LE-NEXT: blr
;
; CHECK-BE-LABEL: ld_0_int8_t_uint16_t:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: lbz r3, 1(r3)
; CHECK-BE-NEXT: extsb r3, r3
; CHECK-BE-NEXT: blr
entry:
%0 = inttoptr i64 %ptr to i16*
%1 = load i16, i16* %0, align 2
%conv = trunc i16 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_align16_int8_t_uint16_t(i8* nocapture readonly %ptr) {
; CHECK-LE-LABEL: ld_align16_int8_t_uint16_t:
; CHECK-LE: # %bb.0: # %entry
; CHECK-LE-NEXT: lbz r3, 8(r3)
; CHECK-LE-NEXT: extsb r3, r3
; CHECK-LE-NEXT: blr
;
; CHECK-BE-LABEL: ld_align16_int8_t_uint16_t:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: lbz r3, 9(r3)
; CHECK-BE-NEXT: extsb r3, r3
; CHECK-BE-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 = trunc i16 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_align32_int8_t_uint16_t(i8* nocapture readonly %ptr) {
; CHECK-P10-LE-LABEL: ld_align32_int8_t_uint16_t:
; CHECK-P10-LE: # %bb.0: # %entry
; CHECK-P10-LE-NEXT: pli r4, 99999000
; CHECK-P10-LE-NEXT: lbzx r3, r3, r4
; CHECK-P10-LE-NEXT: extsb r3, r3
; CHECK-P10-LE-NEXT: blr
;
; CHECK-P10-BE-LABEL: ld_align32_int8_t_uint16_t:
; CHECK-P10-BE: # %bb.0: # %entry
; CHECK-P10-BE-NEXT: pli r4, 99999001
; CHECK-P10-BE-NEXT: lbzx r3, r3, r4
; CHECK-P10-BE-NEXT: extsb r3, r3
; CHECK-P10-BE-NEXT: blr
;
; CHECK-P9-LE-LABEL: ld_align32_int8_t_uint16_t:
; CHECK-P9-LE: # %bb.0: # %entry
; CHECK-P9-LE-NEXT: lis r4, 1525
; CHECK-P9-LE-NEXT: ori r4, r4, 56600
; CHECK-P9-LE-NEXT: lbzx r3, r3, r4
; CHECK-P9-LE-NEXT: extsb r3, r3
; CHECK-P9-LE-NEXT: blr
;
; CHECK-P9-BE-LABEL: ld_align32_int8_t_uint16_t:
; CHECK-P9-BE: # %bb.0: # %entry
; CHECK-P9-BE-NEXT: lis r4, 1525
; CHECK-P9-BE-NEXT: ori r4, r4, 56601
; CHECK-P9-BE-NEXT: lbzx r3, r3, r4
; CHECK-P9-BE-NEXT: extsb r3, r3
; CHECK-P9-BE-NEXT: blr
;
; CHECK-P8-LE-LABEL: ld_align32_int8_t_uint16_t:
; CHECK-P8-LE: # %bb.0: # %entry
; CHECK-P8-LE-NEXT: lis r4, 1525
; CHECK-P8-LE-NEXT: ori r4, r4, 56600
; CHECK-P8-LE-NEXT: lbzx r3, r3, r4
; CHECK-P8-LE-NEXT: extsb r3, r3
; CHECK-P8-LE-NEXT: blr
;
; CHECK-P8-BE-LABEL: ld_align32_int8_t_uint16_t:
; CHECK-P8-BE: # %bb.0: # %entry
; CHECK-P8-BE-NEXT: lis r4, 1525
; CHECK-P8-BE-NEXT: ori r4, r4, 56601
; CHECK-P8-BE-NEXT: lbzx r3, r3, r4
; CHECK-P8-BE-NEXT: extsb r3, r3
; CHECK-P8-BE-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 = trunc i16 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_align64_int8_t_uint16_t(i8* nocapture readonly %ptr) {
; CHECK-P10-LE-LABEL: ld_align64_int8_t_uint16_t:
; CHECK-P10-LE: # %bb.0: # %entry
; CHECK-P10-LE-NEXT: pli r4, 244140625
; CHECK-P10-LE-NEXT: rldic r4, r4, 12, 24
; CHECK-P10-LE-NEXT: lbzx r3, r3, r4
; CHECK-P10-LE-NEXT: extsb r3, r3
; CHECK-P10-LE-NEXT: blr
;
; CHECK-P10-BE-LABEL: ld_align64_int8_t_uint16_t:
; CHECK-P10-BE: # %bb.0: # %entry
; CHECK-P10-BE-NEXT: pli r4, 232
; CHECK-P10-BE-NEXT: pli r5, 3567587329
; CHECK-P10-BE-NEXT: rldimi r5, r4, 32, 0
; CHECK-P10-BE-NEXT: lbzx r3, r3, r5
; CHECK-P10-BE-NEXT: extsb r3, r3
; CHECK-P10-BE-NEXT: blr
;
; CHECK-P9-LE-LABEL: ld_align64_int8_t_uint16_t:
; CHECK-P9-LE: # %bb.0: # %entry
; CHECK-P9-LE-NEXT: lis r4, 3725
; CHECK-P9-LE-NEXT: ori r4, r4, 19025
; CHECK-P9-LE-NEXT: rldic r4, r4, 12, 24
; CHECK-P9-LE-NEXT: lbzx r3, r3, r4
; CHECK-P9-LE-NEXT: extsb r3, r3
; CHECK-P9-LE-NEXT: blr
;
; CHECK-P9-BE-LABEL: ld_align64_int8_t_uint16_t:
; CHECK-P9-BE: # %bb.0: # %entry
; CHECK-P9-BE-NEXT: li r4, 29
; CHECK-P9-BE-NEXT: rldic r4, r4, 35, 24
; CHECK-P9-BE-NEXT: oris r4, r4, 54437
; CHECK-P9-BE-NEXT: ori r4, r4, 4097
; CHECK-P9-BE-NEXT: lbzx r3, r3, r4
; CHECK-P9-BE-NEXT: extsb r3, r3
; CHECK-P9-BE-NEXT: blr
;
; CHECK-P8-LE-LABEL: ld_align64_int8_t_uint16_t:
; CHECK-P8-LE: # %bb.0: # %entry
; CHECK-P8-LE-NEXT: lis r4, 3725
; CHECK-P8-LE-NEXT: ori r4, r4, 19025
; CHECK-P8-LE-NEXT: rldic r4, r4, 12, 24
; CHECK-P8-LE-NEXT: lbzx r3, r3, r4
; CHECK-P8-LE-NEXT: extsb r3, r3
; CHECK-P8-LE-NEXT: blr
;
; CHECK-P8-BE-LABEL: ld_align64_int8_t_uint16_t:
; CHECK-P8-BE: # %bb.0: # %entry
; CHECK-P8-BE-NEXT: li r4, 29
; CHECK-P8-BE-NEXT: rldic r4, r4, 35, 24
; CHECK-P8-BE-NEXT: oris r4, r4, 54437
; CHECK-P8-BE-NEXT: ori r4, r4, 4097
; CHECK-P8-BE-NEXT: lbzx r3, r3, r4
; CHECK-P8-BE-NEXT: extsb r3, r3
; CHECK-P8-BE-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 = trunc i16 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_reg_int8_t_uint16_t(i8* nocapture readonly %ptr, i64 %off) {
; CHECK-LE-LABEL: ld_reg_int8_t_uint16_t:
; CHECK-LE: # %bb.0: # %entry
; CHECK-LE-NEXT: lbzx r3, r3, r4
; CHECK-LE-NEXT: extsb r3, r3
; CHECK-LE-NEXT: blr
;
; CHECK-BE-LABEL: ld_reg_int8_t_uint16_t:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: add r3, r3, r4
; CHECK-BE-NEXT: lbz r3, 1(r3)
; CHECK-BE-NEXT: extsb r3, r3
; CHECK-BE-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 = trunc i16 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_or_int8_t_uint16_t(i64 %ptr, i8 zeroext %off) {
; CHECK-LE-LABEL: ld_or_int8_t_uint16_t:
; CHECK-LE: # %bb.0: # %entry
; CHECK-LE-NEXT: or r3, r4, r3
; CHECK-LE-NEXT: lbz r3, 0(r3)
; CHECK-LE-NEXT: extsb r3, r3
; CHECK-LE-NEXT: blr
;
; CHECK-BE-LABEL: ld_or_int8_t_uint16_t:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: or r3, r4, r3
; CHECK-BE-NEXT: lbz r3, 1(r3)
; CHECK-BE-NEXT: extsb r3, r3
; CHECK-BE-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 = trunc i16 %1 to i8
ret i8 %conv1
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_not_disjoint16_int8_t_uint16_t(i64 %ptr) {
; CHECK-LE-LABEL: ld_not_disjoint16_int8_t_uint16_t:
; CHECK-LE: # %bb.0: # %entry
; CHECK-LE-NEXT: ori r3, r3, 6
; CHECK-LE-NEXT: lbz r3, 0(r3)
; CHECK-LE-NEXT: extsb r3, r3
; CHECK-LE-NEXT: blr
;
; CHECK-BE-LABEL: ld_not_disjoint16_int8_t_uint16_t:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: ori r3, r3, 6
; CHECK-BE-NEXT: lbz r3, 1(r3)
; CHECK-BE-NEXT: extsb r3, r3
; CHECK-BE-NEXT: blr
entry:
%or = or i64 %ptr, 6
%0 = inttoptr i64 %or to i16*
%1 = load i16, i16* %0, align 2
%conv = trunc i16 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_disjoint_align16_int8_t_uint16_t(i64 %ptr) {
; CHECK-LE-LABEL: ld_disjoint_align16_int8_t_uint16_t:
; CHECK-LE: # %bb.0: # %entry
; CHECK-LE-NEXT: rldicr r3, r3, 0, 51
; CHECK-LE-NEXT: lbz r3, 24(r3)
; CHECK-LE-NEXT: extsb r3, r3
; CHECK-LE-NEXT: blr
;
; CHECK-BE-LABEL: ld_disjoint_align16_int8_t_uint16_t:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: rldicr r3, r3, 0, 51
; CHECK-BE-NEXT: lbz r3, 25(r3)
; CHECK-BE-NEXT: extsb r3, r3
; CHECK-BE-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 = trunc i16 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_not_disjoint32_int8_t_uint16_t(i64 %ptr) {
; CHECK-LE-LABEL: ld_not_disjoint32_int8_t_uint16_t:
; CHECK-LE: # %bb.0: # %entry
; CHECK-LE-NEXT: ori r3, r3, 34463
; CHECK-LE-NEXT: oris r3, r3, 1
; CHECK-LE-NEXT: lbz r3, 0(r3)
; CHECK-LE-NEXT: extsb r3, r3
; CHECK-LE-NEXT: blr
;
; CHECK-BE-LABEL: ld_not_disjoint32_int8_t_uint16_t:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: ori r3, r3, 34463
; CHECK-BE-NEXT: oris r3, r3, 1
; CHECK-BE-NEXT: lbz r3, 1(r3)
; CHECK-BE-NEXT: extsb r3, r3
; CHECK-BE-NEXT: blr
entry:
%or = or i64 %ptr, 99999
%0 = inttoptr i64 %or to i16*
%1 = load i16, i16* %0, align 2
%conv = trunc i16 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_disjoint_align32_int8_t_uint16_t(i64 %ptr) {
; CHECK-P10-LE-LABEL: ld_disjoint_align32_int8_t_uint16_t:
; CHECK-P10-LE: # %bb.0: # %entry
; CHECK-P10-LE-NEXT: lis r4, -15264
; CHECK-P10-LE-NEXT: and r3, r3, r4
; CHECK-P10-LE-NEXT: pli r4, 999990000
; CHECK-P10-LE-NEXT: lbzx r3, r3, r4
; CHECK-P10-LE-NEXT: extsb r3, r3
; CHECK-P10-LE-NEXT: blr
;
; CHECK-P10-BE-LABEL: ld_disjoint_align32_int8_t_uint16_t:
; CHECK-P10-BE: # %bb.0: # %entry
; CHECK-P10-BE-NEXT: lis r4, -15264
; CHECK-P10-BE-NEXT: and r3, r3, r4
; CHECK-P10-BE-NEXT: pli r4, 999990001
; CHECK-P10-BE-NEXT: lbzx r3, r3, r4
; CHECK-P10-BE-NEXT: extsb r3, r3
; CHECK-P10-BE-NEXT: blr
;
; CHECK-P9-LE-LABEL: ld_disjoint_align32_int8_t_uint16_t:
; CHECK-P9-LE: # %bb.0: # %entry
; CHECK-P9-LE-NEXT: lis r4, -15264
; CHECK-P9-LE-NEXT: and r3, r3, r4
; CHECK-P9-LE-NEXT: lis r4, 15258
; CHECK-P9-LE-NEXT: ori r4, r4, 41712
; CHECK-P9-LE-NEXT: lbzx r3, r3, r4
; CHECK-P9-LE-NEXT: extsb r3, r3
; CHECK-P9-LE-NEXT: blr
;
; CHECK-P9-BE-LABEL: ld_disjoint_align32_int8_t_uint16_t:
; CHECK-P9-BE: # %bb.0: # %entry
; CHECK-P9-BE-NEXT: lis r4, -15264
; CHECK-P9-BE-NEXT: and r3, r3, r4
; CHECK-P9-BE-NEXT: lis r4, 15258
; CHECK-P9-BE-NEXT: ori r4, r4, 41713
; CHECK-P9-BE-NEXT: lbzx r3, r3, r4
; CHECK-P9-BE-NEXT: extsb r3, r3
; CHECK-P9-BE-NEXT: blr
;
; CHECK-P8-LE-LABEL: ld_disjoint_align32_int8_t_uint16_t:
; CHECK-P8-LE: # %bb.0: # %entry
; CHECK-P8-LE-NEXT: lis r4, -15264
; CHECK-P8-LE-NEXT: lis r5, 15258
; CHECK-P8-LE-NEXT: and r3, r3, r4
; CHECK-P8-LE-NEXT: ori r4, r5, 41712
; CHECK-P8-LE-NEXT: lbzx r3, r3, r4
; CHECK-P8-LE-NEXT: extsb r3, r3
; CHECK-P8-LE-NEXT: blr
;
; CHECK-P8-BE-LABEL: ld_disjoint_align32_int8_t_uint16_t:
; CHECK-P8-BE: # %bb.0: # %entry
; CHECK-P8-BE-NEXT: lis r4, -15264
; CHECK-P8-BE-NEXT: lis r5, 15258
; CHECK-P8-BE-NEXT: and r3, r3, r4
; CHECK-P8-BE-NEXT: ori r4, r5, 41713
; CHECK-P8-BE-NEXT: lbzx r3, r3, r4
; CHECK-P8-BE-NEXT: extsb r3, r3
; CHECK-P8-BE-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 = trunc i16 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_not_disjoint64_int8_t_uint16_t(i64 %ptr) {
; CHECK-P10-LE-LABEL: ld_not_disjoint64_int8_t_uint16_t:
; CHECK-P10-LE: # %bb.0: # %entry
; CHECK-P10-LE-NEXT: pli r4, 232
; CHECK-P10-LE-NEXT: pli r5, 3567587329
; CHECK-P10-LE-NEXT: rldimi r5, r4, 32, 0
; CHECK-P10-LE-NEXT: or r3, r3, r5
; CHECK-P10-LE-NEXT: lbz r3, 0(r3)
; CHECK-P10-LE-NEXT: extsb r3, r3
; CHECK-P10-LE-NEXT: blr
;
; CHECK-P10-BE-LABEL: ld_not_disjoint64_int8_t_uint16_t:
; CHECK-P10-BE: # %bb.0: # %entry
; CHECK-P10-BE-NEXT: pli r4, 232
; CHECK-P10-BE-NEXT: pli r5, 3567587329
; CHECK-P10-BE-NEXT: rldimi r5, r4, 32, 0
; CHECK-P10-BE-NEXT: or r3, r3, r5
; CHECK-P10-BE-NEXT: lbz r3, 1(r3)
; CHECK-P10-BE-NEXT: extsb r3, r3
; CHECK-P10-BE-NEXT: blr
;
; CHECK-P9-LE-LABEL: ld_not_disjoint64_int8_t_uint16_t:
; CHECK-P9-LE: # %bb.0: # %entry
; CHECK-P9-LE-NEXT: li r4, 29
; CHECK-P9-LE-NEXT: rldic r4, r4, 35, 24
; CHECK-P9-LE-NEXT: oris r4, r4, 54437
; CHECK-P9-LE-NEXT: ori r4, r4, 4097
; CHECK-P9-LE-NEXT: or r3, r3, r4
; CHECK-P9-LE-NEXT: lbz r3, 0(r3)
; CHECK-P9-LE-NEXT: extsb r3, r3
; CHECK-P9-LE-NEXT: blr
;
; CHECK-P9-BE-LABEL: ld_not_disjoint64_int8_t_uint16_t:
; CHECK-P9-BE: # %bb.0: # %entry
; CHECK-P9-BE-NEXT: li r4, 29
; CHECK-P9-BE-NEXT: rldic r4, r4, 35, 24
; CHECK-P9-BE-NEXT: oris r4, r4, 54437
; CHECK-P9-BE-NEXT: ori r4, r4, 4097
; CHECK-P9-BE-NEXT: or r3, r3, r4
; CHECK-P9-BE-NEXT: lbz r3, 1(r3)
; CHECK-P9-BE-NEXT: extsb r3, r3
; CHECK-P9-BE-NEXT: blr
;
; CHECK-P8-LE-LABEL: ld_not_disjoint64_int8_t_uint16_t:
; CHECK-P8-LE: # %bb.0: # %entry
; CHECK-P8-LE-NEXT: li r4, 29
; CHECK-P8-LE-NEXT: rldic r4, r4, 35, 24
; CHECK-P8-LE-NEXT: oris r4, r4, 54437
; CHECK-P8-LE-NEXT: ori r4, r4, 4097
; CHECK-P8-LE-NEXT: or r3, r3, r4
; CHECK-P8-LE-NEXT: lbz r3, 0(r3)
; CHECK-P8-LE-NEXT: extsb r3, r3
; CHECK-P8-LE-NEXT: blr
;
; CHECK-P8-BE-LABEL: ld_not_disjoint64_int8_t_uint16_t:
; CHECK-P8-BE: # %bb.0: # %entry
; CHECK-P8-BE-NEXT: li r4, 29
; CHECK-P8-BE-NEXT: rldic r4, r4, 35, 24
; CHECK-P8-BE-NEXT: oris r4, r4, 54437
; CHECK-P8-BE-NEXT: ori r4, r4, 4097
; CHECK-P8-BE-NEXT: or r3, r3, r4
; CHECK-P8-BE-NEXT: lbz r3, 1(r3)
; CHECK-P8-BE-NEXT: extsb r3, r3
; CHECK-P8-BE-NEXT: blr
entry:
%or = or i64 %ptr, 1000000000001
%0 = inttoptr i64 %or to i16*
%1 = load i16, i16* %0, align 2
%conv = trunc i16 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_disjoint_align64_int8_t_uint16_t(i64 %ptr) {
; CHECK-P10-LE-LABEL: ld_disjoint_align64_int8_t_uint16_t:
; CHECK-P10-LE: # %bb.0: # %entry
; CHECK-P10-LE-NEXT: pli r4, 244140625
; CHECK-P10-LE-NEXT: rldicr r3, r3, 0, 23
; CHECK-P10-LE-NEXT: rldic r4, r4, 12, 24
; CHECK-P10-LE-NEXT: lbzx r3, r3, r4
; CHECK-P10-LE-NEXT: extsb r3, r3
; CHECK-P10-LE-NEXT: blr
;
; CHECK-P10-BE-LABEL: ld_disjoint_align64_int8_t_uint16_t:
; CHECK-P10-BE: # %bb.0: # %entry
; CHECK-P10-BE-NEXT: pli r4, 232
; CHECK-P10-BE-NEXT: pli r5, 3567587329
; CHECK-P10-BE-NEXT: rldicr r3, r3, 0, 23
; CHECK-P10-BE-NEXT: rldimi r5, r4, 32, 0
; CHECK-P10-BE-NEXT: lbzx r3, r3, r5
; CHECK-P10-BE-NEXT: extsb r3, r3
; CHECK-P10-BE-NEXT: blr
;
; CHECK-P9-LE-LABEL: ld_disjoint_align64_int8_t_uint16_t:
; CHECK-P9-LE: # %bb.0: # %entry
; CHECK-P9-LE-NEXT: lis r4, 3725
; CHECK-P9-LE-NEXT: rldicr r3, r3, 0, 23
; CHECK-P9-LE-NEXT: ori r4, r4, 19025
; CHECK-P9-LE-NEXT: rldic r4, r4, 12, 24
; CHECK-P9-LE-NEXT: lbzx r3, r3, r4
; CHECK-P9-LE-NEXT: extsb r3, r3
; CHECK-P9-LE-NEXT: blr
;
; CHECK-P9-BE-LABEL: ld_disjoint_align64_int8_t_uint16_t:
; CHECK-P9-BE: # %bb.0: # %entry
; CHECK-P9-BE-NEXT: li r4, 29
; CHECK-P9-BE-NEXT: rldicr r3, r3, 0, 23
; CHECK-P9-BE-NEXT: rldic r4, r4, 35, 24
; CHECK-P9-BE-NEXT: oris r4, r4, 54437
; CHECK-P9-BE-NEXT: ori r4, r4, 4097
; CHECK-P9-BE-NEXT: lbzx r3, r3, r4
; CHECK-P9-BE-NEXT: extsb r3, r3
; CHECK-P9-BE-NEXT: blr
;
; CHECK-P8-LE-LABEL: ld_disjoint_align64_int8_t_uint16_t:
; CHECK-P8-LE: # %bb.0: # %entry
; CHECK-P8-LE-NEXT: lis r4, 3725
; CHECK-P8-LE-NEXT: rldicr r3, r3, 0, 23
; CHECK-P8-LE-NEXT: ori r4, r4, 19025
; CHECK-P8-LE-NEXT: rldic r4, r4, 12, 24
; CHECK-P8-LE-NEXT: lbzx r3, r3, r4
; CHECK-P8-LE-NEXT: extsb r3, r3
; CHECK-P8-LE-NEXT: blr
;
; CHECK-P8-BE-LABEL: ld_disjoint_align64_int8_t_uint16_t:
; CHECK-P8-BE: # %bb.0: # %entry
; CHECK-P8-BE-NEXT: li r4, 29
; CHECK-P8-BE-NEXT: rldicr r3, r3, 0, 23
; CHECK-P8-BE-NEXT: rldic r4, r4, 35, 24
; CHECK-P8-BE-NEXT: oris r4, r4, 54437
; CHECK-P8-BE-NEXT: ori r4, r4, 4097
; CHECK-P8-BE-NEXT: lbzx r3, r3, r4
; CHECK-P8-BE-NEXT: extsb r3, r3
; CHECK-P8-BE-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 = trunc i16 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_cst_align16_int8_t_uint16_t() {
; CHECK-LE-LABEL: ld_cst_align16_int8_t_uint16_t:
; CHECK-LE: # %bb.0: # %entry
; CHECK-LE-NEXT: lbz r3, 4080(0)
; CHECK-LE-NEXT: extsb r3, r3
; CHECK-LE-NEXT: blr
;
; CHECK-BE-LABEL: ld_cst_align16_int8_t_uint16_t:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: lbz r3, 4081(0)
; CHECK-BE-NEXT: extsb r3, r3
; CHECK-BE-NEXT: blr
entry:
%0 = load i16, i16* inttoptr (i64 4080 to i16*), align 16
%conv = trunc i16 %0 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_cst_align32_int8_t_uint16_t() {
; CHECK-LE-LABEL: ld_cst_align32_int8_t_uint16_t:
; CHECK-LE: # %bb.0: # %entry
; CHECK-LE-NEXT: lis r3, 153
; CHECK-LE-NEXT: lbz r3, -27108(r3)
; CHECK-LE-NEXT: extsb r3, r3
; CHECK-LE-NEXT: blr
;
; CHECK-BE-LABEL: ld_cst_align32_int8_t_uint16_t:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: lis r3, 153
; CHECK-BE-NEXT: lbz r3, -27107(r3)
; CHECK-BE-NEXT: extsb r3, r3
; CHECK-BE-NEXT: blr
entry:
%0 = load i16, i16* inttoptr (i64 9999900 to i16*), align 4
%conv = trunc i16 %0 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_cst_align64_int8_t_uint16_t() {
; CHECK-P10-LE-LABEL: ld_cst_align64_int8_t_uint16_t:
; CHECK-P10-LE: # %bb.0: # %entry
; CHECK-P10-LE-NEXT: pli r3, 244140625
; CHECK-P10-LE-NEXT: rldic r3, r3, 12, 24
; CHECK-P10-LE-NEXT: lbz r3, 0(r3)
; CHECK-P10-LE-NEXT: extsb r3, r3
; CHECK-P10-LE-NEXT: blr
;
; CHECK-P10-BE-LABEL: ld_cst_align64_int8_t_uint16_t:
; CHECK-P10-BE: # %bb.0: # %entry
; CHECK-P10-BE-NEXT: pli r3, 232
; CHECK-P10-BE-NEXT: pli r4, 3567587329
; CHECK-P10-BE-NEXT: rldimi r4, r3, 32, 0
; CHECK-P10-BE-NEXT: lbz r3, 0(r4)
; CHECK-P10-BE-NEXT: extsb r3, r3
; CHECK-P10-BE-NEXT: blr
;
; CHECK-P9-LE-LABEL: ld_cst_align64_int8_t_uint16_t:
; CHECK-P9-LE: # %bb.0: # %entry
; CHECK-P9-LE-NEXT: lis r3, 3725
; CHECK-P9-LE-NEXT: ori r3, r3, 19025
; CHECK-P9-LE-NEXT: rldic r3, r3, 12, 24
; CHECK-P9-LE-NEXT: lbz r3, 0(r3)
; CHECK-P9-LE-NEXT: extsb r3, r3
; CHECK-P9-LE-NEXT: blr
;
; CHECK-P9-BE-LABEL: ld_cst_align64_int8_t_uint16_t:
; CHECK-P9-BE: # %bb.0: # %entry
; CHECK-P9-BE-NEXT: li r3, 29
; CHECK-P9-BE-NEXT: rldic r3, r3, 35, 24
; CHECK-P9-BE-NEXT: oris r3, r3, 54437
; CHECK-P9-BE-NEXT: ori r3, r3, 4097
; CHECK-P9-BE-NEXT: lbz r3, 0(r3)
; CHECK-P9-BE-NEXT: extsb r3, r3
; CHECK-P9-BE-NEXT: blr
;
; CHECK-P8-LE-LABEL: ld_cst_align64_int8_t_uint16_t:
; CHECK-P8-LE: # %bb.0: # %entry
; CHECK-P8-LE-NEXT: lis r3, 3725
; CHECK-P8-LE-NEXT: ori r3, r3, 19025
; CHECK-P8-LE-NEXT: rldic r3, r3, 12, 24
; CHECK-P8-LE-NEXT: lbz r3, 0(r3)
; CHECK-P8-LE-NEXT: extsb r3, r3
; CHECK-P8-LE-NEXT: blr
;
; CHECK-P8-BE-LABEL: ld_cst_align64_int8_t_uint16_t:
; CHECK-P8-BE: # %bb.0: # %entry
; CHECK-P8-BE-NEXT: li r3, 29
; CHECK-P8-BE-NEXT: rldic r3, r3, 35, 24
; CHECK-P8-BE-NEXT: oris r3, r3, 54437
; CHECK-P8-BE-NEXT: ori r3, r3, 4097
; CHECK-P8-BE-NEXT: lbz r3, 0(r3)
; CHECK-P8-BE-NEXT: extsb r3, r3
; CHECK-P8-BE-NEXT: blr
entry:
%0 = load i16, i16* inttoptr (i64 1000000000000 to i16*), align 4096
%conv = trunc i16 %0 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_0_int8_t_uint32_t(i64 %ptr) {
; CHECK-LE-LABEL: ld_0_int8_t_uint32_t:
; CHECK-LE: # %bb.0: # %entry
; CHECK-LE-NEXT: lbz r3, 0(r3)
; CHECK-LE-NEXT: extsb r3, r3
; CHECK-LE-NEXT: blr
;
; CHECK-BE-LABEL: ld_0_int8_t_uint32_t:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: lbz r3, 3(r3)
; CHECK-BE-NEXT: extsb r3, r3
; CHECK-BE-NEXT: blr
entry:
%0 = inttoptr i64 %ptr to i32*
%1 = load i32, i32* %0, align 4
%conv = trunc i32 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_align16_int8_t_uint32_t(i8* nocapture readonly %ptr) {
; CHECK-LE-LABEL: ld_align16_int8_t_uint32_t:
; CHECK-LE: # %bb.0: # %entry
; CHECK-LE-NEXT: lbz r3, 8(r3)
; CHECK-LE-NEXT: extsb r3, r3
; CHECK-LE-NEXT: blr
;
; CHECK-BE-LABEL: ld_align16_int8_t_uint32_t:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: lbz r3, 11(r3)
; CHECK-BE-NEXT: extsb r3, r3
; CHECK-BE-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 = trunc i32 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_align32_int8_t_uint32_t(i8* nocapture readonly %ptr) {
; CHECK-P10-LE-LABEL: ld_align32_int8_t_uint32_t:
; CHECK-P10-LE: # %bb.0: # %entry
; CHECK-P10-LE-NEXT: pli r4, 99999000
; CHECK-P10-LE-NEXT: lbzx r3, r3, r4
; CHECK-P10-LE-NEXT: extsb r3, r3
; CHECK-P10-LE-NEXT: blr
;
; CHECK-P10-BE-LABEL: ld_align32_int8_t_uint32_t:
; CHECK-P10-BE: # %bb.0: # %entry
; CHECK-P10-BE-NEXT: pli r4, 99999003
; CHECK-P10-BE-NEXT: lbzx r3, r3, r4
; CHECK-P10-BE-NEXT: extsb r3, r3
; CHECK-P10-BE-NEXT: blr
;
; CHECK-P9-LE-LABEL: ld_align32_int8_t_uint32_t:
; CHECK-P9-LE: # %bb.0: # %entry
; CHECK-P9-LE-NEXT: lis r4, 1525
; CHECK-P9-LE-NEXT: ori r4, r4, 56600
; CHECK-P9-LE-NEXT: lbzx r3, r3, r4
; CHECK-P9-LE-NEXT: extsb r3, r3
; CHECK-P9-LE-NEXT: blr
;
; CHECK-P9-BE-LABEL: ld_align32_int8_t_uint32_t:
; CHECK-P9-BE: # %bb.0: # %entry
; CHECK-P9-BE-NEXT: lis r4, 1525
; CHECK-P9-BE-NEXT: ori r4, r4, 56603
; CHECK-P9-BE-NEXT: lbzx r3, r3, r4
; CHECK-P9-BE-NEXT: extsb r3, r3
; CHECK-P9-BE-NEXT: blr
;
; CHECK-P8-LE-LABEL: ld_align32_int8_t_uint32_t:
; CHECK-P8-LE: # %bb.0: # %entry
; CHECK-P8-LE-NEXT: lis r4, 1525
; CHECK-P8-LE-NEXT: ori r4, r4, 56600
; CHECK-P8-LE-NEXT: lbzx r3, r3, r4
; CHECK-P8-LE-NEXT: extsb r3, r3
; CHECK-P8-LE-NEXT: blr
;
; CHECK-P8-BE-LABEL: ld_align32_int8_t_uint32_t:
; CHECK-P8-BE: # %bb.0: # %entry
; CHECK-P8-BE-NEXT: lis r4, 1525
; CHECK-P8-BE-NEXT: ori r4, r4, 56603
; CHECK-P8-BE-NEXT: lbzx r3, r3, r4
; CHECK-P8-BE-NEXT: extsb r3, r3
; CHECK-P8-BE-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 = trunc i32 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_align64_int8_t_uint32_t(i8* nocapture readonly %ptr) {
; CHECK-P10-LE-LABEL: ld_align64_int8_t_uint32_t:
; CHECK-P10-LE: # %bb.0: # %entry
; CHECK-P10-LE-NEXT: pli r4, 244140625
; CHECK-P10-LE-NEXT: rldic r4, r4, 12, 24
; CHECK-P10-LE-NEXT: lbzx r3, r3, r4
; CHECK-P10-LE-NEXT: extsb r3, r3
; CHECK-P10-LE-NEXT: blr
;
; CHECK-P10-BE-LABEL: ld_align64_int8_t_uint32_t:
; CHECK-P10-BE: # %bb.0: # %entry
; CHECK-P10-BE-NEXT: pli r4, 232
; CHECK-P10-BE-NEXT: pli r5, 3567587331
; CHECK-P10-BE-NEXT: rldimi r5, r4, 32, 0
; CHECK-P10-BE-NEXT: lbzx r3, r3, r5
; CHECK-P10-BE-NEXT: extsb r3, r3
; CHECK-P10-BE-NEXT: blr
;
; CHECK-P9-LE-LABEL: ld_align64_int8_t_uint32_t:
; CHECK-P9-LE: # %bb.0: # %entry
; CHECK-P9-LE-NEXT: lis r4, 3725
; CHECK-P9-LE-NEXT: ori r4, r4, 19025
; CHECK-P9-LE-NEXT: rldic r4, r4, 12, 24
; CHECK-P9-LE-NEXT: lbzx r3, r3, r4
; CHECK-P9-LE-NEXT: extsb r3, r3
; CHECK-P9-LE-NEXT: blr
;
; CHECK-P9-BE-LABEL: ld_align64_int8_t_uint32_t:
; CHECK-P9-BE: # %bb.0: # %entry
; CHECK-P9-BE-NEXT: li r4, 29
; CHECK-P9-BE-NEXT: rldic r4, r4, 35, 24
; CHECK-P9-BE-NEXT: oris r4, r4, 54437
; CHECK-P9-BE-NEXT: ori r4, r4, 4099
; CHECK-P9-BE-NEXT: lbzx r3, r3, r4
; CHECK-P9-BE-NEXT: extsb r3, r3
; CHECK-P9-BE-NEXT: blr
;
; CHECK-P8-LE-LABEL: ld_align64_int8_t_uint32_t:
; CHECK-P8-LE: # %bb.0: # %entry
; CHECK-P8-LE-NEXT: lis r4, 3725
; CHECK-P8-LE-NEXT: ori r4, r4, 19025
; CHECK-P8-LE-NEXT: rldic r4, r4, 12, 24
; CHECK-P8-LE-NEXT: lbzx r3, r3, r4
; CHECK-P8-LE-NEXT: extsb r3, r3
; CHECK-P8-LE-NEXT: blr
;
; CHECK-P8-BE-LABEL: ld_align64_int8_t_uint32_t:
; CHECK-P8-BE: # %bb.0: # %entry
; CHECK-P8-BE-NEXT: li r4, 29
; CHECK-P8-BE-NEXT: rldic r4, r4, 35, 24
; CHECK-P8-BE-NEXT: oris r4, r4, 54437
; CHECK-P8-BE-NEXT: ori r4, r4, 4099
; CHECK-P8-BE-NEXT: lbzx r3, r3, r4
; CHECK-P8-BE-NEXT: extsb r3, r3
; CHECK-P8-BE-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 = trunc i32 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_reg_int8_t_uint32_t(i8* nocapture readonly %ptr, i64 %off) {
; CHECK-LE-LABEL: ld_reg_int8_t_uint32_t:
; CHECK-LE: # %bb.0: # %entry
; CHECK-LE-NEXT: lbzx r3, r3, r4
; CHECK-LE-NEXT: extsb r3, r3
; CHECK-LE-NEXT: blr
;
; CHECK-BE-LABEL: ld_reg_int8_t_uint32_t:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: add r3, r3, r4
; CHECK-BE-NEXT: lbz r3, 3(r3)
; CHECK-BE-NEXT: extsb r3, r3
; CHECK-BE-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 = trunc i32 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_or_int8_t_uint32_t(i64 %ptr, i8 zeroext %off) {
; CHECK-LE-LABEL: ld_or_int8_t_uint32_t:
; CHECK-LE: # %bb.0: # %entry
; CHECK-LE-NEXT: or r3, r4, r3
; CHECK-LE-NEXT: lbz r3, 0(r3)
; CHECK-LE-NEXT: extsb r3, r3
; CHECK-LE-NEXT: blr
;
; CHECK-BE-LABEL: ld_or_int8_t_uint32_t:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: or r3, r4, r3
; CHECK-BE-NEXT: lbz r3, 3(r3)
; CHECK-BE-NEXT: extsb r3, r3
; CHECK-BE-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 = trunc i32 %1 to i8
ret i8 %conv1
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_not_disjoint16_int8_t_uint32_t(i64 %ptr) {
; CHECK-LE-LABEL: ld_not_disjoint16_int8_t_uint32_t:
; CHECK-LE: # %bb.0: # %entry
; CHECK-LE-NEXT: ori r3, r3, 6
; CHECK-LE-NEXT: lbz r3, 0(r3)
; CHECK-LE-NEXT: extsb r3, r3
; CHECK-LE-NEXT: blr
;
; CHECK-BE-LABEL: ld_not_disjoint16_int8_t_uint32_t:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: ori r3, r3, 6
; CHECK-BE-NEXT: lbz r3, 3(r3)
; CHECK-BE-NEXT: extsb r3, r3
; CHECK-BE-NEXT: blr
entry:
%or = or i64 %ptr, 6
%0 = inttoptr i64 %or to i32*
%1 = load i32, i32* %0, align 4
%conv = trunc i32 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_disjoint_align16_int8_t_uint32_t(i64 %ptr) {
; CHECK-LE-LABEL: ld_disjoint_align16_int8_t_uint32_t:
; CHECK-LE: # %bb.0: # %entry
; CHECK-LE-NEXT: rldicr r3, r3, 0, 51
; CHECK-LE-NEXT: lbz r3, 24(r3)
; CHECK-LE-NEXT: extsb r3, r3
; CHECK-LE-NEXT: blr
;
; CHECK-BE-LABEL: ld_disjoint_align16_int8_t_uint32_t:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: rldicr r3, r3, 0, 51
; CHECK-BE-NEXT: lbz r3, 27(r3)
; CHECK-BE-NEXT: extsb r3, r3
; CHECK-BE-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 = trunc i32 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_not_disjoint32_int8_t_uint32_t(i64 %ptr) {
; CHECK-LE-LABEL: ld_not_disjoint32_int8_t_uint32_t:
; CHECK-LE: # %bb.0: # %entry
; CHECK-LE-NEXT: ori r3, r3, 34463
; CHECK-LE-NEXT: oris r3, r3, 1
; CHECK-LE-NEXT: lbz r3, 0(r3)
; CHECK-LE-NEXT: extsb r3, r3
; CHECK-LE-NEXT: blr
;
; CHECK-BE-LABEL: ld_not_disjoint32_int8_t_uint32_t:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: ori r3, r3, 34463
; CHECK-BE-NEXT: oris r3, r3, 1
; CHECK-BE-NEXT: lbz r3, 3(r3)
; CHECK-BE-NEXT: extsb r3, r3
; CHECK-BE-NEXT: blr
entry:
%or = or i64 %ptr, 99999
%0 = inttoptr i64 %or to i32*
%1 = load i32, i32* %0, align 4
%conv = trunc i32 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_disjoint_align32_int8_t_uint32_t(i64 %ptr) {
; CHECK-P10-LE-LABEL: ld_disjoint_align32_int8_t_uint32_t:
; CHECK-P10-LE: # %bb.0: # %entry
; CHECK-P10-LE-NEXT: lis r4, -15264
; CHECK-P10-LE-NEXT: and r3, r3, r4
; CHECK-P10-LE-NEXT: pli r4, 999990000
; CHECK-P10-LE-NEXT: lbzx r3, r3, r4
; CHECK-P10-LE-NEXT: extsb r3, r3
; CHECK-P10-LE-NEXT: blr
;
; CHECK-P10-BE-LABEL: ld_disjoint_align32_int8_t_uint32_t:
; CHECK-P10-BE: # %bb.0: # %entry
; CHECK-P10-BE-NEXT: lis r4, -15264
; CHECK-P10-BE-NEXT: and r3, r3, r4
; CHECK-P10-BE-NEXT: pli r4, 999990003
; CHECK-P10-BE-NEXT: lbzx r3, r3, r4
; CHECK-P10-BE-NEXT: extsb r3, r3
; CHECK-P10-BE-NEXT: blr
;
; CHECK-P9-LE-LABEL: ld_disjoint_align32_int8_t_uint32_t:
; CHECK-P9-LE: # %bb.0: # %entry
; CHECK-P9-LE-NEXT: lis r4, -15264
; CHECK-P9-LE-NEXT: and r3, r3, r4
; CHECK-P9-LE-NEXT: lis r4, 15258
; CHECK-P9-LE-NEXT: ori r4, r4, 41712
; CHECK-P9-LE-NEXT: lbzx r3, r3, r4
; CHECK-P9-LE-NEXT: extsb r3, r3
; CHECK-P9-LE-NEXT: blr
;
; CHECK-P9-BE-LABEL: ld_disjoint_align32_int8_t_uint32_t:
; CHECK-P9-BE: # %bb.0: # %entry
; CHECK-P9-BE-NEXT: lis r4, -15264
; CHECK-P9-BE-NEXT: and r3, r3, r4
; CHECK-P9-BE-NEXT: lis r4, 15258
; CHECK-P9-BE-NEXT: ori r4, r4, 41715
; CHECK-P9-BE-NEXT: lbzx r3, r3, r4
; CHECK-P9-BE-NEXT: extsb r3, r3
; CHECK-P9-BE-NEXT: blr
;
; CHECK-P8-LE-LABEL: ld_disjoint_align32_int8_t_uint32_t:
; CHECK-P8-LE: # %bb.0: # %entry
; CHECK-P8-LE-NEXT: lis r4, -15264
; CHECK-P8-LE-NEXT: lis r5, 15258
; CHECK-P8-LE-NEXT: and r3, r3, r4
; CHECK-P8-LE-NEXT: ori r4, r5, 41712
; CHECK-P8-LE-NEXT: lbzx r3, r3, r4
; CHECK-P8-LE-NEXT: extsb r3, r3
; CHECK-P8-LE-NEXT: blr
;
; CHECK-P8-BE-LABEL: ld_disjoint_align32_int8_t_uint32_t:
; CHECK-P8-BE: # %bb.0: # %entry
; CHECK-P8-BE-NEXT: lis r4, -15264
; CHECK-P8-BE-NEXT: lis r5, 15258
; CHECK-P8-BE-NEXT: and r3, r3, r4
; CHECK-P8-BE-NEXT: ori r4, r5, 41715
; CHECK-P8-BE-NEXT: lbzx r3, r3, r4
; CHECK-P8-BE-NEXT: extsb r3, r3
; CHECK-P8-BE-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 = trunc i32 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_not_disjoint64_int8_t_uint32_t(i64 %ptr) {
; CHECK-P10-LE-LABEL: ld_not_disjoint64_int8_t_uint32_t:
; CHECK-P10-LE: # %bb.0: # %entry
; CHECK-P10-LE-NEXT: pli r4, 232
; CHECK-P10-LE-NEXT: pli r5, 3567587329
; CHECK-P10-LE-NEXT: rldimi r5, r4, 32, 0
; CHECK-P10-LE-NEXT: or r3, r3, r5
; CHECK-P10-LE-NEXT: lbz r3, 0(r3)
; CHECK-P10-LE-NEXT: extsb r3, r3
; CHECK-P10-LE-NEXT: blr
;
; CHECK-P10-BE-LABEL: ld_not_disjoint64_int8_t_uint32_t:
; CHECK-P10-BE: # %bb.0: # %entry
; CHECK-P10-BE-NEXT: pli r4, 232
; CHECK-P10-BE-NEXT: pli r5, 3567587329
; CHECK-P10-BE-NEXT: rldimi r5, r4, 32, 0
; CHECK-P10-BE-NEXT: or r3, r3, r5
; CHECK-P10-BE-NEXT: lbz r3, 3(r3)
; CHECK-P10-BE-NEXT: extsb r3, r3
; CHECK-P10-BE-NEXT: blr
;
; CHECK-P9-LE-LABEL: ld_not_disjoint64_int8_t_uint32_t:
; CHECK-P9-LE: # %bb.0: # %entry
; CHECK-P9-LE-NEXT: li r4, 29
; CHECK-P9-LE-NEXT: rldic r4, r4, 35, 24
; CHECK-P9-LE-NEXT: oris r4, r4, 54437
; CHECK-P9-LE-NEXT: ori r4, r4, 4097
; CHECK-P9-LE-NEXT: or r3, r3, r4
; CHECK-P9-LE-NEXT: lbz r3, 0(r3)
; CHECK-P9-LE-NEXT: extsb r3, r3
; CHECK-P9-LE-NEXT: blr
;
; CHECK-P9-BE-LABEL: ld_not_disjoint64_int8_t_uint32_t:
; CHECK-P9-BE: # %bb.0: # %entry
; CHECK-P9-BE-NEXT: li r4, 29
; CHECK-P9-BE-NEXT: rldic r4, r4, 35, 24
; CHECK-P9-BE-NEXT: oris r4, r4, 54437
; CHECK-P9-BE-NEXT: ori r4, r4, 4097
; CHECK-P9-BE-NEXT: or r3, r3, r4
; CHECK-P9-BE-NEXT: lbz r3, 3(r3)
; CHECK-P9-BE-NEXT: extsb r3, r3
; CHECK-P9-BE-NEXT: blr
;
; CHECK-P8-LE-LABEL: ld_not_disjoint64_int8_t_uint32_t:
; CHECK-P8-LE: # %bb.0: # %entry
; CHECK-P8-LE-NEXT: li r4, 29
; CHECK-P8-LE-NEXT: rldic r4, r4, 35, 24
; CHECK-P8-LE-NEXT: oris r4, r4, 54437
; CHECK-P8-LE-NEXT: ori r4, r4, 4097
; CHECK-P8-LE-NEXT: or r3, r3, r4
; CHECK-P8-LE-NEXT: lbz r3, 0(r3)
; CHECK-P8-LE-NEXT: extsb r3, r3
; CHECK-P8-LE-NEXT: blr
;
; CHECK-P8-BE-LABEL: ld_not_disjoint64_int8_t_uint32_t:
; CHECK-P8-BE: # %bb.0: # %entry
; CHECK-P8-BE-NEXT: li r4, 29
; CHECK-P8-BE-NEXT: rldic r4, r4, 35, 24
; CHECK-P8-BE-NEXT: oris r4, r4, 54437
; CHECK-P8-BE-NEXT: ori r4, r4, 4097
; CHECK-P8-BE-NEXT: or r3, r3, r4
; CHECK-P8-BE-NEXT: lbz r3, 3(r3)
; CHECK-P8-BE-NEXT: extsb r3, r3
; CHECK-P8-BE-NEXT: blr
entry:
%or = or i64 %ptr, 1000000000001
%0 = inttoptr i64 %or to i32*
%1 = load i32, i32* %0, align 4
%conv = trunc i32 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_disjoint_align64_int8_t_uint32_t(i64 %ptr) {
; CHECK-P10-LE-LABEL: ld_disjoint_align64_int8_t_uint32_t:
; CHECK-P10-LE: # %bb.0: # %entry
; CHECK-P10-LE-NEXT: pli r4, 244140625
; CHECK-P10-LE-NEXT: rldicr r3, r3, 0, 23
; CHECK-P10-LE-NEXT: rldic r4, r4, 12, 24
; CHECK-P10-LE-NEXT: lbzx r3, r3, r4
; CHECK-P10-LE-NEXT: extsb r3, r3
; CHECK-P10-LE-NEXT: blr
;
; CHECK-P10-BE-LABEL: ld_disjoint_align64_int8_t_uint32_t:
; CHECK-P10-BE: # %bb.0: # %entry
; CHECK-P10-BE-NEXT: pli r4, 232
; CHECK-P10-BE-NEXT: pli r5, 3567587331
; CHECK-P10-BE-NEXT: rldicr r3, r3, 0, 23
; CHECK-P10-BE-NEXT: rldimi r5, r4, 32, 0
; CHECK-P10-BE-NEXT: lbzx r3, r3, r5
; CHECK-P10-BE-NEXT: extsb r3, r3
; CHECK-P10-BE-NEXT: blr
;
; CHECK-P9-LE-LABEL: ld_disjoint_align64_int8_t_uint32_t:
; CHECK-P9-LE: # %bb.0: # %entry
; CHECK-P9-LE-NEXT: lis r4, 3725
; CHECK-P9-LE-NEXT: rldicr r3, r3, 0, 23
; CHECK-P9-LE-NEXT: ori r4, r4, 19025
; CHECK-P9-LE-NEXT: rldic r4, r4, 12, 24
; CHECK-P9-LE-NEXT: lbzx r3, r3, r4
; CHECK-P9-LE-NEXT: extsb r3, r3
; CHECK-P9-LE-NEXT: blr
;
; CHECK-P9-BE-LABEL: ld_disjoint_align64_int8_t_uint32_t:
; CHECK-P9-BE: # %bb.0: # %entry
; CHECK-P9-BE-NEXT: li r4, 29
; CHECK-P9-BE-NEXT: rldicr r3, r3, 0, 23
; CHECK-P9-BE-NEXT: rldic r4, r4, 35, 24
; CHECK-P9-BE-NEXT: oris r4, r4, 54437
; CHECK-P9-BE-NEXT: ori r4, r4, 4099
; CHECK-P9-BE-NEXT: lbzx r3, r3, r4
; CHECK-P9-BE-NEXT: extsb r3, r3
; CHECK-P9-BE-NEXT: blr
;
; CHECK-P8-LE-LABEL: ld_disjoint_align64_int8_t_uint32_t:
; CHECK-P8-LE: # %bb.0: # %entry
; CHECK-P8-LE-NEXT: lis r4, 3725
; CHECK-P8-LE-NEXT: rldicr r3, r3, 0, 23
; CHECK-P8-LE-NEXT: ori r4, r4, 19025
; CHECK-P8-LE-NEXT: rldic r4, r4, 12, 24
; CHECK-P8-LE-NEXT: lbzx r3, r3, r4
; CHECK-P8-LE-NEXT: extsb r3, r3
; CHECK-P8-LE-NEXT: blr
;
; CHECK-P8-BE-LABEL: ld_disjoint_align64_int8_t_uint32_t:
; CHECK-P8-BE: # %bb.0: # %entry
; CHECK-P8-BE-NEXT: li r4, 29
; CHECK-P8-BE-NEXT: rldicr r3, r3, 0, 23
; CHECK-P8-BE-NEXT: rldic r4, r4, 35, 24
; CHECK-P8-BE-NEXT: oris r4, r4, 54437
; CHECK-P8-BE-NEXT: ori r4, r4, 4099
; CHECK-P8-BE-NEXT: lbzx r3, r3, r4
; CHECK-P8-BE-NEXT: extsb r3, r3
; CHECK-P8-BE-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 = trunc i32 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_cst_align16_int8_t_uint32_t() {
; CHECK-LE-LABEL: ld_cst_align16_int8_t_uint32_t:
; CHECK-LE: # %bb.0: # %entry
; CHECK-LE-NEXT: lbz r3, 4080(0)
; CHECK-LE-NEXT: extsb r3, r3
; CHECK-LE-NEXT: blr
;
; CHECK-BE-LABEL: ld_cst_align16_int8_t_uint32_t:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: lbz r3, 4083(0)
; CHECK-BE-NEXT: extsb r3, r3
; CHECK-BE-NEXT: blr
entry:
%0 = load i32, i32* inttoptr (i64 4080 to i32*), align 16
%conv = trunc i32 %0 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_cst_align32_int8_t_uint32_t() {
; CHECK-LE-LABEL: ld_cst_align32_int8_t_uint32_t:
; CHECK-LE: # %bb.0: # %entry
; CHECK-LE-NEXT: lis r3, 153
; CHECK-LE-NEXT: lbz r3, -27108(r3)
; CHECK-LE-NEXT: extsb r3, r3
; CHECK-LE-NEXT: blr
;
; CHECK-BE-LABEL: ld_cst_align32_int8_t_uint32_t:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: lis r3, 153
; CHECK-BE-NEXT: lbz r3, -27105(r3)
; CHECK-BE-NEXT: extsb r3, r3
; CHECK-BE-NEXT: blr
entry:
%0 = load i32, i32* inttoptr (i64 9999900 to i32*), align 4
%conv = trunc i32 %0 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_cst_align64_int8_t_uint32_t() {
; CHECK-P10-LE-LABEL: ld_cst_align64_int8_t_uint32_t:
; CHECK-P10-LE: # %bb.0: # %entry
; CHECK-P10-LE-NEXT: pli r3, 244140625
; CHECK-P10-LE-NEXT: rldic r3, r3, 12, 24
; CHECK-P10-LE-NEXT: lbz r3, 0(r3)
; CHECK-P10-LE-NEXT: extsb r3, r3
; CHECK-P10-LE-NEXT: blr
;
; CHECK-P10-BE-LABEL: ld_cst_align64_int8_t_uint32_t:
; CHECK-P10-BE: # %bb.0: # %entry
; CHECK-P10-BE-NEXT: pli r3, 232
; CHECK-P10-BE-NEXT: pli r4, 3567587331
; CHECK-P10-BE-NEXT: rldimi r4, r3, 32, 0
; CHECK-P10-BE-NEXT: lbz r3, 0(r4)
; CHECK-P10-BE-NEXT: extsb r3, r3
; CHECK-P10-BE-NEXT: blr
;
; CHECK-P9-LE-LABEL: ld_cst_align64_int8_t_uint32_t:
; CHECK-P9-LE: # %bb.0: # %entry
; CHECK-P9-LE-NEXT: lis r3, 3725
; CHECK-P9-LE-NEXT: ori r3, r3, 19025
; CHECK-P9-LE-NEXT: rldic r3, r3, 12, 24
; CHECK-P9-LE-NEXT: lbz r3, 0(r3)
; CHECK-P9-LE-NEXT: extsb r3, r3
; CHECK-P9-LE-NEXT: blr
;
; CHECK-P9-BE-LABEL: ld_cst_align64_int8_t_uint32_t:
; CHECK-P9-BE: # %bb.0: # %entry
; CHECK-P9-BE-NEXT: li r3, 29
; CHECK-P9-BE-NEXT: rldic r3, r3, 35, 24
; CHECK-P9-BE-NEXT: oris r3, r3, 54437
; CHECK-P9-BE-NEXT: ori r3, r3, 4099
; CHECK-P9-BE-NEXT: lbz r3, 0(r3)
; CHECK-P9-BE-NEXT: extsb r3, r3
; CHECK-P9-BE-NEXT: blr
;
; CHECK-P8-LE-LABEL: ld_cst_align64_int8_t_uint32_t:
; CHECK-P8-LE: # %bb.0: # %entry
; CHECK-P8-LE-NEXT: lis r3, 3725
; CHECK-P8-LE-NEXT: ori r3, r3, 19025
; CHECK-P8-LE-NEXT: rldic r3, r3, 12, 24
; CHECK-P8-LE-NEXT: lbz r3, 0(r3)
; CHECK-P8-LE-NEXT: extsb r3, r3
; CHECK-P8-LE-NEXT: blr
;
; CHECK-P8-BE-LABEL: ld_cst_align64_int8_t_uint32_t:
; CHECK-P8-BE: # %bb.0: # %entry
; CHECK-P8-BE-NEXT: li r3, 29
; CHECK-P8-BE-NEXT: rldic r3, r3, 35, 24
; CHECK-P8-BE-NEXT: oris r3, r3, 54437
; CHECK-P8-BE-NEXT: ori r3, r3, 4099
; CHECK-P8-BE-NEXT: lbz r3, 0(r3)
; CHECK-P8-BE-NEXT: extsb r3, r3
; CHECK-P8-BE-NEXT: blr
entry:
%0 = load i32, i32* inttoptr (i64 1000000000000 to i32*), align 4096
%conv = trunc i32 %0 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_0_int8_t_uint64_t(i64 %ptr) {
; CHECK-LE-LABEL: ld_0_int8_t_uint64_t:
; CHECK-LE: # %bb.0: # %entry
; CHECK-LE-NEXT: lbz r3, 0(r3)
; CHECK-LE-NEXT: extsb r3, r3
; CHECK-LE-NEXT: blr
;
; CHECK-BE-LABEL: ld_0_int8_t_uint64_t:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: lbz r3, 7(r3)
; CHECK-BE-NEXT: extsb r3, r3
; CHECK-BE-NEXT: blr
entry:
%0 = inttoptr i64 %ptr to i64*
%1 = load i64, i64* %0, align 8
%conv = trunc i64 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_align16_int8_t_uint64_t(i8* nocapture readonly %ptr) {
; CHECK-LE-LABEL: ld_align16_int8_t_uint64_t:
; CHECK-LE: # %bb.0: # %entry
; CHECK-LE-NEXT: lbz r3, 8(r3)
; CHECK-LE-NEXT: extsb r3, r3
; CHECK-LE-NEXT: blr
;
; CHECK-BE-LABEL: ld_align16_int8_t_uint64_t:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: lbz r3, 15(r3)
; CHECK-BE-NEXT: extsb r3, r3
; CHECK-BE-NEXT: blr
entry:
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 8
%0 = bitcast i8* %add.ptr to i64*
%1 = load i64, i64* %0, align 8
%conv = trunc i64 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_align32_int8_t_uint64_t(i8* nocapture readonly %ptr) {
; CHECK-P10-LE-LABEL: ld_align32_int8_t_uint64_t:
; CHECK-P10-LE: # %bb.0: # %entry
; CHECK-P10-LE-NEXT: pli r4, 99999000
; CHECK-P10-LE-NEXT: lbzx r3, r3, r4
; CHECK-P10-LE-NEXT: extsb r3, r3
; CHECK-P10-LE-NEXT: blr
;
; CHECK-P10-BE-LABEL: ld_align32_int8_t_uint64_t:
; CHECK-P10-BE: # %bb.0: # %entry
; CHECK-P10-BE-NEXT: pli r4, 99999007
; CHECK-P10-BE-NEXT: lbzx r3, r3, r4
; CHECK-P10-BE-NEXT: extsb r3, r3
; CHECK-P10-BE-NEXT: blr
;
; CHECK-P9-LE-LABEL: ld_align32_int8_t_uint64_t:
; CHECK-P9-LE: # %bb.0: # %entry
; CHECK-P9-LE-NEXT: lis r4, 1525
; CHECK-P9-LE-NEXT: ori r4, r4, 56600
; CHECK-P9-LE-NEXT: lbzx r3, r3, r4
; CHECK-P9-LE-NEXT: extsb r3, r3
; CHECK-P9-LE-NEXT: blr
;
; CHECK-P9-BE-LABEL: ld_align32_int8_t_uint64_t:
; CHECK-P9-BE: # %bb.0: # %entry
; CHECK-P9-BE-NEXT: lis r4, 1525
; CHECK-P9-BE-NEXT: ori r4, r4, 56607
; CHECK-P9-BE-NEXT: lbzx r3, r3, r4
; CHECK-P9-BE-NEXT: extsb r3, r3
; CHECK-P9-BE-NEXT: blr
;
; CHECK-P8-LE-LABEL: ld_align32_int8_t_uint64_t:
; CHECK-P8-LE: # %bb.0: # %entry
; CHECK-P8-LE-NEXT: lis r4, 1525
; CHECK-P8-LE-NEXT: ori r4, r4, 56600
; CHECK-P8-LE-NEXT: lbzx r3, r3, r4
; CHECK-P8-LE-NEXT: extsb r3, r3
; CHECK-P8-LE-NEXT: blr
;
; CHECK-P8-BE-LABEL: ld_align32_int8_t_uint64_t:
; CHECK-P8-BE: # %bb.0: # %entry
; CHECK-P8-BE-NEXT: lis r4, 1525
; CHECK-P8-BE-NEXT: ori r4, r4, 56607
; CHECK-P8-BE-NEXT: lbzx r3, r3, r4
; CHECK-P8-BE-NEXT: extsb r3, r3
; CHECK-P8-BE-NEXT: blr
entry:
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 99999000
%0 = bitcast i8* %add.ptr to i64*
%1 = load i64, i64* %0, align 8
%conv = trunc i64 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_align64_int8_t_uint64_t(i8* nocapture readonly %ptr) {
; CHECK-P10-LE-LABEL: ld_align64_int8_t_uint64_t:
; CHECK-P10-LE: # %bb.0: # %entry
; CHECK-P10-LE-NEXT: pli r4, 244140625
; CHECK-P10-LE-NEXT: rldic r4, r4, 12, 24
; CHECK-P10-LE-NEXT: lbzx r3, r3, r4
; CHECK-P10-LE-NEXT: extsb r3, r3
; CHECK-P10-LE-NEXT: blr
;
; CHECK-P10-BE-LABEL: ld_align64_int8_t_uint64_t:
; CHECK-P10-BE: # %bb.0: # %entry
; CHECK-P10-BE-NEXT: pli r4, 232
; CHECK-P10-BE-NEXT: pli r5, 3567587335
; CHECK-P10-BE-NEXT: rldimi r5, r4, 32, 0
; CHECK-P10-BE-NEXT: lbzx r3, r3, r5
; CHECK-P10-BE-NEXT: extsb r3, r3
; CHECK-P10-BE-NEXT: blr
;
; CHECK-P9-LE-LABEL: ld_align64_int8_t_uint64_t:
; CHECK-P9-LE: # %bb.0: # %entry
; CHECK-P9-LE-NEXT: lis r4, 3725
; CHECK-P9-LE-NEXT: ori r4, r4, 19025
; CHECK-P9-LE-NEXT: rldic r4, r4, 12, 24
; CHECK-P9-LE-NEXT: lbzx r3, r3, r4
; CHECK-P9-LE-NEXT: extsb r3, r3
; CHECK-P9-LE-NEXT: blr
;
; CHECK-P9-BE-LABEL: ld_align64_int8_t_uint64_t:
; CHECK-P9-BE: # %bb.0: # %entry
; CHECK-P9-BE-NEXT: li r4, 29
; CHECK-P9-BE-NEXT: rldic r4, r4, 35, 24
; CHECK-P9-BE-NEXT: oris r4, r4, 54437
; CHECK-P9-BE-NEXT: ori r4, r4, 4103
; CHECK-P9-BE-NEXT: lbzx r3, r3, r4
; CHECK-P9-BE-NEXT: extsb r3, r3
; CHECK-P9-BE-NEXT: blr
;
; CHECK-P8-LE-LABEL: ld_align64_int8_t_uint64_t:
; CHECK-P8-LE: # %bb.0: # %entry
; CHECK-P8-LE-NEXT: lis r4, 3725
; CHECK-P8-LE-NEXT: ori r4, r4, 19025
; CHECK-P8-LE-NEXT: rldic r4, r4, 12, 24
; CHECK-P8-LE-NEXT: lbzx r3, r3, r4
; CHECK-P8-LE-NEXT: extsb r3, r3
; CHECK-P8-LE-NEXT: blr
;
; CHECK-P8-BE-LABEL: ld_align64_int8_t_uint64_t:
; CHECK-P8-BE: # %bb.0: # %entry
; CHECK-P8-BE-NEXT: li r4, 29
; CHECK-P8-BE-NEXT: rldic r4, r4, 35, 24
; CHECK-P8-BE-NEXT: oris r4, r4, 54437
; CHECK-P8-BE-NEXT: ori r4, r4, 4103
; CHECK-P8-BE-NEXT: lbzx r3, r3, r4
; CHECK-P8-BE-NEXT: extsb r3, r3
; CHECK-P8-BE-NEXT: blr
entry:
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1000000000000
%0 = bitcast i8* %add.ptr to i64*
%1 = load i64, i64* %0, align 8
%conv = trunc i64 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_reg_int8_t_uint64_t(i8* nocapture readonly %ptr, i64 %off) {
; CHECK-LE-LABEL: ld_reg_int8_t_uint64_t:
; CHECK-LE: # %bb.0: # %entry
; CHECK-LE-NEXT: lbzx r3, r3, r4
; CHECK-LE-NEXT: extsb r3, r3
; CHECK-LE-NEXT: blr
;
; CHECK-BE-LABEL: ld_reg_int8_t_uint64_t:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: add r3, r3, r4
; CHECK-BE-NEXT: lbz r3, 7(r3)
; CHECK-BE-NEXT: extsb r3, r3
; CHECK-BE-NEXT: blr
entry:
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 %off
%0 = bitcast i8* %add.ptr to i64*
%1 = load i64, i64* %0, align 8
%conv = trunc i64 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_or_int8_t_uint64_t(i64 %ptr, i8 zeroext %off) {
; CHECK-LE-LABEL: ld_or_int8_t_uint64_t:
; CHECK-LE: # %bb.0: # %entry
; CHECK-LE-NEXT: or r3, r4, r3
; CHECK-LE-NEXT: lbz r3, 0(r3)
; CHECK-LE-NEXT: extsb r3, r3
; CHECK-LE-NEXT: blr
;
; CHECK-BE-LABEL: ld_or_int8_t_uint64_t:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: or r3, r4, r3
; CHECK-BE-NEXT: lbz r3, 7(r3)
; CHECK-BE-NEXT: extsb r3, r3
; CHECK-BE-NEXT: blr
entry:
%conv = zext i8 %off to i64
%or = or i64 %conv, %ptr
%0 = inttoptr i64 %or to i64*
%1 = load i64, i64* %0, align 8
%conv1 = trunc i64 %1 to i8
ret i8 %conv1
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_not_disjoint16_int8_t_uint64_t(i64 %ptr) {
; CHECK-LE-LABEL: ld_not_disjoint16_int8_t_uint64_t:
; CHECK-LE: # %bb.0: # %entry
; CHECK-LE-NEXT: ori r3, r3, 6
; CHECK-LE-NEXT: lbz r3, 0(r3)
; CHECK-LE-NEXT: extsb r3, r3
; CHECK-LE-NEXT: blr
;
; CHECK-BE-LABEL: ld_not_disjoint16_int8_t_uint64_t:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: ori r3, r3, 6
; CHECK-BE-NEXT: lbz r3, 7(r3)
; CHECK-BE-NEXT: extsb r3, r3
; CHECK-BE-NEXT: blr
entry:
%or = or i64 %ptr, 6
%0 = inttoptr i64 %or to i64*
%1 = load i64, i64* %0, align 8
%conv = trunc i64 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_disjoint_align16_int8_t_uint64_t(i64 %ptr) {
; CHECK-LE-LABEL: ld_disjoint_align16_int8_t_uint64_t:
; CHECK-LE: # %bb.0: # %entry
; CHECK-LE-NEXT: rldicr r3, r3, 0, 51
; CHECK-LE-NEXT: lbz r3, 24(r3)
; CHECK-LE-NEXT: extsb r3, r3
; CHECK-LE-NEXT: blr
;
; CHECK-BE-LABEL: ld_disjoint_align16_int8_t_uint64_t:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: rldicr r3, r3, 0, 51
; CHECK-BE-NEXT: lbz r3, 31(r3)
; CHECK-BE-NEXT: extsb r3, r3
; CHECK-BE-NEXT: blr
entry:
%and = and i64 %ptr, -4096
%or = or i64 %and, 24
%0 = inttoptr i64 %or to i64*
%1 = load i64, i64* %0, align 8
%conv = trunc i64 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_not_disjoint32_int8_t_uint64_t(i64 %ptr) {
; CHECK-LE-LABEL: ld_not_disjoint32_int8_t_uint64_t:
; CHECK-LE: # %bb.0: # %entry
; CHECK-LE-NEXT: ori r3, r3, 34463
; CHECK-LE-NEXT: oris r3, r3, 1
; CHECK-LE-NEXT: lbz r3, 0(r3)
; CHECK-LE-NEXT: extsb r3, r3
; CHECK-LE-NEXT: blr
;
; CHECK-BE-LABEL: ld_not_disjoint32_int8_t_uint64_t:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: ori r3, r3, 34463
; CHECK-BE-NEXT: oris r3, r3, 1
; CHECK-BE-NEXT: lbz r3, 7(r3)
; CHECK-BE-NEXT: extsb r3, r3
; CHECK-BE-NEXT: blr
entry:
%or = or i64 %ptr, 99999
%0 = inttoptr i64 %or to i64*
%1 = load i64, i64* %0, align 8
%conv = trunc i64 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_disjoint_align32_int8_t_uint64_t(i64 %ptr) {
; CHECK-P10-LE-LABEL: ld_disjoint_align32_int8_t_uint64_t:
; CHECK-P10-LE: # %bb.0: # %entry
; CHECK-P10-LE-NEXT: lis r4, -15264
; CHECK-P10-LE-NEXT: and r3, r3, r4
; CHECK-P10-LE-NEXT: pli r4, 999990000
; CHECK-P10-LE-NEXT: lbzx r3, r3, r4
; CHECK-P10-LE-NEXT: extsb r3, r3
; CHECK-P10-LE-NEXT: blr
;
; CHECK-P10-BE-LABEL: ld_disjoint_align32_int8_t_uint64_t:
; CHECK-P10-BE: # %bb.0: # %entry
; CHECK-P10-BE-NEXT: lis r4, -15264
; CHECK-P10-BE-NEXT: and r3, r3, r4
; CHECK-P10-BE-NEXT: pli r4, 999990007
; CHECK-P10-BE-NEXT: lbzx r3, r3, r4
; CHECK-P10-BE-NEXT: extsb r3, r3
; CHECK-P10-BE-NEXT: blr
;
; CHECK-P9-LE-LABEL: ld_disjoint_align32_int8_t_uint64_t:
; CHECK-P9-LE: # %bb.0: # %entry
; CHECK-P9-LE-NEXT: lis r4, -15264
; CHECK-P9-LE-NEXT: and r3, r3, r4
; CHECK-P9-LE-NEXT: lis r4, 15258
; CHECK-P9-LE-NEXT: ori r4, r4, 41712
; CHECK-P9-LE-NEXT: lbzx r3, r3, r4
; CHECK-P9-LE-NEXT: extsb r3, r3
; CHECK-P9-LE-NEXT: blr
;
; CHECK-P9-BE-LABEL: ld_disjoint_align32_int8_t_uint64_t:
; CHECK-P9-BE: # %bb.0: # %entry
; CHECK-P9-BE-NEXT: lis r4, -15264
; CHECK-P9-BE-NEXT: and r3, r3, r4
; CHECK-P9-BE-NEXT: lis r4, 15258
; CHECK-P9-BE-NEXT: ori r4, r4, 41719
; CHECK-P9-BE-NEXT: lbzx r3, r3, r4
; CHECK-P9-BE-NEXT: extsb r3, r3
; CHECK-P9-BE-NEXT: blr
;
; CHECK-P8-LE-LABEL: ld_disjoint_align32_int8_t_uint64_t:
; CHECK-P8-LE: # %bb.0: # %entry
; CHECK-P8-LE-NEXT: lis r4, -15264
; CHECK-P8-LE-NEXT: lis r5, 15258
; CHECK-P8-LE-NEXT: and r3, r3, r4
; CHECK-P8-LE-NEXT: ori r4, r5, 41712
; CHECK-P8-LE-NEXT: lbzx r3, r3, r4
; CHECK-P8-LE-NEXT: extsb r3, r3
; CHECK-P8-LE-NEXT: blr
;
; CHECK-P8-BE-LABEL: ld_disjoint_align32_int8_t_uint64_t:
; CHECK-P8-BE: # %bb.0: # %entry
; CHECK-P8-BE-NEXT: lis r4, -15264
; CHECK-P8-BE-NEXT: lis r5, 15258
; CHECK-P8-BE-NEXT: and r3, r3, r4
; CHECK-P8-BE-NEXT: ori r4, r5, 41719
; CHECK-P8-BE-NEXT: lbzx r3, r3, r4
; CHECK-P8-BE-NEXT: extsb r3, r3
; CHECK-P8-BE-NEXT: blr
entry:
%and = and i64 %ptr, -1000341504
%or = or i64 %and, 999990000
%0 = inttoptr i64 %or to i64*
%1 = load i64, i64* %0, align 16
%conv = trunc i64 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_not_disjoint64_int8_t_uint64_t(i64 %ptr) {
; CHECK-P10-LE-LABEL: ld_not_disjoint64_int8_t_uint64_t:
; CHECK-P10-LE: # %bb.0: # %entry
; CHECK-P10-LE-NEXT: pli r4, 232
; CHECK-P10-LE-NEXT: pli r5, 3567587329
; CHECK-P10-LE-NEXT: rldimi r5, r4, 32, 0
; CHECK-P10-LE-NEXT: or r3, r3, r5
; CHECK-P10-LE-NEXT: lbz r3, 0(r3)
; CHECK-P10-LE-NEXT: extsb r3, r3
; CHECK-P10-LE-NEXT: blr
;
; CHECK-P10-BE-LABEL: ld_not_disjoint64_int8_t_uint64_t:
; CHECK-P10-BE: # %bb.0: # %entry
; CHECK-P10-BE-NEXT: pli r4, 232
; CHECK-P10-BE-NEXT: pli r5, 3567587329
; CHECK-P10-BE-NEXT: rldimi r5, r4, 32, 0
; CHECK-P10-BE-NEXT: or r3, r3, r5
; CHECK-P10-BE-NEXT: lbz r3, 7(r3)
; CHECK-P10-BE-NEXT: extsb r3, r3
; CHECK-P10-BE-NEXT: blr
;
; CHECK-P9-LE-LABEL: ld_not_disjoint64_int8_t_uint64_t:
; CHECK-P9-LE: # %bb.0: # %entry
; CHECK-P9-LE-NEXT: li r4, 29
; CHECK-P9-LE-NEXT: rldic r4, r4, 35, 24
; CHECK-P9-LE-NEXT: oris r4, r4, 54437
; CHECK-P9-LE-NEXT: ori r4, r4, 4097
; CHECK-P9-LE-NEXT: or r3, r3, r4
; CHECK-P9-LE-NEXT: lbz r3, 0(r3)
; CHECK-P9-LE-NEXT: extsb r3, r3
; CHECK-P9-LE-NEXT: blr
;
; CHECK-P9-BE-LABEL: ld_not_disjoint64_int8_t_uint64_t:
; CHECK-P9-BE: # %bb.0: # %entry
; CHECK-P9-BE-NEXT: li r4, 29
; CHECK-P9-BE-NEXT: rldic r4, r4, 35, 24
; CHECK-P9-BE-NEXT: oris r4, r4, 54437
; CHECK-P9-BE-NEXT: ori r4, r4, 4097
; CHECK-P9-BE-NEXT: or r3, r3, r4
; CHECK-P9-BE-NEXT: lbz r3, 7(r3)
; CHECK-P9-BE-NEXT: extsb r3, r3
; CHECK-P9-BE-NEXT: blr
;
; CHECK-P8-LE-LABEL: ld_not_disjoint64_int8_t_uint64_t:
; CHECK-P8-LE: # %bb.0: # %entry
; CHECK-P8-LE-NEXT: li r4, 29
; CHECK-P8-LE-NEXT: rldic r4, r4, 35, 24
; CHECK-P8-LE-NEXT: oris r4, r4, 54437
; CHECK-P8-LE-NEXT: ori r4, r4, 4097
; CHECK-P8-LE-NEXT: or r3, r3, r4
; CHECK-P8-LE-NEXT: lbz r3, 0(r3)
; CHECK-P8-LE-NEXT: extsb r3, r3
; CHECK-P8-LE-NEXT: blr
;
; CHECK-P8-BE-LABEL: ld_not_disjoint64_int8_t_uint64_t:
; CHECK-P8-BE: # %bb.0: # %entry
; CHECK-P8-BE-NEXT: li r4, 29
; CHECK-P8-BE-NEXT: rldic r4, r4, 35, 24
; CHECK-P8-BE-NEXT: oris r4, r4, 54437
; CHECK-P8-BE-NEXT: ori r4, r4, 4097
; CHECK-P8-BE-NEXT: or r3, r3, r4
; CHECK-P8-BE-NEXT: lbz r3, 7(r3)
; CHECK-P8-BE-NEXT: extsb r3, r3
; CHECK-P8-BE-NEXT: blr
entry:
%or = or i64 %ptr, 1000000000001
%0 = inttoptr i64 %or to i64*
%1 = load i64, i64* %0, align 8
%conv = trunc i64 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_disjoint_align64_int8_t_uint64_t(i64 %ptr) {
; CHECK-P10-LE-LABEL: ld_disjoint_align64_int8_t_uint64_t:
; CHECK-P10-LE: # %bb.0: # %entry
; CHECK-P10-LE-NEXT: pli r4, 244140625
; CHECK-P10-LE-NEXT: rldicr r3, r3, 0, 23
; CHECK-P10-LE-NEXT: rldic r4, r4, 12, 24
; CHECK-P10-LE-NEXT: lbzx r3, r3, r4
; CHECK-P10-LE-NEXT: extsb r3, r3
; CHECK-P10-LE-NEXT: blr
;
; CHECK-P10-BE-LABEL: ld_disjoint_align64_int8_t_uint64_t:
; CHECK-P10-BE: # %bb.0: # %entry
; CHECK-P10-BE-NEXT: pli r4, 232
; CHECK-P10-BE-NEXT: pli r5, 3567587335
; CHECK-P10-BE-NEXT: rldicr r3, r3, 0, 23
; CHECK-P10-BE-NEXT: rldimi r5, r4, 32, 0
; CHECK-P10-BE-NEXT: lbzx r3, r3, r5
; CHECK-P10-BE-NEXT: extsb r3, r3
; CHECK-P10-BE-NEXT: blr
;
; CHECK-P9-LE-LABEL: ld_disjoint_align64_int8_t_uint64_t:
; CHECK-P9-LE: # %bb.0: # %entry
; CHECK-P9-LE-NEXT: lis r4, 3725
; CHECK-P9-LE-NEXT: rldicr r3, r3, 0, 23
; CHECK-P9-LE-NEXT: ori r4, r4, 19025
; CHECK-P9-LE-NEXT: rldic r4, r4, 12, 24
; CHECK-P9-LE-NEXT: lbzx r3, r3, r4
; CHECK-P9-LE-NEXT: extsb r3, r3
; CHECK-P9-LE-NEXT: blr
;
; CHECK-P9-BE-LABEL: ld_disjoint_align64_int8_t_uint64_t:
; CHECK-P9-BE: # %bb.0: # %entry
; CHECK-P9-BE-NEXT: li r4, 29
; CHECK-P9-BE-NEXT: rldicr r3, r3, 0, 23
; CHECK-P9-BE-NEXT: rldic r4, r4, 35, 24
; CHECK-P9-BE-NEXT: oris r4, r4, 54437
; CHECK-P9-BE-NEXT: ori r4, r4, 4103
; CHECK-P9-BE-NEXT: lbzx r3, r3, r4
; CHECK-P9-BE-NEXT: extsb r3, r3
; CHECK-P9-BE-NEXT: blr
;
; CHECK-P8-LE-LABEL: ld_disjoint_align64_int8_t_uint64_t:
; CHECK-P8-LE: # %bb.0: # %entry
; CHECK-P8-LE-NEXT: lis r4, 3725
; CHECK-P8-LE-NEXT: rldicr r3, r3, 0, 23
; CHECK-P8-LE-NEXT: ori r4, r4, 19025
; CHECK-P8-LE-NEXT: rldic r4, r4, 12, 24
; CHECK-P8-LE-NEXT: lbzx r3, r3, r4
; CHECK-P8-LE-NEXT: extsb r3, r3
; CHECK-P8-LE-NEXT: blr
;
; CHECK-P8-BE-LABEL: ld_disjoint_align64_int8_t_uint64_t:
; CHECK-P8-BE: # %bb.0: # %entry
; CHECK-P8-BE-NEXT: li r4, 29
; CHECK-P8-BE-NEXT: rldicr r3, r3, 0, 23
; CHECK-P8-BE-NEXT: rldic r4, r4, 35, 24
; CHECK-P8-BE-NEXT: oris r4, r4, 54437
; CHECK-P8-BE-NEXT: ori r4, r4, 4103
; CHECK-P8-BE-NEXT: lbzx r3, r3, r4
; CHECK-P8-BE-NEXT: extsb r3, r3
; CHECK-P8-BE-NEXT: blr
entry:
%and = and i64 %ptr, -1099511627776
%or = or i64 %and, 1000000000000
%0 = inttoptr i64 %or to i64*
%1 = load i64, i64* %0, align 4096
%conv = trunc i64 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_cst_align16_int8_t_uint64_t() {
; CHECK-LE-LABEL: ld_cst_align16_int8_t_uint64_t:
; CHECK-LE: # %bb.0: # %entry
; CHECK-LE-NEXT: lbz r3, 4080(0)
; CHECK-LE-NEXT: extsb r3, r3
; CHECK-LE-NEXT: blr
;
; CHECK-BE-LABEL: ld_cst_align16_int8_t_uint64_t:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: lbz r3, 4087(0)
; CHECK-BE-NEXT: extsb r3, r3
; CHECK-BE-NEXT: blr
entry:
%0 = load i64, i64* inttoptr (i64 4080 to i64*), align 16
%conv = trunc i64 %0 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_cst_align32_int8_t_uint64_t() {
; CHECK-LE-LABEL: ld_cst_align32_int8_t_uint64_t:
; CHECK-LE: # %bb.0: # %entry
; CHECK-LE-NEXT: lis r3, 153
; CHECK-LE-NEXT: lbz r3, -27108(r3)
; CHECK-LE-NEXT: extsb r3, r3
; CHECK-LE-NEXT: blr
;
; CHECK-BE-LABEL: ld_cst_align32_int8_t_uint64_t:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: lis r3, 153
; CHECK-BE-NEXT: lbz r3, -27101(r3)
; CHECK-BE-NEXT: extsb r3, r3
; CHECK-BE-NEXT: blr
entry:
%0 = load i64, i64* inttoptr (i64 9999900 to i64*), align 8
%conv = trunc i64 %0 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_cst_align64_int8_t_uint64_t() {
; CHECK-P10-LE-LABEL: ld_cst_align64_int8_t_uint64_t:
; CHECK-P10-LE: # %bb.0: # %entry
; CHECK-P10-LE-NEXT: pli r3, 244140625
; CHECK-P10-LE-NEXT: rldic r3, r3, 12, 24
; CHECK-P10-LE-NEXT: lbz r3, 0(r3)
; CHECK-P10-LE-NEXT: extsb r3, r3
; CHECK-P10-LE-NEXT: blr
;
; CHECK-P10-BE-LABEL: ld_cst_align64_int8_t_uint64_t:
; CHECK-P10-BE: # %bb.0: # %entry
; CHECK-P10-BE-NEXT: pli r3, 232
; CHECK-P10-BE-NEXT: pli r4, 3567587335
; CHECK-P10-BE-NEXT: rldimi r4, r3, 32, 0
; CHECK-P10-BE-NEXT: lbz r3, 0(r4)
; CHECK-P10-BE-NEXT: extsb r3, r3
; CHECK-P10-BE-NEXT: blr
;
; CHECK-P9-LE-LABEL: ld_cst_align64_int8_t_uint64_t:
; CHECK-P9-LE: # %bb.0: # %entry
; CHECK-P9-LE-NEXT: lis r3, 3725
; CHECK-P9-LE-NEXT: ori r3, r3, 19025
; CHECK-P9-LE-NEXT: rldic r3, r3, 12, 24
; CHECK-P9-LE-NEXT: lbz r3, 0(r3)
; CHECK-P9-LE-NEXT: extsb r3, r3
; CHECK-P9-LE-NEXT: blr
;
; CHECK-P9-BE-LABEL: ld_cst_align64_int8_t_uint64_t:
; CHECK-P9-BE: # %bb.0: # %entry
; CHECK-P9-BE-NEXT: li r3, 29
; CHECK-P9-BE-NEXT: rldic r3, r3, 35, 24
; CHECK-P9-BE-NEXT: oris r3, r3, 54437
; CHECK-P9-BE-NEXT: ori r3, r3, 4103
; CHECK-P9-BE-NEXT: lbz r3, 0(r3)
; CHECK-P9-BE-NEXT: extsb r3, r3
; CHECK-P9-BE-NEXT: blr
;
; CHECK-P8-LE-LABEL: ld_cst_align64_int8_t_uint64_t:
; CHECK-P8-LE: # %bb.0: # %entry
; CHECK-P8-LE-NEXT: lis r3, 3725
; CHECK-P8-LE-NEXT: ori r3, r3, 19025
; CHECK-P8-LE-NEXT: rldic r3, r3, 12, 24
; CHECK-P8-LE-NEXT: lbz r3, 0(r3)
; CHECK-P8-LE-NEXT: extsb r3, r3
; CHECK-P8-LE-NEXT: blr
;
; CHECK-P8-BE-LABEL: ld_cst_align64_int8_t_uint64_t:
; CHECK-P8-BE: # %bb.0: # %entry
; CHECK-P8-BE-NEXT: li r3, 29
; CHECK-P8-BE-NEXT: rldic r3, r3, 35, 24
; CHECK-P8-BE-NEXT: oris r3, r3, 54437
; CHECK-P8-BE-NEXT: ori r3, r3, 4103
; CHECK-P8-BE-NEXT: lbz r3, 0(r3)
; CHECK-P8-BE-NEXT: extsb r3, r3
; CHECK-P8-BE-NEXT: blr
entry:
%0 = load i64, i64* inttoptr (i64 1000000000000 to i64*), align 4096
%conv = trunc i64 %0 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_0_int8_t_float(i64 %ptr) {
; CHECK-LABEL: ld_0_int8_t_float:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lfs f0, 0(r3)
; CHECK-NEXT: xscvdpsxws f0, f0
; CHECK-NEXT: mffprwz r3, f0
; CHECK-NEXT: extsw r3, r3
; CHECK-NEXT: blr
entry:
%0 = inttoptr i64 %ptr to float*
%1 = load float, float* %0, align 4
%conv = fptosi float %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_align16_int8_t_float(i8* nocapture readonly %ptr) {
; CHECK-LABEL: ld_align16_int8_t_float:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lfs f0, 8(r3)
; CHECK-NEXT: xscvdpsxws f0, f0
; CHECK-NEXT: mffprwz r3, f0
; CHECK-NEXT: extsw r3, r3
; CHECK-NEXT: blr
entry:
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 8
%0 = bitcast i8* %add.ptr to float*
%1 = load float, float* %0, align 4
%conv = fptosi float %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_align32_int8_t_float(i8* nocapture readonly %ptr) {
; CHECK-P10-LABEL: ld_align32_int8_t_float:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r4, 99999000
; CHECK-P10-NEXT: lfsx f0, r3, r4
; CHECK-P10-NEXT: xscvdpsxws f0, f0
; CHECK-P10-NEXT: mffprwz r3, f0
; CHECK-P10-NEXT: extsw r3, r3
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_align32_int8_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: xscvdpsxws f0, f0
; CHECK-PREP10-NEXT: mffprwz r3, f0
; CHECK-PREP10-NEXT: extsw r3, r3
; 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 i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_align64_int8_t_float(i8* nocapture readonly %ptr) {
; CHECK-P10-LABEL: ld_align64_int8_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: xscvdpsxws f0, f0
; CHECK-P10-NEXT: mffprwz r3, f0
; CHECK-P10-NEXT: extsw r3, r3
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_align64_int8_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: xscvdpsxws f0, f0
; CHECK-PREP10-NEXT: mffprwz r3, f0
; CHECK-PREP10-NEXT: extsw r3, r3
; 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 i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_reg_int8_t_float(i8* nocapture readonly %ptr, i64 %off) {
; CHECK-LABEL: ld_reg_int8_t_float:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lfsx f0, r3, r4
; CHECK-NEXT: xscvdpsxws f0, f0
; CHECK-NEXT: mffprwz r3, f0
; CHECK-NEXT: extsw r3, r3
; 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 i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_or_int8_t_float(i64 %ptr, i8 zeroext %off) {
; CHECK-LABEL: ld_or_int8_t_float:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: or r3, r4, r3
; CHECK-NEXT: lfs f0, 0(r3)
; CHECK-NEXT: xscvdpsxws f0, f0
; CHECK-NEXT: mffprwz r3, f0
; CHECK-NEXT: extsw r3, r3
; CHECK-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 i8
ret i8 %conv1
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_not_disjoint16_int8_t_float(i64 %ptr) {
; CHECK-LABEL: ld_not_disjoint16_int8_t_float:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: ori r3, r3, 6
; CHECK-NEXT: lfs f0, 0(r3)
; CHECK-NEXT: xscvdpsxws f0, f0
; CHECK-NEXT: mffprwz r3, f0
; CHECK-NEXT: extsw r3, r3
; CHECK-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 i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_disjoint_align16_int8_t_float(i64 %ptr) {
; CHECK-LABEL: ld_disjoint_align16_int8_t_float:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: rldicr r3, r3, 0, 51
; CHECK-NEXT: lfs f0, 24(r3)
; CHECK-NEXT: xscvdpsxws f0, f0
; CHECK-NEXT: mffprwz r3, f0
; CHECK-NEXT: extsw r3, r3
; CHECK-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 i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_not_disjoint32_int8_t_float(i64 %ptr) {
; CHECK-LABEL: ld_not_disjoint32_int8_t_float:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: ori r3, r3, 34463
; CHECK-NEXT: oris r3, r3, 1
; CHECK-NEXT: lfs f0, 0(r3)
; CHECK-NEXT: xscvdpsxws f0, f0
; CHECK-NEXT: mffprwz r3, f0
; CHECK-NEXT: extsw r3, r3
; CHECK-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 i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_disjoint_align32_int8_t_float(i64 %ptr) {
; CHECK-P10-LABEL: ld_disjoint_align32_int8_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: xscvdpsxws f0, f0
; CHECK-P10-NEXT: mffprwz r3, f0
; CHECK-P10-NEXT: extsw r3, r3
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: ld_disjoint_align32_int8_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: xscvdpsxws f0, f0
; CHECK-P9-NEXT: mffprwz r3, f0
; CHECK-P9-NEXT: extsw r3, r3
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: ld_disjoint_align32_int8_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: xscvdpsxws f0, f0
; CHECK-P8-NEXT: mffprwz r3, f0
; CHECK-P8-NEXT: extsw r3, r3
; 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 i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_not_disjoint64_int8_t_float(i64 %ptr) {
; CHECK-P10-LABEL: ld_not_disjoint64_int8_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: xscvdpsxws f0, f0
; CHECK-P10-NEXT: mffprwz r3, f0
; CHECK-P10-NEXT: extsw r3, r3
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_not_disjoint64_int8_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: or r3, r3, r4
; CHECK-PREP10-NEXT: lfs f0, 0(r3)
; CHECK-PREP10-NEXT: xscvdpsxws f0, f0
; CHECK-PREP10-NEXT: mffprwz r3, f0
; CHECK-PREP10-NEXT: extsw r3, r3
; CHECK-PREP10-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 i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_disjoint_align64_int8_t_float(i64 %ptr) {
; CHECK-P10-LABEL: ld_disjoint_align64_int8_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: xscvdpsxws f0, f0
; CHECK-P10-NEXT: mffprwz r3, f0
; CHECK-P10-NEXT: extsw r3, r3
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_disjoint_align64_int8_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: xscvdpsxws f0, f0
; CHECK-PREP10-NEXT: mffprwz r3, f0
; CHECK-PREP10-NEXT: extsw r3, r3
; 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 i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_cst_align16_int8_t_float() {
; CHECK-LABEL: ld_cst_align16_int8_t_float:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lfs f0, 4080(0)
; CHECK-NEXT: xscvdpsxws f0, f0
; CHECK-NEXT: mffprwz r3, f0
; CHECK-NEXT: extsw r3, r3
; CHECK-NEXT: blr
entry:
%0 = load float, float* inttoptr (i64 4080 to float*), align 16
%conv = fptosi float %0 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_cst_align32_int8_t_float() {
; CHECK-LABEL: ld_cst_align32_int8_t_float:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lis r3, 153
; CHECK-NEXT: lfs f0, -27108(r3)
; CHECK-NEXT: xscvdpsxws f0, f0
; CHECK-NEXT: mffprwz r3, f0
; CHECK-NEXT: extsw r3, r3
; CHECK-NEXT: blr
entry:
%0 = load float, float* inttoptr (i64 9999900 to float*), align 4
%conv = fptosi float %0 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_cst_align64_int8_t_float() {
; CHECK-P10-LABEL: ld_cst_align64_int8_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: xscvdpsxws f0, f0
; CHECK-P10-NEXT: mffprwz r3, f0
; CHECK-P10-NEXT: extsw r3, r3
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_cst_align64_int8_t_float:
; 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: lfs f0, 0(r3)
; CHECK-PREP10-NEXT: xscvdpsxws f0, f0
; CHECK-PREP10-NEXT: mffprwz r3, f0
; CHECK-PREP10-NEXT: extsw r3, r3
; CHECK-PREP10-NEXT: blr
entry:
%0 = load float, float* inttoptr (i64 1000000000000 to float*), align 4096
%conv = fptosi float %0 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_0_int8_t_double(i64 %ptr) {
; CHECK-LABEL: ld_0_int8_t_double:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lfd f0, 0(r3)
; CHECK-NEXT: xscvdpsxws f0, f0
; CHECK-NEXT: mffprwz r3, f0
; CHECK-NEXT: extsw r3, r3
; CHECK-NEXT: blr
entry:
%0 = inttoptr i64 %ptr to double*
%1 = load double, double* %0, align 8
%conv = fptosi double %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_align16_int8_t_double(i8* nocapture readonly %ptr) {
; CHECK-LABEL: ld_align16_int8_t_double:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lfd f0, 8(r3)
; CHECK-NEXT: xscvdpsxws f0, f0
; CHECK-NEXT: mffprwz r3, f0
; CHECK-NEXT: extsw r3, r3
; 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 i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_align32_int8_t_double(i8* nocapture readonly %ptr) {
; CHECK-P10-LABEL: ld_align32_int8_t_double:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r4, 99999000
; CHECK-P10-NEXT: lfdx f0, r3, r4
; CHECK-P10-NEXT: xscvdpsxws f0, f0
; CHECK-P10-NEXT: mffprwz r3, f0
; CHECK-P10-NEXT: extsw r3, r3
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_align32_int8_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: xscvdpsxws f0, f0
; CHECK-PREP10-NEXT: mffprwz r3, f0
; CHECK-PREP10-NEXT: extsw r3, r3
; 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 i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_align64_int8_t_double(i8* nocapture readonly %ptr) {
; CHECK-P10-LABEL: ld_align64_int8_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: xscvdpsxws f0, f0
; CHECK-P10-NEXT: mffprwz r3, f0
; CHECK-P10-NEXT: extsw r3, r3
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_align64_int8_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: xscvdpsxws f0, f0
; CHECK-PREP10-NEXT: mffprwz r3, f0
; CHECK-PREP10-NEXT: extsw r3, r3
; 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 i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_reg_int8_t_double(i8* nocapture readonly %ptr, i64 %off) {
; CHECK-LABEL: ld_reg_int8_t_double:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lfdx f0, r3, r4
; CHECK-NEXT: xscvdpsxws f0, f0
; CHECK-NEXT: mffprwz r3, f0
; CHECK-NEXT: extsw r3, r3
; 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 i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_or_int8_t_double(i64 %ptr, i8 zeroext %off) {
; CHECK-LABEL: ld_or_int8_t_double:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: or r3, r4, r3
; CHECK-NEXT: lfd f0, 0(r3)
; CHECK-NEXT: xscvdpsxws f0, f0
; CHECK-NEXT: mffprwz r3, f0
; CHECK-NEXT: extsw r3, r3
; CHECK-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 i8
ret i8 %conv1
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_not_disjoint16_int8_t_double(i64 %ptr) {
; CHECK-LABEL: ld_not_disjoint16_int8_t_double:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: ori r3, r3, 6
; CHECK-NEXT: lfd f0, 0(r3)
; CHECK-NEXT: xscvdpsxws f0, f0
; CHECK-NEXT: mffprwz r3, f0
; CHECK-NEXT: extsw r3, r3
; CHECK-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 i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_disjoint_align16_int8_t_double(i64 %ptr) {
; CHECK-LABEL: ld_disjoint_align16_int8_t_double:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: rldicr r3, r3, 0, 51
; CHECK-NEXT: lfd f0, 24(r3)
; CHECK-NEXT: xscvdpsxws f0, f0
; CHECK-NEXT: mffprwz r3, f0
; CHECK-NEXT: extsw r3, r3
; CHECK-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 i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_not_disjoint32_int8_t_double(i64 %ptr) {
; CHECK-LABEL: ld_not_disjoint32_int8_t_double:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: ori r3, r3, 34463
; CHECK-NEXT: oris r3, r3, 1
; CHECK-NEXT: lfd f0, 0(r3)
; CHECK-NEXT: xscvdpsxws f0, f0
; CHECK-NEXT: mffprwz r3, f0
; CHECK-NEXT: extsw r3, r3
; CHECK-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 i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_disjoint_align32_int8_t_double(i64 %ptr) {
; CHECK-P10-LABEL: ld_disjoint_align32_int8_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: xscvdpsxws f0, f0
; CHECK-P10-NEXT: mffprwz r3, f0
; CHECK-P10-NEXT: extsw r3, r3
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: ld_disjoint_align32_int8_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: xscvdpsxws f0, f0
; CHECK-P9-NEXT: mffprwz r3, f0
; CHECK-P9-NEXT: extsw r3, r3
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: ld_disjoint_align32_int8_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: xscvdpsxws f0, f0
; CHECK-P8-NEXT: mffprwz r3, f0
; CHECK-P8-NEXT: extsw r3, r3
; 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 i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_not_disjoint64_int8_t_double(i64 %ptr) {
; CHECK-P10-LABEL: ld_not_disjoint64_int8_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: xscvdpsxws f0, f0
; CHECK-P10-NEXT: mffprwz r3, f0
; CHECK-P10-NEXT: extsw r3, r3
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_not_disjoint64_int8_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: or r3, r3, r4
; CHECK-PREP10-NEXT: lfd f0, 0(r3)
; CHECK-PREP10-NEXT: xscvdpsxws f0, f0
; CHECK-PREP10-NEXT: mffprwz r3, f0
; CHECK-PREP10-NEXT: extsw r3, r3
; CHECK-PREP10-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 i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_disjoint_align64_int8_t_double(i64 %ptr) {
; CHECK-P10-LABEL: ld_disjoint_align64_int8_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: xscvdpsxws f0, f0
; CHECK-P10-NEXT: mffprwz r3, f0
; CHECK-P10-NEXT: extsw r3, r3
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_disjoint_align64_int8_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: xscvdpsxws f0, f0
; CHECK-PREP10-NEXT: mffprwz r3, f0
; CHECK-PREP10-NEXT: extsw r3, r3
; 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 i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_cst_align16_int8_t_double() {
; CHECK-LABEL: ld_cst_align16_int8_t_double:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lfd f0, 4080(0)
; CHECK-NEXT: xscvdpsxws f0, f0
; CHECK-NEXT: mffprwz r3, f0
; CHECK-NEXT: extsw r3, r3
; CHECK-NEXT: blr
entry:
%0 = load double, double* inttoptr (i64 4080 to double*), align 16
%conv = fptosi double %0 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_cst_align32_int8_t_double() {
; CHECK-LABEL: ld_cst_align32_int8_t_double:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lis r3, 153
; CHECK-NEXT: lfd f0, -27108(r3)
; CHECK-NEXT: xscvdpsxws f0, f0
; CHECK-NEXT: mffprwz r3, f0
; CHECK-NEXT: extsw r3, r3
; CHECK-NEXT: blr
entry:
%0 = load double, double* inttoptr (i64 9999900 to double*), align 8
%conv = fptosi double %0 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local signext i8 @ld_cst_align64_int8_t_double() {
; CHECK-P10-LABEL: ld_cst_align64_int8_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: xscvdpsxws f0, f0
; CHECK-P10-NEXT: mffprwz r3, f0
; CHECK-P10-NEXT: extsw r3, r3
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_cst_align64_int8_t_double:
; 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: lfd f0, 0(r3)
; CHECK-PREP10-NEXT: xscvdpsxws f0, f0
; CHECK-PREP10-NEXT: mffprwz r3, f0
; CHECK-PREP10-NEXT: extsw r3, r3
; CHECK-PREP10-NEXT: blr
entry:
%0 = load double, double* inttoptr (i64 1000000000000 to double*), align 4096
%conv = fptosi double %0 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_0_uint8_t_uint8_t(i64 %ptr) {
; CHECK-LABEL: ld_0_uint8_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
ret i8 %1
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_align16_uint8_t_uint8_t(i8* nocapture readonly %ptr) {
; CHECK-LABEL: ld_align16_uint8_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
ret i8 %0
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_align32_uint8_t_uint8_t(i8* nocapture readonly %ptr) {
; CHECK-P10-LABEL: ld_align32_uint8_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_uint8_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
ret i8 %0
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_unalign64_uint8_t_uint8_t(i8* nocapture readonly %ptr) {
; CHECK-P10-LABEL: ld_unalign64_uint8_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_uint8_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
ret i8 %0
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_align64_uint8_t_uint8_t(i8* nocapture readonly %ptr) {
; CHECK-P10-LABEL: ld_align64_uint8_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_uint8_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
ret i8 %0
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_reg_uint8_t_uint8_t(i8* nocapture readonly %ptr, i64 %off) {
; CHECK-LABEL: ld_reg_uint8_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
ret i8 %0
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_or_uint8_t_uint8_t(i64 %ptr, i8 zeroext %off) {
; CHECK-LABEL: ld_or_uint8_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
ret i8 %1
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_not_disjoint16_uint8_t_uint8_t(i64 %ptr) {
; CHECK-LABEL: ld_not_disjoint16_uint8_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
ret i8 %1
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_disjoint_align16_uint8_t_uint8_t(i64 %ptr) {
; CHECK-LABEL: ld_disjoint_align16_uint8_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
ret i8 %1
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_not_disjoint32_uint8_t_uint8_t(i64 %ptr) {
; CHECK-LABEL: ld_not_disjoint32_uint8_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
ret i8 %1
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_disjoint_align32_uint8_t_uint8_t(i64 %ptr) {
; CHECK-P10-LABEL: ld_disjoint_align32_uint8_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_uint8_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_uint8_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
ret i8 %1
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_not_disjoint64_uint8_t_uint8_t(i64 %ptr) {
; CHECK-P10-LABEL: ld_not_disjoint64_uint8_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_uint8_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
ret i8 %1
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_disjoint_unalign64_uint8_t_uint8_t(i64 %ptr) {
; CHECK-P10-LABEL: ld_disjoint_unalign64_uint8_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_uint8_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
ret i8 %1
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_disjoint_align64_uint8_t_uint8_t(i64 %ptr) {
; CHECK-P10-LABEL: ld_disjoint_align64_uint8_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_uint8_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
ret i8 %1
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_cst_align16_uint8_t_uint8_t() {
; CHECK-LABEL: ld_cst_align16_uint8_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
ret i8 %0
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_cst_align32_uint8_t_uint8_t() {
; CHECK-LABEL: ld_cst_align32_uint8_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
ret i8 %0
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_cst_unalign64_uint8_t_uint8_t() {
; CHECK-P10-LABEL: ld_cst_unalign64_uint8_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_uint8_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
ret i8 %0
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_cst_align64_uint8_t_uint8_t() {
; CHECK-P10-LABEL: ld_cst_align64_uint8_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_uint8_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
ret i8 %0
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_0_uint8_t_uint16_t(i64 %ptr) {
; CHECK-LE-LABEL: ld_0_uint8_t_uint16_t:
; CHECK-LE: # %bb.0: # %entry
; CHECK-LE-NEXT: lbz r3, 0(r3)
; CHECK-LE-NEXT: blr
;
; CHECK-BE-LABEL: ld_0_uint8_t_uint16_t:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: lbz r3, 1(r3)
; CHECK-BE-NEXT: blr
entry:
%0 = inttoptr i64 %ptr to i16*
%1 = load i16, i16* %0, align 2
%conv = trunc i16 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_align16_uint8_t_uint16_t(i8* nocapture readonly %ptr) {
; CHECK-LE-LABEL: ld_align16_uint8_t_uint16_t:
; CHECK-LE: # %bb.0: # %entry
; CHECK-LE-NEXT: lbz r3, 8(r3)
; CHECK-LE-NEXT: blr
;
; CHECK-BE-LABEL: ld_align16_uint8_t_uint16_t:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: lbz r3, 9(r3)
; CHECK-BE-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 = trunc i16 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_align32_uint8_t_uint16_t(i8* nocapture readonly %ptr) {
; CHECK-P10-LE-LABEL: ld_align32_uint8_t_uint16_t:
; CHECK-P10-LE: # %bb.0: # %entry
; CHECK-P10-LE-NEXT: pli r4, 99999000
; CHECK-P10-LE-NEXT: lbzx r3, r3, r4
; CHECK-P10-LE-NEXT: blr
;
; CHECK-P10-BE-LABEL: ld_align32_uint8_t_uint16_t:
; CHECK-P10-BE: # %bb.0: # %entry
; CHECK-P10-BE-NEXT: pli r4, 99999001
; CHECK-P10-BE-NEXT: lbzx r3, r3, r4
; CHECK-P10-BE-NEXT: blr
;
; CHECK-P9-LE-LABEL: ld_align32_uint8_t_uint16_t:
; CHECK-P9-LE: # %bb.0: # %entry
; CHECK-P9-LE-NEXT: lis r4, 1525
; CHECK-P9-LE-NEXT: ori r4, r4, 56600
; CHECK-P9-LE-NEXT: lbzx r3, r3, r4
; CHECK-P9-LE-NEXT: blr
;
; CHECK-P9-BE-LABEL: ld_align32_uint8_t_uint16_t:
; CHECK-P9-BE: # %bb.0: # %entry
; CHECK-P9-BE-NEXT: lis r4, 1525
; CHECK-P9-BE-NEXT: ori r4, r4, 56601
; CHECK-P9-BE-NEXT: lbzx r3, r3, r4
; CHECK-P9-BE-NEXT: blr
;
; CHECK-P8-LE-LABEL: ld_align32_uint8_t_uint16_t:
; CHECK-P8-LE: # %bb.0: # %entry
; CHECK-P8-LE-NEXT: lis r4, 1525
; CHECK-P8-LE-NEXT: ori r4, r4, 56600
; CHECK-P8-LE-NEXT: lbzx r3, r3, r4
; CHECK-P8-LE-NEXT: blr
;
; CHECK-P8-BE-LABEL: ld_align32_uint8_t_uint16_t:
; CHECK-P8-BE: # %bb.0: # %entry
; CHECK-P8-BE-NEXT: lis r4, 1525
; CHECK-P8-BE-NEXT: ori r4, r4, 56601
; CHECK-P8-BE-NEXT: lbzx r3, r3, r4
; CHECK-P8-BE-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 = trunc i16 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_unalign64_uint8_t_uint16_t(i8* nocapture readonly %ptr) {
; CHECK-P10-LE-LABEL: ld_unalign64_uint8_t_uint16_t:
; CHECK-P10-LE: # %bb.0: # %entry
; CHECK-P10-LE-NEXT: pli r4, 232
; CHECK-P10-LE-NEXT: pli r5, 3567587329
; CHECK-P10-LE-NEXT: rldimi r5, r4, 32, 0
; CHECK-P10-LE-NEXT: lbzx r3, r3, r5
; CHECK-P10-LE-NEXT: blr
;
; CHECK-P10-BE-LABEL: ld_unalign64_uint8_t_uint16_t:
; CHECK-P10-BE: # %bb.0: # %entry
; CHECK-P10-BE-NEXT: pli r4, 232
; CHECK-P10-BE-NEXT: pli r5, 3567587330
; CHECK-P10-BE-NEXT: rldimi r5, r4, 32, 0
; CHECK-P10-BE-NEXT: lbzx r3, r3, r5
; CHECK-P10-BE-NEXT: blr
;
; CHECK-P9-LE-LABEL: ld_unalign64_uint8_t_uint16_t:
; CHECK-P9-LE: # %bb.0: # %entry
; CHECK-P9-LE-NEXT: li r4, 29
; CHECK-P9-LE-NEXT: rldic r4, r4, 35, 24
; CHECK-P9-LE-NEXT: oris r4, r4, 54437
; CHECK-P9-LE-NEXT: ori r4, r4, 4097
; CHECK-P9-LE-NEXT: lbzx r3, r3, r4
; CHECK-P9-LE-NEXT: blr
;
; CHECK-P9-BE-LABEL: ld_unalign64_uint8_t_uint16_t:
; CHECK-P9-BE: # %bb.0: # %entry
; CHECK-P9-BE-NEXT: li r4, 29
; CHECK-P9-BE-NEXT: rldic r4, r4, 35, 24
; CHECK-P9-BE-NEXT: oris r4, r4, 54437
; CHECK-P9-BE-NEXT: ori r4, r4, 4098
; CHECK-P9-BE-NEXT: lbzx r3, r3, r4
; CHECK-P9-BE-NEXT: blr
;
; CHECK-P8-LE-LABEL: ld_unalign64_uint8_t_uint16_t:
; CHECK-P8-LE: # %bb.0: # %entry
; CHECK-P8-LE-NEXT: li r4, 29
; CHECK-P8-LE-NEXT: rldic r4, r4, 35, 24
; CHECK-P8-LE-NEXT: oris r4, r4, 54437
; CHECK-P8-LE-NEXT: ori r4, r4, 4097
; CHECK-P8-LE-NEXT: lbzx r3, r3, r4
; CHECK-P8-LE-NEXT: blr
;
; CHECK-P8-BE-LABEL: ld_unalign64_uint8_t_uint16_t:
; CHECK-P8-BE: # %bb.0: # %entry
; CHECK-P8-BE-NEXT: li r4, 29
; CHECK-P8-BE-NEXT: rldic r4, r4, 35, 24
; CHECK-P8-BE-NEXT: oris r4, r4, 54437
; CHECK-P8-BE-NEXT: ori r4, r4, 4098
; CHECK-P8-BE-NEXT: lbzx r3, r3, r4
; CHECK-P8-BE-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 = trunc i16 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_align64_uint8_t_uint16_t(i8* nocapture readonly %ptr) {
; CHECK-P10-LE-LABEL: ld_align64_uint8_t_uint16_t:
; CHECK-P10-LE: # %bb.0: # %entry
; CHECK-P10-LE-NEXT: pli r4, 244140625
; CHECK-P10-LE-NEXT: rldic r4, r4, 12, 24
; CHECK-P10-LE-NEXT: lbzx r3, r3, r4
; CHECK-P10-LE-NEXT: blr
;
; CHECK-P10-BE-LABEL: ld_align64_uint8_t_uint16_t:
; CHECK-P10-BE: # %bb.0: # %entry
; CHECK-P10-BE-NEXT: pli r4, 232
; CHECK-P10-BE-NEXT: pli r5, 3567587329
; CHECK-P10-BE-NEXT: rldimi r5, r4, 32, 0
; CHECK-P10-BE-NEXT: lbzx r3, r3, r5
; CHECK-P10-BE-NEXT: blr
;
; CHECK-P9-LE-LABEL: ld_align64_uint8_t_uint16_t:
; CHECK-P9-LE: # %bb.0: # %entry
; CHECK-P9-LE-NEXT: lis r4, 3725
; CHECK-P9-LE-NEXT: ori r4, r4, 19025
; CHECK-P9-LE-NEXT: rldic r4, r4, 12, 24
; CHECK-P9-LE-NEXT: lbzx r3, r3, r4
; CHECK-P9-LE-NEXT: blr
;
; CHECK-P9-BE-LABEL: ld_align64_uint8_t_uint16_t:
; CHECK-P9-BE: # %bb.0: # %entry
; CHECK-P9-BE-NEXT: li r4, 29
; CHECK-P9-BE-NEXT: rldic r4, r4, 35, 24
; CHECK-P9-BE-NEXT: oris r4, r4, 54437
; CHECK-P9-BE-NEXT: ori r4, r4, 4097
; CHECK-P9-BE-NEXT: lbzx r3, r3, r4
; CHECK-P9-BE-NEXT: blr
;
; CHECK-P8-LE-LABEL: ld_align64_uint8_t_uint16_t:
; CHECK-P8-LE: # %bb.0: # %entry
; CHECK-P8-LE-NEXT: lis r4, 3725
; CHECK-P8-LE-NEXT: ori r4, r4, 19025
; CHECK-P8-LE-NEXT: rldic r4, r4, 12, 24
; CHECK-P8-LE-NEXT: lbzx r3, r3, r4
; CHECK-P8-LE-NEXT: blr
;
; CHECK-P8-BE-LABEL: ld_align64_uint8_t_uint16_t:
; CHECK-P8-BE: # %bb.0: # %entry
; CHECK-P8-BE-NEXT: li r4, 29
; CHECK-P8-BE-NEXT: rldic r4, r4, 35, 24
; CHECK-P8-BE-NEXT: oris r4, r4, 54437
; CHECK-P8-BE-NEXT: ori r4, r4, 4097
; CHECK-P8-BE-NEXT: lbzx r3, r3, r4
; CHECK-P8-BE-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 = trunc i16 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_reg_uint8_t_uint16_t(i8* nocapture readonly %ptr, i64 %off) {
; CHECK-LE-LABEL: ld_reg_uint8_t_uint16_t:
; CHECK-LE: # %bb.0: # %entry
; CHECK-LE-NEXT: lbzx r3, r3, r4
; CHECK-LE-NEXT: blr
;
; CHECK-BE-LABEL: ld_reg_uint8_t_uint16_t:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: add r3, r3, r4
; CHECK-BE-NEXT: lbz r3, 1(r3)
; CHECK-BE-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 = trunc i16 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_or_uint8_t_uint16_t(i64 %ptr, i8 zeroext %off) {
; CHECK-LE-LABEL: ld_or_uint8_t_uint16_t:
; CHECK-LE: # %bb.0: # %entry
; CHECK-LE-NEXT: or r3, r4, r3
; CHECK-LE-NEXT: lbz r3, 0(r3)
; CHECK-LE-NEXT: blr
;
; CHECK-BE-LABEL: ld_or_uint8_t_uint16_t:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: or r3, r4, r3
; CHECK-BE-NEXT: lbz r3, 1(r3)
; CHECK-BE-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 = trunc i16 %1 to i8
ret i8 %conv1
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_not_disjoint16_uint8_t_uint16_t(i64 %ptr) {
; CHECK-LE-LABEL: ld_not_disjoint16_uint8_t_uint16_t:
; CHECK-LE: # %bb.0: # %entry
; CHECK-LE-NEXT: ori r3, r3, 6
; CHECK-LE-NEXT: lbz r3, 0(r3)
; CHECK-LE-NEXT: blr
;
; CHECK-BE-LABEL: ld_not_disjoint16_uint8_t_uint16_t:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: ori r3, r3, 6
; CHECK-BE-NEXT: lbz r3, 1(r3)
; CHECK-BE-NEXT: blr
entry:
%or = or i64 %ptr, 6
%0 = inttoptr i64 %or to i16*
%1 = load i16, i16* %0, align 2
%conv = trunc i16 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_disjoint_align16_uint8_t_uint16_t(i64 %ptr) {
; CHECK-LE-LABEL: ld_disjoint_align16_uint8_t_uint16_t:
; CHECK-LE: # %bb.0: # %entry
; CHECK-LE-NEXT: rldicr r3, r3, 0, 51
; CHECK-LE-NEXT: lbz r3, 24(r3)
; CHECK-LE-NEXT: blr
;
; CHECK-BE-LABEL: ld_disjoint_align16_uint8_t_uint16_t:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: rldicr r3, r3, 0, 51
; CHECK-BE-NEXT: lbz r3, 25(r3)
; CHECK-BE-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 = trunc i16 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_not_disjoint32_uint8_t_uint16_t(i64 %ptr) {
; CHECK-LE-LABEL: ld_not_disjoint32_uint8_t_uint16_t:
; CHECK-LE: # %bb.0: # %entry
; CHECK-LE-NEXT: ori r3, r3, 34463
; CHECK-LE-NEXT: oris r3, r3, 1
; CHECK-LE-NEXT: lbz r3, 0(r3)
; CHECK-LE-NEXT: blr
;
; CHECK-BE-LABEL: ld_not_disjoint32_uint8_t_uint16_t:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: ori r3, r3, 34463
; CHECK-BE-NEXT: oris r3, r3, 1
; CHECK-BE-NEXT: lbz r3, 1(r3)
; CHECK-BE-NEXT: blr
entry:
%or = or i64 %ptr, 99999
%0 = inttoptr i64 %or to i16*
%1 = load i16, i16* %0, align 2
%conv = trunc i16 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_disjoint_align32_uint8_t_uint16_t(i64 %ptr) {
; CHECK-P10-LE-LABEL: ld_disjoint_align32_uint8_t_uint16_t:
; CHECK-P10-LE: # %bb.0: # %entry
; CHECK-P10-LE-NEXT: lis r4, -15264
; CHECK-P10-LE-NEXT: and r3, r3, r4
; CHECK-P10-LE-NEXT: pli r4, 999990000
; CHECK-P10-LE-NEXT: lbzx r3, r3, r4
; CHECK-P10-LE-NEXT: blr
;
; CHECK-P10-BE-LABEL: ld_disjoint_align32_uint8_t_uint16_t:
; CHECK-P10-BE: # %bb.0: # %entry
; CHECK-P10-BE-NEXT: lis r4, -15264
; CHECK-P10-BE-NEXT: and r3, r3, r4
; CHECK-P10-BE-NEXT: pli r4, 999990001
; CHECK-P10-BE-NEXT: lbzx r3, r3, r4
; CHECK-P10-BE-NEXT: blr
;
; CHECK-P9-LE-LABEL: ld_disjoint_align32_uint8_t_uint16_t:
; CHECK-P9-LE: # %bb.0: # %entry
; CHECK-P9-LE-NEXT: lis r4, -15264
; CHECK-P9-LE-NEXT: and r3, r3, r4
; CHECK-P9-LE-NEXT: lis r4, 15258
; CHECK-P9-LE-NEXT: ori r4, r4, 41712
; CHECK-P9-LE-NEXT: lbzx r3, r3, r4
; CHECK-P9-LE-NEXT: blr
;
; CHECK-P9-BE-LABEL: ld_disjoint_align32_uint8_t_uint16_t:
; CHECK-P9-BE: # %bb.0: # %entry
; CHECK-P9-BE-NEXT: lis r4, -15264
; CHECK-P9-BE-NEXT: and r3, r3, r4
; CHECK-P9-BE-NEXT: lis r4, 15258
; CHECK-P9-BE-NEXT: ori r4, r4, 41713
; CHECK-P9-BE-NEXT: lbzx r3, r3, r4
; CHECK-P9-BE-NEXT: blr
;
; CHECK-P8-LE-LABEL: ld_disjoint_align32_uint8_t_uint16_t:
; CHECK-P8-LE: # %bb.0: # %entry
; CHECK-P8-LE-NEXT: lis r4, -15264
; CHECK-P8-LE-NEXT: lis r5, 15258
; CHECK-P8-LE-NEXT: and r3, r3, r4
; CHECK-P8-LE-NEXT: ori r4, r5, 41712
; CHECK-P8-LE-NEXT: lbzx r3, r3, r4
; CHECK-P8-LE-NEXT: blr
;
; CHECK-P8-BE-LABEL: ld_disjoint_align32_uint8_t_uint16_t:
; CHECK-P8-BE: # %bb.0: # %entry
; CHECK-P8-BE-NEXT: lis r4, -15264
; CHECK-P8-BE-NEXT: lis r5, 15258
; CHECK-P8-BE-NEXT: and r3, r3, r4
; CHECK-P8-BE-NEXT: ori r4, r5, 41713
; CHECK-P8-BE-NEXT: lbzx r3, r3, r4
; CHECK-P8-BE-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 = trunc i16 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_not_disjoint64_uint8_t_uint16_t(i64 %ptr) {
; CHECK-P10-LE-LABEL: ld_not_disjoint64_uint8_t_uint16_t:
; CHECK-P10-LE: # %bb.0: # %entry
; CHECK-P10-LE-NEXT: pli r4, 232
; CHECK-P10-LE-NEXT: pli r5, 3567587329
; CHECK-P10-LE-NEXT: rldimi r5, r4, 32, 0
; CHECK-P10-LE-NEXT: or r3, r3, r5
; CHECK-P10-LE-NEXT: lbz r3, 0(r3)
; CHECK-P10-LE-NEXT: blr
;
; CHECK-P10-BE-LABEL: ld_not_disjoint64_uint8_t_uint16_t:
; CHECK-P10-BE: # %bb.0: # %entry
; CHECK-P10-BE-NEXT: pli r4, 232
; CHECK-P10-BE-NEXT: pli r5, 3567587329
; CHECK-P10-BE-NEXT: rldimi r5, r4, 32, 0
; CHECK-P10-BE-NEXT: or r3, r3, r5
; CHECK-P10-BE-NEXT: lbz r3, 1(r3)
; CHECK-P10-BE-NEXT: blr
;
; CHECK-P9-LE-LABEL: ld_not_disjoint64_uint8_t_uint16_t:
; CHECK-P9-LE: # %bb.0: # %entry
; CHECK-P9-LE-NEXT: li r4, 29
; CHECK-P9-LE-NEXT: rldic r4, r4, 35, 24
; CHECK-P9-LE-NEXT: oris r4, r4, 54437
; CHECK-P9-LE-NEXT: ori r4, r4, 4097
; CHECK-P9-LE-NEXT: or r3, r3, r4
; CHECK-P9-LE-NEXT: lbz r3, 0(r3)
; CHECK-P9-LE-NEXT: blr
;
; CHECK-P9-BE-LABEL: ld_not_disjoint64_uint8_t_uint16_t:
; CHECK-P9-BE: # %bb.0: # %entry
; CHECK-P9-BE-NEXT: li r4, 29
; CHECK-P9-BE-NEXT: rldic r4, r4, 35, 24
; CHECK-P9-BE-NEXT: oris r4, r4, 54437
; CHECK-P9-BE-NEXT: ori r4, r4, 4097
; CHECK-P9-BE-NEXT: or r3, r3, r4
; CHECK-P9-BE-NEXT: lbz r3, 1(r3)
; CHECK-P9-BE-NEXT: blr
;
; CHECK-P8-LE-LABEL: ld_not_disjoint64_uint8_t_uint16_t:
; CHECK-P8-LE: # %bb.0: # %entry
; CHECK-P8-LE-NEXT: li r4, 29
; CHECK-P8-LE-NEXT: rldic r4, r4, 35, 24
; CHECK-P8-LE-NEXT: oris r4, r4, 54437
; CHECK-P8-LE-NEXT: ori r4, r4, 4097
; CHECK-P8-LE-NEXT: or r3, r3, r4
; CHECK-P8-LE-NEXT: lbz r3, 0(r3)
; CHECK-P8-LE-NEXT: blr
;
; CHECK-P8-BE-LABEL: ld_not_disjoint64_uint8_t_uint16_t:
; CHECK-P8-BE: # %bb.0: # %entry
; CHECK-P8-BE-NEXT: li r4, 29
; CHECK-P8-BE-NEXT: rldic r4, r4, 35, 24
; CHECK-P8-BE-NEXT: oris r4, r4, 54437
; CHECK-P8-BE-NEXT: ori r4, r4, 4097
; CHECK-P8-BE-NEXT: or r3, r3, r4
; CHECK-P8-BE-NEXT: lbz r3, 1(r3)
; CHECK-P8-BE-NEXT: blr
entry:
%or = or i64 %ptr, 1000000000001
%0 = inttoptr i64 %or to i16*
%1 = load i16, i16* %0, align 2
%conv = trunc i16 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_disjoint_unalign64_uint8_t_uint16_t(i64 %ptr) {
; CHECK-P10-LE-LABEL: ld_disjoint_unalign64_uint8_t_uint16_t:
; CHECK-P10-LE: # %bb.0: # %entry
; CHECK-P10-LE-NEXT: pli r4, 232
; CHECK-P10-LE-NEXT: pli r5, 3567587329
; CHECK-P10-LE-NEXT: rldicr r3, r3, 0, 23
; CHECK-P10-LE-NEXT: rldimi r5, r4, 32, 0
; CHECK-P10-LE-NEXT: lbzx r3, r3, r5
; CHECK-P10-LE-NEXT: blr
;
; CHECK-P10-BE-LABEL: ld_disjoint_unalign64_uint8_t_uint16_t:
; CHECK-P10-BE: # %bb.0: # %entry
; CHECK-P10-BE-NEXT: pli r4, 232
; CHECK-P10-BE-NEXT: pli r5, 3567587330
; CHECK-P10-BE-NEXT: rldicr r3, r3, 0, 23
; CHECK-P10-BE-NEXT: rldimi r5, r4, 32, 0
; CHECK-P10-BE-NEXT: lbzx r3, r3, r5
; CHECK-P10-BE-NEXT: blr
;
; CHECK-P9-LE-LABEL: ld_disjoint_unalign64_uint8_t_uint16_t:
; CHECK-P9-LE: # %bb.0: # %entry
; CHECK-P9-LE-NEXT: li r4, 29
; CHECK-P9-LE-NEXT: rldicr r3, r3, 0, 23
; CHECK-P9-LE-NEXT: rldic r4, r4, 35, 24
; CHECK-P9-LE-NEXT: oris r4, r4, 54437
; CHECK-P9-LE-NEXT: ori r4, r4, 4097
; CHECK-P9-LE-NEXT: lbzx r3, r3, r4
; CHECK-P9-LE-NEXT: blr
;
; CHECK-P9-BE-LABEL: ld_disjoint_unalign64_uint8_t_uint16_t:
; CHECK-P9-BE: # %bb.0: # %entry
; CHECK-P9-BE-NEXT: li r4, 29
; CHECK-P9-BE-NEXT: rldicr r3, r3, 0, 23
; CHECK-P9-BE-NEXT: rldic r4, r4, 35, 24
; CHECK-P9-BE-NEXT: oris r4, r4, 54437
; CHECK-P9-BE-NEXT: ori r4, r4, 4098
; CHECK-P9-BE-NEXT: lbzx r3, r3, r4
; CHECK-P9-BE-NEXT: blr
;
; CHECK-P8-LE-LABEL: ld_disjoint_unalign64_uint8_t_uint16_t:
; CHECK-P8-LE: # %bb.0: # %entry
; CHECK-P8-LE-NEXT: li r4, 29
; CHECK-P8-LE-NEXT: rldicr r3, r3, 0, 23
; CHECK-P8-LE-NEXT: rldic r4, r4, 35, 24
; CHECK-P8-LE-NEXT: oris r4, r4, 54437
; CHECK-P8-LE-NEXT: ori r4, r4, 4097
; CHECK-P8-LE-NEXT: lbzx r3, r3, r4
; CHECK-P8-LE-NEXT: blr
;
; CHECK-P8-BE-LABEL: ld_disjoint_unalign64_uint8_t_uint16_t:
; CHECK-P8-BE: # %bb.0: # %entry
; CHECK-P8-BE-NEXT: li r4, 29
; CHECK-P8-BE-NEXT: rldicr r3, r3, 0, 23
; CHECK-P8-BE-NEXT: rldic r4, r4, 35, 24
; CHECK-P8-BE-NEXT: oris r4, r4, 54437
; CHECK-P8-BE-NEXT: ori r4, r4, 4098
; CHECK-P8-BE-NEXT: lbzx r3, r3, r4
; CHECK-P8-BE-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 = trunc i16 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_disjoint_align64_uint8_t_uint16_t(i64 %ptr) {
; CHECK-P10-LE-LABEL: ld_disjoint_align64_uint8_t_uint16_t:
; CHECK-P10-LE: # %bb.0: # %entry
; CHECK-P10-LE-NEXT: pli r4, 244140625
; CHECK-P10-LE-NEXT: rldicr r3, r3, 0, 23
; CHECK-P10-LE-NEXT: rldic r4, r4, 12, 24
; CHECK-P10-LE-NEXT: lbzx r3, r3, r4
; CHECK-P10-LE-NEXT: blr
;
; CHECK-P10-BE-LABEL: ld_disjoint_align64_uint8_t_uint16_t:
; CHECK-P10-BE: # %bb.0: # %entry
; CHECK-P10-BE-NEXT: pli r4, 232
; CHECK-P10-BE-NEXT: pli r5, 3567587329
; CHECK-P10-BE-NEXT: rldicr r3, r3, 0, 23
; CHECK-P10-BE-NEXT: rldimi r5, r4, 32, 0
; CHECK-P10-BE-NEXT: lbzx r3, r3, r5
; CHECK-P10-BE-NEXT: blr
;
; CHECK-P9-LE-LABEL: ld_disjoint_align64_uint8_t_uint16_t:
; CHECK-P9-LE: # %bb.0: # %entry
; CHECK-P9-LE-NEXT: lis r4, 3725
; CHECK-P9-LE-NEXT: rldicr r3, r3, 0, 23
; CHECK-P9-LE-NEXT: ori r4, r4, 19025
; CHECK-P9-LE-NEXT: rldic r4, r4, 12, 24
; CHECK-P9-LE-NEXT: lbzx r3, r3, r4
; CHECK-P9-LE-NEXT: blr
;
; CHECK-P9-BE-LABEL: ld_disjoint_align64_uint8_t_uint16_t:
; CHECK-P9-BE: # %bb.0: # %entry
; CHECK-P9-BE-NEXT: li r4, 29
; CHECK-P9-BE-NEXT: rldicr r3, r3, 0, 23
; CHECK-P9-BE-NEXT: rldic r4, r4, 35, 24
; CHECK-P9-BE-NEXT: oris r4, r4, 54437
; CHECK-P9-BE-NEXT: ori r4, r4, 4097
; CHECK-P9-BE-NEXT: lbzx r3, r3, r4
; CHECK-P9-BE-NEXT: blr
;
; CHECK-P8-LE-LABEL: ld_disjoint_align64_uint8_t_uint16_t:
; CHECK-P8-LE: # %bb.0: # %entry
; CHECK-P8-LE-NEXT: lis r4, 3725
; CHECK-P8-LE-NEXT: rldicr r3, r3, 0, 23
; CHECK-P8-LE-NEXT: ori r4, r4, 19025
; CHECK-P8-LE-NEXT: rldic r4, r4, 12, 24
; CHECK-P8-LE-NEXT: lbzx r3, r3, r4
; CHECK-P8-LE-NEXT: blr
;
; CHECK-P8-BE-LABEL: ld_disjoint_align64_uint8_t_uint16_t:
; CHECK-P8-BE: # %bb.0: # %entry
; CHECK-P8-BE-NEXT: li r4, 29
; CHECK-P8-BE-NEXT: rldicr r3, r3, 0, 23
; CHECK-P8-BE-NEXT: rldic r4, r4, 35, 24
; CHECK-P8-BE-NEXT: oris r4, r4, 54437
; CHECK-P8-BE-NEXT: ori r4, r4, 4097
; CHECK-P8-BE-NEXT: lbzx r3, r3, r4
; CHECK-P8-BE-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 = trunc i16 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_cst_align16_uint8_t_uint16_t() {
; CHECK-LE-LABEL: ld_cst_align16_uint8_t_uint16_t:
; CHECK-LE: # %bb.0: # %entry
; CHECK-LE-NEXT: lbz r3, 4080(0)
; CHECK-LE-NEXT: blr
;
; CHECK-BE-LABEL: ld_cst_align16_uint8_t_uint16_t:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: lbz r3, 4081(0)
; CHECK-BE-NEXT: blr
entry:
%0 = load i16, i16* inttoptr (i64 4080 to i16*), align 16
%conv = trunc i16 %0 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_cst_align32_uint8_t_uint16_t() {
; CHECK-LE-LABEL: ld_cst_align32_uint8_t_uint16_t:
; CHECK-LE: # %bb.0: # %entry
; CHECK-LE-NEXT: lis r3, 153
; CHECK-LE-NEXT: lbz r3, -27108(r3)
; CHECK-LE-NEXT: blr
;
; CHECK-BE-LABEL: ld_cst_align32_uint8_t_uint16_t:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: lis r3, 153
; CHECK-BE-NEXT: lbz r3, -27107(r3)
; CHECK-BE-NEXT: blr
entry:
%0 = load i16, i16* inttoptr (i64 9999900 to i16*), align 4
%conv = trunc i16 %0 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_cst_unalign64_uint8_t_uint16_t() {
; CHECK-P10-LE-LABEL: ld_cst_unalign64_uint8_t_uint16_t:
; CHECK-P10-LE: # %bb.0: # %entry
; CHECK-P10-LE-NEXT: pli r3, 232
; CHECK-P10-LE-NEXT: pli r4, 3567587329
; CHECK-P10-LE-NEXT: rldimi r4, r3, 32, 0
; CHECK-P10-LE-NEXT: lbz r3, 0(r4)
; CHECK-P10-LE-NEXT: blr
;
; CHECK-P10-BE-LABEL: ld_cst_unalign64_uint8_t_uint16_t:
; CHECK-P10-BE: # %bb.0: # %entry
; CHECK-P10-BE-NEXT: pli r3, 232
; CHECK-P10-BE-NEXT: pli r4, 3567587330
; CHECK-P10-BE-NEXT: rldimi r4, r3, 32, 0
; CHECK-P10-BE-NEXT: lbz r3, 0(r4)
; CHECK-P10-BE-NEXT: blr
;
; CHECK-P9-LE-LABEL: ld_cst_unalign64_uint8_t_uint16_t:
; CHECK-P9-LE: # %bb.0: # %entry
; CHECK-P9-LE-NEXT: li r3, 29
; CHECK-P9-LE-NEXT: rldic r3, r3, 35, 24
; CHECK-P9-LE-NEXT: oris r3, r3, 54437
; CHECK-P9-LE-NEXT: ori r3, r3, 4097
; CHECK-P9-LE-NEXT: lbz r3, 0(r3)
; CHECK-P9-LE-NEXT: blr
;
; CHECK-P9-BE-LABEL: ld_cst_unalign64_uint8_t_uint16_t:
; CHECK-P9-BE: # %bb.0: # %entry
; CHECK-P9-BE-NEXT: li r3, 29
; CHECK-P9-BE-NEXT: rldic r3, r3, 35, 24
; CHECK-P9-BE-NEXT: oris r3, r3, 54437
; CHECK-P9-BE-NEXT: ori r3, r3, 4098
; CHECK-P9-BE-NEXT: lbz r3, 0(r3)
; CHECK-P9-BE-NEXT: blr
;
; CHECK-P8-LE-LABEL: ld_cst_unalign64_uint8_t_uint16_t:
; CHECK-P8-LE: # %bb.0: # %entry
; CHECK-P8-LE-NEXT: li r3, 29
; CHECK-P8-LE-NEXT: rldic r3, r3, 35, 24
; CHECK-P8-LE-NEXT: oris r3, r3, 54437
; CHECK-P8-LE-NEXT: ori r3, r3, 4097
; CHECK-P8-LE-NEXT: lbz r3, 0(r3)
; CHECK-P8-LE-NEXT: blr
;
; CHECK-P8-BE-LABEL: ld_cst_unalign64_uint8_t_uint16_t:
; CHECK-P8-BE: # %bb.0: # %entry
; CHECK-P8-BE-NEXT: li r3, 29
; CHECK-P8-BE-NEXT: rldic r3, r3, 35, 24
; CHECK-P8-BE-NEXT: oris r3, r3, 54437
; CHECK-P8-BE-NEXT: ori r3, r3, 4098
; CHECK-P8-BE-NEXT: lbz r3, 0(r3)
; CHECK-P8-BE-NEXT: blr
entry:
%0 = load i16, i16* inttoptr (i64 1000000000001 to i16*), align 2
%conv = trunc i16 %0 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_cst_align64_uint8_t_uint16_t() {
; CHECK-P10-LE-LABEL: ld_cst_align64_uint8_t_uint16_t:
; CHECK-P10-LE: # %bb.0: # %entry
; CHECK-P10-LE-NEXT: pli r3, 244140625
; CHECK-P10-LE-NEXT: rldic r3, r3, 12, 24
; CHECK-P10-LE-NEXT: lbz r3, 0(r3)
; CHECK-P10-LE-NEXT: blr
;
; CHECK-P10-BE-LABEL: ld_cst_align64_uint8_t_uint16_t:
; CHECK-P10-BE: # %bb.0: # %entry
; CHECK-P10-BE-NEXT: pli r3, 232
; CHECK-P10-BE-NEXT: pli r4, 3567587329
; CHECK-P10-BE-NEXT: rldimi r4, r3, 32, 0
; CHECK-P10-BE-NEXT: lbz r3, 0(r4)
; CHECK-P10-BE-NEXT: blr
;
; CHECK-P9-LE-LABEL: ld_cst_align64_uint8_t_uint16_t:
; CHECK-P9-LE: # %bb.0: # %entry
; CHECK-P9-LE-NEXT: lis r3, 3725
; CHECK-P9-LE-NEXT: ori r3, r3, 19025
; CHECK-P9-LE-NEXT: rldic r3, r3, 12, 24
; CHECK-P9-LE-NEXT: lbz r3, 0(r3)
; CHECK-P9-LE-NEXT: blr
;
; CHECK-P9-BE-LABEL: ld_cst_align64_uint8_t_uint16_t:
; CHECK-P9-BE: # %bb.0: # %entry
; CHECK-P9-BE-NEXT: li r3, 29
; CHECK-P9-BE-NEXT: rldic r3, r3, 35, 24
; CHECK-P9-BE-NEXT: oris r3, r3, 54437
; CHECK-P9-BE-NEXT: ori r3, r3, 4097
; CHECK-P9-BE-NEXT: lbz r3, 0(r3)
; CHECK-P9-BE-NEXT: blr
;
; CHECK-P8-LE-LABEL: ld_cst_align64_uint8_t_uint16_t:
; CHECK-P8-LE: # %bb.0: # %entry
; CHECK-P8-LE-NEXT: lis r3, 3725
; CHECK-P8-LE-NEXT: ori r3, r3, 19025
; CHECK-P8-LE-NEXT: rldic r3, r3, 12, 24
; CHECK-P8-LE-NEXT: lbz r3, 0(r3)
; CHECK-P8-LE-NEXT: blr
;
; CHECK-P8-BE-LABEL: ld_cst_align64_uint8_t_uint16_t:
; CHECK-P8-BE: # %bb.0: # %entry
; CHECK-P8-BE-NEXT: li r3, 29
; CHECK-P8-BE-NEXT: rldic r3, r3, 35, 24
; CHECK-P8-BE-NEXT: oris r3, r3, 54437
; CHECK-P8-BE-NEXT: ori r3, r3, 4097
; CHECK-P8-BE-NEXT: lbz r3, 0(r3)
; CHECK-P8-BE-NEXT: blr
entry:
%0 = load i16, i16* inttoptr (i64 1000000000000 to i16*), align 4096
%conv = trunc i16 %0 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_0_uint8_t_uint32_t(i64 %ptr) {
; CHECK-LE-LABEL: ld_0_uint8_t_uint32_t:
; CHECK-LE: # %bb.0: # %entry
; CHECK-LE-NEXT: lbz r3, 0(r3)
; CHECK-LE-NEXT: blr
;
; CHECK-BE-LABEL: ld_0_uint8_t_uint32_t:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: lbz r3, 3(r3)
; CHECK-BE-NEXT: blr
entry:
%0 = inttoptr i64 %ptr to i32*
%1 = load i32, i32* %0, align 4
%conv = trunc i32 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_align16_uint8_t_uint32_t(i8* nocapture readonly %ptr) {
; CHECK-LE-LABEL: ld_align16_uint8_t_uint32_t:
; CHECK-LE: # %bb.0: # %entry
; CHECK-LE-NEXT: lbz r3, 8(r3)
; CHECK-LE-NEXT: blr
;
; CHECK-BE-LABEL: ld_align16_uint8_t_uint32_t:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: lbz r3, 11(r3)
; CHECK-BE-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 = trunc i32 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_align32_uint8_t_uint32_t(i8* nocapture readonly %ptr) {
; CHECK-P10-LE-LABEL: ld_align32_uint8_t_uint32_t:
; CHECK-P10-LE: # %bb.0: # %entry
; CHECK-P10-LE-NEXT: pli r4, 99999000
; CHECK-P10-LE-NEXT: lbzx r3, r3, r4
; CHECK-P10-LE-NEXT: blr
;
; CHECK-P10-BE-LABEL: ld_align32_uint8_t_uint32_t:
; CHECK-P10-BE: # %bb.0: # %entry
; CHECK-P10-BE-NEXT: pli r4, 99999003
; CHECK-P10-BE-NEXT: lbzx r3, r3, r4
; CHECK-P10-BE-NEXT: blr
;
; CHECK-P9-LE-LABEL: ld_align32_uint8_t_uint32_t:
; CHECK-P9-LE: # %bb.0: # %entry
; CHECK-P9-LE-NEXT: lis r4, 1525
; CHECK-P9-LE-NEXT: ori r4, r4, 56600
; CHECK-P9-LE-NEXT: lbzx r3, r3, r4
; CHECK-P9-LE-NEXT: blr
;
; CHECK-P9-BE-LABEL: ld_align32_uint8_t_uint32_t:
; CHECK-P9-BE: # %bb.0: # %entry
; CHECK-P9-BE-NEXT: lis r4, 1525
; CHECK-P9-BE-NEXT: ori r4, r4, 56603
; CHECK-P9-BE-NEXT: lbzx r3, r3, r4
; CHECK-P9-BE-NEXT: blr
;
; CHECK-P8-LE-LABEL: ld_align32_uint8_t_uint32_t:
; CHECK-P8-LE: # %bb.0: # %entry
; CHECK-P8-LE-NEXT: lis r4, 1525
; CHECK-P8-LE-NEXT: ori r4, r4, 56600
; CHECK-P8-LE-NEXT: lbzx r3, r3, r4
; CHECK-P8-LE-NEXT: blr
;
; CHECK-P8-BE-LABEL: ld_align32_uint8_t_uint32_t:
; CHECK-P8-BE: # %bb.0: # %entry
; CHECK-P8-BE-NEXT: lis r4, 1525
; CHECK-P8-BE-NEXT: ori r4, r4, 56603
; CHECK-P8-BE-NEXT: lbzx r3, r3, r4
; CHECK-P8-BE-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 = trunc i32 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_unalign64_uint8_t_uint32_t(i8* nocapture readonly %ptr) {
; CHECK-P10-LE-LABEL: ld_unalign64_uint8_t_uint32_t:
; CHECK-P10-LE: # %bb.0: # %entry
; CHECK-P10-LE-NEXT: pli r4, 232
; CHECK-P10-LE-NEXT: pli r5, 3567587329
; CHECK-P10-LE-NEXT: rldimi r5, r4, 32, 0
; CHECK-P10-LE-NEXT: lbzx r3, r3, r5
; CHECK-P10-LE-NEXT: blr
;
; CHECK-P10-BE-LABEL: ld_unalign64_uint8_t_uint32_t:
; CHECK-P10-BE: # %bb.0: # %entry
; CHECK-P10-BE-NEXT: pli r4, 232
; CHECK-P10-BE-NEXT: pli r5, 3567587332
; CHECK-P10-BE-NEXT: rldimi r5, r4, 32, 0
; CHECK-P10-BE-NEXT: lbzx r3, r3, r5
; CHECK-P10-BE-NEXT: blr
;
; CHECK-P9-LE-LABEL: ld_unalign64_uint8_t_uint32_t:
; CHECK-P9-LE: # %bb.0: # %entry
; CHECK-P9-LE-NEXT: li r4, 29
; CHECK-P9-LE-NEXT: rldic r4, r4, 35, 24
; CHECK-P9-LE-NEXT: oris r4, r4, 54437
; CHECK-P9-LE-NEXT: ori r4, r4, 4097
; CHECK-P9-LE-NEXT: lbzx r3, r3, r4
; CHECK-P9-LE-NEXT: blr
;
; CHECK-P9-BE-LABEL: ld_unalign64_uint8_t_uint32_t:
; CHECK-P9-BE: # %bb.0: # %entry
; CHECK-P9-BE-NEXT: li r4, 29
; CHECK-P9-BE-NEXT: rldic r4, r4, 35, 24
; CHECK-P9-BE-NEXT: oris r4, r4, 54437
; CHECK-P9-BE-NEXT: ori r4, r4, 4100
; CHECK-P9-BE-NEXT: lbzx r3, r3, r4
; CHECK-P9-BE-NEXT: blr
;
; CHECK-P8-LE-LABEL: ld_unalign64_uint8_t_uint32_t:
; CHECK-P8-LE: # %bb.0: # %entry
; CHECK-P8-LE-NEXT: li r4, 29
; CHECK-P8-LE-NEXT: rldic r4, r4, 35, 24
; CHECK-P8-LE-NEXT: oris r4, r4, 54437
; CHECK-P8-LE-NEXT: ori r4, r4, 4097
; CHECK-P8-LE-NEXT: lbzx r3, r3, r4
; CHECK-P8-LE-NEXT: blr
;
; CHECK-P8-BE-LABEL: ld_unalign64_uint8_t_uint32_t:
; CHECK-P8-BE: # %bb.0: # %entry
; CHECK-P8-BE-NEXT: li r4, 29
; CHECK-P8-BE-NEXT: rldic r4, r4, 35, 24
; CHECK-P8-BE-NEXT: oris r4, r4, 54437
; CHECK-P8-BE-NEXT: ori r4, r4, 4100
; CHECK-P8-BE-NEXT: lbzx r3, r3, r4
; CHECK-P8-BE-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 = trunc i32 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_align64_uint8_t_uint32_t(i8* nocapture readonly %ptr) {
; CHECK-P10-LE-LABEL: ld_align64_uint8_t_uint32_t:
; CHECK-P10-LE: # %bb.0: # %entry
; CHECK-P10-LE-NEXT: pli r4, 244140625
; CHECK-P10-LE-NEXT: rldic r4, r4, 12, 24
; CHECK-P10-LE-NEXT: lbzx r3, r3, r4
; CHECK-P10-LE-NEXT: blr
;
; CHECK-P10-BE-LABEL: ld_align64_uint8_t_uint32_t:
; CHECK-P10-BE: # %bb.0: # %entry
; CHECK-P10-BE-NEXT: pli r4, 232
; CHECK-P10-BE-NEXT: pli r5, 3567587331
; CHECK-P10-BE-NEXT: rldimi r5, r4, 32, 0
; CHECK-P10-BE-NEXT: lbzx r3, r3, r5
; CHECK-P10-BE-NEXT: blr
;
; CHECK-P9-LE-LABEL: ld_align64_uint8_t_uint32_t:
; CHECK-P9-LE: # %bb.0: # %entry
; CHECK-P9-LE-NEXT: lis r4, 3725
; CHECK-P9-LE-NEXT: ori r4, r4, 19025
; CHECK-P9-LE-NEXT: rldic r4, r4, 12, 24
; CHECK-P9-LE-NEXT: lbzx r3, r3, r4
; CHECK-P9-LE-NEXT: blr
;
; CHECK-P9-BE-LABEL: ld_align64_uint8_t_uint32_t:
; CHECK-P9-BE: # %bb.0: # %entry
; CHECK-P9-BE-NEXT: li r4, 29
; CHECK-P9-BE-NEXT: rldic r4, r4, 35, 24
; CHECK-P9-BE-NEXT: oris r4, r4, 54437
; CHECK-P9-BE-NEXT: ori r4, r4, 4099
; CHECK-P9-BE-NEXT: lbzx r3, r3, r4
; CHECK-P9-BE-NEXT: blr
;
; CHECK-P8-LE-LABEL: ld_align64_uint8_t_uint32_t:
; CHECK-P8-LE: # %bb.0: # %entry
; CHECK-P8-LE-NEXT: lis r4, 3725
; CHECK-P8-LE-NEXT: ori r4, r4, 19025
; CHECK-P8-LE-NEXT: rldic r4, r4, 12, 24
; CHECK-P8-LE-NEXT: lbzx r3, r3, r4
; CHECK-P8-LE-NEXT: blr
;
; CHECK-P8-BE-LABEL: ld_align64_uint8_t_uint32_t:
; CHECK-P8-BE: # %bb.0: # %entry
; CHECK-P8-BE-NEXT: li r4, 29
; CHECK-P8-BE-NEXT: rldic r4, r4, 35, 24
; CHECK-P8-BE-NEXT: oris r4, r4, 54437
; CHECK-P8-BE-NEXT: ori r4, r4, 4099
; CHECK-P8-BE-NEXT: lbzx r3, r3, r4
; CHECK-P8-BE-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 = trunc i32 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_reg_uint8_t_uint32_t(i8* nocapture readonly %ptr, i64 %off) {
; CHECK-LE-LABEL: ld_reg_uint8_t_uint32_t:
; CHECK-LE: # %bb.0: # %entry
; CHECK-LE-NEXT: lbzx r3, r3, r4
; CHECK-LE-NEXT: blr
;
; CHECK-BE-LABEL: ld_reg_uint8_t_uint32_t:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: add r3, r3, r4
; CHECK-BE-NEXT: lbz r3, 3(r3)
; CHECK-BE-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 = trunc i32 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_or_uint8_t_uint32_t(i64 %ptr, i8 zeroext %off) {
; CHECK-LE-LABEL: ld_or_uint8_t_uint32_t:
; CHECK-LE: # %bb.0: # %entry
; CHECK-LE-NEXT: or r3, r4, r3
; CHECK-LE-NEXT: lbz r3, 0(r3)
; CHECK-LE-NEXT: blr
;
; CHECK-BE-LABEL: ld_or_uint8_t_uint32_t:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: or r3, r4, r3
; CHECK-BE-NEXT: lbz r3, 3(r3)
; CHECK-BE-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 = trunc i32 %1 to i8
ret i8 %conv1
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_not_disjoint16_uint8_t_uint32_t(i64 %ptr) {
; CHECK-LE-LABEL: ld_not_disjoint16_uint8_t_uint32_t:
; CHECK-LE: # %bb.0: # %entry
; CHECK-LE-NEXT: ori r3, r3, 6
; CHECK-LE-NEXT: lbz r3, 0(r3)
; CHECK-LE-NEXT: blr
;
; CHECK-BE-LABEL: ld_not_disjoint16_uint8_t_uint32_t:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: ori r3, r3, 6
; CHECK-BE-NEXT: lbz r3, 3(r3)
; CHECK-BE-NEXT: blr
entry:
%or = or i64 %ptr, 6
%0 = inttoptr i64 %or to i32*
%1 = load i32, i32* %0, align 4
%conv = trunc i32 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_disjoint_align16_uint8_t_uint32_t(i64 %ptr) {
; CHECK-LE-LABEL: ld_disjoint_align16_uint8_t_uint32_t:
; CHECK-LE: # %bb.0: # %entry
; CHECK-LE-NEXT: rldicr r3, r3, 0, 51
; CHECK-LE-NEXT: lbz r3, 24(r3)
; CHECK-LE-NEXT: blr
;
; CHECK-BE-LABEL: ld_disjoint_align16_uint8_t_uint32_t:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: rldicr r3, r3, 0, 51
; CHECK-BE-NEXT: lbz r3, 27(r3)
; CHECK-BE-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 = trunc i32 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_not_disjoint32_uint8_t_uint32_t(i64 %ptr) {
; CHECK-LE-LABEL: ld_not_disjoint32_uint8_t_uint32_t:
; CHECK-LE: # %bb.0: # %entry
; CHECK-LE-NEXT: ori r3, r3, 34463
; CHECK-LE-NEXT: oris r3, r3, 1
; CHECK-LE-NEXT: lbz r3, 0(r3)
; CHECK-LE-NEXT: blr
;
; CHECK-BE-LABEL: ld_not_disjoint32_uint8_t_uint32_t:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: ori r3, r3, 34463
; CHECK-BE-NEXT: oris r3, r3, 1
; CHECK-BE-NEXT: lbz r3, 3(r3)
; CHECK-BE-NEXT: blr
entry:
%or = or i64 %ptr, 99999
%0 = inttoptr i64 %or to i32*
%1 = load i32, i32* %0, align 4
%conv = trunc i32 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_disjoint_align32_uint8_t_uint32_t(i64 %ptr) {
; CHECK-P10-LE-LABEL: ld_disjoint_align32_uint8_t_uint32_t:
; CHECK-P10-LE: # %bb.0: # %entry
; CHECK-P10-LE-NEXT: lis r4, -15264
; CHECK-P10-LE-NEXT: and r3, r3, r4
; CHECK-P10-LE-NEXT: pli r4, 999990000
; CHECK-P10-LE-NEXT: lbzx r3, r3, r4
; CHECK-P10-LE-NEXT: blr
;
; CHECK-P10-BE-LABEL: ld_disjoint_align32_uint8_t_uint32_t:
; CHECK-P10-BE: # %bb.0: # %entry
; CHECK-P10-BE-NEXT: lis r4, -15264
; CHECK-P10-BE-NEXT: and r3, r3, r4
; CHECK-P10-BE-NEXT: pli r4, 999990003
; CHECK-P10-BE-NEXT: lbzx r3, r3, r4
; CHECK-P10-BE-NEXT: blr
;
; CHECK-P9-LE-LABEL: ld_disjoint_align32_uint8_t_uint32_t:
; CHECK-P9-LE: # %bb.0: # %entry
; CHECK-P9-LE-NEXT: lis r4, -15264
; CHECK-P9-LE-NEXT: and r3, r3, r4
; CHECK-P9-LE-NEXT: lis r4, 15258
; CHECK-P9-LE-NEXT: ori r4, r4, 41712
; CHECK-P9-LE-NEXT: lbzx r3, r3, r4
; CHECK-P9-LE-NEXT: blr
;
; CHECK-P9-BE-LABEL: ld_disjoint_align32_uint8_t_uint32_t:
; CHECK-P9-BE: # %bb.0: # %entry
; CHECK-P9-BE-NEXT: lis r4, -15264
; CHECK-P9-BE-NEXT: and r3, r3, r4
; CHECK-P9-BE-NEXT: lis r4, 15258
; CHECK-P9-BE-NEXT: ori r4, r4, 41715
; CHECK-P9-BE-NEXT: lbzx r3, r3, r4
; CHECK-P9-BE-NEXT: blr
;
; CHECK-P8-LE-LABEL: ld_disjoint_align32_uint8_t_uint32_t:
; CHECK-P8-LE: # %bb.0: # %entry
; CHECK-P8-LE-NEXT: lis r4, -15264
; CHECK-P8-LE-NEXT: lis r5, 15258
; CHECK-P8-LE-NEXT: and r3, r3, r4
; CHECK-P8-LE-NEXT: ori r4, r5, 41712
; CHECK-P8-LE-NEXT: lbzx r3, r3, r4
; CHECK-P8-LE-NEXT: blr
;
; CHECK-P8-BE-LABEL: ld_disjoint_align32_uint8_t_uint32_t:
; CHECK-P8-BE: # %bb.0: # %entry
; CHECK-P8-BE-NEXT: lis r4, -15264
; CHECK-P8-BE-NEXT: lis r5, 15258
; CHECK-P8-BE-NEXT: and r3, r3, r4
; CHECK-P8-BE-NEXT: ori r4, r5, 41715
; CHECK-P8-BE-NEXT: lbzx r3, r3, r4
; CHECK-P8-BE-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 = trunc i32 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_not_disjoint64_uint8_t_uint32_t(i64 %ptr) {
; CHECK-P10-LE-LABEL: ld_not_disjoint64_uint8_t_uint32_t:
; CHECK-P10-LE: # %bb.0: # %entry
; CHECK-P10-LE-NEXT: pli r4, 232
; CHECK-P10-LE-NEXT: pli r5, 3567587329
; CHECK-P10-LE-NEXT: rldimi r5, r4, 32, 0
; CHECK-P10-LE-NEXT: or r3, r3, r5
; CHECK-P10-LE-NEXT: lbz r3, 0(r3)
; CHECK-P10-LE-NEXT: blr
;
; CHECK-P10-BE-LABEL: ld_not_disjoint64_uint8_t_uint32_t:
; CHECK-P10-BE: # %bb.0: # %entry
; CHECK-P10-BE-NEXT: pli r4, 232
; CHECK-P10-BE-NEXT: pli r5, 3567587329
; CHECK-P10-BE-NEXT: rldimi r5, r4, 32, 0
; CHECK-P10-BE-NEXT: or r3, r3, r5
; CHECK-P10-BE-NEXT: lbz r3, 3(r3)
; CHECK-P10-BE-NEXT: blr
;
; CHECK-P9-LE-LABEL: ld_not_disjoint64_uint8_t_uint32_t:
; CHECK-P9-LE: # %bb.0: # %entry
; CHECK-P9-LE-NEXT: li r4, 29
; CHECK-P9-LE-NEXT: rldic r4, r4, 35, 24
; CHECK-P9-LE-NEXT: oris r4, r4, 54437
; CHECK-P9-LE-NEXT: ori r4, r4, 4097
; CHECK-P9-LE-NEXT: or r3, r3, r4
; CHECK-P9-LE-NEXT: lbz r3, 0(r3)
; CHECK-P9-LE-NEXT: blr
;
; CHECK-P9-BE-LABEL: ld_not_disjoint64_uint8_t_uint32_t:
; CHECK-P9-BE: # %bb.0: # %entry
; CHECK-P9-BE-NEXT: li r4, 29
; CHECK-P9-BE-NEXT: rldic r4, r4, 35, 24
; CHECK-P9-BE-NEXT: oris r4, r4, 54437
; CHECK-P9-BE-NEXT: ori r4, r4, 4097
; CHECK-P9-BE-NEXT: or r3, r3, r4
; CHECK-P9-BE-NEXT: lbz r3, 3(r3)
; CHECK-P9-BE-NEXT: blr
;
; CHECK-P8-LE-LABEL: ld_not_disjoint64_uint8_t_uint32_t:
; CHECK-P8-LE: # %bb.0: # %entry
; CHECK-P8-LE-NEXT: li r4, 29
; CHECK-P8-LE-NEXT: rldic r4, r4, 35, 24
; CHECK-P8-LE-NEXT: oris r4, r4, 54437
; CHECK-P8-LE-NEXT: ori r4, r4, 4097
; CHECK-P8-LE-NEXT: or r3, r3, r4
; CHECK-P8-LE-NEXT: lbz r3, 0(r3)
; CHECK-P8-LE-NEXT: blr
;
; CHECK-P8-BE-LABEL: ld_not_disjoint64_uint8_t_uint32_t:
; CHECK-P8-BE: # %bb.0: # %entry
; CHECK-P8-BE-NEXT: li r4, 29
; CHECK-P8-BE-NEXT: rldic r4, r4, 35, 24
; CHECK-P8-BE-NEXT: oris r4, r4, 54437
; CHECK-P8-BE-NEXT: ori r4, r4, 4097
; CHECK-P8-BE-NEXT: or r3, r3, r4
; CHECK-P8-BE-NEXT: lbz r3, 3(r3)
; CHECK-P8-BE-NEXT: blr
entry:
%or = or i64 %ptr, 1000000000001
%0 = inttoptr i64 %or to i32*
%1 = load i32, i32* %0, align 4
%conv = trunc i32 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_disjoint_unalign64_uint8_t_uint32_t(i64 %ptr) {
; CHECK-P10-LE-LABEL: ld_disjoint_unalign64_uint8_t_uint32_t:
; CHECK-P10-LE: # %bb.0: # %entry
; CHECK-P10-LE-NEXT: pli r4, 232
; CHECK-P10-LE-NEXT: pli r5, 3567587329
; CHECK-P10-LE-NEXT: rldicr r3, r3, 0, 23
; CHECK-P10-LE-NEXT: rldimi r5, r4, 32, 0
; CHECK-P10-LE-NEXT: lbzx r3, r3, r5
; CHECK-P10-LE-NEXT: blr
;
; CHECK-P10-BE-LABEL: ld_disjoint_unalign64_uint8_t_uint32_t:
; CHECK-P10-BE: # %bb.0: # %entry
; CHECK-P10-BE-NEXT: pli r4, 232
; CHECK-P10-BE-NEXT: pli r5, 3567587332
; CHECK-P10-BE-NEXT: rldicr r3, r3, 0, 23
; CHECK-P10-BE-NEXT: rldimi r5, r4, 32, 0
; CHECK-P10-BE-NEXT: lbzx r3, r3, r5
; CHECK-P10-BE-NEXT: blr
;
; CHECK-P9-LE-LABEL: ld_disjoint_unalign64_uint8_t_uint32_t:
; CHECK-P9-LE: # %bb.0: # %entry
; CHECK-P9-LE-NEXT: li r4, 29
; CHECK-P9-LE-NEXT: rldicr r3, r3, 0, 23
; CHECK-P9-LE-NEXT: rldic r4, r4, 35, 24
; CHECK-P9-LE-NEXT: oris r4, r4, 54437
; CHECK-P9-LE-NEXT: ori r4, r4, 4097
; CHECK-P9-LE-NEXT: lbzx r3, r3, r4
; CHECK-P9-LE-NEXT: blr
;
; CHECK-P9-BE-LABEL: ld_disjoint_unalign64_uint8_t_uint32_t:
; CHECK-P9-BE: # %bb.0: # %entry
; CHECK-P9-BE-NEXT: li r4, 29
; CHECK-P9-BE-NEXT: rldicr r3, r3, 0, 23
; CHECK-P9-BE-NEXT: rldic r4, r4, 35, 24
; CHECK-P9-BE-NEXT: oris r4, r4, 54437
; CHECK-P9-BE-NEXT: ori r4, r4, 4100
; CHECK-P9-BE-NEXT: lbzx r3, r3, r4
; CHECK-P9-BE-NEXT: blr
;
; CHECK-P8-LE-LABEL: ld_disjoint_unalign64_uint8_t_uint32_t:
; CHECK-P8-LE: # %bb.0: # %entry
; CHECK-P8-LE-NEXT: li r4, 29
; CHECK-P8-LE-NEXT: rldicr r3, r3, 0, 23
; CHECK-P8-LE-NEXT: rldic r4, r4, 35, 24
; CHECK-P8-LE-NEXT: oris r4, r4, 54437
; CHECK-P8-LE-NEXT: ori r4, r4, 4097
; CHECK-P8-LE-NEXT: lbzx r3, r3, r4
; CHECK-P8-LE-NEXT: blr
;
; CHECK-P8-BE-LABEL: ld_disjoint_unalign64_uint8_t_uint32_t:
; CHECK-P8-BE: # %bb.0: # %entry
; CHECK-P8-BE-NEXT: li r4, 29
; CHECK-P8-BE-NEXT: rldicr r3, r3, 0, 23
; CHECK-P8-BE-NEXT: rldic r4, r4, 35, 24
; CHECK-P8-BE-NEXT: oris r4, r4, 54437
; CHECK-P8-BE-NEXT: ori r4, r4, 4100
; CHECK-P8-BE-NEXT: lbzx r3, r3, r4
; CHECK-P8-BE-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 = trunc i32 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_disjoint_align64_uint8_t_uint32_t(i64 %ptr) {
; CHECK-P10-LE-LABEL: ld_disjoint_align64_uint8_t_uint32_t:
; CHECK-P10-LE: # %bb.0: # %entry
; CHECK-P10-LE-NEXT: pli r4, 244140625
; CHECK-P10-LE-NEXT: rldicr r3, r3, 0, 23
; CHECK-P10-LE-NEXT: rldic r4, r4, 12, 24
; CHECK-P10-LE-NEXT: lbzx r3, r3, r4
; CHECK-P10-LE-NEXT: blr
;
; CHECK-P10-BE-LABEL: ld_disjoint_align64_uint8_t_uint32_t:
; CHECK-P10-BE: # %bb.0: # %entry
; CHECK-P10-BE-NEXT: pli r4, 232
; CHECK-P10-BE-NEXT: pli r5, 3567587331
; CHECK-P10-BE-NEXT: rldicr r3, r3, 0, 23
; CHECK-P10-BE-NEXT: rldimi r5, r4, 32, 0
; CHECK-P10-BE-NEXT: lbzx r3, r3, r5
; CHECK-P10-BE-NEXT: blr
;
; CHECK-P9-LE-LABEL: ld_disjoint_align64_uint8_t_uint32_t:
; CHECK-P9-LE: # %bb.0: # %entry
; CHECK-P9-LE-NEXT: lis r4, 3725
; CHECK-P9-LE-NEXT: rldicr r3, r3, 0, 23
; CHECK-P9-LE-NEXT: ori r4, r4, 19025
; CHECK-P9-LE-NEXT: rldic r4, r4, 12, 24
; CHECK-P9-LE-NEXT: lbzx r3, r3, r4
; CHECK-P9-LE-NEXT: blr
;
; CHECK-P9-BE-LABEL: ld_disjoint_align64_uint8_t_uint32_t:
; CHECK-P9-BE: # %bb.0: # %entry
; CHECK-P9-BE-NEXT: li r4, 29
; CHECK-P9-BE-NEXT: rldicr r3, r3, 0, 23
; CHECK-P9-BE-NEXT: rldic r4, r4, 35, 24
; CHECK-P9-BE-NEXT: oris r4, r4, 54437
; CHECK-P9-BE-NEXT: ori r4, r4, 4099
; CHECK-P9-BE-NEXT: lbzx r3, r3, r4
; CHECK-P9-BE-NEXT: blr
;
; CHECK-P8-LE-LABEL: ld_disjoint_align64_uint8_t_uint32_t:
; CHECK-P8-LE: # %bb.0: # %entry
; CHECK-P8-LE-NEXT: lis r4, 3725
; CHECK-P8-LE-NEXT: rldicr r3, r3, 0, 23
; CHECK-P8-LE-NEXT: ori r4, r4, 19025
; CHECK-P8-LE-NEXT: rldic r4, r4, 12, 24
; CHECK-P8-LE-NEXT: lbzx r3, r3, r4
; CHECK-P8-LE-NEXT: blr
;
; CHECK-P8-BE-LABEL: ld_disjoint_align64_uint8_t_uint32_t:
; CHECK-P8-BE: # %bb.0: # %entry
; CHECK-P8-BE-NEXT: li r4, 29
; CHECK-P8-BE-NEXT: rldicr r3, r3, 0, 23
; CHECK-P8-BE-NEXT: rldic r4, r4, 35, 24
; CHECK-P8-BE-NEXT: oris r4, r4, 54437
; CHECK-P8-BE-NEXT: ori r4, r4, 4099
; CHECK-P8-BE-NEXT: lbzx r3, r3, r4
; CHECK-P8-BE-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 = trunc i32 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_cst_align16_uint8_t_uint32_t() {
; CHECK-LE-LABEL: ld_cst_align16_uint8_t_uint32_t:
; CHECK-LE: # %bb.0: # %entry
; CHECK-LE-NEXT: lbz r3, 4080(0)
; CHECK-LE-NEXT: blr
;
; CHECK-BE-LABEL: ld_cst_align16_uint8_t_uint32_t:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: lbz r3, 4083(0)
; CHECK-BE-NEXT: blr
entry:
%0 = load i32, i32* inttoptr (i64 4080 to i32*), align 16
%conv = trunc i32 %0 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_cst_align32_uint8_t_uint32_t() {
; CHECK-LE-LABEL: ld_cst_align32_uint8_t_uint32_t:
; CHECK-LE: # %bb.0: # %entry
; CHECK-LE-NEXT: lis r3, 153
; CHECK-LE-NEXT: lbz r3, -27108(r3)
; CHECK-LE-NEXT: blr
;
; CHECK-BE-LABEL: ld_cst_align32_uint8_t_uint32_t:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: lis r3, 153
; CHECK-BE-NEXT: lbz r3, -27105(r3)
; CHECK-BE-NEXT: blr
entry:
%0 = load i32, i32* inttoptr (i64 9999900 to i32*), align 4
%conv = trunc i32 %0 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_cst_unalign64_uint8_t_uint32_t() {
; CHECK-P10-LE-LABEL: ld_cst_unalign64_uint8_t_uint32_t:
; CHECK-P10-LE: # %bb.0: # %entry
; CHECK-P10-LE-NEXT: pli r3, 232
; CHECK-P10-LE-NEXT: pli r4, 3567587329
; CHECK-P10-LE-NEXT: rldimi r4, r3, 32, 0
; CHECK-P10-LE-NEXT: lbz r3, 0(r4)
; CHECK-P10-LE-NEXT: blr
;
; CHECK-P10-BE-LABEL: ld_cst_unalign64_uint8_t_uint32_t:
; CHECK-P10-BE: # %bb.0: # %entry
; CHECK-P10-BE-NEXT: pli r3, 232
; CHECK-P10-BE-NEXT: pli r4, 3567587332
; CHECK-P10-BE-NEXT: rldimi r4, r3, 32, 0
; CHECK-P10-BE-NEXT: lbz r3, 0(r4)
; CHECK-P10-BE-NEXT: blr
;
; CHECK-P9-LE-LABEL: ld_cst_unalign64_uint8_t_uint32_t:
; CHECK-P9-LE: # %bb.0: # %entry
; CHECK-P9-LE-NEXT: li r3, 29
; CHECK-P9-LE-NEXT: rldic r3, r3, 35, 24
; CHECK-P9-LE-NEXT: oris r3, r3, 54437
; CHECK-P9-LE-NEXT: ori r3, r3, 4097
; CHECK-P9-LE-NEXT: lbz r3, 0(r3)
; CHECK-P9-LE-NEXT: blr
;
; CHECK-P9-BE-LABEL: ld_cst_unalign64_uint8_t_uint32_t:
; CHECK-P9-BE: # %bb.0: # %entry
; CHECK-P9-BE-NEXT: li r3, 29
; CHECK-P9-BE-NEXT: rldic r3, r3, 35, 24
; CHECK-P9-BE-NEXT: oris r3, r3, 54437
; CHECK-P9-BE-NEXT: ori r3, r3, 4100
; CHECK-P9-BE-NEXT: lbz r3, 0(r3)
; CHECK-P9-BE-NEXT: blr
;
; CHECK-P8-LE-LABEL: ld_cst_unalign64_uint8_t_uint32_t:
; CHECK-P8-LE: # %bb.0: # %entry
; CHECK-P8-LE-NEXT: li r3, 29
; CHECK-P8-LE-NEXT: rldic r3, r3, 35, 24
; CHECK-P8-LE-NEXT: oris r3, r3, 54437
; CHECK-P8-LE-NEXT: ori r3, r3, 4097
; CHECK-P8-LE-NEXT: lbz r3, 0(r3)
; CHECK-P8-LE-NEXT: blr
;
; CHECK-P8-BE-LABEL: ld_cst_unalign64_uint8_t_uint32_t:
; CHECK-P8-BE: # %bb.0: # %entry
; CHECK-P8-BE-NEXT: li r3, 29
; CHECK-P8-BE-NEXT: rldic r3, r3, 35, 24
; CHECK-P8-BE-NEXT: oris r3, r3, 54437
; CHECK-P8-BE-NEXT: ori r3, r3, 4100
; CHECK-P8-BE-NEXT: lbz r3, 0(r3)
; CHECK-P8-BE-NEXT: blr
entry:
%0 = load i32, i32* inttoptr (i64 1000000000001 to i32*), align 4
%conv = trunc i32 %0 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_cst_align64_uint8_t_uint32_t() {
; CHECK-P10-LE-LABEL: ld_cst_align64_uint8_t_uint32_t:
; CHECK-P10-LE: # %bb.0: # %entry
; CHECK-P10-LE-NEXT: pli r3, 244140625
; CHECK-P10-LE-NEXT: rldic r3, r3, 12, 24
; CHECK-P10-LE-NEXT: lbz r3, 0(r3)
; CHECK-P10-LE-NEXT: blr
;
; CHECK-P10-BE-LABEL: ld_cst_align64_uint8_t_uint32_t:
; CHECK-P10-BE: # %bb.0: # %entry
; CHECK-P10-BE-NEXT: pli r3, 232
; CHECK-P10-BE-NEXT: pli r4, 3567587331
; CHECK-P10-BE-NEXT: rldimi r4, r3, 32, 0
; CHECK-P10-BE-NEXT: lbz r3, 0(r4)
; CHECK-P10-BE-NEXT: blr
;
; CHECK-P9-LE-LABEL: ld_cst_align64_uint8_t_uint32_t:
; CHECK-P9-LE: # %bb.0: # %entry
; CHECK-P9-LE-NEXT: lis r3, 3725
; CHECK-P9-LE-NEXT: ori r3, r3, 19025
; CHECK-P9-LE-NEXT: rldic r3, r3, 12, 24
; CHECK-P9-LE-NEXT: lbz r3, 0(r3)
; CHECK-P9-LE-NEXT: blr
;
; CHECK-P9-BE-LABEL: ld_cst_align64_uint8_t_uint32_t:
; CHECK-P9-BE: # %bb.0: # %entry
; CHECK-P9-BE-NEXT: li r3, 29
; CHECK-P9-BE-NEXT: rldic r3, r3, 35, 24
; CHECK-P9-BE-NEXT: oris r3, r3, 54437
; CHECK-P9-BE-NEXT: ori r3, r3, 4099
; CHECK-P9-BE-NEXT: lbz r3, 0(r3)
; CHECK-P9-BE-NEXT: blr
;
; CHECK-P8-LE-LABEL: ld_cst_align64_uint8_t_uint32_t:
; CHECK-P8-LE: # %bb.0: # %entry
; CHECK-P8-LE-NEXT: lis r3, 3725
; CHECK-P8-LE-NEXT: ori r3, r3, 19025
; CHECK-P8-LE-NEXT: rldic r3, r3, 12, 24
; CHECK-P8-LE-NEXT: lbz r3, 0(r3)
; CHECK-P8-LE-NEXT: blr
;
; CHECK-P8-BE-LABEL: ld_cst_align64_uint8_t_uint32_t:
; CHECK-P8-BE: # %bb.0: # %entry
; CHECK-P8-BE-NEXT: li r3, 29
; CHECK-P8-BE-NEXT: rldic r3, r3, 35, 24
; CHECK-P8-BE-NEXT: oris r3, r3, 54437
; CHECK-P8-BE-NEXT: ori r3, r3, 4099
; CHECK-P8-BE-NEXT: lbz r3, 0(r3)
; CHECK-P8-BE-NEXT: blr
entry:
%0 = load i32, i32* inttoptr (i64 1000000000000 to i32*), align 4096
%conv = trunc i32 %0 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_0_uint8_t_uint64_t(i64 %ptr) {
; CHECK-LE-LABEL: ld_0_uint8_t_uint64_t:
; CHECK-LE: # %bb.0: # %entry
; CHECK-LE-NEXT: lbz r3, 0(r3)
; CHECK-LE-NEXT: blr
;
; CHECK-BE-LABEL: ld_0_uint8_t_uint64_t:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: lbz r3, 7(r3)
; CHECK-BE-NEXT: blr
entry:
%0 = inttoptr i64 %ptr to i64*
%1 = load i64, i64* %0, align 8
%conv = trunc i64 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_align16_uint8_t_uint64_t(i8* nocapture readonly %ptr) {
; CHECK-LE-LABEL: ld_align16_uint8_t_uint64_t:
; CHECK-LE: # %bb.0: # %entry
; CHECK-LE-NEXT: lbz r3, 8(r3)
; CHECK-LE-NEXT: blr
;
; CHECK-BE-LABEL: ld_align16_uint8_t_uint64_t:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: lbz r3, 15(r3)
; CHECK-BE-NEXT: blr
entry:
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 8
%0 = bitcast i8* %add.ptr to i64*
%1 = load i64, i64* %0, align 8
%conv = trunc i64 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_align32_uint8_t_uint64_t(i8* nocapture readonly %ptr) {
; CHECK-P10-LE-LABEL: ld_align32_uint8_t_uint64_t:
; CHECK-P10-LE: # %bb.0: # %entry
; CHECK-P10-LE-NEXT: pli r4, 99999000
; CHECK-P10-LE-NEXT: lbzx r3, r3, r4
; CHECK-P10-LE-NEXT: blr
;
; CHECK-P10-BE-LABEL: ld_align32_uint8_t_uint64_t:
; CHECK-P10-BE: # %bb.0: # %entry
; CHECK-P10-BE-NEXT: pli r4, 99999007
; CHECK-P10-BE-NEXT: lbzx r3, r3, r4
; CHECK-P10-BE-NEXT: blr
;
; CHECK-P9-LE-LABEL: ld_align32_uint8_t_uint64_t:
; CHECK-P9-LE: # %bb.0: # %entry
; CHECK-P9-LE-NEXT: lis r4, 1525
; CHECK-P9-LE-NEXT: ori r4, r4, 56600
; CHECK-P9-LE-NEXT: lbzx r3, r3, r4
; CHECK-P9-LE-NEXT: blr
;
; CHECK-P9-BE-LABEL: ld_align32_uint8_t_uint64_t:
; CHECK-P9-BE: # %bb.0: # %entry
; CHECK-P9-BE-NEXT: lis r4, 1525
; CHECK-P9-BE-NEXT: ori r4, r4, 56607
; CHECK-P9-BE-NEXT: lbzx r3, r3, r4
; CHECK-P9-BE-NEXT: blr
;
; CHECK-P8-LE-LABEL: ld_align32_uint8_t_uint64_t:
; CHECK-P8-LE: # %bb.0: # %entry
; CHECK-P8-LE-NEXT: lis r4, 1525
; CHECK-P8-LE-NEXT: ori r4, r4, 56600
; CHECK-P8-LE-NEXT: lbzx r3, r3, r4
; CHECK-P8-LE-NEXT: blr
;
; CHECK-P8-BE-LABEL: ld_align32_uint8_t_uint64_t:
; CHECK-P8-BE: # %bb.0: # %entry
; CHECK-P8-BE-NEXT: lis r4, 1525
; CHECK-P8-BE-NEXT: ori r4, r4, 56607
; CHECK-P8-BE-NEXT: lbzx r3, r3, r4
; CHECK-P8-BE-NEXT: blr
entry:
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 99999000
%0 = bitcast i8* %add.ptr to i64*
%1 = load i64, i64* %0, align 8
%conv = trunc i64 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_unalign64_uint8_t_uint64_t(i8* nocapture readonly %ptr) {
; CHECK-P10-LE-LABEL: ld_unalign64_uint8_t_uint64_t:
; CHECK-P10-LE: # %bb.0: # %entry
; CHECK-P10-LE-NEXT: pli r4, 232
; CHECK-P10-LE-NEXT: pli r5, 3567587329
; CHECK-P10-LE-NEXT: rldimi r5, r4, 32, 0
; CHECK-P10-LE-NEXT: lbzx r3, r3, r5
; CHECK-P10-LE-NEXT: blr
;
; CHECK-P10-BE-LABEL: ld_unalign64_uint8_t_uint64_t:
; CHECK-P10-BE: # %bb.0: # %entry
; CHECK-P10-BE-NEXT: pli r4, 232
; CHECK-P10-BE-NEXT: pli r5, 3567587336
; CHECK-P10-BE-NEXT: rldimi r5, r4, 32, 0
; CHECK-P10-BE-NEXT: lbzx r3, r3, r5
; CHECK-P10-BE-NEXT: blr
;
; CHECK-P9-LE-LABEL: ld_unalign64_uint8_t_uint64_t:
; CHECK-P9-LE: # %bb.0: # %entry
; CHECK-P9-LE-NEXT: li r4, 29
; CHECK-P9-LE-NEXT: rldic r4, r4, 35, 24
; CHECK-P9-LE-NEXT: oris r4, r4, 54437
; CHECK-P9-LE-NEXT: ori r4, r4, 4097
; CHECK-P9-LE-NEXT: lbzx r3, r3, r4
; CHECK-P9-LE-NEXT: blr
;
; CHECK-P9-BE-LABEL: ld_unalign64_uint8_t_uint64_t:
; CHECK-P9-BE: # %bb.0: # %entry
; CHECK-P9-BE-NEXT: li r4, 29
; CHECK-P9-BE-NEXT: rldic r4, r4, 35, 24
; CHECK-P9-BE-NEXT: oris r4, r4, 54437
; CHECK-P9-BE-NEXT: ori r4, r4, 4104
; CHECK-P9-BE-NEXT: lbzx r3, r3, r4
; CHECK-P9-BE-NEXT: blr
;
; CHECK-P8-LE-LABEL: ld_unalign64_uint8_t_uint64_t:
; CHECK-P8-LE: # %bb.0: # %entry
; CHECK-P8-LE-NEXT: li r4, 29
; CHECK-P8-LE-NEXT: rldic r4, r4, 35, 24
; CHECK-P8-LE-NEXT: oris r4, r4, 54437
; CHECK-P8-LE-NEXT: ori r4, r4, 4097
; CHECK-P8-LE-NEXT: lbzx r3, r3, r4
; CHECK-P8-LE-NEXT: blr
;
; CHECK-P8-BE-LABEL: ld_unalign64_uint8_t_uint64_t:
; CHECK-P8-BE: # %bb.0: # %entry
; CHECK-P8-BE-NEXT: li r4, 29
; CHECK-P8-BE-NEXT: rldic r4, r4, 35, 24
; CHECK-P8-BE-NEXT: oris r4, r4, 54437
; CHECK-P8-BE-NEXT: ori r4, r4, 4104
; CHECK-P8-BE-NEXT: lbzx r3, r3, r4
; CHECK-P8-BE-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
%conv = trunc i64 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_align64_uint8_t_uint64_t(i8* nocapture readonly %ptr) {
; CHECK-P10-LE-LABEL: ld_align64_uint8_t_uint64_t:
; CHECK-P10-LE: # %bb.0: # %entry
; CHECK-P10-LE-NEXT: pli r4, 244140625
; CHECK-P10-LE-NEXT: rldic r4, r4, 12, 24
; CHECK-P10-LE-NEXT: lbzx r3, r3, r4
; CHECK-P10-LE-NEXT: blr
;
; CHECK-P10-BE-LABEL: ld_align64_uint8_t_uint64_t:
; CHECK-P10-BE: # %bb.0: # %entry
; CHECK-P10-BE-NEXT: pli r4, 232
; CHECK-P10-BE-NEXT: pli r5, 3567587335
; CHECK-P10-BE-NEXT: rldimi r5, r4, 32, 0
; CHECK-P10-BE-NEXT: lbzx r3, r3, r5
; CHECK-P10-BE-NEXT: blr
;
; CHECK-P9-LE-LABEL: ld_align64_uint8_t_uint64_t:
; CHECK-P9-LE: # %bb.0: # %entry
; CHECK-P9-LE-NEXT: lis r4, 3725
; CHECK-P9-LE-NEXT: ori r4, r4, 19025
; CHECK-P9-LE-NEXT: rldic r4, r4, 12, 24
; CHECK-P9-LE-NEXT: lbzx r3, r3, r4
; CHECK-P9-LE-NEXT: blr
;
; CHECK-P9-BE-LABEL: ld_align64_uint8_t_uint64_t:
; CHECK-P9-BE: # %bb.0: # %entry
; CHECK-P9-BE-NEXT: li r4, 29
; CHECK-P9-BE-NEXT: rldic r4, r4, 35, 24
; CHECK-P9-BE-NEXT: oris r4, r4, 54437
; CHECK-P9-BE-NEXT: ori r4, r4, 4103
; CHECK-P9-BE-NEXT: lbzx r3, r3, r4
; CHECK-P9-BE-NEXT: blr
;
; CHECK-P8-LE-LABEL: ld_align64_uint8_t_uint64_t:
; CHECK-P8-LE: # %bb.0: # %entry
; CHECK-P8-LE-NEXT: lis r4, 3725
; CHECK-P8-LE-NEXT: ori r4, r4, 19025
; CHECK-P8-LE-NEXT: rldic r4, r4, 12, 24
; CHECK-P8-LE-NEXT: lbzx r3, r3, r4
; CHECK-P8-LE-NEXT: blr
;
; CHECK-P8-BE-LABEL: ld_align64_uint8_t_uint64_t:
; CHECK-P8-BE: # %bb.0: # %entry
; CHECK-P8-BE-NEXT: li r4, 29
; CHECK-P8-BE-NEXT: rldic r4, r4, 35, 24
; CHECK-P8-BE-NEXT: oris r4, r4, 54437
; CHECK-P8-BE-NEXT: ori r4, r4, 4103
; CHECK-P8-BE-NEXT: lbzx r3, r3, r4
; CHECK-P8-BE-NEXT: blr
entry:
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1000000000000
%0 = bitcast i8* %add.ptr to i64*
%1 = load i64, i64* %0, align 8
%conv = trunc i64 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_reg_uint8_t_uint64_t(i8* nocapture readonly %ptr, i64 %off) {
; CHECK-LE-LABEL: ld_reg_uint8_t_uint64_t:
; CHECK-LE: # %bb.0: # %entry
; CHECK-LE-NEXT: lbzx r3, r3, r4
; CHECK-LE-NEXT: blr
;
; CHECK-BE-LABEL: ld_reg_uint8_t_uint64_t:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: add r3, r3, r4
; CHECK-BE-NEXT: lbz r3, 7(r3)
; CHECK-BE-NEXT: blr
entry:
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 %off
%0 = bitcast i8* %add.ptr to i64*
%1 = load i64, i64* %0, align 8
%conv = trunc i64 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_or_uint8_t_uint64_t(i64 %ptr, i8 zeroext %off) {
; CHECK-LE-LABEL: ld_or_uint8_t_uint64_t:
; CHECK-LE: # %bb.0: # %entry
; CHECK-LE-NEXT: or r3, r4, r3
; CHECK-LE-NEXT: lbz r3, 0(r3)
; CHECK-LE-NEXT: blr
;
; CHECK-BE-LABEL: ld_or_uint8_t_uint64_t:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: or r3, r4, r3
; CHECK-BE-NEXT: lbz r3, 7(r3)
; CHECK-BE-NEXT: blr
entry:
%conv = zext i8 %off to i64
%or = or i64 %conv, %ptr
%0 = inttoptr i64 %or to i64*
%1 = load i64, i64* %0, align 8
%conv1 = trunc i64 %1 to i8
ret i8 %conv1
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_not_disjoint16_uint8_t_uint64_t(i64 %ptr) {
; CHECK-LE-LABEL: ld_not_disjoint16_uint8_t_uint64_t:
; CHECK-LE: # %bb.0: # %entry
; CHECK-LE-NEXT: ori r3, r3, 6
; CHECK-LE-NEXT: lbz r3, 0(r3)
; CHECK-LE-NEXT: blr
;
; CHECK-BE-LABEL: ld_not_disjoint16_uint8_t_uint64_t:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: ori r3, r3, 6
; CHECK-BE-NEXT: lbz r3, 7(r3)
; CHECK-BE-NEXT: blr
entry:
%or = or i64 %ptr, 6
%0 = inttoptr i64 %or to i64*
%1 = load i64, i64* %0, align 8
%conv = trunc i64 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_disjoint_align16_uint8_t_uint64_t(i64 %ptr) {
; CHECK-LE-LABEL: ld_disjoint_align16_uint8_t_uint64_t:
; CHECK-LE: # %bb.0: # %entry
; CHECK-LE-NEXT: rldicr r3, r3, 0, 51
; CHECK-LE-NEXT: lbz r3, 24(r3)
; CHECK-LE-NEXT: blr
;
; CHECK-BE-LABEL: ld_disjoint_align16_uint8_t_uint64_t:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: rldicr r3, r3, 0, 51
; CHECK-BE-NEXT: lbz r3, 31(r3)
; CHECK-BE-NEXT: blr
entry:
%and = and i64 %ptr, -4096
%or = or i64 %and, 24
%0 = inttoptr i64 %or to i64*
%1 = load i64, i64* %0, align 8
%conv = trunc i64 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_not_disjoint32_uint8_t_uint64_t(i64 %ptr) {
; CHECK-LE-LABEL: ld_not_disjoint32_uint8_t_uint64_t:
; CHECK-LE: # %bb.0: # %entry
; CHECK-LE-NEXT: ori r3, r3, 34463
; CHECK-LE-NEXT: oris r3, r3, 1
; CHECK-LE-NEXT: lbz r3, 0(r3)
; CHECK-LE-NEXT: blr
;
; CHECK-BE-LABEL: ld_not_disjoint32_uint8_t_uint64_t:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: ori r3, r3, 34463
; CHECK-BE-NEXT: oris r3, r3, 1
; CHECK-BE-NEXT: lbz r3, 7(r3)
; CHECK-BE-NEXT: blr
entry:
%or = or i64 %ptr, 99999
%0 = inttoptr i64 %or to i64*
%1 = load i64, i64* %0, align 8
%conv = trunc i64 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_disjoint_align32_uint8_t_uint64_t(i64 %ptr) {
; CHECK-P10-LE-LABEL: ld_disjoint_align32_uint8_t_uint64_t:
; CHECK-P10-LE: # %bb.0: # %entry
; CHECK-P10-LE-NEXT: lis r4, -15264
; CHECK-P10-LE-NEXT: and r3, r3, r4
; CHECK-P10-LE-NEXT: pli r4, 999990000
; CHECK-P10-LE-NEXT: lbzx r3, r3, r4
; CHECK-P10-LE-NEXT: blr
;
; CHECK-P10-BE-LABEL: ld_disjoint_align32_uint8_t_uint64_t:
; CHECK-P10-BE: # %bb.0: # %entry
; CHECK-P10-BE-NEXT: lis r4, -15264
; CHECK-P10-BE-NEXT: and r3, r3, r4
; CHECK-P10-BE-NEXT: pli r4, 999990007
; CHECK-P10-BE-NEXT: lbzx r3, r3, r4
; CHECK-P10-BE-NEXT: blr
;
; CHECK-P9-LE-LABEL: ld_disjoint_align32_uint8_t_uint64_t:
; CHECK-P9-LE: # %bb.0: # %entry
; CHECK-P9-LE-NEXT: lis r4, -15264
; CHECK-P9-LE-NEXT: and r3, r3, r4
; CHECK-P9-LE-NEXT: lis r4, 15258
; CHECK-P9-LE-NEXT: ori r4, r4, 41712
; CHECK-P9-LE-NEXT: lbzx r3, r3, r4
; CHECK-P9-LE-NEXT: blr
;
; CHECK-P9-BE-LABEL: ld_disjoint_align32_uint8_t_uint64_t:
; CHECK-P9-BE: # %bb.0: # %entry
; CHECK-P9-BE-NEXT: lis r4, -15264
; CHECK-P9-BE-NEXT: and r3, r3, r4
; CHECK-P9-BE-NEXT: lis r4, 15258
; CHECK-P9-BE-NEXT: ori r4, r4, 41719
; CHECK-P9-BE-NEXT: lbzx r3, r3, r4
; CHECK-P9-BE-NEXT: blr
;
; CHECK-P8-LE-LABEL: ld_disjoint_align32_uint8_t_uint64_t:
; CHECK-P8-LE: # %bb.0: # %entry
; CHECK-P8-LE-NEXT: lis r4, -15264
; CHECK-P8-LE-NEXT: lis r5, 15258
; CHECK-P8-LE-NEXT: and r3, r3, r4
; CHECK-P8-LE-NEXT: ori r4, r5, 41712
; CHECK-P8-LE-NEXT: lbzx r3, r3, r4
; CHECK-P8-LE-NEXT: blr
;
; CHECK-P8-BE-LABEL: ld_disjoint_align32_uint8_t_uint64_t:
; CHECK-P8-BE: # %bb.0: # %entry
; CHECK-P8-BE-NEXT: lis r4, -15264
; CHECK-P8-BE-NEXT: lis r5, 15258
; CHECK-P8-BE-NEXT: and r3, r3, r4
; CHECK-P8-BE-NEXT: ori r4, r5, 41719
; CHECK-P8-BE-NEXT: lbzx r3, r3, r4
; CHECK-P8-BE-NEXT: blr
entry:
%and = and i64 %ptr, -1000341504
%or = or i64 %and, 999990000
%0 = inttoptr i64 %or to i64*
%1 = load i64, i64* %0, align 16
%conv = trunc i64 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_not_disjoint64_uint8_t_uint64_t(i64 %ptr) {
; CHECK-P10-LE-LABEL: ld_not_disjoint64_uint8_t_uint64_t:
; CHECK-P10-LE: # %bb.0: # %entry
; CHECK-P10-LE-NEXT: pli r4, 232
; CHECK-P10-LE-NEXT: pli r5, 3567587329
; CHECK-P10-LE-NEXT: rldimi r5, r4, 32, 0
; CHECK-P10-LE-NEXT: or r3, r3, r5
; CHECK-P10-LE-NEXT: lbz r3, 0(r3)
; CHECK-P10-LE-NEXT: blr
;
; CHECK-P10-BE-LABEL: ld_not_disjoint64_uint8_t_uint64_t:
; CHECK-P10-BE: # %bb.0: # %entry
; CHECK-P10-BE-NEXT: pli r4, 232
; CHECK-P10-BE-NEXT: pli r5, 3567587329
; CHECK-P10-BE-NEXT: rldimi r5, r4, 32, 0
; CHECK-P10-BE-NEXT: or r3, r3, r5
; CHECK-P10-BE-NEXT: lbz r3, 7(r3)
; CHECK-P10-BE-NEXT: blr
;
; CHECK-P9-LE-LABEL: ld_not_disjoint64_uint8_t_uint64_t:
; CHECK-P9-LE: # %bb.0: # %entry
; CHECK-P9-LE-NEXT: li r4, 29
; CHECK-P9-LE-NEXT: rldic r4, r4, 35, 24
; CHECK-P9-LE-NEXT: oris r4, r4, 54437
; CHECK-P9-LE-NEXT: ori r4, r4, 4097
; CHECK-P9-LE-NEXT: or r3, r3, r4
; CHECK-P9-LE-NEXT: lbz r3, 0(r3)
; CHECK-P9-LE-NEXT: blr
;
; CHECK-P9-BE-LABEL: ld_not_disjoint64_uint8_t_uint64_t:
; CHECK-P9-BE: # %bb.0: # %entry
; CHECK-P9-BE-NEXT: li r4, 29
; CHECK-P9-BE-NEXT: rldic r4, r4, 35, 24
; CHECK-P9-BE-NEXT: oris r4, r4, 54437
; CHECK-P9-BE-NEXT: ori r4, r4, 4097
; CHECK-P9-BE-NEXT: or r3, r3, r4
; CHECK-P9-BE-NEXT: lbz r3, 7(r3)
; CHECK-P9-BE-NEXT: blr
;
; CHECK-P8-LE-LABEL: ld_not_disjoint64_uint8_t_uint64_t:
; CHECK-P8-LE: # %bb.0: # %entry
; CHECK-P8-LE-NEXT: li r4, 29
; CHECK-P8-LE-NEXT: rldic r4, r4, 35, 24
; CHECK-P8-LE-NEXT: oris r4, r4, 54437
; CHECK-P8-LE-NEXT: ori r4, r4, 4097
; CHECK-P8-LE-NEXT: or r3, r3, r4
; CHECK-P8-LE-NEXT: lbz r3, 0(r3)
; CHECK-P8-LE-NEXT: blr
;
; CHECK-P8-BE-LABEL: ld_not_disjoint64_uint8_t_uint64_t:
; CHECK-P8-BE: # %bb.0: # %entry
; CHECK-P8-BE-NEXT: li r4, 29
; CHECK-P8-BE-NEXT: rldic r4, r4, 35, 24
; CHECK-P8-BE-NEXT: oris r4, r4, 54437
; CHECK-P8-BE-NEXT: ori r4, r4, 4097
; CHECK-P8-BE-NEXT: or r3, r3, r4
; CHECK-P8-BE-NEXT: lbz r3, 7(r3)
; CHECK-P8-BE-NEXT: blr
entry:
%or = or i64 %ptr, 1000000000001
%0 = inttoptr i64 %or to i64*
%1 = load i64, i64* %0, align 8
%conv = trunc i64 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_disjoint_unalign64_uint8_t_uint64_t(i64 %ptr) {
; CHECK-P10-LE-LABEL: ld_disjoint_unalign64_uint8_t_uint64_t:
; CHECK-P10-LE: # %bb.0: # %entry
; CHECK-P10-LE-NEXT: pli r4, 232
; CHECK-P10-LE-NEXT: pli r5, 3567587329
; CHECK-P10-LE-NEXT: rldicr r3, r3, 0, 23
; CHECK-P10-LE-NEXT: rldimi r5, r4, 32, 0
; CHECK-P10-LE-NEXT: lbzx r3, r3, r5
; CHECK-P10-LE-NEXT: blr
;
; CHECK-P10-BE-LABEL: ld_disjoint_unalign64_uint8_t_uint64_t:
; CHECK-P10-BE: # %bb.0: # %entry
; CHECK-P10-BE-NEXT: pli r4, 232
; CHECK-P10-BE-NEXT: pli r5, 3567587336
; CHECK-P10-BE-NEXT: rldicr r3, r3, 0, 23
; CHECK-P10-BE-NEXT: rldimi r5, r4, 32, 0
; CHECK-P10-BE-NEXT: lbzx r3, r3, r5
; CHECK-P10-BE-NEXT: blr
;
; CHECK-P9-LE-LABEL: ld_disjoint_unalign64_uint8_t_uint64_t:
; CHECK-P9-LE: # %bb.0: # %entry
; CHECK-P9-LE-NEXT: li r4, 29
; CHECK-P9-LE-NEXT: rldicr r3, r3, 0, 23
; CHECK-P9-LE-NEXT: rldic r4, r4, 35, 24
; CHECK-P9-LE-NEXT: oris r4, r4, 54437
; CHECK-P9-LE-NEXT: ori r4, r4, 4097
; CHECK-P9-LE-NEXT: lbzx r3, r3, r4
; CHECK-P9-LE-NEXT: blr
;
; CHECK-P9-BE-LABEL: ld_disjoint_unalign64_uint8_t_uint64_t:
; CHECK-P9-BE: # %bb.0: # %entry
; CHECK-P9-BE-NEXT: li r4, 29
; CHECK-P9-BE-NEXT: rldicr r3, r3, 0, 23
; CHECK-P9-BE-NEXT: rldic r4, r4, 35, 24
; CHECK-P9-BE-NEXT: oris r4, r4, 54437
; CHECK-P9-BE-NEXT: ori r4, r4, 4104
; CHECK-P9-BE-NEXT: lbzx r3, r3, r4
; CHECK-P9-BE-NEXT: blr
;
; CHECK-P8-LE-LABEL: ld_disjoint_unalign64_uint8_t_uint64_t:
; CHECK-P8-LE: # %bb.0: # %entry
; CHECK-P8-LE-NEXT: li r4, 29
; CHECK-P8-LE-NEXT: rldicr r3, r3, 0, 23
; CHECK-P8-LE-NEXT: rldic r4, r4, 35, 24
; CHECK-P8-LE-NEXT: oris r4, r4, 54437
; CHECK-P8-LE-NEXT: ori r4, r4, 4097
; CHECK-P8-LE-NEXT: lbzx r3, r3, r4
; CHECK-P8-LE-NEXT: blr
;
; CHECK-P8-BE-LABEL: ld_disjoint_unalign64_uint8_t_uint64_t:
; CHECK-P8-BE: # %bb.0: # %entry
; CHECK-P8-BE-NEXT: li r4, 29
; CHECK-P8-BE-NEXT: rldicr r3, r3, 0, 23
; CHECK-P8-BE-NEXT: rldic r4, r4, 35, 24
; CHECK-P8-BE-NEXT: oris r4, r4, 54437
; CHECK-P8-BE-NEXT: ori r4, r4, 4104
; CHECK-P8-BE-NEXT: lbzx r3, r3, r4
; CHECK-P8-BE-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
%conv = trunc i64 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_disjoint_align64_uint8_t_uint64_t(i64 %ptr) {
; CHECK-P10-LE-LABEL: ld_disjoint_align64_uint8_t_uint64_t:
; CHECK-P10-LE: # %bb.0: # %entry
; CHECK-P10-LE-NEXT: pli r4, 244140625
; CHECK-P10-LE-NEXT: rldicr r3, r3, 0, 23
; CHECK-P10-LE-NEXT: rldic r4, r4, 12, 24
; CHECK-P10-LE-NEXT: lbzx r3, r3, r4
; CHECK-P10-LE-NEXT: blr
;
; CHECK-P10-BE-LABEL: ld_disjoint_align64_uint8_t_uint64_t:
; CHECK-P10-BE: # %bb.0: # %entry
; CHECK-P10-BE-NEXT: pli r4, 232
; CHECK-P10-BE-NEXT: pli r5, 3567587335
; CHECK-P10-BE-NEXT: rldicr r3, r3, 0, 23
; CHECK-P10-BE-NEXT: rldimi r5, r4, 32, 0
; CHECK-P10-BE-NEXT: lbzx r3, r3, r5
; CHECK-P10-BE-NEXT: blr
;
; CHECK-P9-LE-LABEL: ld_disjoint_align64_uint8_t_uint64_t:
; CHECK-P9-LE: # %bb.0: # %entry
; CHECK-P9-LE-NEXT: lis r4, 3725
; CHECK-P9-LE-NEXT: rldicr r3, r3, 0, 23
; CHECK-P9-LE-NEXT: ori r4, r4, 19025
; CHECK-P9-LE-NEXT: rldic r4, r4, 12, 24
; CHECK-P9-LE-NEXT: lbzx r3, r3, r4
; CHECK-P9-LE-NEXT: blr
;
; CHECK-P9-BE-LABEL: ld_disjoint_align64_uint8_t_uint64_t:
; CHECK-P9-BE: # %bb.0: # %entry
; CHECK-P9-BE-NEXT: li r4, 29
; CHECK-P9-BE-NEXT: rldicr r3, r3, 0, 23
; CHECK-P9-BE-NEXT: rldic r4, r4, 35, 24
; CHECK-P9-BE-NEXT: oris r4, r4, 54437
; CHECK-P9-BE-NEXT: ori r4, r4, 4103
; CHECK-P9-BE-NEXT: lbzx r3, r3, r4
; CHECK-P9-BE-NEXT: blr
;
; CHECK-P8-LE-LABEL: ld_disjoint_align64_uint8_t_uint64_t:
; CHECK-P8-LE: # %bb.0: # %entry
; CHECK-P8-LE-NEXT: lis r4, 3725
; CHECK-P8-LE-NEXT: rldicr r3, r3, 0, 23
; CHECK-P8-LE-NEXT: ori r4, r4, 19025
; CHECK-P8-LE-NEXT: rldic r4, r4, 12, 24
; CHECK-P8-LE-NEXT: lbzx r3, r3, r4
; CHECK-P8-LE-NEXT: blr
;
; CHECK-P8-BE-LABEL: ld_disjoint_align64_uint8_t_uint64_t:
; CHECK-P8-BE: # %bb.0: # %entry
; CHECK-P8-BE-NEXT: li r4, 29
; CHECK-P8-BE-NEXT: rldicr r3, r3, 0, 23
; CHECK-P8-BE-NEXT: rldic r4, r4, 35, 24
; CHECK-P8-BE-NEXT: oris r4, r4, 54437
; CHECK-P8-BE-NEXT: ori r4, r4, 4103
; CHECK-P8-BE-NEXT: lbzx r3, r3, r4
; CHECK-P8-BE-NEXT: blr
entry:
%and = and i64 %ptr, -1099511627776
%or = or i64 %and, 1000000000000
%0 = inttoptr i64 %or to i64*
%1 = load i64, i64* %0, align 4096
%conv = trunc i64 %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_cst_align16_uint8_t_uint64_t() {
; CHECK-LE-LABEL: ld_cst_align16_uint8_t_uint64_t:
; CHECK-LE: # %bb.0: # %entry
; CHECK-LE-NEXT: lbz r3, 4080(0)
; CHECK-LE-NEXT: blr
;
; CHECK-BE-LABEL: ld_cst_align16_uint8_t_uint64_t:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: lbz r3, 4087(0)
; CHECK-BE-NEXT: blr
entry:
%0 = load i64, i64* inttoptr (i64 4080 to i64*), align 16
%conv = trunc i64 %0 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_cst_align32_uint8_t_uint64_t() {
; CHECK-LE-LABEL: ld_cst_align32_uint8_t_uint64_t:
; CHECK-LE: # %bb.0: # %entry
; CHECK-LE-NEXT: lis r3, 153
; CHECK-LE-NEXT: lbz r3, -27108(r3)
; CHECK-LE-NEXT: blr
;
; CHECK-BE-LABEL: ld_cst_align32_uint8_t_uint64_t:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: lis r3, 153
; CHECK-BE-NEXT: lbz r3, -27101(r3)
; CHECK-BE-NEXT: blr
entry:
%0 = load i64, i64* inttoptr (i64 9999900 to i64*), align 8
%conv = trunc i64 %0 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_cst_unalign64_uint8_t_uint64_t() {
; CHECK-P10-LE-LABEL: ld_cst_unalign64_uint8_t_uint64_t:
; CHECK-P10-LE: # %bb.0: # %entry
; CHECK-P10-LE-NEXT: pli r3, 232
; CHECK-P10-LE-NEXT: pli r4, 3567587329
; CHECK-P10-LE-NEXT: rldimi r4, r3, 32, 0
; CHECK-P10-LE-NEXT: lbz r3, 0(r4)
; CHECK-P10-LE-NEXT: blr
;
; CHECK-P10-BE-LABEL: ld_cst_unalign64_uint8_t_uint64_t:
; CHECK-P10-BE: # %bb.0: # %entry
; CHECK-P10-BE-NEXT: pli r3, 232
; CHECK-P10-BE-NEXT: pli r4, 3567587336
; CHECK-P10-BE-NEXT: rldimi r4, r3, 32, 0
; CHECK-P10-BE-NEXT: lbz r3, 0(r4)
; CHECK-P10-BE-NEXT: blr
;
; CHECK-P9-LE-LABEL: ld_cst_unalign64_uint8_t_uint64_t:
; CHECK-P9-LE: # %bb.0: # %entry
; CHECK-P9-LE-NEXT: li r3, 29
; CHECK-P9-LE-NEXT: rldic r3, r3, 35, 24
; CHECK-P9-LE-NEXT: oris r3, r3, 54437
; CHECK-P9-LE-NEXT: ori r3, r3, 4097
; CHECK-P9-LE-NEXT: lbz r3, 0(r3)
; CHECK-P9-LE-NEXT: blr
;
; CHECK-P9-BE-LABEL: ld_cst_unalign64_uint8_t_uint64_t:
; CHECK-P9-BE: # %bb.0: # %entry
; CHECK-P9-BE-NEXT: li r3, 29
; CHECK-P9-BE-NEXT: rldic r3, r3, 35, 24
; CHECK-P9-BE-NEXT: oris r3, r3, 54437
; CHECK-P9-BE-NEXT: ori r3, r3, 4104
; CHECK-P9-BE-NEXT: lbz r3, 0(r3)
; CHECK-P9-BE-NEXT: blr
;
; CHECK-P8-LE-LABEL: ld_cst_unalign64_uint8_t_uint64_t:
; CHECK-P8-LE: # %bb.0: # %entry
; CHECK-P8-LE-NEXT: li r3, 29
; CHECK-P8-LE-NEXT: rldic r3, r3, 35, 24
; CHECK-P8-LE-NEXT: oris r3, r3, 54437
; CHECK-P8-LE-NEXT: ori r3, r3, 4097
; CHECK-P8-LE-NEXT: lbz r3, 0(r3)
; CHECK-P8-LE-NEXT: blr
;
; CHECK-P8-BE-LABEL: ld_cst_unalign64_uint8_t_uint64_t:
; CHECK-P8-BE: # %bb.0: # %entry
; CHECK-P8-BE-NEXT: li r3, 29
; CHECK-P8-BE-NEXT: rldic r3, r3, 35, 24
; CHECK-P8-BE-NEXT: oris r3, r3, 54437
; CHECK-P8-BE-NEXT: ori r3, r3, 4104
; CHECK-P8-BE-NEXT: lbz r3, 0(r3)
; CHECK-P8-BE-NEXT: blr
entry:
%0 = load i64, i64* inttoptr (i64 1000000000001 to i64*), align 8
%conv = trunc i64 %0 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_cst_align64_uint8_t_uint64_t() {
; CHECK-P10-LE-LABEL: ld_cst_align64_uint8_t_uint64_t:
; CHECK-P10-LE: # %bb.0: # %entry
; CHECK-P10-LE-NEXT: pli r3, 244140625
; CHECK-P10-LE-NEXT: rldic r3, r3, 12, 24
; CHECK-P10-LE-NEXT: lbz r3, 0(r3)
; CHECK-P10-LE-NEXT: blr
;
; CHECK-P10-BE-LABEL: ld_cst_align64_uint8_t_uint64_t:
; CHECK-P10-BE: # %bb.0: # %entry
; CHECK-P10-BE-NEXT: pli r3, 232
; CHECK-P10-BE-NEXT: pli r4, 3567587335
; CHECK-P10-BE-NEXT: rldimi r4, r3, 32, 0
; CHECK-P10-BE-NEXT: lbz r3, 0(r4)
; CHECK-P10-BE-NEXT: blr
;
; CHECK-P9-LE-LABEL: ld_cst_align64_uint8_t_uint64_t:
; CHECK-P9-LE: # %bb.0: # %entry
; CHECK-P9-LE-NEXT: lis r3, 3725
; CHECK-P9-LE-NEXT: ori r3, r3, 19025
; CHECK-P9-LE-NEXT: rldic r3, r3, 12, 24
; CHECK-P9-LE-NEXT: lbz r3, 0(r3)
; CHECK-P9-LE-NEXT: blr
;
; CHECK-P9-BE-LABEL: ld_cst_align64_uint8_t_uint64_t:
; CHECK-P9-BE: # %bb.0: # %entry
; CHECK-P9-BE-NEXT: li r3, 29
; CHECK-P9-BE-NEXT: rldic r3, r3, 35, 24
; CHECK-P9-BE-NEXT: oris r3, r3, 54437
; CHECK-P9-BE-NEXT: ori r3, r3, 4103
; CHECK-P9-BE-NEXT: lbz r3, 0(r3)
; CHECK-P9-BE-NEXT: blr
;
; CHECK-P8-LE-LABEL: ld_cst_align64_uint8_t_uint64_t:
; CHECK-P8-LE: # %bb.0: # %entry
; CHECK-P8-LE-NEXT: lis r3, 3725
; CHECK-P8-LE-NEXT: ori r3, r3, 19025
; CHECK-P8-LE-NEXT: rldic r3, r3, 12, 24
; CHECK-P8-LE-NEXT: lbz r3, 0(r3)
; CHECK-P8-LE-NEXT: blr
;
; CHECK-P8-BE-LABEL: ld_cst_align64_uint8_t_uint64_t:
; CHECK-P8-BE: # %bb.0: # %entry
; CHECK-P8-BE-NEXT: li r3, 29
; CHECK-P8-BE-NEXT: rldic r3, r3, 35, 24
; CHECK-P8-BE-NEXT: oris r3, r3, 54437
; CHECK-P8-BE-NEXT: ori r3, r3, 4103
; CHECK-P8-BE-NEXT: lbz r3, 0(r3)
; CHECK-P8-BE-NEXT: blr
entry:
%0 = load i64, i64* inttoptr (i64 1000000000000 to i64*), align 4096
%conv = trunc i64 %0 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_0_uint8_t_float(i64 %ptr) {
; CHECK-LABEL: ld_0_uint8_t_float:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lfs f0, 0(r3)
; CHECK-NEXT: xscvdpsxws f0, f0
; CHECK-NEXT: mffprwz r3, f0
; CHECK-NEXT: clrldi r3, r3, 32
; CHECK-NEXT: blr
entry:
%0 = inttoptr i64 %ptr to float*
%1 = load float, float* %0, align 4
%conv = fptoui float %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_align16_uint8_t_float(i8* nocapture readonly %ptr) {
; CHECK-LABEL: ld_align16_uint8_t_float:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lfs f0, 8(r3)
; CHECK-NEXT: xscvdpsxws f0, f0
; CHECK-NEXT: mffprwz r3, f0
; CHECK-NEXT: clrldi r3, r3, 32
; 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 i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_align32_uint8_t_float(i8* nocapture readonly %ptr) {
; CHECK-P10-LABEL: ld_align32_uint8_t_float:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r4, 99999000
; CHECK-P10-NEXT: lfsx f0, r3, r4
; CHECK-P10-NEXT: xscvdpsxws f0, f0
; CHECK-P10-NEXT: mffprwz r3, f0
; CHECK-P10-NEXT: clrldi r3, r3, 32
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_align32_uint8_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: xscvdpsxws f0, f0
; CHECK-PREP10-NEXT: mffprwz r3, f0
; CHECK-PREP10-NEXT: clrldi r3, r3, 32
; 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 i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_unalign64_uint8_t_float(i8* nocapture readonly %ptr) {
; CHECK-P10-LABEL: ld_unalign64_uint8_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: xscvdpsxws f0, f0
; CHECK-P10-NEXT: mffprwz r3, f0
; CHECK-P10-NEXT: clrldi r3, r3, 32
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_unalign64_uint8_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: xscvdpsxws f0, f0
; CHECK-PREP10-NEXT: mffprwz r3, f0
; CHECK-PREP10-NEXT: clrldi r3, r3, 32
; 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 i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_align64_uint8_t_float(i8* nocapture readonly %ptr) {
; CHECK-P10-LABEL: ld_align64_uint8_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: xscvdpsxws f0, f0
; CHECK-P10-NEXT: mffprwz r3, f0
; CHECK-P10-NEXT: clrldi r3, r3, 32
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_align64_uint8_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: xscvdpsxws f0, f0
; CHECK-PREP10-NEXT: mffprwz r3, f0
; CHECK-PREP10-NEXT: clrldi r3, r3, 32
; 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 i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_reg_uint8_t_float(i8* nocapture readonly %ptr, i64 %off) {
; CHECK-LABEL: ld_reg_uint8_t_float:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lfsx f0, r3, r4
; CHECK-NEXT: xscvdpsxws f0, f0
; CHECK-NEXT: mffprwz r3, f0
; CHECK-NEXT: clrldi r3, r3, 32
; 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 i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_or_uint8_t_float(i64 %ptr, i8 zeroext %off) {
; CHECK-LABEL: ld_or_uint8_t_float:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: or r3, r4, r3
; CHECK-NEXT: lfs f0, 0(r3)
; CHECK-NEXT: xscvdpsxws f0, f0
; CHECK-NEXT: mffprwz r3, f0
; CHECK-NEXT: clrldi r3, r3, 32
; CHECK-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 i8
ret i8 %conv1
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_not_disjoint16_uint8_t_float(i64 %ptr) {
; CHECK-LABEL: ld_not_disjoint16_uint8_t_float:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: ori r3, r3, 6
; CHECK-NEXT: lfs f0, 0(r3)
; CHECK-NEXT: xscvdpsxws f0, f0
; CHECK-NEXT: mffprwz r3, f0
; CHECK-NEXT: clrldi r3, r3, 32
; CHECK-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 i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_disjoint_align16_uint8_t_float(i64 %ptr) {
; CHECK-LABEL: ld_disjoint_align16_uint8_t_float:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: rldicr r3, r3, 0, 51
; CHECK-NEXT: lfs f0, 24(r3)
; CHECK-NEXT: xscvdpsxws f0, f0
; CHECK-NEXT: mffprwz r3, f0
; CHECK-NEXT: clrldi r3, r3, 32
; CHECK-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 i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_not_disjoint32_uint8_t_float(i64 %ptr) {
; CHECK-LABEL: ld_not_disjoint32_uint8_t_float:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: ori r3, r3, 34463
; CHECK-NEXT: oris r3, r3, 1
; CHECK-NEXT: lfs f0, 0(r3)
; CHECK-NEXT: xscvdpsxws f0, f0
; CHECK-NEXT: mffprwz r3, f0
; CHECK-NEXT: clrldi r3, r3, 32
; CHECK-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 i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_disjoint_align32_uint8_t_float(i64 %ptr) {
; CHECK-P10-LABEL: ld_disjoint_align32_uint8_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: xscvdpsxws f0, f0
; CHECK-P10-NEXT: mffprwz r3, f0
; CHECK-P10-NEXT: clrldi r3, r3, 32
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: ld_disjoint_align32_uint8_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: xscvdpsxws f0, f0
; CHECK-P9-NEXT: mffprwz r3, f0
; CHECK-P9-NEXT: clrldi r3, r3, 32
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: ld_disjoint_align32_uint8_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: xscvdpsxws f0, f0
; CHECK-P8-NEXT: mffprwz r3, f0
; CHECK-P8-NEXT: clrldi r3, r3, 32
; 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 i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_not_disjoint64_uint8_t_float(i64 %ptr) {
; CHECK-P10-LABEL: ld_not_disjoint64_uint8_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: xscvdpsxws f0, f0
; CHECK-P10-NEXT: mffprwz r3, f0
; CHECK-P10-NEXT: clrldi r3, r3, 32
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_not_disjoint64_uint8_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: or r3, r3, r4
; CHECK-PREP10-NEXT: lfs f0, 0(r3)
; CHECK-PREP10-NEXT: xscvdpsxws f0, f0
; CHECK-PREP10-NEXT: mffprwz r3, f0
; CHECK-PREP10-NEXT: clrldi r3, r3, 32
; CHECK-PREP10-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 i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_disjoint_unalign64_uint8_t_float(i64 %ptr) {
; CHECK-P10-LABEL: ld_disjoint_unalign64_uint8_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: xscvdpsxws f0, f0
; CHECK-P10-NEXT: mffprwz r3, f0
; CHECK-P10-NEXT: clrldi r3, r3, 32
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_disjoint_unalign64_uint8_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: xscvdpsxws f0, f0
; CHECK-PREP10-NEXT: mffprwz r3, f0
; CHECK-PREP10-NEXT: clrldi r3, r3, 32
; 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 i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_disjoint_align64_uint8_t_float(i64 %ptr) {
; CHECK-P10-LABEL: ld_disjoint_align64_uint8_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: xscvdpsxws f0, f0
; CHECK-P10-NEXT: mffprwz r3, f0
; CHECK-P10-NEXT: clrldi r3, r3, 32
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_disjoint_align64_uint8_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: xscvdpsxws f0, f0
; CHECK-PREP10-NEXT: mffprwz r3, f0
; CHECK-PREP10-NEXT: clrldi r3, r3, 32
; 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 i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_cst_align16_uint8_t_float() {
; CHECK-LABEL: ld_cst_align16_uint8_t_float:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lfs f0, 4080(0)
; CHECK-NEXT: xscvdpsxws f0, f0
; CHECK-NEXT: mffprwz r3, f0
; CHECK-NEXT: clrldi r3, r3, 32
; CHECK-NEXT: blr
entry:
%0 = load float, float* inttoptr (i64 4080 to float*), align 16
%conv = fptoui float %0 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_cst_align32_uint8_t_float() {
; CHECK-LABEL: ld_cst_align32_uint8_t_float:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lis r3, 153
; CHECK-NEXT: lfs f0, -27108(r3)
; CHECK-NEXT: xscvdpsxws f0, f0
; CHECK-NEXT: mffprwz r3, f0
; CHECK-NEXT: clrldi r3, r3, 32
; CHECK-NEXT: blr
entry:
%0 = load float, float* inttoptr (i64 9999900 to float*), align 4
%conv = fptoui float %0 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_cst_unalign64_uint8_t_float() {
; CHECK-P10-LABEL: ld_cst_unalign64_uint8_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: xscvdpsxws f0, f0
; CHECK-P10-NEXT: mffprwz r3, f0
; CHECK-P10-NEXT: clrldi r3, r3, 32
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_cst_unalign64_uint8_t_float:
; 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: lfs f0, 0(r3)
; CHECK-PREP10-NEXT: xscvdpsxws f0, f0
; CHECK-PREP10-NEXT: mffprwz r3, f0
; CHECK-PREP10-NEXT: clrldi r3, r3, 32
; CHECK-PREP10-NEXT: blr
entry:
%0 = load float, float* inttoptr (i64 1000000000001 to float*), align 4
%conv = fptoui float %0 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_cst_align64_uint8_t_float() {
; CHECK-P10-LABEL: ld_cst_align64_uint8_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: xscvdpsxws f0, f0
; CHECK-P10-NEXT: mffprwz r3, f0
; CHECK-P10-NEXT: clrldi r3, r3, 32
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_cst_align64_uint8_t_float:
; 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: lfs f0, 0(r3)
; CHECK-PREP10-NEXT: xscvdpsxws f0, f0
; CHECK-PREP10-NEXT: mffprwz r3, f0
; CHECK-PREP10-NEXT: clrldi r3, r3, 32
; CHECK-PREP10-NEXT: blr
entry:
%0 = load float, float* inttoptr (i64 1000000000000 to float*), align 4096
%conv = fptoui float %0 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_0_uint8_t_double(i64 %ptr) {
; CHECK-LABEL: ld_0_uint8_t_double:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lfd f0, 0(r3)
; CHECK-NEXT: xscvdpsxws f0, f0
; CHECK-NEXT: mffprwz r3, f0
; CHECK-NEXT: clrldi r3, r3, 32
; CHECK-NEXT: blr
entry:
%0 = inttoptr i64 %ptr to double*
%1 = load double, double* %0, align 8
%conv = fptoui double %1 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_align16_uint8_t_double(i8* nocapture readonly %ptr) {
; CHECK-LABEL: ld_align16_uint8_t_double:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lfd f0, 8(r3)
; CHECK-NEXT: xscvdpsxws f0, f0
; CHECK-NEXT: mffprwz r3, f0
; CHECK-NEXT: clrldi r3, r3, 32
; 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 i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_align32_uint8_t_double(i8* nocapture readonly %ptr) {
; CHECK-P10-LABEL: ld_align32_uint8_t_double:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: pli r4, 99999000
; CHECK-P10-NEXT: lfdx f0, r3, r4
; CHECK-P10-NEXT: xscvdpsxws f0, f0
; CHECK-P10-NEXT: mffprwz r3, f0
; CHECK-P10-NEXT: clrldi r3, r3, 32
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_align32_uint8_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: xscvdpsxws f0, f0
; CHECK-PREP10-NEXT: mffprwz r3, f0
; CHECK-PREP10-NEXT: clrldi r3, r3, 32
; 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 i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_unalign64_uint8_t_double(i8* nocapture readonly %ptr) {
; CHECK-P10-LABEL: ld_unalign64_uint8_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: xscvdpsxws f0, f0
; CHECK-P10-NEXT: mffprwz r3, f0
; CHECK-P10-NEXT: clrldi r3, r3, 32
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_unalign64_uint8_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: xscvdpsxws f0, f0
; CHECK-PREP10-NEXT: mffprwz r3, f0
; CHECK-PREP10-NEXT: clrldi r3, r3, 32
; 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 i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_align64_uint8_t_double(i8* nocapture readonly %ptr) {
; CHECK-P10-LABEL: ld_align64_uint8_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: xscvdpsxws f0, f0
; CHECK-P10-NEXT: mffprwz r3, f0
; CHECK-P10-NEXT: clrldi r3, r3, 32
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_align64_uint8_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: xscvdpsxws f0, f0
; CHECK-PREP10-NEXT: mffprwz r3, f0
; CHECK-PREP10-NEXT: clrldi r3, r3, 32
; 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 i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_reg_uint8_t_double(i8* nocapture readonly %ptr, i64 %off) {
; CHECK-LABEL: ld_reg_uint8_t_double:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lfdx f0, r3, r4
; CHECK-NEXT: xscvdpsxws f0, f0
; CHECK-NEXT: mffprwz r3, f0
; CHECK-NEXT: clrldi r3, r3, 32
; 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 i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_or_uint8_t_double(i64 %ptr, i8 zeroext %off) {
; CHECK-LABEL: ld_or_uint8_t_double:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: or r3, r4, r3
; CHECK-NEXT: lfd f0, 0(r3)
; CHECK-NEXT: xscvdpsxws f0, f0
; CHECK-NEXT: mffprwz r3, f0
; CHECK-NEXT: clrldi r3, r3, 32
; CHECK-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 i8
ret i8 %conv1
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_not_disjoint16_uint8_t_double(i64 %ptr) {
; CHECK-LABEL: ld_not_disjoint16_uint8_t_double:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: ori r3, r3, 6
; CHECK-NEXT: lfd f0, 0(r3)
; CHECK-NEXT: xscvdpsxws f0, f0
; CHECK-NEXT: mffprwz r3, f0
; CHECK-NEXT: clrldi r3, r3, 32
; CHECK-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 i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_disjoint_align16_uint8_t_double(i64 %ptr) {
; CHECK-LABEL: ld_disjoint_align16_uint8_t_double:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: rldicr r3, r3, 0, 51
; CHECK-NEXT: lfd f0, 24(r3)
; CHECK-NEXT: xscvdpsxws f0, f0
; CHECK-NEXT: mffprwz r3, f0
; CHECK-NEXT: clrldi r3, r3, 32
; CHECK-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 i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_not_disjoint32_uint8_t_double(i64 %ptr) {
; CHECK-LABEL: ld_not_disjoint32_uint8_t_double:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: ori r3, r3, 34463
; CHECK-NEXT: oris r3, r3, 1
; CHECK-NEXT: lfd f0, 0(r3)
; CHECK-NEXT: xscvdpsxws f0, f0
; CHECK-NEXT: mffprwz r3, f0
; CHECK-NEXT: clrldi r3, r3, 32
; CHECK-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 i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_disjoint_align32_uint8_t_double(i64 %ptr) {
; CHECK-P10-LABEL: ld_disjoint_align32_uint8_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: xscvdpsxws f0, f0
; CHECK-P10-NEXT: mffprwz r3, f0
; CHECK-P10-NEXT: clrldi r3, r3, 32
; CHECK-P10-NEXT: blr
;
; CHECK-P9-LABEL: ld_disjoint_align32_uint8_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: xscvdpsxws f0, f0
; CHECK-P9-NEXT: mffprwz r3, f0
; CHECK-P9-NEXT: clrldi r3, r3, 32
; CHECK-P9-NEXT: blr
;
; CHECK-P8-LABEL: ld_disjoint_align32_uint8_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: xscvdpsxws f0, f0
; CHECK-P8-NEXT: mffprwz r3, f0
; CHECK-P8-NEXT: clrldi r3, r3, 32
; 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 i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_not_disjoint64_uint8_t_double(i64 %ptr) {
; CHECK-P10-LABEL: ld_not_disjoint64_uint8_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: xscvdpsxws f0, f0
; CHECK-P10-NEXT: mffprwz r3, f0
; CHECK-P10-NEXT: clrldi r3, r3, 32
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_not_disjoint64_uint8_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: or r3, r3, r4
; CHECK-PREP10-NEXT: lfd f0, 0(r3)
; CHECK-PREP10-NEXT: xscvdpsxws f0, f0
; CHECK-PREP10-NEXT: mffprwz r3, f0
; CHECK-PREP10-NEXT: clrldi r3, r3, 32
; CHECK-PREP10-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 i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_disjoint_unalign64_uint8_t_double(i64 %ptr) {
; CHECK-P10-LABEL: ld_disjoint_unalign64_uint8_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: xscvdpsxws f0, f0
; CHECK-P10-NEXT: mffprwz r3, f0
; CHECK-P10-NEXT: clrldi r3, r3, 32
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_disjoint_unalign64_uint8_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: xscvdpsxws f0, f0
; CHECK-PREP10-NEXT: mffprwz r3, f0
; CHECK-PREP10-NEXT: clrldi r3, r3, 32
; 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 i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_disjoint_align64_uint8_t_double(i64 %ptr) {
; CHECK-P10-LABEL: ld_disjoint_align64_uint8_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: xscvdpsxws f0, f0
; CHECK-P10-NEXT: mffprwz r3, f0
; CHECK-P10-NEXT: clrldi r3, r3, 32
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_disjoint_align64_uint8_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: xscvdpsxws f0, f0
; CHECK-PREP10-NEXT: mffprwz r3, f0
; CHECK-PREP10-NEXT: clrldi r3, r3, 32
; 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 i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_cst_align16_uint8_t_double() {
; CHECK-LABEL: ld_cst_align16_uint8_t_double:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lfd f0, 4080(0)
; CHECK-NEXT: xscvdpsxws f0, f0
; CHECK-NEXT: mffprwz r3, f0
; CHECK-NEXT: clrldi r3, r3, 32
; CHECK-NEXT: blr
entry:
%0 = load double, double* inttoptr (i64 4080 to double*), align 16
%conv = fptoui double %0 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_cst_align32_uint8_t_double() {
; CHECK-LABEL: ld_cst_align32_uint8_t_double:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lis r3, 153
; CHECK-NEXT: lfd f0, -27108(r3)
; CHECK-NEXT: xscvdpsxws f0, f0
; CHECK-NEXT: mffprwz r3, f0
; CHECK-NEXT: clrldi r3, r3, 32
; CHECK-NEXT: blr
entry:
%0 = load double, double* inttoptr (i64 9999900 to double*), align 8
%conv = fptoui double %0 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_cst_unalign64_uint8_t_double() {
; CHECK-P10-LABEL: ld_cst_unalign64_uint8_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: xscvdpsxws f0, f0
; CHECK-P10-NEXT: mffprwz r3, f0
; CHECK-P10-NEXT: clrldi r3, r3, 32
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_cst_unalign64_uint8_t_double:
; 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: lfd f0, 0(r3)
; CHECK-PREP10-NEXT: xscvdpsxws f0, f0
; CHECK-PREP10-NEXT: mffprwz r3, f0
; CHECK-PREP10-NEXT: clrldi r3, r3, 32
; CHECK-PREP10-NEXT: blr
entry:
%0 = load double, double* inttoptr (i64 1000000000001 to double*), align 8
%conv = fptoui double %0 to i8
ret i8 %conv
}
; Function Attrs: norecurse nounwind readonly uwtable willreturn
define dso_local zeroext i8 @ld_cst_align64_uint8_t_double() {
; CHECK-P10-LABEL: ld_cst_align64_uint8_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: xscvdpsxws f0, f0
; CHECK-P10-NEXT: mffprwz r3, f0
; CHECK-P10-NEXT: clrldi r3, r3, 32
; CHECK-P10-NEXT: blr
;
; CHECK-PREP10-LABEL: ld_cst_align64_uint8_t_double:
; 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: lfd f0, 0(r3)
; CHECK-PREP10-NEXT: xscvdpsxws f0, f0
; CHECK-PREP10-NEXT: mffprwz r3, f0
; CHECK-PREP10-NEXT: clrldi r3, r3, 32
; CHECK-PREP10-NEXT: blr
entry:
%0 = load double, double* inttoptr (i64 1000000000000 to double*), align 4096
%conv = fptoui double %0 to i8
ret i8 %conv
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_0_uint8_t_uint8_t(i64 %ptr, i8 zeroext %str) {
; CHECK-LABEL: st_0_uint8_t_uint8_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: stb r4, 0(r3)
; CHECK-NEXT: blr
entry:
%0 = inttoptr i64 %ptr to i8*
store i8 %str, i8* %0, align 1
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_align16_uint8_t_uint8_t(i8* nocapture %ptr, i8 zeroext %str) {
; CHECK-LABEL: st_align16_uint8_t_uint8_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: stb r4, 8(r3)
; CHECK-NEXT: blr
entry:
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 8
store i8 %str, i8* %add.ptr, align 1
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_align32_uint8_t_uint8_t(i8* nocapture %ptr, i8 zeroext %str) {
; CHECK-P10-LABEL: st_align32_uint8_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_uint8_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:
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 99999000
store i8 %str, i8* %add.ptr, align 1
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_align64_uint8_t_uint8_t(i8* nocapture %ptr, i8 zeroext %str) {
; CHECK-P10-LABEL: st_align64_uint8_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_uint8_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:
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1000000000000
store i8 %str, i8* %add.ptr, align 1
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_reg_uint8_t_uint8_t(i8* nocapture %ptr, i64 %off, i8 zeroext %str) {
; CHECK-LABEL: st_reg_uint8_t_uint8_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: stbx r5, r3, r4
; CHECK-NEXT: blr
entry:
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 %off
store i8 %str, i8* %add.ptr, align 1
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_or1_uint8_t_uint8_t(i64 %ptr, i8 zeroext %off, i8 zeroext %str) {
; CHECK-LABEL: st_or1_uint8_t_uint8_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: or r3, r4, r3
; CHECK-NEXT: stb r5, 0(r3)
; CHECK-NEXT: blr
entry:
%conv = zext i8 %off to i64
%or = or i64 %conv, %ptr
%0 = inttoptr i64 %or to i8*
store i8 %str, i8* %0, align 1
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_not_disjoint16_uint8_t_uint8_t(i64 %ptr, i8 zeroext %str) {
; CHECK-LABEL: st_not_disjoint16_uint8_t_uint8_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: ori r3, r3, 6
; CHECK-NEXT: stb r4, 0(r3)
; CHECK-NEXT: blr
entry:
%or = or i64 %ptr, 6
%0 = inttoptr i64 %or to i8*
store i8 %str, i8* %0, align 1
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_disjoint_align16_uint8_t_uint8_t(i64 %ptr, i8 zeroext %str) {
; CHECK-LABEL: st_disjoint_align16_uint8_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
%or = or i64 %and, 24
%0 = inttoptr i64 %or to i8*
store i8 %str, i8* %0, align 8
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_not_disjoint32_uint8_t_uint8_t(i64 %ptr, i8 zeroext %str) {
; CHECK-LABEL: st_not_disjoint32_uint8_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:
%or = or i64 %ptr, 99999
%0 = inttoptr i64 %or to i8*
store i8 %str, i8* %0, align 1
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_disjoint_align32_uint8_t_uint8_t(i64 %ptr, i8 zeroext %str) {
; CHECK-P10-LABEL: st_disjoint_align32_uint8_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_uint8_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_uint8_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
%or = or i64 %and, 999990000
%0 = inttoptr i64 %or to i8*
store i8 %str, i8* %0, align 16
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_not_disjoint64_uint8_t_uint8_t(i64 %ptr, i8 zeroext %str) {
; CHECK-P10-LABEL: st_not_disjoint64_uint8_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_uint8_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:
%or = or i64 %ptr, 1000000000001
%0 = inttoptr i64 %or to i8*
store i8 %str, i8* %0, align 1
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_disjoint_align64_uint8_t_uint8_t(i64 %ptr, i8 zeroext %str) {
; CHECK-P10-LABEL: st_disjoint_align64_uint8_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_uint8_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
%or = or i64 %and, 1000000000000
%0 = inttoptr i64 %or to i8*
store i8 %str, i8* %0, align 4096
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_cst_align16_uint8_t_uint8_t(i8 zeroext %str) {
; CHECK-LABEL: st_cst_align16_uint8_t_uint8_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: stb r3, 4080(0)
; CHECK-NEXT: blr
entry:
store i8 %str, 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_uint8_t_uint8_t(i8 zeroext %str) {
; CHECK-LABEL: st_cst_align32_uint8_t_uint8_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lis r4, 153
; CHECK-NEXT: stb r3, -27108(r4)
; CHECK-NEXT: blr
entry:
store i8 %str, 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_uint8_t_uint8_t(i8 zeroext %str) {
; CHECK-P10-LABEL: st_cst_align64_uint8_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_uint8_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:
store i8 %str, i8* inttoptr (i64 1000000000000 to i8*), align 4096
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_0_uint8_t_uint16_t(i64 %ptr, i8 zeroext %str) {
; CHECK-LABEL: st_0_uint8_t_uint16_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: sth r4, 0(r3)
; CHECK-NEXT: blr
entry:
%conv = zext i8 %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_uint8_t_uint16_t(i8* nocapture %ptr, i8 zeroext %str) {
; CHECK-LABEL: st_align16_uint8_t_uint16_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: sth r4, 8(r3)
; CHECK-NEXT: blr
entry:
%conv = zext i8 %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_uint8_t_uint16_t(i8* nocapture %ptr, i8 zeroext %str) {
; CHECK-P10-LABEL: st_align32_uint8_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_uint8_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 = zext i8 %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_uint8_t_uint16_t(i8* nocapture %ptr, i8 zeroext %str) {
; CHECK-P10-LABEL: st_align64_uint8_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_uint8_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 = zext i8 %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_uint8_t_uint16_t(i8* nocapture %ptr, i64 %off, i8 zeroext %str) {
; CHECK-LABEL: st_reg_uint8_t_uint16_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: sthx r5, r3, r4
; CHECK-NEXT: blr
entry:
%conv = zext i8 %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_uint8_t_uint16_t(i64 %ptr, i8 zeroext %off, i8 zeroext %str) {
; CHECK-LABEL: st_or1_uint8_t_uint16_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: or r3, r4, r3
; CHECK-NEXT: sth r5, 0(r3)
; CHECK-NEXT: blr
entry:
%conv = zext i8 %str to i16
%conv1 = zext i8 %off to i64
%or = or i64 %conv1, %ptr
%0 = inttoptr i64 %or to i16*
store i16 %conv, i16* %0, align 2
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_not_disjoint16_uint8_t_uint16_t(i64 %ptr, i8 zeroext %str) {
; CHECK-LABEL: st_not_disjoint16_uint8_t_uint16_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: ori r3, r3, 6
; CHECK-NEXT: sth r4, 0(r3)
; CHECK-NEXT: blr
entry:
%conv = zext i8 %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_uint8_t_uint16_t(i64 %ptr, i8 zeroext %str) {
; CHECK-LABEL: st_disjoint_align16_uint8_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 = zext i8 %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_uint8_t_uint16_t(i64 %ptr, i8 zeroext %str) {
; CHECK-LABEL: st_not_disjoint32_uint8_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 = zext i8 %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_uint8_t_uint16_t(i64 %ptr, i8 zeroext %str) {
; CHECK-P10-LABEL: st_disjoint_align32_uint8_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_uint8_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_uint8_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 = zext i8 %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_uint8_t_uint16_t(i64 %ptr, i8 zeroext %str) {
; CHECK-P10-LABEL: st_not_disjoint64_uint8_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_uint8_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 = zext i8 %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_uint8_t_uint16_t(i64 %ptr, i8 zeroext %str) {
; CHECK-P10-LABEL: st_disjoint_align64_uint8_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_uint8_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 = zext i8 %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_uint8_t_uint16_t(i8 zeroext %str) {
; CHECK-LABEL: st_cst_align16_uint8_t_uint16_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: sth r3, 4080(0)
; CHECK-NEXT: blr
entry:
%conv = zext i8 %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_uint8_t_uint16_t(i8 zeroext %str) {
; CHECK-LABEL: st_cst_align32_uint8_t_uint16_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lis r4, 153
; CHECK-NEXT: sth r3, -27108(r4)
; CHECK-NEXT: blr
entry:
%conv = zext i8 %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_uint8_t_uint16_t(i8 zeroext %str) {
; CHECK-P10-LABEL: st_cst_align64_uint8_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_uint8_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 = zext i8 %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_uint8_t_uint32_t(i64 %ptr, i8 zeroext %str) {
; CHECK-LABEL: st_0_uint8_t_uint32_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: stw r4, 0(r3)
; CHECK-NEXT: blr
entry:
%conv = zext i8 %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_uint8_t_uint32_t(i8* nocapture %ptr, i8 zeroext %str) {
; CHECK-LABEL: st_align16_uint8_t_uint32_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: stw r4, 8(r3)
; CHECK-NEXT: blr
entry:
%conv = zext i8 %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_uint8_t_uint32_t(i8* nocapture %ptr, i8 zeroext %str) {
; CHECK-P10-LABEL: st_align32_uint8_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_uint8_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 = zext i8 %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_uint8_t_uint32_t(i8* nocapture %ptr, i8 zeroext %str) {
; CHECK-P10-LABEL: st_align64_uint8_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_uint8_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 = zext i8 %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_uint8_t_uint32_t(i8* nocapture %ptr, i64 %off, i8 zeroext %str) {
; CHECK-LABEL: st_reg_uint8_t_uint32_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: stwx r5, r3, r4
; CHECK-NEXT: blr
entry:
%conv = zext i8 %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_uint8_t_uint32_t(i64 %ptr, i8 zeroext %off, i8 zeroext %str) {
; CHECK-LABEL: st_or1_uint8_t_uint32_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: or r3, r4, r3
; CHECK-NEXT: stw r5, 0(r3)
; CHECK-NEXT: blr
entry:
%conv = zext i8 %str to i32
%conv1 = zext i8 %off to i64
%or = or i64 %conv1, %ptr
%0 = inttoptr i64 %or to i32*
store i32 %conv, i32* %0, align 4
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_not_disjoint16_uint8_t_uint32_t(i64 %ptr, i8 zeroext %str) {
; CHECK-LABEL: st_not_disjoint16_uint8_t_uint32_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: ori r3, r3, 6
; CHECK-NEXT: stw r4, 0(r3)
; CHECK-NEXT: blr
entry:
%conv = zext i8 %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_uint8_t_uint32_t(i64 %ptr, i8 zeroext %str) {
; CHECK-LABEL: st_disjoint_align16_uint8_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 = zext i8 %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_uint8_t_uint32_t(i64 %ptr, i8 zeroext %str) {
; CHECK-LABEL: st_not_disjoint32_uint8_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 = zext i8 %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_uint8_t_uint32_t(i64 %ptr, i8 zeroext %str) {
; CHECK-P10-LABEL: st_disjoint_align32_uint8_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_uint8_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_uint8_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 = zext i8 %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_uint8_t_uint32_t(i64 %ptr, i8 zeroext %str) {
; CHECK-P10-LABEL: st_not_disjoint64_uint8_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_uint8_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 = zext i8 %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_uint8_t_uint32_t(i64 %ptr, i8 zeroext %str) {
; CHECK-P10-LABEL: st_disjoint_align64_uint8_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_uint8_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 = zext i8 %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_uint8_t_uint32_t(i8 zeroext %str) {
; CHECK-LABEL: st_cst_align16_uint8_t_uint32_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: stw r3, 4080(0)
; CHECK-NEXT: blr
entry:
%conv = zext i8 %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_uint8_t_uint32_t(i8 zeroext %str) {
; CHECK-LABEL: st_cst_align32_uint8_t_uint32_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lis r4, 153
; CHECK-NEXT: stw r3, -27108(r4)
; CHECK-NEXT: blr
entry:
%conv = zext i8 %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_uint8_t_uint32_t(i8 zeroext %str) {
; CHECK-P10-LABEL: st_cst_align64_uint8_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_uint8_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 = zext i8 %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_uint8_t_uint64_t(i64 %ptr, i8 zeroext %str) {
; CHECK-LABEL: st_0_uint8_t_uint64_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: std r4, 0(r3)
; CHECK-NEXT: blr
entry:
%conv = zext i8 %str to i64
%0 = inttoptr i64 %ptr to i64*
store i64 %conv, i64* %0, align 8
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_align16_uint8_t_uint64_t(i8* nocapture %ptr, i8 zeroext %str) {
; CHECK-LABEL: st_align16_uint8_t_uint64_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: std r4, 8(r3)
; CHECK-NEXT: blr
entry:
%conv = zext i8 %str to i64
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 8
%0 = bitcast i8* %add.ptr to i64*
store i64 %conv, i64* %0, align 8
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_align32_uint8_t_uint64_t(i8* nocapture %ptr, i8 zeroext %str) {
; CHECK-P10-LABEL: st_align32_uint8_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_uint8_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:
%conv = zext i8 %str to i64
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 99999000
%0 = bitcast i8* %add.ptr to i64*
store i64 %conv, i64* %0, align 8
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_align64_uint8_t_uint64_t(i8* nocapture %ptr, i8 zeroext %str) {
; CHECK-P10-LABEL: st_align64_uint8_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_uint8_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:
%conv = zext i8 %str to i64
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1000000000000
%0 = bitcast i8* %add.ptr to i64*
store i64 %conv, i64* %0, align 8
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_reg_uint8_t_uint64_t(i8* nocapture %ptr, i64 %off, i8 zeroext %str) {
; CHECK-LABEL: st_reg_uint8_t_uint64_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: stdx r5, r3, r4
; CHECK-NEXT: blr
entry:
%conv = zext i8 %str to i64
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 %off
%0 = bitcast i8* %add.ptr to i64*
store i64 %conv, i64* %0, align 8
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_or1_uint8_t_uint64_t(i64 %ptr, i8 zeroext %off, i8 zeroext %str) {
; CHECK-LABEL: st_or1_uint8_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 %str to i64
%conv1 = zext i8 %off to i64
%or = or i64 %conv1, %ptr
%0 = inttoptr i64 %or to i64*
store i64 %conv, i64* %0, align 8
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_not_disjoint16_uint8_t_uint64_t(i64 %ptr, i8 zeroext %str) {
; CHECK-LABEL: st_not_disjoint16_uint8_t_uint64_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: ori r3, r3, 6
; CHECK-NEXT: std r4, 0(r3)
; CHECK-NEXT: blr
entry:
%conv = zext i8 %str to i64
%or = or i64 %ptr, 6
%0 = inttoptr i64 %or to i64*
store i64 %conv, i64* %0, align 8
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_disjoint_align16_uint8_t_uint64_t(i64 %ptr, i8 zeroext %str) {
; CHECK-LABEL: st_disjoint_align16_uint8_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
%conv = zext i8 %str to i64
%or = or i64 %and, 24
%0 = inttoptr i64 %or to i64*
store i64 %conv, i64* %0, align 8
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_not_disjoint32_uint8_t_uint64_t(i64 %ptr, i8 zeroext %str) {
; CHECK-LABEL: st_not_disjoint32_uint8_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:
%conv = zext i8 %str to i64
%or = or i64 %ptr, 99999
%0 = inttoptr i64 %or to i64*
store i64 %conv, i64* %0, align 8
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_disjoint_align32_uint8_t_uint64_t(i64 %ptr, i8 zeroext %str) {
; CHECK-P10-LABEL: st_disjoint_align32_uint8_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_uint8_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_uint8_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
%conv = zext i8 %str to i64
%or = or i64 %and, 999990000
%0 = inttoptr i64 %or to i64*
store i64 %conv, i64* %0, align 16
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_not_disjoint64_uint8_t_uint64_t(i64 %ptr, i8 zeroext %str) {
; CHECK-P10-LABEL: st_not_disjoint64_uint8_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_uint8_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:
%conv = zext i8 %str to i64
%or = or i64 %ptr, 1000000000001
%0 = inttoptr i64 %or to i64*
store i64 %conv, i64* %0, align 8
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_disjoint_align64_uint8_t_uint64_t(i64 %ptr, i8 zeroext %str) {
; CHECK-P10-LABEL: st_disjoint_align64_uint8_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_uint8_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
%conv = zext i8 %str to i64
%or = or i64 %and, 1000000000000
%0 = inttoptr i64 %or to i64*
store i64 %conv, i64* %0, align 4096
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_cst_align16_uint8_t_uint64_t(i8 zeroext %str) {
; CHECK-LABEL: st_cst_align16_uint8_t_uint64_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: std r3, 4080(0)
; CHECK-NEXT: blr
entry:
%conv = zext i8 %str to i64
store i64 %conv, i64* inttoptr (i64 4080 to i64*), align 16
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_cst_align32_uint8_t_uint64_t(i8 zeroext %str) {
; CHECK-LABEL: st_cst_align32_uint8_t_uint64_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lis r4, 153
; CHECK-NEXT: std r3, -27108(r4)
; CHECK-NEXT: blr
entry:
%conv = zext i8 %str to i64
store i64 %conv, i64* inttoptr (i64 9999900 to i64*), align 8
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_cst_align64_uint8_t_uint64_t(i8 zeroext %str) {
; CHECK-P10-LABEL: st_cst_align64_uint8_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_uint8_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:
%conv = zext i8 %str to i64
store i64 %conv, i64* inttoptr (i64 1000000000000 to i64*), align 4096
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_0_uint8_t_float(i64 %ptr, i8 zeroext %str) {
; CHECK-LABEL: st_0_uint8_t_float:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: mtfprwz f0, r4
; CHECK-NEXT: xscvuxdsp f0, f0
; CHECK-NEXT: stfs f0, 0(r3)
; CHECK-NEXT: blr
entry:
%conv = uitofp i8 %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_uint8_t_float(i8* nocapture %ptr, i8 zeroext %str) {
; CHECK-LABEL: st_align16_uint8_t_float:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: mtfprwz f0, r4
; CHECK-NEXT: xscvuxdsp f0, f0
; CHECK-NEXT: stfs f0, 8(r3)
; CHECK-NEXT: blr
entry:
%conv = uitofp i8 %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_uint8_t_float(i8* nocapture %ptr, i8 zeroext %str) {
; CHECK-P10-LABEL: st_align32_uint8_t_float:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprwz 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_uint8_t_float:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprwz 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_uint8_t_float:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprwz 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 i8 %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_uint8_t_float(i8* nocapture %ptr, i8 zeroext %str) {
; CHECK-P10-LABEL: st_align64_uint8_t_float:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprwz 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_uint8_t_float:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprwz 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_uint8_t_float:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprwz 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 i8 %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_uint8_t_float(i8* nocapture %ptr, i64 %off, i8 zeroext %str) {
; CHECK-LABEL: st_reg_uint8_t_float:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: mtfprwz f0, r5
; CHECK-NEXT: xscvuxdsp f0, f0
; CHECK-NEXT: stfsx f0, r3, r4
; CHECK-NEXT: blr
entry:
%conv = uitofp i8 %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_uint8_t_float(i64 %ptr, i8 zeroext %off, i8 zeroext %str) {
; CHECK-LABEL: st_or1_uint8_t_float:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: mtfprwz f0, r5
; CHECK-NEXT: or r3, r4, r3
; CHECK-NEXT: xscvuxdsp f0, f0
; CHECK-NEXT: stfs f0, 0(r3)
; CHECK-NEXT: blr
entry:
%conv = uitofp i8 %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_not_disjoint16_uint8_t_float(i64 %ptr, i8 zeroext %str) {
; CHECK-LABEL: st_not_disjoint16_uint8_t_float:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: mtfprwz f0, r4
; CHECK-NEXT: ori r3, r3, 6
; CHECK-NEXT: xscvuxdsp f0, f0
; CHECK-NEXT: stfs f0, 0(r3)
; CHECK-NEXT: blr
entry:
%conv = uitofp i8 %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_uint8_t_float(i64 %ptr, i8 zeroext %str) {
; CHECK-LABEL: st_disjoint_align16_uint8_t_float:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: mtfprwz f0, r4
; CHECK-NEXT: rldicr r3, r3, 0, 51
; CHECK-NEXT: xscvuxdsp f0, f0
; CHECK-NEXT: stfs f0, 24(r3)
; CHECK-NEXT: blr
entry:
%and = and i64 %ptr, -4096
%conv = uitofp i8 %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_uint8_t_float(i64 %ptr, i8 zeroext %str) {
; CHECK-P10-LABEL: st_not_disjoint32_uint8_t_float:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprwz 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_uint8_t_float:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprwz 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_uint8_t_float:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprwz 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: stfs f0, 0(r3)
; CHECK-P8-NEXT: blr
entry:
%conv = uitofp i8 %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_uint8_t_float(i64 %ptr, i8 zeroext %str) {
; CHECK-P10-LABEL: st_disjoint_align32_uint8_t_float:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprwz 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_uint8_t_float:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprwz 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_uint8_t_float:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprwz 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 i8 %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_uint8_t_float(i64 %ptr, i8 zeroext %str) {
; CHECK-P10-LABEL: st_not_disjoint64_uint8_t_float:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprwz 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-PREP10-LABEL: st_not_disjoint64_uint8_t_float:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: mtfprwz f0, r4
; CHECK-PREP10-NEXT: li r4, 29
; CHECK-PREP10-NEXT: rldic r4, r4, 35, 24
; CHECK-PREP10-NEXT: xscvuxdsp f0, f0
; CHECK-PREP10-NEXT: oris r4, r4, 54437
; CHECK-PREP10-NEXT: ori r4, r4, 4097
; CHECK-PREP10-NEXT: or r3, r3, r4
; CHECK-PREP10-NEXT: stfs f0, 0(r3)
; CHECK-PREP10-NEXT: blr
entry:
%conv = uitofp i8 %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_uint8_t_float(i64 %ptr, i8 zeroext %str) {
; CHECK-P10-LABEL: st_disjoint_align64_uint8_t_float:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprwz 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_uint8_t_float:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprwz 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_uint8_t_float:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprwz 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 i8 %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_uint8_t_float(i8 zeroext %str) {
; CHECK-LABEL: st_cst_align16_uint8_t_float:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: mtfprwz f0, r3
; CHECK-NEXT: xscvuxdsp f0, f0
; CHECK-NEXT: stfs f0, 4080(0)
; CHECK-NEXT: blr
entry:
%conv = uitofp i8 %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_uint8_t_float(i8 zeroext %str) {
; CHECK-LABEL: st_cst_align32_uint8_t_float:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: mtfprwz f0, r3
; CHECK-NEXT: lis r3, 153
; CHECK-NEXT: xscvuxdsp f0, f0
; CHECK-NEXT: stfs f0, -27108(r3)
; CHECK-NEXT: blr
entry:
%conv = uitofp i8 %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_uint8_t_float(i8 zeroext %str) {
; CHECK-P10-LABEL: st_cst_align64_uint8_t_float:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprwz 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_uint8_t_float:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprwz 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_uint8_t_float:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprwz 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: stfs f0, 0(r3)
; CHECK-P8-NEXT: blr
entry:
%conv = uitofp i8 %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_uint8_t_double(i64 %ptr, i8 zeroext %str) {
; CHECK-LABEL: st_0_uint8_t_double:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: mtfprwz f0, r4
; CHECK-NEXT: xscvuxddp f0, f0
; CHECK-NEXT: stfd f0, 0(r3)
; CHECK-NEXT: blr
entry:
%conv = uitofp i8 %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_uint8_t_double(i8* nocapture %ptr, i8 zeroext %str) {
; CHECK-LABEL: st_align16_uint8_t_double:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: mtfprwz f0, r4
; CHECK-NEXT: xscvuxddp f0, f0
; CHECK-NEXT: stfd f0, 8(r3)
; CHECK-NEXT: blr
entry:
%conv = uitofp i8 %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_uint8_t_double(i8* nocapture %ptr, i8 zeroext %str) {
; CHECK-P10-LABEL: st_align32_uint8_t_double:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprwz 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_uint8_t_double:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprwz 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_uint8_t_double:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprwz 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 i8 %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_uint8_t_double(i8* nocapture %ptr, i8 zeroext %str) {
; CHECK-P10-LABEL: st_align64_uint8_t_double:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprwz 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_uint8_t_double:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprwz 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_uint8_t_double:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprwz 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 i8 %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_uint8_t_double(i8* nocapture %ptr, i64 %off, i8 zeroext %str) {
; CHECK-LABEL: st_reg_uint8_t_double:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: mtfprwz f0, r5
; CHECK-NEXT: xscvuxddp f0, f0
; CHECK-NEXT: stfdx f0, r3, r4
; CHECK-NEXT: blr
entry:
%conv = uitofp i8 %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_uint8_t_double(i64 %ptr, i8 zeroext %off, i8 zeroext %str) {
; CHECK-LABEL: st_or1_uint8_t_double:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: mtfprwz f0, r5
; CHECK-NEXT: or r3, r4, r3
; CHECK-NEXT: xscvuxddp f0, f0
; CHECK-NEXT: stfd f0, 0(r3)
; CHECK-NEXT: blr
entry:
%conv = uitofp i8 %str to double
%conv1 = zext i8 %off to i64
%or = or i64 %conv1, %ptr
%0 = inttoptr i64 %or to double*
store double %conv, double* %0, align 8
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_not_disjoint16_uint8_t_double(i64 %ptr, i8 zeroext %str) {
; CHECK-LABEL: st_not_disjoint16_uint8_t_double:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: mtfprwz f0, r4
; CHECK-NEXT: ori r3, r3, 6
; CHECK-NEXT: xscvuxddp f0, f0
; CHECK-NEXT: stfd f0, 0(r3)
; CHECK-NEXT: blr
entry:
%conv = uitofp i8 %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_uint8_t_double(i64 %ptr, i8 zeroext %str) {
; CHECK-LABEL: st_disjoint_align16_uint8_t_double:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: mtfprwz f0, r4
; CHECK-NEXT: rldicr r3, r3, 0, 51
; CHECK-NEXT: xscvuxddp f0, f0
; CHECK-NEXT: stfd f0, 24(r3)
; CHECK-NEXT: blr
entry:
%and = and i64 %ptr, -4096
%conv = uitofp i8 %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_uint8_t_double(i64 %ptr, i8 zeroext %str) {
; CHECK-P10-LABEL: st_not_disjoint32_uint8_t_double:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprwz 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_uint8_t_double:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprwz 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_uint8_t_double:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprwz 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: stfd f0, 0(r3)
; CHECK-P8-NEXT: blr
entry:
%conv = uitofp i8 %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_uint8_t_double(i64 %ptr, i8 zeroext %str) {
; CHECK-P10-LABEL: st_disjoint_align32_uint8_t_double:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprwz 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_uint8_t_double:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprwz 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_uint8_t_double:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprwz 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 i8 %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_uint8_t_double(i64 %ptr, i8 zeroext %str) {
; CHECK-P10-LABEL: st_not_disjoint64_uint8_t_double:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprwz 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-PREP10-LABEL: st_not_disjoint64_uint8_t_double:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: mtfprwz f0, r4
; CHECK-PREP10-NEXT: li r4, 29
; CHECK-PREP10-NEXT: rldic r4, r4, 35, 24
; CHECK-PREP10-NEXT: xscvuxddp f0, f0
; CHECK-PREP10-NEXT: oris r4, r4, 54437
; CHECK-PREP10-NEXT: ori r4, r4, 4097
; CHECK-PREP10-NEXT: or r3, r3, r4
; CHECK-PREP10-NEXT: stfd f0, 0(r3)
; CHECK-PREP10-NEXT: blr
entry:
%conv = uitofp i8 %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_uint8_t_double(i64 %ptr, i8 zeroext %str) {
; CHECK-P10-LABEL: st_disjoint_align64_uint8_t_double:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprwz 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_uint8_t_double:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprwz 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_uint8_t_double:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprwz 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 i8 %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_uint8_t_double(i8 zeroext %str) {
; CHECK-LABEL: st_cst_align16_uint8_t_double:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: mtfprwz f0, r3
; CHECK-NEXT: xscvuxddp f0, f0
; CHECK-NEXT: stfd f0, 4080(0)
; CHECK-NEXT: blr
entry:
%conv = uitofp i8 %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_uint8_t_double(i8 zeroext %str) {
; CHECK-LABEL: st_cst_align32_uint8_t_double:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: mtfprwz f0, r3
; CHECK-NEXT: lis r3, 153
; CHECK-NEXT: xscvuxddp f0, f0
; CHECK-NEXT: stfd f0, -27108(r3)
; CHECK-NEXT: blr
entry:
%conv = uitofp i8 %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_uint8_t_double(i8 zeroext %str) {
; CHECK-P10-LABEL: st_cst_align64_uint8_t_double:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprwz 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_uint8_t_double:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprwz 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_uint8_t_double:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprwz 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: stfd f0, 0(r3)
; CHECK-P8-NEXT: blr
entry:
%conv = uitofp i8 %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_int8_t_uint16_t(i64 %ptr, i8 signext %str) {
; CHECK-LABEL: st_0_int8_t_uint16_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: sth r4, 0(r3)
; CHECK-NEXT: blr
entry:
%conv = sext i8 %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_int8_t_uint16_t(i8* nocapture %ptr, i8 signext %str) {
; CHECK-LABEL: st_align16_int8_t_uint16_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: sth r4, 8(r3)
; CHECK-NEXT: blr
entry:
%conv = sext i8 %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_int8_t_uint16_t(i8* nocapture %ptr, i8 signext %str) {
; CHECK-P10-LABEL: st_align32_int8_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_int8_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 = sext i8 %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_int8_t_uint16_t(i8* nocapture %ptr, i8 signext %str) {
; CHECK-P10-LABEL: st_align64_int8_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_int8_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 = sext i8 %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_int8_t_uint16_t(i8* nocapture %ptr, i64 %off, i8 signext %str) {
; CHECK-LABEL: st_reg_int8_t_uint16_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: sthx r5, r3, r4
; CHECK-NEXT: blr
entry:
%conv = sext i8 %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_int8_t_uint16_t(i64 %ptr, i8 zeroext %off, i8 signext %str) {
; CHECK-LABEL: st_or1_int8_t_uint16_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: or r3, r4, r3
; CHECK-NEXT: sth r5, 0(r3)
; CHECK-NEXT: blr
entry:
%conv = sext i8 %str to i16
%conv1 = zext i8 %off to i64
%or = or i64 %conv1, %ptr
%0 = inttoptr i64 %or to i16*
store i16 %conv, i16* %0, align 2
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_not_disjoint16_int8_t_uint16_t(i64 %ptr, i8 signext %str) {
; CHECK-LABEL: st_not_disjoint16_int8_t_uint16_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: ori r3, r3, 6
; CHECK-NEXT: sth r4, 0(r3)
; CHECK-NEXT: blr
entry:
%conv = sext i8 %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_int8_t_uint16_t(i64 %ptr, i8 signext %str) {
; CHECK-LABEL: st_disjoint_align16_int8_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 = sext i8 %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_int8_t_uint16_t(i64 %ptr, i8 signext %str) {
; CHECK-LABEL: st_not_disjoint32_int8_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 = sext i8 %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_int8_t_uint16_t(i64 %ptr, i8 signext %str) {
; CHECK-P10-LABEL: st_disjoint_align32_int8_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_int8_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_int8_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 = sext i8 %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_int8_t_uint16_t(i64 %ptr, i8 signext %str) {
; CHECK-P10-LABEL: st_not_disjoint64_int8_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_int8_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 = sext i8 %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_int8_t_uint16_t(i64 %ptr, i8 signext %str) {
; CHECK-P10-LABEL: st_disjoint_align64_int8_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_int8_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 = sext i8 %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_int8_t_uint16_t(i8 signext %str) {
; CHECK-LABEL: st_cst_align16_int8_t_uint16_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: sth r3, 4080(0)
; CHECK-NEXT: blr
entry:
%conv = sext i8 %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_int8_t_uint16_t(i8 signext %str) {
; CHECK-LABEL: st_cst_align32_int8_t_uint16_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lis r4, 153
; CHECK-NEXT: sth r3, -27108(r4)
; CHECK-NEXT: blr
entry:
%conv = sext i8 %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_int8_t_uint16_t(i8 signext %str) {
; CHECK-P10-LABEL: st_cst_align64_int8_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_int8_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 = sext i8 %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_int8_t_uint32_t(i64 %ptr, i8 signext %str) {
; CHECK-LABEL: st_0_int8_t_uint32_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: stw r4, 0(r3)
; CHECK-NEXT: blr
entry:
%conv = sext i8 %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_int8_t_uint32_t(i8* nocapture %ptr, i8 signext %str) {
; CHECK-LABEL: st_align16_int8_t_uint32_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: stw r4, 8(r3)
; CHECK-NEXT: blr
entry:
%conv = sext i8 %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_int8_t_uint32_t(i8* nocapture %ptr, i8 signext %str) {
; CHECK-P10-LABEL: st_align32_int8_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_int8_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 = sext i8 %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_int8_t_uint32_t(i8* nocapture %ptr, i8 signext %str) {
; CHECK-P10-LABEL: st_align64_int8_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_int8_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 = sext i8 %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_int8_t_uint32_t(i8* nocapture %ptr, i64 %off, i8 signext %str) {
; CHECK-LABEL: st_reg_int8_t_uint32_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: stwx r5, r3, r4
; CHECK-NEXT: blr
entry:
%conv = sext i8 %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_int8_t_uint32_t(i64 %ptr, i8 zeroext %off, i8 signext %str) {
; CHECK-LABEL: st_or1_int8_t_uint32_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: or r3, r4, r3
; CHECK-NEXT: stw r5, 0(r3)
; CHECK-NEXT: blr
entry:
%conv = sext i8 %str to i32
%conv1 = zext i8 %off to i64
%or = or i64 %conv1, %ptr
%0 = inttoptr i64 %or to i32*
store i32 %conv, i32* %0, align 4
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_not_disjoint16_int8_t_uint32_t(i64 %ptr, i8 signext %str) {
; CHECK-LABEL: st_not_disjoint16_int8_t_uint32_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: ori r3, r3, 6
; CHECK-NEXT: stw r4, 0(r3)
; CHECK-NEXT: blr
entry:
%conv = sext i8 %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_int8_t_uint32_t(i64 %ptr, i8 signext %str) {
; CHECK-LABEL: st_disjoint_align16_int8_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 = sext i8 %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_int8_t_uint32_t(i64 %ptr, i8 signext %str) {
; CHECK-LABEL: st_not_disjoint32_int8_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 = sext i8 %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_int8_t_uint32_t(i64 %ptr, i8 signext %str) {
; CHECK-P10-LABEL: st_disjoint_align32_int8_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_int8_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_int8_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 = sext i8 %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_int8_t_uint32_t(i64 %ptr, i8 signext %str) {
; CHECK-P10-LABEL: st_not_disjoint64_int8_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_int8_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 = sext i8 %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_int8_t_uint32_t(i64 %ptr, i8 signext %str) {
; CHECK-P10-LABEL: st_disjoint_align64_int8_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_int8_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 = sext i8 %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_int8_t_uint32_t(i8 signext %str) {
; CHECK-LABEL: st_cst_align16_int8_t_uint32_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: stw r3, 4080(0)
; CHECK-NEXT: blr
entry:
%conv = sext i8 %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_int8_t_uint32_t(i8 signext %str) {
; CHECK-LABEL: st_cst_align32_int8_t_uint32_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lis r4, 153
; CHECK-NEXT: stw r3, -27108(r4)
; CHECK-NEXT: blr
entry:
%conv = sext i8 %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_int8_t_uint32_t(i8 signext %str) {
; CHECK-P10-LABEL: st_cst_align64_int8_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_int8_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 = sext i8 %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_int8_t_uint64_t(i64 %ptr, i8 signext %str) {
; CHECK-LABEL: st_0_int8_t_uint64_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: std r4, 0(r3)
; CHECK-NEXT: blr
entry:
%conv = sext i8 %str to i64
%0 = inttoptr i64 %ptr to i64*
store i64 %conv, i64* %0, align 8
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_align16_int8_t_uint64_t(i8* nocapture %ptr, i8 signext %str) {
; CHECK-LABEL: st_align16_int8_t_uint64_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: std r4, 8(r3)
; CHECK-NEXT: blr
entry:
%conv = sext i8 %str to i64
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 8
%0 = bitcast i8* %add.ptr to i64*
store i64 %conv, i64* %0, align 8
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_align32_int8_t_uint64_t(i8* nocapture %ptr, i8 signext %str) {
; CHECK-P10-LABEL: st_align32_int8_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_int8_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:
%conv = sext i8 %str to i64
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 99999000
%0 = bitcast i8* %add.ptr to i64*
store i64 %conv, i64* %0, align 8
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_align64_int8_t_uint64_t(i8* nocapture %ptr, i8 signext %str) {
; CHECK-P10-LABEL: st_align64_int8_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_int8_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:
%conv = sext i8 %str to i64
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 1000000000000
%0 = bitcast i8* %add.ptr to i64*
store i64 %conv, i64* %0, align 8
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_reg_int8_t_uint64_t(i8* nocapture %ptr, i64 %off, i8 signext %str) {
; CHECK-LABEL: st_reg_int8_t_uint64_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: stdx r5, r3, r4
; CHECK-NEXT: blr
entry:
%conv = sext i8 %str to i64
%add.ptr = getelementptr inbounds i8, i8* %ptr, i64 %off
%0 = bitcast i8* %add.ptr to i64*
store i64 %conv, i64* %0, align 8
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_or1_int8_t_uint64_t(i64 %ptr, i8 zeroext %off, i8 signext %str) {
; CHECK-LABEL: st_or1_int8_t_uint64_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: or r3, r4, r3
; CHECK-NEXT: std r5, 0(r3)
; CHECK-NEXT: blr
entry:
%conv = sext i8 %str to i64
%conv1 = zext i8 %off to i64
%or = or i64 %conv1, %ptr
%0 = inttoptr i64 %or to i64*
store i64 %conv, i64* %0, align 8
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_not_disjoint16_int8_t_uint64_t(i64 %ptr, i8 signext %str) {
; CHECK-LABEL: st_not_disjoint16_int8_t_uint64_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: ori r3, r3, 6
; CHECK-NEXT: std r4, 0(r3)
; CHECK-NEXT: blr
entry:
%conv = sext i8 %str to i64
%or = or i64 %ptr, 6
%0 = inttoptr i64 %or to i64*
store i64 %conv, i64* %0, align 8
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_disjoint_align16_int8_t_uint64_t(i64 %ptr, i8 signext %str) {
; CHECK-LABEL: st_disjoint_align16_int8_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
%conv = sext i8 %str to i64
%or = or i64 %and, 24
%0 = inttoptr i64 %or to i64*
store i64 %conv, i64* %0, align 8
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_not_disjoint32_int8_t_uint64_t(i64 %ptr, i8 signext %str) {
; CHECK-LABEL: st_not_disjoint32_int8_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:
%conv = sext i8 %str to i64
%or = or i64 %ptr, 99999
%0 = inttoptr i64 %or to i64*
store i64 %conv, i64* %0, align 8
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_disjoint_align32_int8_t_uint64_t(i64 %ptr, i8 signext %str) {
; CHECK-P10-LABEL: st_disjoint_align32_int8_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_int8_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_int8_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
%conv = sext i8 %str to i64
%or = or i64 %and, 999990000
%0 = inttoptr i64 %or to i64*
store i64 %conv, i64* %0, align 16
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_not_disjoint64_int8_t_uint64_t(i64 %ptr, i8 signext %str) {
; CHECK-P10-LABEL: st_not_disjoint64_int8_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_int8_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:
%conv = sext i8 %str to i64
%or = or i64 %ptr, 1000000000001
%0 = inttoptr i64 %or to i64*
store i64 %conv, i64* %0, align 8
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_disjoint_align64_int8_t_uint64_t(i64 %ptr, i8 signext %str) {
; CHECK-P10-LABEL: st_disjoint_align64_int8_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_int8_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
%conv = sext i8 %str to i64
%or = or i64 %and, 1000000000000
%0 = inttoptr i64 %or to i64*
store i64 %conv, i64* %0, align 4096
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_cst_align16_int8_t_uint64_t(i8 signext %str) {
; CHECK-LABEL: st_cst_align16_int8_t_uint64_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: std r3, 4080(0)
; CHECK-NEXT: blr
entry:
%conv = sext i8 %str to i64
store i64 %conv, i64* inttoptr (i64 4080 to i64*), align 16
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_cst_align32_int8_t_uint64_t(i8 signext %str) {
; CHECK-LABEL: st_cst_align32_int8_t_uint64_t:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lis r4, 153
; CHECK-NEXT: std r3, -27108(r4)
; CHECK-NEXT: blr
entry:
%conv = sext i8 %str to i64
store i64 %conv, i64* inttoptr (i64 9999900 to i64*), align 8
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_cst_align64_int8_t_uint64_t(i8 signext %str) {
; CHECK-P10-LABEL: st_cst_align64_int8_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_int8_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:
%conv = sext i8 %str to i64
store i64 %conv, i64* inttoptr (i64 1000000000000 to i64*), align 4096
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_0_int8_t_float(i64 %ptr, i8 signext %str) {
; CHECK-LABEL: st_0_int8_t_float:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: mtfprwa f0, r4
; CHECK-NEXT: xscvsxdsp f0, f0
; CHECK-NEXT: stfs f0, 0(r3)
; CHECK-NEXT: blr
entry:
%conv = sitofp i8 %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_int8_t_float(i8* nocapture %ptr, i8 signext %str) {
; CHECK-LABEL: st_align16_int8_t_float:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: mtfprwa f0, r4
; CHECK-NEXT: xscvsxdsp f0, f0
; CHECK-NEXT: stfs f0, 8(r3)
; CHECK-NEXT: blr
entry:
%conv = sitofp i8 %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_int8_t_float(i8* nocapture %ptr, i8 signext %str) {
; CHECK-P10-LABEL: st_align32_int8_t_float:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprwa 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_int8_t_float:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprwa 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_int8_t_float:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprwa 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 i8 %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_int8_t_float(i8* nocapture %ptr, i8 signext %str) {
; CHECK-P10-LABEL: st_align64_int8_t_float:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprwa 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_int8_t_float:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprwa 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_int8_t_float:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprwa 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 i8 %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_int8_t_float(i8* nocapture %ptr, i64 %off, i8 signext %str) {
; CHECK-LABEL: st_reg_int8_t_float:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: mtfprwa f0, r5
; CHECK-NEXT: xscvsxdsp f0, f0
; CHECK-NEXT: stfsx f0, r3, r4
; CHECK-NEXT: blr
entry:
%conv = sitofp i8 %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_int8_t_float(i64 %ptr, i8 zeroext %off, i8 signext %str) {
; CHECK-LABEL: st_or1_int8_t_float:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: mtfprwa f0, r5
; CHECK-NEXT: or r3, r4, r3
; CHECK-NEXT: xscvsxdsp f0, f0
; CHECK-NEXT: stfs f0, 0(r3)
; CHECK-NEXT: blr
entry:
%conv = sitofp i8 %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_not_disjoint16_int8_t_float(i64 %ptr, i8 signext %str) {
; CHECK-LABEL: st_not_disjoint16_int8_t_float:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: mtfprwa f0, r4
; CHECK-NEXT: ori r3, r3, 6
; CHECK-NEXT: xscvsxdsp f0, f0
; CHECK-NEXT: stfs f0, 0(r3)
; CHECK-NEXT: blr
entry:
%conv = sitofp i8 %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_int8_t_float(i64 %ptr, i8 signext %str) {
; CHECK-LABEL: st_disjoint_align16_int8_t_float:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: mtfprwa f0, r4
; CHECK-NEXT: rldicr r3, r3, 0, 51
; CHECK-NEXT: xscvsxdsp f0, f0
; CHECK-NEXT: stfs f0, 24(r3)
; CHECK-NEXT: blr
entry:
%and = and i64 %ptr, -4096
%conv = sitofp i8 %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_int8_t_float(i64 %ptr, i8 signext %str) {
; CHECK-P10-LABEL: st_not_disjoint32_int8_t_float:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprwa 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_int8_t_float:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprwa 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_int8_t_float:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprwa 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: stfs f0, 0(r3)
; CHECK-P8-NEXT: blr
entry:
%conv = sitofp i8 %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_int8_t_float(i64 %ptr, i8 signext %str) {
; CHECK-P10-LABEL: st_disjoint_align32_int8_t_float:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprwa 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_int8_t_float:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprwa 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_int8_t_float:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprwa 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 i8 %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_int8_t_float(i64 %ptr, i8 signext %str) {
; CHECK-P10-LABEL: st_not_disjoint64_int8_t_float:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprwa 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-PREP10-LABEL: st_not_disjoint64_int8_t_float:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: mtfprwa f0, r4
; CHECK-PREP10-NEXT: li r4, 29
; CHECK-PREP10-NEXT: rldic r4, r4, 35, 24
; CHECK-PREP10-NEXT: xscvsxdsp f0, f0
; CHECK-PREP10-NEXT: oris r4, r4, 54437
; CHECK-PREP10-NEXT: ori r4, r4, 4097
; CHECK-PREP10-NEXT: or r3, r3, r4
; CHECK-PREP10-NEXT: stfs f0, 0(r3)
; CHECK-PREP10-NEXT: blr
entry:
%conv = sitofp i8 %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_int8_t_float(i64 %ptr, i8 signext %str) {
; CHECK-P10-LABEL: st_disjoint_align64_int8_t_float:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprwa 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_int8_t_float:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprwa 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_int8_t_float:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprwa 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 i8 %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_int8_t_float(i8 signext %str) {
; CHECK-LABEL: st_cst_align16_int8_t_float:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: mtfprwa f0, r3
; CHECK-NEXT: xscvsxdsp f0, f0
; CHECK-NEXT: stfs f0, 4080(0)
; CHECK-NEXT: blr
entry:
%conv = sitofp i8 %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_int8_t_float(i8 signext %str) {
; CHECK-LABEL: st_cst_align32_int8_t_float:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: mtfprwa f0, r3
; CHECK-NEXT: lis r3, 153
; CHECK-NEXT: xscvsxdsp f0, f0
; CHECK-NEXT: stfs f0, -27108(r3)
; CHECK-NEXT: blr
entry:
%conv = sitofp i8 %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_int8_t_float(i8 signext %str) {
; CHECK-P10-LABEL: st_cst_align64_int8_t_float:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprwa 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_int8_t_float:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprwa 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_int8_t_float:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprwa 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: stfs f0, 0(r3)
; CHECK-P8-NEXT: blr
entry:
%conv = sitofp i8 %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_int8_t_double(i64 %ptr, i8 signext %str) {
; CHECK-LABEL: st_0_int8_t_double:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: mtfprwa f0, r4
; CHECK-NEXT: xscvsxddp f0, f0
; CHECK-NEXT: stfd f0, 0(r3)
; CHECK-NEXT: blr
entry:
%conv = sitofp i8 %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_int8_t_double(i8* nocapture %ptr, i8 signext %str) {
; CHECK-LABEL: st_align16_int8_t_double:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: mtfprwa f0, r4
; CHECK-NEXT: xscvsxddp f0, f0
; CHECK-NEXT: stfd f0, 8(r3)
; CHECK-NEXT: blr
entry:
%conv = sitofp i8 %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_int8_t_double(i8* nocapture %ptr, i8 signext %str) {
; CHECK-P10-LABEL: st_align32_int8_t_double:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprwa 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_int8_t_double:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprwa 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_int8_t_double:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprwa 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 i8 %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_int8_t_double(i8* nocapture %ptr, i8 signext %str) {
; CHECK-P10-LABEL: st_align64_int8_t_double:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprwa 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_int8_t_double:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprwa 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_int8_t_double:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprwa 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 i8 %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_int8_t_double(i8* nocapture %ptr, i64 %off, i8 signext %str) {
; CHECK-LABEL: st_reg_int8_t_double:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: mtfprwa f0, r5
; CHECK-NEXT: xscvsxddp f0, f0
; CHECK-NEXT: stfdx f0, r3, r4
; CHECK-NEXT: blr
entry:
%conv = sitofp i8 %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_int8_t_double(i64 %ptr, i8 zeroext %off, i8 signext %str) {
; CHECK-LABEL: st_or1_int8_t_double:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: mtfprwa f0, r5
; CHECK-NEXT: or r3, r4, r3
; CHECK-NEXT: xscvsxddp f0, f0
; CHECK-NEXT: stfd f0, 0(r3)
; CHECK-NEXT: blr
entry:
%conv = sitofp i8 %str to double
%conv1 = zext i8 %off to i64
%or = or i64 %conv1, %ptr
%0 = inttoptr i64 %or to double*
store double %conv, double* %0, align 8
ret void
}
; Function Attrs: nofree norecurse nounwind uwtable willreturn writeonly
define dso_local void @st_not_disjoint16_int8_t_double(i64 %ptr, i8 signext %str) {
; CHECK-LABEL: st_not_disjoint16_int8_t_double:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: mtfprwa f0, r4
; CHECK-NEXT: ori r3, r3, 6
; CHECK-NEXT: xscvsxddp f0, f0
; CHECK-NEXT: stfd f0, 0(r3)
; CHECK-NEXT: blr
entry:
%conv = sitofp i8 %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_int8_t_double(i64 %ptr, i8 signext %str) {
; CHECK-LABEL: st_disjoint_align16_int8_t_double:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: mtfprwa f0, r4
; CHECK-NEXT: rldicr r3, r3, 0, 51
; CHECK-NEXT: xscvsxddp f0, f0
; CHECK-NEXT: stfd f0, 24(r3)
; CHECK-NEXT: blr
entry:
%and = and i64 %ptr, -4096
%conv = sitofp i8 %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_int8_t_double(i64 %ptr, i8 signext %str) {
; CHECK-P10-LABEL: st_not_disjoint32_int8_t_double:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprwa 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_int8_t_double:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprwa 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_int8_t_double:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprwa 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: stfd f0, 0(r3)
; CHECK-P8-NEXT: blr
entry:
%conv = sitofp i8 %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_int8_t_double(i64 %ptr, i8 signext %str) {
; CHECK-P10-LABEL: st_disjoint_align32_int8_t_double:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprwa 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_int8_t_double:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprwa 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_int8_t_double:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprwa 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 i8 %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_int8_t_double(i64 %ptr, i8 signext %str) {
; CHECK-P10-LABEL: st_not_disjoint64_int8_t_double:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprwa 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-PREP10-LABEL: st_not_disjoint64_int8_t_double:
; CHECK-PREP10: # %bb.0: # %entry
; CHECK-PREP10-NEXT: mtfprwa f0, r4
; CHECK-PREP10-NEXT: li r4, 29
; CHECK-PREP10-NEXT: rldic r4, r4, 35, 24
; CHECK-PREP10-NEXT: xscvsxddp f0, f0
; CHECK-PREP10-NEXT: oris r4, r4, 54437
; CHECK-PREP10-NEXT: ori r4, r4, 4097
; CHECK-PREP10-NEXT: or r3, r3, r4
; CHECK-PREP10-NEXT: stfd f0, 0(r3)
; CHECK-PREP10-NEXT: blr
entry:
%conv = sitofp i8 %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_int8_t_double(i64 %ptr, i8 signext %str) {
; CHECK-P10-LABEL: st_disjoint_align64_int8_t_double:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprwa 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_int8_t_double:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprwa 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_int8_t_double:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprwa 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 i8 %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_int8_t_double(i8 signext %str) {
; CHECK-LABEL: st_cst_align16_int8_t_double:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: mtfprwa f0, r3
; CHECK-NEXT: xscvsxddp f0, f0
; CHECK-NEXT: stfd f0, 4080(0)
; CHECK-NEXT: blr
entry:
%conv = sitofp i8 %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_int8_t_double(i8 signext %str) {
; CHECK-LABEL: st_cst_align32_int8_t_double:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: mtfprwa f0, r3
; CHECK-NEXT: lis r3, 153
; CHECK-NEXT: xscvsxddp f0, f0
; CHECK-NEXT: stfd f0, -27108(r3)
; CHECK-NEXT: blr
entry:
%conv = sitofp i8 %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_int8_t_double(i8 signext %str) {
; CHECK-P10-LABEL: st_cst_align64_int8_t_double:
; CHECK-P10: # %bb.0: # %entry
; CHECK-P10-NEXT: mtfprwa 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_int8_t_double:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprwa 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_int8_t_double:
; CHECK-P8: # %bb.0: # %entry
; CHECK-P8-NEXT: mtfprwa 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: stfd f0, 0(r3)
; CHECK-P8-NEXT: blr
entry:
%conv = sitofp i8 %str to double
store double %conv, double* inttoptr (i64 1000000000000 to double*), align 4096
ret void
}