From 7d25589ee19747720a6cdb045ae442332f90bbcf Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Fri, 13 Dec 2002 11:31:59 +0000 Subject: [PATCH] Implement cast bool to X git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@5012 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/X86/InstSelectSimple.cpp | 7 ++++--- lib/Target/X86/X86ISelSimple.cpp | 7 ++++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/lib/Target/X86/InstSelectSimple.cpp b/lib/Target/X86/InstSelectSimple.cpp index a6b518ff9d6..a8ed6f69c0e 100644 --- a/lib/Target/X86/InstSelectSimple.cpp +++ b/lib/Target/X86/InstSelectSimple.cpp @@ -854,7 +854,7 @@ ISel::visitCastInst (CastInst &CI) // 4) cast {int, uint, ptr} to {short, ushort} // cast {int, uint, ptr} to {sbyte, ubyte} // cast {short, ushort} to {sbyte, ubyte} - // + // 1) Implement casts to bool by using compare on the operand followed // by set if not zero on the result. if (targetType == Type::BoolTy) @@ -863,10 +863,11 @@ ISel::visitCastInst (CastInst &CI) BuildMI (BB, X86::SETNEr, 1, destReg); return; } + // 2) Implement casts between values of the same type class (as determined // by getClass) by using a register-to-register move. - unsigned int srcClass = getClass (sourceType); - unsigned int targClass = getClass (targetType); + unsigned srcClass = sourceType == Type::BoolTy ? cByte : getClass(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 a6b518ff9d6..a8ed6f69c0e 100644 --- a/lib/Target/X86/X86ISelSimple.cpp +++ b/lib/Target/X86/X86ISelSimple.cpp @@ -854,7 +854,7 @@ ISel::visitCastInst (CastInst &CI) // 4) cast {int, uint, ptr} to {short, ushort} // cast {int, uint, ptr} to {sbyte, ubyte} // cast {short, ushort} to {sbyte, ubyte} - // + // 1) Implement casts to bool by using compare on the operand followed // by set if not zero on the result. if (targetType == Type::BoolTy) @@ -863,10 +863,11 @@ ISel::visitCastInst (CastInst &CI) BuildMI (BB, X86::SETNEr, 1, destReg); return; } + // 2) Implement casts between values of the same type class (as determined // by getClass) by using a register-to-register move. - unsigned int srcClass = getClass (sourceType); - unsigned int targClass = getClass (targetType); + unsigned srcClass = sourceType == Type::BoolTy ? cByte : getClass(sourceType); + unsigned targClass = getClass (targetType); static const unsigned regRegMove[] = { X86::MOVrr8, X86::MOVrr16, X86::MOVrr32 };