mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-28 06:32:09 +00:00
X86: teach X86TargetLowering about L,M,O constraints
Teach the ISelLowering for X86 about the L,M,O target specific constraints. Although, for the moment, clang performs constraint validation and prevents passing along inline asm which may have immediate constant constraints violated, the backend should be able to cope with the invalid inline asm a bit better. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@225596 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
5e3c87ee1a
commit
776673ea09
@ -26255,6 +26255,23 @@ void X86TargetLowering::LowerAsmOperandForConstraint(SDValue Op,
|
||||
}
|
||||
}
|
||||
return;
|
||||
case 'L':
|
||||
if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Op)) {
|
||||
if (C->getZExtValue() == 0xff || C->getZExtValue() == 0xffff ||
|
||||
(Subtarget->is64Bit() && C->getZExtValue() == 0xffffffff)) {
|
||||
Result = DAG.getTargetConstant(C->getSExtValue(), Op.getValueType());
|
||||
break;
|
||||
}
|
||||
}
|
||||
return;
|
||||
case 'M':
|
||||
if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Op)) {
|
||||
if (C->getZExtValue() <= 3) {
|
||||
Result = DAG.getTargetConstant(C->getZExtValue(), Op.getValueType());
|
||||
break;
|
||||
}
|
||||
}
|
||||
return;
|
||||
case 'N':
|
||||
if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Op)) {
|
||||
if (C->getZExtValue() <= 255) {
|
||||
@ -26263,6 +26280,14 @@ void X86TargetLowering::LowerAsmOperandForConstraint(SDValue Op,
|
||||
}
|
||||
}
|
||||
return;
|
||||
case 'O':
|
||||
if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Op)) {
|
||||
if (C->getZExtValue() <= 127) {
|
||||
Result = DAG.getTargetConstant(C->getZExtValue(), Op.getValueType());
|
||||
break;
|
||||
}
|
||||
}
|
||||
return;
|
||||
case 'e': {
|
||||
// 32-bit signed value
|
||||
if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Op)) {
|
||||
|
34
test/CodeGen/X86/x86-inline-asm-validation.ll
Normal file
34
test/CodeGen/X86/x86-inline-asm-validation.ll
Normal file
@ -0,0 +1,34 @@
|
||||
; RUN: llc -mtriple i686-gnu -filetype asm -o - %s 2>&1 | FileCheck %s
|
||||
|
||||
define void @test_L_ff() {
|
||||
entry:
|
||||
call void asm "", "L,~{dirflag},~{fpsr},~{flags}"(i32 255)
|
||||
ret void
|
||||
}
|
||||
|
||||
; CHECK-NOT: error: invalid operand for inline asm constraint 'L'
|
||||
|
||||
define void @test_L_ffff() {
|
||||
entry:
|
||||
call void asm "", "L,~{dirflag},~{fpsr},~{flags}"(i32 65535)
|
||||
ret void
|
||||
}
|
||||
|
||||
; CHECK-NOT: error: invalid operand for inline asm constraint 'L'
|
||||
|
||||
define void @test_M_1() {
|
||||
entry:
|
||||
call void asm "", "M,~{dirflag},~{fpsr},~{flags}"(i32 1)
|
||||
ret void
|
||||
}
|
||||
|
||||
; CHECK-NOT: error: invalid operand for inline asm constraint 'M'
|
||||
|
||||
define void @test_O_64() {
|
||||
entry:
|
||||
call void asm "", "O,~{dirflag},~{fpsr},~{flags}"(i32 64)
|
||||
ret void
|
||||
}
|
||||
|
||||
; CHECK-NOT: error: invalid operand for inline asm constraint 'O'
|
||||
|
Loading…
x
Reference in New Issue
Block a user