forked from OSchip/llvm-project
[AArch64][SVE] Fix range for DUP immediates (16bit elts)
For immediates used in DUP instructions that have the range -128 to 127, or a multiple of 256 in the range -32768 to 32512, one could argue that when the result element size is 16bits (.h), the value can be considered both signed and unsigned. Reviewers: rengolin, fhahn, SjoerdMeijer, samparker, javed.absar Reviewed By: fhahn Differential Revision: https://reviews.llvm.org/D47619 llvm-svn: 333873
This commit is contained in:
parent
fd54a781f6
commit
d0a6f6a502
|
@ -3844,6 +3844,8 @@ bool AArch64AsmParser::showMatchError(SMLoc Loc, unsigned ErrCode,
|
|||
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 "
|
||||
|
|
|
@ -768,10 +768,16 @@ static inline bool isSVEMaskOfIdenticalElements(int64_t Imm) {
|
|||
/// Returns true if Imm is valid for CPY/DUP.
|
||||
template <typename T>
|
||||
static inline bool isSVECpyImm(int64_t Imm) {
|
||||
bool IsImm8 = int8_t(Imm) == Imm;
|
||||
bool IsImm16 = int16_t(Imm & ~0xff) == Imm;
|
||||
|
||||
if (std::is_same<int8_t, typename std::make_signed<T>::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<int16_t, typename std::make_signed<T>::type>::value)
|
||||
return IsImm8 || IsImm16 || uint16_t(Imm & ~0xff) == Imm;
|
||||
|
||||
return IsImm8 || IsImm16;
|
||||
}
|
||||
|
||||
/// Returns true if Imm is valid for ADD/SUB.
|
||||
|
|
|
@ -29,33 +29,33 @@ cpy z0.b, p0/z, #1, lsl #8
|
|||
// 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
|
||||
|
|
|
@ -48,33 +48,33 @@ dup z0.b, #1, lsl #8
|
|||
// 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
|
||||
|
|
|
@ -66,28 +66,29 @@ mov z0.b, #1, lsl #8
|
|||
// 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 @@ mov z5.b, #0xfff9
|
|||
// 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 @@ mov z0.b, p0/z, #1, lsl #8
|
|||
// 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
|
||||
|
|
|
@ -194,10 +194,16 @@ mov z21.d, #32512
|
|||
// CHECK-UNKNOWN: f5 ef f8 25 <unknown>
|
||||
|
||||
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 <unknown>
|
||||
// CHECK-UNKNOWN: 00 f0 78 25 <unknown>
|
||||
|
||||
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 <unknown>
|
||||
|
||||
mov z0.s, #-32769
|
||||
// CHECK-INST: mov z0.s, #0xffff7fff
|
||||
|
|
Loading…
Reference in New Issue