Make JetStream 2
[WebKit-https.git] / PerformanceTests / JetStream2 / ARES-6 / Air / inst.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 Inst {
28     constructor(opcode, args = [])
29     {
30         this._opcode = opcode;
31         this._args = args;
32     }
33     
34     append(...args)
35     {
36         this._args.push(...args);
37     }
38     
39     clear()
40     {
41         this._opcode = Nop;
42         this._args = [];
43     }
44     
45     get opcode() { return this._opcode; }
46     get args() { return this._args; }
47     
48     visitArg(index, func, ...args)
49     {
50         let replacement = func(this._args[index], ...args);
51         if (replacement)
52             this._args[index] = replacement;
53     }
54     
55     forEachTmpFast(func)
56     {
57         for (let i = 0; i < this._args.length; ++i) {
58             let replacement;
59             if (replacement = this._args[i].forEachTmpFast(func))
60                 this._args[i] = replacement;
61         }
62     }
63     
64     forEachArg(func)
65     {
66         Inst_forEachArg(this, func);
67     }
68     
69     forEachTmp(func)
70     {
71         this.forEachArg((arg, role, type, width) => {
72             return arg.forEachTmp(role, type, width, func);
73         });
74     }
75     
76     forEach(thing, func)
77     {
78         this.forEachArg((arg, role, type, width) => {
79             return arg.forEach(thing, role, type, width, func);
80         });
81     }
82     
83     static forEachDef(thing, prevInst, nextInst, func)
84     {
85         if (prevInst) {
86             prevInst.forEach(
87                 thing,
88                 (value, role, type, width) => {
89                     if (Arg.isLateDef(role))
90                         return func(value, role, type, width);
91                 });
92         }
93         
94         if (nextInst) {
95             nextInst.forEach(
96                 thing,
97                 (value, role, type, width) => {
98                     if (Arg.isEarlyDef(role))
99                         return func(value, role, type, width);
100                 });
101         }
102     }
103     
104     static forEachDefWithExtraClobberedRegs(thing, prevInst, nextInst, func)
105     {
106         forEachDef(thing, prevInst, nextInst, func);
107         
108         let regDefRole;
109         
110         let reportReg = reg => {
111             let type = reg.isGPR ? GP : FP;
112             func(thing.fromReg(reg), regDefRole, type, Arg.conservativeWidth(type));
113         };
114         
115         if (prevInst && prevInst.opcode == Patch) {
116             regDefRole = Arg.Def;
117             prevInst.extraClobberedRegs.forEach(reportReg);
118         }
119         
120         if (nextInst && nextInst.opcode == Patch) {
121             regDefRole = Arg.EarlyDef;
122             nextInst.extraEarlyClobberedRegs.forEach(reportReg);
123         }
124     }
125     
126     get hasNonArgEffects() { return Inst_hasNonArgEffects(this); }
127     
128     hash()
129     {
130         let result = opcodeCode(this.opcode);
131         for (let arg of this.args) {
132             result += arg.hash();
133             result |= 0;
134         }
135         return result >>> 0;
136     }
137     
138     toString()
139     {
140         return "" + symbolName(this._opcode) + " " + this._args.join(", ");
141     }
142 }
143