Home | History | Annotate | Download | only in SVE
      1 // RUN: not llvm-mc -triple=aarch64-none-linux-gnu -show-encoding -mattr=+sve  2>&1 < %s | FileCheck %s
      2 
      3 // ------------------------------------------------------------------------- //
      4 // Different destination register (unary)
      5 
      6 movprfx z0, z1
      7 abs z2.d, p0/m, z2.d
      8 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx writing to a different destination
      9 // CHECK-NEXT: abs z2.d, p0/m, z2.d
     10 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
     11 
     12 
     13 // ------------------------------------------------------------------------- //
     14 // Different destination register (binary)
     15 
     16 movprfx z0, z1
     17 add z2.d, p0/m, z2.d, z0.d
     18 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx writing to a different destination
     19 // CHECK-NEXT: add z2.d, p0/m, z2.d, z0.d
     20 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
     21 
     22 
     23 // ------------------------------------------------------------------------- //
     24 // Different destination register (wide element)
     25 
     26 movprfx z0, z1
     27 asr z2.s, p0/m, z2.s, z0.d
     28 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx writing to a different destination
     29 // CHECK-NEXT: asr z2.s, p0/m, z2.s, z0.d
     30 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
     31 
     32 
     33 // ------------------------------------------------------------------------- //
     34 // Different destination register (ternary)
     35 
     36 movprfx z0, z1
     37 mla z3.d, p0/m, z1.d, z2.d
     38 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx writing to a different destination
     39 // CHECK-NEXT: mla z3.d, p0/m, z1.d, z2.d
     40 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
     41 
     42 
     43 // ------------------------------------------------------------------------- //
     44 // Destination used in other operand (unary)
     45 
     46 movprfx z0, z1
     47 abs z0.d, p0/m, z0.d
     48 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx and destination also used as non-destructive source
     49 // CHECK-NEXT: abs z0.d, p0/m, z0.d
     50 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
     51 
     52 movprfx z0.d, p0/z, z1.d
     53 cpy z0.d, p0/m, d0
     54 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx and destination also used as non-destructive source
     55 // CHECK-NEXT: cpy z0.d, p0/m, d0
     56 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
     57 
     58 movprfx z0.d, p0/z, z1.d
     59 mov z0.d, p0/m, d0
     60 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx and destination also used as non-destructive source
     61 // CHECK-NEXT: mov z0.d, p0/m, d0
     62 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
     63 
     64 // ------------------------------------------------------------------------- //
     65 // Destination used in other operand (binary)
     66 
     67 movprfx z0, z1
     68 add z0.d, p0/m, z0.d, z0.d
     69 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx and destination also used as non-destructive source
     70 // CHECK-NEXT: add z0.d, p0/m, z0.d, z0.d
     71 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
     72 
     73 
     74 // ------------------------------------------------------------------------- //
     75 // Destination used in other operand (wide element)
     76 
     77 movprfx z0, z1
     78 asr z0.s, p0/m, z0.s, z0.d
     79 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx and destination also used as non-destructive source
     80 // CHECK-NEXT: asr z0.s, p0/m, z0.s, z0.d
     81 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
     82 
     83 
     84 // ------------------------------------------------------------------------- //
     85 // Destination used in other operand (ternary)
     86 
     87 movprfx z0, z1
     88 mla z0.d, p0/m, z0.d, z2.d
     89 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx and destination also used as non-destructive source
     90 // CHECK-NEXT: mla z0.d, p0/m, z0.d, z2.d
     91 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
     92 
     93 
     94 // ------------------------------------------------------------------------- //
     95 // Different general predicate (unary)
     96 
     97 movprfx z0.d, p0/m, z1.d
     98 abs z0.d, p1/m, z1.d
     99 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a predicated movprfx using a different general predicate
    100 // CHECK-NEXT: abs z0.d, p1/m, z1.d
    101 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
    102 
    103 
    104 // ------------------------------------------------------------------------- //
    105 // Different general predicate (binary)
    106 
    107 movprfx z0.d, p0/m, z1.d
    108 add z0.d, p1/m, z0.d, z1.d
    109 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a predicated movprfx using a different general predicate
    110 // CHECK-NEXT: add z0.d, p1/m, z0.d, z1.d
    111 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
    112 
    113 
    114 // ------------------------------------------------------------------------- //
    115 // Different general predicate (wide element)
    116 
    117 movprfx z0.d, p0/m, z1.d
    118 asr z0.s, p1/m, z0.s, z1.d
    119 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a predicated movprfx using a different general predicate
    120 // CHECK-NEXT: asr z0.s, p1/m, z0.s, z1.d
    121 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
    122 
    123 
    124 // ------------------------------------------------------------------------- //
    125 // Different general predicate (ternary)
    126 
    127 movprfx z0.d, p0/m, z1.d
    128 mla z0.d, p1/m, z1.d, z2.d
    129 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a predicated movprfx using a different general predicate
    130 // CHECK-NEXT: mla z0.d, p1/m, z1.d, z2.d
    131 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
    132 
    133 
    134 // ------------------------------------------------------------------------- //
    135 // Different element size (unary)
    136 
    137 movprfx z0.s, p0/m, z1.s
    138 abs z0.d, p0/m, z1.d
    139 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a predicated movprfx with a different element size
    140 // CHECK-NEXT: abs z0.d, p0/m, z1.d
    141 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
    142 
    143 
    144 // ------------------------------------------------------------------------- //
    145 // Different element size (binary)
    146 
    147 movprfx z0.s, p0/m, z1.s
    148 add z0.d, p0/m, z0.d, z1.d
    149 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a predicated movprfx with a different element size
    150 // CHECK-NEXT: add z0.d, p0/m, z0.d, z1.d
    151 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
    152 
    153 
    154 // ------------------------------------------------------------------------- //
    155 // Different element size (wide element)
    156 
    157 movprfx z0.d, p0/m, z1.d
    158 asr z0.s, p0/m, z0.s, z1.d
    159 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a predicated movprfx with a different element size
    160 // CHECK-NEXT: asr z0.s, p0/m, z0.s, z1.d
    161 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
    162 
    163 
    164 // ------------------------------------------------------------------------- //
    165 // Different element size (ternary)
    166 
    167 movprfx z0.s, p0/m, z1.s
    168 mla z0.d, p0/m, z1.d, z2.d
    169 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a predicated movprfx with a different element size
    170 // CHECK-NEXT: mla z0.d, p0/m, z1.d, z2.d
    171 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
    172 
    173 
    174 // ------------------------------------------------------------------------- //
    175 // Predicated movprfx with non-predicated instruction.
    176 
    177 movprfx z0.d, p0/m, z1.d
    178 add z0.d, z0.d, #1
    179 // CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a predicated movprfx, suggest using unpredicated movprfx
    180 // CHECK-NEXT: add z0.d, z0.d, #1
    181 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
    182 
    183 
    184 // ------------------------------------------------------------------------- //
    185 // Ensure we don't try to apply a prefix to subsequent instructions (upon failure)
    186 
    187 movprfx z0, z1
    188 add z0.d, z1.d, z2.d
    189 add z0.d, z1.d, z2.d
    190 // CHECK: [[@LINE-2]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx, suggest replacing movprfx with mov
    191 // CHECK-NEXT: add z0.d, z1.d, z2.d
    192 // CHECK-NOT: [[@LINE-3]]:{{[0-9]+}}:
    193 // CHECK: add z0.d, z1.d, z2.d
    194