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 // Invalid operand (.h)
      5 
      6 ldff1sh z9.h, p7/z, [x0]
      7 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width
      8 // CHECK-NEXT: ldff1sh z9.h, p7/z, [x0]
      9 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
     10 
     11 // --------------------------------------------------------------------------//
     12 // restricted predicate has range [0, 7].
     13 
     14 ldff1sh z12.s, p8/z, [x0]
     15 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: restricted predicate has range [0, 7].
     16 // CHECK-NEXT: ldff1sh z12.s, p8/z, [x0]
     17 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
     18 
     19 ldff1sh z4.d, p8/z, [x0]
     20 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: restricted predicate has range [0, 7].
     21 // CHECK-NEXT: ldff1sh z4.d, p8/z, [x0]
     22 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
     23 
     24 // --------------------------------------------------------------------------//
     25 // Invalid scalar + scalar addressing modes
     26 
     27 ldff1sh z0.s, p0/z, [x0, sp]
     28 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: register must be x0..x30 or xzr, with required shift 'lsl #1'
     29 // CHECK-NEXT: ldff1sh z0.s, p0/z, [x0, sp]
     30 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
     31 
     32 ldff1sh z0.s, p0/z, [x0, x0, lsl #2]
     33 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: register must be x0..x30 or xzr, with required shift 'lsl #1'
     34 // CHECK-NEXT: ldff1sh z0.s, p0/z, [x0, x0, lsl #2]
     35 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
     36 
     37 ldff1sh z0.s, p0/z, [x0, w0]
     38 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: register must be x0..x30 or xzr, with required shift 'lsl #1'
     39 // CHECK-NEXT: ldff1sh z0.s, p0/z, [x0, w0]
     40 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
     41 
     42 ldff1sh z0.s, p0/z, [x0, w0, uxtw]
     43 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: register must be x0..x30 or xzr, with required shift 'lsl #1'
     44 // CHECK-NEXT: ldff1sh z0.s, p0/z, [x0, w0, uxtw]
     45 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
     46 
     47 // --------------------------------------------------------------------------//
     48 // Invalid scalar + vector addressing modes
     49 
     50 ldff1sh z0.d, p0/z, [x0, z0.h]
     51 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand
     52 // CHECK-NEXT: ldff1sh z0.d, p0/z, [x0, z0.h]
     53 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
     54 
     55 ldff1sh z0.d, p0/z, [x0, z0.s]
     56 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand
     57 // CHECK-NEXT: ldff1sh z0.d, p0/z, [x0, z0.s]
     58 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
     59 
     60 ldff1sh z0.s, p0/z, [x0, z0.s]
     61 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid shift/extend specified, expected 'z[0..31].s, (uxtw|sxtw)'
     62 // CHECK-NEXT: ldff1sh z0.s, p0/z, [x0, z0.s]
     63 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
     64 
     65 ldff1sh z0.s, p0/z, [x0, z0.s, uxtw #2]
     66 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid shift/extend specified, expected 'z[0..31].s, (uxtw|sxtw) #1'
     67 // CHECK-NEXT: ldff1sh z0.s, p0/z, [x0, z0.s, uxtw #2]
     68 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
     69 
     70 ldff1sh z0.s, p0/z, [x0, z0.s, lsl #1]
     71 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid shift/extend specified, expected 'z[0..31].s, (uxtw|sxtw) #1'
     72 // CHECK-NEXT: ldff1sh z0.s, p0/z, [x0, z0.s, lsl #1]
     73 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
     74 
     75 ldff1sh z0.d, p0/z, [x0, z0.d, lsl #2]
     76 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid shift/extend specified, expected 'z[0..31].d, (lsl|uxtw|sxtw) #1'
     77 // CHECK-NEXT: ldff1sh z0.d, p0/z, [x0, z0.d, lsl #2]
     78 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
     79 
     80 ldff1sh z0.d, p0/z, [x0, z0.d, sxtw #2]
     81 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid shift/extend specified, expected 'z[0..31].d, (lsl|uxtw|sxtw) #1'
     82 // CHECK-NEXT: ldff1sh z0.d, p0/z, [x0, z0.d, sxtw #2]
     83 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
     84 
     85 
     86 // --------------------------------------------------------------------------//
     87 // Invalid vector + immediate addressing modes
     88 
     89 ldff1sh z0.s, p0/z, [z0.s, #-2]
     90 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: index must be a multiple of 2 in range [0, 62].
     91 // CHECK-NEXT: ldff1sh z0.s, p0/z, [z0.s, #-2]
     92 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
     93 
     94 ldff1sh z0.s, p0/z, [z0.s, #-1]
     95 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: index must be a multiple of 2 in range [0, 62].
     96 // CHECK-NEXT: ldff1sh z0.s, p0/z, [z0.s, #-1]
     97 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
     98 
     99 ldff1sh z0.s, p0/z, [z0.s, #63]
    100 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: index must be a multiple of 2 in range [0, 62].
    101 // CHECK-NEXT: ldff1sh z0.s, p0/z, [z0.s, #63]
    102 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
    103 
    104 ldff1sh z0.s, p0/z, [z0.s, #64]
    105 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: index must be a multiple of 2 in range [0, 62].
    106 // CHECK-NEXT: ldff1sh z0.s, p0/z, [z0.s, #64]
    107 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
    108 
    109 ldff1sh z0.s, p0/z, [z0.s, #3]
    110 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: index must be a multiple of 2 in range [0, 62].
    111 // CHECK-NEXT: ldff1sh z0.s, p0/z, [z0.s, #3]
    112 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
    113 
    114 ldff1sh z0.d, p0/z, [z0.d, #-2]
    115 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: index must be a multiple of 2 in range [0, 62].
    116 // CHECK-NEXT: ldff1sh z0.d, p0/z, [z0.d, #-2]
    117 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
    118 
    119 ldff1sh z0.d, p0/z, [z0.d, #-1]
    120 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: index must be a multiple of 2 in range [0, 62].
    121 // CHECK-NEXT: ldff1sh z0.d, p0/z, [z0.d, #-1]
    122 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
    123 
    124 ldff1sh z0.d, p0/z, [z0.d, #63]
    125 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: index must be a multiple of 2 in range [0, 62].
    126 // CHECK-NEXT: ldff1sh z0.d, p0/z, [z0.d, #63]
    127 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
    128 
    129 ldff1sh z0.d, p0/z, [z0.d, #64]
    130 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: index must be a multiple of 2 in range [0, 62].
    131 // CHECK-NEXT: ldff1sh z0.d, p0/z, [z0.d, #64]
    132 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
    133 
    134 ldff1sh z0.d, p0/z, [z0.d, #3]
    135 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: index must be a multiple of 2 in range [0, 62].
    136 // CHECK-NEXT: ldff1sh z0.d, p0/z, [z0.d, #3]
    137 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
    138 
    139 
    140 // --------------------------------------------------------------------------//
    141 // Negative tests for instructions that are incompatible with movprfx
    142 
    143 movprfx z0.d, p0/z, z7.d
    144 ldff1sh { z0.d }, p0/z, [z0.d]
    145 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx, suggest replacing movprfx with mov
    146 // CHECK-NEXT: ldff1sh { z0.d }, p0/z, [z0.d]
    147 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
    148 
    149 movprfx z0, z7
    150 ldff1sh { z0.d }, p0/z, [z0.d]
    151 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx, suggest replacing movprfx with mov
    152 // CHECK-NEXT: ldff1sh { z0.d }, p0/z, [z0.d]
    153 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
    154