| 1 | /* |
| 2 | * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. |
| 3 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
| 4 | * |
| 5 | * This code is free software; you can redistribute it and/or modify it |
| 6 | * under the terms of the GNU General Public License version 2 only, as |
| 7 | * published by the Free Software Foundation. |
| 8 | * |
| 9 | * This code is distributed in the hope that it will be useful, but WITHOUT |
| 10 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| 11 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
| 12 | * version 2 for more details (a copy is included in the LICENSE file that |
| 13 | * accompanied this code). |
| 14 | * |
| 15 | * You should have received a copy of the GNU General Public License version |
| 16 | * 2 along with this work; if not, write to the Free Software Foundation, |
| 17 | * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
| 18 | * |
| 19 | * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
| 20 | * or visit www.oracle.com if you need additional information or have any |
| 21 | * questions. |
| 22 | * |
| 23 | */ |
| 24 | |
| 25 | #include "precompiled.hpp" |
| 26 | #include "register_x86.hpp" |
| 27 | |
| 28 | #ifndef AMD64 |
| 29 | const int ConcreteRegisterImpl::max_gpr = RegisterImpl::number_of_registers; |
| 30 | #else |
| 31 | const int ConcreteRegisterImpl::max_gpr = RegisterImpl::number_of_registers << 1; |
| 32 | #endif // AMD64 |
| 33 | |
| 34 | const int ConcreteRegisterImpl::max_fpr = ConcreteRegisterImpl::max_gpr + |
| 35 | 2 * FloatRegisterImpl::number_of_registers; |
| 36 | const int ConcreteRegisterImpl::max_xmm = ConcreteRegisterImpl::max_fpr + |
| 37 | XMMRegisterImpl::max_slots_per_register * XMMRegisterImpl::number_of_registers; |
| 38 | const int ConcreteRegisterImpl::max_kpr = ConcreteRegisterImpl::max_xmm + |
| 39 | KRegisterImpl::max_slots_per_register * KRegisterImpl::number_of_registers; |
| 40 | |
| 41 | const char* RegisterImpl::name() const { |
| 42 | const char* names[number_of_registers] = { |
| 43 | #ifndef AMD64 |
| 44 | "eax" , "ecx" , "edx" , "ebx" , "esp" , "ebp" , "esi" , "edi" |
| 45 | #else |
| 46 | "rax" , "rcx" , "rdx" , "rbx" , "rsp" , "rbp" , "rsi" , "rdi" , |
| 47 | "r8" , "r9" , "r10" , "r11" , "r12" , "r13" , "r14" , "r15" |
| 48 | #endif // AMD64 |
| 49 | }; |
| 50 | return is_valid() ? names[encoding()] : "noreg" ; |
| 51 | } |
| 52 | |
| 53 | const char* FloatRegisterImpl::name() const { |
| 54 | const char* names[number_of_registers] = { |
| 55 | "st0" , "st1" , "st2" , "st3" , "st4" , "st5" , "st6" , "st7" |
| 56 | }; |
| 57 | return is_valid() ? names[encoding()] : "noreg" ; |
| 58 | } |
| 59 | |
| 60 | const char* XMMRegisterImpl::name() const { |
| 61 | const char* names[number_of_registers] = { |
| 62 | "xmm0" ,"xmm1" ,"xmm2" ,"xmm3" ,"xmm4" ,"xmm5" ,"xmm6" ,"xmm7" |
| 63 | #ifdef AMD64 |
| 64 | ,"xmm8" , "xmm9" , "xmm10" , "xmm11" , "xmm12" , "xmm13" , "xmm14" , "xmm15" |
| 65 | ,"xmm16" , "xmm17" , "xmm18" , "xmm19" , "xmm20" , "xmm21" , "xmm22" , "xmm23" |
| 66 | ,"xmm24" , "xmm25" , "xmm26" , "xmm27" , "xmm28" , "xmm29" , "xmm30" , "xmm31" |
| 67 | #endif // AMD64 |
| 68 | }; |
| 69 | return is_valid() ? names[encoding()] : "xnoreg" ; |
| 70 | } |
| 71 | |
| 72 | const char* XMMRegisterImpl::sub_word_name(int i) const { |
| 73 | const char* names[number_of_registers * 8] = { |
| 74 | "xmm0:0" , "xmm0:1" , "xmm0:2" , "xmm0:3" , "xmm0:4" , "xmm0:5" , "xmm0:6" , "xmm0:7" , |
| 75 | "xmm1:0" , "xmm1:1" , "xmm1:2" , "xmm1:3" , "xmm1:4" , "xmm1:5" , "xmm1:6" , "xmm1:7" , |
| 76 | "xmm2:0" , "xmm2:1" , "xmm2:2" , "xmm2:3" , "xmm2:4" , "xmm2:5" , "xmm2:6" , "xmm2:7" , |
| 77 | "xmm3:0" , "xmm3:1" , "xmm3:2" , "xmm3:3" , "xmm3:4" , "xmm3:5" , "xmm3:6" , "xmm3:7" , |
| 78 | "xmm4:0" , "xmm4:1" , "xmm4:2" , "xmm4:3" , "xmm4:4" , "xmm4:5" , "xmm4:6" , "xmm4:7" , |
| 79 | "xmm5:0" , "xmm5:1" , "xmm5:2" , "xmm5:3" , "xmm5:4" , "xmm5:5" , "xmm5:6" , "xmm5:7" , |
| 80 | "xmm6:0" , "xmm6:1" , "xmm6:2" , "xmm6:3" , "xmm6:4" , "xmm6:5" , "xmm6:6" , "xmm6:7" , |
| 81 | "xmm7:0" , "xmm7:1" , "xmm7:2" , "xmm7:3" , "xmm7:4" , "xmm7:5" , "xmm7:6" , "xmm7:7" , |
| 82 | #ifdef AMD64 |
| 83 | "xmm8:0" , "xmm8:1" , "xmm8:2" , "xmm8:3" , "xmm8:4" , "xmm8:5" , "xmm8:6" , "xmm8:7" , |
| 84 | "xmm9:0" , "xmm9:1" , "xmm9:2" , "xmm9:3" , "xmm9:4" , "xmm9:5" , "xmm9:6" , "xmm9:7" , |
| 85 | "xmm10:0" , "xmm10:1" , "xmm10:2" , "xmm10:3" , "xmm10:4" , "xmm10:5" , "xmm10:6" , "xmm10:7" , |
| 86 | "xmm11:0" , "xmm11:1" , "xmm11:2" , "xmm11:3" , "xmm11:4" , "xmm11:5" , "xmm11:6" , "xmm11:7" , |
| 87 | "xmm12:0" , "xmm12:1" , "xmm12:2" , "xmm12:3" , "xmm12:4" , "xmm12:5" , "xmm12:6" , "xmm12:7" , |
| 88 | "xmm13:0" , "xmm13:1" , "xmm13:2" , "xmm13:3" , "xmm13:4" , "xmm13:5" , "xmm13:6" , "xmm13:7" , |
| 89 | "xmm14:0" , "xmm14:1" , "xmm14:2" , "xmm14:3" , "xmm14:4" , "xmm14:5" , "xmm14:6" , "xmm14:7" , |
| 90 | "xmm15:0" , "xmm15:1" , "xmm15:2" , "xmm15:3" , "xmm15:4" , "xmm15:5" , "xmm15:6" , "xmm15:7" , |
| 91 | #endif // AMD64 |
| 92 | }; |
| 93 | assert(i >= 0 && i < 8, "offset too large" ); |
| 94 | return is_valid() ? names[encoding() * 8 + i] : "xnoreg" ; |
| 95 | } |
| 96 | |
| 97 | const char* KRegisterImpl::name() const { |
| 98 | const char* names[number_of_registers] = { |
| 99 | "k0" , "k1" , "k2" , "k3" , "k4" , "k5" , "k6" , "k7" |
| 100 | }; |
| 101 | return is_valid() ? names[encoding()] : "knoreg" ; |
| 102 | } |
| 103 | |