mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 10:42:39 +01:00
9f4ca39c11
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
9776 lines
326 KiB
LLVM
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
|
|
}
|