mirror of
https://github.com/RPCSX/llvm.git
synced 2024-12-02 16:56:50 +00:00
MIR Serialization: Serialize immediate machine operands.
Reviewers: Duncan P. N. Exon Smith Differential Revision: http://reviews.llvm.org/D10573 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@240481 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
c2d796297f
commit
ac57f351bd
@ -33,7 +33,7 @@ public:
|
|||||||
|
|
||||||
bool isEOF() const { return Ptr == End; }
|
bool isEOF() const { return Ptr == End; }
|
||||||
|
|
||||||
char peek() const { return isEOF() ? 0 : *Ptr; }
|
char peek(unsigned I = 0) const { return End - Ptr <= I ? 0 : Ptr[I]; }
|
||||||
|
|
||||||
void advance() { ++Ptr; }
|
void advance() { ++Ptr; }
|
||||||
|
|
||||||
@ -77,6 +77,16 @@ static Cursor lexPercent(Cursor C, MIToken &Token) {
|
|||||||
return C;
|
return C;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static Cursor lexIntegerLiteral(Cursor C, MIToken &Token) {
|
||||||
|
auto Range = C;
|
||||||
|
C.advance();
|
||||||
|
while (isdigit(C.peek()))
|
||||||
|
C.advance();
|
||||||
|
StringRef StrVal = Range.upto(C);
|
||||||
|
Token = MIToken(MIToken::IntegerLiteral, StrVal, APSInt(StrVal));
|
||||||
|
return C;
|
||||||
|
}
|
||||||
|
|
||||||
static MIToken::TokenKind symbolToken(char C) {
|
static MIToken::TokenKind symbolToken(char C) {
|
||||||
switch (C) {
|
switch (C) {
|
||||||
case ',':
|
case ',':
|
||||||
@ -109,6 +119,8 @@ StringRef llvm::lexMIToken(
|
|||||||
return lexIdentifier(C, Token).remaining();
|
return lexIdentifier(C, Token).remaining();
|
||||||
if (Char == '%')
|
if (Char == '%')
|
||||||
return lexPercent(C, Token).remaining();
|
return lexPercent(C, Token).remaining();
|
||||||
|
if (isdigit(Char) || (Char == '-' && isdigit(C.peek(1))))
|
||||||
|
return lexIntegerLiteral(C, Token).remaining();
|
||||||
MIToken::TokenKind Kind = symbolToken(Char);
|
MIToken::TokenKind Kind = symbolToken(Char);
|
||||||
if (Kind != MIToken::Error)
|
if (Kind != MIToken::Error)
|
||||||
return lexSymbol(C, Kind, Token).remaining();
|
return lexSymbol(C, Kind, Token).remaining();
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
#ifndef LLVM_LIB_CODEGEN_MIRPARSER_MILEXER_H
|
#ifndef LLVM_LIB_CODEGEN_MIRPARSER_MILEXER_H
|
||||||
#define LLVM_LIB_CODEGEN_MIRPARSER_MILEXER_H
|
#define LLVM_LIB_CODEGEN_MIRPARSER_MILEXER_H
|
||||||
|
|
||||||
|
#include "llvm/ADT/APSInt.h"
|
||||||
#include "llvm/ADT/StringRef.h"
|
#include "llvm/ADT/StringRef.h"
|
||||||
#include "llvm/ADT/STLExtras.h"
|
#include "llvm/ADT/STLExtras.h"
|
||||||
#include <functional>
|
#include <functional>
|
||||||
@ -36,16 +37,23 @@ struct MIToken {
|
|||||||
|
|
||||||
// Identifier tokens
|
// Identifier tokens
|
||||||
Identifier,
|
Identifier,
|
||||||
NamedRegister
|
NamedRegister,
|
||||||
|
|
||||||
|
// Other tokens
|
||||||
|
IntegerLiteral
|
||||||
};
|
};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
TokenKind Kind;
|
TokenKind Kind;
|
||||||
StringRef Range;
|
StringRef Range;
|
||||||
|
APSInt IntVal;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
MIToken(TokenKind Kind, StringRef Range) : Kind(Kind), Range(Range) {}
|
MIToken(TokenKind Kind, StringRef Range) : Kind(Kind), Range(Range) {}
|
||||||
|
|
||||||
|
MIToken(TokenKind Kind, StringRef Range, const APSInt &IntVal)
|
||||||
|
: Kind(Kind), Range(Range), IntVal(IntVal) {}
|
||||||
|
|
||||||
TokenKind kind() const { return Kind; }
|
TokenKind kind() const { return Kind; }
|
||||||
|
|
||||||
bool isError() const { return Kind == Error; }
|
bool isError() const { return Kind == Error; }
|
||||||
@ -59,6 +67,8 @@ public:
|
|||||||
StringRef::iterator location() const { return Range.begin(); }
|
StringRef::iterator location() const { return Range.begin(); }
|
||||||
|
|
||||||
StringRef stringValue() const { return Range; }
|
StringRef stringValue() const { return Range; }
|
||||||
|
|
||||||
|
const APSInt &integerValue() const { return IntVal; }
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Consume a single machine instruction token in the given source and return
|
/// Consume a single machine instruction token in the given source and return
|
||||||
|
@ -57,6 +57,7 @@ public:
|
|||||||
|
|
||||||
bool parseRegister(unsigned &Reg);
|
bool parseRegister(unsigned &Reg);
|
||||||
bool parseRegisterOperand(MachineOperand &Dest, bool IsDef = false);
|
bool parseRegisterOperand(MachineOperand &Dest, bool IsDef = false);
|
||||||
|
bool parseImmediateOperand(MachineOperand &Dest);
|
||||||
bool parseMachineOperand(MachineOperand &Dest);
|
bool parseMachineOperand(MachineOperand &Dest);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -197,10 +198,23 @@ bool MIParser::parseRegisterOperand(MachineOperand &Dest, bool IsDef) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool MIParser::parseImmediateOperand(MachineOperand &Dest) {
|
||||||
|
assert(Token.is(MIToken::IntegerLiteral));
|
||||||
|
const APSInt &Int = Token.integerValue();
|
||||||
|
if (Int.getMinSignedBits() > 64)
|
||||||
|
// TODO: Replace this with an error when we can parse CIMM Machine Operands.
|
||||||
|
llvm_unreachable("Can't parse large integer literals yet!");
|
||||||
|
Dest = MachineOperand::CreateImm(Int.getExtValue());
|
||||||
|
lex();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
bool MIParser::parseMachineOperand(MachineOperand &Dest) {
|
bool MIParser::parseMachineOperand(MachineOperand &Dest) {
|
||||||
switch (Token.kind()) {
|
switch (Token.kind()) {
|
||||||
case MIToken::NamedRegister:
|
case MIToken::NamedRegister:
|
||||||
return parseRegisterOperand(Dest);
|
return parseRegisterOperand(Dest);
|
||||||
|
case MIToken::IntegerLiteral:
|
||||||
|
return parseImmediateOperand(Dest);
|
||||||
case MIToken::Error:
|
case MIToken::Error:
|
||||||
return true;
|
return true;
|
||||||
default:
|
default:
|
||||||
|
@ -159,6 +159,9 @@ void MIPrinter::print(const MachineOperand &Op, const TargetRegisterInfo *TRI) {
|
|||||||
printReg(Op.getReg(), OS, TRI);
|
printReg(Op.getReg(), OS, TRI);
|
||||||
// TODO: Print sub register.
|
// TODO: Print sub register.
|
||||||
break;
|
break;
|
||||||
|
case MachineOperand::MO_Immediate:
|
||||||
|
OS << Op.getImm();
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
// TODO: Print the other machine operands.
|
// TODO: Print the other machine operands.
|
||||||
llvm_unreachable("Can't print this machine operand at the moment");
|
llvm_unreachable("Can't print this machine operand at the moment");
|
||||||
|
38
test/CodeGen/MIR/X86/immediate-operands.mir
Normal file
38
test/CodeGen/MIR/X86/immediate-operands.mir
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
# RUN: llc -march=x86-64 -start-after branch-folder -stop-after branch-folder -o /dev/null %s | FileCheck %s
|
||||||
|
# This test ensures that the MIR parser parses immediate machine operands.
|
||||||
|
|
||||||
|
--- |
|
||||||
|
|
||||||
|
define i32 @foo() {
|
||||||
|
entry:
|
||||||
|
ret i32 42
|
||||||
|
}
|
||||||
|
|
||||||
|
define i32 @bar() {
|
||||||
|
entry:
|
||||||
|
ret i32 -11
|
||||||
|
}
|
||||||
|
|
||||||
|
...
|
||||||
|
---
|
||||||
|
# CHECK: name: foo
|
||||||
|
name: foo
|
||||||
|
body:
|
||||||
|
- name: entry
|
||||||
|
instructions:
|
||||||
|
# CHECK: - '%eax = MOV32ri 42'
|
||||||
|
# CHECK-NEXT: - 'RETQ %eax'
|
||||||
|
- '%eax = MOV32ri 42'
|
||||||
|
- 'RETQ %eax'
|
||||||
|
...
|
||||||
|
---
|
||||||
|
# CHECK: name: bar
|
||||||
|
name: bar
|
||||||
|
body:
|
||||||
|
- name: entry
|
||||||
|
instructions:
|
||||||
|
# CHECK: - '%eax = MOV32ri -11'
|
||||||
|
# CHECK-NEXT: - 'RETQ %eax'
|
||||||
|
- '%eax = MOV32ri -11'
|
||||||
|
- 'RETQ %eax'
|
||||||
|
...
|
Loading…
Reference in New Issue
Block a user