| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py |
| ; RUN: llc -verify-machineinstrs < %s | FileCheck %s |
| |
| target datalayout = "e-m:e-i64:64-n32:64-S128-v256:256:256-v512:512:512" |
| target triple = "powerpc64le-unknown-linux-gnu" |
| |
| %struct_S1 = type { [1 x i8] } |
| @gS1 = external global %struct_S1, align 1 |
| |
| define void @call_test_byval_mem1() #0 { |
| ; CHECK-LABEL: call_test_byval_mem1: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: mflr 0 |
| ; CHECK-NEXT: stdu 1, -32(1) |
| ; CHECK-NEXT: std 0, 48(1) |
| ; CHECK-NEXT: .cfi_def_cfa_offset 32 |
| ; CHECK-NEXT: .cfi_offset lr, 16 |
| ; CHECK-NEXT: addis 3, 2, .LC0@toc@ha |
| ; CHECK-NEXT: ld 3, .LC0@toc@l(3) |
| ; CHECK-NEXT: lbz 3, 0(3) |
| ; CHECK-NEXT: bl test_byval_mem1 |
| ; CHECK-NEXT: nop |
| ; CHECK-NEXT: addi 1, 1, 32 |
| ; CHECK-NEXT: ld 0, 16(1) |
| ; CHECK-NEXT: mtlr 0 |
| ; CHECK-NEXT: blr |
| entry: |
| %call = call zeroext i8 @test_byval_mem1(ptr byval(%struct_S1) align 1 @gS1) |
| ret void |
| } |
| |
| define zeroext i8 @test_byval_mem1(ptr byval(%struct_S1) align 1 %s) { |
| ; CHECK-LABEL: test_byval_mem1: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: stb 3, -8(1) |
| ; CHECK-NEXT: clrldi 3, 3, 56 |
| ; CHECK-NEXT: blr |
| entry: |
| %0 = load i8, ptr %s, align 1 |
| ret i8 %0 |
| } |
| |
| define void @call_test_byval_mem1_2() #0 { |
| ; CHECK-LABEL: call_test_byval_mem1_2: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: mflr 0 |
| ; CHECK-NEXT: stdu 1, -112(1) |
| ; CHECK-NEXT: std 0, 128(1) |
| ; CHECK-NEXT: .cfi_def_cfa_offset 112 |
| ; CHECK-NEXT: .cfi_offset lr, 16 |
| ; CHECK-NEXT: addis 3, 2, .LC0@toc@ha |
| ; CHECK-NEXT: li 4, 1 |
| ; CHECK-NEXT: li 5, 2 |
| ; CHECK-NEXT: li 6, 3 |
| ; CHECK-NEXT: li 7, 4 |
| ; CHECK-NEXT: li 8, 5 |
| ; CHECK-NEXT: li 9, 6 |
| ; CHECK-NEXT: li 10, 7 |
| ; CHECK-NEXT: ld 3, .LC0@toc@l(3) |
| ; CHECK-NEXT: lbz 3, 0(3) |
| ; CHECK-NEXT: stb 3, 96(1) |
| ; CHECK-NEXT: li 3, 0 |
| ; CHECK-NEXT: bl test_byval_mem1_2 |
| ; CHECK-NEXT: nop |
| ; CHECK-NEXT: addi 1, 1, 112 |
| ; CHECK-NEXT: ld 0, 16(1) |
| ; CHECK-NEXT: mtlr 0 |
| ; CHECK-NEXT: blr |
| entry: |
| %call = call zeroext i8 @test_byval_mem1_2(i64 0, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7, ptr byval(%struct_S1) align 1 @gS1) |
| ret void |
| } |
| |
| define zeroext i8 @test_byval_mem1_2(i64 %v1, i64 %v2, i64 %v3, i64 %v4, i64 %v5, i64 %v6, i64 %v7, i64 %v8, ptr byval(%struct_S1) align 1 %s) { |
| ; CHECK-LABEL: test_byval_mem1_2: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: lbz 3, 96(1) |
| ; CHECK-NEXT: blr |
| entry: |
| %0 = load i8, ptr %s, align 1 |
| ret i8 %0 |
| } |
| |
| define void @call_test_byval_mem1_3() #0 { |
| ; CHECK-LABEL: call_test_byval_mem1_3: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: mflr 0 |
| ; CHECK-NEXT: stdu 1, -32(1) |
| ; CHECK-NEXT: std 0, 48(1) |
| ; CHECK-NEXT: .cfi_def_cfa_offset 32 |
| ; CHECK-NEXT: .cfi_offset lr, 16 |
| ; CHECK-NEXT: addis 3, 2, .LC0@toc@ha |
| ; CHECK-NEXT: li 4, 1 |
| ; CHECK-NEXT: li 5, 2 |
| ; CHECK-NEXT: li 6, 3 |
| ; CHECK-NEXT: li 7, 4 |
| ; CHECK-NEXT: li 8, 5 |
| ; CHECK-NEXT: li 9, 6 |
| ; CHECK-NEXT: ld 3, .LC0@toc@l(3) |
| ; CHECK-NEXT: lbz 10, 0(3) |
| ; CHECK-NEXT: li 3, 0 |
| ; CHECK-NEXT: bl test_byval_mem1_3 |
| ; CHECK-NEXT: nop |
| ; CHECK-NEXT: addi 1, 1, 32 |
| ; CHECK-NEXT: ld 0, 16(1) |
| ; CHECK-NEXT: mtlr 0 |
| ; CHECK-NEXT: blr |
| entry: |
| %call = call zeroext i8 @test_byval_mem1_3(i64 0, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, ptr byval(%struct_S1) align 1 @gS1) |
| ret void |
| } |
| |
| define zeroext i8 @test_byval_mem1_3(i64 %v1, i64 %v2, i64 %v3, i64 %v4, i64 %v5, i64 %v6, i64 %v7, ptr byval(%struct_S1) align 1 %s) { |
| ; CHECK-LABEL: test_byval_mem1_3: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: clrldi 3, 10, 56 |
| ; CHECK-NEXT: stb 10, -8(1) |
| ; CHECK-NEXT: blr |
| entry: |
| %0 = load i8, ptr %s, align 1 |
| ret i8 %0 |
| } |
| |
| define void @call_test_byval_mem1_4() #0 { |
| ; CHECK-LABEL: call_test_byval_mem1_4: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: mflr 0 |
| ; CHECK-NEXT: stdu 1, -112(1) |
| ; CHECK-NEXT: std 0, 128(1) |
| ; CHECK-NEXT: .cfi_def_cfa_offset 112 |
| ; CHECK-NEXT: .cfi_offset lr, 16 |
| ; CHECK-NEXT: li 3, 7 |
| ; CHECK-NEXT: li 4, 1 |
| ; CHECK-NEXT: li 5, 2 |
| ; CHECK-NEXT: li 7, 3 |
| ; CHECK-NEXT: li 8, 4 |
| ; CHECK-NEXT: li 9, 5 |
| ; CHECK-NEXT: li 10, 6 |
| ; CHECK-NEXT: std 3, 96(1) |
| ; CHECK-NEXT: addis 3, 2, .LC0@toc@ha |
| ; CHECK-NEXT: ld 3, .LC0@toc@l(3) |
| ; CHECK-NEXT: lbz 6, 0(3) |
| ; CHECK-NEXT: li 3, 0 |
| ; CHECK-NEXT: bl test_byval_mem1_4 |
| ; CHECK-NEXT: nop |
| ; CHECK-NEXT: addi 1, 1, 112 |
| ; CHECK-NEXT: ld 0, 16(1) |
| ; CHECK-NEXT: mtlr 0 |
| ; CHECK-NEXT: blr |
| entry: |
| %call = call zeroext i8 @test_byval_mem1_4(i64 0, i64 1, i64 2, ptr byval(%struct_S1) align 1 @gS1, i64 3, i64 4, i64 5, i64 6, i64 7) |
| ret void |
| } |
| |
| define zeroext i8 @test_byval_mem1_4(i64 %v1, i64 %v2, i64 %v3, ptr byval(%struct_S1) align 1 %s, i64 %v4, i64 %v5, i64 %v6, i64 %v7, i64 %v8) { |
| ; CHECK-LABEL: test_byval_mem1_4: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: clrldi 3, 6, 56 |
| ; CHECK-NEXT: stb 6, 56(1) |
| ; CHECK-NEXT: blr |
| entry: |
| %0 = load i8, ptr %s, align 1 |
| ret i8 %0 |
| } |
| |
| define void @call_test_byval_mem1_5() #0 { |
| ; CHECK-LABEL: call_test_byval_mem1_5: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: mflr 0 |
| ; CHECK-NEXT: stdu 1, -32(1) |
| ; CHECK-NEXT: std 0, 48(1) |
| ; CHECK-NEXT: .cfi_def_cfa_offset 32 |
| ; CHECK-NEXT: .cfi_offset lr, 16 |
| ; CHECK-NEXT: addis 3, 2, .LC0@toc@ha |
| ; CHECK-NEXT: li 4, 1 |
| ; CHECK-NEXT: li 5, 2 |
| ; CHECK-NEXT: li 7, 3 |
| ; CHECK-NEXT: li 8, 4 |
| ; CHECK-NEXT: li 9, 5 |
| ; CHECK-NEXT: li 10, 6 |
| ; CHECK-NEXT: ld 3, .LC0@toc@l(3) |
| ; CHECK-NEXT: lbz 6, 0(3) |
| ; CHECK-NEXT: li 3, 0 |
| ; CHECK-NEXT: bl test_byval_mem1_5 |
| ; CHECK-NEXT: nop |
| ; CHECK-NEXT: addi 1, 1, 32 |
| ; CHECK-NEXT: ld 0, 16(1) |
| ; CHECK-NEXT: mtlr 0 |
| ; CHECK-NEXT: blr |
| entry: |
| %call = call zeroext i8 @test_byval_mem1_5(i64 0, i64 1, i64 2, ptr byval(%struct_S1) align 1 @gS1, i64 3, i64 4, i64 5, i64 6) |
| ret void |
| } |
| |
| define zeroext i8 @test_byval_mem1_5(i64 %v1, i64 %v2, i64 %v3, ptr byval(%struct_S1) align 1 %s, i64 %v4, i64 %v5, i64 %v6, i64 %v7) { |
| ; CHECK-LABEL: test_byval_mem1_5: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: clrldi 3, 6, 56 |
| ; CHECK-NEXT: stb 6, -8(1) |
| ; CHECK-NEXT: blr |
| entry: |
| %0 = load i8, ptr %s, align 1 |
| ret i8 %0 |
| } |
| |
| %struct_S2 = type { [2 x i8] } |
| @gS2 = external global %struct_S2, align 1 |
| |
| define void @call_test_byval_mem2() #0 { |
| ; CHECK-LABEL: call_test_byval_mem2: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: mflr 0 |
| ; CHECK-NEXT: stdu 1, -32(1) |
| ; CHECK-NEXT: std 0, 48(1) |
| ; CHECK-NEXT: .cfi_def_cfa_offset 32 |
| ; CHECK-NEXT: .cfi_offset lr, 16 |
| ; CHECK-NEXT: addis 3, 2, .LC1@toc@ha |
| ; CHECK-NEXT: ld 3, .LC1@toc@l(3) |
| ; CHECK-NEXT: lhz 3, 0(3) |
| ; CHECK-NEXT: bl test_byval_mem2 |
| ; CHECK-NEXT: nop |
| ; CHECK-NEXT: addi 1, 1, 32 |
| ; CHECK-NEXT: ld 0, 16(1) |
| ; CHECK-NEXT: mtlr 0 |
| ; CHECK-NEXT: blr |
| entry: |
| %call = call zeroext i8 @test_byval_mem2(ptr byval(%struct_S2) align 1 @gS2) |
| ret void |
| } |
| |
| define zeroext i8 @test_byval_mem2(ptr byval(%struct_S2) align 1 %s) { |
| ; CHECK-LABEL: test_byval_mem2: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: sth 3, -8(1) |
| ; CHECK-NEXT: lbz 3, -8(1) |
| ; CHECK-NEXT: blr |
| entry: |
| %0 = load i8, ptr %s, align 1 |
| ret i8 %0 |
| } |
| |
| %struct_S3 = type { [3 x i8] } |
| @gS3 = external global %struct_S3, align 1 |
| |
| define void @call_test_byval_mem3() #0 { |
| ; CHECK-LABEL: call_test_byval_mem3: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: mflr 0 |
| ; CHECK-NEXT: stdu 1, -32(1) |
| ; CHECK-NEXT: std 0, 48(1) |
| ; CHECK-NEXT: .cfi_def_cfa_offset 32 |
| ; CHECK-NEXT: .cfi_offset lr, 16 |
| ; CHECK-NEXT: addis 3, 2, .LC2@toc@ha |
| ; CHECK-NEXT: ld 3, .LC2@toc@l(3) |
| ; CHECK-NEXT: lbz 4, 2(3) |
| ; CHECK-NEXT: stb 4, 34(1) |
| ; CHECK-NEXT: lhz 3, 0(3) |
| ; CHECK-NEXT: sth 3, 32(1) |
| ; CHECK-NEXT: ld 3, 32(1) |
| ; CHECK-NEXT: bl test_byval_mem3 |
| ; CHECK-NEXT: nop |
| ; CHECK-NEXT: addi 1, 1, 32 |
| ; CHECK-NEXT: ld 0, 16(1) |
| ; CHECK-NEXT: mtlr 0 |
| ; CHECK-NEXT: blr |
| entry: |
| %call = call zeroext i8 @test_byval_mem3(ptr byval(%struct_S3) align 1 @gS3) |
| ret void |
| } |
| |
| define zeroext i8 @test_byval_mem3(ptr byval(%struct_S3) align 1 %s) { |
| ; CHECK-LABEL: test_byval_mem3: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: sth 3, -8(1) |
| ; CHECK-NEXT: rldicl 3, 3, 48, 16 |
| ; CHECK-NEXT: stb 3, -6(1) |
| ; CHECK-NEXT: lbz 3, -8(1) |
| ; CHECK-NEXT: blr |
| entry: |
| %0 = load i8, ptr %s, align 1 |
| ret i8 %0 |
| } |
| |
| %struct_S4 = type { [4 x i8] } |
| @gS4 = external global %struct_S4, align 1 |
| |
| define void @call_test_byval_mem4() #0 { |
| ; CHECK-LABEL: call_test_byval_mem4: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: mflr 0 |
| ; CHECK-NEXT: stdu 1, -32(1) |
| ; CHECK-NEXT: std 0, 48(1) |
| ; CHECK-NEXT: .cfi_def_cfa_offset 32 |
| ; CHECK-NEXT: .cfi_offset lr, 16 |
| ; CHECK-NEXT: addis 3, 2, .LC3@toc@ha |
| ; CHECK-NEXT: ld 3, .LC3@toc@l(3) |
| ; CHECK-NEXT: lwz 3, 0(3) |
| ; CHECK-NEXT: bl test_byval_mem4 |
| ; CHECK-NEXT: nop |
| ; CHECK-NEXT: addi 1, 1, 32 |
| ; CHECK-NEXT: ld 0, 16(1) |
| ; CHECK-NEXT: mtlr 0 |
| ; CHECK-NEXT: blr |
| entry: |
| %call = call zeroext i8 @test_byval_mem4(ptr byval(%struct_S4) align 1 @gS4) |
| ret void |
| } |
| |
| define zeroext i8 @test_byval_mem4(ptr byval(%struct_S4) align 1 %s) { |
| ; CHECK-LABEL: test_byval_mem4: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: stw 3, -8(1) |
| ; CHECK-NEXT: lbz 3, -8(1) |
| ; CHECK-NEXT: blr |
| entry: |
| %0 = load i8, ptr %s, align 1 |
| ret i8 %0 |
| } |
| |
| %struct_S8 = type { [8 x i8] } |
| @gS8 = external global %struct_S8, align 1 |
| |
| define void @call_test_byval_mem8() #0 { |
| ; CHECK-LABEL: call_test_byval_mem8: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: mflr 0 |
| ; CHECK-NEXT: stdu 1, -32(1) |
| ; CHECK-NEXT: std 0, 48(1) |
| ; CHECK-NEXT: .cfi_def_cfa_offset 32 |
| ; CHECK-NEXT: .cfi_offset lr, 16 |
| ; CHECK-NEXT: addis 3, 2, .LC4@toc@ha |
| ; CHECK-NEXT: ld 3, .LC4@toc@l(3) |
| ; CHECK-NEXT: ld 3, 0(3) |
| ; CHECK-NEXT: bl test_byval_mem8 |
| ; CHECK-NEXT: nop |
| ; CHECK-NEXT: addi 1, 1, 32 |
| ; CHECK-NEXT: ld 0, 16(1) |
| ; CHECK-NEXT: mtlr 0 |
| ; CHECK-NEXT: blr |
| entry: |
| %call = call zeroext i8 @test_byval_mem8(ptr byval(%struct_S8) align 1 @gS8) |
| ret void |
| } |
| |
| define zeroext i8 @test_byval_mem8(ptr byval(%struct_S8) align 1 %s) { |
| ; CHECK-LABEL: test_byval_mem8: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: std 3, -8(1) |
| ; CHECK-NEXT: clrldi 3, 3, 56 |
| ; CHECK-NEXT: blr |
| entry: |
| %0 = load i8, ptr %s, align 1 |
| ret i8 %0 |
| } |
| |
| %struct_S32 = type {[32 x i8] } |
| @gS32 = external global %struct_S32, align 1 |
| |
| define void @call_test_byval_mem32() #0 { |
| ; CHECK-LABEL: call_test_byval_mem32: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: mflr 0 |
| ; CHECK-NEXT: stdu 1, -32(1) |
| ; CHECK-NEXT: std 0, 48(1) |
| ; CHECK-NEXT: .cfi_def_cfa_offset 32 |
| ; CHECK-NEXT: .cfi_offset lr, 16 |
| ; CHECK-NEXT: addis 3, 2, .LC5@toc@ha |
| ; CHECK-NEXT: ld 3, .LC5@toc@l(3) |
| ; CHECK-NEXT: ld 6, 24(3) |
| ; CHECK-NEXT: ld 5, 16(3) |
| ; CHECK-NEXT: ld 4, 8(3) |
| ; CHECK-NEXT: ld 3, 0(3) |
| ; CHECK-NEXT: bl test_byval_mem32 |
| ; CHECK-NEXT: nop |
| ; CHECK-NEXT: addi 1, 1, 32 |
| ; CHECK-NEXT: ld 0, 16(1) |
| ; CHECK-NEXT: mtlr 0 |
| ; CHECK-NEXT: blr |
| entry: |
| %call = call zeroext i8 @test_byval_mem32(ptr byval(%struct_S32) align 1 @gS32) |
| ret void |
| } |
| |
| define zeroext i8 @test_byval_mem32(ptr byval(%struct_S32) align 1 %s) { |
| ; CHECK-LABEL: test_byval_mem32: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: std 3, -32(1) |
| ; CHECK-NEXT: clrldi 3, 3, 56 |
| ; CHECK-NEXT: std 4, -24(1) |
| ; CHECK-NEXT: std 5, -16(1) |
| ; CHECK-NEXT: std 6, -8(1) |
| ; CHECK-NEXT: blr |
| entry: |
| %0 = load i8, ptr %s, align 1 |
| ret i8 %0 |
| } |
| |
| define void @call_test_byval_mem32_2() #0 { |
| ; CHECK-LABEL: call_test_byval_mem32_2: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: mflr 0 |
| ; CHECK-NEXT: stdu 1, -32(1) |
| ; CHECK-NEXT: std 0, 48(1) |
| ; CHECK-NEXT: .cfi_def_cfa_offset 32 |
| ; CHECK-NEXT: .cfi_offset lr, 16 |
| ; CHECK-NEXT: addis 3, 2, .LC5@toc@ha |
| ; CHECK-NEXT: vspltisw 2, 1 |
| ; CHECK-NEXT: ld 3, .LC5@toc@l(3) |
| ; CHECK-NEXT: xvcvsxwdp 1, 34 |
| ; CHECK-NEXT: # kill: def $f1 killed $f1 killed $vsl1 |
| ; CHECK-NEXT: ld 7, 24(3) |
| ; CHECK-NEXT: ld 6, 16(3) |
| ; CHECK-NEXT: ld 5, 8(3) |
| ; CHECK-NEXT: ld 4, 0(3) |
| ; CHECK-NEXT: bl test_byval_mem32_2 |
| ; CHECK-NEXT: nop |
| ; CHECK-NEXT: addi 1, 1, 32 |
| ; CHECK-NEXT: ld 0, 16(1) |
| ; CHECK-NEXT: mtlr 0 |
| ; CHECK-NEXT: blr |
| entry: |
| %call = call zeroext i8 @test_byval_mem32_2(float 1.0, ptr byval(%struct_S32) align 1 @gS32) |
| ret void |
| } |
| |
| define zeroext i8 @test_byval_mem32_2(float %f, ptr byval(%struct_S32) align 1 %s) { |
| ; CHECK-LABEL: test_byval_mem32_2: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: clrldi 3, 4, 56 |
| ; CHECK-NEXT: std 4, -32(1) |
| ; CHECK-NEXT: std 5, -24(1) |
| ; CHECK-NEXT: std 6, -16(1) |
| ; CHECK-NEXT: std 7, -8(1) |
| ; CHECK-NEXT: blr |
| entry: |
| %0 = load i8, ptr %s, align 1 |
| ret i8 %0 |
| } |
| |
| define void @call_test_byval_mem32_3() #0 { |
| ; CHECK-LABEL: call_test_byval_mem32_3: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: mflr 0 |
| ; CHECK-NEXT: stdu 1, -112(1) |
| ; CHECK-NEXT: std 0, 128(1) |
| ; CHECK-NEXT: .cfi_def_cfa_offset 112 |
| ; CHECK-NEXT: .cfi_offset lr, 16 |
| ; CHECK-NEXT: addis 3, 2, .LC5@toc@ha |
| ; CHECK-NEXT: li 4, 16 |
| ; CHECK-NEXT: vspltisw 2, 1 |
| ; CHECK-NEXT: vspltisw 3, 4 |
| ; CHECK-NEXT: li 5, 3 |
| ; CHECK-NEXT: li 7, 2 |
| ; CHECK-NEXT: ld 3, .LC5@toc@l(3) |
| ; CHECK-NEXT: xvcvsxwdp 1, 34 |
| ; CHECK-NEXT: # kill: def $f1 killed $f1 killed $vsl1 |
| ; CHECK-NEXT: xvcvsxwdp 2, 35 |
| ; CHECK-NEXT: # kill: def $f2 killed $f2 killed $vsl2 |
| ; CHECK-NEXT: lxvd2x 0, 3, 4 |
| ; CHECK-NEXT: li 4, 88 |
| ; CHECK-NEXT: stxvd2x 0, 1, 4 |
| ; CHECK-NEXT: li 4, 72 |
| ; CHECK-NEXT: lxvd2x 0, 0, 3 |
| ; CHECK-NEXT: stxvd2x 0, 1, 4 |
| ; CHECK-NEXT: ld 10, 16(3) |
| ; CHECK-NEXT: ld 9, 8(3) |
| ; CHECK-NEXT: ld 8, 0(3) |
| ; CHECK-NEXT: li 3, 1 |
| ; CHECK-NEXT: bl test_byval_mem32_3 |
| ; CHECK-NEXT: nop |
| ; CHECK-NEXT: addi 1, 1, 112 |
| ; CHECK-NEXT: ld 0, 16(1) |
| ; CHECK-NEXT: mtlr 0 |
| ; CHECK-NEXT: blr |
| entry: |
| %call = call zeroext i8 @test_byval_mem32_3(i64 1, float 1.0, i64 3, double 4.0, i32 2, ptr byval(%struct_S32) align 1 @gS32) |
| ret void |
| } |
| |
| define zeroext i8 @test_byval_mem32_3(i64 %i1, float %f, i64 %i2, double %d, i32 %i3, ptr byval(%struct_S32) align 1 %s) { |
| ; CHECK-LABEL: test_byval_mem32_3: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: clrldi 3, 8, 56 |
| ; CHECK-NEXT: std 8, 72(1) |
| ; CHECK-NEXT: std 9, 80(1) |
| ; CHECK-NEXT: std 10, 88(1) |
| ; CHECK-NEXT: blr |
| entry: |
| %0 = load i8, ptr %s, align 1 |
| ret i8 %0 |
| } |
| |
| %struct_S64 = type {[64 x i8] } |
| @gS64= external global %struct_S64, align 1 |
| |
| define void @call_test_byval_mem64() #0 { |
| ; CHECK-LABEL: call_test_byval_mem64: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: mflr 0 |
| ; CHECK-NEXT: stdu 1, -32(1) |
| ; CHECK-NEXT: std 0, 48(1) |
| ; CHECK-NEXT: .cfi_def_cfa_offset 32 |
| ; CHECK-NEXT: .cfi_offset lr, 16 |
| ; CHECK-NEXT: addis 3, 2, .LC6@toc@ha |
| ; CHECK-NEXT: ld 3, .LC6@toc@l(3) |
| ; CHECK-NEXT: ld 10, 56(3) |
| ; CHECK-NEXT: ld 9, 48(3) |
| ; CHECK-NEXT: ld 8, 40(3) |
| ; CHECK-NEXT: ld 7, 32(3) |
| ; CHECK-NEXT: ld 6, 24(3) |
| ; CHECK-NEXT: ld 5, 16(3) |
| ; CHECK-NEXT: ld 4, 8(3) |
| ; CHECK-NEXT: ld 3, 0(3) |
| ; CHECK-NEXT: bl test_byval_mem64 |
| ; CHECK-NEXT: nop |
| ; CHECK-NEXT: addi 1, 1, 32 |
| ; CHECK-NEXT: ld 0, 16(1) |
| ; CHECK-NEXT: mtlr 0 |
| ; CHECK-NEXT: blr |
| entry: |
| %call = call zeroext i8 @test_byval_mem64(ptr byval(%struct_S64) align 1 @gS64) |
| ret void |
| } |
| |
| define zeroext i8 @test_byval_mem64(ptr byval(%struct_S64) align 1 %s) { |
| ; CHECK-LABEL: test_byval_mem64: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: std 3, -64(1) |
| ; CHECK-NEXT: clrldi 3, 3, 56 |
| ; CHECK-NEXT: std 4, -56(1) |
| ; CHECK-NEXT: std 5, -48(1) |
| ; CHECK-NEXT: std 6, -40(1) |
| ; CHECK-NEXT: std 7, -32(1) |
| ; CHECK-NEXT: std 8, -24(1) |
| ; CHECK-NEXT: std 9, -16(1) |
| ; CHECK-NEXT: std 10, -8(1) |
| ; CHECK-NEXT: blr |
| entry: |
| %0 = load i8, ptr %s, align 1 |
| ret i8 %0 |
| } |
| |
| %struct_S65 = type { [65 x i8] } |
| @gS65 = external global %struct_S65, align 1 |
| |
| define void @call_test_byval_mem65() #0 { |
| ; CHECK-LABEL: call_test_byval_mem65: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: mflr 0 |
| ; CHECK-NEXT: stdu 1, -112(1) |
| ; CHECK-NEXT: std 0, 128(1) |
| ; CHECK-NEXT: .cfi_def_cfa_offset 112 |
| ; CHECK-NEXT: .cfi_offset lr, 16 |
| ; CHECK-NEXT: addis 3, 2, .LC7@toc@ha |
| ; CHECK-NEXT: li 4, 48 |
| ; CHECK-NEXT: li 5, 80 |
| ; CHECK-NEXT: li 6, 64 |
| ; CHECK-NEXT: ld 3, .LC7@toc@l(3) |
| ; CHECK-NEXT: lxvd2x 0, 3, 4 |
| ; CHECK-NEXT: stxvd2x 0, 1, 5 |
| ; CHECK-NEXT: li 5, 32 |
| ; CHECK-NEXT: lxvd2x 0, 3, 5 |
| ; CHECK-NEXT: stxvd2x 0, 1, 6 |
| ; CHECK-NEXT: li 6, 16 |
| ; CHECK-NEXT: lxvd2x 0, 3, 6 |
| ; CHECK-NEXT: stxvd2x 0, 1, 4 |
| ; CHECK-NEXT: lxvd2x 0, 0, 3 |
| ; CHECK-NEXT: stxvd2x 0, 1, 5 |
| ; CHECK-NEXT: lbz 4, 64(3) |
| ; CHECK-NEXT: stb 4, 96(1) |
| ; CHECK-NEXT: ld 10, 56(3) |
| ; CHECK-NEXT: ld 9, 48(3) |
| ; CHECK-NEXT: ld 8, 40(3) |
| ; CHECK-NEXT: ld 7, 32(3) |
| ; CHECK-NEXT: ld 6, 24(3) |
| ; CHECK-NEXT: ld 5, 16(3) |
| ; CHECK-NEXT: ld 4, 8(3) |
| ; CHECK-NEXT: ld 3, 0(3) |
| ; CHECK-NEXT: bl test_byval_mem65 |
| ; CHECK-NEXT: nop |
| ; CHECK-NEXT: addi 1, 1, 112 |
| ; CHECK-NEXT: ld 0, 16(1) |
| ; CHECK-NEXT: mtlr 0 |
| ; CHECK-NEXT: blr |
| entry: |
| %call = call zeroext i8 @test_byval_mem65(ptr byval(%struct_S65) align 1 @gS65) |
| ret void |
| } |
| |
| define zeroext i8 @test_byval_mem65(ptr byval(%struct_S65) align 1 %s) { |
| ; CHECK-LABEL: test_byval_mem65: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: std 3, 32(1) |
| ; CHECK-NEXT: clrldi 3, 3, 56 |
| ; CHECK-NEXT: std 4, 40(1) |
| ; CHECK-NEXT: std 5, 48(1) |
| ; CHECK-NEXT: std 6, 56(1) |
| ; CHECK-NEXT: std 7, 64(1) |
| ; CHECK-NEXT: std 8, 72(1) |
| ; CHECK-NEXT: std 9, 80(1) |
| ; CHECK-NEXT: std 10, 88(1) |
| ; CHECK-NEXT: blr |
| entry: |
| %0 = load i8, ptr %s, align 1 |
| ret i8 %0 |
| } |