mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 04:30:23 +00:00
[mips] [IAS] Add support for the .set softfloat/hardfloat directives.
Summary: These directives are used to set the current value of the SoftFloat feature. Reviewers: dsanders Reviewed By: dsanders Subscribers: llvm-commits, mpf Differential Revision: http://reviews.llvm.org/D9074 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@238813 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
d929045eb5
commit
a5f14070fa
@ -247,6 +247,8 @@ class MipsAsmParser : public MCTargetAsmParser {
|
||||
bool parseSetFpDirective();
|
||||
bool parseSetPopDirective();
|
||||
bool parseSetPushDirective();
|
||||
bool parseSetSoftFloatDirective();
|
||||
bool parseSetHardFloatDirective();
|
||||
|
||||
bool parseSetAssignment();
|
||||
|
||||
@ -3621,6 +3623,28 @@ bool MipsAsmParser::parseSetPushDirective() {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool MipsAsmParser::parseSetSoftFloatDirective() {
|
||||
MCAsmParser &Parser = getParser();
|
||||
Parser.Lex();
|
||||
if (getLexer().isNot(AsmToken::EndOfStatement))
|
||||
return reportParseError("unexpected token, expected end of statement");
|
||||
|
||||
setFeatureBits(Mips::FeatureSoftFloat, "soft-float");
|
||||
getTargetStreamer().emitDirectiveSetSoftFloat();
|
||||
return false;
|
||||
}
|
||||
|
||||
bool MipsAsmParser::parseSetHardFloatDirective() {
|
||||
MCAsmParser &Parser = getParser();
|
||||
Parser.Lex();
|
||||
if (getLexer().isNot(AsmToken::EndOfStatement))
|
||||
return reportParseError("unexpected token, expected end of statement");
|
||||
|
||||
clearFeatureBits(Mips::FeatureSoftFloat, "soft-float");
|
||||
getTargetStreamer().emitDirectiveSetHardFloat();
|
||||
return false;
|
||||
}
|
||||
|
||||
bool MipsAsmParser::parseSetAssignment() {
|
||||
StringRef Name;
|
||||
const MCExpr *Value;
|
||||
@ -3985,6 +4009,10 @@ bool MipsAsmParser::parseDirectiveSet() {
|
||||
return parseSetMsaDirective();
|
||||
} else if (Tok.getString() == "nomsa") {
|
||||
return parseSetNoMsaDirective();
|
||||
} else if (Tok.getString() == "softfloat") {
|
||||
return parseSetSoftFloatDirective();
|
||||
} else if (Tok.getString() == "hardfloat") {
|
||||
return parseSetHardFloatDirective();
|
||||
} else {
|
||||
// It is just an identifier, look for an assignment.
|
||||
parseSetAssignment();
|
||||
|
@ -81,6 +81,12 @@ void MipsTargetStreamer::emitDirectiveSetMips64R5() { forbidModuleDirective(); }
|
||||
void MipsTargetStreamer::emitDirectiveSetMips64R6() { forbidModuleDirective(); }
|
||||
void MipsTargetStreamer::emitDirectiveSetPop() { forbidModuleDirective(); }
|
||||
void MipsTargetStreamer::emitDirectiveSetPush() { forbidModuleDirective(); }
|
||||
void MipsTargetStreamer::emitDirectiveSetSoftFloat() {
|
||||
forbidModuleDirective();
|
||||
}
|
||||
void MipsTargetStreamer::emitDirectiveSetHardFloat() {
|
||||
forbidModuleDirective();
|
||||
}
|
||||
void MipsTargetStreamer::emitDirectiveSetDsp() { forbidModuleDirective(); }
|
||||
void MipsTargetStreamer::emitDirectiveSetNoDsp() { forbidModuleDirective(); }
|
||||
void MipsTargetStreamer::emitDirectiveCpLoad(unsigned RegNo) {}
|
||||
@ -308,6 +314,16 @@ void MipsTargetAsmStreamer::emitDirectiveSetPush() {
|
||||
MipsTargetStreamer::emitDirectiveSetPush();
|
||||
}
|
||||
|
||||
void MipsTargetAsmStreamer::emitDirectiveSetSoftFloat() {
|
||||
OS << "\t.set\tsoftfloat\n";
|
||||
MipsTargetStreamer::emitDirectiveSetSoftFloat();
|
||||
}
|
||||
|
||||
void MipsTargetAsmStreamer::emitDirectiveSetHardFloat() {
|
||||
OS << "\t.set\thardfloat\n";
|
||||
MipsTargetStreamer::emitDirectiveSetHardFloat();
|
||||
}
|
||||
|
||||
// Print a 32 bit hex number with all numbers.
|
||||
static void printHex32(unsigned Value, raw_ostream &OS) {
|
||||
OS << "0x";
|
||||
|
@ -72,6 +72,8 @@ public:
|
||||
virtual void emitDirectiveSetNoDsp();
|
||||
virtual void emitDirectiveSetPop();
|
||||
virtual void emitDirectiveSetPush();
|
||||
virtual void emitDirectiveSetSoftFloat();
|
||||
virtual void emitDirectiveSetHardFloat();
|
||||
|
||||
// PIC support
|
||||
virtual void emitDirectiveCpLoad(unsigned RegNo);
|
||||
@ -188,6 +190,8 @@ public:
|
||||
void emitDirectiveSetNoDsp() override;
|
||||
void emitDirectiveSetPop() override;
|
||||
void emitDirectiveSetPush() override;
|
||||
void emitDirectiveSetSoftFloat() override;
|
||||
void emitDirectiveSetHardFloat() override;
|
||||
|
||||
// PIC support
|
||||
void emitDirectiveCpLoad(unsigned RegNo) override;
|
||||
|
14
test/MC/Mips/set-softfloat-hardfloat-bad.s
Normal file
14
test/MC/Mips/set-softfloat-hardfloat-bad.s
Normal file
@ -0,0 +1,14 @@
|
||||
# RUN: not llvm-mc %s -triple=mips-unknown-linux -mcpu=mips32 -mattr=+soft-float 2>%t1
|
||||
# RUN: FileCheck %s < %t1
|
||||
|
||||
.set hardfloat
|
||||
add.s $f2, $f2, $f2
|
||||
# CHECK-NOT: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
|
||||
sub.s $f2, $f2, $f2
|
||||
# CHECK-NOT: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
|
||||
|
||||
.set softfloat
|
||||
add.s $f2, $f2, $f2
|
||||
# CHECK: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
|
||||
sub.s $f2, $f2, $f2
|
||||
# CHECK: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
|
12
test/MC/Mips/set-softfloat-hardfloat.s
Normal file
12
test/MC/Mips/set-softfloat-hardfloat.s
Normal file
@ -0,0 +1,12 @@
|
||||
# RUN: llvm-mc %s -triple=mips-unknown-linux -mcpu=mips32r2 -mattr=+soft-float | \
|
||||
# RUN: FileCheck %s
|
||||
|
||||
.set hardfloat
|
||||
add.s $f2, $f2, $f2
|
||||
sub.s $f2, $f2, $f2
|
||||
.set softfloat
|
||||
|
||||
# CHECK: .set hardfloat
|
||||
# CHECK: add.s $f2, $f2, $f2
|
||||
# CHECK: sub.s $f2, $f2, $f2
|
||||
# CHECK: .set softfloat
|
Loading…
Reference in New Issue
Block a user