ARM: Split out cost model vcvt testcases.
[oota-llvm.git] / test / CodeGen / ARM / vcvt-cost.ll
1 ; 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:
8 define 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:
24 define 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:
40 define 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:
61 define 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:
78 define 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:
95 define 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:
121 define 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:
133 define 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:
145 define 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:
159 define 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