|  | // 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/unit_test.h" | 
|  |  | 
|  | #include "vm/compiler/ffi/native_location.h" | 
|  |  | 
|  | namespace dart { | 
|  | namespace compiler { | 
|  | namespace ffi { | 
|  |  | 
|  | UNIT_TEST_CASE_WITH_ZONE(NativeStackLocation) { | 
|  | const auto& native_type = *new (Z) NativePrimitiveType(kInt8); | 
|  |  | 
|  | const int kUnalignedStackLocation = 17; | 
|  |  | 
|  | const auto& native_location = *new (Z) NativeStackLocation( | 
|  | native_type, native_type, SPREG, kUnalignedStackLocation); | 
|  |  | 
|  | EXPECT_EQ(kUnalignedStackLocation + native_type.SizeInBytes(), | 
|  | native_location.StackTopInBytes()); | 
|  | } | 
|  |  | 
|  | UNIT_TEST_CASE_WITH_ZONE(NativeStackLocation_Split) { | 
|  | const auto& native_type = *new (Z) NativePrimitiveType(kInt64); | 
|  |  | 
|  | const auto& native_location = | 
|  | *new (Z) NativeStackLocation(native_type, native_type, SPREG, 0); | 
|  |  | 
|  | const auto& half_0 = native_location.Split(Z, 2, 0); | 
|  | const auto& half_1 = native_location.Split(Z, 2, 1); | 
|  |  | 
|  | EXPECT_EQ(0, half_0.offset_in_bytes()); | 
|  | EXPECT_EQ(4, half_1.offset_in_bytes()); | 
|  | } | 
|  |  | 
|  | // Regression test for NativeFpuRegistersLocation::Equals not considering kind | 
|  | // when comparing. | 
|  | UNIT_TEST_CASE_WITH_ZONE(NativeStackLocation_Equals) { | 
|  | const auto& native_type = *new (Z) NativePrimitiveType(kInt8); | 
|  |  | 
|  | // Two FPU registers of the same kind and number are equal. | 
|  | { | 
|  | const auto& native_location1 = *new (Z) NativeFpuRegistersLocation( | 
|  | native_type, native_type, kQuadFpuReg, | 
|  | /*fpu_register=*/0); | 
|  |  | 
|  | const auto& native_location2 = *new (Z) NativeFpuRegistersLocation( | 
|  | native_type, native_type, kQuadFpuReg, | 
|  | /*fpu_register=*/0); | 
|  |  | 
|  | EXPECT(native_location1.Equals(native_location2)); | 
|  | } | 
|  |  | 
|  | // Two FPU registers with different numbers are NOT equal. | 
|  | { | 
|  | const auto& native_location1 = *new (Z) NativeFpuRegistersLocation( | 
|  | native_type, native_type, kQuadFpuReg, | 
|  | /*fpu_register=*/2); | 
|  |  | 
|  | const auto& native_location2 = *new (Z) NativeFpuRegistersLocation( | 
|  | native_type, native_type, kQuadFpuReg, | 
|  | /*fpu_register=*/4); | 
|  |  | 
|  | EXPECT(!native_location1.Equals(native_location2)); | 
|  | } | 
|  |  | 
|  | // Two FPU registers with different kinds are NOT equal. | 
|  | { | 
|  | const auto& native_location1 = *new (Z) NativeFpuRegistersLocation( | 
|  | native_type, native_type, kQuadFpuReg, | 
|  | /*fpu_register=*/3); | 
|  |  | 
|  | const auto& native_location2 = *new (Z) NativeFpuRegistersLocation( | 
|  | native_type, native_type, kDoubleFpuReg, | 
|  | /*fpu_register=*/3); | 
|  |  | 
|  | EXPECT(!native_location1.Equals(native_location2)); | 
|  | } | 
|  | } | 
|  |  | 
|  | }  // namespace ffi | 
|  | }  // namespace compiler | 
|  | }  // namespace dart |