From 6b993ccfe5449e780c90fa081e139600d4d20754 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sun, 15 Dec 2002 08:02:15 +0000 Subject: [PATCH] Add support to cast from a bool type Add support for boolean constants add getClassB method git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@5034 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/X86/InstSelectSimple.cpp | 18 ++++++++++++------ lib/Target/X86/X86ISelSimple.cpp | 18 ++++++++++++------ 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/lib/Target/X86/InstSelectSimple.cpp b/lib/Target/X86/InstSelectSimple.cpp index 4a44dbf419b..c4361565611 100644 --- a/lib/Target/X86/InstSelectSimple.cpp +++ b/lib/Target/X86/InstSelectSimple.cpp @@ -273,6 +273,12 @@ static inline TypeClass getClass(const Type *Ty) { } } +// getClassB - Just like getClass, but treat boolean values as bytes. +static inline TypeClass getClassB(const Type *Ty) { + if (Ty == Type::BoolTy) return cByte; + return getClass(Ty); +} + /// copyConstantToRegister - Output the instructions required to put the /// specified constant into the specified register. @@ -292,14 +298,16 @@ void ISel::copyConstantToRegister(Constant *C, unsigned R, } if (C->getType()->isIntegral()) { - unsigned Class = getClass(C->getType()); + unsigned Class = getClassB(C->getType()); assert(Class != 3 && "Type not handled yet!"); static const unsigned IntegralOpcodeTab[] = { X86::MOVir8, X86::MOVir16, X86::MOVir32 }; - if (C->getType()->isSigned()) { + if (C->getType() == Type::BoolTy) { + BMI(MBB, IP, X86::MOVir8, 1, R).addZImm(C == ConstantBool::True); + } else if (C->getType()->isSigned()) { ConstantSInt *CSI = cast(C); BMI(MBB, IP, IntegralOpcodeTab[Class], 1, R).addSImm(CSI->getValue()); } else { @@ -348,9 +356,7 @@ void ISel::SelectPHINodes() { while ((*PI)->getOpcode() == X86::PHI) ++PI; MI->addRegOperand(getReg(PN->getIncomingValue(i), PredMBB, PI)); - - // FIXME: Pass in the MachineBasicBlocks instead of the basic blocks... - MI->addPCDispOperand(PN->getIncomingBlock(i)); // PredMBB + MI->addMachineBasicBlockOperand(PredMBB); } } } @@ -878,7 +884,7 @@ ISel::visitCastInst (CastInst &CI) // 2) Implement casts between values of the same type class (as determined // by getClass) by using a register-to-register move. - unsigned srcClass = sourceType == Type::BoolTy ? cByte : getClass(sourceType); + unsigned srcClass = getClassB(sourceType); unsigned targClass = getClass (targetType); static const unsigned regRegMove[] = { X86::MOVrr8, X86::MOVrr16, X86::MOVrr32 diff --git a/lib/Target/X86/X86ISelSimple.cpp b/lib/Target/X86/X86ISelSimple.cpp index 4a44dbf419b..c4361565611 100644 --- a/lib/Target/X86/X86ISelSimple.cpp +++ b/lib/Target/X86/X86ISelSimple.cpp @@ -273,6 +273,12 @@ static inline TypeClass getClass(const Type *Ty) { } } +// getClassB - Just like getClass, but treat boolean values as bytes. +static inline TypeClass getClassB(const Type *Ty) { + if (Ty == Type::BoolTy) return cByte; + return getClass(Ty); +} + /// copyConstantToRegister - Output the instructions required to put the /// specified constant into the specified register. @@ -292,14 +298,16 @@ void ISel::copyConstantToRegister(Constant *C, unsigned R, } if (C->getType()->isIntegral()) { - unsigned Class = getClass(C->getType()); + unsigned Class = getClassB(C->getType()); assert(Class != 3 && "Type not handled yet!"); static const unsigned IntegralOpcodeTab[] = { X86::MOVir8, X86::MOVir16, X86::MOVir32 }; - if (C->getType()->isSigned()) { + if (C->getType() == Type::BoolTy) { + BMI(MBB, IP, X86::MOVir8, 1, R).addZImm(C == ConstantBool::True); + } else if (C->getType()->isSigned()) { ConstantSInt *CSI = cast(C); BMI(MBB, IP, IntegralOpcodeTab[Class], 1, R).addSImm(CSI->getValue()); } else { @@ -348,9 +356,7 @@ void ISel::SelectPHINodes() { while ((*PI)->getOpcode() == X86::PHI) ++PI; MI->addRegOperand(getReg(PN->getIncomingValue(i), PredMBB, PI)); - - // FIXME: Pass in the MachineBasicBlocks instead of the basic blocks... - MI->addPCDispOperand(PN->getIncomingBlock(i)); // PredMBB + MI->addMachineBasicBlockOperand(PredMBB); } } } @@ -878,7 +884,7 @@ ISel::visitCastInst (CastInst &CI) // 2) Implement casts between values of the same type class (as determined // by getClass) by using a register-to-register move. - unsigned srcClass = sourceType == Type::BoolTy ? cByte : getClass(sourceType); + unsigned srcClass = getClassB(sourceType); unsigned targClass = getClass (targetType); static const unsigned regRegMove[] = { X86::MOVrr8, X86::MOVrr16, X86::MOVrr32