OLD | NEW |
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 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
92 __ j(not_zero, &cpuid); | 92 __ j(not_zero, &cpuid); |
93 | 93 |
94 // CPUID not supported. Clear the supported features in rax. | 94 // CPUID not supported. Clear the supported features in rax. |
95 __ xor_(rax, rax); | 95 __ xor_(rax, rax); |
96 __ jmp(&done); | 96 __ jmp(&done); |
97 | 97 |
98 // Invoke CPUID with 1 in eax to get feature information in | 98 // Invoke CPUID with 1 in eax to get feature information in |
99 // ecx:edx. Temporarily enable CPUID support because we know it's | 99 // ecx:edx. Temporarily enable CPUID support because we know it's |
100 // safe here. | 100 // safe here. |
101 __ bind(&cpuid); | 101 __ bind(&cpuid); |
102 __ movq(rax, Immediate(1)); | 102 __ movl(rax, Immediate(1)); |
103 supported_ = kDefaultCpuFeatures | (1 << CPUID); | 103 supported_ = kDefaultCpuFeatures | (1 << CPUID); |
104 { Scope fscope(CPUID); | 104 { Scope fscope(CPUID); |
105 __ cpuid(); | 105 __ cpuid(); |
106 // Move the result from ecx:edx to rdi. | 106 // Move the result from ecx:edx to rdi. |
107 __ movl(rdi, rdx); // Zero-extended to 64 bits. | 107 __ movl(rdi, rdx); // Zero-extended to 64 bits. |
108 __ shl(rcx, Immediate(32)); | 108 __ shl(rcx, Immediate(32)); |
109 __ or_(rdi, rcx); | 109 __ or_(rdi, rcx); |
110 | 110 |
111 // Get the sahf supported flag, from CPUID(0x80000001) | 111 // Get the sahf supported flag, from CPUID(0x80000001) |
112 __ movq(rax, 0x80000001, RelocInfo::NONE); | 112 __ movq(rax, 0x80000001, RelocInfo::NONE); |
(...skipping 1278 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1391 | 1391 |
1392 | 1392 |
1393 void Assembler::leave() { | 1393 void Assembler::leave() { |
1394 EnsureSpace ensure_space(this); | 1394 EnsureSpace ensure_space(this); |
1395 emit(0xC9); | 1395 emit(0xC9); |
1396 } | 1396 } |
1397 | 1397 |
1398 | 1398 |
1399 void Assembler::movb(Register dst, const Operand& src) { | 1399 void Assembler::movb(Register dst, const Operand& src) { |
1400 EnsureSpace ensure_space(this); | 1400 EnsureSpace ensure_space(this); |
1401 emit_rex_32(dst, src); | 1401 if (dst.code() > 3) { |
| 1402 // Register is not one of al, bl, cl, dl. Its encoding needs REX. |
| 1403 emit_rex_32(dst, src); |
| 1404 } else { |
| 1405 emit_optional_rex_32(dst, src); |
| 1406 } |
1402 emit(0x8A); | 1407 emit(0x8A); |
1403 emit_operand(dst, src); | 1408 emit_operand(dst, src); |
1404 } | 1409 } |
1405 | 1410 |
1406 | 1411 |
1407 void Assembler::movb(Register dst, Immediate imm) { | 1412 void Assembler::movb(Register dst, Immediate imm) { |
1408 EnsureSpace ensure_space(this); | 1413 EnsureSpace ensure_space(this); |
1409 emit_rex_32(dst); | 1414 if (dst.code() > 3) { |
1410 emit(0xC6); | 1415 emit_rex_32(dst); |
1411 emit_modrm(0x0, dst); | 1416 } |
| 1417 emit(0xB0 + dst.low_bits()); |
1412 emit(imm.value_); | 1418 emit(imm.value_); |
1413 } | 1419 } |
1414 | 1420 |
1415 | 1421 |
1416 void Assembler::movb(const Operand& dst, Register src) { | 1422 void Assembler::movb(const Operand& dst, Register src) { |
1417 EnsureSpace ensure_space(this); | 1423 EnsureSpace ensure_space(this); |
1418 emit_rex_32(src, dst); | 1424 if (src.code() > 3) { |
| 1425 emit_rex_32(src, dst); |
| 1426 } else { |
| 1427 emit_optional_rex_32(src, dst); |
| 1428 } |
1419 emit(0x88); | 1429 emit(0x88); |
1420 emit_operand(src, dst); | 1430 emit_operand(src, dst); |
1421 } | 1431 } |
1422 | 1432 |
1423 | 1433 |
1424 void Assembler::movw(const Operand& dst, Register src) { | 1434 void Assembler::movw(const Operand& dst, Register src) { |
1425 EnsureSpace ensure_space(this); | 1435 EnsureSpace ensure_space(this); |
1426 emit(0x66); | 1436 emit(0x66); |
1427 emit_optional_rex_32(src, dst); | 1437 emit_optional_rex_32(src, dst); |
1428 emit(0x89); | 1438 emit(0x89); |
(...skipping 29 matching lines...) Expand all Loading... |
1458 emit(0x89); | 1468 emit(0x89); |
1459 emit_operand(src, dst); | 1469 emit_operand(src, dst); |
1460 } | 1470 } |
1461 | 1471 |
1462 | 1472 |
1463 void Assembler::movl(const Operand& dst, Immediate value) { | 1473 void Assembler::movl(const Operand& dst, Immediate value) { |
1464 EnsureSpace ensure_space(this); | 1474 EnsureSpace ensure_space(this); |
1465 emit_optional_rex_32(dst); | 1475 emit_optional_rex_32(dst); |
1466 emit(0xC7); | 1476 emit(0xC7); |
1467 emit_operand(0x0, dst); | 1477 emit_operand(0x0, dst); |
1468 emit(value); // Only 32-bit immediates are possible, not 8-bit immediates. | 1478 emit(value); |
1469 } | 1479 } |
1470 | 1480 |
1471 | 1481 |
1472 void Assembler::movl(Register dst, Immediate value) { | 1482 void Assembler::movl(Register dst, Immediate value) { |
1473 EnsureSpace ensure_space(this); | 1483 EnsureSpace ensure_space(this); |
1474 emit_optional_rex_32(dst); | 1484 emit_optional_rex_32(dst); |
1475 emit(0xC7); | 1485 emit(0xB8 + dst.low_bits()); |
1476 emit_modrm(0x0, dst); | 1486 emit(value); |
1477 emit(value); // Only 32-bit immediates are possible, not 8-bit immediates. | |
1478 } | 1487 } |
1479 | 1488 |
1480 | 1489 |
1481 void Assembler::movq(Register dst, const Operand& src) { | 1490 void Assembler::movq(Register dst, const Operand& src) { |
1482 EnsureSpace ensure_space(this); | 1491 EnsureSpace ensure_space(this); |
1483 emit_rex_64(dst, src); | 1492 emit_rex_64(dst, src); |
1484 emit(0x8B); | 1493 emit(0x8B); |
1485 emit_operand(dst, src); | 1494 emit_operand(dst, src); |
1486 } | 1495 } |
1487 | 1496 |
(...skipping 1457 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2945 // specially coded on x64 means that it is a relative 32 bit address, as used | 2954 // specially coded on x64 means that it is a relative 32 bit address, as used |
2946 // by branch instructions. | 2955 // by branch instructions. |
2947 return (1 << rmode_) & kApplyMask; | 2956 return (1 << rmode_) & kApplyMask; |
2948 } | 2957 } |
2949 | 2958 |
2950 | 2959 |
2951 | 2960 |
2952 } } // namespace v8::internal | 2961 } } // namespace v8::internal |
2953 | 2962 |
2954 #endif // V8_TARGET_ARCH_X64 | 2963 #endif // V8_TARGET_ARCH_X64 |
OLD | NEW |