Chromium Code Reviews| Index: src/mips/macro-assembler-mips.cc |
| diff --git a/src/mips/macro-assembler-mips.cc b/src/mips/macro-assembler-mips.cc |
| index a58084cfbef4f76a98e8ce55691b7ba81ba77175..5f04a5bf5d9bf45c965a5111d85732fab415ed77 100644 |
| --- a/src/mips/macro-assembler-mips.cc |
| +++ b/src/mips/macro-assembler-mips.cc |
| @@ -30,7 +30,6 @@ MacroAssembler::MacroAssembler(Isolate* arg_isolate, void* buffer, int size, |
| } |
| } |
| - |
| void MacroAssembler::Load(Register dst, |
| const MemOperand& src, |
| Representation r) { |
| @@ -67,7 +66,6 @@ void MacroAssembler::Store(Register src, |
| } |
| } |
| - |
| void MacroAssembler::LoadRoot(Register destination, |
| Heap::RootListIndex index) { |
| lw(destination, MemOperand(s6, index << kPointerSizeLog2)); |
| @@ -1191,6 +1189,77 @@ void MacroAssembler::Lsa(Register rd, Register rt, Register rs, uint8_t sa, |
| // ------------Pseudo-instructions------------- |
| +// Word Swap Byte |
| +void MacroAssembler::ByteSwapSigned(Register reg, int operand_size) { |
| + DCHECK(operand_size == 1 || operand_size == 2 || operand_size == 4); |
| + if (IsMipsArchVariant(kMips32r2) || IsMipsArchVariant(kMips32r6)) { |
|
balazs.kilvady
2016/06/21 10:24:58
Please use { and } in the below if instructions.
|
| + if (operand_size == 2) |
| + seh(reg, reg); |
| + else if (operand_size == 1) |
| + seb(reg, reg); |
| + // No need to do any preparation if operand_size is 4 |
| + |
| + wsbh(reg, reg); |
| + rotr(reg, reg, 16); |
| + } else if (IsMipsArchVariant(kMips32r1) || IsMipsArchVariant(kLoongson)) { |
| + if (operand_size == 1) { |
| + sll(reg, reg, 24); |
| + sra(reg, reg, 24); |
| + } else if (operand_size == 2) { |
| + sll(reg, reg, 16); |
| + sra(reg, reg, 16); |
| + } |
| + // No need to do any preparation if operand_size is 4 |
| + |
| + Register tmp = t0; |
| + Register tmp2 = t1; |
| + |
| + andi(tmp2, reg, 0xFF); |
| + sll(tmp2, tmp2, 24); |
| + or_(tmp, zero_reg, tmp2); |
| + |
| + andi(tmp2, reg, 0xFF00); |
| + sll(tmp2, tmp2, 8); |
| + or_(tmp, tmp, tmp2); |
| + |
| + srl(reg, reg, 8); |
| + andi(tmp2, reg, 0xFF00); |
| + or_(tmp, tmp, tmp2); |
| + |
| + srl(reg, reg, 16); |
| + andi(tmp2, reg, 0xFF); |
| + or_(tmp, tmp, tmp2); |
| + |
| + or_(reg, tmp, zero_reg); |
| + } |
| +} |
| + |
| +void MacroAssembler::ByteSwapUnsigned(Register reg, int operand_size) { |
| + DCHECK(operand_size == 1 || operand_size == 2); |
| + |
| + if (IsMipsArchVariant(kMips32r2) || IsMipsArchVariant(kMips32r6)) { |
|
balazs.kilvady
2016/06/21 10:24:58
{}
|
| + if (operand_size == 1) |
| + andi(reg, reg, 0xFF); |
| + else |
| + andi(reg, reg, 0xFFFF); |
| + // No need to do any preparation if operand_size is 4 |
| + |
| + wsbh(reg, reg); |
| + rotr(reg, reg, 16); |
| + } else if (IsMipsArchVariant(kMips32r1) || IsMipsArchVariant(kLoongson)) { |
| + if (operand_size == 1) { |
| + sll(reg, reg, 24); |
| + } else { |
| + Register tmp = t0; |
| + |
| + andi(tmp, reg, 0xFF00); |
| + sll(reg, reg, 24); |
| + sll(tmp, tmp, 8); |
| + or_(reg, tmp, reg); |
| + } |
| + } |
| +} |
| + |
| void MacroAssembler::Ulw(Register rd, const MemOperand& rs) { |
| DCHECK(!rd.is(at)); |
| DCHECK(!rs.rm().is(at)); |