Make JetStream 2
[WebKit-https.git] / PerformanceTests / JetStream2 / ARES-6 / Air / reg.js
1 /*
2  * Copyright (C) 2016 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25 "use strict";
26
27 class Reg extends TmpBase {
28     constructor(index, type, name, isCalleeSave)
29     {
30         super();
31         this._index = index;
32         this._type = type;
33         this._name = name;
34         this._isCalleeSave = !!isCalleeSave;
35     }
36     
37     static fromReg(reg)
38     {
39         return reg;
40     }
41     
42     get index() { return this._index; }
43     get type() { return this._type; }
44     get name() { return this._name; }
45     get isCalleeSave() { return this._isCalleeSave; }
46     
47     get isReg() { return true; }
48     
49     hash()
50     {
51         if (this.isGP)
52             return 1 + this._index;
53         return -1 - this._index;
54     }
55     
56     toString()
57     {
58         return `%${this._name}`;
59     }
60     
61     static extract(arg)
62     {
63         if (arg.isReg)
64             return arg.reg;
65         return null;
66     }
67     
68     static forEachFast(arg, func)
69     {
70         return arg.forEachTmpFast(tmp => {
71             if (!tmp.isReg)
72                 return;
73             return func(tmp);
74         });
75     }
76     
77     static forEach(arg, argRole, argType, argWidth, func)
78     {
79         return arg.forEachTmp(
80             argRole, argType, argWidth,
81             (tmp, role, type, width) => {
82                 if (!tmp.isReg)
83                     return;
84                 return func(tmp, role, type, width);
85             });
86     }
87 }
88
89 {
90     Reg.regs = [];
91     function newReg(...args)
92     {
93         let result = new Reg(...args);
94         Reg.regs.push(result);
95         return result;
96     }
97
98     // Define X86_64 GPRs
99     {
100         let index = 0;
101         function newGPR(name, isCalleeSave) { return newReg(index++, GP, name, isCalleeSave); }
102         
103         Reg.rax = newGPR("rax");
104         Reg.rcx = newGPR("rcx");
105         Reg.rdx = newGPR("rdx");
106         Reg.rbx = newGPR("rbx", true);
107         Reg.rsp = newGPR("rsp");
108         Reg.rbp = newGPR("rbp", true);
109         Reg.rsi = newGPR("rsi");
110         Reg.rdi = newGPR("rdi");
111         for (let i = 8; i <= 15; ++i)
112             Reg[`r${i}`] = newGPR(`r${i}`, i >= 12);
113     }
114
115     // Define X86_64 FPRs.
116     for (let i = 0; i <= 15; ++i)
117         Reg[`xmm${i}`] = newReg(i, FP, `xmm${i}`);
118
119     Reg.gprs = []
120     Reg.fprs = []
121     Reg.calleeSaveGPRs = []
122     Reg.calleeSaveFPRs = []
123     Reg.calleeSaves = []
124     for (let reg of Reg.regs) {
125         if (reg.isGP) {
126             Reg.gprs.push(reg);
127             if (reg.isCalleeSave)
128                 Reg.calleeSaveGPRs.push(reg);
129         } else {
130             Reg.fprs.push(reg);
131             if (reg.isCalleeSave)
132                 Reg.calleeSaveFPRS.push(reg);
133         }
134         if (reg.isCalleeSave)
135             Reg.calleeSaves.push(reg);
136     }
137     
138     Reg.callFrameRegister = Reg.rbp;
139     Reg.stackPointerRegister = Reg.rsp;
140 }