diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2018-07-30 16:33:32 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2018-07-30 16:33:32 +0000 | 
| commit | 51315c45ff5643a27f9c84b816db54ee870ba29b (patch) | |
| tree | 1d87443fa0e53d3e6b315ce25787e64be0906bf7 /contrib/llvm/lib/Target/WebAssembly/WebAssemblyFastISel.cpp | |
| parent | 6dfd050075216be8538ae375a22d30db72916f7e (diff) | |
| parent | eb11fae6d08f479c0799db45860a98af528fa6e7 (diff) | |
Notes
Diffstat (limited to 'contrib/llvm/lib/Target/WebAssembly/WebAssemblyFastISel.cpp')
| -rw-r--r-- | contrib/llvm/lib/Target/WebAssembly/WebAssemblyFastISel.cpp | 42 | 
1 files changed, 36 insertions, 6 deletions
diff --git a/contrib/llvm/lib/Target/WebAssembly/WebAssemblyFastISel.cpp b/contrib/llvm/lib/Target/WebAssembly/WebAssemblyFastISel.cpp index 7e284ea950fd..566ef68c027d 100644 --- a/contrib/llvm/lib/Target/WebAssembly/WebAssemblyFastISel.cpp +++ b/contrib/llvm/lib/Target/WebAssembly/WebAssemblyFastISel.cpp @@ -8,7 +8,7 @@  //===----------------------------------------------------------------------===//  ///  /// \file -/// \brief This file defines the WebAssembly-specific support for the FastISel +/// This file defines the WebAssembly-specific support for the FastISel  /// class. Some of the target-specific code is generated by tablegen in the file  /// WebAssemblyGenFastISel.inc, which is #included here.  /// @@ -127,6 +127,7 @@ private:      case MVT::i64:      case MVT::f32:      case MVT::f64: +    case MVT::ExceptRef:        return VT;      case MVT::f16:        return MVT::f32; @@ -418,7 +419,7 @@ unsigned WebAssemblyFastISel::getRegForI1Value(const Value *V, bool &Not) {          return getRegForValue(ICmp->getOperand(0));        } -  if (BinaryOperator::isNot(V)) { +  if (BinaryOperator::isNot(V) && V->getType()->isIntegerTy(32)) {      Not = true;      return getRegForValue(BinaryOperator::getNotArgument(V));    } @@ -681,6 +682,10 @@ bool WebAssemblyFastISel::fastLowerArguments() {        Opc = WebAssembly::ARGUMENT_v4f32;        RC = &WebAssembly::V128RegClass;        break; +    case MVT::ExceptRef: +      Opc = WebAssembly::ARGUMENT_EXCEPT_REF; +      RC = &WebAssembly::EXCEPT_REFRegClass; +      break;      default:        return false;      } @@ -695,11 +700,23 @@ bool WebAssemblyFastISel::fastLowerArguments() {    MRI.addLiveIn(WebAssembly::ARGUMENTS);    auto *MFI = MF->getInfo<WebAssemblyFunctionInfo>(); -  for (auto const &Arg : F->args()) -    MFI->addParam(getLegalType(getSimpleType(Arg.getType()))); +  for (auto const &Arg : F->args()) { +    MVT::SimpleValueType ArgTy = getLegalType(getSimpleType(Arg.getType())); +    if (ArgTy == MVT::INVALID_SIMPLE_VALUE_TYPE) { +      MFI->clearParamsAndResults(); +      return false; +    } +    MFI->addParam(ArgTy); +  } -  if (!F->getReturnType()->isVoidTy()) -    MFI->addResult(getLegalType(getSimpleType(F->getReturnType()))); +  if (!F->getReturnType()->isVoidTy()) { +    MVT::SimpleValueType RetTy = getLegalType(getSimpleType(F->getReturnType())); +    if (RetTy == MVT::INVALID_SIMPLE_VALUE_TYPE) { +      MFI->clearParamsAndResults(); +      return false; +    } +    MFI->addResult(RetTy); +  }    return true;  } @@ -770,6 +787,11 @@ bool WebAssemblyFastISel::selectCall(const Instruction *I) {            IsDirect ? WebAssembly::CALL_v4f32 : WebAssembly::PCALL_INDIRECT_v4f32;        ResultReg = createResultReg(&WebAssembly::V128RegClass);        break; +    case MVT::ExceptRef: +      Opc = IsDirect ? WebAssembly::CALL_EXCEPT_REF +                     : WebAssembly::PCALL_INDIRECT_EXCEPT_REF; +      ResultReg = createResultReg(&WebAssembly::EXCEPT_REFRegClass); +      break;      default:        return false;      } @@ -868,6 +890,10 @@ bool WebAssemblyFastISel::selectSelect(const Instruction *I) {      Opc = WebAssembly::SELECT_F64;      RC = &WebAssembly::F64RegClass;      break; +  case MVT::ExceptRef: +    Opc = WebAssembly::SELECT_EXCEPT_REF; +    RC = &WebAssembly::EXCEPT_REFRegClass; +    break;    default:      return false;    } @@ -1165,6 +1191,7 @@ bool WebAssemblyFastISel::selectStore(const Instruction *I) {    switch (getSimpleType(Store->getValueOperand()->getType())) {    case MVT::i1:      VTIsi1 = true; +    LLVM_FALLTHROUGH;    case MVT::i8:      Opc = WebAssembly::STORE8_I32;      break; @@ -1273,6 +1300,9 @@ bool WebAssemblyFastISel::selectRet(const Instruction *I) {    case MVT::v4f32:      Opc = WebAssembly::RETURN_v4f32;      break; +  case MVT::ExceptRef: +    Opc = WebAssembly::RETURN_EXCEPT_REF; +    break;    default: return false;    }  | 
