refactor test instruction on ia32

BUG=
R=jkummerow@chromium.org

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

Patch from Weiliang Lin <weiliang.lin2@gmail.com>.

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@16901 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 40decafa
...@@ -1131,30 +1131,21 @@ void Assembler::sub(const Operand& dst, Register src) { ...@@ -1131,30 +1131,21 @@ void Assembler::sub(const Operand& dst, Register src) {
void Assembler::test(Register reg, const Immediate& imm) { void Assembler::test(Register reg, const Immediate& imm) {
if (RelocInfo::IsNone(imm.rmode_) && is_uint8(imm.x_)) {
test_b(reg, imm.x_);
return;
}
EnsureSpace ensure_space(this); EnsureSpace ensure_space(this);
// Only use test against byte for registers that have a byte // This is not using emit_arith because test doesn't support
// variant: eax, ebx, ecx, and edx. // sign-extension of 8-bit operands.
if (RelocInfo::IsNone(imm.rmode_) && if (reg.is(eax)) {
is_uint8(imm.x_) && EMIT(0xA9);
reg.is_byte_register()) {
uint8_t imm8 = imm.x_;
if (reg.is(eax)) {
EMIT(0xA8);
EMIT(imm8);
} else {
emit_arith_b(0xF6, 0xC0, reg, imm8);
}
} else { } else {
// This is not using emit_arith because test doesn't support EMIT(0xF7);
// sign-extension of 8-bit operands. EMIT(0xC0 | reg.code());
if (reg.is(eax)) {
EMIT(0xA9);
} else {
EMIT(0xF7);
EMIT(0xC0 | reg.code());
}
emit(imm);
} }
emit(imm);
} }
...@@ -1178,6 +1169,9 @@ void Assembler::test(const Operand& op, const Immediate& imm) { ...@@ -1178,6 +1169,9 @@ void Assembler::test(const Operand& op, const Immediate& imm) {
test(op.reg(), imm); test(op.reg(), imm);
return; return;
} }
if (RelocInfo::IsNone(imm.rmode_) && is_uint8(imm.x_)) {
return test_b(op, imm.x_);
}
EnsureSpace ensure_space(this); EnsureSpace ensure_space(this);
EMIT(0xF7); EMIT(0xF7);
emit_operand(eax, op); emit_operand(eax, op);
...@@ -1185,9 +1179,26 @@ void Assembler::test(const Operand& op, const Immediate& imm) { ...@@ -1185,9 +1179,26 @@ void Assembler::test(const Operand& op, const Immediate& imm) {
} }
void Assembler::test_b(Register reg, uint8_t imm8) {
EnsureSpace ensure_space(this);
// Only use test against byte for registers that have a byte
// variant: eax, ebx, ecx, and edx.
if (reg.is(eax)) {
EMIT(0xA8);
EMIT(imm8);
} else if (reg.is_byte_register()) {
emit_arith_b(0xF6, 0xC0, reg, imm8);
} else {
EMIT(0xF7);
EMIT(0xC0 | reg.code());
emit(imm8);
}
}
void Assembler::test_b(const Operand& op, uint8_t imm8) { void Assembler::test_b(const Operand& op, uint8_t imm8) {
if (op.is_reg_only() && !op.reg().is_byte_register()) { if (op.is_reg_only()) {
test(op, Immediate(imm8)); test_b(op.reg(), imm8);
return; return;
} }
EnsureSpace ensure_space(this); EnsureSpace ensure_space(this);
......
...@@ -853,7 +853,7 @@ class Assembler : public AssemblerBase { ...@@ -853,7 +853,7 @@ class Assembler : public AssemblerBase {
void test(Register reg, const Operand& op); void test(Register reg, const Operand& op);
void test_b(Register reg, const Operand& op); void test_b(Register reg, const Operand& op);
void test(const Operand& op, const Immediate& imm); void test(const Operand& op, const Immediate& imm);
void test_b(Register reg, uint8_t imm8) { test_b(Operand(reg), imm8); } void test_b(Register reg, uint8_t imm8);
void test_b(const Operand& op, uint8_t imm8); void test_b(const Operand& op, uint8_t imm8);
void xor_(Register dst, int32_t imm32); void xor_(Register dst, int32_t imm32);
......
...@@ -2058,6 +2058,10 @@ void Assembler::testq(Register dst, Register src) { ...@@ -2058,6 +2058,10 @@ void Assembler::testq(Register dst, Register src) {
void Assembler::testq(Register dst, Immediate mask) { void Assembler::testq(Register dst, Immediate mask) {
if (is_uint8(mask.value_)) {
testb(dst, mask);
return;
}
EnsureSpace ensure_space(this); EnsureSpace ensure_space(this);
if (dst.is(rax)) { if (dst.is(rax)) {
emit_rex_64(); emit_rex_64();
......
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