| Index: src/ia32/assembler-ia32.cc
|
| diff --git a/src/ia32/assembler-ia32.cc b/src/ia32/assembler-ia32.cc
|
| index 88f6f9669de729b592a13ac63acacb39cac6219b..c44b7b616830b66eb87b8c084521f98f937c6078 100644
|
| --- a/src/ia32/assembler-ia32.cc
|
| +++ b/src/ia32/assembler-ia32.cc
|
| @@ -746,8 +746,8 @@ void Assembler::and_(const Operand& dst, Register src) {
|
| emit_operand(src, dst);
|
| }
|
|
|
| -
|
| -void Assembler::cmpb(const Operand& op, int8_t imm8) {
|
| +void Assembler::cmpb(const Operand& op, Immediate imm8) {
|
| + DCHECK(imm8.is_int8() || imm8.is_uint8());
|
| EnsureSpace ensure_space(this);
|
| if (op.is_reg(eax)) {
|
| EMIT(0x3C);
|
| @@ -755,7 +755,7 @@ void Assembler::cmpb(const Operand& op, int8_t imm8) {
|
| EMIT(0x80);
|
| emit_operand(edi, op); // edi == 7
|
| }
|
| - EMIT(imm8);
|
| + emit_b(imm8);
|
| }
|
|
|
|
|
| @@ -784,6 +784,19 @@ void Assembler::cmpw(const Operand& op, Immediate imm16) {
|
| emit_w(imm16);
|
| }
|
|
|
| +void Assembler::cmpw(Register reg, const Operand& op) {
|
| + EnsureSpace ensure_space(this);
|
| + EMIT(0x66);
|
| + EMIT(0x39);
|
| + emit_operand(reg, op);
|
| +}
|
| +
|
| +void Assembler::cmpw(const Operand& op, Register reg) {
|
| + EnsureSpace ensure_space(this);
|
| + EMIT(0x66);
|
| + EMIT(0x3B);
|
| + emit_operand(reg, op);
|
| +}
|
|
|
| void Assembler::cmp(Register reg, int32_t imm32) {
|
| EnsureSpace ensure_space(this);
|
| @@ -1168,8 +1181,8 @@ 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_);
|
| + if (imm.is_uint8()) {
|
| + test_b(reg, imm);
|
| return;
|
| }
|
|
|
| @@ -1206,8 +1219,8 @@ 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_);
|
| + if (imm.is_uint8()) {
|
| + return test_b(op, imm);
|
| }
|
| EnsureSpace ensure_space(this);
|
| EMIT(0xF7);
|
| @@ -1215,25 +1228,25 @@ void Assembler::test(const Operand& op, const Immediate& imm) {
|
| emit(imm);
|
| }
|
|
|
| -
|
| -void Assembler::test_b(Register reg, uint8_t imm8) {
|
| +void Assembler::test_b(Register reg, Immediate imm8) {
|
| + DCHECK(imm8.is_uint8());
|
| 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);
|
| + emit_b(imm8);
|
| } else if (reg.is_byte_register()) {
|
| - emit_arith_b(0xF6, 0xC0, reg, imm8);
|
| + emit_arith_b(0xF6, 0xC0, reg, static_cast<uint8_t>(imm8.x_));
|
| } else {
|
| + EMIT(0x66);
|
| EMIT(0xF7);
|
| EMIT(0xC0 | reg.code());
|
| - emit(imm8);
|
| + emit_w(imm8);
|
| }
|
| }
|
|
|
| -
|
| -void Assembler::test_b(const Operand& op, uint8_t imm8) {
|
| +void Assembler::test_b(const Operand& op, Immediate imm8) {
|
| if (op.is_reg_only()) {
|
| test_b(op.reg(), imm8);
|
| return;
|
| @@ -1241,7 +1254,7 @@ void Assembler::test_b(const Operand& op, uint8_t imm8) {
|
| EnsureSpace ensure_space(this);
|
| EMIT(0xF6);
|
| emit_operand(eax, op);
|
| - EMIT(imm8);
|
| + emit_b(imm8);
|
| }
|
|
|
|
|
|
|