mflr is kind of expensive on Power version smaller than 10, so we should schedule the store for the mflr's def away from mflr. In epilogue, the expensive mtlr has no user for its def, so it doesn't matter that the load and the mtlr are back-to-back. Reviewed By: RolandF Differential Revision: https://reviews.llvm.org/D137423
973 lines
30 KiB
LLVM
973 lines
30 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=pwr8 -ppc-asm-full-reg-names < %s | FileCheck %s --check-prefix=P8LE
|
|
; RUN: llc -verify-machineinstrs --mtriple powerpc64le-unknown-linux-gnu \
|
|
; RUN: -mcpu=pwr9 -ppc-asm-full-reg-names < %s | FileCheck %s --check-prefix=P9LE
|
|
; RUN: llc -verify-machineinstrs --mtriple powerpc64le-unknown-linux-gnu \
|
|
; RUN: -mcpu=pwr10 -ppc-asm-full-reg-names < %s | FileCheck %s --check-prefix=P10LE
|
|
; RUN: llc -verify-machineinstrs --mtriple powerpc64-unknown-linux-gnu \
|
|
; RUN: -mcpu=pwr8 -ppc-asm-full-reg-names < %s | FileCheck %s --check-prefix=P8BE
|
|
; RUN: llc -verify-machineinstrs --mtriple powerpc64-unknown-linux-gnu \
|
|
; RUN: -mcpu=pwr9 -ppc-asm-full-reg-names < %s | FileCheck %s --check-prefix=P9BE
|
|
; RUN: llc -verify-machineinstrs --mtriple powerpc64-unknown-linux-gnu \
|
|
; RUN: -mcpu=pwr10 -ppc-asm-full-reg-names < %s | FileCheck %s --check-prefix=P10BE
|
|
|
|
define signext i8 @caller_1(ptr nocapture readonly byval([1 x i8]) %data) #0 {
|
|
; P8LE-LABEL: caller_1:
|
|
; P8LE: # %bb.0: # %entry
|
|
; P8LE-NEXT: mflr r0
|
|
; P8LE-NEXT: stdu r1, -64(r1)
|
|
; P8LE-NEXT: std r0, 80(r1)
|
|
; P8LE-NEXT: stb r3, 48(r1)
|
|
; P8LE-NEXT: lbz r3, 48(r1)
|
|
; P8LE-NEXT: stb r3, 63(r1)
|
|
; P8LE-NEXT: addi r3, r1, 63
|
|
; P8LE-NEXT: bl callee
|
|
; P8LE-NEXT: nop
|
|
; P8LE-NEXT: li r3, 0
|
|
; P8LE-NEXT: addi r1, r1, 64
|
|
; P8LE-NEXT: ld r0, 16(r1)
|
|
; P8LE-NEXT: mtlr r0
|
|
; P8LE-NEXT: blr
|
|
;
|
|
; P9LE-LABEL: caller_1:
|
|
; P9LE: # %bb.0: # %entry
|
|
; P9LE-NEXT: mflr r0
|
|
; P9LE-NEXT: stdu r1, -64(r1)
|
|
; P9LE-NEXT: std r0, 80(r1)
|
|
; P9LE-NEXT: stb r3, 48(r1)
|
|
; P9LE-NEXT: lbz r3, 48(r1)
|
|
; P9LE-NEXT: stb r3, 63(r1)
|
|
; P9LE-NEXT: addi r3, r1, 63
|
|
; P9LE-NEXT: bl callee
|
|
; P9LE-NEXT: nop
|
|
; P9LE-NEXT: li r3, 0
|
|
; P9LE-NEXT: addi r1, r1, 64
|
|
; P9LE-NEXT: ld r0, 16(r1)
|
|
; P9LE-NEXT: mtlr r0
|
|
; P9LE-NEXT: blr
|
|
;
|
|
; P10LE-LABEL: caller_1:
|
|
; P10LE: # %bb.0: # %entry
|
|
; P10LE-NEXT: mflr r0
|
|
; P10LE-NEXT: std r0, 16(r1)
|
|
; P10LE-NEXT: stdu r1, -64(r1)
|
|
; P10LE-NEXT: stb r3, 48(r1)
|
|
; P10LE-NEXT: lbz r3, 48(r1)
|
|
; P10LE-NEXT: stb r3, 63(r1)
|
|
; P10LE-NEXT: addi r3, r1, 63
|
|
; P10LE-NEXT: bl callee@notoc
|
|
; P10LE-NEXT: li r3, 0
|
|
; P10LE-NEXT: addi r1, r1, 64
|
|
; P10LE-NEXT: ld r0, 16(r1)
|
|
; P10LE-NEXT: mtlr r0
|
|
; P10LE-NEXT: blr
|
|
;
|
|
; P8BE-LABEL: caller_1:
|
|
; P8BE: # %bb.0: # %entry
|
|
; P8BE-NEXT: mflr r0
|
|
; P8BE-NEXT: stdu r1, -128(r1)
|
|
; P8BE-NEXT: std r0, 144(r1)
|
|
; P8BE-NEXT: stb r3, 183(r1)
|
|
; P8BE-NEXT: lbz r3, 183(r1)
|
|
; P8BE-NEXT: stb r3, 127(r1)
|
|
; P8BE-NEXT: addi r3, r1, 127
|
|
; P8BE-NEXT: bl callee
|
|
; P8BE-NEXT: nop
|
|
; P8BE-NEXT: li r3, 0
|
|
; P8BE-NEXT: addi r1, r1, 128
|
|
; P8BE-NEXT: ld r0, 16(r1)
|
|
; P8BE-NEXT: mtlr r0
|
|
; P8BE-NEXT: blr
|
|
;
|
|
; P9BE-LABEL: caller_1:
|
|
; P9BE: # %bb.0: # %entry
|
|
; P9BE-NEXT: mflr r0
|
|
; P9BE-NEXT: stdu r1, -128(r1)
|
|
; P9BE-NEXT: std r0, 144(r1)
|
|
; P9BE-NEXT: stb r3, 183(r1)
|
|
; P9BE-NEXT: lbz r3, 183(r1)
|
|
; P9BE-NEXT: stb r3, 127(r1)
|
|
; P9BE-NEXT: addi r3, r1, 127
|
|
; P9BE-NEXT: bl callee
|
|
; P9BE-NEXT: nop
|
|
; P9BE-NEXT: li r3, 0
|
|
; P9BE-NEXT: addi r1, r1, 128
|
|
; P9BE-NEXT: ld r0, 16(r1)
|
|
; P9BE-NEXT: mtlr r0
|
|
; P9BE-NEXT: blr
|
|
;
|
|
; P10BE-LABEL: caller_1:
|
|
; P10BE: # %bb.0: # %entry
|
|
; P10BE-NEXT: mflr r0
|
|
; P10BE-NEXT: std r0, 16(r1)
|
|
; P10BE-NEXT: stdu r1, -128(r1)
|
|
; P10BE-NEXT: stb r3, 183(r1)
|
|
; P10BE-NEXT: lbz r3, 183(r1)
|
|
; P10BE-NEXT: stb r3, 127(r1)
|
|
; P10BE-NEXT: addi r3, r1, 127
|
|
; P10BE-NEXT: bl callee
|
|
; P10BE-NEXT: nop
|
|
; P10BE-NEXT: li r3, 0
|
|
; P10BE-NEXT: addi r1, r1, 128
|
|
; P10BE-NEXT: ld r0, 16(r1)
|
|
; P10BE-NEXT: mtlr r0
|
|
; P10BE-NEXT: blr
|
|
entry:
|
|
%_param_data = alloca [1 x i8], align 1
|
|
%.unpack = load i8, ptr %data, align 1
|
|
store i8 %.unpack, ptr %_param_data, align 1
|
|
call void @callee(ptr nonnull %_param_data)
|
|
ret i8 0
|
|
}
|
|
|
|
define signext i8 @caller_2(ptr nocapture readonly byval([2 x i8]) %data) #0 {
|
|
; P8LE-LABEL: caller_2:
|
|
; P8LE: # %bb.0: # %entry
|
|
; P8LE-NEXT: mflr r0
|
|
; P8LE-NEXT: stdu r1, -64(r1)
|
|
; P8LE-NEXT: std r0, 80(r1)
|
|
; P8LE-NEXT: sth r3, 48(r1)
|
|
; P8LE-NEXT: lhz r3, 48(r1)
|
|
; P8LE-NEXT: sth r3, 62(r1)
|
|
; P8LE-NEXT: addi r3, r1, 62
|
|
; P8LE-NEXT: bl callee
|
|
; P8LE-NEXT: nop
|
|
; P8LE-NEXT: li r3, 0
|
|
; P8LE-NEXT: addi r1, r1, 64
|
|
; P8LE-NEXT: ld r0, 16(r1)
|
|
; P8LE-NEXT: mtlr r0
|
|
; P8LE-NEXT: blr
|
|
;
|
|
; P9LE-LABEL: caller_2:
|
|
; P9LE: # %bb.0: # %entry
|
|
; P9LE-NEXT: mflr r0
|
|
; P9LE-NEXT: stdu r1, -64(r1)
|
|
; P9LE-NEXT: std r0, 80(r1)
|
|
; P9LE-NEXT: sth r3, 48(r1)
|
|
; P9LE-NEXT: lhz r3, 48(r1)
|
|
; P9LE-NEXT: sth r3, 62(r1)
|
|
; P9LE-NEXT: addi r3, r1, 62
|
|
; P9LE-NEXT: bl callee
|
|
; P9LE-NEXT: nop
|
|
; P9LE-NEXT: li r3, 0
|
|
; P9LE-NEXT: addi r1, r1, 64
|
|
; P9LE-NEXT: ld r0, 16(r1)
|
|
; P9LE-NEXT: mtlr r0
|
|
; P9LE-NEXT: blr
|
|
;
|
|
; P10LE-LABEL: caller_2:
|
|
; P10LE: # %bb.0: # %entry
|
|
; P10LE-NEXT: mflr r0
|
|
; P10LE-NEXT: std r0, 16(r1)
|
|
; P10LE-NEXT: stdu r1, -64(r1)
|
|
; P10LE-NEXT: sth r3, 48(r1)
|
|
; P10LE-NEXT: lhz r3, 48(r1)
|
|
; P10LE-NEXT: sth r3, 62(r1)
|
|
; P10LE-NEXT: addi r3, r1, 62
|
|
; P10LE-NEXT: bl callee@notoc
|
|
; P10LE-NEXT: li r3, 0
|
|
; P10LE-NEXT: addi r1, r1, 64
|
|
; P10LE-NEXT: ld r0, 16(r1)
|
|
; P10LE-NEXT: mtlr r0
|
|
; P10LE-NEXT: blr
|
|
;
|
|
; P8BE-LABEL: caller_2:
|
|
; P8BE: # %bb.0: # %entry
|
|
; P8BE-NEXT: mflr r0
|
|
; P8BE-NEXT: stdu r1, -128(r1)
|
|
; P8BE-NEXT: std r0, 144(r1)
|
|
; P8BE-NEXT: sth r3, 182(r1)
|
|
; P8BE-NEXT: lhz r3, 182(r1)
|
|
; P8BE-NEXT: sth r3, 126(r1)
|
|
; P8BE-NEXT: addi r3, r1, 126
|
|
; P8BE-NEXT: bl callee
|
|
; P8BE-NEXT: nop
|
|
; P8BE-NEXT: li r3, 0
|
|
; P8BE-NEXT: addi r1, r1, 128
|
|
; P8BE-NEXT: ld r0, 16(r1)
|
|
; P8BE-NEXT: mtlr r0
|
|
; P8BE-NEXT: blr
|
|
;
|
|
; P9BE-LABEL: caller_2:
|
|
; P9BE: # %bb.0: # %entry
|
|
; P9BE-NEXT: mflr r0
|
|
; P9BE-NEXT: stdu r1, -128(r1)
|
|
; P9BE-NEXT: std r0, 144(r1)
|
|
; P9BE-NEXT: sth r3, 182(r1)
|
|
; P9BE-NEXT: lhz r3, 182(r1)
|
|
; P9BE-NEXT: sth r3, 126(r1)
|
|
; P9BE-NEXT: addi r3, r1, 126
|
|
; P9BE-NEXT: bl callee
|
|
; P9BE-NEXT: nop
|
|
; P9BE-NEXT: li r3, 0
|
|
; P9BE-NEXT: addi r1, r1, 128
|
|
; P9BE-NEXT: ld r0, 16(r1)
|
|
; P9BE-NEXT: mtlr r0
|
|
; P9BE-NEXT: blr
|
|
;
|
|
; P10BE-LABEL: caller_2:
|
|
; P10BE: # %bb.0: # %entry
|
|
; P10BE-NEXT: mflr r0
|
|
; P10BE-NEXT: std r0, 16(r1)
|
|
; P10BE-NEXT: stdu r1, -128(r1)
|
|
; P10BE-NEXT: sth r3, 182(r1)
|
|
; P10BE-NEXT: lhz r3, 182(r1)
|
|
; P10BE-NEXT: sth r3, 126(r1)
|
|
; P10BE-NEXT: addi r3, r1, 126
|
|
; P10BE-NEXT: bl callee
|
|
; P10BE-NEXT: nop
|
|
; P10BE-NEXT: li r3, 0
|
|
; P10BE-NEXT: addi r1, r1, 128
|
|
; P10BE-NEXT: ld r0, 16(r1)
|
|
; P10BE-NEXT: mtlr r0
|
|
; P10BE-NEXT: blr
|
|
entry:
|
|
%_param_data = alloca [2 x i8], align 1
|
|
%.unpack = load i8, ptr %data, align 1
|
|
%.elt1 = getelementptr inbounds [2 x i8], ptr %data, i64 0, i64 1
|
|
%.unpack2 = load i8, ptr %.elt1, align 1
|
|
store i8 %.unpack, ptr %_param_data, align 1
|
|
%.temp.1.gep = getelementptr inbounds [2 x i8], ptr %_param_data, i64 0, i64 1
|
|
store i8 %.unpack2, ptr %.temp.1.gep, align 1
|
|
call void @callee(ptr nonnull %_param_data)
|
|
ret i8 0
|
|
}
|
|
|
|
define signext i8 @caller_3(ptr nocapture readonly byval([3 x i8]) %data) #0 {
|
|
; P8LE-LABEL: caller_3:
|
|
; P8LE: # %bb.0: # %entry
|
|
; P8LE-NEXT: mflr r0
|
|
; P8LE-NEXT: stdu r1, -64(r1)
|
|
; P8LE-NEXT: std r0, 80(r1)
|
|
; P8LE-NEXT: rldicl r4, r3, 48, 16
|
|
; P8LE-NEXT: sth r3, 48(r1)
|
|
; P8LE-NEXT: stb r4, 50(r1)
|
|
; P8LE-NEXT: lhz r3, 48(r1)
|
|
; P8LE-NEXT: lbz r4, 50(r1)
|
|
; P8LE-NEXT: sth r3, 61(r1)
|
|
; P8LE-NEXT: addi r3, r1, 61
|
|
; P8LE-NEXT: stb r4, 63(r1)
|
|
; P8LE-NEXT: bl callee
|
|
; P8LE-NEXT: nop
|
|
; P8LE-NEXT: li r3, 0
|
|
; P8LE-NEXT: addi r1, r1, 64
|
|
; P8LE-NEXT: ld r0, 16(r1)
|
|
; P8LE-NEXT: mtlr r0
|
|
; P8LE-NEXT: blr
|
|
;
|
|
; P9LE-LABEL: caller_3:
|
|
; P9LE: # %bb.0: # %entry
|
|
; P9LE-NEXT: mflr r0
|
|
; P9LE-NEXT: stdu r1, -64(r1)
|
|
; P9LE-NEXT: std r0, 80(r1)
|
|
; P9LE-NEXT: sth r3, 48(r1)
|
|
; P9LE-NEXT: rldicl r3, r3, 48, 16
|
|
; P9LE-NEXT: stb r3, 50(r1)
|
|
; P9LE-NEXT: lhz r3, 48(r1)
|
|
; P9LE-NEXT: lbz r4, 50(r1)
|
|
; P9LE-NEXT: sth r3, 61(r1)
|
|
; P9LE-NEXT: addi r3, r1, 61
|
|
; P9LE-NEXT: stb r4, 63(r1)
|
|
; P9LE-NEXT: bl callee
|
|
; P9LE-NEXT: nop
|
|
; P9LE-NEXT: li r3, 0
|
|
; P9LE-NEXT: addi r1, r1, 64
|
|
; P9LE-NEXT: ld r0, 16(r1)
|
|
; P9LE-NEXT: mtlr r0
|
|
; P9LE-NEXT: blr
|
|
;
|
|
; P10LE-LABEL: caller_3:
|
|
; P10LE: # %bb.0: # %entry
|
|
; P10LE-NEXT: mflr r0
|
|
; P10LE-NEXT: std r0, 16(r1)
|
|
; P10LE-NEXT: stdu r1, -64(r1)
|
|
; P10LE-NEXT: sth r3, 48(r1)
|
|
; P10LE-NEXT: rldicl r3, r3, 48, 16
|
|
; P10LE-NEXT: stb r3, 50(r1)
|
|
; P10LE-NEXT: lhz r3, 48(r1)
|
|
; P10LE-NEXT: lbz r4, 50(r1)
|
|
; P10LE-NEXT: sth r3, 61(r1)
|
|
; P10LE-NEXT: addi r3, r1, 61
|
|
; P10LE-NEXT: stb r4, 63(r1)
|
|
; P10LE-NEXT: bl callee@notoc
|
|
; P10LE-NEXT: li r3, 0
|
|
; P10LE-NEXT: addi r1, r1, 64
|
|
; P10LE-NEXT: ld r0, 16(r1)
|
|
; P10LE-NEXT: mtlr r0
|
|
; P10LE-NEXT: blr
|
|
;
|
|
; P8BE-LABEL: caller_3:
|
|
; P8BE: # %bb.0: # %entry
|
|
; P8BE-NEXT: mflr r0
|
|
; P8BE-NEXT: stdu r1, -128(r1)
|
|
; P8BE-NEXT: rldicl r4, r3, 56, 8
|
|
; P8BE-NEXT: std r0, 144(r1)
|
|
; P8BE-NEXT: stb r3, 183(r1)
|
|
; P8BE-NEXT: sth r4, 181(r1)
|
|
; P8BE-NEXT: lbz r4, 183(r1)
|
|
; P8BE-NEXT: lhz r3, 181(r1)
|
|
; P8BE-NEXT: stb r4, 127(r1)
|
|
; P8BE-NEXT: sth r3, 125(r1)
|
|
; P8BE-NEXT: addi r3, r1, 125
|
|
; P8BE-NEXT: bl callee
|
|
; P8BE-NEXT: nop
|
|
; P8BE-NEXT: li r3, 0
|
|
; P8BE-NEXT: addi r1, r1, 128
|
|
; P8BE-NEXT: ld r0, 16(r1)
|
|
; P8BE-NEXT: mtlr r0
|
|
; P8BE-NEXT: blr
|
|
;
|
|
; P9BE-LABEL: caller_3:
|
|
; P9BE: # %bb.0: # %entry
|
|
; P9BE-NEXT: mflr r0
|
|
; P9BE-NEXT: stdu r1, -128(r1)
|
|
; P9BE-NEXT: rldicl r4, r3, 56, 8
|
|
; P9BE-NEXT: std r0, 144(r1)
|
|
; P9BE-NEXT: stb r3, 183(r1)
|
|
; P9BE-NEXT: sth r4, 181(r1)
|
|
; P9BE-NEXT: lbz r4, 183(r1)
|
|
; P9BE-NEXT: lhz r3, 181(r1)
|
|
; P9BE-NEXT: stb r4, 127(r1)
|
|
; P9BE-NEXT: sth r3, 125(r1)
|
|
; P9BE-NEXT: addi r3, r1, 125
|
|
; P9BE-NEXT: bl callee
|
|
; P9BE-NEXT: nop
|
|
; P9BE-NEXT: li r3, 0
|
|
; P9BE-NEXT: addi r1, r1, 128
|
|
; P9BE-NEXT: ld r0, 16(r1)
|
|
; P9BE-NEXT: mtlr r0
|
|
; P9BE-NEXT: blr
|
|
;
|
|
; P10BE-LABEL: caller_3:
|
|
; P10BE: # %bb.0: # %entry
|
|
; P10BE-NEXT: mflr r0
|
|
; P10BE-NEXT: std r0, 16(r1)
|
|
; P10BE-NEXT: stdu r1, -128(r1)
|
|
; P10BE-NEXT: rldicl r4, r3, 56, 8
|
|
; P10BE-NEXT: stb r3, 183(r1)
|
|
; P10BE-NEXT: sth r4, 181(r1)
|
|
; P10BE-NEXT: lbz r4, 183(r1)
|
|
; P10BE-NEXT: lhz r3, 181(r1)
|
|
; P10BE-NEXT: stb r4, 127(r1)
|
|
; P10BE-NEXT: sth r3, 125(r1)
|
|
; P10BE-NEXT: addi r3, r1, 125
|
|
; P10BE-NEXT: bl callee
|
|
; P10BE-NEXT: nop
|
|
; P10BE-NEXT: li r3, 0
|
|
; P10BE-NEXT: addi r1, r1, 128
|
|
; P10BE-NEXT: ld r0, 16(r1)
|
|
; P10BE-NEXT: mtlr r0
|
|
; P10BE-NEXT: blr
|
|
entry:
|
|
%_param_data = alloca [3 x i8], align 1
|
|
%.unpack = load i8, ptr %data, align 1
|
|
%.elt1 = getelementptr inbounds [3 x i8], ptr %data, i64 0, i64 1
|
|
%.unpack2 = load i8, ptr %.elt1, align 1
|
|
%.elt3 = getelementptr inbounds [3 x i8], ptr %data, i64 0, i64 2
|
|
%.unpack4 = load i8, ptr %.elt3, align 1
|
|
store i8 %.unpack, ptr %_param_data, align 1
|
|
%.temp.1.gep = getelementptr inbounds [3 x i8], ptr %_param_data, i64 0, i64 1
|
|
store i8 %.unpack2, ptr %.temp.1.gep, align 1
|
|
%.temp.2.gep = getelementptr inbounds [3 x i8], ptr %_param_data, i64 0, i64 2
|
|
store i8 %.unpack4, ptr %.temp.2.gep, align 1
|
|
call void @callee(ptr nonnull %_param_data)
|
|
ret i8 0
|
|
}
|
|
|
|
define signext i8 @caller_4(ptr nocapture readonly byval([4 x i8]) %data) #0 {
|
|
; P8LE-LABEL: caller_4:
|
|
; P8LE: # %bb.0: # %entry
|
|
; P8LE-NEXT: mflr r0
|
|
; P8LE-NEXT: stdu r1, -64(r1)
|
|
; P8LE-NEXT: std r0, 80(r1)
|
|
; P8LE-NEXT: stw r3, 48(r1)
|
|
; P8LE-NEXT: lwz r3, 48(r1)
|
|
; P8LE-NEXT: stw r3, 60(r1)
|
|
; P8LE-NEXT: addi r3, r1, 60
|
|
; P8LE-NEXT: bl callee
|
|
; P8LE-NEXT: nop
|
|
; P8LE-NEXT: li r3, 0
|
|
; P8LE-NEXT: addi r1, r1, 64
|
|
; P8LE-NEXT: ld r0, 16(r1)
|
|
; P8LE-NEXT: mtlr r0
|
|
; P8LE-NEXT: blr
|
|
;
|
|
; P9LE-LABEL: caller_4:
|
|
; P9LE: # %bb.0: # %entry
|
|
; P9LE-NEXT: mflr r0
|
|
; P9LE-NEXT: stdu r1, -64(r1)
|
|
; P9LE-NEXT: std r0, 80(r1)
|
|
; P9LE-NEXT: stw r3, 48(r1)
|
|
; P9LE-NEXT: lwz r3, 48(r1)
|
|
; P9LE-NEXT: stw r3, 60(r1)
|
|
; P9LE-NEXT: addi r3, r1, 60
|
|
; P9LE-NEXT: bl callee
|
|
; P9LE-NEXT: nop
|
|
; P9LE-NEXT: li r3, 0
|
|
; P9LE-NEXT: addi r1, r1, 64
|
|
; P9LE-NEXT: ld r0, 16(r1)
|
|
; P9LE-NEXT: mtlr r0
|
|
; P9LE-NEXT: blr
|
|
;
|
|
; P10LE-LABEL: caller_4:
|
|
; P10LE: # %bb.0: # %entry
|
|
; P10LE-NEXT: mflr r0
|
|
; P10LE-NEXT: std r0, 16(r1)
|
|
; P10LE-NEXT: stdu r1, -64(r1)
|
|
; P10LE-NEXT: stw r3, 48(r1)
|
|
; P10LE-NEXT: lwz r3, 48(r1)
|
|
; P10LE-NEXT: stw r3, 60(r1)
|
|
; P10LE-NEXT: addi r3, r1, 60
|
|
; P10LE-NEXT: bl callee@notoc
|
|
; P10LE-NEXT: li r3, 0
|
|
; P10LE-NEXT: addi r1, r1, 64
|
|
; P10LE-NEXT: ld r0, 16(r1)
|
|
; P10LE-NEXT: mtlr r0
|
|
; P10LE-NEXT: blr
|
|
;
|
|
; P8BE-LABEL: caller_4:
|
|
; P8BE: # %bb.0: # %entry
|
|
; P8BE-NEXT: mflr r0
|
|
; P8BE-NEXT: stdu r1, -128(r1)
|
|
; P8BE-NEXT: std r0, 144(r1)
|
|
; P8BE-NEXT: stw r3, 180(r1)
|
|
; P8BE-NEXT: lwz r3, 180(r1)
|
|
; P8BE-NEXT: stw r3, 124(r1)
|
|
; P8BE-NEXT: addi r3, r1, 124
|
|
; P8BE-NEXT: bl callee
|
|
; P8BE-NEXT: nop
|
|
; P8BE-NEXT: li r3, 0
|
|
; P8BE-NEXT: addi r1, r1, 128
|
|
; P8BE-NEXT: ld r0, 16(r1)
|
|
; P8BE-NEXT: mtlr r0
|
|
; P8BE-NEXT: blr
|
|
;
|
|
; P9BE-LABEL: caller_4:
|
|
; P9BE: # %bb.0: # %entry
|
|
; P9BE-NEXT: mflr r0
|
|
; P9BE-NEXT: stdu r1, -128(r1)
|
|
; P9BE-NEXT: std r0, 144(r1)
|
|
; P9BE-NEXT: stw r3, 180(r1)
|
|
; P9BE-NEXT: lwz r3, 180(r1)
|
|
; P9BE-NEXT: stw r3, 124(r1)
|
|
; P9BE-NEXT: addi r3, r1, 124
|
|
; P9BE-NEXT: bl callee
|
|
; P9BE-NEXT: nop
|
|
; P9BE-NEXT: li r3, 0
|
|
; P9BE-NEXT: addi r1, r1, 128
|
|
; P9BE-NEXT: ld r0, 16(r1)
|
|
; P9BE-NEXT: mtlr r0
|
|
; P9BE-NEXT: blr
|
|
;
|
|
; P10BE-LABEL: caller_4:
|
|
; P10BE: # %bb.0: # %entry
|
|
; P10BE-NEXT: mflr r0
|
|
; P10BE-NEXT: std r0, 16(r1)
|
|
; P10BE-NEXT: stdu r1, -128(r1)
|
|
; P10BE-NEXT: stw r3, 180(r1)
|
|
; P10BE-NEXT: lwz r3, 180(r1)
|
|
; P10BE-NEXT: stw r3, 124(r1)
|
|
; P10BE-NEXT: addi r3, r1, 124
|
|
; P10BE-NEXT: bl callee
|
|
; P10BE-NEXT: nop
|
|
; P10BE-NEXT: li r3, 0
|
|
; P10BE-NEXT: addi r1, r1, 128
|
|
; P10BE-NEXT: ld r0, 16(r1)
|
|
; P10BE-NEXT: mtlr r0
|
|
; P10BE-NEXT: blr
|
|
entry:
|
|
%_param_data = alloca [4 x i8], align 1
|
|
%.unpack = load i8, ptr %data, align 1
|
|
%.elt1 = getelementptr inbounds [4 x i8], ptr %data, i64 0, i64 1
|
|
%.unpack2 = load i8, ptr %.elt1, align 1
|
|
%.elt3 = getelementptr inbounds [4 x i8], ptr %data, i64 0, i64 2
|
|
%.unpack4 = load i8, ptr %.elt3, align 1
|
|
%.elt5 = getelementptr inbounds [4 x i8], ptr %data, i64 0, i64 3
|
|
%.unpack6 = load i8, ptr %.elt5, align 1
|
|
store i8 %.unpack, ptr %_param_data, align 1
|
|
%.temp.1.gep = getelementptr inbounds [4 x i8], ptr %_param_data, i64 0, i64 1
|
|
store i8 %.unpack2, ptr %.temp.1.gep, align 1
|
|
%.temp.2.gep = getelementptr inbounds [4 x i8], ptr %_param_data, i64 0, i64 2
|
|
store i8 %.unpack4, ptr %.temp.2.gep, align 1
|
|
%.temp.3.gep = getelementptr inbounds [4 x i8], ptr %_param_data, i64 0, i64 3
|
|
store i8 %.unpack6, ptr %.temp.3.gep, align 1
|
|
call void @callee(ptr nonnull %_param_data)
|
|
ret i8 0
|
|
}
|
|
|
|
define signext i8 @caller_5(ptr nocapture readonly byval([5 x i8]) %data) #0 {
|
|
; P8LE-LABEL: caller_5:
|
|
; P8LE: # %bb.0: # %entry
|
|
; P8LE-NEXT: mflr r0
|
|
; P8LE-NEXT: stdu r1, -64(r1)
|
|
; P8LE-NEXT: rldicl r4, r3, 32, 32
|
|
; P8LE-NEXT: std r0, 80(r1)
|
|
; P8LE-NEXT: stw r3, 48(r1)
|
|
; P8LE-NEXT: stb r4, 52(r1)
|
|
; P8LE-NEXT: lbz r4, 52(r1)
|
|
; P8LE-NEXT: stw r3, 59(r1)
|
|
; P8LE-NEXT: addi r3, r1, 59
|
|
; P8LE-NEXT: stb r4, 63(r1)
|
|
; P8LE-NEXT: bl callee
|
|
; P8LE-NEXT: nop
|
|
; P8LE-NEXT: li r3, 0
|
|
; P8LE-NEXT: addi r1, r1, 64
|
|
; P8LE-NEXT: ld r0, 16(r1)
|
|
; P8LE-NEXT: mtlr r0
|
|
; P8LE-NEXT: blr
|
|
;
|
|
; P9LE-LABEL: caller_5:
|
|
; P9LE: # %bb.0: # %entry
|
|
; P9LE-NEXT: mflr r0
|
|
; P9LE-NEXT: stdu r1, -64(r1)
|
|
; P9LE-NEXT: rldicl r4, r3, 32, 32
|
|
; P9LE-NEXT: std r0, 80(r1)
|
|
; P9LE-NEXT: stw r3, 48(r1)
|
|
; P9LE-NEXT: stw r3, 59(r1)
|
|
; P9LE-NEXT: addi r3, r1, 59
|
|
; P9LE-NEXT: stb r4, 52(r1)
|
|
; P9LE-NEXT: lbz r4, 52(r1)
|
|
; P9LE-NEXT: stb r4, 63(r1)
|
|
; P9LE-NEXT: bl callee
|
|
; P9LE-NEXT: nop
|
|
; P9LE-NEXT: li r3, 0
|
|
; P9LE-NEXT: addi r1, r1, 64
|
|
; P9LE-NEXT: ld r0, 16(r1)
|
|
; P9LE-NEXT: mtlr r0
|
|
; P9LE-NEXT: blr
|
|
;
|
|
; P10LE-LABEL: caller_5:
|
|
; P10LE: # %bb.0: # %entry
|
|
; P10LE-NEXT: mflr r0
|
|
; P10LE-NEXT: std r0, 16(r1)
|
|
; P10LE-NEXT: stdu r1, -64(r1)
|
|
; P10LE-NEXT: rldicl r4, r3, 32, 32
|
|
; P10LE-NEXT: stw r3, 48(r1)
|
|
; P10LE-NEXT: stw r3, 59(r1)
|
|
; P10LE-NEXT: addi r3, r1, 59
|
|
; P10LE-NEXT: stb r4, 52(r1)
|
|
; P10LE-NEXT: lbz r4, 52(r1)
|
|
; P10LE-NEXT: stb r4, 63(r1)
|
|
; P10LE-NEXT: bl callee@notoc
|
|
; P10LE-NEXT: li r3, 0
|
|
; P10LE-NEXT: addi r1, r1, 64
|
|
; P10LE-NEXT: ld r0, 16(r1)
|
|
; P10LE-NEXT: mtlr r0
|
|
; P10LE-NEXT: blr
|
|
;
|
|
; P8BE-LABEL: caller_5:
|
|
; P8BE: # %bb.0: # %entry
|
|
; P8BE-NEXT: mflr r0
|
|
; P8BE-NEXT: stdu r1, -128(r1)
|
|
; P8BE-NEXT: std r0, 144(r1)
|
|
; P8BE-NEXT: stb r3, 183(r1)
|
|
; P8BE-NEXT: rldicl r3, r3, 56, 8
|
|
; P8BE-NEXT: lbz r4, 183(r1)
|
|
; P8BE-NEXT: stw r3, 179(r1)
|
|
; P8BE-NEXT: stw r3, 123(r1)
|
|
; P8BE-NEXT: addi r3, r1, 123
|
|
; P8BE-NEXT: stb r4, 127(r1)
|
|
; P8BE-NEXT: bl callee
|
|
; P8BE-NEXT: nop
|
|
; P8BE-NEXT: li r3, 0
|
|
; P8BE-NEXT: addi r1, r1, 128
|
|
; P8BE-NEXT: ld r0, 16(r1)
|
|
; P8BE-NEXT: mtlr r0
|
|
; P8BE-NEXT: blr
|
|
;
|
|
; P9BE-LABEL: caller_5:
|
|
; P9BE: # %bb.0: # %entry
|
|
; P9BE-NEXT: mflr r0
|
|
; P9BE-NEXT: stdu r1, -128(r1)
|
|
; P9BE-NEXT: std r0, 144(r1)
|
|
; P9BE-NEXT: stb r3, 183(r1)
|
|
; P9BE-NEXT: lbz r4, 183(r1)
|
|
; P9BE-NEXT: rldicl r3, r3, 56, 8
|
|
; P9BE-NEXT: stw r3, 179(r1)
|
|
; P9BE-NEXT: stw r3, 123(r1)
|
|
; P9BE-NEXT: addi r3, r1, 123
|
|
; P9BE-NEXT: stb r4, 127(r1)
|
|
; P9BE-NEXT: bl callee
|
|
; P9BE-NEXT: nop
|
|
; P9BE-NEXT: li r3, 0
|
|
; P9BE-NEXT: addi r1, r1, 128
|
|
; P9BE-NEXT: ld r0, 16(r1)
|
|
; P9BE-NEXT: mtlr r0
|
|
; P9BE-NEXT: blr
|
|
;
|
|
; P10BE-LABEL: caller_5:
|
|
; P10BE: # %bb.0: # %entry
|
|
; P10BE-NEXT: mflr r0
|
|
; P10BE-NEXT: std r0, 16(r1)
|
|
; P10BE-NEXT: stdu r1, -128(r1)
|
|
; P10BE-NEXT: stb r3, 183(r1)
|
|
; P10BE-NEXT: rldicl r3, r3, 56, 8
|
|
; P10BE-NEXT: lbz r4, 183(r1)
|
|
; P10BE-NEXT: stw r3, 179(r1)
|
|
; P10BE-NEXT: stw r3, 123(r1)
|
|
; P10BE-NEXT: addi r3, r1, 123
|
|
; P10BE-NEXT: stb r4, 127(r1)
|
|
; P10BE-NEXT: bl callee
|
|
; P10BE-NEXT: nop
|
|
; P10BE-NEXT: li r3, 0
|
|
; P10BE-NEXT: addi r1, r1, 128
|
|
; P10BE-NEXT: ld r0, 16(r1)
|
|
; P10BE-NEXT: mtlr r0
|
|
; P10BE-NEXT: blr
|
|
entry:
|
|
%_param_data = alloca [5 x i8], align 1
|
|
%.unpack = load i8, ptr %data, align 1
|
|
%.elt1 = getelementptr inbounds [5 x i8], ptr %data, i64 0, i64 1
|
|
%.unpack2 = load i8, ptr %.elt1, align 1
|
|
%.elt3 = getelementptr inbounds [5 x i8], ptr %data, i64 0, i64 2
|
|
%.unpack4 = load i8, ptr %.elt3, align 1
|
|
%.elt5 = getelementptr inbounds [5 x i8], ptr %data, i64 0, i64 3
|
|
%.unpack6 = load i8, ptr %.elt5, align 1
|
|
%.elt7 = getelementptr inbounds [5 x i8], ptr %data, i64 0, i64 4
|
|
%.unpack8 = load i8, ptr %.elt7, align 1
|
|
store i8 %.unpack, ptr %_param_data, align 1
|
|
%.temp.1.gep = getelementptr inbounds [5 x i8], ptr %_param_data, i64 0, i64 1
|
|
store i8 %.unpack2, ptr %.temp.1.gep, align 1
|
|
%.temp.2.gep = getelementptr inbounds [5 x i8], ptr %_param_data, i64 0, i64 2
|
|
store i8 %.unpack4, ptr %.temp.2.gep, align 1
|
|
%.temp.3.gep = getelementptr inbounds [5 x i8], ptr %_param_data, i64 0, i64 3
|
|
store i8 %.unpack6, ptr %.temp.3.gep, align 1
|
|
%.temp.4.gep = getelementptr inbounds [5 x i8], ptr %_param_data, i64 0, i64 4
|
|
store i8 %.unpack8, ptr %.temp.4.gep, align 1
|
|
call void @callee(ptr nonnull %_param_data)
|
|
ret i8 0
|
|
}
|
|
|
|
define signext i8 @caller_6(ptr nocapture readonly byval([6 x i8]) %data) #0 {
|
|
; P8LE-LABEL: caller_6:
|
|
; P8LE: # %bb.0: # %entry
|
|
; P8LE-NEXT: mflr r0
|
|
; P8LE-NEXT: stdu r1, -64(r1)
|
|
; P8LE-NEXT: std r0, 80(r1)
|
|
; P8LE-NEXT: rldicl r4, r3, 32, 32
|
|
; P8LE-NEXT: stw r3, 48(r1)
|
|
; P8LE-NEXT: sth r4, 52(r1)
|
|
; P8LE-NEXT: lwz r3, 48(r1)
|
|
; P8LE-NEXT: lhz r4, 52(r1)
|
|
; P8LE-NEXT: stw r3, 58(r1)
|
|
; P8LE-NEXT: addi r3, r1, 58
|
|
; P8LE-NEXT: sth r4, 62(r1)
|
|
; P8LE-NEXT: bl callee
|
|
; P8LE-NEXT: nop
|
|
; P8LE-NEXT: li r3, 0
|
|
; P8LE-NEXT: addi r1, r1, 64
|
|
; P8LE-NEXT: ld r0, 16(r1)
|
|
; P8LE-NEXT: mtlr r0
|
|
; P8LE-NEXT: blr
|
|
;
|
|
; P9LE-LABEL: caller_6:
|
|
; P9LE: # %bb.0: # %entry
|
|
; P9LE-NEXT: mflr r0
|
|
; P9LE-NEXT: stdu r1, -64(r1)
|
|
; P9LE-NEXT: std r0, 80(r1)
|
|
; P9LE-NEXT: stw r3, 48(r1)
|
|
; P9LE-NEXT: rldicl r3, r3, 32, 32
|
|
; P9LE-NEXT: sth r3, 52(r1)
|
|
; P9LE-NEXT: lwz r3, 48(r1)
|
|
; P9LE-NEXT: lhz r4, 52(r1)
|
|
; P9LE-NEXT: stw r3, 58(r1)
|
|
; P9LE-NEXT: addi r3, r1, 58
|
|
; P9LE-NEXT: sth r4, 62(r1)
|
|
; P9LE-NEXT: bl callee
|
|
; P9LE-NEXT: nop
|
|
; P9LE-NEXT: li r3, 0
|
|
; P9LE-NEXT: addi r1, r1, 64
|
|
; P9LE-NEXT: ld r0, 16(r1)
|
|
; P9LE-NEXT: mtlr r0
|
|
; P9LE-NEXT: blr
|
|
;
|
|
; P10LE-LABEL: caller_6:
|
|
; P10LE: # %bb.0: # %entry
|
|
; P10LE-NEXT: mflr r0
|
|
; P10LE-NEXT: std r0, 16(r1)
|
|
; P10LE-NEXT: stdu r1, -64(r1)
|
|
; P10LE-NEXT: stw r3, 48(r1)
|
|
; P10LE-NEXT: rldicl r3, r3, 32, 32
|
|
; P10LE-NEXT: sth r3, 52(r1)
|
|
; P10LE-NEXT: lwz r3, 48(r1)
|
|
; P10LE-NEXT: lhz r4, 52(r1)
|
|
; P10LE-NEXT: stw r3, 58(r1)
|
|
; P10LE-NEXT: addi r3, r1, 58
|
|
; P10LE-NEXT: sth r4, 62(r1)
|
|
; P10LE-NEXT: bl callee@notoc
|
|
; P10LE-NEXT: li r3, 0
|
|
; P10LE-NEXT: addi r1, r1, 64
|
|
; P10LE-NEXT: ld r0, 16(r1)
|
|
; P10LE-NEXT: mtlr r0
|
|
; P10LE-NEXT: blr
|
|
;
|
|
; P8BE-LABEL: caller_6:
|
|
; P8BE: # %bb.0: # %entry
|
|
; P8BE-NEXT: mflr r0
|
|
; P8BE-NEXT: stdu r1, -128(r1)
|
|
; P8BE-NEXT: rldicl r4, r3, 48, 16
|
|
; P8BE-NEXT: std r0, 144(r1)
|
|
; P8BE-NEXT: sth r3, 182(r1)
|
|
; P8BE-NEXT: stw r4, 178(r1)
|
|
; P8BE-NEXT: lhz r4, 182(r1)
|
|
; P8BE-NEXT: lwz r3, 178(r1)
|
|
; P8BE-NEXT: sth r4, 126(r1)
|
|
; P8BE-NEXT: stw r3, 122(r1)
|
|
; P8BE-NEXT: addi r3, r1, 122
|
|
; P8BE-NEXT: bl callee
|
|
; P8BE-NEXT: nop
|
|
; P8BE-NEXT: li r3, 0
|
|
; P8BE-NEXT: addi r1, r1, 128
|
|
; P8BE-NEXT: ld r0, 16(r1)
|
|
; P8BE-NEXT: mtlr r0
|
|
; P8BE-NEXT: blr
|
|
;
|
|
; P9BE-LABEL: caller_6:
|
|
; P9BE: # %bb.0: # %entry
|
|
; P9BE-NEXT: mflr r0
|
|
; P9BE-NEXT: stdu r1, -128(r1)
|
|
; P9BE-NEXT: rldicl r4, r3, 48, 16
|
|
; P9BE-NEXT: std r0, 144(r1)
|
|
; P9BE-NEXT: sth r3, 182(r1)
|
|
; P9BE-NEXT: stw r4, 178(r1)
|
|
; P9BE-NEXT: lhz r4, 182(r1)
|
|
; P9BE-NEXT: lwz r3, 178(r1)
|
|
; P9BE-NEXT: sth r4, 126(r1)
|
|
; P9BE-NEXT: stw r3, 122(r1)
|
|
; P9BE-NEXT: addi r3, r1, 122
|
|
; P9BE-NEXT: bl callee
|
|
; P9BE-NEXT: nop
|
|
; P9BE-NEXT: li r3, 0
|
|
; P9BE-NEXT: addi r1, r1, 128
|
|
; P9BE-NEXT: ld r0, 16(r1)
|
|
; P9BE-NEXT: mtlr r0
|
|
; P9BE-NEXT: blr
|
|
;
|
|
; P10BE-LABEL: caller_6:
|
|
; P10BE: # %bb.0: # %entry
|
|
; P10BE-NEXT: mflr r0
|
|
; P10BE-NEXT: std r0, 16(r1)
|
|
; P10BE-NEXT: stdu r1, -128(r1)
|
|
; P10BE-NEXT: rldicl r4, r3, 48, 16
|
|
; P10BE-NEXT: sth r3, 182(r1)
|
|
; P10BE-NEXT: stw r4, 178(r1)
|
|
; P10BE-NEXT: lhz r4, 182(r1)
|
|
; P10BE-NEXT: lwz r3, 178(r1)
|
|
; P10BE-NEXT: sth r4, 126(r1)
|
|
; P10BE-NEXT: stw r3, 122(r1)
|
|
; P10BE-NEXT: addi r3, r1, 122
|
|
; P10BE-NEXT: bl callee
|
|
; P10BE-NEXT: nop
|
|
; P10BE-NEXT: li r3, 0
|
|
; P10BE-NEXT: addi r1, r1, 128
|
|
; P10BE-NEXT: ld r0, 16(r1)
|
|
; P10BE-NEXT: mtlr r0
|
|
; P10BE-NEXT: blr
|
|
entry:
|
|
%_param_data = alloca [6 x i8], align 1
|
|
%.unpack = load i8, ptr %data, align 1
|
|
%.elt1 = getelementptr inbounds [6 x i8], ptr %data, i64 0, i64 1
|
|
%.unpack2 = load i8, ptr %.elt1, align 1
|
|
%.elt3 = getelementptr inbounds [6 x i8], ptr %data, i64 0, i64 2
|
|
%.unpack4 = load i8, ptr %.elt3, align 1
|
|
%.elt5 = getelementptr inbounds [6 x i8], ptr %data, i64 0, i64 3
|
|
%.unpack6 = load i8, ptr %.elt5, align 1
|
|
%.elt7 = getelementptr inbounds [6 x i8], ptr %data, i64 0, i64 4
|
|
%.unpack8 = load i8, ptr %.elt7, align 1
|
|
%.elt9 = getelementptr inbounds [6 x i8], ptr %data, i64 0, i64 5
|
|
%.unpack10 = load i8, ptr %.elt9, align 1
|
|
store i8 %.unpack, ptr %_param_data, align 1
|
|
%.temp.1.gep = getelementptr inbounds [6 x i8], ptr %_param_data, i64 0, i64 1
|
|
store i8 %.unpack2, ptr %.temp.1.gep, align 1
|
|
%.temp.2.gep = getelementptr inbounds [6 x i8], ptr %_param_data, i64 0, i64 2
|
|
store i8 %.unpack4, ptr %.temp.2.gep, align 1
|
|
%.temp.3.gep = getelementptr inbounds [6 x i8], ptr %_param_data, i64 0, i64 3
|
|
store i8 %.unpack6, ptr %.temp.3.gep, align 1
|
|
%.temp.4.gep = getelementptr inbounds [6 x i8], ptr %_param_data, i64 0, i64 4
|
|
store i8 %.unpack8, ptr %.temp.4.gep, align 1
|
|
%.temp.5.gep = getelementptr inbounds [6 x i8], ptr %_param_data, i64 0, i64 5
|
|
store i8 %.unpack10, ptr %.temp.5.gep, align 1
|
|
call void @callee(ptr nonnull %_param_data)
|
|
ret i8 0
|
|
}
|
|
|
|
define signext i8 @caller_7(ptr nocapture readonly byval([7 x i8]) %data) #0 {
|
|
; P8LE-LABEL: caller_7:
|
|
; P8LE: # %bb.0: # %entry
|
|
; P8LE-NEXT: mflr r0
|
|
; P8LE-NEXT: stdu r1, -64(r1)
|
|
; P8LE-NEXT: rldicl r4, r3, 32, 32
|
|
; P8LE-NEXT: rldicl r5, r3, 16, 48
|
|
; P8LE-NEXT: std r0, 80(r1)
|
|
; P8LE-NEXT: stw r3, 48(r1)
|
|
; P8LE-NEXT: sth r4, 52(r1)
|
|
; P8LE-NEXT: stb r5, 54(r1)
|
|
; P8LE-NEXT: lhz r4, 52(r1)
|
|
; P8LE-NEXT: lbz r5, 54(r1)
|
|
; P8LE-NEXT: stw r3, 57(r1)
|
|
; P8LE-NEXT: addi r3, r1, 57
|
|
; P8LE-NEXT: sth r4, 61(r1)
|
|
; P8LE-NEXT: stb r5, 63(r1)
|
|
; P8LE-NEXT: bl callee
|
|
; P8LE-NEXT: nop
|
|
; P8LE-NEXT: li r3, 0
|
|
; P8LE-NEXT: addi r1, r1, 64
|
|
; P8LE-NEXT: ld r0, 16(r1)
|
|
; P8LE-NEXT: mtlr r0
|
|
; P8LE-NEXT: blr
|
|
;
|
|
; P9LE-LABEL: caller_7:
|
|
; P9LE: # %bb.0: # %entry
|
|
; P9LE-NEXT: mflr r0
|
|
; P9LE-NEXT: stdu r1, -64(r1)
|
|
; P9LE-NEXT: rldicl r4, r3, 32, 32
|
|
; P9LE-NEXT: std r0, 80(r1)
|
|
; P9LE-NEXT: stw r3, 48(r1)
|
|
; P9LE-NEXT: stw r3, 57(r1)
|
|
; P9LE-NEXT: sth r4, 52(r1)
|
|
; P9LE-NEXT: rldicl r4, r3, 16, 48
|
|
; P9LE-NEXT: addi r3, r1, 57
|
|
; P9LE-NEXT: stb r4, 54(r1)
|
|
; P9LE-NEXT: lhz r4, 52(r1)
|
|
; P9LE-NEXT: lbz r5, 54(r1)
|
|
; P9LE-NEXT: sth r4, 61(r1)
|
|
; P9LE-NEXT: stb r5, 63(r1)
|
|
; P9LE-NEXT: bl callee
|
|
; P9LE-NEXT: nop
|
|
; P9LE-NEXT: li r3, 0
|
|
; P9LE-NEXT: addi r1, r1, 64
|
|
; P9LE-NEXT: ld r0, 16(r1)
|
|
; P9LE-NEXT: mtlr r0
|
|
; P9LE-NEXT: blr
|
|
;
|
|
; P10LE-LABEL: caller_7:
|
|
; P10LE: # %bb.0: # %entry
|
|
; P10LE-NEXT: mflr r0
|
|
; P10LE-NEXT: std r0, 16(r1)
|
|
; P10LE-NEXT: stdu r1, -64(r1)
|
|
; P10LE-NEXT: rldicl r4, r3, 32, 32
|
|
; P10LE-NEXT: stw r3, 48(r1)
|
|
; P10LE-NEXT: stw r3, 57(r1)
|
|
; P10LE-NEXT: sth r4, 52(r1)
|
|
; P10LE-NEXT: rldicl r4, r3, 16, 48
|
|
; P10LE-NEXT: addi r3, r1, 57
|
|
; P10LE-NEXT: stb r4, 54(r1)
|
|
; P10LE-NEXT: lhz r4, 52(r1)
|
|
; P10LE-NEXT: lbz r5, 54(r1)
|
|
; P10LE-NEXT: sth r4, 61(r1)
|
|
; P10LE-NEXT: stb r5, 63(r1)
|
|
; P10LE-NEXT: bl callee@notoc
|
|
; P10LE-NEXT: li r3, 0
|
|
; P10LE-NEXT: addi r1, r1, 64
|
|
; P10LE-NEXT: ld r0, 16(r1)
|
|
; P10LE-NEXT: mtlr r0
|
|
; P10LE-NEXT: blr
|
|
;
|
|
; P8BE-LABEL: caller_7:
|
|
; P8BE: # %bb.0: # %entry
|
|
; P8BE-NEXT: mflr r0
|
|
; P8BE-NEXT: stdu r1, -128(r1)
|
|
; P8BE-NEXT: rldicl r4, r3, 56, 8
|
|
; P8BE-NEXT: std r0, 144(r1)
|
|
; P8BE-NEXT: stb r3, 183(r1)
|
|
; P8BE-NEXT: rldicl r3, r3, 40, 24
|
|
; P8BE-NEXT: sth r4, 181(r1)
|
|
; P8BE-NEXT: lbz r5, 183(r1)
|
|
; P8BE-NEXT: lhz r4, 181(r1)
|
|
; P8BE-NEXT: stw r3, 177(r1)
|
|
; P8BE-NEXT: stw r3, 121(r1)
|
|
; P8BE-NEXT: addi r3, r1, 121
|
|
; P8BE-NEXT: sth r4, 125(r1)
|
|
; P8BE-NEXT: stb r5, 127(r1)
|
|
; P8BE-NEXT: bl callee
|
|
; P8BE-NEXT: nop
|
|
; P8BE-NEXT: li r3, 0
|
|
; P8BE-NEXT: addi r1, r1, 128
|
|
; P8BE-NEXT: ld r0, 16(r1)
|
|
; P8BE-NEXT: mtlr r0
|
|
; P8BE-NEXT: blr
|
|
;
|
|
; P9BE-LABEL: caller_7:
|
|
; P9BE: # %bb.0: # %entry
|
|
; P9BE-NEXT: mflr r0
|
|
; P9BE-NEXT: stdu r1, -128(r1)
|
|
; P9BE-NEXT: rldicl r4, r3, 56, 8
|
|
; P9BE-NEXT: std r0, 144(r1)
|
|
; P9BE-NEXT: stb r3, 183(r1)
|
|
; P9BE-NEXT: lbz r5, 183(r1)
|
|
; P9BE-NEXT: rldicl r3, r3, 40, 24
|
|
; P9BE-NEXT: sth r4, 181(r1)
|
|
; P9BE-NEXT: stw r3, 177(r1)
|
|
; P9BE-NEXT: lhz r4, 181(r1)
|
|
; P9BE-NEXT: stw r3, 121(r1)
|
|
; P9BE-NEXT: addi r3, r1, 121
|
|
; P9BE-NEXT: stb r5, 127(r1)
|
|
; P9BE-NEXT: sth r4, 125(r1)
|
|
; P9BE-NEXT: bl callee
|
|
; P9BE-NEXT: nop
|
|
; P9BE-NEXT: li r3, 0
|
|
; P9BE-NEXT: addi r1, r1, 128
|
|
; P9BE-NEXT: ld r0, 16(r1)
|
|
; P9BE-NEXT: mtlr r0
|
|
; P9BE-NEXT: blr
|
|
;
|
|
; P10BE-LABEL: caller_7:
|
|
; P10BE: # %bb.0: # %entry
|
|
; P10BE-NEXT: mflr r0
|
|
; P10BE-NEXT: std r0, 16(r1)
|
|
; P10BE-NEXT: stdu r1, -128(r1)
|
|
; P10BE-NEXT: rldicl r4, r3, 56, 8
|
|
; P10BE-NEXT: stb r3, 183(r1)
|
|
; P10BE-NEXT: rldicl r3, r3, 40, 24
|
|
; P10BE-NEXT: lbz r5, 183(r1)
|
|
; P10BE-NEXT: sth r4, 181(r1)
|
|
; P10BE-NEXT: stw r3, 177(r1)
|
|
; P10BE-NEXT: stw r3, 121(r1)
|
|
; P10BE-NEXT: addi r3, r1, 121
|
|
; P10BE-NEXT: lhz r4, 181(r1)
|
|
; P10BE-NEXT: stb r5, 127(r1)
|
|
; P10BE-NEXT: sth r4, 125(r1)
|
|
; P10BE-NEXT: bl callee
|
|
; P10BE-NEXT: nop
|
|
; P10BE-NEXT: li r3, 0
|
|
; P10BE-NEXT: addi r1, r1, 128
|
|
; P10BE-NEXT: ld r0, 16(r1)
|
|
; P10BE-NEXT: mtlr r0
|
|
; P10BE-NEXT: blr
|
|
entry:
|
|
%_param_data = alloca [7 x i8], align 1
|
|
%.unpack = load i8, ptr %data, align 1
|
|
%.elt1 = getelementptr inbounds [7 x i8], ptr %data, i64 0, i64 1
|
|
%.unpack2 = load i8, ptr %.elt1, align 1
|
|
%.elt3 = getelementptr inbounds [7 x i8], ptr %data, i64 0, i64 2
|
|
%.unpack4 = load i8, ptr %.elt3, align 1
|
|
%.elt5 = getelementptr inbounds [7 x i8], ptr %data, i64 0, i64 3
|
|
%.unpack6 = load i8, ptr %.elt5, align 1
|
|
%.elt7 = getelementptr inbounds [7 x i8], ptr %data, i64 0, i64 4
|
|
%.unpack8 = load i8, ptr %.elt7, align 1
|
|
%.elt9 = getelementptr inbounds [7 x i8], ptr %data, i64 0, i64 5
|
|
%.unpack10 = load i8, ptr %.elt9, align 1
|
|
%.elt11 = getelementptr inbounds [7 x i8], ptr %data, i64 0, i64 6
|
|
%.unpack12 = load i8, ptr %.elt11, align 1
|
|
store i8 %.unpack, ptr %_param_data, align 1
|
|
%.temp.1.gep = getelementptr inbounds [7 x i8], ptr %_param_data, i64 0, i64 1
|
|
store i8 %.unpack2, ptr %.temp.1.gep, align 1
|
|
%.temp.2.gep = getelementptr inbounds [7 x i8], ptr %_param_data, i64 0, i64 2
|
|
store i8 %.unpack4, ptr %.temp.2.gep, align 1
|
|
%.temp.3.gep = getelementptr inbounds [7 x i8], ptr %_param_data, i64 0, i64 3
|
|
store i8 %.unpack6, ptr %.temp.3.gep, align 1
|
|
%.temp.4.gep = getelementptr inbounds [7 x i8], ptr %_param_data, i64 0, i64 4
|
|
store i8 %.unpack8, ptr %.temp.4.gep, align 1
|
|
%.temp.5.gep = getelementptr inbounds [7 x i8], ptr %_param_data, i64 0, i64 5
|
|
store i8 %.unpack10, ptr %.temp.5.gep, align 1
|
|
%.temp.6.gep = getelementptr inbounds [7 x i8], ptr %_param_data, i64 0, i64 6
|
|
store i8 %.unpack12, ptr %.temp.6.gep, align 1
|
|
call void @callee(ptr nonnull %_param_data)
|
|
ret i8 0
|
|
}
|
|
|
|
declare void @callee(ptr) local_unnamed_addr #0
|
|
|
|
attributes #0 = { nounwind }
|