Commit f36713b5 authored by ivica.bogosavljevic's avatar ivica.bogosavljevic Committed by Commit bot

MIPS: Simulate SEB and SEH instructions on MIPS32R1 through MacroAssembler

SEB and SEH instructions are not available on MIPS32R1. This caused several failures on
MIPS32R1 in mjsunit/wasm/* and mjsunit/asm test suites.
This fix simulates these instruction in MacroAssembler for those architectures that do not support them.

TEST=mjsunit/asm/sqlite3/sqlite-pointer-masking,mjsunit/wasm/embenchen/lua_binarytrees
BUG=

Review-Url: https://chromiumcodereview.appspot.com/2434973002
Cr-Commit-Position: refs/heads/master@{#40467}
parent 54194b2d
......@@ -1394,10 +1394,10 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
// ... more basic instructions ...
case kMipsSeb:
__ seb(i.OutputRegister(), i.InputRegister(0));
__ Seb(i.OutputRegister(), i.InputRegister(0));
break;
case kMipsSeh:
__ seh(i.OutputRegister(), i.InputRegister(0));
__ Seh(i.OutputRegister(), i.InputRegister(0));
break;
case kMipsLbu:
__ lbu(i.OutputRegister(), i.MemoryOperand());
......
......@@ -1136,26 +1136,18 @@ void MacroAssembler::Bnvc(Register rs, Register rt, Label* L) {
void MacroAssembler::ByteSwapSigned(Register dest, Register src,
int operand_size) {
DCHECK(operand_size == 1 || operand_size == 2 || operand_size == 4);
if (IsMipsArchVariant(kMips32r2) || IsMipsArchVariant(kMips32r6)) {
if (operand_size == 2) {
seh(src, src);
} else if (operand_size == 1) {
seb(src, src);
}
// No need to do any preparation if operand_size is 4
if (operand_size == 2) {
Seh(src, src);
} else if (operand_size == 1) {
Seb(src, src);
}
// No need to do any preparation if operand_size is 4
if (IsMipsArchVariant(kMips32r2) || IsMipsArchVariant(kMips32r6)) {
wsbh(dest, src);
rotr(dest, dest, 16);
} else if (IsMipsArchVariant(kMips32r1) || IsMipsArchVariant(kLoongson)) {
if (operand_size == 1) {
sll(src, src, 24);
sra(src, src, 24);
} else if (operand_size == 2) {
sll(src, src, 16);
sra(src, src, 16);
}
// No need to do any preparation if operand_size is 4
Register tmp = t0;
Register tmp2 = t1;
......@@ -1836,6 +1828,26 @@ void MacroAssembler::Ins(Register rt,
}
}
void MacroAssembler::Seb(Register rd, Register rt) {
if (IsMipsArchVariant(kMips32r2) || IsMipsArchVariant(kMips32r6)) {
seb(rd, rt);
} else {
DCHECK(IsMipsArchVariant(kMips32r1) || IsMipsArchVariant(kLoongson));
sll(rd, rt, 24);
sra(rd, rd, 24);
}
}
void MacroAssembler::Seh(Register rd, Register rt) {
if (IsMipsArchVariant(kMips32r2) || IsMipsArchVariant(kMips32r6)) {
seh(rd, rt);
} else {
DCHECK(IsMipsArchVariant(kMips32r1) || IsMipsArchVariant(kLoongson));
sll(rd, rt, 16);
sra(rd, rd, 16);
}
}
void MacroAssembler::Neg_s(FPURegister fd, FPURegister fs) {
if (IsMipsArchVariant(kMips32r6)) {
// r6 neg_s changes the sign for NaN-like operands as well.
......
......@@ -833,6 +833,8 @@ class MacroAssembler: public Assembler {
// MIPS32 R2 instruction macro.
void Ins(Register rt, Register rs, uint16_t pos, uint16_t size);
void Ext(Register rt, Register rs, uint16_t pos, uint16_t size);
void Seb(Register rd, Register rt);
void Seh(Register rd, Register rt);
void Neg_s(FPURegister fd, FPURegister fs);
void Neg_d(FPURegister fd, FPURegister fs);
......
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