1# RUN: not llvm-mc -triple=thumbv8.1m.main-none-eabi -mattr=+mve -show-encoding < %s 2>%t \ 2# RUN: | FileCheck --check-prefix=CHECK-NOFP %s 3# RUN: FileCheck --check-prefix=ERROR-NOFP < %t %s 4# RUN: not llvm-mc -triple=thumbv8.1m.main-none-eabi -mattr=+mve.fp,+fp64 -show-encoding < %s 2>%t \ 5# RUN: | FileCheck --check-prefix=CHECK %s 6# RUN: FileCheck --check-prefix=ERROR < %t %s 7 8# CHECK: vcmp.f16 eq, q0, q4 @ encoding: [0x31,0xfe,0x08,0x0f] 9# ERROR-NOFP: [[@LINE+2]]:1: {{error|note}}: instruction requires: mve.fp 10# CHECK-NOFP-NOT: vcmp.f16 eq, q0, q4 @ encoding: [0x31,0xfe,0x08,0x0f] 11vcmp.f16 eq, q0, q4 12 13# CHECK: vcmp.f16 ne, q2, q7 @ encoding: [0x35,0xfe,0x8e,0x0f] 14# ERROR-NOFP: [[@LINE+2]]:1: {{error|note}}: instruction requires: mve.fp 15# CHECK-NOFP-NOT: vcmp.f16 ne, q2, q7 @ encoding: [0x35,0xfe,0x8e,0x0f] 16vcmp.f16 ne, q2, q7 17 18# CHECK: vcmp.f16 ge, q0, q0 @ encoding: [0x31,0xfe,0x00,0x1f] 19# ERROR-NOFP: [[@LINE+2]]:1: {{error|note}}: instruction requires: mve.fp 20# CHECK-NOFP-NOT: vcmp.f16 ge, q0, q0 @ encoding: [0x31,0xfe,0x00,0x1f] 21vcmp.f16 ge, q0, q0 22 23# CHECK: vcmp.f16 lt, q0, q1 @ encoding: [0x31,0xfe,0x82,0x1f] 24# ERROR-NOFP: [[@LINE+2]]:1: {{error|note}}: instruction requires: mve.fp 25# CHECK-NOFP-NOT: vcmp.f16 lt, q0, q1 @ encoding: [0x31,0xfe,0x82,0x1f] 26vcmp.f16 lt, q0, q1 27 28# CHECK: vcmp.f16 gt, q1, q4 @ encoding: [0x33,0xfe,0x09,0x1f] 29# ERROR-NOFP: [[@LINE+2]]:1: {{error|note}}: instruction requires: mve.fp 30# CHECK-NOFP-NOT: vcmp.f16 gt, q1, q4 @ encoding: [0x33,0xfe,0x09,0x1f] 31vcmp.f16 gt, q1, q4 32 33# CHECK: vcmp.f16 le, q2, q6 @ encoding: [0x35,0xfe,0x8d,0x1f] 34# ERROR-NOFP: [[@LINE+2]]:1: {{error|note}}: instruction requires: mve.fp 35# CHECK-NOFP-NOT: vcmp.f16 le, q2, q6 @ encoding: [0x35,0xfe,0x8d,0x1f] 36vcmp.f16 le, q2, q6 37 38# ERROR: [[@LINE+1]]:10: {{error|note}}: condition code for floating-point comparison must be EQ, NE, LT, GT, LE or GE 39vcmp.f16 hi, q2, q6 40 41# ERROR: [[@LINE+1]]:10: {{error|note}}: condition code for floating-point comparison must be EQ, NE, LT, GT, LE or GE 42vcmp.f16 hs, q2, q6 43 44# CHECK: vcmp.f32 eq, q2, q5 @ encoding: [0x35,0xee,0x0a,0x0f] 45# ERROR-NOFP: [[@LINE+2]]:1: {{error|note}}: instruction requires: mve.fp 46# CHECK-NOFP-NOT: vcmp.f32 eq, q2, q5 @ encoding: [0x35,0xee,0x0a,0x0f] 47vcmp.f32 eq, q2, q5 48 49# CHECK: vcmp.f32 ne, q3, q4 @ encoding: [0x37,0xee,0x88,0x0f] 50# ERROR-NOFP: [[@LINE+2]]:1: {{error|note}}: instruction requires: mve.fp 51# CHECK-NOFP-NOT: vcmp.f32 ne, q3, q4 @ encoding: [0x37,0xee,0x88,0x0f] 52vcmp.f32 ne, q3, q4 53 54# CHECK: vcmp.f32 ge, q0, q7 @ encoding: [0x31,0xee,0x0e,0x1f] 55# ERROR-NOFP: [[@LINE+2]]:1: {{error|note}}: instruction requires: mve.fp 56# CHECK-NOFP-NOT: vcmp.f32 ge, q0, q7 @ encoding: [0x31,0xee,0x0e,0x1f] 57vcmp.f32 ge, q0, q7 58 59# CHECK: vcmp.f32 lt, q5, q2 @ encoding: [0x3b,0xee,0x84,0x1f] 60# ERROR-NOFP: [[@LINE+2]]:1: {{error|note}}: instruction requires: mve.fp 61# CHECK-NOFP-NOT: vcmp.f32 lt, q5, q2 @ encoding: [0x3b,0xee,0x84,0x1f] 62vcmp.f32 lt, q5, q2 63 64# CHECK: vcmp.f32 gt, q2, q7 @ encoding: [0x35,0xee,0x0f,0x1f] 65# ERROR-NOFP: [[@LINE+2]]:1: {{error|note}}: instruction requires: mve.fp 66# CHECK-NOFP-NOT: vcmp.f32 gt, q2, q7 @ encoding: [0x35,0xee,0x0f,0x1f] 67vcmp.f32 gt, q2, q7 68 69# CHECK: vcmp.f32 le, q2, q4 @ encoding: [0x35,0xee,0x89,0x1f] 70# ERROR-NOFP: [[@LINE+2]]:1: {{error|note}}: instruction requires: mve.fp 71# CHECK-NOFP-NOT: vcmp.f32 le, q2, q4 @ encoding: [0x35,0xee,0x89,0x1f] 72vcmp.f32 le, q2, q4 73 74# ERROR: [[@LINE+1]]:10: {{error|note}}: condition code for floating-point comparison must be EQ, NE, LT, GT, LE or GE 75vcmp.f32 hi, q2, q6 76 77# ERROR: [[@LINE+1]]:10: {{error|note}}: condition code for floating-point comparison must be EQ, NE, LT, GT, LE or GE 78vcmp.f32 hs, q2, q6 79 80# CHECK: vcmp.i8 eq, q4, q6 @ encoding: [0x09,0xfe,0x0c,0x0f] 81# CHECK-NOFP: vcmp.i8 eq, q4, q6 @ encoding: [0x09,0xfe,0x0c,0x0f] 82vcmp.i8 eq, q4, q6 83 84# CHECK: vcmp.i8 ne, q2, q2 @ encoding: [0x05,0xfe,0x84,0x0f] 85# CHECK-NOFP: vcmp.i8 ne, q2, q2 @ encoding: [0x05,0xfe,0x84,0x0f] 86vcmp.i8 ne, q2, q2 87 88# ERROR: [[@LINE+1]]:9: {{error|note}}: condition code for sign-independent integer comparison must be EQ or NE 89vcmp.i8 hs, q2, q6 90 91# ERROR: [[@LINE+1]]:9: {{error|note}}: condition code for sign-independent integer comparison must be EQ or NE 92vcmp.i8 le, q2, q6 93 94# CHECK: vcmp.i8 eq, q4, q6 @ encoding: [0x09,0xfe,0x0c,0x0f] 95# CHECK-NOFP: vcmp.i8 eq, q4, q6 @ encoding: [0x09,0xfe,0x0c,0x0f] 96vcmp.s8 eq, q4, q6 97 98# CHECK: vcmp.i8 ne, q2, q2 @ encoding: [0x05,0xfe,0x84,0x0f] 99# CHECK-NOFP: vcmp.i8 ne, q2, q2 @ encoding: [0x05,0xfe,0x84,0x0f] 100vcmp.s8 ne, q2, q2 101 102# CHECK: vcmp.i8 eq, q4, q6 @ encoding: [0x09,0xfe,0x0c,0x0f] 103# CHECK-NOFP: vcmp.i8 eq, q4, q6 @ encoding: [0x09,0xfe,0x0c,0x0f] 104vcmp.u8 eq, q4, q6 105 106# CHECK: vcmp.i8 ne, q2, q2 @ encoding: [0x05,0xfe,0x84,0x0f] 107# CHECK-NOFP: vcmp.i8 ne, q2, q2 @ encoding: [0x05,0xfe,0x84,0x0f] 108vcmp.u8 ne, q2, q2 109 110# CHECK: vcmp.s8 ge, q0, q0 @ encoding: [0x01,0xfe,0x00,0x1f] 111# CHECK-NOFP: vcmp.s8 ge, q0, q0 @ encoding: [0x01,0xfe,0x00,0x1f] 112vcmp.s8 ge, q0, q0 113 114# CHECK: vcmp.s8 lt, q2, q7 @ encoding: [0x05,0xfe,0x8e,0x1f] 115# CHECK-NOFP: vcmp.s8 lt, q2, q7 @ encoding: [0x05,0xfe,0x8e,0x1f] 116vcmp.s8 lt, q2, q7 117 118# CHECK: vcmp.s8 gt, q4, q3 @ encoding: [0x09,0xfe,0x07,0x1f] 119# CHECK-NOFP: vcmp.s8 gt, q4, q3 @ encoding: [0x09,0xfe,0x07,0x1f] 120vcmp.s8 gt, q4, q3 121 122# CHECK: vcmp.s8 le, q7, q3 @ encoding: [0x0f,0xfe,0x87,0x1f] 123# CHECK-NOFP: vcmp.s8 le, q7, q3 @ encoding: [0x0f,0xfe,0x87,0x1f] 124vcmp.s8 le, q7, q3 125 126# ERROR: [[@LINE+1]]:9: {{error|note}}: condition code for signed integer comparison must be EQ, NE, LT, GT, LE or GE 127vcmp.s8 hs, q2, q6 128 129# CHECK: vcmp.u8 hi, q1, q4 @ encoding: [0x03,0xfe,0x89,0x0f] 130# CHECK-NOFP: vcmp.u8 hi, q1, q4 @ encoding: [0x03,0xfe,0x89,0x0f] 131vcmp.u8 hi, q1, q4 132 133# CHECK: vcmp.u8 cs, q1, q4 @ encoding: [0x03,0xfe,0x09,0x0f] 134# CHECK-NOFP: vcmp.u8 cs, q1, q4 @ encoding: [0x03,0xfe,0x09,0x0f] 135vcmp.u8 cs, q1, q4 136 137# ERROR: [[@LINE+1]]:9: {{error|note}}: condition code for unsigned integer comparison must be EQ, NE, HS or HI 138vcmp.u8 gt, q2, q6 139 140# ERROR: [[@LINE+1]]:9: {{error|note}}: condition code for unsigned integer comparison must be EQ, NE, HS or HI 141vcmp.u8 lo, q2, q6 142 143# CHECK: vcmp.i16 eq, q4, q7 @ encoding: [0x19,0xfe,0x0e,0x0f] 144# CHECK-NOFP: vcmp.i16 eq, q4, q7 @ encoding: [0x19,0xfe,0x0e,0x0f] 145vcmp.i16 eq, q4, q7 146 147# CHECK: vcmp.i16 ne, q2, q1 @ encoding: [0x15,0xfe,0x82,0x0f] 148# CHECK-NOFP: vcmp.i16 ne, q2, q1 @ encoding: [0x15,0xfe,0x82,0x0f] 149vcmp.i16 ne, q2, q1 150 151# ERROR: [[@LINE+1]]:10: {{error|note}}: condition code for sign-independent integer comparison must be EQ or NE 152vcmp.i16 hi, q2, q6 153 154# ERROR: [[@LINE+1]]:10: {{error|note}}: condition code for sign-independent integer comparison must be EQ or NE 155vcmp.i16 lt, q2, q6 156 157# CHECK: vcmp.s16 ge, q1, q7 @ encoding: [0x13,0xfe,0x0e,0x1f] 158# CHECK-NOFP: vcmp.s16 ge, q1, q7 @ encoding: [0x13,0xfe,0x0e,0x1f] 159vcmp.s16 ge, q1, q7 160 161# CHECK: vcmp.s16 lt, q0, q1 @ encoding: [0x11,0xfe,0x82,0x1f] 162# CHECK-NOFP: vcmp.s16 lt, q0, q1 @ encoding: [0x11,0xfe,0x82,0x1f] 163vcmp.s16 lt, q0, q1 164 165# CHECK: vcmp.s16 gt, q1, q7 @ encoding: [0x13,0xfe,0x0f,0x1f] 166# CHECK-NOFP: vcmp.s16 gt, q1, q7 @ encoding: [0x13,0xfe,0x0f,0x1f] 167vcmp.s16 gt, q1, q7 168 169# CHECK: vcmp.s16 le, q2, q1 @ encoding: [0x15,0xfe,0x83,0x1f] 170# CHECK-NOFP: vcmp.s16 le, q2, q1 @ encoding: [0x15,0xfe,0x83,0x1f] 171vcmp.s16 le, q2, q1 172 173# ERROR: [[@LINE+1]]:10: {{error|note}}: condition code for signed integer comparison must be EQ, NE, LT, GT, LE or GE 174vcmp.s16 hi, q2, q6 175 176# CHECK: vcmp.u16 hi, q1, q4 @ encoding: [0x13,0xfe,0x89,0x0f] 177# CHECK-NOFP: vcmp.u16 hi, q1, q4 @ encoding: [0x13,0xfe,0x89,0x0f] 178vcmp.u16 hi, q1, q4 179 180# CHECK: vcmp.u16 cs, q1, q4 @ encoding: [0x13,0xfe,0x09,0x0f] 181# CHECK-NOFP: vcmp.u16 cs, q1, q4 @ encoding: [0x13,0xfe,0x09,0x0f] 182vcmp.u16 cs, q1, q4 183 184# ERROR: [[@LINE+1]]:10: {{error|note}}: condition code for unsigned integer comparison must be EQ, NE, HS or HI 185vcmp.u16 ge, q2, q6 186 187# ERROR: [[@LINE+1]]:10: {{error|note}}: condition code for unsigned integer comparison must be EQ, NE, HS or HI 188vcmp.u16 ls, q2, q6 189 190# CHECK: vcmp.i32 eq, q2, q7 @ encoding: [0x25,0xfe,0x0e,0x0f] 191# CHECK-NOFP: vcmp.i32 eq, q2, q7 @ encoding: [0x25,0xfe,0x0e,0x0f] 192vcmp.i32 eq, q2, q7 193 194# CHECK: vcmp.i32 ne, q2, q4 @ encoding: [0x25,0xfe,0x88,0x0f] 195# CHECK-NOFP: vcmp.i32 ne, q2, q4 @ encoding: [0x25,0xfe,0x88,0x0f] 196vcmp.i32 ne, q2, q4 197 198# ERROR: [[@LINE+1]]:10: {{error|note}}: condition code for sign-independent integer comparison must be EQ or NE 199vcmp.i32 lo, q2, q6 200 201# ERROR: [[@LINE+1]]:10: {{error|note}}: condition code for sign-independent integer comparison must be EQ or NE 202vcmp.i32 ge, q2, q6 203 204# CHECK: vcmp.s32 ge, q5, q5 @ encoding: [0x2b,0xfe,0x0a,0x1f] 205# CHECK-NOFP: vcmp.s32 ge, q5, q5 @ encoding: [0x2b,0xfe,0x0a,0x1f] 206vcmp.s32 ge, q5, q5 207 208# CHECK: vcmp.s32 lt, q2, q2 @ encoding: [0x25,0xfe,0x84,0x1f] 209# CHECK-NOFP: vcmp.s32 lt, q2, q2 @ encoding: [0x25,0xfe,0x84,0x1f] 210vcmp.s32 lt, q2, q2 211 212# CHECK: vcmp.s32 gt, q0, q1 @ encoding: [0x21,0xfe,0x03,0x1f] 213# CHECK-NOFP: vcmp.s32 gt, q0, q1 @ encoding: [0x21,0xfe,0x03,0x1f] 214vcmp.s32 gt, q0, q1 215 216# CHECK: vcmp.s32 le, q5, q4 @ encoding: [0x2b,0xfe,0x89,0x1f] 217# CHECK-NOFP: vcmp.s32 le, q5, q4 @ encoding: [0x2b,0xfe,0x89,0x1f] 218vcmp.s32 le, q5, q4 219 220# ERROR: [[@LINE+1]]:10: {{error|note}}: condition code for signed integer comparison must be EQ, NE, LT, GT, LE or GE 221vcmp.s32 ls, q2, q6 222 223# CHECK: vcmp.u32 hi, q1, q4 @ encoding: [0x23,0xfe,0x89,0x0f] 224# CHECK-NOFP: vcmp.u32 hi, q1, q4 @ encoding: [0x23,0xfe,0x89,0x0f] 225vcmp.u32 hi, q1, q4 226 227# CHECK: vcmp.u32 cs, q1, q4 @ encoding: [0x23,0xfe,0x09,0x0f] 228# CHECK-NOFP: vcmp.u32 cs, q1, q4 @ encoding: [0x23,0xfe,0x09,0x0f] 229vcmp.u32 cs, q1, q4 230 231# ERROR: [[@LINE+1]]:10: {{error|note}}: condition code for unsigned integer comparison must be EQ, NE, HS or HI 232vcmp.u32 vs, q2, q6 233 234# ERROR: [[@LINE+1]]:10: {{error|note}}: condition code for unsigned integer comparison must be EQ, NE, HS or HI 235vcmp.u32 mi, q2, q6 236 237# CHECK: vcmp.f16 gt, q4, zr @ encoding: [0x39,0xfe,0x6f,0x1f] 238# ERROR-NOFP: [[@LINE+2]]:1: {{error|note}}: instruction requires: mve.fp 239# CHECK-NOFP-NOT: vcmp.f16 gt, q4, zr @ encoding: [0x39,0xfe,0x6f,0x1f] 240vcmp.f16 gt, q4, zr 241 242# CHECK: vcmp.f16 eq, q4, r12 @ encoding: [0x39,0xfe,0x4c,0x0f] 243# ERROR-NOFP: [[@LINE+2]]:1: {{error|note}}: instruction requires: mve.fp 244# CHECK-NOFP-NOT: vcmp.f16 eq, q4, r12 @ encoding: [0x39,0xfe,0x4c,0x0f] 245vcmp.f16 eq, q4, r12 246 247# CHECK: vcmp.f32 ne, q3, r0 @ encoding: [0x37,0xee,0xc0,0x0f] 248# ERROR-NOFP: [[@LINE+2]]:1: {{error|note}}: instruction requires: mve.fp 249# CHECK-NOFP-NOT: vcmp.f32 ne, q3, r0 @ encoding: [0x37,0xee,0xc0,0x0f] 250vcmp.f32 ne, q3, r0 251 252# CHECK: vcmp.i8 eq, q1, r0 @ encoding: [0x03,0xfe,0x40,0x0f] 253# CHECK-NOFP: vcmp.i8 eq, q1, r0 @ encoding: [0x03,0xfe,0x40,0x0f] 254vcmp.i8 eq, q1, r0 255 256# CHECK: vcmp.s8 le, q1, r0 @ encoding: [0x03,0xfe,0xe0,0x1f] 257# CHECK-NOFP: vcmp.s8 le, q1, r0 @ encoding: [0x03,0xfe,0xe0,0x1f] 258vcmp.s8 le, q1, r0 259 260# CHECK: vcmp.u8 cs, q1, r0 @ encoding: [0x03,0xfe,0x60,0x0f] 261# CHECK-NOFP: vcmp.u8 cs, q1, r0 @ encoding: [0x03,0xfe,0x60,0x0f] 262vcmp.u8 cs, q1, r0 263 264# CHECK: vcmp.i16 eq, q5, r10 @ encoding: [0x1b,0xfe,0x4a,0x0f] 265# CHECK-NOFP: vcmp.i16 eq, q5, r10 @ encoding: [0x1b,0xfe,0x4a,0x0f] 266vcmp.i16 eq, q5, r10 267 268# CHECK: vcmp.i32 eq, q1, r4 @ encoding: [0x23,0xfe,0x44,0x0f] 269# CHECK-NOFP: vcmp.i32 eq, q1, r4 @ encoding: [0x23,0xfe,0x44,0x0f] 270vcmp.i32 eq, q1, r4 271 272vpste 273vcmpt.i8 eq, q0, r0 274vcmpe.i16 ne, q0, r0 275# CHECK: vpste @ encoding: [0x71,0xfe,0x4d,0x8f] 276# CHECK-NOFP: vpste @ encoding: [0x71,0xfe,0x4d,0x8f] 277# CHECK: vcmpt.i8 eq, q0, r0 @ encoding: [0x01,0xfe,0x40,0x0f] 278# CHECK-NOFP: vcmpt.i8 eq, q0, r0 @ encoding: [0x01,0xfe,0x40,0x0f] 279# CHECK: vcmpe.i16 ne, q0, r0 @ encoding: [0x11,0xfe,0xc0,0x0f] 280# CHECK-NOFP: vcmpe.i16 ne, q0, r0 @ encoding: [0x11,0xfe,0xc0,0x0f] 281 282# Ensure the scalar FP instructions VCMP and VCMPE are still correctly 283# distinguished, in spite of VCMPE sometimes being a VPT-suffixed 284# version of VCMP with identical encoding. 285vcmp.f16 s0,s1 286vcmpe.f16 s0,s1 287# CHECK: vcmp.f16 s0, s1 @ encoding: [0xb4,0xee,0x60,0x09] 288# CHECK: vcmpe.f16 s0, s1 @ encoding: [0xb4,0xee,0xe0,0x09] 289# CHECK-NOFP-NOT: vcmp.f16 s0, s1 @ encoding: [0xb4,0xee,0x60,0x09] 290# CHECK-NOFP-NOT: vcmpe.f16 s0, s1 @ encoding: [0xb4,0xee,0xe0,0x09] 291 292itt eq 293vcmpeq.f32 s0, s1 294vcmpeeq.f32 s0, s1 295# CHECK: itt eq @ encoding: [0x04,0xbf] 296# CHECK: vcmpeq.f32 s0, s1 @ encoding: [0xb4,0xee,0x60,0x0a] 297# CHECK-NOFP-NOT: vcmpeq.f32 s0, s1 @ encoding: [0xb4,0xee,0x60,0x0a] 298# CHECK: vcmpeeq.f32 s0, s1 @ encoding: [0xb4,0xee,0xe0,0x0a] 299# CHECK-NOFP-NOT: vcmpeeq.f32 s0, s1 @ encoding: [0xb4,0xee,0xe0,0x0a] 300