diff options
| author | Akira Hatanaka <ahatanaka@mips.com> | 2013-10-29 19:00:35 +0000 |
|---|---|---|
| committer | Akira Hatanaka <ahatanaka@mips.com> | 2013-10-29 19:00:35 +0000 |
| commit | 618b29813ac587a85513acca9710d0e3be1bc46b (patch) | |
| tree | 2bcc36cfb3cf6fc3fb20b924d769562c7b74536c /clang/lib/Basic | |
| parent | 596d108febc0eafb77fbfaa1cdb4a026a0f65ec1 (diff) | |
| download | bcm5719-llvm-618b29813ac587a85513acca9710d0e3be1bc46b.tar.gz bcm5719-llvm-618b29813ac587a85513acca9710d0e3be1bc46b.zip | |
[mips] Align the stack to 16-bytes for -mfp64.
llvm-svn: 193640
Diffstat (limited to 'clang/lib/Basic')
| -rw-r--r-- | clang/lib/Basic/Targets.cpp | 33 |
1 files changed, 27 insertions, 6 deletions
diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp index 669cf911729..dfeed93dd52 100644 --- a/clang/lib/Basic/Targets.cpp +++ b/clang/lib/Basic/Targets.cpp @@ -4802,9 +4802,9 @@ class MipsTargetInfoBase : public TargetInfo { NoDSP, DSP1, DSP2 } DspRev; bool HasMSA; - bool HasFP64; protected: + bool HasFP64; std::string ABI; public: @@ -4887,7 +4887,10 @@ public: NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin; } virtual bool hasFeature(StringRef Feature) const { - return Feature == "mips"; + return llvm::StringSwitch<bool>(Feature) + .Case("mips", true) + .Case("fp64", HasFP64) + .Default(false); } virtual BuiltinVaListKind getBuiltinVaListKind() const { return TargetInfo::VoidPtrBuiltinVaList; @@ -4994,6 +4997,8 @@ public: if (RegNo == 1) return 5; return -1; } + + virtual unsigned getStackAlignment() const = 0; }; const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = { @@ -5073,12 +5078,20 @@ public: Aliases = GCCRegAliases; NumAliases = llvm::array_lengthof(GCCRegAliases); } + + virtual unsigned getStackAlignment() const { + return HasFP64 ? 16 : 8; + } }; class Mips32EBTargetInfo : public Mips32TargetInfoBase { virtual void setDescriptionString() { - DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-" - "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32-S64"; + if (HasFP64) + DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-" + "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32-S128"; + else + DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-" + "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32-S64"; } public: @@ -5095,8 +5108,12 @@ public: class Mips32ELTargetInfo : public Mips32TargetInfoBase { virtual void setDescriptionString() { - DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-" - "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32-S64"; + if (HasFP64) + DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-" + "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32-S128"; + else + DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-" + "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32-S64"; } public: @@ -5200,6 +5217,10 @@ public: Aliases = GCCRegAliases; NumAliases = llvm::array_lengthof(GCCRegAliases); } + + virtual unsigned getStackAlignment() const { + return 16; + } }; class Mips64EBTargetInfo : public Mips64TargetInfoBase { |

