Skip to content

Commit

Permalink
Fix build (mozilla#12)
Browse files Browse the repository at this point in the history
  • Loading branch information
luyahan authored Aug 25, 2022
1 parent 8e84147 commit 63d9494
Show file tree
Hide file tree
Showing 3 changed files with 152 additions and 190 deletions.
4 changes: 4 additions & 0 deletions js/src/jit/riscv64/Architecture-riscv64.h
Original file line number Diff line number Diff line change
Expand Up @@ -431,6 +431,10 @@ static const int32_t NUNBOX32_TYPE_OFFSET = 4;
static const int32_t NUNBOX32_PAYLOAD_OFFSET = 0;
#endif

static const uint32_t SpillSlotSize =
std::max(sizeof(Registers::RegisterContent),
sizeof(FloatRegisters::RegisterContent));

inline uint32_t GetRISCV64Flags() { MOZ_CRASH(); }

} // namespace jit
Expand Down
318 changes: 132 additions & 186 deletions js/src/jit/riscv64/MoveEmitter-riscv64.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ void MoveEmitterRiscv64::breakCycle(const MoveOperand& from,
break;
case MoveOp::INT32:
if (to.isMemory()) {
UseScratchRegisterScope temps(masm);
UseScratchRegisterScope temps(&masm);
Register scratch2 = temps.Acquire();
masm.load32(getAdjustedAddress(to), scratch2);
masm.store32(scratch2, cycleSlot(0));
Expand All @@ -52,7 +52,7 @@ void MoveEmitterRiscv64::breakCycle(const MoveOperand& from,
break;
case MoveOp::GENERAL:
if (to.isMemory()) {
UseScratchRegisterScope temps(masm);
UseScratchRegisterScope temps(&masm);
Register scratch2 = temps.Acquire();
masm.loadPtr(getAdjustedAddress(to), scratch2);
masm.storePtr(scratch2, cycleSlot(0));
Expand Down Expand Up @@ -97,7 +97,7 @@ void MoveEmitterRiscv64::completeCycle(const MoveOperand& from,
case MoveOp::INT32:
MOZ_ASSERT(slotId == 0);
if (to.isMemory()) {
UseScratchRegisterScope temps(masm);
UseScratchRegisterScope temps(&masm);
Register scratch2 = temps.Acquire();
masm.load32(cycleSlot(0), scratch2);
masm.store32(scratch2, getAdjustedAddress(to));
Expand All @@ -108,7 +108,7 @@ void MoveEmitterRiscv64::completeCycle(const MoveOperand& from,
case MoveOp::GENERAL:
MOZ_ASSERT(slotId == 0);
if (to.isMemory()) {
UseScratchRegisterScope temps(masm);
UseScratchRegisterScope temps(&masm);
Register scratch2 = temps.Acquire();
masm.loadPtr(cycleSlot(0), scratch2);
masm.storePtr(scratch2, getAdjustedAddress(to));
Expand All @@ -122,22 +122,11 @@ void MoveEmitterRiscv64::completeCycle(const MoveOperand& from,
}

void MoveEmitterRiscv64::emit(const MoveResolver& moves) {
if (moves.numCycles()) {
// Reserve stack for cycle resolution
static_assert(SpillSlotSize == 8);
masm.reserveStack(moves.numCycles() * SpillSlotSize);
pushedAtCycle_ = masm.framePushed();
}

for (size_t i = 0; i < moves.numMoves(); i++) {
emit(moves.getMove(i));
}
MOZ_CRASH("Unimplement on riscv");
}

Address MoveEmitterRiscv64::cycleSlot(uint32_t slot, uint32_t subslot) const {
int32_t offset = masm.framePushed() - pushedAtCycle_;
MOZ_ASSERT(Imm16::IsInSignedRange(offset));
return Address(StackPointer, offset + slot * sizeof(double) + subslot);
MOZ_CRASH("Unimplement on riscv");
}

int32_t MoveEmitterRiscv64::getAdjustedOffset(const MoveOperand& operand) {
Expand All @@ -154,178 +143,135 @@ Address MoveEmitterRiscv64::getAdjustedAddress(const MoveOperand& operand) {
return Address(operand.base(), getAdjustedOffset(operand));
}

void MoveEmitterRiscv64::emitMove(const MoveOperand& from,
const MoveOperand& to) {
if (from.isGeneralReg()) {
if (to.isGeneralReg()) {
masm.movePtr(from.reg(), to.reg());
} else if (to.isMemory()) {
masm.storePtr(from.reg(), getAdjustedAddress(to));
} else {
MOZ_CRASH("Invalid emitMove arguments.");
}
} else if (from.isMemory()) {
if (to.isGeneralReg()) {
masm.loadPtr(getAdjustedAddress(from), to.reg());
} else if (to.isMemory()) {
UseScratchRegisterScope temps(masm);
Register scratch2 = temps.Acquire();
masm.loadPtr(getAdjustedAddress(from), scratch2);
masm.storePtr(scratch2, getAdjustedAddress(to));
} else {
MOZ_CRASH("Invalid emitMove arguments.");
}
} else if (from.isEffectiveAddress()) {
if (to.isGeneralReg()) {
masm.computeEffectiveAddress(getAdjustedAddress(from), to.reg());
} else if (to.isMemory()) {
UseScratchRegisterScope temps(masm);
Register scratch2 = temps.Acquire();
masm.computeEffectiveAddress(getAdjustedAddress(from), scratch2);
masm.storePtr(scratch2, getAdjustedAddress(to));
} else {
MOZ_CRASH("Invalid emitMove arguments.");
}
} else {
MOZ_CRASH("Invalid emitMove arguments.");
}
}

void MoveEmitterRiscv64::emitInt32Move(const MoveOperand& from,
const MoveOperand& to) {
if (from.isGeneralReg()) {
if (to.isGeneralReg()) {
masm.move32(from.reg(), to.reg());
} else if (to.isMemory()) {
masm.store32(from.reg(), getAdjustedAddress(to));
} else {
MOZ_CRASH("Invalid emitInt32Move arguments.");
}
} else if (from.isMemory()) {
if (to.isGeneralReg()) {
masm.load32(getAdjustedAddress(from), to.reg());
} else if (to.isMemory()) {
UseScratchRegisterScope temps(masm);
Register scratch2 = temps.Acquire();
masm.load32(getAdjustedAddress(from), scratch2);
masm.store32(scratch2, getAdjustedAddress(to));
} else {
MOZ_CRASH("Invalid emitInt32Move arguments.");
}
} else if (from.isEffectiveAddress()) {
if (to.isGeneralReg()) {
masm.computeEffectiveAddress(getAdjustedAddress(from), to.reg());
} else if (to.isMemory()) {
UseScratchRegisterScope temps(masm);
Register scratch2 = temps.Acquire();
masm.computeEffectiveAddress(getAdjustedAddress(from), scratch2);
masm.store32(scratch2, getAdjustedAddress(to));
} else {
MOZ_CRASH("Invalid emitInt32Move arguments.");
}
} else {
MOZ_CRASH("Invalid emitInt32Move arguments.");
}
}

void MoveEmitterRiscv64::emitFloat32Move(const MoveOperand& from,
const MoveOperand& to) {
if (from.isFloatReg()) {
if (to.isFloatReg()) {
masm.moveFloat32(from.floatReg(), to.floatReg());
} else if (to.isGeneralReg()) {
// This should only be used when passing float parameter in a1,a2,a3
MOZ_ASSERT(to.reg() == a1 || to.reg() == a2 || to.reg() == a3);
masm.moveFromFloat32(from.floatReg(), to.reg());
} else {
MOZ_ASSERT(to.isMemory());
masm.storeFloat32(from.floatReg(), getAdjustedAddress(to));
}
} else if (to.isFloatReg()) {
MOZ_ASSERT(from.isMemory());
masm.loadFloat32(getAdjustedAddress(from), to.floatReg());
} else if (to.isGeneralReg()) {
MOZ_ASSERT(from.isMemory());
// This should only be used when passing float parameter in a1,a2,a3
MOZ_ASSERT(to.reg() == a1 || to.reg() == a2 || to.reg() == a3);
masm.loadPtr(getAdjustedAddress(from), to.reg());
} else {
MOZ_ASSERT(from.isMemory());
MOZ_ASSERT(to.isMemory());
ScratchFloat32Scope fpscratch32(masm);
masm.loadFloat32(getAdjustedAddress(from), fpscratch32);
masm.storeFloat32(fpscratch32, getAdjustedAddress(to));
}
}

void MoveEmitterRiscv64::emitDoubleMove(const MoveOperand& from,
const MoveOperand& to) {
if (from.isFloatReg()) {
if (to.isFloatReg()) {
masm.moveDouble(from.floatReg(), to.floatReg());
} else if (to.isGeneralReg()) {
masm.moveFromDouble(from.floatReg(), to.reg());
} else {
MOZ_ASSERT(to.isMemory());
masm.storeDouble(from.floatReg(), getAdjustedAddress(to));
}
} else if (to.isFloatReg()) {
if (from.isMemory()) {
masm.loadDouble(getAdjustedAddress(from), to.floatReg());
} else {
masm.moveToDouble(from.reg(), to.floatReg());
}
} else {
MOZ_ASSERT(from.isMemory());
MOZ_ASSERT(to.isMemory());
ScratchDoubleScope fpscratch64(masm);
masm.loadDouble(getAdjustedAddress(from), fpscratch64);
masm.storeDouble(fpscratch64, getAdjustedAddress(to));
}
}
// void MoveEmitterRiscv64::emitMove(const MoveOperand& from,
// const MoveOperand& to) {
// if (from.isGeneralReg()) {
// if (to.isGeneralReg()) {
// masm.movePtr(from.reg(), to.reg());
// } else if (to.isMemory()) {
// masm.storePtr(from.reg(), getAdjustedAddress(to));
// } else {
// MOZ_CRASH("Invalid emitMove arguments.");
// }
// } else if (from.isMemory()) {
// if (to.isGeneralReg()) {
// masm.loadPtr(getAdjustedAddress(from), to.reg());
// } else if (to.isMemory()) {
// UseScratchRegisterScope temps(&masm);
// Register scratch2 = temps.Acquire();
// masm.loadPtr(getAdjustedAddress(from), scratch2);
// masm.storePtr(scratch2, getAdjustedAddress(to));
// } else {
// MOZ_CRASH("Invalid emitMove arguments.");
// }
// } else if (from.isEffectiveAddress()) {
// if (to.isGeneralReg()) {
// masm.computeEffectiveAddress(getAdjustedAddress(from), to.reg());
// } else if (to.isMemory()) {
// UseScratchRegisterScope temps(&masm);
// Register scratch2 = temps.Acquire();
// masm.computeEffectiveAddress(getAdjustedAddress(from), scratch2);
// masm.storePtr(scratch2, getAdjustedAddress(to));
// } else {
// MOZ_CRASH("Invalid emitMove arguments.");
// }
// } else {
// MOZ_CRASH("Invalid emitMove arguments.");
// }
// }

void MoveEmitterRiscv64::emit(const MoveOp& move) {
const MoveOperand& from = move.from();
const MoveOperand& to = move.to();
// void MoveEmitterRiscv64::emitInt32Move(const MoveOperand& from,
// const MoveOperand& to) {
// if (from.isGeneralReg()) {
// if (to.isGeneralReg()) {
// masm.move32(from.reg(), to.reg());
// } else if (to.isMemory()) {
// masm.store32(from.reg(), getAdjustedAddress(to));
// } else {
// MOZ_CRASH("Invalid emitInt32Move arguments.");
// }
// } else if (from.isMemory()) {
// if (to.isGeneralReg()) {
// masm.load32(getAdjustedAddress(from), to.reg());
// } else if (to.isMemory()) {
// UseScratchRegisterScope temps(&masm);
// Register scratch2 = temps.Acquire();
// masm.load32(getAdjustedAddress(from), scratch2);
// masm.store32(scratch2, getAdjustedAddress(to));
// } else {
// MOZ_CRASH("Invalid emitInt32Move arguments.");
// }
// } else if (from.isEffectiveAddress()) {
// if (to.isGeneralReg()) {
// masm.computeEffectiveAddress(getAdjustedAddress(from), to.reg());
// } else if (to.isMemory()) {
// UseScratchRegisterScope temps(&masm);
// Register scratch2 = temps.Acquire();
// masm.computeEffectiveAddress(getAdjustedAddress(from), scratch2);
// masm.store32(scratch2, getAdjustedAddress(to));
// } else {
// MOZ_CRASH("Invalid emitInt32Move arguments.");
// }
// } else {
// MOZ_CRASH("Invalid emitInt32Move arguments.");
// }
// }

if (move.isCycleEnd() && move.isCycleBegin()) {
// A fun consequence of aliased registers is you can have multiple
// cycles at once, and one can end exactly where another begins.
breakCycle(from, to, move.endCycleType(), move.cycleBeginSlot());
completeCycle(from, to, move.type(), move.cycleEndSlot());
return;
}
// void MoveEmitterRiscv64::emitFloat32Move(const MoveOperand& from,
// const MoveOperand& to) {
// if (from.isFloatReg()) {
// if (to.isFloatReg()) {
// masm.moveFloat32(from.floatReg(), to.floatReg());
// } else if (to.isGeneralReg()) {
// // This should only be used when passing float parameter in a1,a2,a3
// MOZ_ASSERT(to.reg() == a1 || to.reg() == a2 || to.reg() == a3);
// masm.moveFromFloat32(from.floatReg(), to.reg());
// } else {
// MOZ_ASSERT(to.isMemory());
// masm.storeFloat32(from.floatReg(), getAdjustedAddress(to));
// }
// } else if (to.isFloatReg()) {
// MOZ_ASSERT(from.isMemory());
// masm.loadFloat32(getAdjustedAddress(from), to.floatReg());
// } else if (to.isGeneralReg()) {
// MOZ_ASSERT(from.isMemory());
// // This should only be used when passing float parameter in a1,a2,a3
// MOZ_ASSERT(to.reg() == a1 || to.reg() == a2 || to.reg() == a3);
// masm.loadPtr(getAdjustedAddress(from), to.reg());
// } else {
// MOZ_ASSERT(from.isMemory());
// MOZ_ASSERT(to.isMemory());
// ScratchFloat32Scope fpscratch32(masm);
// masm.loadFloat32(getAdjustedAddress(from), fpscratch32);
// masm.storeFloat32(fpscratch32, getAdjustedAddress(to));
// }
// }

if (move.isCycleEnd()) {
MOZ_ASSERT(inCycle_);
completeCycle(from, to, move.type(), move.cycleEndSlot());
MOZ_ASSERT(inCycle_ > 0);
inCycle_--;
return;
}

if (move.isCycleBegin()) {
breakCycle(from, to, move.endCycleType(), move.cycleBeginSlot());
inCycle_++;
}

switch (move.type()) {
case MoveOp::FLOAT32:
emitFloat32Move(from, to);
break;
case MoveOp::DOUBLE:
emitDoubleMove(from, to);
break;
case MoveOp::INT32:
emitInt32Move(from, to);
break;
case MoveOp::GENERAL:
emitMove(from, to);
break;
default:
MOZ_CRASH("Unexpected move type");
}
}
// void MoveEmitterRiscv64::emitDoubleMove(const MoveOperand& from,
// const MoveOperand& to) {
// if (from.isFloatReg()) {
// if (to.isFloatReg()) {
// masm.moveDouble(from.floatReg(), to.floatReg());
// } else if (to.isGeneralReg()) {
// masm.moveFromDouble(from.floatReg(), to.reg());
// } else {
// MOZ_ASSERT(to.isMemory());
// masm.storeDouble(from.floatReg(), getAdjustedAddress(to));
// }
// } else if (to.isFloatReg()) {
// if (from.isMemory()) {
// masm.loadDouble(getAdjustedAddress(from), to.floatReg());
// } else {
// masm.moveToDouble(from.reg(), to.floatReg());
// }
// } else {
// MOZ_ASSERT(from.isMemory());
// MOZ_ASSERT(to.isMemory());
// ScratchDoubleScope fpscratch64(masm);
// masm.loadDouble(getAdjustedAddress(from), fpscratch64);
// masm.storeDouble(fpscratch64, getAdjustedAddress(to));
// }
// }

void MoveEmitterRiscv64::assertDone() {
MOZ_ASSERT(inCycle_ == 0);
Expand Down
Loading

0 comments on commit 63d9494

Please sign in to comment.