diff options
author | James Molloy <james.molloy@arm.com> | 2014-04-23 10:26:19 +0000 |
---|---|---|
committer | James Molloy <james.molloy@arm.com> | 2014-04-23 10:26:19 +0000 |
commit | 8bdd24b1a9723d0c09a0f8d6179e29fa45276645 (patch) | |
tree | f7a61aa0992c62e9e0f6163f2a28a18d44d64244 /clang/lib/Basic | |
parent | a7a23c1cce4ad8f9f50fc1c0d55515365d40ab38 (diff) | |
download | bcm5719-llvm-8bdd24b1a9723d0c09a0f8d6179e29fa45276645.tar.gz bcm5719-llvm-8bdd24b1a9723d0c09a0f8d6179e29fa45276645.zip |
[ARM64] Change inline assembly constraints to be more lax, to match the behaviour of Clang/AArch64 and GCC.
GCC allows sub-64bit values to use the 'r' register constraint.
llvm-svn: 206963
Diffstat (limited to 'clang/lib/Basic')
-rw-r--r-- | clang/lib/Basic/Targets.cpp | 51 |
1 files changed, 21 insertions, 30 deletions
diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp index 7d20f045c49..108b197daef 100644 --- a/clang/lib/Basic/Targets.cpp +++ b/clang/lib/Basic/Targets.cpp @@ -4643,46 +4643,37 @@ public: case 'w': // Floating point and SIMD registers (V0-V31) Info.setAllowsRegister(); return true; + case 'I': // Constant that can be used with an ADD instruction + case 'J': // Constant that can be used with a SUB instruction + case 'K': // Constant that can be used with a 32-bit logical instruction + case 'L': // Constant that can be used with a 64-bit logical instruction + case 'M': // Constant that can be used as a 32-bit MOV immediate + case 'N': // Constant that can be used as a 64-bit MOV immediate + case 'Y': // Floating point constant zero + case 'Z': // Integer constant zero + return true; + case 'Q': // A memory reference with base register and no offset + Info.setAllowsMemory(); + return true; + case 'S': // A symbolic address + Info.setAllowsRegister(); + return true; + case 'U': + // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes, whatever they may be + // Utf: A memory address suitable for ldp/stp in TF mode, whatever it may be + // Usa: An absolute symbolic address + // Ush: The high part (bits 32:12) of a pc-relative symbolic address + llvm_unreachable("FIXME: Unimplemented support for bizarre constraints"); case 'z': // Zero register, wzr or xzr Info.setAllowsRegister(); return true; case 'x': // Floating point and SIMD registers (V0-V15) Info.setAllowsRegister(); return true; - case 'Q': // A memory address that is a single base register. - Info.setAllowsMemory(); - return true; } return false; } - virtual bool validateConstraintModifier(StringRef Constraint, - const char Modifier, - unsigned Size) const { - // Strip off constraint modifiers. - while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&') - Constraint = Constraint.substr(1); - - switch (Constraint[0]) { - default: - return true; - case 'z': - case 'r': { - switch (Modifier) { - case 'x': - case 'w': - // For now assume that the person knows what they're - // doing with the modifier. - return true; - default: - // By default an 'r' constraint will be in the 'x' - // registers. - return (Size == 64); - } - } - } - } - virtual const char *getClobbers() const { return ""; } int getEHDataRegisterNumber(unsigned RegNo) const { |