1; RUN: llc -mtriple=powerpc-unknown-aix-xcoff -verify-machineinstrs -mcpu=pwr7 \
2; RUN:     -mattr=+altivec -stop-after=prologepilog < %s | \
3; RUN:   FileCheck --check-prefix=MIR32 %s
4
5; RUN: llc -mtriple=powerpc-unknown-aix-xcoff -verify-machineinstrs \
6; RUN:     -mcpu=pwr7 -mattr=+altivec < %s | \
7; RUN:   FileCheck --check-prefix=ASM32 %s
8
9; RUN: llc -mtriple=powerpc64-unknown-aix-xcoff -verify-machineinstrs \
10; RUN:     -mcpu=pwr7 -mattr=+altivec -stop-after=prologepilog < %s | \
11; RUN:   FileCheck --check-prefix=MIR64 %s
12
13; RUN: llc -mtriple=powerpc64-unknown-aix-xcoff -verify-machineinstrs \
14; RUN:     -mcpu=pwr7 -mattr=+altivec < %s | \
15; RUN:   FileCheck --check-prefix=ASM64 %s
16
17define dso_local void @vec_regs() {
18  entry:
19    call void asm sideeffect "", "~{v13},~{v20},~{v26},~{v31}"()
20      ret void
21}
22
23; MIR32-LABEL:   name:            vec_regs
24
25; MIR32:         fixedStack:      []
26; MIR32-NOT:     STXVD2X killed $v20
27; MIR32-NOT:     STXVD2X killed $v26
28; MIR32-NOT:     STXVD2X killed $v31
29; MIR32-LABEL:   INLINEASM
30; MIR32-NOT:     $v20 = LXVD2X
31; MIR32-NOT:     $v26 = LXVD2X
32; MIR32-NOT:     $v31 = LXVD2X
33; MIR32:         BLR implicit $lr, implicit $rm
34
35; MIR64-LABEL:   name:            vec_regs
36
37; MIR64:         fixedStack:      []
38; MIR64-NOT:     STXVD2X killed $v20
39; MIR64-NOT:     STXVD2X killed $v26
40; MIR64-NOT:     STXVD2X killed $v31
41; MIR64-LABEL:   INLINEASM
42; MIR64-NOT:     $v20 = LXVD2X
43; MIR64-NOT:     $v26 = LXVD2X
44; MIR64-NOT:     $v31 = LXVD2X
45; MIR64:         BLR8 implicit $lr8, implicit $rm
46
47; ASM32-LABEL:   .vec_regs:
48
49; ASM32-NOT:     20
50; ASM32-NOT:     26
51; ASM32-NOT:     31
52; ASM32-DAG:     #APP
53; ASM32-DAG:     #NO_APP
54; ASM32:         blr
55
56; ASM64-LABEL:   .vec_regs:
57
58; ASM64-NOT:     20
59; ASM64-NOT:     26
60; ASM64-NOT:     31
61; ASM64-DAG:     #APP
62; ASM64-DAG:     #NO_APP
63; ASM64:         blr
64
65define dso_local void @fprs_gprs_vecregs() {
66    call void asm sideeffect "", "~{r14},~{r25},~{r31},~{f14},~{f21},~{f31},~{v20},~{v26},~{v31}"()
67      ret void
68}
69
70; MIR32-LABEL:   name:            fprs_gprs_vecregs
71
72; MIR32:         fixedStack:
73
74; MIR32:         liveins: $r14, $r25, $r31, $f14, $f21, $f31
75
76; MIR32-NOT:     STXVD2X killed $v20
77; MIR32-NOT:     STXVD2X killed $v26
78; MIR32-NOT:     STXVD2X killed $v31
79; MIR32-DAG:     STW killed $r14, -216, $r1 :: (store (s32) into %fixed-stack.5, align 8)
80; MIR32-DAG:     STW killed $r25, -172, $r1 :: (store (s32) into %fixed-stack.4)
81; MIR32-DAG:     STW killed $r31, -148, $r1 :: (store (s32) into %fixed-stack.3)
82; MIR32-DAG:     STFD killed $f14, -144, $r1 :: (store (s64) into %fixed-stack.2, align 16)
83; MIR32-DAG:     STFD killed $f21, -88, $r1 :: (store (s64) into %fixed-stack.1)
84; MIR32-DAG:     STFD killed $f31, -8, $r1 :: (store (s64) into %fixed-stack.0)
85
86; MIR32-LABEL:   INLINEASM
87
88; MIR32-NOT:     $v20 = LXVD2X
89; MIR32-NOT:     $v26 = LXVD2X
90; MIR32-NOT:     $v31 = LXVD2X
91; MIR32-DAG:     $r14 = LWZ -216, $r1 :: (load (s32) from %fixed-stack.5, align 8)
92; MIR32-DAG:     $r25 = LWZ -172, $r1 :: (load (s32) from %fixed-stack.4)
93; MIR32-DAG:     $r31 = LWZ -148, $r1 :: (load (s32) from %fixed-stack.3)
94; MIR32-DAG:     $f14 = LFD -144, $r1 :: (load (s64) from %fixed-stack.2, align 16)
95; MIR32-DAG:     $f21 = LFD -88, $r1 :: (load (s64) from %fixed-stack.1)
96; MIR32-DAG:     $f31 = LFD -8, $r1 :: (load (s64) from %fixed-stack.0)
97; MIR32-DAG:     BLR implicit $lr, implicit $rm
98
99; MIR64-LABEL:   name:            fprs_gprs_vecregs
100
101; MIR64:         fixedStack:
102
103; MIR64:         liveins: $x14, $x25, $x31, $f14, $f21, $f31
104
105; MIR64-NOT:     STXVD2X killed $v20
106; MIR64-NOT:     STXVD2X killed $v26
107; MIR64-NOT:     STXVD2X killed $v31
108; MIR64-DAG:     STD killed $x14, -288, $x1 :: (store (s64) into %fixed-stack.5, align 16)
109; MIR64-DAG:     STD killed $x25, -200, $x1 :: (store (s64) into %fixed-stack.4)
110; MIR64-DAG:     STD killed $x31, -152, $x1 :: (store (s64) into %fixed-stack.3)
111; MIR64-DAG:     STFD killed $f14, -144, $x1 :: (store (s64) into %fixed-stack.2, align 16)
112; MIR64-DAG:     STFD killed $f21, -88, $x1 :: (store (s64) into %fixed-stack.1)
113; MIR64-DAG:     STFD killed $f31, -8, $x1 :: (store (s64) into %fixed-stack.0)
114
115; MIR64-LABEL:   INLINEASM
116
117; MIR64-NOT:     $v20 = LXVD2X
118; MIR64-NOT:     $v26 = LXVD2X
119; MIR64-NOT:     $v31 = LXVD2X
120; MIR64-DAG:     $x14 = LD -288, $x1 :: (load (s64) from %fixed-stack.5, align 16)
121; MIR64-DAG:     $x25 = LD -200, $x1 :: (load (s64) from %fixed-stack.4)
122; MIR64-DAG:     $x31 = LD -152, $x1 :: (load (s64) from %fixed-stack.3)
123; MIR64-DAG:     $f14 = LFD -144, $x1 :: (load (s64) from %fixed-stack.2, align 16)
124; MIR64-DAG:     $f21 = LFD -88, $x1 :: (load (s64) from %fixed-stack.1)
125; MIR64-DAG:     $f31 = LFD -8, $x1 :: (load (s64) from %fixed-stack.0)
126; MIR64:         BLR8 implicit $lr8, implicit $rm
127
128;; We don't have -ppc-full-reg-names on AIX so can't reliably check-not for
129;; only vector registers numbers in this case.
130
131; ASM32-LABEL:   .fprs_gprs_vecregs:
132
133; ASM32-DAG:     stw 14, -216(1)                         # 4-byte Folded Spill
134; ASM32-DAG:     stw 25, -172(1)                         # 4-byte Folded Spill
135; ASM32-DAG:     stw 31, -148(1)                         # 4-byte Folded Spill
136; ASM32-DAG:     stfd 14, -144(1)                        # 8-byte Folded Spill
137; ASM32-DAG:     stfd 21, -88(1)                         # 8-byte Folded Spill
138; ASM32-DAG:     stfd 31, -8(1)                          # 8-byte Folded Spill
139; ASM32-DAG:     #APP
140; ASM32-DAG:     #NO_APP
141; ASM32-DAG:     lfd 31, -8(1)                           # 8-byte Folded Reload
142; ASM32-DAG:     lfd 21, -88(1)                          # 8-byte Folded Reload
143; ASM32-DAG:     lfd 14, -144(1)                         # 8-byte Folded Reload
144; ASM32-DAG:     lwz 31, -148(1)                         # 4-byte Folded Reload
145; ASM32-DAG:     lwz 25, -172(1)                         # 4-byte Folded Reload
146; ASM32-DAG:     lwz 14, -216(1)                         # 4-byte Folded Reload
147; ASM32:         blr
148
149; ASM64-LABEL    .fprs_gprs_vecregs:
150
151; ASM64-DAG:     std 14, -288(1)                         # 8-byte Folded Spill
152; ASM64-DAG:     std 25, -200(1)                         # 8-byte Folded Spill
153; ASM64-DAG:     std 31, -152(1)                         # 8-byte Folded Spill
154; ASM64-DAG:     stfd 14, -144(1)                        # 8-byte Folded Spill
155; ASM64-DAG:     stfd 21, -88(1)                         # 8-byte Folded Spill
156; ASM64-DAG:     stfd 31, -8(1)                          # 8-byte Folded Spill
157; ASM64-DAG:     #APP
158; ASM64-DAG:     #NO_APP
159; ASM64-DAG:     lfd 31, -8(1)                           # 8-byte Folded Reload
160; ASM64-DAG:     lfd 21, -88(1)                          # 8-byte Folded Reload
161; ASM64-DAG:     lfd 14, -144(1)                         # 8-byte Folded Reload
162; ASM64-DAG:     ld 31, -152(1)                          # 8-byte Folded Reload
163; ASM64-DAG:     ld 25, -200(1)                          # 8-byte Folded Reload
164; ASM64-DAG:     ld 14, -288(1)                          # 8-byte Folded Reload
165; ASM64:         blr
166
167define dso_local void @all_fprs_and_vecregs() {
168    call void asm sideeffect "", "~{f0},~{f1},~{f2},~{f3},~{f4},~{f5},~{f6},~{f7},~{f8},~{f9},~{f10},~{f12},~{f13},~{f14},~{f15},~{f16},~{f17},~{f18},~{f19},~{f20},~{f21},~{f22},~{f23},~{f24},~{f25},~{f26},~{f27},~{f28},~{f29},~{f30},~{f31},~{v0},~{v1},~{v2},~{v3},~{v4},~{v5},~{v6}~{v7},~{v8},~{v9},~{v10},~{v11},~{v12},~{v13},~{v14},~{v15},~{v16},~{v17},~{v18},~{v19}"()
169      ret void
170}
171
172;; Check that reserved vectors are not used.
173; MIR32-LABEL:   all_fprs_and_vecregs
174
175; MIR32-NOT:     $v20
176; MIR32-NOT:     $v21
177; MIR32-NOT:     $v22
178; MIR32-NOT:     $v23
179; MIR32-NOT:     $v24
180; MIR32-NOT:     $v25
181; MIR32-NOT:     $v26
182; MIR32-NOT:     $v27
183; MIR32-NOT:     $v28
184; MIR32-NOT:     $v29
185; MIR32-NOT:     $v30
186; MIR32-NOT:     $v31
187
188; MIR64-LABEL:   all_fprs_and_vecregs
189
190; MIR64-NOT:     $v20
191; MIR64-NOT:     $v21
192; MIR64-NOT:     $v22
193; MIR64-NOT:     $v23
194; MIR64-NOT:     $v24
195; MIR64-NOT:     $v25
196; MIR64-NOT:     $v26
197; MIR64-NOT:     $v27
198; MIR64-NOT:     $v28
199; MIR64-NOT:     $v29
200; MIR64-NOT:     $v30
201; MIR64-NOT:     $v31
202