forked from OSchip/llvm-project
The inline asm operand modifier 'c' is suppose
to be generic across architectures. It has the following description in the gnu sources: Substitute immediate value without immediate syntax Several Architectures such as x86 have local implementations of operand modifier 'c' which go beyond the above description slightly. To make use of the generic modifiers without overriding local implementation one can make a call to the base class method for AsmPrinter::PrintAsmOperand() in the locally derived method's "default" case in the switch statement. That way if it is already defined locally the generic version will never get called. This change is needed when test/CodeGen/generic/asm-large-immediate.ll failed on a native Mips board. The test was assuming a generic implementation was in place. Affected files: lib/Target/Mips/MipsAsmPrinter.cpp: Changed the default case to call the base method. lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp Added 'c' to the switch cases. test/CodeGen/Mips/asm-large-immediate.ll Mips compiled version of the generic one Contributer: Jack Carter llvm-svn: 158925
This commit is contained in:
parent
beee2f10e0
commit
b2fd5f66b4
|
@ -409,9 +409,23 @@ void AsmPrinter::PrintSpecial(const MachineInstr *MI, raw_ostream &OS,
|
|||
/// instruction, using the specified assembler variant. Targets should
|
||||
/// override this to format as appropriate.
|
||||
bool AsmPrinter::PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,
|
||||
unsigned AsmVariant, const char *ExtraCode,
|
||||
raw_ostream &O) {
|
||||
// Target doesn't support this yet!
|
||||
unsigned AsmVariant, const char *ExtraCode,
|
||||
raw_ostream &O) {
|
||||
// Does this asm operand have a single letter operand modifier?
|
||||
if (ExtraCode && ExtraCode[0]) {
|
||||
if (ExtraCode[1] != 0) return true; // Unknown modifier.
|
||||
|
||||
const MachineOperand &MO = MI->getOperand(OpNo);
|
||||
switch (ExtraCode[0]) {
|
||||
default:
|
||||
return true; // Unknown modifier.
|
||||
case 'c': // Substitute immediate value without immediate syntax
|
||||
if ((MO.getType()) != MachineOperand::MO_Immediate)
|
||||
return true;
|
||||
O << MO.getImm();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -301,7 +301,8 @@ bool MipsAsmPrinter::PrintAsmOperand(const MachineInstr *MI, unsigned OpNum,
|
|||
const MachineOperand &MO = MI->getOperand(OpNum);
|
||||
switch (ExtraCode[0]) {
|
||||
default:
|
||||
return true; // Unknown modifier.
|
||||
// See if this is a generic print operand
|
||||
return AsmPrinter::PrintAsmOperand(MI,OpNum,AsmVariant,ExtraCode,O);
|
||||
case 'X': // hex const int
|
||||
if ((MO.getType()) != MachineOperand::MO_Immediate)
|
||||
return true;
|
||||
|
|
|
@ -0,0 +1,10 @@
|
|||
; RUNx: llc -march=mipsel < %s | grep 68719476738
|
||||
|
||||
; RUN: llc -march=mipsel < %s | FileCheck %s
|
||||
define void @test() {
|
||||
entry:
|
||||
; CHECK: /* result: 68719476738 */
|
||||
tail call void asm sideeffect "/* result: ${0:c} */", "i,~{dirflag},~{fpsr},~{flags}"( i64 68719476738 )
|
||||
ret void
|
||||
}
|
||||
|
Loading…
Reference in New Issue