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