mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-26 05:32:25 +00:00
[mips] Correct testcase for .set at=$reg and emit the new warnings for numeric registers too.
Summary: Remove the XFAIL added in my previous commit and correct the test such that it correctly tests the expansion of the assembler temporary. Also added a test to check that $at is always $1 when written by the user. Corrected the new assembler temporary warnings so that they are emitted for numeric registers too. Differential Revision: http://llvm-reviews.chandlerc.com/D3169 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@204711 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
c141b331b9
commit
c7e1663c24
@ -250,6 +250,9 @@ class MipsAsmParser : public MCTargetAsmParser {
|
||||
|
||||
int getATReg();
|
||||
|
||||
// Warn if RegNo is the current assembler temporary.
|
||||
void warnIfAssemblerTemporary(int RegNo);
|
||||
|
||||
bool processInstruction(MCInst &Inst, SMLoc IDLoc,
|
||||
SmallVectorImpl<MCInst> &Instructions);
|
||||
|
||||
@ -982,19 +985,23 @@ bool MipsAsmParser::MatchAndEmitInstruction(
|
||||
return true;
|
||||
}
|
||||
|
||||
void MipsAsmParser::warnIfAssemblerTemporary(int RegNo) {
|
||||
if ((RegNo != 0) && ((int)Options.getATRegNum() == RegNo)) {
|
||||
if (RegNo == 1)
|
||||
Warning(getLexer().getLoc(), "Used $at without \".set noat\"");
|
||||
else
|
||||
Warning(getLexer().getLoc(), Twine("Used $") + Twine(RegNo) +
|
||||
" with \".set at=$" + Twine(RegNo) +
|
||||
"\"");
|
||||
}
|
||||
}
|
||||
|
||||
int MipsAsmParser::matchCPURegisterName(StringRef Name) {
|
||||
int CC;
|
||||
|
||||
if (Name == "at") {
|
||||
// If noat is set then the at register is 0, otherwise it's defined as a
|
||||
// specific register. Warn if the assembler is free to use it.
|
||||
if (Options.getATRegNum() != 0)
|
||||
Warning(getLexer().getLoc(), "Used $at without \".set noat\"");
|
||||
return 1;
|
||||
}
|
||||
|
||||
CC = StringSwitch<unsigned>(Name)
|
||||
.Case("zero", 0)
|
||||
.Case("at", 1)
|
||||
.Case("a0", 4)
|
||||
.Case("a1", 5)
|
||||
.Case("a2", 6)
|
||||
@ -1044,9 +1051,7 @@ int MipsAsmParser::matchCPURegisterName(StringRef Name) {
|
||||
.Case("s8", 30)
|
||||
.Default(-1);
|
||||
|
||||
if ((CC != 0) && ((int)Options.getATRegNum() == CC))
|
||||
Warning(getLexer().getLoc(), Twine("Used $") + Name + " with \".set at=$"
|
||||
+ Name + "\"");
|
||||
warnIfAssemblerTemporary(CC);
|
||||
|
||||
return CC;
|
||||
}
|
||||
@ -1199,6 +1204,9 @@ int MipsAsmParser::matchRegisterByNumber(unsigned RegNum, unsigned RegClass) {
|
||||
getContext().getRegisterInfo()->getRegClass(RegClass).getNumRegs())
|
||||
return -1;
|
||||
|
||||
if (RegClass == Mips::GPR32RegClassID || RegClass == Mips::GPR64RegClassID)
|
||||
warnIfAssemblerTemporary(RegNum);
|
||||
|
||||
return getReg(RegClass, RegNum);
|
||||
}
|
||||
|
||||
|
39
test/MC/Mips/set-at-directive-explicit-at.s
Normal file
39
test/MC/Mips/set-at-directive-explicit-at.s
Normal file
@ -0,0 +1,39 @@
|
||||
# RUN: llvm-mc %s -triple=mipsel-unknown-linux -show-encoding -mcpu=mips32r2 \
|
||||
# RUN: 2>%t1 | FileCheck %s
|
||||
# RUN: FileCheck -check-prefix=WARNINGS %s < %t1
|
||||
# Check that the assembler can handle the documented syntax
|
||||
# for ".set at" and set the correct value. The correct value for $at is always
|
||||
# $1 when written by the user.
|
||||
.text
|
||||
foo:
|
||||
# CHECK: jr $1 # encoding: [0x08,0x00,0x20,0x00]
|
||||
# WARNINGS: :[[@LINE+2]]:12: warning: Used $at without ".set noat"
|
||||
.set at=$1
|
||||
jr $at
|
||||
|
||||
# CHECK: jr $1 # encoding: [0x08,0x00,0x20,0x00]
|
||||
# WARNINGS: :[[@LINE+2]]:12: warning: Used $at without ".set noat"
|
||||
.set at=$1
|
||||
jr $1
|
||||
# WARNINGS-NOT: warning: Used $at without ".set noat"
|
||||
|
||||
# CHECK: jr $1 # encoding: [0x08,0x00,0x20,0x00]
|
||||
.set at=$2
|
||||
jr $at
|
||||
# CHECK: jr $1 # encoding: [0x08,0x00,0x20,0x00]
|
||||
.set at=$3
|
||||
jr $at
|
||||
# CHECK: jr $1 # encoding: [0x08,0x00,0x20,0x00]
|
||||
.set noat
|
||||
jr $at
|
||||
|
||||
# CHECK: jr $16 # encoding: [0x08,0x00,0x00,0x02]
|
||||
# WARNINGS: :[[@LINE+2]]:12: warning: Used $16 with ".set at=$16"
|
||||
.set at=$16
|
||||
jr $s0
|
||||
|
||||
# CHECK: jr $16 # encoding: [0x08,0x00,0x00,0x02]
|
||||
# WARNINGS: :[[@LINE+2]]:12: warning: Used $16 with ".set at=$16"
|
||||
.set at=$16
|
||||
jr $16
|
||||
# WARNINGS-NOT: warning
|
@ -2,130 +2,160 @@
|
||||
# RUN: FileCheck %s
|
||||
# Check that the assembler can handle the documented syntax
|
||||
# for ".set at" and set the correct value.
|
||||
# XFAIL:
|
||||
.text
|
||||
foo:
|
||||
# CHECK: jr $1 # encoding: [0x08,0x00,0x20,0x00]
|
||||
# CHECK: lui $1, 1
|
||||
# CHECK: addu $1, $1, $2
|
||||
# CHECK: lw $2, 0($1)
|
||||
.set at=$1
|
||||
jr $at
|
||||
nop
|
||||
# CHECK: jr $2 # encoding: [0x08,0x00,0x40,0x00]
|
||||
lw $2, 65536($2)
|
||||
# CHECK: lui $2, 1
|
||||
# CHECK: addu $2, $2, $1
|
||||
# CHECK: lw $1, 0($2)
|
||||
.set at=$2
|
||||
jr $at
|
||||
nop
|
||||
# CHECK: jr $3 # encoding: [0x08,0x00,0x60,0x00]
|
||||
lw $1, 65536($1)
|
||||
# CHECK: lui $3, 1
|
||||
# CHECK: addu $3, $3, $1
|
||||
# CHECK: lw $1, 0($3)
|
||||
.set at=$3
|
||||
jr $at
|
||||
nop
|
||||
# CHECK: jr $4 # encoding: [0x08,0x00,0x80,0x00]
|
||||
lw $1, 65536($1)
|
||||
# CHECK: lui $4, 1
|
||||
# CHECK: addu $4, $4, $1
|
||||
# CHECK: lw $1, 0($4)
|
||||
.set at=$a0
|
||||
jr $at
|
||||
nop
|
||||
# CHECK: jr $5 # encoding: [0x08,0x00,0xa0,0x00]
|
||||
lw $1, 65536($1)
|
||||
# CHECK: lui $5, 1
|
||||
# CHECK: addu $5, $5, $1
|
||||
# CHECK: lw $1, 0($5)
|
||||
.set at=$a1
|
||||
jr $at
|
||||
nop
|
||||
# CHECK: jr $6 # encoding: [0x08,0x00,0xc0,0x00]
|
||||
lw $1, 65536($1)
|
||||
# CHECK: lui $6, 1
|
||||
# CHECK: addu $6, $6, $1
|
||||
# CHECK: lw $1, 0($6)
|
||||
.set at=$a2
|
||||
jr $at
|
||||
nop
|
||||
# CHECK: jr $7 # encoding: [0x08,0x00,0xe0,0x00]
|
||||
lw $1, 65536($1)
|
||||
# CHECK: lui $7, 1
|
||||
# CHECK: addu $7, $7, $1
|
||||
# CHECK: lw $1, 0($7)
|
||||
.set at=$a3
|
||||
jr $at
|
||||
nop
|
||||
# CHECK: jr $8 # encoding: [0x08,0x00,0x00,0x01]
|
||||
lw $1, 65536($1)
|
||||
# CHECK: lui $8, 1
|
||||
# CHECK: addu $8, $8, $1
|
||||
# CHECK: lw $1, 0($8)
|
||||
.set at=$8
|
||||
jr $at
|
||||
nop
|
||||
# CHECK: jr $9 # encoding: [0x08,0x00,0x20,0x01]
|
||||
lw $1, 65536($1)
|
||||
# CHECK: lui $9, 1
|
||||
# CHECK: addu $9, $9, $1
|
||||
# CHECK: lw $1, 0($9)
|
||||
.set at=$9
|
||||
jr $at
|
||||
nop
|
||||
# CHECK: jr $10 # encoding: [0x08,0x00,0x40,0x01]
|
||||
lw $1, 65536($1)
|
||||
# CHECK: lui $10, 1
|
||||
# CHECK: addu $10, $10, $1
|
||||
# CHECK: lw $1, 0($10)
|
||||
.set at=$10
|
||||
jr $at
|
||||
nop
|
||||
# CHECK: jr $11 # encoding: [0x08,0x00,0x60,0x01]
|
||||
lw $1, 65536($1)
|
||||
# CHECK: lui $11, 1
|
||||
# CHECK: addu $11, $11, $1
|
||||
# CHECK: lw $1, 0($11)
|
||||
.set at=$11
|
||||
jr $at
|
||||
nop
|
||||
# CHECK: jr $12 # encoding: [0x08,0x00,0x80,0x01]
|
||||
lw $1, 65536($1)
|
||||
# CHECK: lui $12, 1
|
||||
# CHECK: addu $12, $12, $1
|
||||
# CHECK: lw $1, 0($12)
|
||||
.set at=$12
|
||||
jr $at
|
||||
nop
|
||||
# CHECK: jr $13 # encoding: [0x08,0x00,0xa0,0x01]
|
||||
lw $1, 65536($1)
|
||||
# CHECK: lui $13, 1
|
||||
# CHECK: addu $13, $13, $1
|
||||
# CHECK: lw $1, 0($13)
|
||||
.set at=$13
|
||||
jr $at
|
||||
nop
|
||||
# CHECK: jr $14 # encoding: [0x08,0x00,0xc0,0x01]
|
||||
lw $1, 65536($1)
|
||||
# CHECK: lui $14, 1
|
||||
# CHECK: addu $14, $14, $1
|
||||
# CHECK: lw $1, 0($14)
|
||||
.set at=$14
|
||||
jr $at
|
||||
nop
|
||||
# CHECK: jr $15 # encoding: [0x08,0x00,0xe0,0x01]
|
||||
lw $1, 65536($1)
|
||||
# CHECK: lui $15, 1
|
||||
# CHECK: addu $15, $15, $1
|
||||
# CHECK: lw $1, 0($15)
|
||||
.set at=$15
|
||||
jr $at
|
||||
nop
|
||||
# CHECK: jr $16 # encoding: [0x08,0x00,0x00,0x02]
|
||||
lw $1, 65536($1)
|
||||
# CHECK: lui $16, 1
|
||||
# CHECK: addu $16, $16, $1
|
||||
# CHECK: lw $1, 0($16)
|
||||
.set at=$s0
|
||||
jr $at
|
||||
nop
|
||||
# CHECK: jr $17 # encoding: [0x08,0x00,0x20,0x02]
|
||||
lw $1, 65536($1)
|
||||
# CHECK: lui $17, 1
|
||||
# CHECK: addu $17, $17, $1
|
||||
# CHECK: lw $1, 0($17)
|
||||
.set at=$s1
|
||||
jr $at
|
||||
nop
|
||||
# CHECK: jr $18 # encoding: [0x08,0x00,0x40,0x02]
|
||||
lw $1, 65536($1)
|
||||
# CHECK: lui $18, 1
|
||||
# CHECK: addu $18, $18, $1
|
||||
# CHECK: lw $1, 0($18)
|
||||
.set at=$s2
|
||||
jr $at
|
||||
nop
|
||||
# CHECK: jr $19 # encoding: [0x08,0x00,0x60,0x02]
|
||||
lw $1, 65536($1)
|
||||
# CHECK: lui $19, 1
|
||||
# CHECK: addu $19, $19, $1
|
||||
# CHECK: lw $1, 0($19)
|
||||
.set at=$s3
|
||||
jr $at
|
||||
nop
|
||||
# CHECK: jr $20 # encoding: [0x08,0x00,0x80,0x02]
|
||||
lw $1, 65536($1)
|
||||
# CHECK: lui $20, 1
|
||||
# CHECK: addu $20, $20, $1
|
||||
# CHECK: lw $1, 0($20)
|
||||
.set at=$s4
|
||||
jr $at
|
||||
nop
|
||||
# CHECK: jr $21 # encoding: [0x08,0x00,0xa0,0x02]
|
||||
lw $1, 65536($1)
|
||||
# CHECK: lui $21, 1
|
||||
# CHECK: addu $21, $21, $1
|
||||
# CHECK: lw $1, 0($21)
|
||||
.set at=$s5
|
||||
jr $at
|
||||
nop
|
||||
# CHECK: jr $22 # encoding: [0x08,0x00,0xc0,0x02]
|
||||
lw $1, 65536($1)
|
||||
# CHECK: lui $22, 1
|
||||
# CHECK: addu $22, $22, $1
|
||||
# CHECK: lw $1, 0($22)
|
||||
.set at=$s6
|
||||
jr $at
|
||||
nop
|
||||
# CHECK: jr $23 # encoding: [0x08,0x00,0xe0,0x02]
|
||||
lw $1, 65536($1)
|
||||
# CHECK: lui $23, 1
|
||||
# CHECK: addu $23, $23, $1
|
||||
# CHECK: lw $1, 0($23)
|
||||
.set at=$s7
|
||||
jr $at
|
||||
nop
|
||||
# CHECK: jr $24 # encoding: [0x08,0x00,0x00,0x03]
|
||||
lw $1, 65536($1)
|
||||
# CHECK: lui $24, 1
|
||||
# CHECK: addu $24, $24, $1
|
||||
# CHECK: lw $1, 0($24)
|
||||
.set at=$24
|
||||
jr $at
|
||||
nop
|
||||
# CHECK: jr $25 # encoding: [0x08,0x00,0x20,0x03]
|
||||
lw $1, 65536($1)
|
||||
# CHECK: lui $25, 1
|
||||
# CHECK: addu $25, $25, $1
|
||||
# CHECK: lw $1, 0($25)
|
||||
.set at=$25
|
||||
jr $at
|
||||
nop
|
||||
# CHECK: jr $26 # encoding: [0x08,0x00,0x40,0x03]
|
||||
lw $1, 65536($1)
|
||||
# CHECK: lui $26, 1
|
||||
# CHECK: addu $26, $26, $1
|
||||
# CHECK: lw $1, 0($26)
|
||||
.set at=$26
|
||||
jr $at
|
||||
nop
|
||||
# CHECK: jr $27 # encoding: [0x08,0x00,0x60,0x03]
|
||||
lw $1, 65536($1)
|
||||
# CHECK: lui $27, 1
|
||||
# CHECK: addu $27, $27, $1
|
||||
# CHECK: lw $1, 0($27)
|
||||
.set at=$27
|
||||
jr $at
|
||||
nop
|
||||
# CHECK: jr $gp # encoding: [0x08,0x00,0x80,0x03]
|
||||
lw $1, 65536($1)
|
||||
# CHECK: lui $gp, 1
|
||||
# CHECK: addu $gp, $gp, $1
|
||||
# CHECK: lw $1, 0($gp)
|
||||
.set at=$gp
|
||||
jr $at
|
||||
nop
|
||||
# CHECK: jr $fp # encoding: [0x08,0x00,0xc0,0x03]
|
||||
lw $1, 65536($1)
|
||||
# CHECK: lui $fp, 1
|
||||
# CHECK: addu $fp, $fp, $1
|
||||
# CHECK: lw $1, 0($fp)
|
||||
.set at=$fp
|
||||
jr $at
|
||||
nop
|
||||
# CHECK: jr $sp # encoding: [0x08,0x00,0xa0,0x03]
|
||||
lw $1, 65536($1)
|
||||
# CHECK: lui $sp, 1
|
||||
# CHECK: addu $sp, $sp, $1
|
||||
# CHECK: lw $1, 0($sp)
|
||||
.set at=$sp
|
||||
jr $at
|
||||
nop
|
||||
# CHECK: jr $ra # encoding: [0x08,0x00,0xe0,0x03]
|
||||
lw $1, 65536($1)
|
||||
# CHECK: lui $ra, 1
|
||||
# CHECK: addu $ra, $ra, $1
|
||||
# CHECK: lw $1, 0($ra)
|
||||
.set at=$ra
|
||||
jr $at
|
||||
nop
|
||||
lw $1, 65536($1)
|
||||
|
Loading…
Reference in New Issue
Block a user