From 634717238844cf3f51039411be1b27fe1fac622e Mon Sep 17 00:00:00 2001 From: Anders Carlsson Date: Sun, 11 Jan 2009 19:32:54 +0000 Subject: [PATCH] Use a common function for emitting asm inputs and remove a FIXME git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@62041 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/CGStmt.cpp | 57 +++++++++++++++++++----------------------- 1 file changed, 26 insertions(+), 31 deletions(-) diff --git a/lib/CodeGen/CGStmt.cpp b/lib/CodeGen/CGStmt.cpp index 794d7cb272..8d80a498b4 100644 --- a/lib/CodeGen/CGStmt.cpp +++ b/lib/CodeGen/CGStmt.cpp @@ -860,6 +860,29 @@ static std::string SimplifyConstraint(const char* Constraint, return Result; } +llvm::Value* CodeGenFunction::EmitAsmInput(const AsmStmt &S, + TargetInfo::ConstraintInfo Info, + const Expr *InputExpr, + std::string &ConstraintStr) +{ + llvm::Value *Arg; + if ((Info & TargetInfo::CI_AllowsRegister) || + !(Info & TargetInfo::CI_AllowsMemory)) { + if (ConvertType(InputExpr->getType())->isSingleValueType()) { + Arg = EmitScalarExpr(InputExpr); + } else { + ErrorUnsupported(&S, + "asm statement passing multiple-value types as inputs"); + } + } else { + LValue Dest = EmitLValue(InputExpr); + Arg = Dest.getAddress(); + ConstraintStr += '*'; + } + + return Arg; +} + void CodeGenFunction::EmitAsmStmt(const AsmStmt &S) { bool Failed; std::string AsmString = @@ -916,24 +939,10 @@ void CodeGenFunction::EmitAsmStmt(const AsmStmt &S) { } if (Info & TargetInfo::CI_ReadWrite) { - // FIXME: This code should be shared with the code that handles inputs. InOutConstraints += ','; - + const Expr *InputExpr = S.getOutputExpr(i); - llvm::Value *Arg; - if ((Info & TargetInfo::CI_AllowsRegister) || - !(Info & TargetInfo::CI_AllowsMemory)) { - if (ConvertType(InputExpr->getType())->isSingleValueType()) { - Arg = EmitScalarExpr(InputExpr); - } else { - ErrorUnsupported(&S, - "asm statement passing multiple-value types as inputs"); - } - } else { - LValue Dest = EmitLValue(InputExpr); - Arg = Dest.getAddress(); - InOutConstraints += '*'; - } + llvm::Value *Arg = EmitAsmInput(S, Info, InputExpr, InOutConstraints); InOutArgTypes.push_back(Arg->getType()); InOutArgs.push_back(Arg); @@ -960,21 +969,7 @@ void CodeGenFunction::EmitAsmStmt(const AsmStmt &S) { // Simplify the input constraint. InputConstraint = SimplifyConstraint(InputConstraint.c_str(), Target); - llvm::Value *Arg; - - if ((Info & TargetInfo::CI_AllowsRegister) || - !(Info & TargetInfo::CI_AllowsMemory)) { - if (ConvertType(InputExpr->getType())->isSingleValueType()) { - Arg = EmitScalarExpr(InputExpr); - } else { - ErrorUnsupported(&S, - "asm statement passing multiple-value types as inputs"); - } - } else { - LValue Dest = EmitLValue(InputExpr); - Arg = Dest.getAddress(); - Constraints += '*'; - } + llvm::Value *Arg = EmitAsmInput(S, Info, InputExpr, Constraints); ArgTypes.push_back(Arg->getType()); Args.push_back(Arg); -- 2.40.0