| OLD | NEW |
| 1 // Copyright (c) 1994-2006 Sun Microsystems Inc. | 1 // Copyright (c) 1994-2006 Sun Microsystems Inc. |
| 2 // All Rights Reserved. | 2 // All Rights Reserved. |
| 3 // | 3 // |
| 4 // Redistribution and use in source and binary forms, with or without | 4 // Redistribution and use in source and binary forms, with or without |
| 5 // modification, are permitted provided that the following conditions | 5 // modification, are permitted provided that the following conditions |
| 6 // are met: | 6 // are met: |
| 7 // | 7 // |
| 8 // - Redistributions of source code must retain the above copyright notice, | 8 // - Redistributions of source code must retain the above copyright notice, |
| 9 // this list of conditions and the following disclaimer. | 9 // this list of conditions and the following disclaimer. |
| 10 // | 10 // |
| (...skipping 728 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 739 emit_arith(4, dst, x); | 739 emit_arith(4, dst, x); |
| 740 } | 740 } |
| 741 | 741 |
| 742 | 742 |
| 743 void Assembler::and_(const Operand& dst, Register src) { | 743 void Assembler::and_(const Operand& dst, Register src) { |
| 744 EnsureSpace ensure_space(this); | 744 EnsureSpace ensure_space(this); |
| 745 EMIT(0x21); | 745 EMIT(0x21); |
| 746 emit_operand(src, dst); | 746 emit_operand(src, dst); |
| 747 } | 747 } |
| 748 | 748 |
| 749 | 749 void Assembler::cmpb(const Operand& op, Immediate imm8) { |
| 750 void Assembler::cmpb(const Operand& op, int8_t imm8) { | 750 DCHECK(imm8.is_int8() || imm8.is_uint8()); |
| 751 EnsureSpace ensure_space(this); | 751 EnsureSpace ensure_space(this); |
| 752 if (op.is_reg(eax)) { | 752 if (op.is_reg(eax)) { |
| 753 EMIT(0x3C); | 753 EMIT(0x3C); |
| 754 } else { | 754 } else { |
| 755 EMIT(0x80); | 755 EMIT(0x80); |
| 756 emit_operand(edi, op); // edi == 7 | 756 emit_operand(edi, op); // edi == 7 |
| 757 } | 757 } |
| 758 EMIT(imm8); | 758 emit_b(imm8); |
| 759 } | 759 } |
| 760 | 760 |
| 761 | 761 |
| 762 void Assembler::cmpb(const Operand& op, Register reg) { | 762 void Assembler::cmpb(const Operand& op, Register reg) { |
| 763 CHECK(reg.is_byte_register()); | 763 CHECK(reg.is_byte_register()); |
| 764 EnsureSpace ensure_space(this); | 764 EnsureSpace ensure_space(this); |
| 765 EMIT(0x38); | 765 EMIT(0x38); |
| 766 emit_operand(reg, op); | 766 emit_operand(reg, op); |
| 767 } | 767 } |
| 768 | 768 |
| 769 | 769 |
| 770 void Assembler::cmpb(Register reg, const Operand& op) { | 770 void Assembler::cmpb(Register reg, const Operand& op) { |
| 771 CHECK(reg.is_byte_register()); | 771 CHECK(reg.is_byte_register()); |
| 772 EnsureSpace ensure_space(this); | 772 EnsureSpace ensure_space(this); |
| 773 EMIT(0x3A); | 773 EMIT(0x3A); |
| 774 emit_operand(reg, op); | 774 emit_operand(reg, op); |
| 775 } | 775 } |
| 776 | 776 |
| 777 | 777 |
| 778 void Assembler::cmpw(const Operand& op, Immediate imm16) { | 778 void Assembler::cmpw(const Operand& op, Immediate imm16) { |
| 779 DCHECK(imm16.is_int16()); | 779 DCHECK(imm16.is_int16()); |
| 780 EnsureSpace ensure_space(this); | 780 EnsureSpace ensure_space(this); |
| 781 EMIT(0x66); | 781 EMIT(0x66); |
| 782 EMIT(0x81); | 782 EMIT(0x81); |
| 783 emit_operand(edi, op); | 783 emit_operand(edi, op); |
| 784 emit_w(imm16); | 784 emit_w(imm16); |
| 785 } | 785 } |
| 786 | 786 |
| 787 void Assembler::cmpw(Register reg, const Operand& op) { |
| 788 EnsureSpace ensure_space(this); |
| 789 EMIT(0x66); |
| 790 EMIT(0x39); |
| 791 emit_operand(reg, op); |
| 792 } |
| 793 |
| 794 void Assembler::cmpw(const Operand& op, Register reg) { |
| 795 EnsureSpace ensure_space(this); |
| 796 EMIT(0x66); |
| 797 EMIT(0x3B); |
| 798 emit_operand(reg, op); |
| 799 } |
| 787 | 800 |
| 788 void Assembler::cmp(Register reg, int32_t imm32) { | 801 void Assembler::cmp(Register reg, int32_t imm32) { |
| 789 EnsureSpace ensure_space(this); | 802 EnsureSpace ensure_space(this); |
| 790 emit_arith(7, Operand(reg), Immediate(imm32)); | 803 emit_arith(7, Operand(reg), Immediate(imm32)); |
| 791 } | 804 } |
| 792 | 805 |
| 793 | 806 |
| 794 void Assembler::cmp(Register reg, Handle<Object> handle) { | 807 void Assembler::cmp(Register reg, Handle<Object> handle) { |
| 795 EnsureSpace ensure_space(this); | 808 EnsureSpace ensure_space(this); |
| 796 emit_arith(7, Operand(reg), Immediate(handle)); | 809 emit_arith(7, Operand(reg), Immediate(handle)); |
| (...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1161 | 1174 |
| 1162 | 1175 |
| 1163 void Assembler::sub(const Operand& dst, Register src) { | 1176 void Assembler::sub(const Operand& dst, Register src) { |
| 1164 EnsureSpace ensure_space(this); | 1177 EnsureSpace ensure_space(this); |
| 1165 EMIT(0x29); | 1178 EMIT(0x29); |
| 1166 emit_operand(src, dst); | 1179 emit_operand(src, dst); |
| 1167 } | 1180 } |
| 1168 | 1181 |
| 1169 | 1182 |
| 1170 void Assembler::test(Register reg, const Immediate& imm) { | 1183 void Assembler::test(Register reg, const Immediate& imm) { |
| 1171 if (RelocInfo::IsNone(imm.rmode_) && is_uint8(imm.x_)) { | 1184 if (imm.is_uint8()) { |
| 1172 test_b(reg, imm.x_); | 1185 test_b(reg, imm); |
| 1173 return; | 1186 return; |
| 1174 } | 1187 } |
| 1175 | 1188 |
| 1176 EnsureSpace ensure_space(this); | 1189 EnsureSpace ensure_space(this); |
| 1177 // This is not using emit_arith because test doesn't support | 1190 // This is not using emit_arith because test doesn't support |
| 1178 // sign-extension of 8-bit operands. | 1191 // sign-extension of 8-bit operands. |
| 1179 if (reg.is(eax)) { | 1192 if (reg.is(eax)) { |
| 1180 EMIT(0xA9); | 1193 EMIT(0xA9); |
| 1181 } else { | 1194 } else { |
| 1182 EMIT(0xF7); | 1195 EMIT(0xF7); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 1199 EMIT(0x84); | 1212 EMIT(0x84); |
| 1200 emit_operand(reg, op); | 1213 emit_operand(reg, op); |
| 1201 } | 1214 } |
| 1202 | 1215 |
| 1203 | 1216 |
| 1204 void Assembler::test(const Operand& op, const Immediate& imm) { | 1217 void Assembler::test(const Operand& op, const Immediate& imm) { |
| 1205 if (op.is_reg_only()) { | 1218 if (op.is_reg_only()) { |
| 1206 test(op.reg(), imm); | 1219 test(op.reg(), imm); |
| 1207 return; | 1220 return; |
| 1208 } | 1221 } |
| 1209 if (RelocInfo::IsNone(imm.rmode_) && is_uint8(imm.x_)) { | 1222 if (imm.is_uint8()) { |
| 1210 return test_b(op, imm.x_); | 1223 return test_b(op, imm); |
| 1211 } | 1224 } |
| 1212 EnsureSpace ensure_space(this); | 1225 EnsureSpace ensure_space(this); |
| 1213 EMIT(0xF7); | 1226 EMIT(0xF7); |
| 1214 emit_operand(eax, op); | 1227 emit_operand(eax, op); |
| 1215 emit(imm); | 1228 emit(imm); |
| 1216 } | 1229 } |
| 1217 | 1230 |
| 1218 | 1231 void Assembler::test_b(Register reg, Immediate imm8) { |
| 1219 void Assembler::test_b(Register reg, uint8_t imm8) { | 1232 DCHECK(imm8.is_uint8()); |
| 1220 EnsureSpace ensure_space(this); | 1233 EnsureSpace ensure_space(this); |
| 1221 // Only use test against byte for registers that have a byte | 1234 // Only use test against byte for registers that have a byte |
| 1222 // variant: eax, ebx, ecx, and edx. | 1235 // variant: eax, ebx, ecx, and edx. |
| 1223 if (reg.is(eax)) { | 1236 if (reg.is(eax)) { |
| 1224 EMIT(0xA8); | 1237 EMIT(0xA8); |
| 1225 EMIT(imm8); | 1238 emit_b(imm8); |
| 1226 } else if (reg.is_byte_register()) { | 1239 } else if (reg.is_byte_register()) { |
| 1227 emit_arith_b(0xF6, 0xC0, reg, imm8); | 1240 emit_arith_b(0xF6, 0xC0, reg, static_cast<uint8_t>(imm8.x_)); |
| 1228 } else { | 1241 } else { |
| 1242 EMIT(0x66); |
| 1229 EMIT(0xF7); | 1243 EMIT(0xF7); |
| 1230 EMIT(0xC0 | reg.code()); | 1244 EMIT(0xC0 | reg.code()); |
| 1231 emit(imm8); | 1245 emit_w(imm8); |
| 1232 } | 1246 } |
| 1233 } | 1247 } |
| 1234 | 1248 |
| 1235 | 1249 void Assembler::test_b(const Operand& op, Immediate imm8) { |
| 1236 void Assembler::test_b(const Operand& op, uint8_t imm8) { | |
| 1237 if (op.is_reg_only()) { | 1250 if (op.is_reg_only()) { |
| 1238 test_b(op.reg(), imm8); | 1251 test_b(op.reg(), imm8); |
| 1239 return; | 1252 return; |
| 1240 } | 1253 } |
| 1241 EnsureSpace ensure_space(this); | 1254 EnsureSpace ensure_space(this); |
| 1242 EMIT(0xF6); | 1255 EMIT(0xF6); |
| 1243 emit_operand(eax, op); | 1256 emit_operand(eax, op); |
| 1244 EMIT(imm8); | 1257 emit_b(imm8); |
| 1245 } | 1258 } |
| 1246 | 1259 |
| 1247 | 1260 |
| 1248 void Assembler::xor_(Register dst, int32_t imm32) { | 1261 void Assembler::xor_(Register dst, int32_t imm32) { |
| 1249 EnsureSpace ensure_space(this); | 1262 EnsureSpace ensure_space(this); |
| 1250 emit_arith(6, Operand(dst), Immediate(imm32)); | 1263 emit_arith(6, Operand(dst), Immediate(imm32)); |
| 1251 } | 1264 } |
| 1252 | 1265 |
| 1253 | 1266 |
| 1254 void Assembler::xor_(Register dst, const Operand& src) { | 1267 void Assembler::xor_(Register dst, const Operand& src) { |
| (...skipping 1712 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2967 fflush(coverage_log); | 2980 fflush(coverage_log); |
| 2968 } | 2981 } |
| 2969 } | 2982 } |
| 2970 | 2983 |
| 2971 #endif | 2984 #endif |
| 2972 | 2985 |
| 2973 } // namespace internal | 2986 } // namespace internal |
| 2974 } // namespace v8 | 2987 } // namespace v8 |
| 2975 | 2988 |
| 2976 #endif // V8_TARGET_ARCH_IA32 | 2989 #endif // V8_TARGET_ARCH_IA32 |
| OLD | NEW |