1 /*
   2  * Copyright (c) 2009, 2011, 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 package com.oracle.graal.hsail;
  24 
  25 import static com.oracle.graal.api.code.MemoryBarriers.*;
  26 import static com.oracle.graal.api.code.ValueUtil.*;
  27 
  28 import java.nio.*;
  29 
  30 import com.oracle.graal.api.code.*;
  31 import com.oracle.graal.api.code.Register.RegisterCategory;
  32 import com.oracle.graal.api.meta.*;
  33 import com.oracle.graal.graph.*;
  34 
  35 /**
  36  * Represents the HSAIL architecture.
  37  */
  38 public class HSAIL extends Architecture {
  39 
  40     // @formatter:off
  41     public static final RegisterCategory CPU = new RegisterCategory("CPU");
  42     public static final RegisterCategory FPU = new RegisterCategory("FPU");
  43 
  44     // Control registers.
  45     public static final Register c0 = new Register(0, 0, "c0", CPU);
  46     public static final Register c1 = new Register(1, 1, "c1", CPU);
  47     public static final Register c2 = new Register(2, 2, "c2", CPU);
  48     public static final Register c3 = new Register(3, 3, "c3", CPU);
  49     public static final Register c4 = new Register(4, 4, "c4", CPU);
  50     public static final Register c5 = new Register(5, 5, "c5", CPU);
  51     public static final Register c6 = new Register(6, 6, "c6", CPU);
  52     public static final Register c7 = new Register(7, 7, "c7", CPU);
  53 
  54     //32 bit registers.
  55     public static final Register s0  = new Register(8,  0,  "s0", CPU);
  56     public static final Register s1  = new Register(9,  1,  "s1", CPU);
  57     public static final Register s2 = new Register(10, 2, "s2", CPU);
  58     public static final Register s3 = new Register(11, 3, "s3", CPU);
  59     public static final Register s4 = new Register(12, 4, "s4", CPU);
  60     public static final Register s5 = new Register(13, 5, "s5", CPU);
  61     public static final Register s6 = new Register(14, 6, "s6", CPU);
  62     public static final Register s7 = new Register(15, 7, "s7", CPU);
  63     public static final Register s8  = new Register(16,  8,  "s8", CPU);
  64     public static final Register s9  = new Register(17,  9,  "s9", CPU);
  65     public static final Register s10 = new Register(18, 10, "s10", CPU);
  66     public static final Register s11 = new Register(19, 11, "s11", CPU);
  67     public static final Register s12 = new Register(20, 12, "s12", CPU);
  68     public static final Register s13 = new Register(21, 13, "s13", CPU);
  69     public static final Register s14 = new Register(22, 14, "s14", CPU);
  70     public static final Register s15 = new Register(23, 15, "s15", CPU);
  71     public static final Register s16  = new Register(24, 16,  "s16", CPU);
  72     public static final Register s17  = new Register(25,  17,  "s17", CPU);
  73     public static final Register s18 = new Register(26, 18, "s18", CPU);
  74     public static final Register s19 = new Register(27, 19, "s19", CPU);
  75     public static final Register s20 = new Register(28, 20, "s20", CPU);
  76     public static final Register s21 = new Register(29, 21, "s21", CPU);
  77     public static final Register s22 = new Register(30, 22, "s22", CPU);
  78     public static final Register s23 = new Register(31, 23, "s23", CPU);
  79     public static final Register s24  = new Register(32, 24,  "s24", CPU);
  80     public static final Register s25  = new Register(33, 25,  "s25", CPU);
  81     public static final Register s26 = new Register(34, 26, "s26", CPU);
  82     public static final Register s27 = new Register(35, 27, "s27", CPU);
  83     public static final Register s28 = new Register(36, 28, "s28", CPU);
  84     public static final Register s29 = new Register(37, 29, "s29", CPU);
  85     public static final Register s30 = new Register(38, 30, "s30", CPU);
  86     public static final Register s31 = new Register(39, 31, "s31", CPU);
  87     public static final Register s32  = new Register(40, 32,  "s32", CPU);
  88     public static final Register s33  = new Register(41,  33,  "s33", CPU);
  89     public static final Register s34 = new Register(42, 34, "s34", CPU);
  90     public static final Register s35 = new Register(43, 35, "s35", CPU);
  91     public static final Register s36 = new Register(44, 36, "s36", CPU);
  92     public static final Register s37 = new Register(45, 37, "s37", CPU);
  93     public static final Register s38 = new Register(45, 38, "s38", CPU);
  94     public static final Register s39 = new Register(46, 39, "s39", CPU);
  95     public static final Register s40  = new Register(47, 40,  "s40", CPU);
  96     public static final Register s41  = new Register(48,  41,  "s41", CPU);
  97     public static final Register s42 = new Register(49, 42, "s42", CPU);
  98     public static final Register s43 = new Register(50, 43, "s43", CPU);
  99     public static final Register s44 = new Register(51, 44, "s44", CPU);
 100     public static final Register s45 = new Register(52, 45, "s45", CPU);
 101     public static final Register s46 = new Register(53, 46, "s46", CPU);
 102     public static final Register s47 = new Register(54, 47, "s47", CPU);
 103     public static final Register s48  = new Register(55, 48,  "s48", CPU);
 104     public static final Register s49  = new Register(56,  49,  "s49", CPU);
 105     public static final Register s50 = new Register(57, 50, "s50", CPU);
 106     public static final Register s51 = new Register(58, 51, "s51", CPU);
 107     public static final Register s52 = new Register(59, 52, "s52", CPU);
 108     public static final Register s53 = new Register(60, 53, "s53", CPU);
 109     public static final Register s54 = new Register(61, 54, "s54", CPU);
 110     public static final Register s55 = new Register(62, 55, "s55", CPU);
 111     public static final Register s56  = new Register(64, 56,  "s56", CPU);
 112     public static final Register s57  = new Register(64, 57,  "s57", CPU);
 113     public static final Register s58 = new Register(65, 58, "s58", CPU);
 114     public static final Register s59 = new Register(66, 59, "s59", CPU);
 115     public static final Register s60 = new Register(67, 60, "s60", CPU);
 116     public static final Register s61 = new Register(68, 61, "s61", CPU);
 117     public static final Register s62 = new Register(69, 62, "s62", CPU);
 118     public static final Register s63 = new Register(70, 63, "s63", CPU);
 119     public static final Register s64  = new Register(71, 64,  "s64", CPU);
 120     public static final Register s65  = new Register(72, 65,  "s65", CPU);
 121     public static final Register s66 = new Register(73, 66, "s66", CPU);
 122     public static final Register s67 = new Register(74, 67, "s67", CPU);
 123     public static final Register s68 = new Register(75, 68, "s68", CPU);
 124     public static final Register s69 = new Register(76, 69, "s69", CPU);
 125     public static final Register s70 = new Register(77, 70, "s70", CPU);
 126     public static final Register s71 = new Register(78, 71, "s71", CPU);
 127     public static final Register s72  = new Register(79, 72,  "s72", CPU);
 128     public static final Register s73  = new Register(80, 73,  "s73", CPU);
 129     public static final Register s74 = new Register(81, 74, "s74", CPU);
 130     public static final Register s75 = new Register(82, 75, "s75", CPU);
 131     public static final Register s76 = new Register(83, 76, "s76", CPU);
 132     public static final Register s77 = new Register(84, 77, "s77", CPU);
 133     public static final Register s78 = new Register(85, 78, "s78", CPU);
 134     public static final Register s79 = new Register(86, 79, "s79", CPU);
 135     public static final Register s80  = new Register(87, 80,  "s80", CPU);
 136     public static final Register s81  = new Register(88, 81,  "s81", CPU);
 137     public static final Register s82 = new Register(89, 82, "s82", CPU);
 138     public static final Register s83 = new Register(90, 83, "s83", CPU);
 139     public static final Register s84 = new Register(91, 84, "s84", CPU);
 140     public static final Register s85 = new Register(92, 85, "s85", CPU);
 141     public static final Register s86 = new Register(93, 86, "s86", CPU);
 142     public static final Register s87 = new Register(94, 87, "s87", CPU);
 143     public static final Register s88  = new Register(95,  88,  "s88", CPU);
 144     public static final Register s89  = new Register(96,  89,  "s89", CPU);
 145     public static final Register s90 = new Register(97, 90, "s90", CPU);
 146     public static final Register s91 = new Register(98, 91, "s91", CPU);
 147     public static final Register s92 = new Register(99, 92, "s92", CPU);
 148     public static final Register s93 = new Register(100, 93, "s93", CPU);
 149     public static final Register s94 = new Register(101, 94, "s94", CPU);
 150     public static final Register s95 = new Register(102, 95, "s95", CPU);
 151     public static final Register s96  = new Register(103, 96,  "s96", CPU);
 152     public static final Register s97  = new Register(104, 97,  "s97", CPU);
 153     public static final Register s98 = new Register(105, 98, "s98", CPU);
 154     public static final Register s99 = new Register(106, 99, "s99", CPU);
 155     public static final Register s100 = new Register(107, 100, "s100", CPU);
 156     public static final Register s101 = new Register(108, 101, "s101", CPU);
 157     public static final Register s102 = new Register(109, 102, "s102", CPU);
 158     public static final Register s103 = new Register(110, 103, "s103", CPU);
 159     public static final Register s104  = new Register(111, 104,  "s104", CPU);
 160     public static final Register s105  = new Register(112,  105,  "s105", CPU);
 161     public static final Register s106 = new Register(113, 106, "s106", CPU);
 162     public static final Register s107 = new Register(114, 107, "s107", CPU);
 163     public static final Register s108 = new Register(115, 108, "s108", CPU);
 164     public static final Register s109 = new Register(116, 109, "s109", CPU);
 165     public static final Register s110 = new Register(117, 110, "s110", CPU);
 166     public static final Register s111 = new Register(118, 111, "s111", CPU);
 167     public static final Register s112  = new Register(119, 112,  "s112", CPU);
 168     public static final Register s113  = new Register(120, 113,  "s113", CPU);
 169     public static final Register s114 = new Register(121, 114, "s114", CPU);
 170     public static final Register s115 = new Register(122, 115, "s115", CPU);
 171     public static final Register s116 = new Register(123, 116, "s116", CPU);
 172     public static final Register s117 = new Register(124, 117, "s117", CPU);
 173     public static final Register s118 = new Register(125, 118, "s118", CPU);
 174     public static final Register s119 = new Register(126, 119, "s119", CPU);
 175     public static final Register s120  = new Register(127, 120,  "s120", CPU);
 176     public static final Register s121  = new Register(128, 121,  "s121", CPU);
 177     public static final Register s122 = new Register(129, 122, "s122", CPU);
 178     public static final Register s123 = new Register(130, 123, "s123", CPU);
 179     public static final Register s124 = new Register(131, 124, "s124", CPU);
 180     public static final Register s125 = new Register(132, 125, "s125", CPU);
 181     public static final Register s126 = new Register(133, 126, "s126", CPU);
 182     public static final Register s127 = new Register(134, 127, "s127", CPU);
 183 
 184     //64 bit registers.
 185     public static final Register d0  = new Register(135,  0,  "d0", CPU);
 186     public static final Register d1  = new Register(136,  1,  "d1", CPU);
 187     public static final Register d2 = new Register(137, 2, "d2", CPU);
 188     public static final Register d3 = new Register(138, 3, "d3", CPU);
 189     public static final Register d4 = new Register(139, 4, "d4", CPU);
 190     public static final Register d5 = new Register(140, 5, "d5", CPU);
 191     public static final Register d6 = new Register(141, 6, "d6", CPU);
 192     public static final Register d7 = new Register(142, 7, "d7", CPU);
 193     public static final Register d8  = new Register(143,  8,  "d8", CPU);
 194     public static final Register d9  = new Register(144,  9,  "d9", CPU);
 195     public static final Register d10 = new Register(145, 10, "d10", CPU);
 196     public static final Register d11 = new Register(146, 11, "d11", CPU);
 197     public static final Register d12 = new Register(147, 12, "d12", CPU);
 198     public static final Register d13 = new Register(148, 13, "d13", CPU);
 199     public static final Register d14 = new Register(149, 14, "d14", CPU);
 200     public static final Register d15 = new Register(150, 15, "d15", CPU);
 201     public static final Register d16  = new Register(151, 16,  "d16", CPU);
 202     public static final Register d17  = new Register(152,  17,  "d17", CPU);
 203     public static final Register d18 = new Register(153, 18, "d18", CPU);
 204     public static final Register d19 = new Register(154, 19, "d19", CPU);
 205     public static final Register d20 = new Register(155, 20, "d20", CPU);
 206     public static final Register d21 = new Register(156, 21, "d21", CPU);
 207     public static final Register d22 = new Register(157, 22, "d22", CPU);
 208     public static final Register d23 = new Register(158, 23, "d23", CPU);
 209     public static final Register d24  = new Register(159, 24,  "d24", CPU);
 210     public static final Register d25  = new Register(160, 25,  "d25", CPU);
 211     public static final Register d26 = new Register(161, 26, "d26", CPU);
 212     public static final Register d27 = new Register(162, 27, "d27", CPU);
 213     public static final Register d28 = new Register(163, 28, "d28", CPU);
 214     public static final Register d29 = new Register(164, 29, "d29", CPU);
 215     public static final Register d30 = new Register(165, 30, "d30", CPU);
 216     public static final Register d31 = new Register(166, 31, "d31", CPU);
 217     public static final Register d32  = new Register(167, 32,  "d32", CPU);
 218     public static final Register d33  = new Register(168,  33,  "d33", CPU);
 219     public static final Register d34 = new Register(169, 34, "d34", CPU);
 220     public static final Register d35 = new Register(170, 35, "d35", CPU);
 221     public static final Register d36 = new Register(171, 36, "d36", CPU);
 222     public static final Register d37 = new Register(172, 37, "d37", CPU);
 223     public static final Register d38 = new Register(173, 38, "d38", CPU);
 224     public static final Register d39 = new Register(174, 39, "d39", CPU);
 225     public static final Register d40  = new Register(175, 40,  "d40", CPU);
 226     public static final Register d41  = new Register(176,  41,  "d41", CPU);
 227     public static final Register d42 = new Register(177, 42, "d42", CPU);
 228     public static final Register d43 = new Register(178, 43, "d43", CPU);
 229     public static final Register d44 = new Register(179, 44, "d44", CPU);
 230     public static final Register d45 = new Register(180, 45, "d45", CPU);
 231     public static final Register d46 = new Register(181, 46, "d46", CPU);
 232     public static final Register d47 = new Register(182, 47, "d47", CPU);
 233     public static final Register d48  = new Register(183, 48,  "d48", CPU);
 234     public static final Register d49  = new Register(184,  49,  "d49", CPU);
 235     public static final Register d50 = new Register(185, 50, "d50", CPU);
 236     public static final Register d51 = new Register(186, 51, "d51", CPU);
 237     public static final Register d52 = new Register(187, 52, "d52", CPU);
 238     public static final Register d53 = new Register(188, 53, "d53", CPU);
 239     public static final Register d54 = new Register(189, 54, "d54", CPU);
 240     public static final Register d55 = new Register(190, 55, "d55", CPU);
 241     public static final Register d56  = new Register(191, 56,  "d56", CPU);
 242     public static final Register d57  = new Register(192, 57,  "d57", CPU);
 243     public static final Register d58 = new Register(193, 58, "d58", CPU);
 244     public static final Register d59 = new Register(194, 59, "d59", CPU);
 245     public static final Register d60 = new Register(195, 60, "d60", CPU);
 246     public static final Register d61 = new Register(196, 61, "d61", CPU);
 247     public static final Register d62 = new Register(197, 62, "d62", CPU);
 248     public static final Register d63 = new Register(198, 63, "d63", CPU);
 249 
 250     //128 bit registers.
 251     public static final Register q0 = new Register(199, 0, "q0", CPU);
 252     public static final Register q1 = new Register(200, 1, "q1", CPU);
 253     public static final Register q2 = new Register(201, 2, "q2", CPU);
 254     public static final Register q3 = new Register(202, 3, "q3", CPU);
 255     public static final Register q4 = new Register(203, 4, "q4", CPU);
 256     public static final Register q5 = new Register(204, 5, "q5", CPU);
 257     public static final Register q6 = new Register(205, 6, "q6", CPU);
 258     public static final Register q7 = new Register(206, 7, "q7", CPU);
 259     public static final Register q8 = new Register(207, 8, "q8", CPU);
 260     public static final Register q9 = new Register(208, 9, "q9", CPU);
 261     public static final Register q10 = new Register(209, 10, "q10", CPU);
 262     public static final Register q11 = new Register(210, 11, "q11", CPU);
 263     public static final Register q12 = new Register(211, 12, "q12", CPU);
 264     public static final Register q13 = new Register(212, 13, "q13", CPU);
 265     public static final Register q14 = new Register(213, 14, "q14", CPU);
 266     public static final Register q15 = new Register(214, 15, "q15", CPU);
 267     public static final Register q16 = new Register(215, 16, "q16", CPU);
 268     public static final Register q17 = new Register(216, 17, "q17", CPU);
 269     public static final Register q18 = new Register(217, 18, "q18", CPU);
 270     public static final Register q19 = new Register(218, 19, "q19", CPU);
 271     public static final Register q20 = new Register(219, 20, "q20", CPU);
 272     public static final Register q21 = new Register(220, 21, "q21", CPU);
 273     public static final Register q22 = new Register(221, 22, "q22", CPU);
 274     public static final Register q23 = new Register(222, 23, "q23", CPU);
 275     public static final Register q24 = new Register(223, 24, "q24", CPU);
 276     public static final Register q25 = new Register(224, 25, "q25", CPU);
 277     public static final Register q26 = new Register(225, 26, "q26", CPU);
 278     public static final Register q27 = new Register(226, 27, "q27", CPU);
 279     public static final Register q28 = new Register(227, 28, "q28", CPU);
 280     public static final Register q29 = new Register(228, 29, "q29", CPU);
 281     public static final Register q30 = new Register(229, 30, "q30", CPU);
 282     public static final Register q31 = new Register(230, 31, "q31", CPU);
 283 
 284     public static final Register[] cRegisters = {
 285         c0, c1, c2, c3, c4, c5, c6, c7
 286     };
 287 
 288     public static final Register[] sRegisters = {
 289         s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10,
 290         s11, s12, s13, s14, s15, s16, s17, s18, s19,
 291         s20, s21, s22, s23, s24, s25, s26, s27, s28,
 292         s29, s30, s31, s32, s33, s34, s35, s36, s37,
 293         s38, s39, s40, s41, s42, s43, s44, s45, s46,
 294         s47, s48, s49, s50, s51, s52, s53, s54, s55,
 295         s56, s57, s58, s59, s60, s61, s62, s63, s64,
 296         s65, s66, s67, s68, s69, s70, s71, s72, s73,
 297         s74, s75, s76, s77, s78, s79, s80, s81, s82,
 298         s83, s84, s85, s86, s87, s88, s89, s90, s91,
 299         s92, s93, s94, s95, s96, s97, s98, s99, s100,
 300         s101, s102, s103, s104, s105, s106, s107, s108,
 301         s109, s110, s111, s112, s113, s114, s115, s116,
 302         s117, s118, s119, s120, s121, s122, s123, s124,
 303         s125, s126, s127
 304     };
 305 
 306     public static final Register[] dRegisters = {
 307         d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13, d14, d15, d16, d17, d18, d19, d20, d21, d22, d23, d24, d25, d26, d27, d28,
 308         d29, d30, d31, d32, d33, d34, d35, d36, d37, d38, d39, d40, d41, d42, d43, d44, d45, d46, d47, d48, d49, d50, d51, d52, d53, d54, d55,
 309         d56, d57, d58, d59, d60, d61, d62, d63
 310     };
 311 
 312     public static final Register[] qRegisters = {
 313         q0, q1, q2, q3, q4, q5, q6, q7, q8, q9, q10, q11, q12, q13, q14, q15, q16, q17, q18, q19, q20, q21, q22, q23, q24, q25, q26, q27, q28, q29, q30, q31
 314     };
 315 
 316     public static final Register[] allRegisters = {
 317         c0, c1, c2, c3, c4, c5, c6, c7, s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, s17, s18, s19,
 318         s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31, s32, s33, s34, s35,
 319         s36, s37, s38, s39, s40, s41, s42, s43, s44, s45, s46, s47, s48, s49, s50, s51, s52,
 320         s53, s54, s55, s56, s57, s58, s59, s60, s61,
 321         s62, s63, s64, s65, s66, s67, s68, s69, s70,
 322         s71, s72, s73, s74, s75, s76, s77, s78, s79,
 323         s80, s81, s82, s83, s84, s85, s86, s87, s88,
 324         s89, s90, s91, s92, s93, s94, s95, s96, s97,
 325         s98, s99, s100, s101, s102, s103, s104, s105,
 326         s106, s107, s108, s109, s110, s111, s112, s113,
 327         s114, s115, s116, s117, s118, s119, s120, s121,
 328         s122, s123, s124, s125, s126, s127,  d0, d1, d2,
 329         d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13,
 330         d14, d15, d16, d17, d18, d19, d20, d21, d22, d23,
 331         d24, d25, d26, d27, d28, d29, d30, d31, d32, d33,
 332         d34, d35, d36, d37, d38, d39, d40, d41, d42, d43,
 333         d44, d45, d46, d47, d48, d49, d50, d51, d52, d53,
 334         d54, d55, d56, d57, d58, d59, d60, d61, d62, d63,
 335         q0, q1, q2, q3, q4, q5, q6, q7, q8, q9, q10, q11,
 336         q12, q13, q14, q15, q16, q17, q18, q19, q20, q21,
 337         q22, q23, q24, q25, q26, q27, q28, q29, q30, q31
 338     };
 339 
 340     public HSAIL() {
 341         super("HSAIL",
 342                         8,
 343                         ByteOrder.LITTLE_ENDIAN,
 344                         allRegisters,
 345                         LOAD_STORE | STORE_STORE,
 346                         1,
 347                         q31.encoding + 1,
 348                         8);
 349     }
 350 
 351 
 352     public static int getStackOffset(Value reg) {
 353         return -(((StackSlot) reg).getRawOffset());
 354     }
 355 
 356     public static String mapStackSlot(Value reg) {
 357         StackSlot s = (StackSlot) reg;
 358         long offset = -s.getRawOffset();
 359         return "[%spillseg]" + "[" + offset + "]";
 360     }
 361 
 362     // @formatter:on
 363     public static String mapRegister(Value arg) {
 364         Register reg;
 365         int encoding = 0;
 366         String regPrefix = null;
 367         String argType = arg.getKind().getJavaName();
 368         if (argType.equals("double") || argType.equals("long")) {
 369             regPrefix = "$d";
 370         } else if (argType.equals("int") || argType.equals("float")) {
 371             regPrefix = "$s";
 372         } else {
 373             regPrefix = "$d";
 374         }
 375         switch (argType) {
 376             case "float":
 377                 reg = asFloatReg(arg);
 378                 encoding = reg.encoding() + 16;
 379                 break;
 380             case "int":
 381                 reg = asIntReg(arg);
 382                 encoding = reg.encoding();
 383                 break;
 384             case "long":
 385                 reg = asLongReg(arg);
 386                 encoding = reg.encoding();
 387                 break;
 388             case "double":
 389                 reg = asDoubleReg(arg);
 390                 encoding = reg.encoding() + 16;
 391                 break;
 392             case "Object":
 393                 reg = asObjectReg(arg);
 394                 encoding = reg.encoding();
 395                 break;
 396             default:
 397                 GraalInternalError.shouldNotReachHere();
 398                 break;
 399         }
 400         return new String(regPrefix + encoding);
 401     }
 402 
 403     @Override
 404     public boolean canStoreValue(RegisterCategory category, PlatformKind platformKind) {
 405         if (!(platformKind instanceof Kind)) {
 406             return false;
 407         }
 408         Kind kind = (Kind) platformKind;
 409         if (category == CPU) {
 410             switch (kind) {
 411                 case Boolean:
 412                 case Byte:
 413                 case Char:
 414                 case Short:
 415                 case Int:
 416                 case Long:
 417                 case Object:
 418                     return true;
 419             }
 420         } else if (category == FPU) {
 421             switch (kind) {
 422                 case Float:
 423                 case Double:
 424                     return true;
 425             }
 426         }
 427         return false;
 428     }
 429 
 430     @Override
 431     public PlatformKind getLargestStorableKind(RegisterCategory category) {
 432         if (category == CPU) {
 433             return Kind.Long;
 434         } else if (category == FPU) {
 435             return Kind.Double;
 436         } else {
 437             return Kind.Illegal;
 438         }
 439     }
 440 }