Make JetStream 2
[WebKit-https.git] / PerformanceTests / JetStream2 / ARES-6 / Air / code.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 Code {
28     constructor()
29     {
30         this._blocks = [];
31         this._stackSlots = [];
32         this._gpTmps = [];
33         this._fpTmps = [];
34         this._callArgAreaSize = 0;
35         this._frameSize = 0;
36     }
37     
38     addBlock(frequency = 1)
39     {
40         return addIndexed(this._blocks, BasicBlock, frequency);
41     }
42     
43     addStackSlot(byteSize, kind)
44     {
45         return addIndexed(this._stackSlots, StackSlot, byteSize, kind);
46     }
47     
48     newTmp(type)
49     {
50         return addIndexed(this[`_${lowerSymbolName(type)}Tmps`], Tmp, type);
51     }
52     
53     get size() { return this._blocks.length; }
54     at(index) { return this._blocks[index]; }
55     
56     [Symbol.iterator]()
57     {
58         return this._blocks[Symbol.iterator]();
59     }
60     
61     get blocks() { return this._blocks; }
62     get stackSlots() { return this._stackSlots; }
63     
64     tmps(type) { return this[`_${lowerSymbolName(type)}Tmps`]; }
65     
66     get callArgAreaSize() { return this._callArgAreaSize; }
67     
68     requestCallArgAreaSize(size)
69     {
70         this._callArgAreaSize = Math.max(this._callArgAreaSize, roundUpToMultipleOf(stackAlignmentBytes, size));
71     }
72     
73     get frameSize() { return this._frameSize; }
74     
75     setFrameSize(frameSize) { this._frameSize = frameSize; }
76     
77     hash()
78     {
79         let result = 0;
80         for (let block of this) {
81             result *= 1000001;
82             result |= 0;
83             for (let inst of block) {
84                 result *= 97;
85                 result |= 0;
86                 result += inst.hash();
87                 result |= 0;
88             }
89             for (let successor of block.successorBlocks) {
90                 result *= 7;
91                 result |= 0;
92                 result += successor.index;
93                 result |= 0;
94             }
95         }
96         for (let slot of this.stackSlots) {
97             result *= 101;
98             result |= 0;
99             result += slot.hash();
100             result |= 0;
101         }
102         return result >>> 0;
103     }
104     
105     toString()
106     {
107         let result = "";
108         for (let block of this) {
109             result += block.toStringDeep();
110         }
111         if (this.stackSlots.length) {
112             result += "Stack slots:\n";
113             for (let slot of this.stackSlots)
114                 result += `    ${slot}\n`;
115         }
116         if (this._frameSize)
117             result += `Frame size: ${this._frameSize}\n`;
118         if (this._callArgAreaSize)
119             result += `Call arg area size: ${this._callArgAreaSize}\n`;
120         return result;
121     }
122 }