From 112102c7fe7be6d3f322a07e0da00284284398c6 Mon Sep 17 00:00:00 2001 From: Tim Northover Date: Tue, 7 Apr 2015 22:49:47 +0000 Subject: [PATCH] AArch64: disallow "fmov sD, #-0.0" during assembly. We weren't checking the sign of the floating point immediate before translating it to "fmov sD, wzr". Similarly for D-regs. Technically "movi vD.2s, #0x80, lsl #24" would work most of the time, but it's not a blessed alias (and I don't think it should be since people expect writing sD to zero out the high lanes, and there's no dD equivalent). So an error it is. rdar://20455398 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@234372 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp | 7 ++++--- test/MC/AArch64/arm64-fp-encoding-error.s | 8 ++++++++ 2 files changed, 12 insertions(+), 3 deletions(-) create mode 100644 test/MC/AArch64/arm64-fp-encoding-error.s diff --git a/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp b/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp index 5eec0cde118..e2070030797 100644 --- a/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp +++ b/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp @@ -2090,15 +2090,16 @@ AArch64AsmParser::tryParseFPImm(OperandVector &Operands) { const AsmToken &Tok = Parser.getTok(); if (Tok.is(AsmToken::Real)) { APFloat RealVal(APFloat::IEEEdouble, Tok.getString()); + if (isNegative) + RealVal.changeSign(); + uint64_t IntVal = RealVal.bitcastToAPInt().getZExtValue(); - // If we had a '-' in front, toggle the sign bit. - IntVal ^= (uint64_t)isNegative << 63; int Val = AArch64_AM::getFP64Imm(APInt(64, IntVal)); Parser.Lex(); // Eat the token. // Check for out of range values. As an exception, we let Zero through, // as we handle that special case in post-processing before matching in // order to use the zero register for it. - if (Val == -1 && !RealVal.isZero()) { + if (Val == -1 && !RealVal.isPosZero()) { TokError("expected compatible register or floating-point constant"); return MatchOperand_ParseFail; } diff --git a/test/MC/AArch64/arm64-fp-encoding-error.s b/test/MC/AArch64/arm64-fp-encoding-error.s new file mode 100644 index 00000000000..ad301279744 --- /dev/null +++ b/test/MC/AArch64/arm64-fp-encoding-error.s @@ -0,0 +1,8 @@ +; RUN: not llvm-mc -triple arm64-apple-ios8.0 %s -o /dev/null 2>&1 | FileCheck %s + + fmov s0, #-0.0 +; CHECK: error: expected compatible register or floating-point constant + + fmov d0, #-0.0 +; CHECK: error: expected compatible register or floating-point constant + -- 2.34.1