let the '!eq' expression support 'int' and 'bit' types

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@106171 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Bruno Cardoso Lopes 2010-06-16 23:24:12 +00:00
parent d0e8469ba6
commit e87de41189
3 changed files with 25 additions and 3 deletions

View File

@ -425,8 +425,8 @@ class. This operation is analogous to $(foreach) in GNU make.</dd>
<dd>'b' if the result of integer operator 'a' is nonzero, 'c' otherwise.</dd>
<dt><tt>!eq(a,b)</tt></dt>
<dd>Integer one if string a is equal to string b, zero otherwise. This
only operates on string objects. Use !cast<string> to compare other
types of objects.</dd>
only operates on string, int and bit objects. Use !cast<string> to
compare other types of objects.</dd>
</dl>
<p>Note that all of the values have rules specifying how they convert to values

11
test/TableGen/eqbit.td Normal file
View File

@ -0,0 +1,11 @@
// RUN: tblgen %s | FileCheck %s
// XFAIL: vg_leak
// CHECK: a = 6
// CHECK: a = 5
class A<bit b = 1> {
int a = !if(!eq(b, 1), 5, 6);
}
def X : A<0>;
def Y : A;

View File

@ -721,9 +721,20 @@ Init *BinOpInit::Fold(Record *CurRec, MultiClass *CurMultiClass) {
break;
}
case EQ: {
// Make sure we've resolved
// try to fold eq comparison for 'bit' and 'int', otherwise fallback
// to string objects.
IntInit* L =
dynamic_cast<IntInit*>(LHS->convertInitializerTo(new IntRecTy()));
IntInit* R =
dynamic_cast<IntInit*>(RHS->convertInitializerTo(new IntRecTy()));
if (L && R)
return new IntInit(L->getValue() == R->getValue());
StringInit *LHSs = dynamic_cast<StringInit*>(LHS);
StringInit *RHSs = dynamic_cast<StringInit*>(RHS);
// Make sure we've resolved
if (LHSs && RHSs)
return new IntInit(LHSs->getValue() == RHSs->getValue());