| Index: src/compiler/arm/instruction-selector-arm.cc
|
| diff --git a/src/compiler/arm/instruction-selector-arm.cc b/src/compiler/arm/instruction-selector-arm.cc
|
| index 90c8eb530039a5a65c6453ce1f114baddfe5bf10..6ec86bd6413d9c3e3ff04b6d5877e97218f4a0f3 100644
|
| --- a/src/compiler/arm/instruction-selector-arm.cc
|
| +++ b/src/compiler/arm/instruction-selector-arm.cc
|
| @@ -55,19 +55,21 @@ class ArmOperandGenerator V8_FINAL : public OperandGenerator {
|
| case kArmRsb:
|
| return ImmediateFitsAddrMode1Instruction(value);
|
|
|
| - case kArmFloat64Load:
|
| - case kArmFloat64Store:
|
| + case kArmVldr64:
|
| + case kArmVstr64:
|
| return value >= -1020 && value <= 1020 && (value % 4) == 0;
|
|
|
| - case kArmLoadWord8:
|
| - case kArmStoreWord8:
|
| - case kArmLoadWord32:
|
| - case kArmStoreWord32:
|
| + case kArmLdrb:
|
| + case kArmLdrsb:
|
| + case kArmStrb:
|
| + case kArmLdr:
|
| + case kArmStr:
|
| case kArmStoreWriteBarrier:
|
| return value >= -4095 && value <= 4095;
|
|
|
| - case kArmLoadWord16:
|
| - case kArmStoreWord16:
|
| + case kArmLdrh:
|
| + case kArmLdrsh:
|
| + case kArmStrh:
|
| return value >= -255 && value <= 255;
|
|
|
| case kArchJmp:
|
| @@ -287,6 +289,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));
|
| ArmOperandGenerator g(this);
|
| Node* base = node->InputAt(0);
|
| Node* index = node->InputAt(1);
|
| @@ -296,21 +299,20 @@ void InstructionSelector::VisitLoad(Node* node) {
|
| : g.DefineAsRegister(node);
|
|
|
| ArchOpcode opcode;
|
| - // TODO(titzer): signed/unsigned small loads
|
| switch (rep) {
|
| case kRepFloat64:
|
| - opcode = kArmFloat64Load;
|
| + opcode = kArmVldr64;
|
| break;
|
| case kRepBit: // Fall through.
|
| case kRepWord8:
|
| - opcode = kArmLoadWord8;
|
| + opcode = typ == kTypeUint32 ? kArmLdrb : kArmLdrsb;
|
| break;
|
| case kRepWord16:
|
| - opcode = kArmLoadWord16;
|
| + opcode = typ == kTypeUint32 ? kArmLdrh : kArmLdrsh;
|
| break;
|
| case kRepTagged: // Fall through.
|
| case kRepWord32:
|
| - opcode = kArmLoadWord32;
|
| + opcode = kArmLdr;
|
| break;
|
| default:
|
| UNREACHABLE();
|
| @@ -320,9 +322,6 @@ void InstructionSelector::VisitLoad(Node* node) {
|
| if (g.CanBeImmediate(index, opcode)) {
|
| Emit(opcode | AddressingModeField::encode(kMode_Offset_RI), result,
|
| g.UseRegister(base), g.UseImmediate(index));
|
| - } else if (g.CanBeImmediate(base, opcode)) {
|
| - Emit(opcode | AddressingModeField::encode(kMode_Offset_RI), result,
|
| - g.UseRegister(index), g.UseImmediate(base));
|
| } else {
|
| Emit(opcode | AddressingModeField::encode(kMode_Offset_RR), result,
|
| g.UseRegister(base), g.UseRegister(index));
|
| @@ -356,18 +355,18 @@ void InstructionSelector::VisitStore(Node* node) {
|
| ArchOpcode opcode;
|
| switch (rep) {
|
| case kRepFloat64:
|
| - opcode = kArmFloat64Store;
|
| + opcode = kArmVstr64;
|
| break;
|
| case kRepBit: // Fall through.
|
| case kRepWord8:
|
| - opcode = kArmStoreWord8;
|
| + opcode = kArmStrb;
|
| break;
|
| case kRepWord16:
|
| - opcode = kArmStoreWord16;
|
| + opcode = kArmStrh;
|
| break;
|
| case kRepTagged: // Fall through.
|
| case kRepWord32:
|
| - opcode = kArmStoreWord32;
|
| + opcode = kArmStr;
|
| break;
|
| default:
|
| UNREACHABLE();
|
| @@ -377,9 +376,6 @@ void InstructionSelector::VisitStore(Node* node) {
|
| if (g.CanBeImmediate(index, opcode)) {
|
| Emit(opcode | AddressingModeField::encode(kMode_Offset_RI), NULL,
|
| g.UseRegister(base), g.UseImmediate(index), val);
|
| - } else if (g.CanBeImmediate(base, opcode)) {
|
| - Emit(opcode | AddressingModeField::encode(kMode_Offset_RI), NULL,
|
| - g.UseRegister(index), g.UseImmediate(base), val);
|
| } else {
|
| Emit(opcode | AddressingModeField::encode(kMode_Offset_RR), NULL,
|
| g.UseRegister(base), g.UseRegister(index), val);
|
|
|