// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

#include "vm/compiler/ffi/recognized_method.h"

#include "vm/symbols.h"

namespace dart {

namespace compiler {

namespace ffi {

classid_t ElementTypedDataCid(classid_t class_id) {
  switch (class_id) {
    case kFfiInt8Cid:
      return kTypedDataInt8ArrayCid;
    case kFfiUint8Cid:
      return kTypedDataUint8ArrayCid;
    case kFfiInt16Cid:
      return kTypedDataInt16ArrayCid;
    case kFfiUint16Cid:
      return kTypedDataUint16ArrayCid;
    case kFfiInt32Cid:
      return kTypedDataInt32ArrayCid;
    case kFfiUint32Cid:
      return kTypedDataUint32ArrayCid;
    case kFfiInt64Cid:
      return kTypedDataInt64ArrayCid;
    case kFfiUint64Cid:
      return kTypedDataUint64ArrayCid;
    case kFfiIntPtrCid:
      return target::kWordSize == 4 ? kTypedDataInt32ArrayCid
                                    : kTypedDataInt64ArrayCid;
    case kPointerCid:
      return target::kWordSize == 4 ? kTypedDataUint32ArrayCid
                                    : kTypedDataUint64ArrayCid;
    case kFfiFloatCid:
      return kTypedDataFloat32ArrayCid;
    case kFfiDoubleCid:
      return kTypedDataFloat64ArrayCid;
    default:
      UNREACHABLE();
  }
}

classid_t RecognizedMethodTypeArgCid(MethodRecognizer::Kind kind) {
  switch (kind) {
#define LOAD_STORE(type)                                                       \
  case MethodRecognizer::kFfiLoad##type:                                       \
  case MethodRecognizer::kFfiStore##type:                                      \
    return kFfi##type##Cid;
    CLASS_LIST_FFI_NUMERIC(LOAD_STORE)
#undef LOAD_STORE
    case MethodRecognizer::kFfiLoadFloatUnaligned:
    case MethodRecognizer::kFfiStoreFloatUnaligned:
      return kFfiFloatCid;
    case MethodRecognizer::kFfiLoadDoubleUnaligned:
    case MethodRecognizer::kFfiStoreDoubleUnaligned:
      return kFfiDoubleCid;
    case MethodRecognizer::kFfiLoadPointer:
    case MethodRecognizer::kFfiStorePointer:
      return kPointerCid;
    default:
      UNREACHABLE();
  }
}

AlignmentType RecognizedMethodAlignment(MethodRecognizer::Kind kind) {
  switch (kind) {
#define LOAD_STORE(type)                                                       \
  case MethodRecognizer::kFfiLoad##type:                                       \
  case MethodRecognizer::kFfiStore##type:                                      \
    return kAlignedAccess;
    CLASS_LIST_FFI_NUMERIC(LOAD_STORE)
    LOAD_STORE(Pointer)
#undef LOAD_STORE
    case MethodRecognizer::kFfiLoadFloatUnaligned:
    case MethodRecognizer::kFfiStoreFloatUnaligned:
    case MethodRecognizer::kFfiLoadDoubleUnaligned:
    case MethodRecognizer::kFfiStoreDoubleUnaligned:
      return kUnalignedAccess;
    default:
      UNREACHABLE();
  }
}

}  // namespace ffi

}  // namespace compiler

}  // namespace dart
