| 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..0f77c86ac95e5fa32bf017c175de882b99b664b6 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,79 @@ 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)) {
|
| + 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)) {
|
| + 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));
|
|
|