Commit e11eb9a7 authored by akos.palfi's avatar akos.palfi Committed by Commit bot

MIPS: [Atomics] Make Atomics.store a builtin using TF

Port 81cb8411

BUG=

Review-Url: https://codereview.chromium.org/1957463002
Cr-Commit-Position: refs/heads/master@{#36053}
parent 87cbbdfb
...@@ -478,6 +478,13 @@ FPUCondition FlagsConditionToConditionCmpFPU(bool& predicate, ...@@ -478,6 +478,13 @@ FPUCondition FlagsConditionToConditionCmpFPU(bool& predicate,
__ sync(); \ __ sync(); \
} while (0) } while (0)
#define ASSEMBLE_ATOMIC_STORE_INTEGER(asm_instr) \
do { \
__ sync(); \
__ asm_instr(i.InputRegister(2), i.MemoryOperand()); \
__ sync(); \
} while (0)
void CodeGenerator::AssembleDeconstructFrame() { void CodeGenerator::AssembleDeconstructFrame() {
__ mov(sp, fp); __ mov(sp, fp);
__ Pop(ra, fp); __ Pop(ra, fp);
...@@ -1347,10 +1354,13 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( ...@@ -1347,10 +1354,13 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
ASSEMBLE_ATOMIC_LOAD_INTEGER(lw); ASSEMBLE_ATOMIC_LOAD_INTEGER(lw);
break; break;
case kAtomicStoreWord8: case kAtomicStoreWord8:
ASSEMBLE_ATOMIC_STORE_INTEGER(sb);
break;
case kAtomicStoreWord16: case kAtomicStoreWord16:
ASSEMBLE_ATOMIC_STORE_INTEGER(sh);
break;
case kAtomicStoreWord32: case kAtomicStoreWord32:
// TODO(binji): implement ASSEMBLE_ATOMIC_STORE_INTEGER(sw);
__ nop();
break; break;
} }
return kSuccess; return kSuccess;
......
...@@ -1504,17 +1504,15 @@ void InstructionSelector::VisitAtomicStore(Node* node) { ...@@ -1504,17 +1504,15 @@ void InstructionSelector::VisitAtomicStore(Node* node) {
} }
if (g.CanBeImmediate(index, opcode)) { if (g.CanBeImmediate(index, opcode)) {
Emit(opcode | AddressingModeField::encode(kMode_MRI), Emit(opcode | AddressingModeField::encode(kMode_MRI), g.NoOutput(),
g.DefineAsRegister(node), g.UseRegister(base), g.UseImmediate(index), g.UseRegister(base), g.UseImmediate(index), g.UseRegister(value));
g.UseRegister(value));
} else { } else {
InstructionOperand addr_reg = g.TempRegister(); InstructionOperand addr_reg = g.TempRegister();
Emit(kMipsAdd | AddressingModeField::encode(kMode_None), addr_reg, Emit(kMipsAdd | AddressingModeField::encode(kMode_None), addr_reg,
g.UseRegister(index), g.UseRegister(base)); g.UseRegister(index), g.UseRegister(base));
// Emit desired store opcode, using temp addr_reg. // Emit desired store opcode, using temp addr_reg.
Emit(opcode | AddressingModeField::encode(kMode_MRI), Emit(opcode | AddressingModeField::encode(kMode_MRI), g.NoOutput(),
g.DefineAsRegister(node), addr_reg, g.TempImmediate(0), addr_reg, g.TempImmediate(0), g.UseRegister(value));
g.UseRegister(value));
} }
} }
......
...@@ -489,6 +489,13 @@ FPUCondition FlagsConditionToConditionCmpFPU(bool& predicate, ...@@ -489,6 +489,13 @@ FPUCondition FlagsConditionToConditionCmpFPU(bool& predicate,
__ sync(); \ __ sync(); \
} while (0) } while (0)
#define ASSEMBLE_ATOMIC_STORE_INTEGER(asm_instr) \
do { \
__ sync(); \
__ asm_instr(i.InputRegister(2), i.MemoryOperand()); \
__ sync(); \
} while (0)
void CodeGenerator::AssembleDeconstructFrame() { void CodeGenerator::AssembleDeconstructFrame() {
__ mov(sp, fp); __ mov(sp, fp);
__ Pop(ra, fp); __ Pop(ra, fp);
...@@ -1599,10 +1606,13 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( ...@@ -1599,10 +1606,13 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
ASSEMBLE_ATOMIC_LOAD_INTEGER(lw); ASSEMBLE_ATOMIC_LOAD_INTEGER(lw);
break; break;
case kAtomicStoreWord8: case kAtomicStoreWord8:
ASSEMBLE_ATOMIC_STORE_INTEGER(sb);
break;
case kAtomicStoreWord16: case kAtomicStoreWord16:
ASSEMBLE_ATOMIC_STORE_INTEGER(sh);
break;
case kAtomicStoreWord32: case kAtomicStoreWord32:
// TODO(binji): implement ASSEMBLE_ATOMIC_STORE_INTEGER(sw);
__ nop();
break; break;
} }
return kSuccess; return kSuccess;
......
...@@ -2015,17 +2015,15 @@ void InstructionSelector::VisitAtomicStore(Node* node) { ...@@ -2015,17 +2015,15 @@ void InstructionSelector::VisitAtomicStore(Node* node) {
} }
if (g.CanBeImmediate(index, opcode)) { if (g.CanBeImmediate(index, opcode)) {
Emit(opcode | AddressingModeField::encode(kMode_MRI), Emit(opcode | AddressingModeField::encode(kMode_MRI), g.NoOutput(),
g.DefineAsRegister(node), g.UseRegister(base), g.UseImmediate(index), g.UseRegister(base), g.UseImmediate(index), g.UseRegister(value));
g.UseRegister(value));
} else { } else {
InstructionOperand addr_reg = g.TempRegister(); InstructionOperand addr_reg = g.TempRegister();
Emit(kMips64Dadd | AddressingModeField::encode(kMode_None), addr_reg, Emit(kMips64Dadd | AddressingModeField::encode(kMode_None), addr_reg,
g.UseRegister(index), g.UseRegister(base)); g.UseRegister(index), g.UseRegister(base));
// Emit desired store opcode, using temp addr_reg. // Emit desired store opcode, using temp addr_reg.
Emit(opcode | AddressingModeField::encode(kMode_MRI), Emit(opcode | AddressingModeField::encode(kMode_MRI), g.NoOutput(),
g.DefineAsRegister(node), addr_reg, g.TempImmediate(0), addr_reg, g.TempImmediate(0), g.UseRegister(value));
g.UseRegister(value));
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment