| // 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 kPointerCid: | 
 |       return target::kWordSize == 4 ? kTypedDataUint32ArrayCid | 
 |                                     : kTypedDataUint64ArrayCid; | 
 |     case kFfiFloatCid: | 
 |       return kTypedDataFloat32ArrayCid; | 
 |     case kFfiDoubleCid: | 
 |       return kTypedDataFloat64ArrayCid; | 
 |     default: | 
 |       UNREACHABLE(); | 
 |   } | 
 | } | 
 |  | 
 | classid_t ElementExternalTypedDataCid(classid_t class_id) { | 
 |   switch (class_id) { | 
 |     case kFfiInt8Cid: | 
 |       return kExternalTypedDataInt8ArrayCid; | 
 |     case kFfiUint8Cid: | 
 |       return kExternalTypedDataUint8ArrayCid; | 
 |     case kFfiInt16Cid: | 
 |       return kExternalTypedDataInt16ArrayCid; | 
 |     case kFfiUint16Cid: | 
 |       return kExternalTypedDataUint16ArrayCid; | 
 |     case kFfiInt32Cid: | 
 |       return kExternalTypedDataInt32ArrayCid; | 
 |     case kFfiUint32Cid: | 
 |       return kExternalTypedDataUint32ArrayCid; | 
 |     case kFfiInt64Cid: | 
 |       return kExternalTypedDataInt64ArrayCid; | 
 |     case kFfiUint64Cid: | 
 |       return kExternalTypedDataUint64ArrayCid; | 
 |     case kFfiFloatCid: | 
 |       return kExternalTypedDataFloat32ArrayCid; | 
 |     case kFfiDoubleCid: | 
 |       return kExternalTypedDataFloat64ArrayCid; | 
 |     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_FIXED_SIZE(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; | 
 | #define AS_EXTERNAL_TYPED_DATA(type)                                           \ | 
 |   case MethodRecognizer::kFfiAsExternalTypedData##type:                        \ | 
 |     return kFfi##type##Cid; | 
 |     CLASS_LIST_FFI_NUMERIC_FIXED_SIZE(AS_EXTERNAL_TYPED_DATA) | 
 | #undef AS_EXTERNAL_TYPED_DATA | 
 |     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_FIXED_SIZE(LOAD_STORE) | 
 |     LOAD_STORE(Pointer) | 
 | #undef LOAD_STORE | 
 |     case MethodRecognizer::kFfiLoadFloatUnaligned: | 
 |     case MethodRecognizer::kFfiStoreFloatUnaligned: | 
 |     case MethodRecognizer::kFfiLoadDoubleUnaligned: | 
 |     case MethodRecognizer::kFfiStoreDoubleUnaligned: | 
 |       return kUnalignedAccess; | 
 |     default: | 
 |       UNREACHABLE(); | 
 |   } | 
 | } | 
 |  | 
 | MethodRecognizer::Kind FfiLoad(const NativeType& native_type) { | 
 |   if (native_type.IsPrimitive()) { | 
 |     switch (native_type.AsPrimitive().representation()) { | 
 | #define CASE(type)                                                             \ | 
 |   case k##type:                                                                \ | 
 |     return MethodRecognizer::kFfiLoad##type; | 
 |       CLASS_LIST_FFI_NUMERIC_FIXED_SIZE(CASE) | 
 | #undef CASE | 
 |       default: | 
 |         break; | 
 |     } | 
 |   } | 
 |   UNIMPLEMENTED(); | 
 | } | 
 |  | 
 | MethodRecognizer::Kind FfiStore(const NativeType& native_type) { | 
 |   if (native_type.IsPrimitive()) { | 
 |     switch (native_type.AsPrimitive().representation()) { | 
 | #define CASE(type)                                                             \ | 
 |   case k##type:                                                                \ | 
 |     return MethodRecognizer::kFfiStore##type; | 
 |       CLASS_LIST_FFI_NUMERIC_FIXED_SIZE(CASE) | 
 | #undef CASE | 
 |       default: | 
 |         break; | 
 |     } | 
 |   } | 
 |   UNIMPLEMENTED(); | 
 | } | 
 |  | 
 | }  // namespace ffi | 
 |  | 
 | }  // namespace compiler | 
 |  | 
 | }  // namespace dart |