mirror of
https://github.com/RPCS3/llvm.git
synced 2025-04-17 05:20:32 +00:00
[mips] Fix sync instruction definition
The 'sync' instruction for MIPS was defined in MIPS-II as taking no operands. MIPS32 extended the define of 'sync' as taking an optional unsigned 5 bit immediate. This patch correct the definition of sync so that it is accepted with an operand of 0 or no operand for MIPS-II to MIPS-V, and a 5 bit unsigned immediate for MIPS32 and later revisions. Additionally a clear error is given when the MIPS32 version of sync is used when targeting pre MIPS32. This partially resolves PR/30714. Thanks to Daniel Sanders for reporting this issue! Reveiwers: vkalintiris Differential Revision: https://reviews.llvm.org/D25672 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@284483 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
58be60c483
commit
8e2c689fe9
@ -404,6 +404,7 @@ public:
|
||||
Match_RequiresDifferentOperands,
|
||||
Match_RequiresNoZeroRegister,
|
||||
Match_RequiresSameSrcAndDst,
|
||||
Match_NonZeroOperandForSync,
|
||||
#define GET_OPERAND_DIAGNOSTIC_TYPES
|
||||
#include "MipsGenAsmMatcher.inc"
|
||||
#undef GET_OPERAND_DIAGNOSTIC_TYPES
|
||||
@ -3955,6 +3956,10 @@ unsigned MipsAsmParser::checkTargetMatchPredicate(MCInst &Inst) {
|
||||
if (Inst.getOperand(0).getReg() == Inst.getOperand(2).getReg())
|
||||
return Match_RequiresDifferentSrcAndDst;
|
||||
return Match_Success;
|
||||
case Mips::SYNC:
|
||||
if (Inst.getOperand(0).getImm() != 0 && !hasMips32())
|
||||
return Match_NonZeroOperandForSync;
|
||||
return Match_Success;
|
||||
// As described the MIPSR6 spec, the compact branches that compare registers
|
||||
// must:
|
||||
// a) Not use the zero register.
|
||||
@ -4052,6 +4057,8 @@ bool MipsAsmParser::MatchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode,
|
||||
|
||||
return Error(ErrorLoc, "invalid operand for instruction");
|
||||
}
|
||||
case Match_NonZeroOperandForSync:
|
||||
return Error(IDLoc, "s-type must be zero or unspecified for pre-MIPS32 ISAs");
|
||||
case Match_MnemonicFail:
|
||||
return Error(IDLoc, "invalid instruction");
|
||||
case Match_RequiresDifferentSrcAndDst:
|
||||
|
@ -1876,8 +1876,7 @@ let DecoderNamespace = "COP3_" in {
|
||||
}
|
||||
}
|
||||
|
||||
def SYNC : MMRel, StdMMR6Rel, SYNC_FT<"sync">, SYNC_FM,
|
||||
ISA_MIPS32;
|
||||
def SYNC : MMRel, StdMMR6Rel, SYNC_FT<"sync">, SYNC_FM, ISA_MIPS2;
|
||||
def SYNCI : MMRel, StdMMR6Rel, SYNCI_FT<"synci">, SYNCI_FM, ISA_MIPS32R2;
|
||||
|
||||
let AdditionalPredicates = [NotInMicroMips] in {
|
||||
|
@ -40,5 +40,4 @@
|
||||
msubu $15,$a1 # CHECK: :[[@LINE]]:{{[0-9]+}}: error: instruction requires a CPU feature not currently enabled
|
||||
mtc0 $9,$29,3 # CHECK: :[[@LINE]]:{{[0-9]+}}: error: instruction requires a CPU feature not currently enabled
|
||||
mul $s0,$s4,$at # CHECK: :[[@LINE]]:{{[0-9]+}}: error: instruction requires a CPU feature not currently enabled
|
||||
sync 0 # CHECK: :[[@LINE]]:{{[0-9]+}}: error: instruction requires a CPU feature not currently enabled
|
||||
sync 1 # CHECK: :[[@LINE]]:{{[0-9]+}}: error: instruction requires a CPU feature not currently enabled
|
||||
sync 1 # CHECK: :[[@LINE]]:{{[0-9]+}}: error: s-type must be zero or unspecified for pre-MIPS32 ISAs
|
||||
|
@ -159,6 +159,7 @@ a:
|
||||
swl $15,13694($s3)
|
||||
swr $s1,-26590($14)
|
||||
sync # CHECK: sync # encoding: [0x00,0x00,0x00,0x0f]
|
||||
sync 0 # CHECK: sync # encoding: [0x00,0x00,0x00,0x0f]
|
||||
syscall # CHECK: syscall # encoding: [0x00,0x00,0x00,0x0c]
|
||||
syscall 256 # CHECK: syscall 256 # encoding: [0x00,0x00,0x40,0x0c]
|
||||
teq $0,$3 # CHECK: teq $zero, $3 # encoding: [0x00,0x03,0x00,0x34]
|
||||
|
@ -6,5 +6,4 @@
|
||||
|
||||
.set noat
|
||||
|
||||
sync 0 # CHECK: :[[@LINE]]:{{[0-9]+}}: error: instruction requires a CPU feature not currently enabled
|
||||
sync 1 # CHECK: :[[@LINE]]:{{[0-9]+}}: error: instruction requires a CPU feature not currently enabled
|
||||
sync 1 # CHECK: :[[@LINE]]:{{[0-9]+}}: error: s-type must be zero or unspecified for pre-MIPS32 ISAs
|
||||
|
@ -223,6 +223,7 @@ a:
|
||||
swl $15,13694($s3)
|
||||
swr $s1,-26590($14)
|
||||
sync # CHECK: sync # encoding: [0x00,0x00,0x00,0x0f]
|
||||
sync 0 # CHECK: sync # encoding: [0x00,0x00,0x00,0x0f]
|
||||
syscall # CHECK: syscall # encoding: [0x00,0x00,0x00,0x0c]
|
||||
syscall 256 # CHECK: syscall 256 # encoding: [0x00,0x00,0x40,0x0c]
|
||||
teq $0,$3 # CHECK: teq $zero, $3 # encoding: [0x00,0x03,0x00,0x34]
|
||||
|
@ -6,5 +6,4 @@
|
||||
|
||||
.set noat
|
||||
|
||||
sync 0 # CHECK: :[[@LINE]]:{{[0-9]+}}: error: instruction requires a CPU feature not currently enabled
|
||||
sync 1 # CHECK: :[[@LINE]]:{{[0-9]+}}: error: instruction requires a CPU feature not currently enabled
|
||||
sync 1 # CHECK: :[[@LINE]]:{{[0-9]+}}: error: s-type must be zero or unspecified for pre-MIPS32 ISAs
|
||||
|
@ -256,6 +256,7 @@ a:
|
||||
swr $s1,-26590($14)
|
||||
swxc1 $f19,$12($k0)
|
||||
sync # CHECK: sync # encoding: [0x00,0x00,0x00,0x0f]
|
||||
sync 0 # CHECK: sync # encoding: [0x00,0x00,0x00,0x0f]
|
||||
syscall # CHECK: syscall # encoding: [0x00,0x00,0x00,0x0c]
|
||||
syscall 256 # CHECK: syscall 256 # encoding: [0x00,0x00,0x40,0x0c]
|
||||
teq $0,$3 # CHECK: teq $zero, $3 # encoding: [0x00,0x03,0x00,0x34]
|
||||
|
@ -6,5 +6,4 @@
|
||||
|
||||
.set noat
|
||||
|
||||
sync 0 # CHECK: :[[@LINE]]:{{[0-9]+}}: error: instruction requires a CPU feature not currently enabled
|
||||
sync 1 # CHECK: :[[@LINE]]:{{[0-9]+}}: error: instruction requires a CPU feature not currently enabled
|
||||
sync 1 # CHECK: :[[@LINE]]:{{[0-9]+}}: error: s-type must be zero or unspecified for pre-MIPS32 ISAs
|
||||
|
@ -258,6 +258,7 @@ a:
|
||||
swr $s1,-26590($14)
|
||||
swxc1 $f19,$12($k0)
|
||||
sync # CHECK: sync # encoding: [0x00,0x00,0x00,0x0f]
|
||||
sync 0 # CHECK: sync # encoding: [0x00,0x00,0x00,0x0f]
|
||||
syscall # CHECK: syscall # encoding: [0x00,0x00,0x00,0x0c]
|
||||
syscall 256 # CHECK: syscall 256 # encoding: [0x00,0x00,0x40,0x0c]
|
||||
teq $0,$3 # CHECK: teq $zero, $3 # encoding: [0x00,0x03,0x00,0x34]
|
||||
|
Loading…
x
Reference in New Issue
Block a user