mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-09-27 16:17:17 +00:00
Fix llvm-gcc build for armv6t2 and later architectures. The hasV6T2Ops
predicate does not check if Thumb mode is enabled, and when in ARM mode there are still some checks for constant-pool use that need to run. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@73887 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -579,17 +579,18 @@ SDNode *ARMDAGToDAGISel::Select(SDValue Op) {
|
|||||||
switch (N->getOpcode()) {
|
switch (N->getOpcode()) {
|
||||||
default: break;
|
default: break;
|
||||||
case ISD::Constant: {
|
case ISD::Constant: {
|
||||||
// ARMv6T2 and later should materialize imms via MOV / MOVT pair.
|
|
||||||
if (Subtarget->hasV6T2Ops() || Subtarget->hasThumb2())
|
|
||||||
break;
|
|
||||||
|
|
||||||
unsigned Val = cast<ConstantSDNode>(N)->getZExtValue();
|
unsigned Val = cast<ConstantSDNode>(N)->getZExtValue();
|
||||||
bool UseCP = true;
|
bool UseCP = true;
|
||||||
if (Subtarget->isThumb())
|
if (Subtarget->isThumb()) {
|
||||||
|
if (Subtarget->hasThumb2())
|
||||||
|
// Thumb2 has the MOVT instruction, so all immediates can
|
||||||
|
// be done with MOV + MOVT, at worst.
|
||||||
|
UseCP = 0;
|
||||||
|
else
|
||||||
UseCP = (Val > 255 && // MOV
|
UseCP = (Val > 255 && // MOV
|
||||||
~Val > 255 && // MOV + MVN
|
~Val > 255 && // MOV + MVN
|
||||||
!ARM_AM::isThumbImmShiftedVal(Val)); // MOV + LSL
|
!ARM_AM::isThumbImmShiftedVal(Val)); // MOV + LSL
|
||||||
else
|
} else
|
||||||
UseCP = (ARM_AM::getSOImmVal(Val) == -1 && // MOV
|
UseCP = (ARM_AM::getSOImmVal(Val) == -1 && // MOV
|
||||||
ARM_AM::getSOImmVal(~Val) == -1 && // MVN
|
ARM_AM::getSOImmVal(~Val) == -1 && // MVN
|
||||||
!ARM_AM::isSOImmTwoPartVal(Val)); // two instrs.
|
!ARM_AM::isSOImmTwoPartVal(Val)); // two instrs.
|
||||||
|
Reference in New Issue
Block a user