Home | History | Annotate | Download | only in ARM
      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-LABEL: 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-LABEL: 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 
     36 %T0_51 = type <8 x i32>
     37 %T1_51 = type <8 x i8>
     38 ; CHECK-LABEL: func_cvt51:
     39 define void @func_cvt51(%T0_51* %loadaddr, %T1_51* %storeaddr) {
     40 ; CHECK: vmovn.i32
     41 ; CHECK: vmovn.i32
     42 ; CHECK: vmovn.i16
     43   %v0 = load %T0_51* %loadaddr
     44 ; COST: func_cvt51
     45 ; COST: cost of 3 {{.*}} trunc
     46   %r = trunc %T0_51 %v0 to %T1_51
     47   store %T1_51 %r, %T1_51* %storeaddr
     48   ret void
     49 }
     50 
     51 %TT0_5 = type <16 x i8>
     52 %TT1_5 = type <16 x i32>
     53 ; CHECK-LABEL: func_cvt52:
     54 define 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>
     70 ; CHECK-LABEL: func_cvt12:
     71 define 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 }
     83 
     84 %TT0_51 = type <16 x i32>
     85 %TT1_51 = type <16 x i8>
     86 ; CHECK-LABEL: func_cvt512:
     87 define void @func_cvt512(%TT0_51* %loadaddr, %TT1_51* %storeaddr) {
     88 ; CHECK: vmovn.i32
     89 ; CHECK: vmovn.i32
     90 ; CHECK: vmovn.i32
     91 ; CHECK: vmovn.i32
     92 ; CHECK: vmovn.i16
     93 ; CHECK: vmovn.i16
     94   %v0 = load %TT0_51* %loadaddr
     95 ; COST: func_cvt512
     96 ; COST: cost of 6 {{.*}} trunc
     97   %r = trunc %TT0_51 %v0 to %TT1_51
     98   store %TT1_51 %r, %TT1_51* %storeaddr
     99   ret void
    100 }
    101 
    102 ; CHECK-LABEL: sext_v4i16_v4i64:
    103 define 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 
    114 ; CHECK-LABEL: zext_v4i16_v4i64:
    115 define 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 
    126 ; CHECK-LABEL: sext_v8i16_v8i64:
    127 define 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 
    140 ; CHECK-LABEL: zext_v8i16_v8i64:
    141 define 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 
    154