Home | History | Annotate | Download | only in SVE
      1 // RUN: not llvm-mc -triple=aarch64 -show-encoding -mattr=+sve  2>&1 < %s| FileCheck %s
      2 
      3 // --------------------------------------------------------------------------//
      4 // Immediate out of upper bound [-8, 7].
      5 
      6 st1h z29.h, p5, [x7, #-9, MUL VL]
      7 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: index must be an integer in range [-8, 7].
      8 // CHECK-NEXT: st1h z29.h, p5, [x7, #-9, MUL VL]
      9 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
     10 
     11 st1h z29.h, p5, [x4, #8, MUL VL]
     12 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: index must be an integer in range [-8, 7].
     13 // CHECK-NEXT: st1h z29.h, p5, [x4, #8, MUL VL]
     14 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
     15 
     16 st1h z21.s, p2, [x1, #-9, MUL VL]
     17 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: index must be an integer in range [-8, 7].
     18 // CHECK-NEXT: st1h z21.s, p2, [x1, #-9, MUL VL]
     19 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
     20 
     21 st1h z17.s, p5, [x1, #8, MUL VL]
     22 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: index must be an integer in range [-8, 7].
     23 // CHECK-NEXT: st1h z17.s, p5, [x1, #8, MUL VL]
     24 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
     25 
     26 st1h z0.d, p1, [x14, #-9, MUL VL]
     27 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: index must be an integer in range [-8, 7].
     28 // CHECK-NEXT: st1h z0.d, p1, [x14, #-9, MUL VL]
     29 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
     30 
     31 st1h z24.d, p3, [x16, #8, MUL VL]
     32 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: index must be an integer in range [-8, 7].
     33 // CHECK-NEXT: st1h z24.d, p3, [x16, #8, MUL VL]
     34 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
     35 
     36 // --------------------------------------------------------------------------//
     37 // Restricted predicate has range [0, 7].
     38 
     39 st1h z15.h, p8, [x0, #8, MUL VL]
     40 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: restricted predicate has range [0, 7].
     41 // CHECK-NEXT: st1h z15.h, p8, [x0, #8, MUL VL]
     42 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
     43 
     44 st1h z17.s, p8, [x20, #2, MUL VL]
     45 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: restricted predicate has range [0, 7].
     46 // CHECK-NEXT: st1h z17.s, p8, [x20, #2, MUL VL]
     47 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
     48 
     49 st1h z15.d, p8, [x0, #8, MUL VL]
     50 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: restricted predicate has range [0, 7].
     51 // CHECK-NEXT: st1h z15.d, p8, [x0, #8, MUL VL]
     52 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
     53 
     54 // --------------------------------------------------------------------------//
     55 // Invalid vector list
     56 
     57 st1h { }, p0, [x0]
     58 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: vector register expected
     59 // CHECK-NEXT: st1h { }, p0, [x0]
     60 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
     61 
     62 st1h { z1.h, z2.h }, p0, [x0]
     63 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand
     64 // CHECK-NEXT: st1h { z1.h, z2.h }, p0, [x0]
     65 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
     66 
     67 st1h { v0.8h }, p0, [x0]
     68 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand
     69 // CHECK-NEXT: st1h { v0.8h }, p0, [x0]
     70 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
     71 
     72 
     73 // --------------------------------------------------------------------------//
     74 // Invalid scalar + scalar addressing modes
     75 
     76 st1h z0.h, p0, [x0, x0]
     77 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: register must be x0..x30 with required shift 'lsl #1'
     78 // CHECK-NEXT: st1h z0.h, p0, [x0, x0]
     79 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
     80 
     81 st1h z0.h, p0, [x0, xzr]
     82 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: register must be x0..x30 with required shift 'lsl #1'
     83 // CHECK-NEXT: st1h z0.h, p0, [x0, xzr]
     84 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
     85 
     86 st1h z0.h, p0, [x0, x0, lsl #2]
     87 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: register must be x0..x30 with required shift 'lsl #1'
     88 // CHECK-NEXT: st1h z0.h, p0, [x0, x0, lsl #2]
     89 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
     90 
     91 st1h z0.h, p0, [x0, w0]
     92 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: register must be x0..x30 with required shift 'lsl #1'
     93 // CHECK-NEXT: st1h z0.h, p0, [x0, w0]
     94 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
     95 
     96 st1h z0.h, p0, [x0, w0, uxtw]
     97 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: register must be x0..x30 with required shift 'lsl #1'
     98 // CHECK-NEXT: st1h z0.h, p0, [x0, w0, uxtw]
     99 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
    100 
    101 
    102 // --------------------------------------------------------------------------//
    103 // Invalid scalar + vector addressing modes
    104 
    105 st1h z0.d, p0, [x0, z0.h]
    106 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand
    107 // CHECK-NEXT: st1h z0.d, p0, [x0, z0.h]
    108 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
    109 
    110 st1h z0.d, p0, [x0, z0.s]
    111 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand
    112 // CHECK-NEXT: st1h z0.d, p0, [x0, z0.s]
    113 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
    114 
    115 st1h z0.s, p0, [x0, z0.s]
    116 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid shift/extend specified, expected 'z[0..31].s, (uxtw|sxtw)'
    117 // CHECK-NEXT: st1h z0.s, p0, [x0, z0.s]
    118 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
    119 
    120 st1h z0.s, p0, [x0, z0.s, uxtw #2]
    121 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid shift/extend specified, expected 'z[0..31].s, (uxtw|sxtw) #1'
    122 // CHECK-NEXT: st1h z0.s, p0, [x0, z0.s, uxtw #2]
    123 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
    124 
    125 st1h z0.s, p0, [x0, z0.s, lsl #1]
    126 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid shift/extend specified, expected 'z[0..31].s, (uxtw|sxtw) #1'
    127 // CHECK-NEXT: st1h z0.s, p0, [x0, z0.s, lsl #1]
    128 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
    129 
    130 st1h z0.d, p0, [x0, z0.d, lsl #2]
    131 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid shift/extend specified, expected 'z[0..31].d, (lsl|uxtw|sxtw) #1'
    132 // CHECK-NEXT: st1h z0.d, p0, [x0, z0.d, lsl #2]
    133 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
    134 
    135 st1h z0.d, p0, [x0, z0.d, sxtw #2]
    136 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid shift/extend specified, expected 'z[0..31].d, (lsl|uxtw|sxtw) #1'
    137 // CHECK-NEXT: st1h z0.d, p0, [x0, z0.d, sxtw #2]
    138 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
    139 
    140 // --------------------------------------------------------------------------//
    141 // Invalid vector + immediate addressing modes
    142 
    143 st1h z0.s, p0, [z0.s, #-1]
    144 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: index must be a multiple of 2 in range [0, 62].
    145 // CHECK-NEXT: st1h z0.s, p0, [z0.s, #-1]
    146 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
    147 
    148 st1h z0.s, p0, [z0.s, #-2]
    149 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: index must be a multiple of 2 in range [0, 62].
    150 // CHECK-NEXT: st1h z0.s, p0, [z0.s, #-2]
    151 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
    152 
    153 st1h z0.s, p0, [z0.s, #63]
    154 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: index must be a multiple of 2 in range [0, 62].
    155 // CHECK-NEXT: st1h z0.s, p0, [z0.s, #63]
    156 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
    157 
    158 st1h z0.s, p0, [z0.s, #64]
    159 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: index must be a multiple of 2 in range [0, 62].
    160 // CHECK-NEXT: st1h z0.s, p0, [z0.s, #64]
    161 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
    162 
    163 st1h z0.s, p0, [z0.s, #3]
    164 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: index must be a multiple of 2 in range [0, 62].
    165 // CHECK-NEXT: st1h z0.s, p0, [z0.s, #3]
    166 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
    167 
    168 st1h z0.d, p0, [z0.d, #-1]
    169 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: index must be a multiple of 2 in range [0, 62].
    170 // CHECK-NEXT: st1h z0.d, p0, [z0.d, #-1]
    171 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
    172 
    173 st1h z0.d, p0, [z0.d, #-2]
    174 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: index must be a multiple of 2 in range [0, 62].
    175 // CHECK-NEXT: st1h z0.d, p0, [z0.d, #-2]
    176 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
    177 
    178 st1h z0.d, p0, [z0.d, #63]
    179 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: index must be a multiple of 2 in range [0, 62].
    180 // CHECK-NEXT: st1h z0.d, p0, [z0.d, #63]
    181 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
    182 
    183 st1h z0.d, p0, [z0.d, #64]
    184 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: index must be a multiple of 2 in range [0, 62].
    185 // CHECK-NEXT: st1h z0.d, p0, [z0.d, #64]
    186 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
    187 
    188 st1h z0.d, p0, [z0.d, #3]
    189 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: index must be a multiple of 2 in range [0, 62].
    190 // CHECK-NEXT: st1h z0.d, p0, [z0.d, #3]
    191 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
    192 
    193 
    194 // --------------------------------------------------------------------------//
    195 // Negative tests for instructions that are incompatible with movprfx
    196 
    197 movprfx z31.d, p7/z, z6.d
    198 st1h    { z31.d }, p7, [z31.d, #62]
    199 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx, suggest replacing movprfx with mov
    200 // CHECK-NEXT: st1h    { z31.d }, p7, [z31.d, #62]
    201 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
    202 
    203 movprfx z31, z6
    204 st1h    { z31.d }, p7, [z31.d, #62]
    205 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx, suggest replacing movprfx with mov
    206 // CHECK-NEXT: st1h    { z31.d }, p7, [z31.d, #62]
    207 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
    208