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) {
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);
// Only use test against byte for registers that have a byte
// variant: eax, ebx, ecx, and edx.
if (RelocInfo::IsNone(imm.rmode_) &&
is_uint8(imm.x_) &&
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);
}
// This is not using emit_arith because test doesn't support
// sign-extension of 8-bit operands.
if (reg.is(eax)) {
EMIT(0xA9);
} else {
// This is not using emit_arith because test doesn't support
// sign-extension of 8-bit operands.
if (reg.is(eax)) {
EMIT(0xA9);
} else {
EMIT(0xF7);
EMIT(0xC0 | reg.code());
}
emit(imm);
EMIT(0xF7);
EMIT(0xC0 | reg.code());
}
emit(imm);
}
......@@ -1178,6 +1169,9 @@ void Assembler::test(const Operand& op, const Immediate& imm) {
test(op.reg(), imm);
return;
}
if (RelocInfo::IsNone(imm.rmode_) && is_uint8(imm.x_)) {
return test_b(op, imm.x_);
}
EnsureSpace ensure_space(this);
EMIT(0xF7);
emit_operand(eax, op);
......@@ -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) {
if (op.is_reg_only() && !op.reg().is_byte_register()) {
test(op, Immediate(imm8));
if (op.is_reg_only()) {
test_b(op.reg(), imm8);
return;
}
EnsureSpace ensure_space(this);
......
......@@ -853,7 +853,7 @@ class Assembler : public AssemblerBase {
void test(Register reg, const Operand& op);
void test_b(Register reg, const Operand& op);
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 xor_(Register dst, int32_t imm32);
......
......@@ -2058,6 +2058,10 @@ void Assembler::testq(Register dst, Register src) {
void Assembler::testq(Register dst, Immediate mask) {
if (is_uint8(mask.value_)) {
testb(dst, mask);
return;
}
EnsureSpace ensure_space(this);
if (dst.is(rax)) {
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