aboutsummaryrefslogtreecommitdiffstats
path: root/lib/AsmParser
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2004-03-12 05:51:36 +0000
committerChris Lattner <sabre@nondot.org>2004-03-12 05:51:36 +0000
commit76f0ff394de5656b9e6e6a4016a2a5f3fbece7ad (patch)
tree18fc5327cb0a711b73fc7f0d400caab1ddcd432e /lib/AsmParser
parent57b25973d68ac8b26e0d2ad44769d77dd3e8efc5 (diff)
downloadexternal_llvm-76f0ff394de5656b9e6e6a4016a2a5f3fbece7ad.zip
external_llvm-76f0ff394de5656b9e6e6a4016a2a5f3fbece7ad.tar.gz
external_llvm-76f0ff394de5656b9e6e6a4016a2a5f3fbece7ad.tar.bz2
Allow parsing select instruction and constant expr
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@12313 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/AsmParser')
-rw-r--r--lib/AsmParser/Lexer.l1
-rw-r--r--lib/AsmParser/llvmAsmParser.y16
2 files changed, 16 insertions, 1 deletions
diff --git a/lib/AsmParser/Lexer.l b/lib/AsmParser/Lexer.l
index 999a576..c2db5a2 100644
--- a/lib/AsmParser/Lexer.l
+++ b/lib/AsmParser/Lexer.l
@@ -234,6 +234,7 @@ setge { RET_TOK(BinaryOpVal, SetGE, SETGE); }
phi { RET_TOK(OtherOpVal, PHI, PHI_TOK); }
call { RET_TOK(OtherOpVal, Call, CALL); }
cast { RET_TOK(OtherOpVal, Cast, CAST); }
+select { RET_TOK(OtherOpVal, Select, SELECT); }
shl { RET_TOK(OtherOpVal, Shl, SHL); }
shr { RET_TOK(OtherOpVal, Shr, SHR); }
va_arg { return VA_ARG; /* FIXME: OBSOLETE */}
diff --git a/lib/AsmParser/llvmAsmParser.y b/lib/AsmParser/llvmAsmParser.y
index 9c68cfc..2868fdd 100644
--- a/lib/AsmParser/llvmAsmParser.y
+++ b/lib/AsmParser/llvmAsmParser.y
@@ -876,7 +876,7 @@ using namespace llvm;
// Other Operators
%type <OtherOpVal> ShiftOps
-%token <OtherOpVal> PHI_TOK CALL CAST SHL SHR VAARG VANEXT
+%token <OtherOpVal> PHI_TOK CALL CAST SELECT SHL SHR VAARG VANEXT
%token VA_ARG // FIXME: OBSOLETE
%start Module
@@ -1251,6 +1251,13 @@ ConstExpr: CAST '(' ConstVal TO Types ')' {
$$ = ConstantExpr::getGetElementPtr($3, IdxVec);
}
+ | SELECT '(' ConstVal ',' ConstVal ',' ConstVal ')' {
+ if ($3->getType() != Type::BoolTy)
+ ThrowException("Select condition must be of boolean type!");
+ if ($5->getType() != $7->getType())
+ ThrowException("Select operand types must match!");
+ $$ = ConstantExpr::getSelect($3, $5, $7);
+ }
| BinaryOps '(' ConstVal ',' ConstVal ')' {
if ($3->getType() != $5->getType())
ThrowException("Binary operator types must match!");
@@ -1802,6 +1809,13 @@ InstVal : ArithmeticOps Types ValueRef ',' ValueRef {
$$ = new CastInst($2, *$4);
delete $4;
}
+ | SELECT ResolvedVal ',' ResolvedVal ',' ResolvedVal {
+ if ($2->getType() != Type::BoolTy)
+ ThrowException("select condition must be boolean!");
+ if ($4->getType() != $6->getType())
+ ThrowException("select value types should match!");
+ $$ = new SelectInst($2, $4, $6);
+ }
| VA_ARG ResolvedVal ',' Types {
// FIXME: This is emulation code for an obsolete syntax. This should be
// removed at some point.