| OLD | NEW | 
|     1 // Copyright 2010 the V8 project authors. All rights reserved. |     1 // Copyright 2010 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 282 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   293   } else { |   293   } else { | 
|   294     // Need no displacement. |   294     // Need no displacement. | 
|   295     buf_[0] = (modrm & 0x3f);  // Mode 0. |   295     buf_[0] = (modrm & 0x3f);  // Mode 0. | 
|   296     len_ = disp_offset; |   296     len_ = disp_offset; | 
|   297   } |   297   } | 
|   298   if (has_sib) { |   298   if (has_sib) { | 
|   299     buf_[1] = operand.buf_[1]; |   299     buf_[1] = operand.buf_[1]; | 
|   300   } |   300   } | 
|   301 } |   301 } | 
|   302  |   302  | 
 |   303  | 
 |   304 bool Operand::AddressUsesRegister(Register reg) const { | 
 |   305   int code = reg.code(); | 
 |   306   ASSERT((buf_[0] & 0xC0) != 0xC0);  // Always a memory operand. | 
 |   307   // Start with only low three bits of base register. Initial decoding doesn't | 
 |   308   // distinguish on the REX.B bit. | 
 |   309   int base_code = buf_[0] & 0x07; | 
 |   310   if (base_code == rsp.code()) { | 
 |   311     // SIB byte present in buf_[1]. | 
 |   312     // Check the index register from the SIB byte + REX.X prefix. | 
 |   313     int index_code = ((buf_[1] >> 3) & 0x07) | ((rex_ & 0x02) << 2); | 
 |   314     // Index code (including REX.X) of 0x04 (rsp) means no index register. | 
 |   315     if (index_code != rsp.code() && index_code == code) return true; | 
 |   316     // Add REX.B to get the full base register code. | 
 |   317     base_code = (buf_[1] & 0x07) | ((rex_ & 0x01) << 3); | 
 |   318     // A base register of 0x05 (rbp) with mod = 0 means no base register. | 
 |   319     if (base_code == rbp.code() && ((buf_[0] & 0xC0) == 0)) return false; | 
 |   320     return code == base_code; | 
 |   321   } else { | 
 |   322     // A base register with low bits of 0x05 (rbp or r13) and mod = 0 means | 
 |   323     // no base register. | 
 |   324     if (base_code == rbp.code() && ((buf_[0] & 0xC0) == 0)) return false; | 
 |   325     base_code |= ((rex_ & 0x01) << 3); | 
 |   326     return code == base_code; | 
 |   327   } | 
 |   328 } | 
 |   329  | 
 |   330  | 
|   303 // ----------------------------------------------------------------------------- |   331 // ----------------------------------------------------------------------------- | 
|   304 // Implementation of Assembler. |   332 // Implementation of Assembler. | 
|   305  |   333  | 
|   306 #ifdef GENERATED_CODE_COVERAGE |   334 #ifdef GENERATED_CODE_COVERAGE | 
|   307 static void InitCoverageLog(); |   335 static void InitCoverageLog(); | 
|   308 #endif |   336 #endif | 
|   309  |   337  | 
|   310 byte* Assembler::spare_buffer_ = NULL; |   338 byte* Assembler::spare_buffer_ = NULL; | 
|   311  |   339  | 
|   312 Assembler::Assembler(void* buffer, int buffer_size) |   340 Assembler::Assembler(void* buffer, int buffer_size) | 
| (...skipping 2341 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  2654   EnsureSpace ensure_space(this); |  2682   EnsureSpace ensure_space(this); | 
|  2655   last_pc_ = pc_; |  2683   last_pc_ = pc_; | 
|  2656   emit(0x66); |  2684   emit(0x66); | 
|  2657   emit_rex_64(src, dst); |  2685   emit_rex_64(src, dst); | 
|  2658   emit(0x0F); |  2686   emit(0x0F); | 
|  2659   emit(0x7E); |  2687   emit(0x7E); | 
|  2660   emit_sse_operand(src, dst); |  2688   emit_sse_operand(src, dst); | 
|  2661 } |  2689 } | 
|  2662  |  2690  | 
|  2663  |  2691  | 
 |  2692 void Assembler::movdqa(const Operand& dst, XMMRegister src) { | 
 |  2693   ASSERT(CpuFeatures::IsEnabled(SSE2)); | 
 |  2694   EnsureSpace ensure_space(this); | 
 |  2695   last_pc_ = pc_; | 
 |  2696   emit(0x66); | 
 |  2697   emit_rex_64(src, dst); | 
 |  2698   emit(0x0F); | 
 |  2699   emit(0x7F); | 
 |  2700   emit_sse_operand(src, dst); | 
 |  2701 } | 
 |  2702  | 
 |  2703  | 
 |  2704 void Assembler::movdqa(XMMRegister dst, const Operand& src) { | 
 |  2705   ASSERT(CpuFeatures::IsEnabled(SSE2)); | 
 |  2706   EnsureSpace ensure_space(this); | 
 |  2707   last_pc_ = pc_; | 
 |  2708   emit(0x66); | 
 |  2709   emit_rex_64(dst, src); | 
 |  2710   emit(0x0F); | 
 |  2711   emit(0x6F); | 
 |  2712   emit_sse_operand(dst, src); | 
 |  2713 } | 
 |  2714  | 
 |  2715  | 
|  2664 void Assembler::extractps(Register dst, XMMRegister src, byte imm8) { |  2716 void Assembler::extractps(Register dst, XMMRegister src, byte imm8) { | 
|  2665   ASSERT(is_uint2(imm8)); |  2717   ASSERT(is_uint2(imm8)); | 
|  2666   EnsureSpace ensure_space(this); |  2718   EnsureSpace ensure_space(this); | 
|  2667   last_pc_ = pc_; |  2719   last_pc_ = pc_; | 
|  2668   emit(0x66); |  2720   emit(0x66); | 
|  2669   emit_optional_rex_32(dst, src); |  2721   emit_optional_rex_32(dst, src); | 
|  2670   emit(0x0F); |  2722   emit(0x0F); | 
|  2671   emit(0x3A); |  2723   emit(0x3A); | 
|  2672   emit(0x17); |  2724   emit(0x17); | 
|  2673   emit_sse_operand(dst, src); |  2725   emit_sse_operand(dst, src); | 
| (...skipping 375 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  3049   // specially coded on x64 means that it is a relative 32 bit address, as used |  3101   // specially coded on x64 means that it is a relative 32 bit address, as used | 
|  3050   // by branch instructions. |  3102   // by branch instructions. | 
|  3051   return (1 << rmode_) & kApplyMask; |  3103   return (1 << rmode_) & kApplyMask; | 
|  3052 } |  3104 } | 
|  3053  |  3105  | 
|  3054  |  3106  | 
|  3055  |  3107  | 
|  3056 } }  // namespace v8::internal |  3108 } }  // namespace v8::internal | 
|  3057  |  3109  | 
|  3058 #endif  // V8_TARGET_ARCH_X64 |  3110 #endif  // V8_TARGET_ARCH_X64 | 
| OLD | NEW |