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