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