blob: 04619b9c6cf6e0a5f73d7f136d1c2048e6cadbf4 [file] [log] [blame]
Jim Grosbachfb08e552013-04-21 23:47:37 +00001; We currently estimate the cost of sext/zext/trunc v8(v16)i32 <-> v8(v16)i8
2; instructions as expensive. If lowering is improved the cost model needs to
3; change.
4; RUN: opt < %s -cost-model -analyze -mtriple=thumbv7-apple-ios6.0.0 -march=arm -mcpu=cortex-a8 | FileCheck %s --check-prefix=COST
5%T0_5 = type <8 x i8>
6%T1_5 = type <8 x i32>
7; CHECK: func_cvt5:
8define void @func_cvt5(%T0_5* %loadaddr, %T1_5* %storeaddr) {
9; CHECK: vmovl.s8
10; CHECK: vmovl.s16
11; CHECK: vmovl.s16
12 %v0 = load %T0_5* %loadaddr
13; COST: func_cvt5
14; COST: cost of 3 {{.*}} sext
15 %r = sext %T0_5 %v0 to %T1_5
16 store %T1_5 %r, %T1_5* %storeaddr
17 ret void
18}
19;; We currently estimate the cost of this instruction as expensive. If lowering
20;; is improved the cost needs to change.
21%TA0_5 = type <8 x i8>
22%TA1_5 = type <8 x i32>
23; CHECK: func_cvt1:
24define void @func_cvt1(%TA0_5* %loadaddr, %TA1_5* %storeaddr) {
25; CHECK: vmovl.u8
26; CHECK: vmovl.u16
27; CHECK: vmovl.u16
28 %v0 = load %TA0_5* %loadaddr
29; COST: func_cvt1
30; COST: cost of 3 {{.*}} zext
31 %r = zext %TA0_5 %v0 to %TA1_5
32 store %TA1_5 %r, %TA1_5* %storeaddr
33 ret void
34}
35;; We currently estimate the cost of this instruction as expensive. If lowering
36;; is improved the cost needs to change.
37%T0_51 = type <8 x i32>
38%T1_51 = type <8 x i8>
39; CHECK: func_cvt51:
40define void @func_cvt51(%T0_51* %loadaddr, %T1_51* %storeaddr) {
41; CHECK: strb
42; CHECK: strb
43; CHECK: strb
44; CHECK: strb
45; CHECK: strb
46; CHECK: strb
47; CHECK: strb
48; CHECK: strb
49 %v0 = load %T0_51* %loadaddr
50; COST: func_cvt51
51; COST: cost of 19 {{.*}} trunc
52 %r = trunc %T0_51 %v0 to %T1_51
53 store %T1_51 %r, %T1_51* %storeaddr
54 ret void
55}
56;; We currently estimate the cost of this instruction as expensive. If lowering
57;; is improved the cost needs to change.
58%TT0_5 = type <16 x i8>
59%TT1_5 = type <16 x i32>
60; CHECK: func_cvt52:
61define void @func_cvt52(%TT0_5* %loadaddr, %TT1_5* %storeaddr) {
62; CHECK: vmovl.s16
63; CHECK: vmovl.s16
64; CHECK: vmovl.s16
65; CHECK: vmovl.s16
66 %v0 = load %TT0_5* %loadaddr
67; COST: func_cvt52
68; COST: cost of 6 {{.*}} sext
69 %r = sext %TT0_5 %v0 to %TT1_5
70 store %TT1_5 %r, %TT1_5* %storeaddr
71 ret void
72}
73;; We currently estimate the cost of this instruction as expensive. If lowering
74;; is improved the cost needs to change.
75%TTA0_5 = type <16 x i8>
76%TTA1_5 = type <16 x i32>
77; CHECK: func_cvt12:
78define void @func_cvt12(%TTA0_5* %loadaddr, %TTA1_5* %storeaddr) {
79; CHECK: vmovl.u16
80; CHECK: vmovl.u16
81; CHECK: vmovl.u16
82; CHECK: vmovl.u16
83 %v0 = load %TTA0_5* %loadaddr
84; COST: func_cvt12
85; COST: cost of 6 {{.*}} zext
86 %r = zext %TTA0_5 %v0 to %TTA1_5
87 store %TTA1_5 %r, %TTA1_5* %storeaddr
88 ret void
89}
90;; We currently estimate the cost of this instruction as expensive. If lowering
91;; is improved the cost needs to change.
92%TT0_51 = type <16 x i32>
93%TT1_51 = type <16 x i8>
94; CHECK: func_cvt512:
95define void @func_cvt512(%TT0_51* %loadaddr, %TT1_51* %storeaddr) {
96; CHECK: strb
97; CHECK: strb
98; CHECK: strb
99; CHECK: strb
100; CHECK: strb
101; CHECK: strb
102; CHECK: strb
103; CHECK: strb
104; CHECK: strb
105; CHECK: strb
106; CHECK: strb
107; CHECK: strb
108; CHECK: strb
109; CHECK: strb
110; CHECK: strb
111; CHECK: strb
112 %v0 = load %TT0_51* %loadaddr
113; COST: func_cvt512
114; COST: cost of 38 {{.*}} trunc
115 %r = trunc %TT0_51 %v0 to %TT1_51
116 store %TT1_51 %r, %TT1_51* %storeaddr
117 ret void
118}
119
120; CHECK: sext_v4i16_v4i64:
121define void @sext_v4i16_v4i64(<4 x i16>* %loadaddr, <4 x i64>* %storeaddr) {
122; CHECK: vmovl.s32
123; CHECK: vmovl.s32
124 %v0 = load <4 x i16>* %loadaddr
125; COST: sext_v4i16_v4i64
126; COST: cost of 3 {{.*}} sext
127 %r = sext <4 x i16> %v0 to <4 x i64>
128 store <4 x i64> %r, <4 x i64>* %storeaddr
129 ret void
130}
131
132; CHECK: zext_v4i16_v4i64:
133define void @zext_v4i16_v4i64(<4 x i16>* %loadaddr, <4 x i64>* %storeaddr) {
134; CHECK: vmovl.u32
135; CHECK: vmovl.u32
136 %v0 = load <4 x i16>* %loadaddr
137; COST: zext_v4i16_v4i64
138; COST: cost of 3 {{.*}} zext
139 %r = zext <4 x i16> %v0 to <4 x i64>
140 store <4 x i64> %r, <4 x i64>* %storeaddr
141 ret void
142}
143
144; CHECK: sext_v8i16_v8i64:
145define void @sext_v8i16_v8i64(<8 x i16>* %loadaddr, <8 x i64>* %storeaddr) {
146; CHECK: vmovl.s32
147; CHECK: vmovl.s32
148; CHECK: vmovl.s32
149; CHECK: vmovl.s32
150 %v0 = load <8 x i16>* %loadaddr
151; COST: sext_v8i16_v8i64
152; COST: cost of 6 {{.*}} sext
153 %r = sext <8 x i16> %v0 to <8 x i64>
154 store <8 x i64> %r, <8 x i64>* %storeaddr
155 ret void
156}
157
158; CHECK: zext_v8i16_v8i64:
159define void @zext_v8i16_v8i64(<8 x i16>* %loadaddr, <8 x i64>* %storeaddr) {
160; CHECK: vmovl.u32
161; CHECK: vmovl.u32
162; CHECK: vmovl.u32
163; CHECK: vmovl.u32
164 %v0 = load <8 x i16>* %loadaddr
165; COST: zext_v8i16_v8i64
166; COST: cost of 6 {{.*}} zext
167 %r = zext <8 x i16> %v0 to <8 x i64>
168 store <8 x i64> %r, <8 x i64>* %storeaddr
169 ret void
170}
171