Make JetStream 2
[WebKit-https.git] / PerformanceTests / JetStream2 / ARES-6 / Air / stack_slot.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 StackSlot {
28     constructor(index, byteSize, kind)
29     {
30         this._index = index;
31         this._byteSize = byteSize;
32         this._kind = kind;
33     }
34     
35     get byteSize() { return this._byteSize; }
36     get kind() { return this._kind; }
37     
38     get isLocked() { return this._kind == Locked; }
39     get isSpill() { return this._kind == Spill; }
40     
41     get index() { return this._index; }
42
43     ensureSize(size)
44     {
45         if (this._offsetFromFP)
46             throw new Error("Stack slot already allocated");
47         this._byteSize = Math.max(this._byteSize, size);
48     }
49     
50     get alignment()
51     {
52         if (this._byteSize <= 1)
53             return 1;
54         if (this._byteSize <= 2)
55             return 2;
56         if (this._byteSize <= 4)
57             return 4;
58         return 8;
59     }
60     
61     get offsetFromFP() { return this._offsetFromFP; }
62     
63     setOffsetFromFP(value) { this._offsetFromFP = value; }
64     
65     hash()
66     {
67         return ((this._kind == Spill ? 1 : 0) + this._byteSize * 3 + (this._offsetFromFP ? this._offsetFromFP * 7 : 0)) >>> 0;
68     }
69     
70     toString()
71     {
72         return "" + (this.isSpill ? "spill" : "stack") + this._index + "<" + this._byteSize +
73             (this._offsetFromFP ? ", offset = " + this._offsetFromFP : "") + ">";
74     }
75     
76     static extract(arg)
77     {
78         if (arg.isStack)
79             return arg.stackSlot;
80         return null;
81     }
82     
83     static forEachFast(arg, func)
84     {
85         if (!arg.isStack)
86             return;
87         
88         let replacement;
89         if (replacement = func(arg.stackSlot))
90             return Arg.createStack(replacement, this._offset);
91     }
92     
93     static forEach(arg, role, type, width, func)
94     {
95         if (!arg.isStack)
96             return;
97         
98         let replacement;
99         if (replacement = func(arg.stackSlot, role, type, width))
100             return Arg.createStack(replacement, this._offset);
101     }
102 }