Index: llvm/trunk/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp =================================================================== --- llvm/trunk/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp +++ llvm/trunk/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp @@ -3844,6 +3844,8 @@ return Error(Loc, "immediate must be an integer in range [-128, 255]" " with a shift amount of 0"); case Match_InvalidSVECpyImm16: + return Error(Loc, "immediate must be an integer in range [-128, 127] or a " + "multiple of 256 in range [-32768, 65280]"); case Match_InvalidSVECpyImm32: case Match_InvalidSVECpyImm64: return Error(Loc, "immediate must be an integer in range [-128, 127] or a " Index: llvm/trunk/lib/Target/AArch64/MCTargetDesc/AArch64AddressingModes.h =================================================================== --- llvm/trunk/lib/Target/AArch64/MCTargetDesc/AArch64AddressingModes.h +++ llvm/trunk/lib/Target/AArch64/MCTargetDesc/AArch64AddressingModes.h @@ -768,10 +768,16 @@ /// Returns true if Imm is valid for CPY/DUP. template static inline bool isSVECpyImm(int64_t Imm) { + bool IsImm8 = int8_t(Imm) == Imm; + bool IsImm16 = int16_t(Imm & ~0xff) == Imm; + if (std::is_same::type>::value) - return uint8_t(Imm) == Imm || int8_t(Imm) == Imm; - else - return int8_t(Imm) == Imm || int16_t(Imm & ~0xff) == Imm; + return IsImm8 || uint8_t(Imm) == Imm; + + if (std::is_same::type>::value) + return IsImm8 || IsImm16 || uint16_t(Imm & ~0xff) == Imm; + + return IsImm8 || IsImm16; } /// Returns true if Imm is valid for ADD/SUB. Index: llvm/trunk/test/MC/AArch64/SVE/cpy-diagnostics.s =================================================================== --- llvm/trunk/test/MC/AArch64/SVE/cpy-diagnostics.s +++ llvm/trunk/test/MC/AArch64/SVE/cpy-diagnostics.s @@ -29,33 +29,33 @@ // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: cpy z0.h, p0/z, #-33024 -// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 32512] +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 65280] // CHECK-NEXT: cpy z0.h, p0/z, #-33024 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: cpy z0.h, p0/z, #-32769 -// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 32512] +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 65280] // CHECK-NEXT: cpy z0.h, p0/z, #-32769 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: cpy z0.h, p0/z, #-129, lsl #8 -// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 32512] +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 65280] // CHECK-NEXT: cpy z0.h, p0/z, #-129, lsl #8 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: cpy z0.h, p0/z, #32513 -// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 32512] +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 65280] // CHECK-NEXT: cpy z0.h, p0/z, #32513 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: -cpy z0.h, p0/z, #32768 -// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 32512] -// CHECK-NEXT: cpy z0.h, p0/z, #32768 +cpy z0.h, p0/z, #65281 +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 65280] +// CHECK-NEXT: cpy z0.h, p0/z, #65281 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: -cpy z0.h, p0/z, #128, lsl #8 -// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 32512] -// CHECK-NEXT: cpy z0.h, p0/z, #128, lsl #8 +cpy z0.h, p0/z, #256, lsl #8 +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 65280] +// CHECK-NEXT: cpy z0.h, p0/z, #256, lsl #8 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: cpy z0.s, p0/z, #-33024 Index: llvm/trunk/test/MC/AArch64/SVE/dup-diagnostics.s =================================================================== --- llvm/trunk/test/MC/AArch64/SVE/dup-diagnostics.s +++ llvm/trunk/test/MC/AArch64/SVE/dup-diagnostics.s @@ -48,33 +48,33 @@ // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: dup z0.h, #-33024 -// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 32512] +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 65280] // CHECK-NEXT: dup z0.h, #-33024 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: dup z0.h, #-32769 -// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 32512] +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 65280] // CHECK-NEXT: dup z0.h, #-32769 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: dup z0.h, #-129, lsl #8 -// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 32512] +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 65280] // CHECK-NEXT: dup z0.h, #-129, lsl #8 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: -dup z0.h, #32513 -// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 32512] -// CHECK-NEXT: dup z0.h, #32513 +dup z0.h, #65281 +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 65280] +// CHECK-NEXT: dup z0.h, #65281 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: -dup z0.h, #32768 -// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 32512] -// CHECK-NEXT: dup z0.h, #32768 +dup z0.h, #65536 +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 65280] +// CHECK-NEXT: dup z0.h, #65536 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: -dup z0.h, #128, lsl #8 -// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 32512] -// CHECK-NEXT: dup z0.h, #128, lsl #8 +dup z0.h, #256, lsl #8 +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 65280] +// CHECK-NEXT: dup z0.h, #256, lsl #8 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: dup z0.s, #-33024 Index: llvm/trunk/test/MC/AArch64/SVE/mov-diagnostics.s =================================================================== --- llvm/trunk/test/MC/AArch64/SVE/mov-diagnostics.s +++ llvm/trunk/test/MC/AArch64/SVE/mov-diagnostics.s @@ -66,28 +66,29 @@ // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: mov z0.h, #-33024 -// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 32512] +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 65280] // CHECK-NEXT: mov z0.h, #-33024 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: mov z0.h, #-32769 -// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 32512] +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 65280] // CHECK-NEXT: mov z0.h, #-32769 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: mov z0.h, #-129, lsl #8 -// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 32512] +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 65280] // CHECK-NEXT: mov z0.h, #-129, lsl #8 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: -mov z0.h, #32513 -// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 32512] -// CHECK-NEXT: mov z0.h, #32513 +// Note: 65281 is a valid logical immediate. +mov z0.h, #65282 +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 65280] +// CHECK-NEXT: mov z0.h, #65282 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: -mov z0.h, #128, lsl #8 -// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 32512] -// CHECK-NEXT: mov z0.h, #128, lsl #8 +mov z0.h, #256, lsl #8 +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 65280] +// CHECK-NEXT: mov z0.h, #256, lsl #8 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: mov z0.s, #-33024 @@ -136,12 +137,12 @@ // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: mov z5.h, #0xfffa -// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 32512] +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 65280] // CHECK-NEXT: mov z5.h, #0xfffa // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: mov z5.h, #0xfffffff9 -// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 32512] +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 65280] // CHECK-NEXT: mov z5.h, #0xfffffff9 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: @@ -181,33 +182,33 @@ // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: mov z0.h, p0/z, #-33024 -// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 32512] +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 65280] // CHECK-NEXT: mov z0.h, p0/z, #-33024 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: mov z0.h, p0/z, #-32769 -// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 32512] +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 65280] // CHECK-NEXT: mov z0.h, p0/z, #-32769 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: mov z0.h, p0/z, #-129, lsl #8 -// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 32512] +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 65280] // CHECK-NEXT: mov z0.h, p0/z, #-129, lsl #8 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: mov z0.h, p0/z, #32513 -// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 32512] +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 65280] // CHECK-NEXT: mov z0.h, p0/z, #32513 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: -mov z0.h, p0/z, #32768 -// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 32512] -// CHECK-NEXT: mov z0.h, p0/z, #32768 +mov z0.h, p0/z, #65281 +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 65280] +// CHECK-NEXT: mov z0.h, p0/z, #65281 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: -mov z0.h, p0/z, #128, lsl #8 -// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 32512] -// CHECK-NEXT: mov z0.h, p0/z, #128, lsl #8 +mov z0.h, p0/z, #256, lsl #8 +// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [-128, 127] or a multiple of 256 in range [-32768, 65280] +// CHECK-NEXT: mov z0.h, p0/z, #256, lsl #8 // CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}: mov z0.s, p0/z, #-33024 Index: llvm/trunk/test/MC/AArch64/SVE/mov.s =================================================================== --- llvm/trunk/test/MC/AArch64/SVE/mov.s +++ llvm/trunk/test/MC/AArch64/SVE/mov.s @@ -194,10 +194,16 @@ // CHECK-UNKNOWN: f5 ef f8 25 mov z0.h, #32768 -// CHECK-INST: dupm z0.h, #0x8000 -// CHECK-ENCODING: [0x00,0x0c,0xc0,0x05] +// CHECK-INST: mov z0.h, #-32768 +// CHECK-ENCODING: [0x00,0xf0,0x78,0x25] // CHECK-ERROR: instruction requires: sve -// CHECK-UNKNOWN: 00 0c c0 05 +// CHECK-UNKNOWN: 00 f0 78 25 + +mov z0.h, #65280 +// CHECK-INST: mov z0.h, #-256 +// CHECK-ENCODING: [0xe0,0xff,0x78,0x25] +// CHECK-ERROR: instruction requires: sve +// CHECK-UNKNOWN: e0 ff 78 25 mov z0.s, #-32769 // CHECK-INST: mov z0.s, #0xffff7fff