1 /*
   2  * Copyright (c) 2015, 2018, 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 package org.graalvm.compiler.hotspot.sparc;
  26 
  27 import static jdk.vm.ci.sparc.SPARC.d32;
  28 import static jdk.vm.ci.sparc.SPARC.d34;
  29 import static jdk.vm.ci.sparc.SPARC.d36;
  30 import static jdk.vm.ci.sparc.SPARC.d38;
  31 import static jdk.vm.ci.sparc.SPARC.d40;
  32 import static jdk.vm.ci.sparc.SPARC.d42;
  33 import static jdk.vm.ci.sparc.SPARC.d44;
  34 import static jdk.vm.ci.sparc.SPARC.d46;
  35 import static jdk.vm.ci.sparc.SPARC.d48;
  36 import static jdk.vm.ci.sparc.SPARC.d50;
  37 import static jdk.vm.ci.sparc.SPARC.d52;
  38 import static jdk.vm.ci.sparc.SPARC.d54;
  39 import static jdk.vm.ci.sparc.SPARC.d56;
  40 import static jdk.vm.ci.sparc.SPARC.d58;
  41 import static jdk.vm.ci.sparc.SPARC.d60;
  42 import static jdk.vm.ci.sparc.SPARC.d62;
  43 import static jdk.vm.ci.sparc.SPARC.f10;
  44 import static jdk.vm.ci.sparc.SPARC.f11;
  45 import static jdk.vm.ci.sparc.SPARC.f12;
  46 import static jdk.vm.ci.sparc.SPARC.f13;
  47 import static jdk.vm.ci.sparc.SPARC.f14;
  48 import static jdk.vm.ci.sparc.SPARC.f15;
  49 import static jdk.vm.ci.sparc.SPARC.f16;
  50 import static jdk.vm.ci.sparc.SPARC.f17;
  51 import static jdk.vm.ci.sparc.SPARC.f18;
  52 import static jdk.vm.ci.sparc.SPARC.f19;
  53 import static jdk.vm.ci.sparc.SPARC.f20;
  54 import static jdk.vm.ci.sparc.SPARC.f21;
  55 import static jdk.vm.ci.sparc.SPARC.f22;
  56 import static jdk.vm.ci.sparc.SPARC.f23;
  57 import static jdk.vm.ci.sparc.SPARC.f24;
  58 import static jdk.vm.ci.sparc.SPARC.f25;
  59 import static jdk.vm.ci.sparc.SPARC.f26;
  60 import static jdk.vm.ci.sparc.SPARC.f27;
  61 import static jdk.vm.ci.sparc.SPARC.f28;
  62 import static jdk.vm.ci.sparc.SPARC.f29;
  63 import static jdk.vm.ci.sparc.SPARC.f30;
  64 import static jdk.vm.ci.sparc.SPARC.f31;
  65 import static jdk.vm.ci.sparc.SPARC.f8;
  66 import static jdk.vm.ci.sparc.SPARC.f9;
  67 import static jdk.vm.ci.sparc.SPARC.g1;
  68 import static jdk.vm.ci.sparc.SPARC.g4;
  69 import static jdk.vm.ci.sparc.SPARC.g5;
  70 import static jdk.vm.ci.sparc.SPARC.i0;
  71 import static jdk.vm.ci.sparc.SPARC.i1;
  72 import static jdk.vm.ci.sparc.SPARC.i2;
  73 import static jdk.vm.ci.sparc.SPARC.i3;
  74 import static jdk.vm.ci.sparc.SPARC.i4;
  75 import static jdk.vm.ci.sparc.SPARC.i5;
  76 import static jdk.vm.ci.sparc.SPARC.l0;
  77 import static jdk.vm.ci.sparc.SPARC.l1;
  78 import static jdk.vm.ci.sparc.SPARC.l2;
  79 import static jdk.vm.ci.sparc.SPARC.l3;
  80 import static jdk.vm.ci.sparc.SPARC.l4;
  81 import static jdk.vm.ci.sparc.SPARC.l5;
  82 import static jdk.vm.ci.sparc.SPARC.l6;
  83 import static jdk.vm.ci.sparc.SPARC.l7;
  84 import static jdk.vm.ci.sparc.SPARC.o0;
  85 import static jdk.vm.ci.sparc.SPARC.o1;
  86 import static jdk.vm.ci.sparc.SPARC.o2;
  87 import static jdk.vm.ci.sparc.SPARC.o3;
  88 import static jdk.vm.ci.sparc.SPARC.o4;
  89 import static jdk.vm.ci.sparc.SPARC.o5;
  90 
  91 import java.util.ArrayList;
  92 import java.util.BitSet;
  93 
  94 import org.graalvm.compiler.core.common.alloc.RegisterAllocationConfig;
  95 
  96 import jdk.vm.ci.code.Register;
  97 import jdk.vm.ci.code.RegisterArray;
  98 import jdk.vm.ci.code.RegisterConfig;
  99 
 100 public class SPARCHotSpotRegisterAllocationConfig extends RegisterAllocationConfig {
 101 
 102     // @formatter:off
 103     static final Register[] registerAllocationOrder = {
 104       l0, l1, l2, l3, l4, l5, l6, l7,
 105       i0, i1, i2, i3, i4, i5, /*i6,*/ /*i7,*/
 106       o0, o1, o2, o3, o4, o5, /*o6, o7,*/
 107       g1, g4, g5,
 108       // f0, f1, f2, f3, f4, f5, f6, f7
 109       f8,  f9,  f10, f11, f12, f13, f14, f15,
 110       f16, f17, f18, f19, f20, f21, f22, f23,
 111       f24, f25, f26, f27, f28, f29, f30, f31,
 112       d32, d34, d36, d38, d40, d42, d44, d46,
 113       d48, d50, d52, d54, d56, d58, d60, d62
 114     };
 115     // @formatter:on
 116 
 117     public SPARCHotSpotRegisterAllocationConfig(RegisterConfig registerConfig, String[] allocationRestrictedTo) {
 118         super(registerConfig, allocationRestrictedTo);
 119     }
 120 
 121     @Override
 122     protected RegisterArray initAllocatable(RegisterArray registers) {
 123         BitSet regMap = new BitSet(registerConfig.getAllocatableRegisters().size());
 124         for (Register reg : registers) {
 125             regMap.set(reg.number);
 126         }
 127 
 128         ArrayList<Register> allocatableRegisters = new ArrayList<>(registers.size());
 129         for (Register reg : registerAllocationOrder) {
 130             if (regMap.get(reg.number)) {
 131                 allocatableRegisters.add(reg);
 132             }
 133         }
 134 
 135         return super.initAllocatable(new RegisterArray(allocatableRegisters));
 136     }
 137 }