Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(82)

Side by Side Diff: src/x64/assembler-x64.cc

Issue 9418005: Ensure using byte registers for byte instructions on ia32 and x64. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: . Created 8 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/x64/assembler-x64.h ('k') | src/x64/lithium-codegen-x64.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 757 matching lines...) Expand 10 before | Expand all | Expand 10 after
768 emit(0x80); 768 emit(0x80);
769 emit_operand(subcode, dst); 769 emit_operand(subcode, dst);
770 emit(src.value_); 770 emit(src.value_);
771 } 771 }
772 772
773 773
774 void Assembler::immediate_arithmetic_op_8(byte subcode, 774 void Assembler::immediate_arithmetic_op_8(byte subcode,
775 Register dst, 775 Register dst,
776 Immediate src) { 776 Immediate src) {
777 EnsureSpace ensure_space(this); 777 EnsureSpace ensure_space(this);
778 if (dst.code() > 3) { 778 if (!dst.is_byte_register()) {
779 // Use 64-bit mode byte registers. 779 // Use 64-bit mode byte registers.
780 emit_rex_64(dst); 780 emit_rex_64(dst);
781 } 781 }
782 ASSERT(is_int8(src.value_) || is_uint8(src.value_)); 782 ASSERT(is_int8(src.value_) || is_uint8(src.value_));
783 emit(0x80); 783 emit(0x80);
784 emit_modrm(subcode, dst); 784 emit_modrm(subcode, dst);
785 emit(src.value_); 785 emit(src.value_);
786 } 786 }
787 787
788 788
(...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after
1052 void Assembler::decl(const Operand& dst) { 1052 void Assembler::decl(const Operand& dst) {
1053 EnsureSpace ensure_space(this); 1053 EnsureSpace ensure_space(this);
1054 emit_optional_rex_32(dst); 1054 emit_optional_rex_32(dst);
1055 emit(0xFF); 1055 emit(0xFF);
1056 emit_operand(1, dst); 1056 emit_operand(1, dst);
1057 } 1057 }
1058 1058
1059 1059
1060 void Assembler::decb(Register dst) { 1060 void Assembler::decb(Register dst) {
1061 EnsureSpace ensure_space(this); 1061 EnsureSpace ensure_space(this);
1062 if (dst.code() > 3) { 1062 if (!dst.is_byte_register()) {
1063 // Register is not one of al, bl, cl, dl. Its encoding needs REX. 1063 // Register is not one of al, bl, cl, dl. Its encoding needs REX.
1064 emit_rex_32(dst); 1064 emit_rex_32(dst);
1065 } 1065 }
1066 emit(0xFE); 1066 emit(0xFE);
1067 emit_modrm(0x1, dst); 1067 emit_modrm(0x1, dst);
1068 } 1068 }
1069 1069
1070 1070
1071 void Assembler::decb(const Operand& dst) { 1071 void Assembler::decb(const Operand& dst) {
1072 EnsureSpace ensure_space(this); 1072 EnsureSpace ensure_space(this);
(...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after
1380 1380
1381 1381
1382 void Assembler::leave() { 1382 void Assembler::leave() {
1383 EnsureSpace ensure_space(this); 1383 EnsureSpace ensure_space(this);
1384 emit(0xC9); 1384 emit(0xC9);
1385 } 1385 }
1386 1386
1387 1387
1388 void Assembler::movb(Register dst, const Operand& src) { 1388 void Assembler::movb(Register dst, const Operand& src) {
1389 EnsureSpace ensure_space(this); 1389 EnsureSpace ensure_space(this);
1390 if (dst.code() > 3) { 1390 if (!dst.is_byte_register()) {
1391 // Register is not one of al, bl, cl, dl. Its encoding needs REX. 1391 // Register is not one of al, bl, cl, dl. Its encoding needs REX.
1392 emit_rex_32(dst, src); 1392 emit_rex_32(dst, src);
1393 } else { 1393 } else {
1394 emit_optional_rex_32(dst, src); 1394 emit_optional_rex_32(dst, src);
1395 } 1395 }
1396 emit(0x8A); 1396 emit(0x8A);
1397 emit_operand(dst, src); 1397 emit_operand(dst, src);
1398 } 1398 }
1399 1399
1400 1400
1401 void Assembler::movb(Register dst, Immediate imm) { 1401 void Assembler::movb(Register dst, Immediate imm) {
1402 EnsureSpace ensure_space(this); 1402 EnsureSpace ensure_space(this);
1403 if (dst.code() > 3) { 1403 if (!dst.is_byte_register()) {
1404 emit_rex_32(dst); 1404 emit_rex_32(dst);
1405 } 1405 }
1406 emit(0xB0 + dst.low_bits()); 1406 emit(0xB0 + dst.low_bits());
1407 emit(imm.value_); 1407 emit(imm.value_);
1408 } 1408 }
1409 1409
1410 1410
1411 void Assembler::movb(const Operand& dst, Register src) { 1411 void Assembler::movb(const Operand& dst, Register src) {
1412 EnsureSpace ensure_space(this); 1412 EnsureSpace ensure_space(this);
1413 if (src.code() > 3) { 1413 if (!src.is_byte_register()) {
1414 emit_rex_32(src, dst); 1414 emit_rex_32(src, dst);
1415 } else { 1415 } else {
1416 emit_optional_rex_32(src, dst); 1416 emit_optional_rex_32(src, dst);
1417 } 1417 }
1418 emit(0x88); 1418 emit(0x88);
1419 emit_operand(src, dst); 1419 emit_operand(src, dst);
1420 } 1420 }
1421 1421
1422 1422
1423 void Assembler::movw(const Operand& dst, Register src) { 1423 void Assembler::movw(const Operand& dst, Register src) {
(...skipping 500 matching lines...) Expand 10 before | Expand all | Expand 10 after
1924 } 1924 }
1925 1925
1926 1926
1927 void Assembler::setcc(Condition cc, Register reg) { 1927 void Assembler::setcc(Condition cc, Register reg) {
1928 if (cc > last_condition) { 1928 if (cc > last_condition) {
1929 movb(reg, Immediate(cc == always ? 1 : 0)); 1929 movb(reg, Immediate(cc == always ? 1 : 0));
1930 return; 1930 return;
1931 } 1931 }
1932 EnsureSpace ensure_space(this); 1932 EnsureSpace ensure_space(this);
1933 ASSERT(is_uint4(cc)); 1933 ASSERT(is_uint4(cc));
1934 if (reg.code() > 3) { // Use x64 byte registers, where different. 1934 if (!reg.is_byte_register()) { // Use x64 byte registers, where different.
1935 emit_rex_32(reg); 1935 emit_rex_32(reg);
1936 } 1936 }
1937 emit(0x0F); 1937 emit(0x0F);
1938 emit(0x90 | cc); 1938 emit(0x90 | cc);
1939 emit_modrm(0x0, reg); 1939 emit_modrm(0x0, reg);
1940 } 1940 }
1941 1941
1942 1942
1943 void Assembler::shld(Register dst, Register src) { 1943 void Assembler::shld(Register dst, Register src) {
1944 EnsureSpace ensure_space(this); 1944 EnsureSpace ensure_space(this);
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
1989 } 1989 }
1990 1990
1991 1991
1992 void Assembler::testb(Register dst, Register src) { 1992 void Assembler::testb(Register dst, Register src) {
1993 EnsureSpace ensure_space(this); 1993 EnsureSpace ensure_space(this);
1994 if (src.low_bits() == 4) { 1994 if (src.low_bits() == 4) {
1995 emit_rex_32(src, dst); 1995 emit_rex_32(src, dst);
1996 emit(0x84); 1996 emit(0x84);
1997 emit_modrm(src, dst); 1997 emit_modrm(src, dst);
1998 } else { 1998 } else {
1999 if (dst.code() > 3 || src.code() > 3) { 1999 if (!dst.is_byte_register() || !src.is_byte_register()) {
2000 // Register is not one of al, bl, cl, dl. Its encoding needs REX. 2000 // Register is not one of al, bl, cl, dl. Its encoding needs REX.
2001 emit_rex_32(dst, src); 2001 emit_rex_32(dst, src);
2002 } 2002 }
2003 emit(0x84); 2003 emit(0x84);
2004 emit_modrm(dst, src); 2004 emit_modrm(dst, src);
2005 } 2005 }
2006 } 2006 }
2007 2007
2008 2008
2009 void Assembler::testb(Register reg, Immediate mask) { 2009 void Assembler::testb(Register reg, Immediate mask) {
2010 ASSERT(is_int8(mask.value_) || is_uint8(mask.value_)); 2010 ASSERT(is_int8(mask.value_) || is_uint8(mask.value_));
2011 EnsureSpace ensure_space(this); 2011 EnsureSpace ensure_space(this);
2012 if (reg.is(rax)) { 2012 if (reg.is(rax)) {
2013 emit(0xA8); 2013 emit(0xA8);
2014 emit(mask.value_); // Low byte emitted. 2014 emit(mask.value_); // Low byte emitted.
2015 } else { 2015 } else {
2016 if (reg.code() > 3) { 2016 if (!reg.is_byte_register()) {
2017 // Register is not one of al, bl, cl, dl. Its encoding needs REX. 2017 // Register is not one of al, bl, cl, dl. Its encoding needs REX.
2018 emit_rex_32(reg); 2018 emit_rex_32(reg);
2019 } 2019 }
2020 emit(0xF6); 2020 emit(0xF6);
2021 emit_modrm(0x0, reg); 2021 emit_modrm(0x0, reg);
2022 emit(mask.value_); // Low byte emitted. 2022 emit(mask.value_); // Low byte emitted.
2023 } 2023 }
2024 } 2024 }
2025 2025
2026 2026
2027 void Assembler::testb(const Operand& op, Immediate mask) { 2027 void Assembler::testb(const Operand& op, Immediate mask) {
2028 ASSERT(is_int8(mask.value_) || is_uint8(mask.value_)); 2028 ASSERT(is_int8(mask.value_) || is_uint8(mask.value_));
2029 EnsureSpace ensure_space(this); 2029 EnsureSpace ensure_space(this);
2030 emit_optional_rex_32(rax, op); 2030 emit_optional_rex_32(rax, op);
2031 emit(0xF6); 2031 emit(0xF6);
2032 emit_operand(rax, op); // Operation code 0 2032 emit_operand(rax, op); // Operation code 0
2033 emit(mask.value_); // Low byte emitted. 2033 emit(mask.value_); // Low byte emitted.
2034 } 2034 }
2035 2035
2036 2036
2037 void Assembler::testb(const Operand& op, Register reg) { 2037 void Assembler::testb(const Operand& op, Register reg) {
2038 EnsureSpace ensure_space(this); 2038 EnsureSpace ensure_space(this);
2039 if (reg.code() > 3) { 2039 if (!reg.is_byte_register()) {
2040 // Register is not one of al, bl, cl, dl. Its encoding needs REX. 2040 // Register is not one of al, bl, cl, dl. Its encoding needs REX.
2041 emit_rex_32(reg, op); 2041 emit_rex_32(reg, op);
2042 } else { 2042 } else {
2043 emit_optional_rex_32(reg, op); 2043 emit_optional_rex_32(reg, op);
2044 } 2044 }
2045 emit(0x84); 2045 emit(0x84);
2046 emit_operand(reg, op); 2046 emit_operand(reg, op);
2047 } 2047 }
2048 2048
2049 2049
(...skipping 991 matching lines...) Expand 10 before | Expand all | Expand 10 after
3041 // specially coded on x64 means that it is a relative 32 bit address, as used 3041 // specially coded on x64 means that it is a relative 32 bit address, as used
3042 // by branch instructions. 3042 // by branch instructions.
3043 return (1 << rmode_) & kApplyMask; 3043 return (1 << rmode_) & kApplyMask;
3044 } 3044 }
3045 3045
3046 3046
3047 3047
3048 } } // namespace v8::internal 3048 } } // namespace v8::internal
3049 3049
3050 #endif // V8_TARGET_ARCH_X64 3050 #endif // V8_TARGET_ARCH_X64
OLDNEW
« no previous file with comments | « src/x64/assembler-x64.h ('k') | src/x64/lithium-codegen-x64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698