| Index: src/compiler/arm64/instruction-selector-arm64.cc
|
| diff --git a/src/compiler/arm64/instruction-selector-arm64.cc b/src/compiler/arm64/instruction-selector-arm64.cc
|
| index dd1857b1e65dd9f5985a5610ca97f3969a4c27fe..410105c1880b3f0c97534d96c625627993202fd9 100644
|
| --- a/src/compiler/arm64/instruction-selector-arm64.cc
|
| +++ b/src/compiler/arm64/instruction-selector-arm64.cc
|
| @@ -143,6 +143,7 @@ static void VisitBinop(InstructionSelector* selector, Node* node,
|
|
|
| void InstructionSelector::VisitLoad(Node* node) {
|
| MachineType rep = RepresentationOf(OpParameter<MachineType>(node));
|
| + MachineType typ = TypeOf(OpParameter<MachineType>(node));
|
| Arm64OperandGenerator g(this);
|
| Node* base = node->InputAt(0);
|
| Node* index = node->InputAt(1);
|
| @@ -155,21 +156,21 @@ void InstructionSelector::VisitLoad(Node* node) {
|
| // TODO(titzer): signed/unsigned small loads
|
| switch (rep) {
|
| case kRepFloat64:
|
| - opcode = kArm64Float64Load;
|
| + opcode = kArm64LdrD;
|
| break;
|
| case kRepBit: // Fall through.
|
| case kRepWord8:
|
| - opcode = kArm64LoadWord8;
|
| + opcode = typ == kTypeInt32 ? kArm64Ldrsb : kArm64Ldrb;
|
| break;
|
| case kRepWord16:
|
| - opcode = kArm64LoadWord16;
|
| + opcode = typ == kTypeInt32 ? kArm64Ldrsh : kArm64Ldrh;
|
| break;
|
| case kRepWord32:
|
| - opcode = kArm64LoadWord32;
|
| + opcode = kArm64LdrW;
|
| break;
|
| case kRepTagged: // Fall through.
|
| case kRepWord64:
|
| - opcode = kArm64LoadWord64;
|
| + opcode = kArm64Ldr;
|
| break;
|
| default:
|
| UNREACHABLE();
|
| @@ -178,9 +179,6 @@ void InstructionSelector::VisitLoad(Node* node) {
|
| if (g.CanBeImmediate(index, kLoadStoreImm)) {
|
| Emit(opcode | AddressingModeField::encode(kMode_MRI), result,
|
| g.UseRegister(base), g.UseImmediate(index));
|
| - } else if (g.CanBeImmediate(base, kLoadStoreImm)) {
|
| - Emit(opcode | AddressingModeField::encode(kMode_MRI), result,
|
| - g.UseRegister(index), g.UseImmediate(base));
|
| } else {
|
| Emit(opcode | AddressingModeField::encode(kMode_MRR), result,
|
| g.UseRegister(base), g.UseRegister(index));
|
| @@ -217,21 +215,21 @@ void InstructionSelector::VisitStore(Node* node) {
|
| ArchOpcode opcode;
|
| switch (rep) {
|
| case kRepFloat64:
|
| - opcode = kArm64Float64Store;
|
| + opcode = kArm64StrD;
|
| break;
|
| case kRepBit: // Fall through.
|
| case kRepWord8:
|
| - opcode = kArm64StoreWord8;
|
| + opcode = kArm64Strb;
|
| break;
|
| case kRepWord16:
|
| - opcode = kArm64StoreWord16;
|
| + opcode = kArm64Strh;
|
| break;
|
| case kRepWord32:
|
| - opcode = kArm64StoreWord32;
|
| + opcode = kArm64StrW;
|
| break;
|
| case kRepTagged: // Fall through.
|
| case kRepWord64:
|
| - opcode = kArm64StoreWord64;
|
| + opcode = kArm64Str;
|
| break;
|
| default:
|
| UNREACHABLE();
|
| @@ -240,9 +238,6 @@ void InstructionSelector::VisitStore(Node* node) {
|
| if (g.CanBeImmediate(index, kLoadStoreImm)) {
|
| Emit(opcode | AddressingModeField::encode(kMode_MRI), NULL,
|
| g.UseRegister(base), g.UseImmediate(index), val);
|
| - } else if (g.CanBeImmediate(base, kLoadStoreImm)) {
|
| - Emit(opcode | AddressingModeField::encode(kMode_MRI), NULL,
|
| - g.UseRegister(index), g.UseImmediate(base), val);
|
| } else {
|
| Emit(opcode | AddressingModeField::encode(kMode_MRR), NULL,
|
| g.UseRegister(base), g.UseRegister(index), val);
|
|
|