mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 12:41:49 +01:00
Add support for the 'P' constraint.
Patch by Jack Carter. llvm-svn: 156292
This commit is contained in:
parent
98163678d4
commit
0f1a0afa75
@ -3045,6 +3045,7 @@ MipsTargetLowering::getSingleConstraintMatchWeight(
|
|||||||
case 'L': // signed 32 bit immediate where lower 16 bits are 0
|
case 'L': // signed 32 bit immediate where lower 16 bits are 0
|
||||||
case 'N': // immediate in the range of -65535 to -1 (inclusive)
|
case 'N': // immediate in the range of -65535 to -1 (inclusive)
|
||||||
case 'O': // signed 15 bit immediate (+- 16383)
|
case 'O': // signed 15 bit immediate (+- 16383)
|
||||||
|
case 'P': // immediate in the range of 65535 to 1 (inclusive)
|
||||||
if (isa<ConstantInt>(CallOperandVal))
|
if (isa<ConstantInt>(CallOperandVal))
|
||||||
weight = CW_Constant;
|
weight = CW_Constant;
|
||||||
break;
|
break;
|
||||||
@ -3157,6 +3158,16 @@ void MipsTargetLowering::LowerAsmOperandForConstraint(SDValue Op,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
|
case 'P': // immediate in the range of 1 to 65535 (inclusive)
|
||||||
|
if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Op)) {
|
||||||
|
EVT Type = Op.getValueType();
|
||||||
|
int64_t Val = C->getSExtValue();
|
||||||
|
if ((Val <= 65535) && (Val >= 1)) {
|
||||||
|
Result = DAG.getTargetConstant(Val, Type);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Result.getNode()) {
|
if (Result.getNode()) {
|
||||||
|
16
test/CodeGen/Mips/inlineasm-cnstrnt-bad-P.ll
Normal file
16
test/CodeGen/Mips/inlineasm-cnstrnt-bad-P.ll
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
;
|
||||||
|
; This is a negative test. The constant value given for the constraint (P).
|
||||||
|
; A constant in the range of 1 to 655535 inclusive.
|
||||||
|
; Our example uses the positive value 655536.
|
||||||
|
;
|
||||||
|
; RUN: not llc -march=mipsel < %s 2> %t
|
||||||
|
; RUN: FileCheck --check-prefix=CHECK-ERRORS < %t %s
|
||||||
|
|
||||||
|
define i32 @main() nounwind {
|
||||||
|
entry:
|
||||||
|
|
||||||
|
;CHECK-ERRORS: error: invalid operand for inline asm constraint 'P'
|
||||||
|
|
||||||
|
tail call i32 asm sideeffect "addi $0,$1,$2", "=r,r,P"(i32 undef, i32 655536) nounwind
|
||||||
|
ret i32 0
|
||||||
|
}
|
@ -45,5 +45,11 @@ entry:
|
|||||||
; CHECK: #NO_APP
|
; CHECK: #NO_APP
|
||||||
tail call i32 asm sideeffect "addi $0,$1,$2", "=r,r,O"(i32 7, i16 -3) nounwind
|
tail call i32 asm sideeffect "addi $0,$1,$2", "=r,r,O"(i32 7, i16 -3) nounwind
|
||||||
|
|
||||||
|
; Now P with 65535
|
||||||
|
; CHECK: #APP
|
||||||
|
; CHECK: addi ${{[0-9]+}},${{[0-9]+}},65535
|
||||||
|
; CHECK: #NO_APP
|
||||||
|
tail call i32 asm sideeffect "addi $0,$1,$2", "=r,r,P"(i32 7, i32 65535) nounwind
|
||||||
|
|
||||||
ret i32 0
|
ret i32 0
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user