blob: 5e56a5b34cf05f4fe01d56c97ff44416bff806d8 [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>
Stephen Lind24ab202013-07-14 06:24:09 +00007; CHECK-LABEL: func_cvt5:
Jim Grosbachfb08e552013-04-21 23:47:37 +00008define 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>
Stephen Lind24ab202013-07-14 06:24:09 +000023; CHECK-LABEL: func_cvt1:
Jim Grosbachfb08e552013-04-21 23:47:37 +000024define 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}
Jim Grosbach563983c2013-04-21 23:47:41 +000035
Jim Grosbachfb08e552013-04-21 23:47:37 +000036%T0_51 = type <8 x i32>
37%T1_51 = type <8 x i8>
Stephen Lind24ab202013-07-14 06:24:09 +000038; CHECK-LABEL: func_cvt51:
Jim Grosbachfb08e552013-04-21 23:47:37 +000039define void @func_cvt51(%T0_51* %loadaddr, %T1_51* %storeaddr) {
Jim Grosbach563983c2013-04-21 23:47:41 +000040; CHECK: vmovn.i32
41; CHECK: vmovn.i32
42; CHECK: vmovn.i16
Jim Grosbachfb08e552013-04-21 23:47:37 +000043 %v0 = load %T0_51* %loadaddr
44; COST: func_cvt51
Jim Grosbach563983c2013-04-21 23:47:41 +000045; COST: cost of 3 {{.*}} trunc
Jim Grosbachfb08e552013-04-21 23:47:37 +000046 %r = trunc %T0_51 %v0 to %T1_51
47 store %T1_51 %r, %T1_51* %storeaddr
48 ret void
49}
Jim Grosbach563983c2013-04-21 23:47:41 +000050
Jim Grosbachfb08e552013-04-21 23:47:37 +000051%TT0_5 = type <16 x i8>
52%TT1_5 = type <16 x i32>
Stephen Lind24ab202013-07-14 06:24:09 +000053; CHECK-LABEL: func_cvt52:
Jim Grosbachfb08e552013-04-21 23:47:37 +000054define void @func_cvt52(%TT0_5* %loadaddr, %TT1_5* %storeaddr) {
55; CHECK: vmovl.s16
56; CHECK: vmovl.s16
57; CHECK: vmovl.s16
58; CHECK: vmovl.s16
59 %v0 = load %TT0_5* %loadaddr
60; COST: func_cvt52
61; COST: cost of 6 {{.*}} sext
62 %r = sext %TT0_5 %v0 to %TT1_5
63 store %TT1_5 %r, %TT1_5* %storeaddr
64 ret void
65}
66;; We currently estimate the cost of this instruction as expensive. If lowering
67;; is improved the cost needs to change.
68%TTA0_5 = type <16 x i8>
69%TTA1_5 = type <16 x i32>
Stephen Lind24ab202013-07-14 06:24:09 +000070; CHECK-LABEL: func_cvt12:
Jim Grosbachfb08e552013-04-21 23:47:37 +000071define void @func_cvt12(%TTA0_5* %loadaddr, %TTA1_5* %storeaddr) {
72; CHECK: vmovl.u16
73; CHECK: vmovl.u16
74; CHECK: vmovl.u16
75; CHECK: vmovl.u16
76 %v0 = load %TTA0_5* %loadaddr
77; COST: func_cvt12
78; COST: cost of 6 {{.*}} zext
79 %r = zext %TTA0_5 %v0 to %TTA1_5
80 store %TTA1_5 %r, %TTA1_5* %storeaddr
81 ret void
82}
Jim Grosbach563983c2013-04-21 23:47:41 +000083
Jim Grosbachfb08e552013-04-21 23:47:37 +000084%TT0_51 = type <16 x i32>
85%TT1_51 = type <16 x i8>
Stephen Lind24ab202013-07-14 06:24:09 +000086; CHECK-LABEL: func_cvt512:
Jim Grosbachfb08e552013-04-21 23:47:37 +000087define void @func_cvt512(%TT0_51* %loadaddr, %TT1_51* %storeaddr) {
Jim Grosbach563983c2013-04-21 23:47:41 +000088; CHECK: vmovn.i32
89; CHECK: vmovn.i32
90; CHECK: vmovn.i32
91; CHECK: vmovn.i32
92; CHECK: vmovn.i16
93; CHECK: vmovn.i16
Jim Grosbachfb08e552013-04-21 23:47:37 +000094 %v0 = load %TT0_51* %loadaddr
95; COST: func_cvt512
Jim Grosbach563983c2013-04-21 23:47:41 +000096; COST: cost of 6 {{.*}} trunc
Jim Grosbachfb08e552013-04-21 23:47:37 +000097 %r = trunc %TT0_51 %v0 to %TT1_51
98 store %TT1_51 %r, %TT1_51* %storeaddr
99 ret void
100}
101
Stephen Lind24ab202013-07-14 06:24:09 +0000102; CHECK-LABEL: sext_v4i16_v4i64:
Jim Grosbachfb08e552013-04-21 23:47:37 +0000103define void @sext_v4i16_v4i64(<4 x i16>* %loadaddr, <4 x i64>* %storeaddr) {
104; CHECK: vmovl.s32
105; CHECK: vmovl.s32
106 %v0 = load <4 x i16>* %loadaddr
107; COST: sext_v4i16_v4i64
108; COST: cost of 3 {{.*}} sext
109 %r = sext <4 x i16> %v0 to <4 x i64>
110 store <4 x i64> %r, <4 x i64>* %storeaddr
111 ret void
112}
113
Stephen Lind24ab202013-07-14 06:24:09 +0000114; CHECK-LABEL: zext_v4i16_v4i64:
Jim Grosbachfb08e552013-04-21 23:47:37 +0000115define void @zext_v4i16_v4i64(<4 x i16>* %loadaddr, <4 x i64>* %storeaddr) {
116; CHECK: vmovl.u32
117; CHECK: vmovl.u32
118 %v0 = load <4 x i16>* %loadaddr
119; COST: zext_v4i16_v4i64
120; COST: cost of 3 {{.*}} zext
121 %r = zext <4 x i16> %v0 to <4 x i64>
122 store <4 x i64> %r, <4 x i64>* %storeaddr
123 ret void
124}
125
Stephen Lind24ab202013-07-14 06:24:09 +0000126; CHECK-LABEL: sext_v8i16_v8i64:
Jim Grosbachfb08e552013-04-21 23:47:37 +0000127define void @sext_v8i16_v8i64(<8 x i16>* %loadaddr, <8 x i64>* %storeaddr) {
128; CHECK: vmovl.s32
129; CHECK: vmovl.s32
130; CHECK: vmovl.s32
131; CHECK: vmovl.s32
132 %v0 = load <8 x i16>* %loadaddr
133; COST: sext_v8i16_v8i64
134; COST: cost of 6 {{.*}} sext
135 %r = sext <8 x i16> %v0 to <8 x i64>
136 store <8 x i64> %r, <8 x i64>* %storeaddr
137 ret void
138}
139
Stephen Lind24ab202013-07-14 06:24:09 +0000140; CHECK-LABEL: zext_v8i16_v8i64:
Jim Grosbachfb08e552013-04-21 23:47:37 +0000141define void @zext_v8i16_v8i64(<8 x i16>* %loadaddr, <8 x i64>* %storeaddr) {
142; CHECK: vmovl.u32
143; CHECK: vmovl.u32
144; CHECK: vmovl.u32
145; CHECK: vmovl.u32
146 %v0 = load <8 x i16>* %loadaddr
147; COST: zext_v8i16_v8i64
148; COST: cost of 6 {{.*}} zext
149 %r = zext <8 x i16> %v0 to <8 x i64>
150 store <8 x i64> %r, <8 x i64>* %storeaddr
151 ret void
152}
153