Commit 72a2ec9e authored by Benedikt Meurer's avatar Benedikt Meurer

[x64] Recognize MOVSXBL.

TEST=mjsunit/asm
R=svenpanne@chromium.org

Review URL: https://codereview.chromium.org/728103007

Cr-Commit-Position: refs/heads/master@{#25386}
parent 3c79e2e9
...@@ -483,7 +483,13 @@ void CodeGenerator::AssembleArchInstruction(Instruction* instr) { ...@@ -483,7 +483,13 @@ void CodeGenerator::AssembleArchInstruction(Instruction* instr) {
__ cvtqsi2sd(i.OutputDoubleRegister(), kScratchRegister); __ cvtqsi2sd(i.OutputDoubleRegister(), kScratchRegister);
break; break;
case kX64Movsxbl: case kX64Movsxbl:
__ movsxbl(i.OutputRegister(), i.MemoryOperand()); if (instr->addressing_mode() != kMode_None) {
__ movsxbl(i.OutputRegister(), i.MemoryOperand());
} else if (instr->InputAt(0)->IsRegister()) {
__ movsxbl(i.OutputRegister(), i.InputRegister(0));
} else {
__ movsxbl(i.OutputRegister(), i.InputOperand(0));
}
__ AssertZeroExtended(i.OutputRegister()); __ AssertZeroExtended(i.OutputRegister());
break; break;
case kX64Movzxbl: case kX64Movzxbl:
......
...@@ -353,6 +353,9 @@ void InstructionSelector::VisitWord32Sar(Node* node) { ...@@ -353,6 +353,9 @@ void InstructionSelector::VisitWord32Sar(Node* node) {
if (mleft.right().Is(16) && m.right().Is(16)) { if (mleft.right().Is(16) && m.right().Is(16)) {
Emit(kX64Movsxwl, g.DefineAsRegister(node), g.Use(mleft.left().node())); Emit(kX64Movsxwl, g.DefineAsRegister(node), g.Use(mleft.left().node()));
return; return;
} else if (mleft.right().Is(24) && m.right().Is(24)) {
Emit(kX64Movsxbl, g.DefineAsRegister(node), g.Use(mleft.left().node()));
return;
} }
} }
VisitWord32Shift(this, node, kX64Sar32); VisitWord32Shift(this, node, kX64Sar32);
......
...@@ -1383,6 +1383,20 @@ void Assembler::movl(const Operand& dst, Label* src) { ...@@ -1383,6 +1383,20 @@ void Assembler::movl(const Operand& dst, Label* src) {
} }
void Assembler::movsxbl(Register dst, Register src) {
EnsureSpace ensure_space(this);
if (!src.is_byte_register()) {
// Register is not one of al, bl, cl, dl. Its encoding needs REX.
emit_rex_32(dst, src);
} else {
emit_optional_rex_32(dst, src);
}
emit(0x0F);
emit(0xBE);
emit_modrm(dst, src);
}
void Assembler::movsxbl(Register dst, const Operand& src) { void Assembler::movsxbl(Register dst, const Operand& src) {
EnsureSpace ensure_space(this); EnsureSpace ensure_space(this);
emit_optional_rex_32(dst, src); emit_optional_rex_32(dst, src);
......
...@@ -731,6 +731,7 @@ class Assembler : public AssemblerBase { ...@@ -731,6 +731,7 @@ class Assembler : public AssemblerBase {
void movq(Register dst, int64_t value); void movq(Register dst, int64_t value);
void movq(Register dst, uint64_t value); void movq(Register dst, uint64_t value);
void movsxbl(Register dst, Register src);
void movsxbl(Register dst, const Operand& src); void movsxbl(Register dst, const Operand& src);
void movsxbq(Register dst, const Operand& src); void movsxbq(Register dst, const Operand& src);
void movsxwl(Register dst, Register src); void movsxwl(Register dst, Register src);
......
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