240afa6afa
Since Register is an enum type, it is automatically coerced to integer types when passed as a parameter to functions expecting an integer argument. This change expands the use of Immediate and Operand wrappers for Assembler instructions and macros to avoid this automatic coercion. I've also added dummy constructors to Address and FieldAddress classes to address the same problem, but in a way that does not increase verbosity, since Address and FieldAddress are much more prevalent in the code. A cleaner solution would involve making Register no longer coercable to integer types, but this would likely require many changes to the Assemblers. R=regis@google.com Review URL: https://codereview.chromium.org//593363003 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@40905 260f80e4-7a28-3924-810f-c04153c831b5
59 lines
1.7 KiB
C++
59 lines
1.7 KiB
C++
// Copyright (c) 2014, 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 "platform/assert.h"
|
|
#include "vm/globals.h"
|
|
#if defined(TARGET_ARCH_ARM64)
|
|
|
|
#include "vm/assembler.h"
|
|
#include "vm/object.h"
|
|
#include "vm/unit_test.h"
|
|
|
|
namespace dart {
|
|
|
|
#define __ assembler->
|
|
|
|
// Generate a simple dart code sequence.
|
|
// This is used to test Code and Instruction object creation.
|
|
void GenerateIncrement(Assembler* assembler) {
|
|
__ mov(SP, CSP);
|
|
__ movz(R0, Immediate(0), 0);
|
|
__ Push(R0);
|
|
__ add(R0, R0, Operand(1));
|
|
__ str(R0, Address(SP));
|
|
__ ldr(R1, Address(SP));
|
|
__ add(R1, R1, Operand(1));
|
|
__ Pop(R0);
|
|
__ mov(R0, R1);
|
|
__ ret();
|
|
}
|
|
|
|
|
|
// Generate a dart code sequence that embeds a string object in it.
|
|
// This is used to test Embedded String objects in the instructions.
|
|
void GenerateEmbedStringInCode(Assembler* assembler, const char* str) {
|
|
const String& string_object =
|
|
String::ZoneHandle(String::New(str, Heap::kOld));
|
|
__ mov(SP, CSP);
|
|
__ TagAndPushPP(); // Save caller's pool pointer and load a new one here.
|
|
__ LoadPoolPointer(PP);
|
|
__ LoadObject(R0, string_object, PP);
|
|
__ PopAndUntagPP(); // Restore caller's pool pointer.
|
|
__ ret();
|
|
}
|
|
|
|
|
|
// Generate a dart code sequence that embeds a smi object in it.
|
|
// This is used to test Embedded Smi objects in the instructions.
|
|
void GenerateEmbedSmiInCode(Assembler* assembler, intptr_t value) {
|
|
const Smi& smi_object = Smi::ZoneHandle(Smi::New(value));
|
|
const int64_t val = reinterpret_cast<int64_t>(smi_object.raw());
|
|
__ LoadImmediate(R0, val, kNoRegister);
|
|
__ ret();
|
|
}
|
|
|
|
} // namespace dart
|
|
|
|
#endif // defined TARGET_ARCH_ARM64
|