]>
git.saurik.com Git - apple/javascriptcore.git/blob - jit/Reg.h
2 * Copyright (C) 2014 Apple Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
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.
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.
31 #include "MacroAssembler.h"
35 // Reg is a polymorphic register class. It can refer to either integer or float registers.
36 // Here are some use cases:
40 // reg.isSet() == true
41 // reg.isGPR() == true
42 // reg.isFPR() == false
44 // for (Reg reg = Reg::first(); reg <= Reg::last(); reg = reg.next()) {
46 // } else /* reg.isFPR() */ {
50 // The above loop could have also used !!reg or reg.isSet() as a condition.
59 Reg(MacroAssembler::RegisterID reg
)
60 : m_index(MacroAssembler::registerIndex(reg
))
64 Reg(MacroAssembler::FPRegisterID reg
)
65 : m_index(MacroAssembler::registerIndex(reg
))
69 static Reg
fromIndex(unsigned index
)
72 result
.m_index
= index
;
86 result
.m_index
= MacroAssembler::numberOfRegisters() + MacroAssembler::numberOfFPRegisters() - 1;
96 result
.m_index
= m_index
+ 1;
100 unsigned index() const { return m_index
; }
102 bool isSet() const { return m_index
!= invalid(); }
103 bool operator!() const { return !isSet(); }
107 return m_index
< MacroAssembler::numberOfRegisters();
112 return (m_index
- MacroAssembler::numberOfRegisters()) < MacroAssembler::numberOfFPRegisters();
115 MacroAssembler::RegisterID
gpr() const
118 return static_cast<MacroAssembler::RegisterID
>(MacroAssembler::firstRegister() + m_index
);
121 MacroAssembler::FPRegisterID
fpr() const
124 return static_cast<MacroAssembler::FPRegisterID
>(
125 MacroAssembler::firstFPRegister() + (m_index
- MacroAssembler::numberOfRegisters()));
128 bool operator==(const Reg
& other
) const
130 return m_index
== other
.m_index
;
133 bool operator!=(const Reg
& other
) const
135 return m_index
!= other
.m_index
;
138 bool operator<(const Reg
& other
) const
140 return m_index
< other
.m_index
;
143 bool operator>(const Reg
& other
) const
145 return m_index
> other
.m_index
;
148 bool operator<=(const Reg
& other
) const
150 return m_index
<= other
.m_index
;
153 bool operator>=(const Reg
& other
) const
155 return m_index
>= other
.m_index
;
158 unsigned hash() const
163 void dump(PrintStream
&) const;
166 static uint8_t invalid() { return 0xff; }
173 #endif // ENABLE(JIT)