Home | History | Annotate | Download | only in arm
      1 // Copyright 2009 the V8 project authors. All rights reserved.
      2 // Redistribution and use in source and binary forms, with or without
      3 // modification, are permitted provided that the following conditions are
      4 // met:
      5 //
      6 //     * Redistributions of source code must retain the above copyright
      7 //       notice, this list of conditions and the following disclaimer.
      8 //     * Redistributions in binary form must reproduce the above
      9 //       copyright notice, this list of conditions and the following
     10 //       disclaimer in the documentation and/or other materials provided
     11 //       with the distribution.
     12 //     * Neither the name of Google Inc. nor the names of its
     13 //       contributors may be used to endorse or promote products derived
     14 //       from this software without specific prior written permission.
     15 //
     16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     27 
     28 #ifndef V8_ARM_REGISTER_ALLOCATOR_ARM_INL_H_
     29 #define V8_ARM_REGISTER_ALLOCATOR_ARM_INL_H_
     30 
     31 #include "v8.h"
     32 
     33 namespace v8 {
     34 namespace internal {
     35 
     36 // -------------------------------------------------------------------------
     37 // RegisterAllocator implementation.
     38 
     39 bool RegisterAllocator::IsReserved(Register reg) {
     40   return reg.is(cp) || reg.is(fp) || reg.is(sp) || reg.is(pc);
     41 }
     42 
     43 
     44 
     45 // The register allocator uses small integers to represent the
     46 // non-reserved assembler registers.  The mapping is:
     47 //
     48 // r0 <-> 0
     49 // r1 <-> 1
     50 // r2 <-> 2
     51 // r3 <-> 3
     52 // r4 <-> 4
     53 // r5 <-> 5
     54 // r6 <-> 6
     55 // r7 <-> 7
     56 // r9 <-> 8
     57 // r10 <-> 9
     58 // ip <-> 10
     59 // lr <-> 11
     60 
     61 int RegisterAllocator::ToNumber(Register reg) {
     62   ASSERT(reg.is_valid() && !IsReserved(reg));
     63   const int kNumbers[] = {
     64     0,   // r0
     65     1,   // r1
     66     2,   // r2
     67     3,   // r3
     68     4,   // r4
     69     5,   // r5
     70     6,   // r6
     71     7,   // r7
     72     -1,  // cp
     73     8,   // r9
     74     9,   // r10
     75     -1,  // fp
     76     10,  // ip
     77     -1,  // sp
     78     11,  // lr
     79     -1   // pc
     80   };
     81   return kNumbers[reg.code()];
     82 }
     83 
     84 
     85 Register RegisterAllocator::ToRegister(int num) {
     86   ASSERT(num >= 0 && num < kNumRegisters);
     87   const Register kRegisters[] =
     88       { r0, r1, r2, r3, r4, r5, r6, r7, r9, r10, ip, lr };
     89   return kRegisters[num];
     90 }
     91 
     92 
     93 void RegisterAllocator::Initialize() {
     94   Reset();
     95   // The non-reserved r1 and lr registers are live on JS function entry.
     96   Use(r1);  // JS function.
     97   Use(lr);  // Return address.
     98 }
     99 
    100 
    101 } }  // namespace v8::internal
    102 
    103 #endif  // V8_ARM_REGISTER_ALLOCATOR_ARM_INL_H_
    104