1 ; RUN: llc -verify-machineinstrs -mcpu=pwr7 < %s | FileCheck %s
2 target datalayout = "e-m:e-i64:64-n32:64"
3 target triple = "powerpc64le-unknown-linux-gnu"
5 ; Make sure that we don't generate a std r, 0(0) -- the memory address cannot
8 ; CHECK-NOT: std {{[0-9]+}}, 0(0)
11 define void @test1({ i8*, void (i8*, i8*)* } %fn_arg) {
12 %fn = alloca { i8*, void (i8*, i8*)* }
13 %sp = alloca i8*, align 8
14 %regs = alloca [18 x i64], align 8
15 store { i8*, void (i8*, i8*)* } %fn_arg, { i8*, void (i8*, i8*)* }* %fn
16 %1 = bitcast [18 x i64]* %regs to i64*
17 call void asm sideeffect "std 14, $0", "=*m"(i64* %1)
18 %2 = bitcast [18 x i64]* %regs to i8*
19 %3 = getelementptr i8, i8* %2, i32 8
20 %4 = bitcast i8* %3 to i64*
21 call void asm sideeffect "std 15, $0", "=*m"(i64* %4)
22 %5 = bitcast [18 x i64]* %regs to i8*
23 %6 = getelementptr i8, i8* %5, i32 16
24 %7 = bitcast i8* %6 to i64*
25 call void asm sideeffect "std 16, $0", "=*m"(i64* %7)
26 %8 = bitcast [18 x i64]* %regs to i8*
27 %9 = getelementptr i8, i8* %8, i32 24
28 %10 = bitcast i8* %9 to i64*
29 call void asm sideeffect "std 17, $0", "=*m"(i64* %10)
30 %11 = bitcast [18 x i64]* %regs to i8*
31 %12 = getelementptr i8, i8* %11, i32 32
32 %13 = bitcast i8* %12 to i64*
33 call void asm sideeffect "std 18, $0", "=*m"(i64* %13)
34 %14 = bitcast [18 x i64]* %regs to i8*
35 %15 = getelementptr i8, i8* %14, i32 40
36 %16 = bitcast i8* %15 to i64*
37 call void asm sideeffect "std 19, $0", "=*m"(i64* %16)
38 %17 = bitcast [18 x i64]* %regs to i8*
39 %18 = getelementptr i8, i8* %17, i32 48
40 %19 = bitcast i8* %18 to i64*
41 call void asm sideeffect "std 20, $0", "=*m"(i64* %19)
42 %20 = bitcast [18 x i64]* %regs to i8*
43 %21 = getelementptr i8, i8* %20, i32 56
44 %22 = bitcast i8* %21 to i64*
45 call void asm sideeffect "std 21, $0", "=*m"(i64* %22)
46 %23 = bitcast [18 x i64]* %regs to i8*
47 %24 = getelementptr i8, i8* %23, i32 64
48 %25 = bitcast i8* %24 to i64*
49 call void asm sideeffect "std 22, $0", "=*m"(i64* %25)
50 %26 = bitcast [18 x i64]* %regs to i8*
51 %27 = getelementptr i8, i8* %26, i32 72
52 %28 = bitcast i8* %27 to i64*
53 call void asm sideeffect "std 23, $0", "=*m"(i64* %28)
54 %29 = bitcast [18 x i64]* %regs to i8*
55 %30 = getelementptr i8, i8* %29, i32 80
56 %31 = bitcast i8* %30 to i64*
57 call void asm sideeffect "std 24, $0", "=*m"(i64* %31)
58 %32 = bitcast [18 x i64]* %regs to i8*
59 %33 = getelementptr i8, i8* %32, i32 88
60 %34 = bitcast i8* %33 to i64*
61 call void asm sideeffect "std 25, $0", "=*m"(i64* %34)
62 %35 = bitcast [18 x i64]* %regs to i8*
63 %36 = getelementptr i8, i8* %35, i32 96
64 %37 = bitcast i8* %36 to i64*
65 call void asm sideeffect "std 26, $0", "=*m"(i64* %37)
66 %38 = bitcast [18 x i64]* %regs to i8*
67 %39 = getelementptr i8, i8* %38, i32 104
68 %40 = bitcast i8* %39 to i64*
69 call void asm sideeffect "std 27, $0", "=*m"(i64* %40)
70 %41 = bitcast [18 x i64]* %regs to i8*
71 %42 = getelementptr i8, i8* %41, i32 112
72 %43 = bitcast i8* %42 to i64*
73 call void asm sideeffect "std 28, $0", "=*m"(i64* %43)
74 %44 = bitcast [18 x i64]* %regs to i8*
75 %45 = getelementptr i8, i8* %44, i32 120
76 %46 = bitcast i8* %45 to i64*
77 call void asm sideeffect "std 29, $0", "=*m"(i64* %46)
78 %47 = bitcast [18 x i64]* %regs to i8*
79 %48 = getelementptr i8, i8* %47, i32 128
80 %49 = bitcast i8* %48 to i64*
81 call void asm sideeffect "std 30, $0", "=*m"(i64* %49)
82 %50 = bitcast [18 x i64]* %regs to i8*
83 %51 = getelementptr i8, i8* %50, i32 136
84 %52 = bitcast i8* %51 to i64*
85 call void asm sideeffect "std 31, $0", "=*m"(i64* %52)
86 %53 = getelementptr { i8*, void (i8*, i8*)* }, { i8*, void (i8*, i8*)* }* %fn, i32 0, i32 1
87 %.funcptr = load void (i8*, i8*)*, void (i8*, i8*)** %53
88 %54 = getelementptr { i8*, void (i8*, i8*)* }, { i8*, void (i8*, i8*)* }* %fn, i32 0, i32 0
89 %.ptr = load i8*, i8** %54
90 %55 = load i8*, i8** %sp
91 call void %.funcptr(i8* %.ptr, i8* %55)