Home | History | Annotate | Download | only in AArch64
      1 ; RUN: llc -mtriple=aarch64_be--linux-gnu < %s | FileCheck %s
      2 
      3 @vec_v8i16 = global <8 x i16> <i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7, i16 8>
      4 
      5 ; CHECK-LABEL: movi_modimm_t1:
      6 define i16 @movi_modimm_t1() nounwind {
      7   ; CHECK:         ld1     { v[[REG1:[0-9]+]].8h }, [x{{[0-9]+}}]
      8   ; CHECK-NEXT:    movi	   v[[REG2:[0-9]+]].4s, #0x1
      9   ; CHECK-NEXT:    add	   v[[REG1]].8h, v[[REG1]].8h, v[[REG2]].8h
     10   ; CHECK-NEXT:    umov	   w{{[0-9]+}}, v[[REG1]].h[0]
     11   %in = load <8 x i16>, <8 x i16>* @vec_v8i16
     12   %rv = add <8 x i16> %in, <i16 1, i16 0, i16 1, i16 0, i16 1, i16 0, i16 1, i16 0>
     13   %el = extractelement <8 x i16> %rv, i32 0
     14   ret i16 %el
     15 }
     16 
     17 ; CHECK-LABEL: movi_modimm_t2:
     18 define i16 @movi_modimm_t2() nounwind {
     19   ; CHECK:         ld1     { v[[REG1:[0-9]+]].8h }, [x{{[0-9]+}}]
     20   ; CHECK-NEXT:    movi	   v[[REG2:[0-9]+]].4s, #0x1, lsl #8
     21   ; CHECK-NEXT:    add	   v[[REG1]].8h, v[[REG1]].8h, v[[REG2]].8h
     22   ; CHECK-NEXT:    umov	   w{{[0-9]+}}, v[[REG1]].h[0]
     23   %in = load <8 x i16>, <8 x i16>* @vec_v8i16
     24   %rv = add <8 x i16> %in, <i16 256, i16 0, i16 256, i16 0, i16 256, i16 0, i16 256, i16 0>
     25   %el = extractelement <8 x i16> %rv, i32 0
     26   ret i16 %el
     27 }
     28 
     29 ; CHECK-LABEL: movi_modimm_t3:
     30 define i16 @movi_modimm_t3() nounwind {
     31   ; CHECK:         ld1     { v[[REG1:[0-9]+]].8h }, [x{{[0-9]+}}]
     32   ; CHECK-NEXT:    movi	   v[[REG2:[0-9]+]].4s, #0x1, lsl #16
     33   ; CHECK-NEXT:    add	   v[[REG1]].8h, v[[REG1]].8h, v[[REG2]].8h
     34   ; CHECK-NEXT:    umov	   w{{[0-9]+}}, v[[REG1]].h[0]
     35   %in = load <8 x i16>, <8 x i16>* @vec_v8i16
     36   %rv = add <8 x i16> %in, <i16 0, i16 1, i16 0, i16 1, i16 0, i16 1, i16 0, i16 1>
     37   %el = extractelement <8 x i16> %rv, i32 0
     38   ret i16 %el
     39 }
     40 
     41 ; CHECK-LABEL: movi_modimm_t4:
     42 define i16 @movi_modimm_t4() nounwind {
     43   ; CHECK:         ld1     { v[[REG1:[0-9]+]].8h }, [x{{[0-9]+}}]
     44   ; CHECK-NEXT:    movi	   v[[REG2:[0-9]+]].4s, #0x1, lsl #24
     45   ; CHECK-NEXT:    add	   v[[REG1]].8h, v[[REG1]].8h, v[[REG2]].8h
     46   ; CHECK-NEXT:    umov	   w{{[0-9]+}}, v[[REG1]].h[0]
     47   %in = load <8 x i16>, <8 x i16>* @vec_v8i16
     48   %rv = add <8 x i16> %in, <i16 0, i16 256, i16 0, i16 256, i16 0, i16 256, i16 0, i16 256>
     49   %el = extractelement <8 x i16> %rv, i32 0
     50   ret i16 %el
     51 }
     52 
     53 ; CHECK-LABEL: movi_modimm_t5:
     54 define i16 @movi_modimm_t5() nounwind {
     55   ; CHECK:         ld1     { v[[REG1:[0-9]+]].8h }, [x{{[0-9]+}}]
     56   ; CHECK-NEXT:    movi	   v[[REG2:[0-9]+]].8h, #0x1
     57   ; CHECK-NEXT:    add	   v[[REG1]].8h, v[[REG1]].8h, v[[REG2]].8h
     58   ; CHECK-NEXT:    umov	   w{{[0-9]+}}, v[[REG1]].h[0]
     59   %in = load <8 x i16>, <8 x i16>* @vec_v8i16
     60   %rv = add <8 x i16> %in, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
     61   %el = extractelement <8 x i16> %rv, i32 0
     62   ret i16 %el
     63 }
     64 
     65 ; CHECK-LABEL: movi_modimm_t6:
     66 define i16 @movi_modimm_t6() nounwind {
     67   ; CHECK:         ld1     { v[[REG1:[0-9]+]].8h }, [x{{[0-9]+}}]
     68   ; CHECK-NEXT:    movi	   v[[REG2:[0-9]+]].8h, #0x1, lsl #8
     69   ; CHECK-NEXT:    add	   v[[REG1]].8h, v[[REG1]].8h, v[[REG2]].8h
     70   ; CHECK-NEXT:    umov	   w{{[0-9]+}}, v[[REG1]].h[0]
     71   %in = load <8 x i16>, <8 x i16>* @vec_v8i16
     72   %rv = add <8 x i16> %in, <i16 256, i16 256, i16 256, i16 256, i16 256, i16 256, i16 256, i16 256>
     73   %el = extractelement <8 x i16> %rv, i32 0
     74   ret i16 %el
     75 }
     76 
     77 ; CHECK-LABEL: movi_modimm_t7:
     78 define i16 @movi_modimm_t7() nounwind {
     79   ; CHECK:         ld1     { v[[REG1:[0-9]+]].8h }, [x{{[0-9]+}}]
     80   ; CHECK-NEXT:    movi	   v[[REG2:[0-9]+]].4s, #0x1, msl #8
     81   ; CHECK-NEXT:    add	   v[[REG1]].8h, v[[REG1]].8h, v[[REG2]].8h
     82   ; CHECK-NEXT:    umov	   w{{[0-9]+}}, v[[REG1]].h[0]
     83   %in = load <8 x i16>, <8 x i16>* @vec_v8i16
     84   %rv = add <8 x i16> %in, <i16 511, i16 0, i16 511, i16 0, i16 511, i16 0, i16 511, i16 0>
     85   %el = extractelement <8 x i16> %rv, i32 0
     86   ret i16 %el
     87 }
     88 
     89 ; CHECK-LABEL: movi_modimm_t8:
     90 define i16 @movi_modimm_t8() nounwind {
     91   ; CHECK:         ld1     { v[[REG1:[0-9]+]].8h }, [x{{[0-9]+}}]
     92   ; CHECK-NEXT:    movi	   v[[REG2:[0-9]+]].4s, #0x1, msl #16
     93   ; CHECK-NEXT:    add	   v[[REG1]].8h, v[[REG1]].8h, v[[REG2]].8h
     94   ; CHECK-NEXT:    umov	   w{{[0-9]+}}, v[[REG1]].h[0]
     95   %in = load <8 x i16>, <8 x i16>* @vec_v8i16
     96   %rv = add <8 x i16> %in, <i16 65535, i16 1, i16 65535, i16 1, i16 65535, i16 1, i16 65535, i16 1>
     97   %el = extractelement <8 x i16> %rv, i32 0
     98   ret i16 %el
     99 }
    100 
    101 ; CHECK-LABEL: movi_modimm_t9:
    102 define i16 @movi_modimm_t9() nounwind {
    103   ; CHECK:         ld1     { v[[REG1:[0-9]+]].8h }, [x{{[0-9]+}}]
    104   ; CHECK-NEXT:    movi	   v[[REG2:[0-9]+]].16b, #0x1
    105   ; CHECK-NEXT:    add	   v[[REG1]].8h, v[[REG1]].8h, v[[REG2]].8h
    106   ; CHECK-NEXT:    umov	   w{{[0-9]+}}, v[[REG1]].h[0]
    107   %in = load <8 x i16>, <8 x i16>* @vec_v8i16
    108   %rv = add <8 x i16> %in, <i16 257, i16 257, i16 257, i16 257, i16 257, i16 257, i16 257, i16 257>
    109   %el = extractelement <8 x i16> %rv, i32 0
    110   ret i16 %el
    111 }
    112 
    113 ; CHECK-LABEL: movi_modimm_t10:
    114 define i16 @movi_modimm_t10() nounwind {
    115   ; CHECK:         ld1     { v[[REG1:[0-9]+]].8h }, [x{{[0-9]+}}]
    116   ; CHECK-NEXT:    movi	   v[[REG2:[0-9]+]].2d, #0x00ffff0000ffff
    117   ; CHECK-NEXT:    add	   v[[REG1]].8h, v[[REG1]].8h, v[[REG2]].8h
    118   ; CHECK-NEXT:    umov	   w{{[0-9]+}}, v[[REG1]].h[0]
    119   %in = load <8 x i16>, <8 x i16>* @vec_v8i16
    120   %rv = add <8 x i16> %in, <i16 -1, i16 0, i16 -1, i16 0, i16 -1, i16 0, i16 -1, i16 0>
    121   %el = extractelement <8 x i16> %rv, i32 0
    122   ret i16 %el
    123 }
    124 
    125 ; CHECK-LABEL: fmov_modimm_t11:
    126 define i16 @fmov_modimm_t11() nounwind {
    127   ; CHECK:         ld1     { v[[REG1:[0-9]+]].8h }, [x{{[0-9]+}}]
    128   ; CHECK-NEXT:    fmov    v[[REG2:[0-9]+]].4s, #3.00000000
    129   ; CHECK-NEXT:    add	   v[[REG1]].8h, v[[REG1]].8h, v[[REG2]].8h
    130   ; CHECK-NEXT:    umov	   w{{[0-9]+}}, v[[REG1]].h[0]
    131   %in = load <8 x i16>, <8 x i16>* @vec_v8i16
    132   %rv = add <8 x i16> %in, <i16 0, i16 16448, i16 0, i16 16448, i16 0, i16 16448, i16 0, i16 16448>
    133   %el = extractelement <8 x i16> %rv, i32 0
    134   ret i16 %el
    135 }
    136 
    137 ; CHECK-LABEL: fmov_modimm_t12:
    138 define i16 @fmov_modimm_t12() nounwind {
    139   ; CHECK:         ld1     { v[[REG1:[0-9]+]].8h }, [x{{[0-9]+}}]
    140   ; CHECK-NEXT:    fmov    v[[REG2:[0-9]+]].2d, #0.17968750
    141   ; CHECK-NEXT:    add	   v[[REG1]].8h, v[[REG1]].8h, v[[REG2]].8h
    142   ; CHECK-NEXT:    umov	   w{{[0-9]+}}, v[[REG1]].h[0]
    143   %in = load <8 x i16>, <8 x i16>* @vec_v8i16
    144   %rv = add <8 x i16> %in, <i16 0, i16 0, i16 0, i16 16327, i16 0, i16 0, i16 0, i16 16327>
    145   %el = extractelement <8 x i16> %rv, i32 0
    146   ret i16 %el
    147 }
    148 
    149 ; CHECK-LABEL: mvni_modimm_t1:
    150 define i16 @mvni_modimm_t1() nounwind {
    151   ; CHECK:         ld1     { v[[REG1:[0-9]+]].8h }, [x{{[0-9]+}}]
    152   ; CHECK-NEXT:    mvni	   v[[REG2:[0-9]+]].4s, #0x1
    153   ; CHECK-NEXT:    add	   v[[REG1]].8h, v[[REG1]].8h, v[[REG2]].8h
    154   ; CHECK-NEXT:    umov	   w{{[0-9]+}}, v[[REG1]].h[0]
    155   %in = load <8 x i16>, <8 x i16>* @vec_v8i16
    156   %rv = add <8 x i16> %in, <i16 65534, i16 65535, i16 65534, i16 65535, i16 65534, i16 65535, i16 65534, i16 65535>
    157   %el = extractelement <8 x i16> %rv, i32 0
    158   ret i16 %el
    159 }
    160 
    161 ; CHECK-LABEL: mvni_modimm_t2:
    162 define i16 @mvni_modimm_t2() nounwind {
    163   ; CHECK:         ld1     { v[[REG1:[0-9]+]].8h }, [x{{[0-9]+}}]
    164   ; CHECK-NEXT:    mvni	   v[[REG2:[0-9]+]].4s, #0x1, lsl #8
    165   ; CHECK-NEXT:    add	   v[[REG1]].8h, v[[REG1]].8h, v[[REG2]].8h
    166   ; CHECK-NEXT:    umov	   w{{[0-9]+}}, v[[REG1]].h[0]
    167   %in = load <8 x i16>, <8 x i16>* @vec_v8i16
    168   %rv = add <8 x i16> %in, <i16 65279, i16 65535, i16 65279, i16 65535, i16 65279, i16 65535, i16 65279, i16 65535>
    169   %el = extractelement <8 x i16> %rv, i32 0
    170   ret i16 %el
    171 }
    172 
    173 ; CHECK-LABEL: mvni_modimm_t3:
    174 define i16 @mvni_modimm_t3() nounwind {
    175   ; CHECK:         ld1     { v[[REG1:[0-9]+]].8h }, [x{{[0-9]+}}]
    176   ; CHECK-NEXT:    mvni	   v[[REG2:[0-9]+]].4s, #0x1, lsl #16
    177   ; CHECK-NEXT:    add	   v[[REG1]].8h, v[[REG1]].8h, v[[REG2]].8h
    178   ; CHECK-NEXT:    umov	   w{{[0-9]+}}, v[[REG1]].h[0]
    179   %in = load <8 x i16>, <8 x i16>* @vec_v8i16
    180   %rv = add <8 x i16> %in, <i16 65535, i16 65534, i16 65535, i16 65534, i16 65535, i16 65534, i16 65535, i16 65534>
    181   %el = extractelement <8 x i16> %rv, i32 0
    182   ret i16 %el
    183 }
    184 
    185 ; CHECK-LABEL: mvni_modimm_t4:
    186 define i16 @mvni_modimm_t4() nounwind {
    187   ; CHECK:         ld1     { v[[REG1:[0-9]+]].8h }, [x{{[0-9]+}}]
    188   ; CHECK-NEXT:    mvni	   v[[REG2:[0-9]+]].4s, #0x1, lsl #24
    189   ; CHECK-NEXT:    add	   v[[REG1]].8h, v[[REG1]].8h, v[[REG2]].8h
    190   ; CHECK-NEXT:    umov	   w{{[0-9]+}}, v[[REG1]].h[0]
    191   %in = load <8 x i16>, <8 x i16>* @vec_v8i16
    192   %rv = add <8 x i16> %in, <i16 65535, i16 65279, i16 65535, i16 65279, i16 65535, i16 65279, i16 65535, i16 65279>
    193   %el = extractelement <8 x i16> %rv, i32 0
    194   ret i16 %el
    195 }
    196 
    197 ; CHECK-LABEL: mvni_modimm_t5:
    198 define i16 @mvni_modimm_t5() nounwind {
    199   ; CHECK:         ld1     { v[[REG1:[0-9]+]].8h }, [x{{[0-9]+}}]
    200   ; CHECK-NEXT:    mvni	   v[[REG2:[0-9]+]].8h, #0x1
    201   ; CHECK-NEXT:    add	   v[[REG1]].8h, v[[REG1]].8h, v[[REG2]].8h
    202   ; CHECK-NEXT:    umov	   w{{[0-9]+}}, v[[REG1]].h[0]
    203   %in = load <8 x i16>, <8 x i16>* @vec_v8i16
    204   %rv = add <8 x i16> %in, <i16 65534, i16 65534, i16 65534, i16 65534, i16 65534, i16 65534, i16 65534, i16 65534>
    205   %el = extractelement <8 x i16> %rv, i32 0
    206   ret i16 %el
    207 }
    208 
    209 ; CHECK-LABEL: mvni_modimm_t6:
    210 define i16 @mvni_modimm_t6() nounwind {
    211   ; CHECK:         ld1     { v[[REG1:[0-9]+]].8h }, [x{{[0-9]+}}]
    212   ; CHECK-NEXT:    mvni	   v[[REG2:[0-9]+]].8h, #0x1, lsl #8
    213   ; CHECK-NEXT:    add	   v[[REG1]].8h, v[[REG1]].8h, v[[REG2]].8h
    214   ; CHECK-NEXT:    umov	   w{{[0-9]+}}, v[[REG1]].h[0]
    215   %in = load <8 x i16>, <8 x i16>* @vec_v8i16
    216   %rv = add <8 x i16> %in, <i16 65279, i16 65279, i16 65279, i16 65279, i16 65279, i16 65279, i16 65279, i16 65279>
    217   %el = extractelement <8 x i16> %rv, i32 0
    218   ret i16 %el
    219 }
    220 
    221 ; CHECK-LABEL: mvni_modimm_t7:
    222 define i16 @mvni_modimm_t7() nounwind {
    223   ; CHECK:         ld1     { v[[REG1:[0-9]+]].8h }, [x{{[0-9]+}}]
    224   ; CHECK-NEXT:    mvni	   v[[REG2:[0-9]+]].4s, #0x1, msl #8
    225   ; CHECK-NEXT:    add	   v[[REG1]].8h, v[[REG1]].8h, v[[REG2]].8h
    226   ; CHECK-NEXT:    umov	   w{{[0-9]+}}, v[[REG1]].h[0]
    227   %in = load <8 x i16>, <8 x i16>* @vec_v8i16
    228   %rv = add <8 x i16> %in, <i16 65024, i16 65535, i16 65024, i16 65535, i16 65024, i16 65535, i16 65024, i16 65535>
    229   %el = extractelement <8 x i16> %rv, i32 0
    230   ret i16 %el
    231 }
    232 
    233 ; CHECK-LABEL: mvni_modimm_t8:
    234 define i16 @mvni_modimm_t8() nounwind {
    235   ; CHECK:         ld1     { v[[REG1:[0-9]+]].8h }, [x{{[0-9]+}}]
    236   ; CHECK-NEXT:    mvni	   v[[REG2:[0-9]+]].4s, #0x1, msl #16
    237   ; CHECK-NEXT:    add	   v[[REG1]].8h, v[[REG1]].8h, v[[REG2]].8h
    238   ; CHECK-NEXT:    umov	   w{{[0-9]+}}, v[[REG1]].h[0]
    239   %in = load <8 x i16>, <8 x i16>* @vec_v8i16
    240   %rv = add <8 x i16> %in, <i16 0, i16 65534, i16 0, i16 65534, i16 0, i16 65534, i16 0, i16 65534>
    241   %el = extractelement <8 x i16> %rv, i32 0
    242   ret i16 %el
    243 }
    244 
    245 ; CHECK-LABEL: bic_modimm_t1:
    246 define i16 @bic_modimm_t1() nounwind {
    247   ; CHECK:         ld1     { v[[REG1:[0-9]+]].8h }, [x{{[0-9]+}}]
    248   ; CHECK-NEXT:    bic	   v[[REG2:[0-9]+]].4s, #0x1
    249   ; CHECK-NEXT:    umov	   w{{[0-9]+}}, v[[REG1]].h[0]
    250   %in = load <8 x i16>, <8 x i16>* @vec_v8i16
    251   %rv = and <8 x i16> %in, <i16 65534, i16 65535, i16 65534, i16 65535, i16 65534, i16 65535, i16 65534, i16 65535>
    252   %el = extractelement <8 x i16> %rv, i32 0
    253   ret i16 %el
    254 }
    255 
    256 ; CHECK-LABEL: bic_modimm_t2:
    257 define i16 @bic_modimm_t2() nounwind {
    258   ; CHECK:         ld1     { v[[REG1:[0-9]+]].8h }, [x{{[0-9]+}}]
    259   ; CHECK-NEXT:    bic	   v[[REG2:[0-9]+]].4s, #0x1, lsl #8
    260   ; CHECK-NEXT:    umov	   w{{[0-9]+}}, v[[REG1]].h[0]
    261   %in = load <8 x i16>, <8 x i16>* @vec_v8i16
    262   %rv = and <8 x i16> %in, <i16 65279, i16 65535, i16 65279, i16 65535, i16 65279, i16 65535, i16 65279, i16 65535>
    263   %el = extractelement <8 x i16> %rv, i32 0
    264   ret i16 %el
    265 }
    266 
    267 ; CHECK-LABEL: bic_modimm_t3:
    268 define i16 @bic_modimm_t3() nounwind {
    269   ; CHECK:         ld1     { v[[REG1:[0-9]+]].8h }, [x{{[0-9]+}}]
    270   ; CHECK-NEXT:    bic	   v[[REG2:[0-9]+]].4s, #0x1, lsl #16
    271   ; CHECK-NEXT:    umov	   w{{[0-9]+}}, v[[REG1]].h[0]
    272   %in = load <8 x i16>, <8 x i16>* @vec_v8i16
    273   %rv = and <8 x i16> %in, <i16 65535, i16 65534, i16 65535, i16 65534, i16 65535, i16 65534, i16 65535, i16 65534>
    274   %el = extractelement <8 x i16> %rv, i32 0
    275   ret i16 %el
    276 }
    277 
    278 ; CHECK-LABEL: bic_modimm_t4:
    279 define i16 @bic_modimm_t4() nounwind {
    280   ; CHECK:         ld1     { v[[REG1:[0-9]+]].8h }, [x{{[0-9]+}}]
    281   ; CHECK-NEXT:    bic	   v[[REG2:[0-9]+]].4s, #0x1, lsl #24
    282   ; CHECK-NEXT:    umov	   w{{[0-9]+}}, v[[REG1]].h[0]
    283   %in = load <8 x i16>, <8 x i16>* @vec_v8i16
    284   %rv = and <8 x i16> %in, <i16 65535, i16 65279, i16 65535, i16 65279, i16 65535, i16 65279, i16 65535, i16 65279>
    285   %el = extractelement <8 x i16> %rv, i32 0
    286   ret i16 %el
    287 }
    288 
    289 ; CHECK-LABEL: bic_modimm_t5:
    290 define i16 @bic_modimm_t5() nounwind {
    291   ; CHECK:         ld1     { v[[REG1:[0-9]+]].8h }, [x{{[0-9]+}}]
    292   ; CHECK-NEXT:    bic	   v[[REG2:[0-9]+]].8h, #0x1
    293   ; CHECK-NEXT:    umov	   w{{[0-9]+}}, v[[REG1]].h[0]
    294   %in = load <8 x i16>, <8 x i16>* @vec_v8i16
    295   %rv = and <8 x i16> %in, <i16 65534, i16 65534, i16 65534, i16 65534, i16 65534, i16 65534, i16 65534, i16 65534>
    296   %el = extractelement <8 x i16> %rv, i32 0
    297   ret i16 %el
    298 }
    299 
    300 ; CHECK-LABEL: bic_modimm_t6:
    301 define i16 @bic_modimm_t6() nounwind {
    302   ; CHECK:         ld1     { v[[REG1:[0-9]+]].8h }, [x{{[0-9]+}}]
    303   ; CHECK-NEXT:    bic	   v[[REG2:[0-9]+]].8h, #0x1, lsl #8
    304   ; CHECK-NEXT:    umov	   w{{[0-9]+}}, v[[REG1]].h[0]
    305   %in = load <8 x i16>, <8 x i16>* @vec_v8i16
    306   %rv = and <8 x i16> %in, <i16 65279, i16 65279, i16 65279, i16 65279, i16 65279, i16 65279, i16 65279, i16 65279>
    307   %el = extractelement <8 x i16> %rv, i32 0
    308   ret i16 %el
    309 }
    310 
    311 ; CHECK-LABEL: orr_modimm_t1:
    312 define i16 @orr_modimm_t1() nounwind {
    313   ; CHECK:         ld1     { v[[REG1:[0-9]+]].8h }, [x{{[0-9]+}}]
    314   ; CHECK-NEXT:    orr	   v[[REG2:[0-9]+]].4s, #0x1
    315   ; CHECK-NEXT:    umov	   w{{[0-9]+}}, v[[REG1]].h[0]
    316   %in = load <8 x i16>, <8 x i16>* @vec_v8i16
    317   %rv = or <8 x i16> %in, <i16 1, i16 0, i16 1, i16 0, i16 1, i16 0, i16 1, i16 0>
    318   %el = extractelement <8 x i16> %rv, i32 0
    319   ret i16 %el
    320 }
    321 
    322 ; CHECK-LABEL: orr_modimm_t2:
    323 define i16 @orr_modimm_t2() nounwind {
    324   ; CHECK:         ld1     { v[[REG1:[0-9]+]].8h }, [x{{[0-9]+}}]
    325   ; CHECK-NEXT:    orr     v[[REG2:[0-9]+]].4s, #0x1, lsl #8
    326   ; CHECK-NEXT:    umov	   w{{[0-9]+}}, v[[REG1]].h[0]
    327   %in = load <8 x i16>, <8 x i16>* @vec_v8i16
    328   %rv = or <8 x i16> %in, <i16 256, i16 0, i16 256, i16 0, i16 256, i16 0, i16 256, i16 0>
    329   %el = extractelement <8 x i16> %rv, i32 0
    330   ret i16 %el
    331 }
    332 
    333 ; CHECK-LABEL: orr_modimm_t3:
    334 define i16 @orr_modimm_t3() nounwind {
    335   ; CHECK:         ld1     { v[[REG1:[0-9]+]].8h }, [x{{[0-9]+}}]
    336   ; CHECK-NEXT:    orr	   v[[REG2:[0-9]+]].4s, #0x1, lsl #16
    337   ; CHECK-NEXT:    umov	   w{{[0-9]+}}, v[[REG1]].h[0]
    338   %in = load <8 x i16>, <8 x i16>* @vec_v8i16
    339   %rv = or <8 x i16> %in, <i16 0, i16 1, i16 0, i16 1, i16 0, i16 1, i16 0, i16 1>
    340   %el = extractelement <8 x i16> %rv, i32 0
    341   ret i16 %el
    342 }
    343 
    344 ; CHECK-LABEL: orr_modimm_t4:
    345 define i16 @orr_modimm_t4() nounwind {
    346   ; CHECK:         ld1     { v[[REG1:[0-9]+]].8h }, [x{{[0-9]+}}]
    347   ; CHECK-NEXT:    orr	   v[[REG2:[0-9]+]].4s, #0x1, lsl #24
    348   ; CHECK-NEXT:    umov	   w{{[0-9]+}}, v[[REG1]].h[0]
    349   %in = load <8 x i16>, <8 x i16>* @vec_v8i16
    350   %rv = or <8 x i16> %in, <i16 0, i16 256, i16 0, i16 256, i16 0, i16 256, i16 0, i16 256>
    351   %el = extractelement <8 x i16> %rv, i32 0
    352   ret i16 %el
    353 }
    354 
    355 ; CHECK-LABEL: orr_modimm_t5:
    356 define i16 @orr_modimm_t5() nounwind {
    357   ; CHECK:         ld1     { v[[REG1:[0-9]+]].8h }, [x{{[0-9]+}}]
    358   ; CHECK-NEXT:    orr	   v[[REG2:[0-9]+]].8h, #0x1
    359   ; CHECK-NEXT:    umov	   w{{[0-9]+}}, v[[REG1]].h[0]
    360   %in = load <8 x i16>, <8 x i16>* @vec_v8i16
    361   %rv = or <8 x i16> %in, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
    362   %el = extractelement <8 x i16> %rv, i32 0
    363   ret i16 %el
    364 }
    365 
    366 ; CHECK-LABEL: orr_modimm_t6:
    367 define i16 @orr_modimm_t6() nounwind {
    368   ; CHECK:         ld1     { v[[REG1:[0-9]+]].8h }, [x{{[0-9]+}}]
    369   ; CHECK-NEXT:    orr	   v[[REG2:[0-9]+]].8h, #0x1, lsl #8
    370   ; CHECK-NEXT:    umov	   w{{[0-9]+}}, v[[REG1]].h[0]
    371   %in = load <8 x i16>, <8 x i16>* @vec_v8i16
    372   %rv = or <8 x i16> %in, <i16 256, i16 256, i16 256, i16 256, i16 256, i16 256, i16 256, i16 256>
    373   %el = extractelement <8 x i16> %rv, i32 0
    374   ret i16 %el
    375 }
    376 
    377 declare i8 @f_v8i8(<8 x i8> %arg)
    378 declare i16 @f_v4i16(<4 x i16> %arg)
    379 declare i32 @f_v2i32(<2 x i32> %arg)
    380 declare i64 @f_v1i64(<1 x i64> %arg)
    381 declare i8 @f_v16i8(<16 x i8> %arg)
    382 declare i16 @f_v8i16(<8 x i16> %arg)
    383 declare i32 @f_v4i32(<4 x i32> %arg)
    384 declare i64 @f_v2i64(<2 x i64> %arg)
    385 
    386 ; CHECK-LABEL: modimm_t1_call:
    387 define void @modimm_t1_call() {
    388   ; CHECK:         movi    v[[REG1:[0-9]+]].2s, #0x8
    389   ; CHECK-NEXT:    rev64   v{{[0-9]+}}.8b, v[[REG1]].8b
    390   ; CHECK-NEXT:    bl      f_v8i8
    391   call i8 @f_v8i8(<8 x i8> <i8 8, i8 0, i8 0, i8 0, i8 8, i8 0, i8 0, i8 0>)
    392   ; CHECK:         movi    v[[REG1:[0-9]+]].2s, #0x7
    393   ; CHECK-NEXT:    rev64   v{{[0-9]+}}.4h, v[[REG1]].4h
    394   ; CHECK-NEXT:    bl      f_v4i16
    395   call i16 @f_v4i16(<4 x i16> <i16 7, i16 0, i16 7, i16 0>)
    396   ; CHECK:         movi    v[[REG1:[0-9]+]].2s, #0x6
    397   ; CHECK-NEXT:    rev64   v{{[0-9]+}}.2s, v[[REG1]].2s
    398   ; CHECK-NEXT:    bl      f_v2i32
    399   call i32 @f_v2i32(<2 x i32> <i32 6, i32 6>)
    400   ; CHECK:         movi    v{{[0-9]+}}.2s, #0x5
    401   ; CHECK-NEXT:    bl      f_v1i64
    402   call i64 @f_v1i64(<1 x i64> <i64 21474836485>)
    403   ; CHECK:         movi    v[[REG1:[0-9]+]].4s, #0x5
    404   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].16b, v[[REG1]].16b
    405   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
    406   ; CHECK-NEXT:    bl      f_v16i8
    407   call i8 @f_v16i8(<16 x i8> <i8 5, i8 0, i8 0, i8 0, i8 5, i8 0, i8 0, i8 0, i8 5, i8 0, i8 0, i8 0, i8 5, i8 0, i8 0, i8 0>)
    408   ; CHECK:         movi    v[[REG1:[0-9]+]].4s, #0x4
    409   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].8h, v[[REG1]].8h
    410   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
    411   ; CHECK-NEXT:    bl      f_v8i16
    412   call i16 @f_v8i16(<8 x i16> <i16 4, i16 0, i16 4, i16 0, i16 4, i16 0, i16 4, i16 0>)
    413   ; CHECK:         movi    v[[REG1:[0-9]+]].4s, #0x3
    414   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].4s, v[[REG1]].4s
    415   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
    416   ; CHECK-NEXT:    bl      f_v4i32
    417   call i32 @f_v4i32(<4 x i32> <i32 3, i32 3, i32 3, i32 3>)
    418   ; CHECK:         movi    v[[REG:[0-9]+]].4s, #0x2
    419   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
    420   ; CHECK-NEXT:    bl      f_v2i64
    421   call i64 @f_v2i64(<2 x i64> <i64 8589934594, i64 8589934594>)
    422 
    423   ret void
    424 }
    425 
    426 ; CHECK-LABEL: modimm_t2_call:
    427 define void @modimm_t2_call() {
    428   ; CHECK:         movi    v[[REG1:[0-9]+]].2s, #0x8, lsl #8
    429   ; CHECK-NEXT:    rev64   v{{[0-9]+}}.8b, v[[REG1]].8b
    430   ; CHECK-NEXT:    bl      f_v8i8
    431   call i8 @f_v8i8(<8 x i8> <i8 0, i8 8, i8 0, i8 0, i8 0, i8 8, i8 0, i8 0>)
    432   ; CHECK:         movi    v[[REG1:[0-9]+]].2s, #0x7, lsl #8
    433   ; CHECK-NEXT:    rev64   v{{[0-9]+}}.4h, v[[REG1]].4h
    434   ; CHECK-NEXT:    bl      f_v4i16
    435   call i16 @f_v4i16(<4 x i16> <i16 1792, i16 0, i16 1792, i16 0>)
    436   ; CHECK:         movi    v[[REG1:[0-9]+]].2s, #0x6, lsl #8
    437   ; CHECK-NEXT:    rev64   v{{[0-9]+}}.2s, v[[REG1]].2s
    438   ; CHECK-NEXT:    bl      f_v2i32
    439   call i32 @f_v2i32(<2 x i32> <i32 1536, i32 1536>)
    440   ; CHECK:         movi    v{{[0-9]+}}.2s, #0x5, lsl #8
    441   ; CHECK-NEXT:    bl      f_v1i64
    442   call i64 @f_v1i64(<1 x i64> <i64 5497558140160>)
    443   ; CHECK:         movi    v[[REG1:[0-9]+]].4s, #0x5, lsl #8
    444   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].16b, v[[REG1]].16b
    445   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
    446   ; CHECK-NEXT:    bl      f_v16i8
    447   call i8 @f_v16i8(<16 x i8> <i8 0, i8 5, i8 0, i8 0, i8 0, i8 5, i8 0, i8 0, i8 0, i8 5, i8 0, i8 0, i8 0, i8 5, i8 0, i8 0>)
    448   ; CHECK:         movi    v[[REG1:[0-9]+]].4s, #0x4, lsl #8
    449   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].8h, v[[REG1]].8h
    450   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
    451   ; CHECK-NEXT:    bl      f_v8i16
    452   call i16 @f_v8i16(<8 x i16> <i16 1024, i16 0, i16 1024, i16 0, i16 1024, i16 0, i16 1024, i16 0>)
    453   ; CHECK:         movi    v[[REG1:[0-9]+]].4s, #0x3, lsl #8
    454   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].4s, v[[REG1]].4s
    455   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
    456   ; CHECK-NEXT:    bl      f_v4i32
    457   call i32 @f_v4i32(<4 x i32> <i32 768, i32 768, i32 768, i32 768>)
    458   ; CHECK:         movi    v[[REG:[0-9]+]].4s, #0x2, lsl #8
    459   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
    460   ; CHECK-NEXT:    bl      f_v2i64
    461   call i64 @f_v2i64(<2 x i64> <i64 2199023256064, i64 2199023256064>)
    462 
    463   ret void
    464 }
    465 
    466 ; CHECK-LABEL: modimm_t3_call:
    467 define void @modimm_t3_call() {
    468   ; CHECK:         movi    v[[REG1:[0-9]+]].2s, #0x8, lsl #16
    469   ; CHECK-NEXT:    rev64   v{{[0-9]+}}.8b, v[[REG1]].8b
    470   ; CHECK-NEXT:    bl      f_v8i8
    471   call i8 @f_v8i8(<8 x i8> <i8 0, i8 0, i8 8, i8 0, i8 0, i8 0, i8 8, i8 0>)
    472   ; CHECK:         movi    v[[REG1:[0-9]+]].2s, #0x7, lsl #16
    473   ; CHECK-NEXT:    rev64   v{{[0-9]+}}.4h, v[[REG1]].4h
    474   ; CHECK-NEXT:    bl      f_v4i16
    475   call i16 @f_v4i16(<4 x i16> <i16 0, i16 7, i16 0, i16 7>)
    476   ; CHECK:         movi    v[[REG1:[0-9]+]].2s, #0x6, lsl #16
    477   ; CHECK-NEXT:    rev64   v{{[0-9]+}}.2s, v[[REG1]].2s
    478   ; CHECK-NEXT:    bl      f_v2i32
    479   call i32 @f_v2i32(<2 x i32> <i32 393216, i32 393216>)
    480   ; CHECK:         movi    v{{[0-9]+}}.2s, #0x5, lsl #16
    481   ; CHECK-NEXT:    bl      f_v1i64
    482   call i64 @f_v1i64(<1 x i64> <i64 1407374883880960>)
    483   ; CHECK:         movi    v[[REG1:[0-9]+]].4s, #0x5, lsl #16
    484   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].16b, v[[REG1]].16b
    485   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
    486   ; CHECK-NEXT:    bl      f_v16i8
    487   call i8 @f_v16i8(<16 x i8> <i8 0, i8 0, i8 5, i8 0, i8 0, i8 0, i8 5, i8 0, i8 0, i8 0, i8 5, i8 0, i8 0, i8 0, i8 5, i8 0>)
    488   ; CHECK:         movi    v[[REG1:[0-9]+]].4s, #0x4, lsl #16
    489   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].8h, v[[REG1]].8h
    490   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
    491   ; CHECK-NEXT:    bl      f_v8i16
    492   call i16 @f_v8i16(<8 x i16> <i16 0, i16 4, i16 0, i16 4, i16 0, i16 4, i16 0, i16 4>)
    493   ; CHECK:         movi    v[[REG1:[0-9]+]].4s, #0x3, lsl #16
    494   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].4s, v[[REG1]].4s
    495   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
    496   ; CHECK-NEXT:    bl      f_v4i32
    497   call i32 @f_v4i32(<4 x i32> <i32 196608, i32 196608, i32 196608, i32 196608>)
    498   ; CHECK:         movi    v[[REG:[0-9]+]].4s, #0x2, lsl #16
    499   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
    500   ; CHECK-NEXT:    bl      f_v2i64
    501   call i64 @f_v2i64(<2 x i64> <i64 562949953552384, i64 562949953552384>)
    502 
    503   ret void
    504 }
    505 
    506 ; CHECK-LABEL: modimm_t4_call:
    507 define void @modimm_t4_call() {
    508   ; CHECK:         movi    v[[REG1:[0-9]+]].2s, #0x8, lsl #24
    509   ; CHECK-NEXT:    rev64   v{{[0-9]+}}.8b, v[[REG1]].8b
    510   ; CHECK-NEXT:    bl      f_v8i8
    511   call i8 @f_v8i8(<8 x i8> <i8 0, i8 0, i8 0, i8 8, i8 0, i8 0, i8 0, i8 8>)
    512   ; CHECK:         movi    v[[REG1:[0-9]+]].2s, #0x7, lsl #24
    513   ; CHECK-NEXT:    rev64   v{{[0-9]+}}.4h, v[[REG1]].4h
    514   ; CHECK-NEXT:    bl      f_v4i16
    515   call i16 @f_v4i16(<4 x i16> <i16 0, i16 1792, i16 0, i16 1792>)
    516   ; CHECK:         movi    v[[REG1:[0-9]+]].2s, #0x6, lsl #24
    517   ; CHECK-NEXT:    rev64   v{{[0-9]+}}.2s, v[[REG1]].2s
    518   ; CHECK-NEXT:    bl      f_v2i32
    519   call i32 @f_v2i32(<2 x i32> <i32 100663296, i32 100663296>)
    520   ; CHECK:         movi    v{{[0-9]+}}.2s, #0x5, lsl #24
    521   ; CHECK-NEXT:    bl      f_v1i64
    522   call i64 @f_v1i64(<1 x i64> <i64 360287970273525760>)
    523   ; CHECK:         movi    v[[REG1:[0-9]+]].4s, #0x5, lsl #24
    524   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].16b, v[[REG1]].16b
    525   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
    526   ; CHECK-NEXT:    bl      f_v16i8
    527   call i8 @f_v16i8(<16 x i8> <i8 0, i8 0, i8 0, i8 5, i8 0, i8 0, i8 0, i8 5, i8 0, i8 0, i8 0, i8 5, i8 0, i8 0, i8 0, i8 5>)
    528   ; CHECK:         movi    v[[REG1:[0-9]+]].4s, #0x4, lsl #24
    529   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].8h, v[[REG1]].8h
    530   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
    531   ; CHECK-NEXT:    bl      f_v8i16
    532   call i16 @f_v8i16(<8 x i16> <i16 0, i16 1024, i16 0, i16 1024, i16 0, i16 1024, i16 0, i16 1024>)
    533   ; CHECK:         movi    v[[REG1:[0-9]+]].4s, #0x3, lsl #24
    534   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].4s, v[[REG1]].4s
    535   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
    536   ; CHECK-NEXT:    bl      f_v4i32
    537   call i32 @f_v4i32(<4 x i32> <i32 50331648, i32 50331648, i32 50331648, i32 50331648>)
    538   ; CHECK:         movi    v[[REG:[0-9]+]].4s, #0x2, lsl #24
    539   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
    540   ; CHECK-NEXT:    bl      f_v2i64
    541   call i64 @f_v2i64(<2 x i64> <i64 144115188109410304, i64 144115188109410304>)
    542 
    543   ret void
    544 }
    545 
    546 ; CHECK-LABEL: modimm_t5_call:
    547 define void @modimm_t5_call() {
    548   ; CHECK:         movi    v[[REG1:[0-9]+]].4h, #0x8
    549   ; CHECK-NEXT:    rev64   v{{[0-9]+}}.8b, v[[REG1]].8b
    550   ; CHECK-NEXT:    bl      f_v8i8
    551   call i8 @f_v8i8(<8 x i8> <i8 8, i8 0, i8 8, i8 0, i8 8, i8 0, i8 8, i8 0>)
    552   ; CHECK:         movi    v[[REG1:[0-9]+]].4h, #0x7
    553   ; CHECK-NEXT:    rev64   v{{[0-9]+}}.4h, v[[REG1]].4h
    554   ; CHECK-NEXT:    bl      f_v4i16
    555   call i16 @f_v4i16(<4 x i16> <i16 7, i16 7, i16 7, i16 7>)
    556   ; CHECK:         movi    v[[REG1:[0-9]+]].4h, #0x6
    557   ; CHECK-NEXT:    rev64   v{{[0-9]+}}.2s, v[[REG1]].2s
    558   ; CHECK-NEXT:    bl      f_v2i32
    559   call i32 @f_v2i32(<2 x i32> <i32 393222, i32 393222>)
    560   ; CHECK:         movi    v{{[0-9]+}}.4h, #0x5
    561   ; CHECK-NEXT:    bl      f_v1i64
    562   call i64 @f_v1i64(<1 x i64> <i64 1407396358717445>)
    563   ; CHECK:         movi    v[[REG1:[0-9]+]].8h, #0x5
    564   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].16b, v[[REG1]].16b
    565   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
    566   ; CHECK-NEXT:    bl      f_v16i8
    567   call i8 @f_v16i8(<16 x i8> <i8 5, i8 0, i8 5, i8 0, i8 5, i8 0, i8 5, i8 0, i8 5, i8 0, i8 5, i8 0, i8 5, i8 0, i8 5, i8 0>)
    568   ; CHECK:         movi    v[[REG1:[0-9]+]].8h, #0x4
    569   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].8h, v[[REG1]].8h
    570   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
    571   ; CHECK-NEXT:    bl      f_v8i16
    572   call i16 @f_v8i16(<8 x i16> <i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4>)
    573   ; CHECK:         movi    v[[REG1:[0-9]+]].8h, #0x3
    574   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].4s, v[[REG1]].4s
    575   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
    576   ; CHECK-NEXT:    bl      f_v4i32
    577   call i32 @f_v4i32(<4 x i32> <i32 196611, i32 196611, i32 196611, i32 196611>)
    578   ; CHECK:         movi    v[[REG:[0-9]+]].8h, #0x2
    579   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
    580   ; CHECK-NEXT:    bl      f_v2i64
    581   call i64 @f_v2i64(<2 x i64> <i64 562958543486978, i64 562958543486978>)
    582 
    583   ret void
    584 }
    585 
    586 ; CHECK-LABEL: modimm_t6_call:
    587 define void @modimm_t6_call() {
    588   ; CHECK:         movi    v[[REG1:[0-9]+]].4h, #0x8, lsl #8
    589   ; CHECK-NEXT:    rev64   v{{[0-9]+}}.8b, v[[REG1]].8b
    590   ; CHECK-NEXT:    bl      f_v8i8
    591   call i8 @f_v8i8(<8 x i8> <i8 0, i8 8, i8 0, i8 8, i8 0, i8 8, i8 0, i8 8>)
    592   ; CHECK:         movi    v[[REG1:[0-9]+]].4h, #0x7, lsl #8
    593   ; CHECK-NEXT:    rev64   v{{[0-9]+}}.4h, v[[REG1]].4h
    594   ; CHECK-NEXT:    bl      f_v4i16
    595   call i16 @f_v4i16(<4 x i16> <i16 1792, i16 1792, i16 1792, i16 1792>)
    596   ; CHECK:         movi    v[[REG1:[0-9]+]].4h, #0x6, lsl #8
    597   ; CHECK-NEXT:    rev64   v{{[0-9]+}}.2s, v[[REG1]].2s
    598   ; CHECK-NEXT:    bl      f_v2i32
    599   call i32 @f_v2i32(<2 x i32> <i32 100664832, i32 100664832>)
    600   ; CHECK:         movi    v{{[0-9]+}}.4h, #0x5, lsl #8
    601   ; CHECK-NEXT:    bl      f_v1i64
    602   call i64 @f_v1i64(<1 x i64> <i64 360293467831665920>)
    603   ; CHECK:         movi    v[[REG1:[0-9]+]].8h, #0x5, lsl #8
    604   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].16b, v[[REG1]].16b
    605   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
    606   ; CHECK-NEXT:    bl      f_v16i8
    607   call i8 @f_v16i8(<16 x i8> <i8 0, i8 5, i8 0, i8 5, i8 0, i8 5, i8 0, i8 5, i8 0, i8 5, i8 0, i8 5, i8 0, i8 5, i8 0, i8 5>)
    608   ; CHECK:         movi    v[[REG1:[0-9]+]].8h, #0x4, lsl #8
    609   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].8h, v[[REG1]].8h
    610   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
    611   ; CHECK-NEXT:    bl      f_v8i16
    612   call i16 @f_v8i16(<8 x i16> <i16 1024, i16 1024, i16 1024, i16 1024, i16 1024, i16 1024, i16 1024, i16 1024>)
    613   ; CHECK:         movi    v[[REG1:[0-9]+]].8h, #0x3, lsl #8
    614   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].4s, v[[REG1]].4s
    615   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
    616   ; CHECK-NEXT:    bl      f_v4i32
    617   call i32 @f_v4i32(<4 x i32> <i32 50332416, i32 50332416, i32 50332416, i32 50332416>)
    618   ; CHECK:         movi    v[[REG:[0-9]+]].8h, #0x2, lsl #8
    619   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
    620   ; CHECK-NEXT:    bl      f_v2i64
    621   call i64 @f_v2i64(<2 x i64> <i64 144117387132666368, i64 144117387132666368>)
    622 
    623   ret void
    624 }
    625 
    626 ; CHECK-LABEL: modimm_t7_call:
    627 define void @modimm_t7_call() {
    628   ; CHECK:         movi    v[[REG1:[0-9]+]].2s, #0x8, msl #8
    629   ; CHECK-NEXT:    rev64   v{{[0-9]+}}.8b, v[[REG1]].8b
    630   ; CHECK-NEXT:    bl      f_v8i8
    631   call i8 @f_v8i8(<8 x i8> <i8 255, i8 8, i8 0, i8 0, i8 255, i8 8, i8 0, i8 0>)
    632   ; CHECK:         movi    v[[REG1:[0-9]+]].2s, #0x7, msl #8
    633   ; CHECK-NEXT:    rev64   v{{[0-9]+}}.4h, v[[REG1]].4h
    634   ; CHECK-NEXT:    bl      f_v4i16
    635   call i16 @f_v4i16(<4 x i16> <i16 2047, i16 0, i16 2047, i16 0>)
    636   ; CHECK:         movi    v[[REG1:[0-9]+]].2s, #0x6, msl #8
    637   ; CHECK-NEXT:    rev64   v{{[0-9]+}}.2s, v[[REG1]].2s
    638   ; CHECK-NEXT:    bl      f_v2i32
    639   call i32 @f_v2i32(<2 x i32> <i32 1791, i32 1791>)
    640   ; CHECK:         movi    v{{[0-9]+}}.2s, #0x5, msl #8
    641   ; CHECK-NEXT:    bl      f_v1i64
    642   call i64 @f_v1i64(<1 x i64> <i64 6592774800895>)
    643   ; CHECK:         movi    v[[REG1:[0-9]+]].4s, #0x5, msl #8
    644   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].16b, v[[REG1]].16b
    645   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
    646   ; CHECK-NEXT:    bl      f_v16i8
    647   call i8 @f_v16i8(<16 x i8> <i8 255, i8 5, i8 0, i8 0, i8 255, i8 5, i8 0, i8 0, i8 255, i8 5, i8 0, i8 0, i8 255, i8 5, i8 0, i8 0>)
    648   ; CHECK:         movi    v[[REG1:[0-9]+]].4s, #0x4, msl #8
    649   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].8h, v[[REG1]].8h
    650   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
    651   ; CHECK-NEXT:    bl      f_v8i16
    652   call i16 @f_v8i16(<8 x i16> <i16 1279, i16 0, i16 1279, i16 0, i16 1279, i16 0, i16 1279, i16 0>)
    653   ; CHECK:         movi    v[[REG1:[0-9]+]].4s, #0x3, msl #8
    654   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].4s, v[[REG1]].4s
    655   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
    656   ; CHECK-NEXT:    bl      f_v4i32
    657   call i32 @f_v4i32(<4 x i32> <i32 1023, i32 1023, i32 1023, i32 1023>)
    658   ; CHECK:         movi    v[[REG:[0-9]+]].4s, #0x2, msl #8
    659   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
    660   ; CHECK-NEXT:    bl      f_v2i64
    661   call i64 @f_v2i64(<2 x i64> <i64 3294239916799, i64 3294239916799>)
    662 
    663   ret void
    664 }
    665 
    666 ; CHECK-LABEL: modimm_t8_call:
    667 define void @modimm_t8_call() {
    668   ; CHECK:         movi    v[[REG1:[0-9]+]].2s, #0x8, msl #16
    669   ; CHECK-NEXT:    rev64   v{{[0-9]+}}.8b, v[[REG1]].8b
    670   ; CHECK-NEXT:    bl      f_v8i8
    671   call i8 @f_v8i8(<8 x i8> <i8 255, i8 255, i8 8, i8 0, i8 255, i8 255, i8 8, i8 0>)
    672   ; CHECK:         movi    v[[REG1:[0-9]+]].2s, #0x7, msl #16
    673   ; CHECK-NEXT:    rev64   v{{[0-9]+}}.4h, v[[REG1]].4h
    674   ; CHECK-NEXT:    bl      f_v4i16
    675   call i16 @f_v4i16(<4 x i16> <i16 65535, i16 7, i16 65535, i16 7>)
    676   ; CHECK:         movi    v[[REG1:[0-9]+]].2s, #0x6, msl #16
    677   ; CHECK-NEXT:    rev64   v{{[0-9]+}}.2s, v[[REG1]].2s
    678   ; CHECK-NEXT:    bl      f_v2i32
    679   call i32 @f_v2i32(<2 x i32> <i32 458751, i32 458751>)
    680   ; CHECK:         movi    v{{[0-9]+}}.2s, #0x5, msl #16
    681   ; CHECK-NEXT:    bl      f_v1i64
    682   call i64 @f_v1i64(<1 x i64> <i64 1688845565689855>)
    683   ; CHECK:         movi    v[[REG1:[0-9]+]].4s, #0x5, msl #16
    684   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].16b, v[[REG1]].16b
    685   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
    686   ; CHECK-NEXT:    bl      f_v16i8
    687   call i8 @f_v16i8(<16 x i8> <i8 255, i8 255, i8 5, i8 0, i8 255, i8 255, i8 5, i8 0, i8 255, i8 255, i8 5, i8 0, i8 255, i8 255, i8 5, i8 0>)
    688   ; CHECK:         movi    v[[REG1:[0-9]+]].4s, #0x4, msl #16
    689   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].8h, v[[REG1]].8h
    690   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
    691   ; CHECK-NEXT:    bl      f_v8i16
    692   call i16 @f_v8i16(<8 x i16> <i16 65535, i16 4, i16 65535, i16 4, i16 65535, i16 4, i16 65535, i16 4>)
    693   ; CHECK:         movi    v[[REG1:[0-9]+]].4s, #0x3, msl #16
    694   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].4s, v[[REG1]].4s
    695   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
    696   ; CHECK-NEXT:    bl      f_v4i32
    697   call i32 @f_v4i32(<4 x i32> <i32 262143, i32 262143, i32 262143, i32 262143>)
    698   ; CHECK:         movi    v[[REG:[0-9]+]].4s, #0x2, msl #16
    699   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
    700   ; CHECK-NEXT:    bl      f_v2i64
    701   call i64 @f_v2i64(<2 x i64> <i64 844420635361279, i64 844420635361279>)
    702 
    703   ret void
    704 }
    705 
    706 ; CHECK-LABEL: modimm_t9_call:
    707 define void @modimm_t9_call() {
    708   ; CHECK:         movi    v[[REG1:[0-9]+]].8b, #0x8
    709   ; CHECK-NEXT:    rev64   v{{[0-9]+}}.8b, v[[REG1]].8b
    710   ; CHECK-NEXT:    bl      f_v8i8
    711   call i8 @f_v8i8(<8 x i8> <i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8>)
    712   ; CHECK:         movi    v[[REG1:[0-9]+]].8b, #0x7
    713   ; CHECK-NEXT:    rev64   v{{[0-9]+}}.4h, v[[REG1]].4h
    714   ; CHECK-NEXT:    bl      f_v4i16
    715   call i16 @f_v4i16(<4 x i16> <i16 1799, i16 1799, i16 1799, i16 1799>)
    716   ; CHECK:         movi    v[[REG1:[0-9]+]].8b, #0x6
    717   ; CHECK-NEXT:    rev64   v{{[0-9]+}}.2s, v[[REG1]].2s
    718   ; CHECK-NEXT:    bl      f_v2i32
    719   call i32 @f_v2i32(<2 x i32> <i32 101058054, i32 101058054>)
    720   ; CHECK:         movi    v[[REG1:[0-9]+]].16b, #0x5
    721   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].16b, v[[REG1]].16b
    722   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
    723   ; CHECK-NEXT:    bl      f_v16i8
    724   call i8 @f_v16i8(<16 x i8> <i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5>)
    725   ; CHECK:         movi    v[[REG1:[0-9]+]].16b, #0x4
    726   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].8h, v[[REG1]].8h
    727   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
    728   ; CHECK-NEXT:    bl      f_v8i16
    729   call i16 @f_v8i16(<8 x i16> <i16 1028, i16 1028, i16 1028, i16 1028, i16 1028, i16 1028, i16 1028, i16 1028>)
    730   ; CHECK:         movi    v[[REG1:[0-9]+]].16b, #0x3
    731   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].4s, v[[REG1]].4s
    732   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
    733   ; CHECK-NEXT:    bl      f_v4i32
    734   call i32 @f_v4i32(<4 x i32> <i32 50529027, i32 50529027, i32 50529027, i32 50529027>)
    735 
    736   ret void
    737 }
    738 
    739 ; CHECK-LABEL: modimm_t10_call:
    740 define void @modimm_t10_call() {
    741   ; CHECK:         movi    d[[REG1:[0-9]+]], #0x0000ff000000ff
    742   ; CHECK-NEXT:    rev64   v{{[0-9]+}}.8b, v[[REG1]].8b
    743   ; CHECK-NEXT:    bl      f_v8i8
    744   call i8 @f_v8i8(<8 x i8> <i8 -1, i8 0, i8 0, i8 0, i8 -1, i8 0, i8 0, i8 0>)
    745   ; CHECK:         movi    d[[REG1:[0-9]+]], #0x00ffff0000ffff
    746   ; CHECK-NEXT:    rev64   v{{[0-9]+}}.4h, v[[REG1]].4h
    747   ; CHECK-NEXT:    bl      f_v4i16
    748   call i16 @f_v4i16(<4 x i16> <i16 -1, i16 0, i16 -1, i16 0>)
    749   ; CHECK:         movi    d[[REG1:[0-9]+]], #0xffffffffffffffff
    750   ; CHECK-NEXT:    rev64   v{{[0-9]+}}.2s, v[[REG1]].2s
    751   ; CHECK-NEXT:    bl      f_v2i32
    752   call i32 @f_v2i32(<2 x i32> <i32 -1, i32 -1>)
    753   ; CHECK:         movi    v[[REG1:[0-9]+]].2d, #0xffffff00ffffff
    754   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].16b, v[[REG1]].16b
    755   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
    756   ; CHECK-NEXT:    bl      f_v16i8
    757   call i8 @f_v16i8(<16 x i8> <i8 -1, i8 -1, i8 -1, i8 0, i8 -1, i8 -1, i8 -1, i8 0, i8 -1, i8 -1, i8 -1, i8 0, i8 -1, i8 -1, i8 -1, i8 0>)
    758   ; CHECK:         movi    v[[REG1:[0-9]+]].2d, #0xffffffffffff0000
    759   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].8h, v[[REG1]].8h
    760   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
    761   ; CHECK-NEXT:    bl      f_v8i16
    762   call i16 @f_v8i16(<8 x i16> <i16 0, i16 -1, i16 -1, i16 -1, i16 0, i16 -1, i16 -1, i16 -1>)
    763   ; CHECK:         movi    v[[REG1:[0-9]+]].2d, #0xffffffff00000000
    764   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].4s, v[[REG1]].4s
    765   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
    766   ; CHECK-NEXT:    bl      f_v4i32
    767   call i32 @f_v4i32(<4 x i32> <i32 0, i32 -1, i32 0, i32 -1>)
    768 
    769   ret void
    770 }
    771 
    772 ; CHECK-LABEL: modimm_t11_call:
    773 define void @modimm_t11_call() {
    774   ; CHECK:         fmov    v[[REG1:[0-9]+]].2s, #4.00000000
    775   ; CHECK-NEXT:    rev64   v{{[0-9]+}}.8b, v[[REG1]].8b
    776   ; CHECK-NEXT:    bl      f_v8i8
    777   call i8 @f_v8i8(<8 x i8> <i8 0, i8 0, i8 128, i8 64, i8 0, i8 0, i8 128, i8 64>)
    778   ; CHECK:         fmov    v[[REG1:[0-9]+]].2s, #3.75000000
    779   ; CHECK-NEXT:    rev64   v{{[0-9]+}}.4h, v[[REG1]].4h
    780   ; CHECK-NEXT:    bl      f_v4i16
    781   call i16 @f_v4i16(<4 x i16> <i16 0, i16 16496, i16 0, i16 16496>)
    782   ; CHECK:         fmov    v[[REG1:[0-9]+]].2s, #3.50000000
    783   ; CHECK-NEXT:    rev64   v{{[0-9]+}}.2s, v[[REG1]].2s
    784   ; CHECK-NEXT:    bl      f_v2i32
    785   call i32 @f_v2i32(<2 x i32> <i32 1080033280, i32 1080033280>)
    786   ; CHECK:         fmov    v{{[0-9]+}}.2s, #0.39062500
    787   ; CHECK-NEXT:    bl      f_v1i64
    788   call i64 @f_v1i64(<1 x i64> <i64 4523865826746957824>)
    789   ; CHECK:         fmov    v[[REG1:[0-9]+]].4s, #3.25000000
    790   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].16b, v[[REG1]].16b
    791   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
    792   ; CHECK-NEXT:    bl      f_v16i8
    793   call i8 @f_v16i8(<16 x i8> <i8 0, i8 0, i8 80, i8 64, i8 0, i8 0, i8 80, i8 64, i8 0, i8 0, i8 80, i8 64, i8 0, i8 0, i8 80, i8 64>)
    794   ; CHECK:         fmov    v[[REG1:[0-9]+]].4s, #3.00000000
    795   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].8h, v[[REG1]].8h
    796   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
    797   ; CHECK-NEXT:    bl      f_v8i16
    798   call i16 @f_v8i16(<8 x i16> <i16 0, i16 16448, i16 0, i16 16448, i16 0, i16 16448, i16 0, i16 16448>)
    799   ; CHECK:         fmov    v[[REG1:[0-9]+]].4s, #2.75000000
    800   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].4s, v[[REG1]].4s
    801   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
    802   ; CHECK-NEXT:    bl      f_v4i32
    803   call i32 @f_v4i32(<4 x i32> <i32 1076887552, i32 1076887552, i32 1076887552, i32 1076887552>)
    804   ; CHECK:         fmov    v[[REG:[0-9]+]].4s, #2.5000000
    805   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
    806   ; CHECK-NEXT:    bl      f_v2i64
    807   call i64 @f_v2i64(<2 x i64> <i64 4620693218757967872, i64 4620693218757967872>)
    808 
    809   ret void
    810 }
    811 
    812 ; CHECK-LABEL: modimm_t12_call:
    813 define void @modimm_t12_call() {
    814   ; CHECK:         fmov    v[[REG1:[0-9]+]].2d, #0.18750000
    815   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].16b, v[[REG1]].16b
    816   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
    817   ; CHECK-NEXT:    bl      f_v16i8
    818   call i8 @f_v16i8(<16 x i8> <i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 200, i8 63, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 200, i8 63>)
    819   ; CHECK:         fmov    v[[REG1:[0-9]+]].2d, #0.17968750
    820   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].8h, v[[REG1]].8h
    821   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
    822   ; CHECK-NEXT:    bl      f_v8i16
    823   call i16 @f_v8i16(<8 x i16> <i16 0, i16 0, i16 0, i16 16327, i16 0, i16 0, i16 0, i16 16327>)
    824   ; CHECK:         fmov    v[[REG1:[0-9]+]].2d, #0.17187500
    825   ; CHECK-NEXT:    rev64   v[[REG2:[0-9]+]].4s, v[[REG1]].4s
    826   ; CHECK-NEXT:    ext     v[[REG2]].16b, v[[REG2]].16b, v[[REG2]].16b, #8
    827   ; CHECK-NEXT:    bl      f_v4i32
    828   call i32 @f_v4i32(<4 x i32> <i32 0, i32 1069940736, i32 0, i32 1069940736>)
    829 
    830   ret void
    831 }
    832