mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-09 19:35:51 +00:00
Bug 1299376
- IonMonkey: MIPS64: Fix load unsigned 32-bit immediate in ma_li(ImmWord). r=arai
--- js/src/jit/mips64/MacroAssembler-mips64.cpp | 36 ++++++++++++++++++----------- 1 file changed, 22 insertions(+), 14 deletions(-)
This commit is contained in:
parent
81eb242627
commit
9c6578dffe
@ -206,29 +206,37 @@ MacroAssemblerMIPS64::ma_li(Register dest, CodeOffset* label)
|
||||
void
|
||||
MacroAssemblerMIPS64::ma_li(Register dest, ImmWord imm)
|
||||
{
|
||||
if ((int64_t)imm.value >= INT16_MIN && (int64_t)imm.value <= INT16_MAX) {
|
||||
as_addiu(dest, zero, imm.value);
|
||||
int64_t value = imm.value;
|
||||
|
||||
if (value >= INT16_MIN && value <= INT16_MAX) {
|
||||
as_addiu(dest, zero, value);
|
||||
} else if (imm.value <= UINT16_MAX) {
|
||||
as_ori(dest, zero, Imm16::Lower(Imm32(imm.value)).encode());
|
||||
} else if (0 == (imm.value & 0xffff) && 0 == (imm.value >> 32)) {
|
||||
as_lui(dest, Imm16::Upper(Imm32(imm.value)).encode());
|
||||
as_ori(dest, zero, Imm16::Lower(Imm32(value)).encode());
|
||||
} else if (value >= INT32_MIN && value <= INT32_MAX) {
|
||||
as_lui(dest, Imm16::Upper(Imm32(value)).encode());
|
||||
if (value & 0xffff)
|
||||
as_ori(dest, dest, Imm16::Lower(Imm32(value)).encode());
|
||||
} else if (imm.value <= UINT32_MAX) {
|
||||
as_lui(dest, Imm16::Upper(Imm32(imm.value)).encode());
|
||||
as_ori(dest, dest, Imm16::Lower(Imm32(imm.value)).encode());
|
||||
as_lui(dest, Imm16::Upper(Imm32(value)).encode());
|
||||
if (value & 0xffff)
|
||||
as_ori(dest, dest, Imm16::Lower(Imm32(value)).encode());
|
||||
as_dinsu(dest, zero, 32, 32);
|
||||
} else {
|
||||
uint64_t high = imm.value >> 32;
|
||||
|
||||
if (imm.value >> 48) {
|
||||
as_lui(dest, Imm16::Upper(Imm32(imm.value >> 32)).encode());
|
||||
if ((imm.value >> 32) & 0xffff)
|
||||
as_ori(dest, dest, Imm16::Lower(Imm32(imm.value >> 32)).encode());
|
||||
as_lui(dest, Imm16::Upper(Imm32(high)).encode());
|
||||
if (high & 0xffff)
|
||||
as_ori(dest, dest, Imm16::Lower(Imm32(high)).encode());
|
||||
as_dsll(dest, dest, 16);
|
||||
} else {
|
||||
as_lui(dest, Imm16::Lower(Imm32(imm.value >> 32)).encode());
|
||||
as_lui(dest, Imm16::Lower(Imm32(high)).encode());
|
||||
}
|
||||
if ((imm.value >> 16) & 0xffff)
|
||||
as_ori(dest, dest, Imm16::Upper(Imm32(imm.value)).encode());
|
||||
as_ori(dest, dest, Imm16::Upper(Imm32(value)).encode());
|
||||
as_dsll(dest, dest, 16);
|
||||
if (imm.value & 0xffff)
|
||||
as_ori(dest, dest, Imm16::Lower(Imm32(imm.value)).encode());
|
||||
if (value & 0xffff)
|
||||
as_ori(dest, dest, Imm16::Lower(Imm32(value)).encode());
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user