Home | History | Annotate | Download | only in autohvx
      1 ; RUN: llc -march=hexagon < %s | FileCheck %s
      2 
      3 ; --- and
      4 
      5 ; CHECK-LABEL: andb_64:
      6 ; CHECK: vand(v0,v1)
      7 define <64 x i8> @andb_64(<64 x i8> %v0, <64 x i8> %v1) #0 {
      8   %p = and <64 x i8> %v0, %v1
      9   ret <64 x i8> %p
     10 }
     11 
     12 ; CHECK-LABEL: andb_128:
     13 ; CHECK: vand(v0,v1)
     14 define <128 x i8> @andb_128(<128 x i8> %v0, <128 x i8> %v1) #1 {
     15   %p = and <128 x i8> %v0, %v1
     16   ret <128 x i8> %p
     17 }
     18 
     19 ; CHECK-LABEL: andh_64:
     20 ; CHECK: vand(v0,v1)
     21 define <32 x i16> @andh_64(<32 x i16> %v0, <32 x i16> %v1) #0 {
     22   %p = and <32 x i16> %v0, %v1
     23   ret <32 x i16> %p
     24 }
     25 
     26 ; CHECK-LABEL: andh_128:
     27 ; CHECK: vand(v0,v1)
     28 define <64 x i16> @andh_128(<64 x i16> %v0, <64 x i16> %v1) #1 {
     29   %p = and <64 x i16> %v0, %v1
     30   ret <64 x i16> %p
     31 }
     32 
     33 ; CHECK-LABEL: andw_64:
     34 ; CHECK: vand(v0,v1)
     35 define <16 x i32> @andw_64(<16 x i32> %v0, <16 x i32> %v1) #0 {
     36   %p = and <16 x i32> %v0, %v1
     37   ret <16 x i32> %p
     38 }
     39 
     40 ; CHECK-LABEL: andw_128:
     41 ; CHECK: vand(v0,v1)
     42 define <32 x i32> @andw_128(<32 x i32> %v0, <32 x i32> %v1) #1 {
     43   %p = and <32 x i32> %v0, %v1
     44   ret <32 x i32> %p
     45 }
     46 
     47 ; --- or
     48 
     49 ; CHECK-LABEL: orb_64:
     50 ; CHECK: vor(v0,v1)
     51 define <64 x i8> @orb_64(<64 x i8> %v0, <64 x i8> %v1) #0 {
     52   %p = or <64 x i8> %v0, %v1
     53   ret <64 x i8> %p
     54 }
     55 
     56 ; CHECK-LABEL: orb_128:
     57 ; CHECK: vor(v0,v1)
     58 define <128 x i8> @orb_128(<128 x i8> %v0, <128 x i8> %v1) #1 {
     59   %p = or <128 x i8> %v0, %v1
     60   ret <128 x i8> %p
     61 }
     62 
     63 ; CHECK-LABEL: orh_64:
     64 ; CHECK: vor(v0,v1)
     65 define <32 x i16> @orh_64(<32 x i16> %v0, <32 x i16> %v1) #0 {
     66   %p = or <32 x i16> %v0, %v1
     67   ret <32 x i16> %p
     68 }
     69 
     70 ; CHECK-LABEL: orh_128:
     71 ; CHECK: vor(v0,v1)
     72 define <64 x i16> @orh_128(<64 x i16> %v0, <64 x i16> %v1) #1 {
     73   %p = or <64 x i16> %v0, %v1
     74   ret <64 x i16> %p
     75 }
     76 
     77 ; CHECK-LABEL: orw_64:
     78 ; CHECK: vor(v0,v1)
     79 define <16 x i32> @orw_64(<16 x i32> %v0, <16 x i32> %v1) #0 {
     80   %p = or <16 x i32> %v0, %v1
     81   ret <16 x i32> %p
     82 }
     83 
     84 ; CHECK-LABEL: orw_128:
     85 ; CHECK: vor(v0,v1)
     86 define <32 x i32> @orw_128(<32 x i32> %v0, <32 x i32> %v1) #1 {
     87   %p = or <32 x i32> %v0, %v1
     88   ret <32 x i32> %p
     89 }
     90 
     91 ; --- xor
     92 
     93 ; CHECK-LABEL: xorb_64:
     94 ; CHECK: vxor(v0,v1)
     95 define <64 x i8> @xorb_64(<64 x i8> %v0, <64 x i8> %v1) #0 {
     96   %p = xor <64 x i8> %v0, %v1
     97   ret <64 x i8> %p
     98 }
     99 
    100 ; CHECK-LABEL: xorb_128:
    101 ; CHECK: vxor(v0,v1)
    102 define <128 x i8> @xorb_128(<128 x i8> %v0, <128 x i8> %v1) #1 {
    103   %p = xor <128 x i8> %v0, %v1
    104   ret <128 x i8> %p
    105 }
    106 
    107 ; CHECK-LABEL: xorh_64:
    108 ; CHECK: vxor(v0,v1)
    109 define <32 x i16> @xorh_64(<32 x i16> %v0, <32 x i16> %v1) #0 {
    110   %p = xor <32 x i16> %v0, %v1
    111   ret <32 x i16> %p
    112 }
    113 
    114 ; CHECK-LABEL: xorh_128:
    115 ; CHECK: vxor(v0,v1)
    116 define <64 x i16> @xorh_128(<64 x i16> %v0, <64 x i16> %v1) #1 {
    117   %p = xor <64 x i16> %v0, %v1
    118   ret <64 x i16> %p
    119 }
    120 
    121 ; CHECK-LABEL: xorw_64:
    122 ; CHECK: vxor(v0,v1)
    123 define <16 x i32> @xorw_64(<16 x i32> %v0, <16 x i32> %v1) #0 {
    124   %p = xor <16 x i32> %v0, %v1
    125   ret <16 x i32> %p
    126 }
    127 
    128 ; CHECK-LABEL: xorw_128:
    129 ; CHECK: vxor(v0,v1)
    130 define <32 x i32> @xorw_128(<32 x i32> %v0, <32 x i32> %v1) #1 {
    131   %p = xor <32 x i32> %v0, %v1
    132   ret <32 x i32> %p
    133 }
    134 
    135 ; --- add
    136 
    137 ; CHECK-LABEL: addb_64:
    138 ; CHECK: vadd(v0.b,v1.b)
    139 define <64 x i8> @addb_64(<64 x i8> %v0, <64 x i8> %v1) #0 {
    140   %p = add <64 x i8> %v0, %v1
    141   ret <64 x i8> %p
    142 }
    143 
    144 ; CHECK-LABEL: addb_128:
    145 ; CHECK: vadd(v0.b,v1.b)
    146 define <128 x i8> @addb_128(<128 x i8> %v0, <128 x i8> %v1) #1 {
    147   %p = add <128 x i8> %v0, %v1
    148   ret <128 x i8> %p
    149 }
    150 
    151 ; CHECK-LABEL: addh_64:
    152 ; CHECK: vadd(v0.h,v1.h)
    153 define <32 x i16> @addh_64(<32 x i16> %v0, <32 x i16> %v1) #0 {
    154   %p = add <32 x i16> %v0, %v1
    155   ret <32 x i16> %p
    156 }
    157 
    158 ; CHECK-LABEL: addh_128:
    159 ; CHECK: vadd(v0.h,v1.h)
    160 define <64 x i16> @addh_128(<64 x i16> %v0, <64 x i16> %v1) #1 {
    161   %p = add <64 x i16> %v0, %v1
    162   ret <64 x i16> %p
    163 }
    164 
    165 ; CHECK-LABEL: addw_64:
    166 ; CHECK: vadd(v0.w,v1.w)
    167 define <16 x i32> @addw_64(<16 x i32> %v0, <16 x i32> %v1) #0 {
    168   %p = add <16 x i32> %v0, %v1
    169   ret <16 x i32> %p
    170 }
    171 
    172 ; CHECK-LABEL: addw_128:
    173 ; CHECK: vadd(v0.w,v1.w)
    174 define <32 x i32> @addw_128(<32 x i32> %v0, <32 x i32> %v1) #1 {
    175   %p = add <32 x i32> %v0, %v1
    176   ret <32 x i32> %p
    177 }
    178 
    179 ; --- sub
    180 
    181 ; CHECK-LABEL: subb_64:
    182 ; CHECK: vsub(v0.b,v1.b)
    183 define <64 x i8> @subb_64(<64 x i8> %v0, <64 x i8> %v1) #0 {
    184   %p = sub <64 x i8> %v0, %v1
    185   ret <64 x i8> %p
    186 }
    187 
    188 ; CHECK-LABEL: subb_128:
    189 ; CHECK: vsub(v0.b,v1.b)
    190 define <128 x i8> @subb_128(<128 x i8> %v0, <128 x i8> %v1) #1 {
    191   %p = sub <128 x i8> %v0, %v1
    192   ret <128 x i8> %p
    193 }
    194 
    195 ; CHECK-LABEL: subh_64:
    196 ; CHECK: vsub(v0.h,v1.h)
    197 define <32 x i16> @subh_64(<32 x i16> %v0, <32 x i16> %v1) #0 {
    198   %p = sub <32 x i16> %v0, %v1
    199   ret <32 x i16> %p
    200 }
    201 
    202 ; CHECK-LABEL: subh_128:
    203 ; CHECK: vsub(v0.h,v1.h)
    204 define <64 x i16> @subh_128(<64 x i16> %v0, <64 x i16> %v1) #1 {
    205   %p = sub <64 x i16> %v0, %v1
    206   ret <64 x i16> %p
    207 }
    208 
    209 ; CHECK-LABEL: subw_64:
    210 ; CHECK: vsub(v0.w,v1.w)
    211 define <16 x i32> @subw_64(<16 x i32> %v0, <16 x i32> %v1) #0 {
    212   %p = sub <16 x i32> %v0, %v1
    213   ret <16 x i32> %p
    214 }
    215 
    216 ; CHECK-LABEL: subw_128:
    217 ; CHECK: vsub(v0.w,v1.w)
    218 define <32 x i32> @subw_128(<32 x i32> %v0, <32 x i32> %v1) #1 {
    219   %p = sub <32 x i32> %v0, %v1
    220   ret <32 x i32> %p
    221 }
    222 
    223 ; --- mul
    224 
    225 ; CHECK-LABEL: mpyb_64:
    226 ; CHECK: v[[H00:[0-9]+]]:[[L00:[0-9]+]].h = vmpy(v0.b,v1.b)
    227 ; CHECK: vshuffe(v[[H00]].b,v[[L00]].b)
    228 define <64 x i8> @mpyb_64(<64 x i8> %v0, <64 x i8> %v1) #0 {
    229   %p = mul <64 x i8> %v0, %v1
    230   ret <64 x i8> %p
    231 }
    232 
    233 ; CHECK-LABEL: mpyb_128:
    234 ; CHECK: v[[H10:[0-9]+]]:[[L10:[0-9]+]].h = vmpy(v0.b,v1.b)
    235 ; CHECK: vshuffe(v[[H10]].b,v[[L10]].b)
    236 define <128 x i8> @mpyb_128(<128 x i8> %v0, <128 x i8> %v1) #1 {
    237   %p = mul <128 x i8> %v0, %v1
    238   ret <128 x i8> %p
    239 }
    240 
    241 ; CHECK-LABEL: mpyh_64:
    242 ; CHECK: vmpyi(v0.h,v1.h)
    243 define <32 x i16> @mpyh_64(<32 x i16> %v0, <32 x i16> %v1) #0 {
    244   %p = mul <32 x i16> %v0, %v1
    245   ret <32 x i16> %p
    246 }
    247 
    248 ; CHECK-LABEL: mpyh_128:
    249 ; CHECK: vmpyi(v0.h,v1.h)
    250 define <64 x i16> @mpyh_128(<64 x i16> %v0, <64 x i16> %v1) #1 {
    251   %p = mul <64 x i16> %v0, %v1
    252   ret <64 x i16> %p
    253 }
    254 
    255 ; CHECK-LABEL: mpyw_64:
    256 ; CHECK-DAG: r[[T00:[0-9]+]] = #16
    257 ; CHECK-DAG: v[[T01:[0-9]+]].w = vmpyio(v0.w,v1.h)
    258 ; CHECK:     v[[T02:[0-9]+]].w = vasl(v[[T01]].w,r[[T00]])
    259 ; CHECK:     v[[T02]].w += vmpyie(v0.w,v1.uh)
    260 define <16 x i32> @mpyw_64(<16 x i32> %v0, <16 x i32> %v1) #0 {
    261   %p = mul <16 x i32> %v0, %v1
    262   ret <16 x i32> %p
    263 }
    264 
    265 ; CHECK-LABEL: mpyw_128:
    266 ; CHECK-DAG: r[[T10:[0-9]+]] = #16
    267 ; CHECK-DAG: v[[T11:[0-9]+]].w = vmpyio(v0.w,v1.h)
    268 ; CHECK:     v[[T12:[0-9]+]].w = vasl(v[[T11]].w,r[[T10]])
    269 ; CHECK:     v[[T12]].w += vmpyie(v0.w,v1.uh)
    270 define <32 x i32> @mpyw_128(<32 x i32> %v0, <32 x i32> %v1) #1 {
    271   %p = mul <32 x i32> %v0, %v1
    272   ret <32 x i32> %p
    273 }
    274 
    275 attributes #0 = { nounwind "target-cpu"="hexagonv60" "target-features"="+hvx,+hvx-length64b" }
    276 attributes #1 = { nounwind "target-cpu"="hexagonv60" "target-features"="+hvx,+hvx-length128b" }
    277