patches/spidermonkey-03-methodjit-sparc.diff
author jurikm
Sun, 12 Feb 2012 14:04:10 +0000
changeset 8245 383896da4129
parent 3902 66caadcb64c4
permissions -rw-r--r--
SFEsauerbraten.spec: add IPS package name
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3902
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
     1
diff --git a/js/src/Makefile.in b/js/src/Makefile.in
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
     2
index fadd850..b719c30 100644
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
     3
--- a/js/src/Makefile.in
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
     4
+++ b/js/src/Makefile.in
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
     5
@@ -350,6 +350,9 @@ endif
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
     6
 ifeq (arm, $(TARGET_CPU))
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
     7
 #CPPSRCS		+= only_on_arm.cpp
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
     8
 endif
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
     9
+ifeq (sparc, $(findstring sparc,$(TARGET_CPU)))
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    10
+ASFILES +=	TrampolineSparc.s
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    11
+endif
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    12
 #
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    13
 # END enclude sources for the method JIT
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    14
 #############################################
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    15
@@ -375,7 +378,7 @@ CPPSRCS += 	checks.cc \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    16
 # END enclude sources for V8 dtoa
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    17
 #############################################
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    18
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    19
-ifeq (,$(filter-out powerpc sparc,$(TARGET_CPU)))
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    20
+ifeq (,$(filter-out powerpc,$(TARGET_CPU)))
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    21
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    22
 VPATH +=	$(srcdir)/assembler \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    23
 		$(srcdir)/assembler/wtf \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    24
diff --git a/js/src/assembler/assembler/AbstractMacroAssembler.h b/js/src/assembler/assembler/AbstractMacroAssembler.h
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    25
index 77958d9..d06a213 100644
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    26
--- a/js/src/assembler/assembler/AbstractMacroAssembler.h
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    27
+++ b/js/src/assembler/assembler/AbstractMacroAssembler.h
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    28
@@ -522,6 +522,11 @@ public:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    29
         return AssemblerType::getDifferenceBetweenLabels(from.m_label, to.m_label);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    30
     }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    31
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    32
+    ptrdiff_t differenceBetween(DataLabel32 from, Jump to)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    33
+    {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    34
+        return AssemblerType::getDifferenceBetweenLabels(from.m_label, to.m_jmp);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    35
+    }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    36
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    37
     ptrdiff_t differenceBetween(DataLabelPtr from, Jump to)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    38
     {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    39
         return AssemblerType::getDifferenceBetweenLabels(from.m_label, to.m_jmp);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    40
diff --git a/js/src/assembler/assembler/MacroAssembler.h b/js/src/assembler/assembler/MacroAssembler.h
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    41
index 5f24981..73bda22 100644
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    42
--- a/js/src/assembler/assembler/MacroAssembler.h
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    43
+++ b/js/src/assembler/assembler/MacroAssembler.h
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    44
@@ -54,6 +54,10 @@ namespace JSC { typedef MacroAssemblerX86 MacroAssemblerBase; }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    45
 #include "MacroAssemblerX86_64.h"
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    46
 namespace JSC { typedef MacroAssemblerX86_64 MacroAssemblerBase; }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    47
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    48
+#elif WTF_CPU_SPARC
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    49
+#include "MacroAssemblerSparc.h"
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    50
+namespace JSC { typedef MacroAssemblerSparc MacroAssemblerBase; }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    51
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    52
 #else
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    53
 #error "The MacroAssembler is not supported on this platform."
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    54
 #endif
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    55
diff --git a/js/src/assembler/assembler/MacroAssemblerSparc.h b/js/src/assembler/assembler/MacroAssemblerSparc.h
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    56
new file mode 100644
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    57
index 0000000..a2a039c
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    58
--- /dev/null
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    59
+++ b/js/src/assembler/assembler/MacroAssemblerSparc.h
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    60
@@ -0,0 +1,1485 @@
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    61
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    62
+ * vim: set ts=4 sw=4 et tw=99:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    63
+ *
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    64
+ * ***** BEGIN LICENSE BLOCK *****
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    65
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    66
+ *
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    67
+ * The contents of this file are subject to the Mozilla Public License Version
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    68
+ * 1.1 (the "License"); you may not use this file except in compliance with
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    69
+ * the License. You may obtain a copy of the License at
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    70
+ * http://www.mozilla.org/MPL/
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    71
+ *
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    72
+ * Software distributed under the License is distributed on an "AS IS" basis,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    73
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    74
+ * for the specific language governing rights and limitations under the
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    75
+ * License.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    76
+ *
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    77
+ * The Original Code is Mozilla SpiderMonkey JavaScript 1.9 code, released
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    78
+ * May 28, 2008.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    79
+ *
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    80
+ * The Initial Developer of the Original Code is
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    81
+ * Leon Sha <[email protected]>
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    82
+ * 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    83
+ * Portions created by the Initial Developer are Copyright (C) 2010-2011
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    84
+ * the Initial Developer. All Rights Reserved.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    85
+ *
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    86
+ * Contributor(s):
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    87
+ *
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    88
+ * Alternatively, the contents of this file may be used under the terms of
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    89
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    90
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    91
+ * in which case the provisions of the GPL or the LGPL are applicable instead
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    92
+ * of those above. If you wish to allow use of your version of this file only
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    93
+ * under the terms of either the GPL or the LGPL, and not to allow others to
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    94
+ * use your version of this file under the terms of the MPL, indicate your
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    95
+ * decision by deleting the provisions above and replace them with the notice
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    96
+ * and other provisions required by the GPL or the LGPL. If you do not delete
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    97
+ * the provisions above, a recipient may use your version of this file under
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    98
+ * the terms of any one of the MPL, the GPL or the LGPL.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
    99
+ *
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   100
+ * ***** END LICENSE BLOCK ***** */
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   101
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   102
+#ifndef MacroAssemblerSparc_h
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   103
+#define MacroAssemblerSparc_h
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   104
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   105
+#include <wtf/Platform.h>
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   106
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   107
+#if ENABLE_ASSEMBLER && WTF_CPU_SPARC
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   108
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   109
+#include "SparcAssembler.h"
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   110
+#include "AbstractMacroAssembler.h"
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   111
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   112
+namespace JSC {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   113
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   114
+    class MacroAssemblerSparc : public AbstractMacroAssembler<SparcAssembler> {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   115
+    public:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   116
+        enum Condition {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   117
+            Equal = SparcAssembler::ConditionE,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   118
+            NotEqual = SparcAssembler::ConditionNE,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   119
+            Above = SparcAssembler::ConditionGU,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   120
+            AboveOrEqual = SparcAssembler::ConditionCC,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   121
+            Below = SparcAssembler::ConditionCS,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   122
+            BelowOrEqual = SparcAssembler::ConditionLEU,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   123
+            GreaterThan = SparcAssembler::ConditionG,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   124
+            GreaterThanOrEqual = SparcAssembler::ConditionGE,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   125
+            LessThan = SparcAssembler::ConditionL,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   126
+            LessThanOrEqual = SparcAssembler::ConditionLE,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   127
+            Overflow = SparcAssembler::ConditionVS,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   128
+            Signed = SparcAssembler::ConditionNEG,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   129
+            Zero = SparcAssembler::ConditionE,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   130
+            NonZero = SparcAssembler::ConditionNE
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   131
+        };
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   132
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   133
+        enum DoubleCondition {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   134
+            // These conditions will only evaluate to true if the comparison is ordered - i.e. neither operand is NaN.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   135
+            DoubleEqual = SparcAssembler::DoubleConditionE,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   136
+            DoubleNotEqual = SparcAssembler::DoubleConditionNE,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   137
+            DoubleGreaterThan = SparcAssembler::DoubleConditionG,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   138
+            DoubleGreaterThanOrEqual = SparcAssembler::DoubleConditionGE,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   139
+            DoubleLessThan = SparcAssembler::DoubleConditionL,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   140
+            DoubleLessThanOrEqual = SparcAssembler::DoubleConditionLE,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   141
+            // If either operand is NaN, these conditions always evaluate to true.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   142
+            DoubleEqualOrUnordered = SparcAssembler::DoubleConditionUE,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   143
+            DoubleNotEqualOrUnordered = SparcAssembler::DoubleConditionNE,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   144
+            DoubleGreaterThanOrUnordered = SparcAssembler::DoubleConditionUG,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   145
+            DoubleGreaterThanOrEqualOrUnordered = SparcAssembler::DoubleConditionUGE,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   146
+            DoubleLessThanOrUnordered = SparcAssembler::DoubleConditionUL,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   147
+            DoubleLessThanOrEqualOrUnordered = SparcAssembler::DoubleConditionULE
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   148
+        };
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   149
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   150
+        static const RegisterID stackPointerRegister = SparcRegisters::sp;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   151
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   152
+        static const Scale ScalePtr = TimesFour;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   153
+        static const unsigned int TotalRegisters = 32;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   154
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   155
+        void add32(RegisterID src, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   156
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   157
+            m_assembler.addcc_r(dest, src, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   158
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   159
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   160
+        void add32(Imm32 imm, Address address)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   161
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   162
+            load32(address, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   163
+            add32(imm, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   164
+            store32(SparcRegisters::g2, address);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   165
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   166
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   167
+        void add32(Imm32 imm, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   168
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   169
+            if (m_assembler.isimm13(imm.m_value))
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   170
+                m_assembler.addcc_imm(dest, imm.m_value, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   171
+            else {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   172
+                m_assembler.move_nocheck(imm.m_value, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   173
+                m_assembler.addcc_r(dest, SparcRegisters::g3, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   174
+            }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   175
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   176
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   177
+        void add32(Address src, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   178
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   179
+            load32(src, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   180
+            m_assembler.addcc_r(dest, SparcRegisters::g2, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   181
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   182
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   183
+        void and32(Address src, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   184
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   185
+            load32(src, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   186
+            m_assembler.andcc_r(dest, SparcRegisters::g2, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   187
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   188
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   189
+        void add32(Imm32 imm, RegisterID src, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   190
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   191
+            if (m_assembler.isimm13(imm.m_value))
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   192
+                m_assembler.addcc_imm(src, imm.m_value, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   193
+            else {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   194
+                m_assembler.move_nocheck(imm.m_value, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   195
+                m_assembler.addcc_r(src, SparcRegisters::g3, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   196
+            }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   197
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   198
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   199
+        void and32(RegisterID src, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   200
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   201
+            m_assembler.andcc_r(dest, src, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   202
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   203
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   204
+        void and32(Imm32 imm, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   205
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   206
+            if (m_assembler.isimm13(imm.m_value))
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   207
+                m_assembler.andcc_imm(dest, imm.m_value, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   208
+            else {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   209
+                m_assembler.move_nocheck(imm.m_value, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   210
+                m_assembler.andcc_r(dest, SparcRegisters::g3, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   211
+            }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   212
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   213
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   214
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   215
+        void lshift32(RegisterID shift_amount, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   216
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   217
+            m_assembler.sll_r(dest, shift_amount, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   218
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   219
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   220
+        void lshift32(Imm32 imm, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   221
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   222
+            // No need to check if imm.m_value.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   223
+            // The last 5 bit of imm.m_value will be used anyway.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   224
+            m_assembler.sll_imm(dest, imm.m_value, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   225
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   226
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   227
+        void mul32(RegisterID src, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   228
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   229
+            m_assembler.smulcc_r(dest, src, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   230
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   231
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   232
+        void mul32(Imm32 imm, RegisterID src, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   233
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   234
+            if (m_assembler.isimm13(imm.m_value))
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   235
+                m_assembler.smulcc_imm(dest, imm.m_value, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   236
+            else {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   237
+                m_assembler.move_nocheck(imm.m_value, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   238
+                m_assembler.smulcc_r(SparcRegisters::g3, dest, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   239
+            }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   240
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   241
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   242
+        void neg32(RegisterID srcDest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   243
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   244
+            m_assembler.subcc_r(SparcRegisters::g0, srcDest, srcDest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   245
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   246
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   247
+        void not32(RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   248
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   249
+            m_assembler.xnorcc_r(dest, SparcRegisters::g0, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   250
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   251
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   252
+        void or32(RegisterID src, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   253
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   254
+            m_assembler.orcc_r(dest, src, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   255
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   256
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   257
+        void or32(Imm32 imm, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   258
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   259
+            if (m_assembler.isimm13(imm.m_value))
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   260
+                m_assembler.orcc_imm(dest, imm.m_value, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   261
+            else {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   262
+                m_assembler.move_nocheck(imm.m_value, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   263
+                m_assembler.or_r(SparcRegisters::g3, dest, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   264
+            }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   265
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   266
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   267
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   268
+        void or32(Address address, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   269
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   270
+            load32(address, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   271
+            or32(SparcRegisters::g2, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   272
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   273
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   274
+        void rshift32(RegisterID shift_amount, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   275
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   276
+            m_assembler.sra_r(dest, shift_amount, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   277
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   278
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   279
+        void rshift32(Imm32 imm, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   280
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   281
+            // No need to check if imm.m_value.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   282
+            // The last 5 bit of imm.m_value will be used anyway.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   283
+            m_assembler.sra_imm(dest, imm.m_value, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   284
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   285
+    
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   286
+        void urshift32(RegisterID shift_amount, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   287
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   288
+            m_assembler.srl_r(dest, shift_amount, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   289
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   290
+    
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   291
+        void urshift32(Imm32 imm, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   292
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   293
+            // No need to check if imm.m_value.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   294
+            // The last 5 bit of imm.m_value will be used anyway.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   295
+            m_assembler.srl_imm(dest, imm.m_value, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   296
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   297
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   298
+        void sub32(RegisterID src, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   299
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   300
+            m_assembler.subcc_r(dest, src, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   301
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   302
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   303
+        void sub32(Imm32 imm, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   304
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   305
+            if (m_assembler.isimm13(imm.m_value))
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   306
+                m_assembler.subcc_imm(dest, imm.m_value, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   307
+            else {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   308
+                m_assembler.move_nocheck(imm.m_value, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   309
+                m_assembler.subcc_r(dest, SparcRegisters::g3, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   310
+            }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   311
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   312
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   313
+        void sub32(Imm32 imm, Address address)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   314
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   315
+            load32(address, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   316
+            sub32(imm, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   317
+            store32(SparcRegisters::g2, address);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   318
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   319
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   320
+        void sub32(Address src, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   321
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   322
+            load32(src, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   323
+            sub32(SparcRegisters::g2, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   324
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   325
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   326
+        void xor32(RegisterID src, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   327
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   328
+            m_assembler.xorcc_r(src, dest, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   329
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   330
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   331
+        void xor32(Imm32 imm, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   332
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   333
+            if (m_assembler.isimm13(imm.m_value))
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   334
+                m_assembler.xorcc_imm(dest, imm.m_value, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   335
+            else {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   336
+                m_assembler.move_nocheck(imm.m_value, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   337
+                m_assembler.xorcc_r(dest, SparcRegisters::g3, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   338
+            }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   339
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   340
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   341
+        void xor32(Address src, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   342
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   343
+            load32(src, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   344
+            xor32(SparcRegisters::g2, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   345
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   346
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   347
+        void load8(ImplicitAddress address, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   348
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   349
+            if (m_assembler.isimm13(address.offset))
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   350
+                m_assembler.ldub_imm(address.base, address.offset, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   351
+            else {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   352
+                m_assembler.move_nocheck(address.offset, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   353
+                m_assembler.ldub_r(address.base, SparcRegisters::g3, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   354
+            }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   355
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   356
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   357
+        void load32(ImplicitAddress address, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   358
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   359
+            if (m_assembler.isimm13(address.offset))
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   360
+                m_assembler.lduw_imm(address.base, address.offset, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   361
+            else {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   362
+                m_assembler.move_nocheck(address.offset, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   363
+                m_assembler.lduw_r(address.base, SparcRegisters::g3, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   364
+            }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   365
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   366
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   367
+        void load32(BaseIndex address, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   368
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   369
+            m_assembler.sll_imm(address.index, address.scale, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   370
+            add32(Imm32(address.offset), SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   371
+            m_assembler.lduw_r(address.base, SparcRegisters::g2, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   372
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   373
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   374
+        void load32WithUnalignedHalfWords(BaseIndex address, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   375
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   376
+            m_assembler.sll_imm(address.index, address.scale, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   377
+            add32(Imm32(address.offset+3), SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   378
+            m_assembler.ldub_r(address.base, SparcRegisters::g2, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   379
+            m_assembler.subcc_imm(SparcRegisters::g2, 1, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   380
+            m_assembler.ldub_r(address.base, SparcRegisters::g2, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   381
+            m_assembler.sll_imm(SparcRegisters::g3, 8, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   382
+            m_assembler.or_r(SparcRegisters::g3, dest, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   383
+            m_assembler.subcc_imm(SparcRegisters::g2, 1, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   384
+            m_assembler.ldub_r(address.base, SparcRegisters::g2, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   385
+            m_assembler.sll_imm(SparcRegisters::g3, 16, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   386
+            m_assembler.or_r(SparcRegisters::g3, dest, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   387
+            m_assembler.subcc_imm(SparcRegisters::g2, 1, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   388
+            m_assembler.ldub_r(address.base, SparcRegisters::g2, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   389
+            m_assembler.sll_imm(SparcRegisters::g3, 24, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   390
+            m_assembler.or_r(SparcRegisters::g3, dest, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   391
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   392
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   393
+        DataLabel32 load32WithAddressOffsetPatch(Address address, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   394
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   395
+            DataLabel32 dataLabel(this);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   396
+            m_assembler.move_nocheck(0, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   397
+            m_assembler.lduw_r(address.base, SparcRegisters::g3, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   398
+            return dataLabel;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   399
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   400
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   401
+        DataLabel32 load64WithAddressOffsetPatch(Address address, RegisterID hi, RegisterID lo)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   402
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   403
+            DataLabel32 dataLabel(this);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   404
+            m_assembler.move_nocheck(0, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   405
+            m_assembler.add_imm(SparcRegisters::g3, 4, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   406
+            m_assembler.lduw_r(address.base, SparcRegisters::g3, hi);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   407
+            m_assembler.lduw_r(address.base, SparcRegisters::g2, lo);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   408
+            return dataLabel;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   409
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   410
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   411
+        Label loadPtrWithPatchToLEA(Address address, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   412
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   413
+            Label label(this);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   414
+            load32(address, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   415
+            return label;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   416
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   417
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   418
+        void load16(BaseIndex address, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   419
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   420
+            m_assembler.sll_imm(address.index, address.scale, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   421
+            add32(Imm32(address.offset), SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   422
+            m_assembler.lduh_r(address.base, SparcRegisters::g2, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   423
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   424
+    
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   425
+        void load16(ImplicitAddress address, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   426
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   427
+            if (m_assembler.isimm13(address.offset))
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   428
+                m_assembler.lduh_imm(address.base, address.offset, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   429
+            else {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   430
+                m_assembler.move_nocheck(address.offset, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   431
+                m_assembler.lduh_r(address.base, SparcRegisters::g3, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   432
+            }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   433
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   434
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   435
+        void store8(RegisterID src, ImplicitAddress address)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   436
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   437
+            if (m_assembler.isimm13(address.offset))
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   438
+                m_assembler.stb_imm(src, address.base, address.offset);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   439
+            else {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   440
+                m_assembler.move_nocheck(address.offset, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   441
+                m_assembler.stb_r(src, address.base, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   442
+            }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   443
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   444
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   445
+        void store8(RegisterID src, BaseIndex address)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   446
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   447
+            m_assembler.sll_imm(address.index, address.scale, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   448
+            add32(Imm32(address.offset), SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   449
+            m_assembler.stb_r(src, address.base, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   450
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   451
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   452
+        void store8(Imm32 imm, ImplicitAddress address)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   453
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   454
+            m_assembler.move_nocheck(imm.m_value, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   455
+            store8(SparcRegisters::g2, address);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   456
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   457
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   458
+        void store8(Imm32 imm, BaseIndex address)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   459
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   460
+            m_assembler.sll_imm(address.index, address.scale, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   461
+            add32(Imm32(address.offset), SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   462
+            move(imm, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   463
+            m_assembler.stb_r(SparcRegisters::g3, SparcRegisters::g2, address.base);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   464
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   465
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   466
+        void store16(RegisterID src, ImplicitAddress address)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   467
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   468
+            if (m_assembler.isimm13(address.offset))
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   469
+                m_assembler.sth_imm(src, address.base, address.offset);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   470
+            else {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   471
+                m_assembler.move_nocheck(address.offset, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   472
+                m_assembler.sth_r(src, address.base, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   473
+            }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   474
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   475
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   476
+        void store16(RegisterID src, BaseIndex address)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   477
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   478
+            m_assembler.sll_imm(address.index, address.scale, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   479
+            add32(Imm32(address.offset), SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   480
+            m_assembler.sth_r(src, address.base, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   481
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   482
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   483
+        void store16(Imm32 imm, ImplicitAddress address)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   484
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   485
+            m_assembler.move_nocheck(imm.m_value, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   486
+            store16(SparcRegisters::g2, address);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   487
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   488
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   489
+        void store16(Imm32 imm, BaseIndex address)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   490
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   491
+            m_assembler.sll_imm(address.index, address.scale, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   492
+            add32(Imm32(address.offset), SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   493
+            move(imm, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   494
+            m_assembler.sth_r(SparcRegisters::g3, SparcRegisters::g2, address.base);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   495
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   496
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   497
+        void load8ZeroExtend(BaseIndex address, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   498
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   499
+            m_assembler.sll_imm(address.index, address.scale, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   500
+            add32(Imm32(address.offset), SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   501
+            m_assembler.ldub_r(address.base, SparcRegisters::g2, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   502
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   503
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   504
+        void load8ZeroExtend(Address address, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   505
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   506
+            if (m_assembler.isimm13(address.offset))
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   507
+                m_assembler.ldub_imm(address.base, address.offset, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   508
+            else {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   509
+                m_assembler.move_nocheck(address.offset, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   510
+                m_assembler.ldub_r(address.base, SparcRegisters::g3, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   511
+            }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   512
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   513
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   514
+        void load8SignExtend(BaseIndex address, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   515
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   516
+            m_assembler.sll_imm(address.index, address.scale, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   517
+            add32(Imm32(address.offset), SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   518
+            m_assembler.ldsb_r(address.base, SparcRegisters::g2, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   519
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   520
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   521
+        void load8SignExtend(Address address, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   522
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   523
+            if (m_assembler.isimm13(address.offset))
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   524
+                m_assembler.ldsb_imm(address.base, address.offset, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   525
+            else {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   526
+                m_assembler.move_nocheck(address.offset, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   527
+                m_assembler.ldsb_r(address.base, SparcRegisters::g3, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   528
+            }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   529
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   530
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   531
+        void load16SignExtend(BaseIndex address, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   532
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   533
+            m_assembler.sll_imm(address.index, address.scale, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   534
+            add32(Imm32(address.offset), SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   535
+            m_assembler.ldsh_r(address.base, SparcRegisters::g2, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   536
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   537
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   538
+        void load16SignExtend(Address address, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   539
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   540
+            if (m_assembler.isimm13(address.offset))
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   541
+                m_assembler.ldsh_imm(address.base, address.offset, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   542
+            else {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   543
+                m_assembler.move_nocheck(address.offset, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   544
+                m_assembler.ldsh_r(address.base, SparcRegisters::g3, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   545
+            }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   546
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   547
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   548
+        DataLabel32 store32WithAddressOffsetPatch(RegisterID src, Address address)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   549
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   550
+            DataLabel32 dataLabel(this);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   551
+            // Since this is for patch, we don't check is offset is imm13.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   552
+            m_assembler.move_nocheck(0, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   553
+            m_assembler.stw_r(src, address.base, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   554
+            return dataLabel;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   555
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   556
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   557
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   558
+        DataLabel32 store64WithAddressOffsetPatch(RegisterID hi, RegisterID lo, Address address)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   559
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   560
+            DataLabel32 dataLabel(this);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   561
+            m_assembler.move_nocheck(address.offset, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   562
+            m_assembler.add_r(SparcRegisters::g3, address.base, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   563
+            m_assembler.stw_imm(lo, SparcRegisters::g3, 4);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   564
+            m_assembler.stw_imm(hi, SparcRegisters::g3, 0);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   565
+            return dataLabel;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   566
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   567
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   568
+        DataLabel32 store64WithAddressOffsetPatch(Imm32 hi, RegisterID lo, Address address)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   569
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   570
+            DataLabel32 dataLabel(this);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   571
+            m_assembler.move_nocheck(address.offset, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   572
+            m_assembler.add_r(SparcRegisters::g3, address.base, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   573
+            m_assembler.stw_imm(lo, SparcRegisters::g3, 4);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   574
+            move(hi, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   575
+            m_assembler.stw_imm(SparcRegisters::g2, SparcRegisters::g3, 0);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   576
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   577
+            return dataLabel;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   578
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   579
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   580
+        DataLabel32 store64WithAddressOffsetPatch(Imm32 hi, Imm32 lo, Address address)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   581
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   582
+            DataLabel32 dataLabel(this);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   583
+            m_assembler.move_nocheck(address.offset, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   584
+            m_assembler.add_r(SparcRegisters::g3, address.base, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   585
+            move(lo, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   586
+            m_assembler.stw_imm(SparcRegisters::g2, SparcRegisters::g3, 4);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   587
+            move(hi, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   588
+            m_assembler.stw_imm(SparcRegisters::g2, SparcRegisters::g3, 0);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   589
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   590
+            return dataLabel;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   591
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   592
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   593
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   594
+        void store32(RegisterID src, ImplicitAddress address)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   595
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   596
+            if (m_assembler.isimm13(address.offset))
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   597
+                m_assembler.stw_imm(src, address.base, address.offset);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   598
+            else {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   599
+                m_assembler.move_nocheck(address.offset, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   600
+                m_assembler.stw_r(src, address.base, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   601
+            }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   602
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   603
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   604
+        void store32(RegisterID src, BaseIndex address)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   605
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   606
+            m_assembler.sll_imm(address.index, address.scale, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   607
+            add32(Imm32(address.offset), SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   608
+            m_assembler.stw_r(src, address.base, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   609
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   610
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   611
+        void store32(Imm32 imm, BaseIndex address)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   612
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   613
+            m_assembler.sll_imm(address.index, address.scale, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   614
+            add32(Imm32(address.offset), SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   615
+            move(imm, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   616
+            m_assembler.stw_r(SparcRegisters::g3, SparcRegisters::g2, address.base);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   617
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   618
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   619
+        void store32(Imm32 imm, ImplicitAddress address)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   620
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   621
+            m_assembler.move_nocheck(imm.m_value, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   622
+            store32(SparcRegisters::g2, address);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   623
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   624
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   625
+        void store32(RegisterID src, void* address)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   626
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   627
+            m_assembler.move_nocheck((int)address, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   628
+            m_assembler.stw_r(src, SparcRegisters::g0, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   629
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   630
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   631
+        void store32(Imm32 imm, void* address)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   632
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   633
+            move(imm, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   634
+            store32(SparcRegisters::g2, address);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   635
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   636
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   637
+        void pop(RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   638
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   639
+            m_assembler.lduw_imm(SparcRegisters::sp, 0x68, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   640
+            m_assembler.addcc_imm(SparcRegisters::sp, 4, SparcRegisters::sp);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   641
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   642
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   643
+        void push(RegisterID src)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   644
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   645
+            m_assembler.subcc_imm(SparcRegisters::sp, 4, SparcRegisters::sp);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   646
+            m_assembler.stw_imm(src, SparcRegisters::sp, 0x68);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   647
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   648
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   649
+        void push(Address address)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   650
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   651
+            load32(address, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   652
+            push(SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   653
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   654
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   655
+        void push(Imm32 imm)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   656
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   657
+            move(imm, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   658
+            push(SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   659
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   660
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   661
+        void move(Imm32 imm, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   662
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   663
+            if (m_assembler.isimm13(imm.m_value))
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   664
+                m_assembler.or_imm(SparcRegisters::g0, imm.m_value, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   665
+            else
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   666
+                m_assembler.move_nocheck(imm.m_value, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   667
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   668
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   669
+        void move(RegisterID src, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   670
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   671
+            m_assembler.or_r(src, SparcRegisters::g0, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   672
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   673
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   674
+        void move(ImmPtr imm, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   675
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   676
+            move(Imm32(imm), dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   677
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   678
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   679
+        void swap(RegisterID reg1, RegisterID reg2)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   680
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   681
+            m_assembler.or_r(reg1, SparcRegisters::g0, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   682
+            m_assembler.or_r(reg2, SparcRegisters::g0, reg1);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   683
+            m_assembler.or_r(SparcRegisters::g3, SparcRegisters::g0, reg2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   684
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   685
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   686
+        void signExtend32ToPtr(RegisterID src, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   687
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   688
+            if (src != dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   689
+                move(src, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   690
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   691
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   692
+        void zeroExtend32ToPtr(RegisterID src, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   693
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   694
+            if (src != dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   695
+                move(src, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   696
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   697
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   698
+        Jump branch8(Condition cond, Address left, Imm32 right)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   699
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   700
+            load8(left, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   701
+            return branch32(cond, SparcRegisters::g2, right);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   702
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   703
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   704
+        Jump branch32_force32(Condition cond, RegisterID left, Imm32 right)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   705
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   706
+            m_assembler.move_nocheck(right.m_value, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   707
+            m_assembler.subcc_r(left, SparcRegisters::g3, SparcRegisters::g0);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   708
+            return Jump(m_assembler.branch(SparcCondition(cond)));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   709
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   710
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   711
+        Jump branch32FixedLength(Condition cond, RegisterID left, Imm32 right)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   712
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   713
+            m_assembler.move_nocheck(right.m_value, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   714
+            return branch32(cond, left, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   715
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   716
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   717
+        Jump branch32WithPatch(Condition cond, RegisterID left, Imm32 right, DataLabel32 &dataLabel)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   718
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   719
+            // Always use move_nocheck, since the value is to be patched.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   720
+            dataLabel = DataLabel32(this);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   721
+            m_assembler.move_nocheck(right.m_value, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   722
+            m_assembler.subcc_r(left, SparcRegisters::g3, SparcRegisters::g0);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   723
+            return Jump(m_assembler.branch(SparcCondition(cond)));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   724
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   725
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   726
+        Jump branch32(Condition cond, RegisterID left, RegisterID right)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   727
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   728
+            m_assembler.subcc_r(left, right, SparcRegisters::g0);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   729
+            return Jump(m_assembler.branch(SparcCondition(cond)));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   730
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   731
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   732
+        Jump branch32(Condition cond, RegisterID left, Imm32 right)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   733
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   734
+            if (m_assembler.isimm13(right.m_value))
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   735
+                m_assembler.subcc_imm(left, right.m_value, SparcRegisters::g0);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   736
+            else {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   737
+                m_assembler.move_nocheck(right.m_value, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   738
+                m_assembler.subcc_r(left, SparcRegisters::g3, SparcRegisters::g0);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   739
+            }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   740
+            return Jump(m_assembler.branch(SparcCondition(cond)));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   741
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   742
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   743
+        Jump branch32(Condition cond, RegisterID left, Address right)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   744
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   745
+            load32(right, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   746
+            return branch32(cond, left, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   747
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   748
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   749
+        Jump branch32(Condition cond, Address left, RegisterID right)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   750
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   751
+            load32(left, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   752
+            return branch32(cond, SparcRegisters::g2, right);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   753
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   754
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   755
+        Jump branch32(Condition cond, Address left, Imm32 right)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   756
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   757
+            load32(left, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   758
+            return branch32(cond, SparcRegisters::g2, right);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   759
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   760
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   761
+        Jump branch32(Condition cond, BaseIndex left, Imm32 right)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   762
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   763
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   764
+            load32(left, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   765
+            return branch32(cond, SparcRegisters::g2, right);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   766
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   767
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   768
+        Jump branch32WithUnalignedHalfWords(Condition cond, BaseIndex left, Imm32 right)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   769
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   770
+            load32WithUnalignedHalfWords(left, SparcRegisters::g4);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   771
+            return branch32(cond, SparcRegisters::g4, right);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   772
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   773
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   774
+        Jump branch16(Condition cond, BaseIndex left, RegisterID right)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   775
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   776
+            (void)(cond);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   777
+            (void)(left);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   778
+            (void)(right);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   779
+            ASSERT_NOT_REACHED();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   780
+            return jump();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   781
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   782
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   783
+        Jump branch16(Condition cond, BaseIndex left, Imm32 right)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   784
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   785
+            load16(left, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   786
+            move(right, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   787
+            m_assembler.subcc_r(SparcRegisters::g3, SparcRegisters::g2, SparcRegisters::g0);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   788
+            return Jump(m_assembler.branch(SparcCondition(cond)));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   789
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   790
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   791
+        Jump branchTest8(Condition cond, Address address, Imm32 mask = Imm32(-1))
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   792
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   793
+            load8(address, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   794
+            return branchTest32(cond, SparcRegisters::g2, mask);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   795
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   796
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   797
+        Jump branchTest32(Condition cond, RegisterID reg, RegisterID mask)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   798
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   799
+            m_assembler.andcc_r(reg, mask, SparcRegisters::g0);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   800
+            return Jump(m_assembler.branch(SparcCondition(cond)));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   801
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   802
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   803
+        Jump branchTest32(Condition cond, RegisterID reg, Imm32 mask = Imm32(-1))
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   804
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   805
+            if (m_assembler.isimm13(mask.m_value))
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   806
+                m_assembler.andcc_imm(reg, mask.m_value, SparcRegisters::g0);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   807
+            else {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   808
+                m_assembler.move_nocheck(mask.m_value, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   809
+                m_assembler.andcc_r(reg, SparcRegisters::g3, SparcRegisters::g0);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   810
+            }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   811
+            return Jump(m_assembler.branch(SparcCondition(cond)));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   812
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   813
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   814
+        Jump branchTest32(Condition cond, Address address, Imm32 mask = Imm32(-1))
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   815
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   816
+            load32(address, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   817
+            return branchTest32(cond, SparcRegisters::g2, mask);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   818
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   819
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   820
+        Jump branchTest32(Condition cond, BaseIndex address, Imm32 mask = Imm32(-1))
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   821
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   822
+            // FIXME. branchTest32 only used by PolyIC.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   823
+            // PolyIC is not enabled for sparc now.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   824
+            ASSERT(0);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   825
+            return jump();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   826
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   827
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   828
+        Jump jump()
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   829
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   830
+            return Jump(m_assembler.jmp());
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   831
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   832
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   833
+        void jump(RegisterID target)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   834
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   835
+            m_assembler.jmpl_r(SparcRegisters::g0, target, SparcRegisters::g0);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   836
+            m_assembler.nop();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   837
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   838
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   839
+        void jump(Address address)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   840
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   841
+            load32(address, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   842
+            m_assembler.jmpl_r(SparcRegisters::g2, SparcRegisters::g0, SparcRegisters::g0);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   843
+            m_assembler.nop();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   844
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   845
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   846
+        void jump(BaseIndex address)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   847
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   848
+            load32(address, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   849
+            m_assembler.jmpl_r(SparcRegisters::g2, SparcRegisters::g0, SparcRegisters::g0);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   850
+            m_assembler.nop();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   851
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   852
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   853
+        Jump branchAdd32(Condition cond, RegisterID src, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   854
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   855
+            ASSERT((cond == Overflow) || (cond == Signed) || (cond == Zero) || (cond == NonZero));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   856
+            m_assembler.addcc_r(src, dest, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   857
+            return Jump(m_assembler.branch(SparcCondition(cond)));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   858
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   859
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   860
+        Jump branchAdd32(Condition cond, Imm32 imm, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   861
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   862
+            ASSERT((cond == Overflow) || (cond == Signed) || (cond == Zero) || (cond == NonZero));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   863
+            if (m_assembler.isimm13(imm.m_value))
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   864
+                m_assembler.addcc_imm(dest, imm.m_value, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   865
+            else {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   866
+                m_assembler.move_nocheck(imm.m_value, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   867
+                m_assembler.addcc_r(dest, SparcRegisters::g3, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   868
+            }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   869
+            return Jump(m_assembler.branch(SparcCondition(cond)));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   870
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   871
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   872
+        Jump branchAdd32(Condition cond, Address src, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   873
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   874
+            ASSERT((cond == Overflow) || (cond == Signed) || (cond == Zero) || (cond == NonZero));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   875
+            load32(src, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   876
+            return branchAdd32(cond, SparcRegisters::g2, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   877
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   878
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   879
+        void mull32(RegisterID src1, RegisterID src2, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   880
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   881
+            m_assembler.smulcc_r(src1, src2, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   882
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   883
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   884
+        Jump branchMul32(Condition cond, RegisterID src, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   885
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   886
+            ASSERT((cond == Overflow) || (cond == Signed) || (cond == Zero) || (cond == NonZero));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   887
+            m_assembler.smulcc_r(src, dest, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   888
+            if (cond == Overflow) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   889
+                m_assembler.rdy(SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   890
+                m_assembler.sra_imm(dest, 31, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   891
+                m_assembler.subcc_r(SparcRegisters::g2, SparcRegisters::g3, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   892
+                cond = NotEqual;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   893
+            }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   894
+            return Jump(m_assembler.branch(SparcCondition(cond)));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   895
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   896
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   897
+        Jump branchMul32(Condition cond, Imm32 imm, RegisterID src, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   898
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   899
+            ASSERT((cond == Overflow) || (cond == Signed) || (cond == Zero) || (cond == NonZero));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   900
+            if (m_assembler.isimm13(imm.m_value))
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   901
+                m_assembler.smulcc_imm(src, imm.m_value, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   902
+            else {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   903
+                m_assembler.move_nocheck(imm.m_value, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   904
+                m_assembler.smulcc_r(src, SparcRegisters::g3, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   905
+            }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   906
+            if (cond == Overflow) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   907
+                m_assembler.rdy(SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   908
+                m_assembler.sra_imm(dest, 31, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   909
+                m_assembler.subcc_r(SparcRegisters::g2, SparcRegisters::g3, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   910
+                cond = NotEqual;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   911
+            }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   912
+            return Jump(m_assembler.branch(SparcCondition(cond)));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   913
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   914
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   915
+        Jump branchMul32(Condition cond, Address src, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   916
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   917
+            ASSERT((cond == Overflow) || (cond == Signed) || (cond == Zero) || (cond == NonZero));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   918
+            load32(src, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   919
+            return branchMul32(cond, SparcRegisters::g2, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   920
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   921
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   922
+        Jump branchSub32(Condition cond, RegisterID src, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   923
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   924
+            ASSERT((cond == Overflow) || (cond == Signed) || (cond == Zero) || (cond == NonZero));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   925
+            m_assembler.subcc_r(dest, src, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   926
+            return Jump(m_assembler.branch(SparcCondition(cond)));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   927
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   928
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   929
+        Jump branchSub32(Condition cond, Imm32 imm, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   930
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   931
+            ASSERT((cond == Overflow) || (cond == Signed) || (cond == Zero) || (cond == NonZero));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   932
+            sub32(imm, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   933
+            return Jump(m_assembler.branch(SparcCondition(cond)));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   934
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   935
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   936
+        Jump branchSub32(Condition cond, Address src, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   937
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   938
+            ASSERT((cond == Overflow) || (cond == Signed) || (cond == Zero) || (cond == NonZero));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   939
+            load32(src, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   940
+            return branchSub32(cond, SparcRegisters::g2, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   941
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   942
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   943
+        Jump branchSub32(Condition cond, Imm32 imm, Address dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   944
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   945
+            ASSERT((cond == Overflow) || (cond == Signed) || (cond == Zero) || (cond == NonZero));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   946
+            sub32(imm, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   947
+            return Jump(m_assembler.branch(SparcCondition(cond)));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   948
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   949
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   950
+        Jump branchNeg32(Condition cond, RegisterID srcDest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   951
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   952
+            ASSERT((cond == Overflow) || (cond == Signed) || (cond == Zero) || (cond == NonZero));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   953
+            neg32(srcDest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   954
+            return Jump(m_assembler.branch(SparcCondition(cond)));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   955
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   956
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   957
+        Jump branchOr32(Condition cond, RegisterID src, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   958
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   959
+            ASSERT((cond == Signed) || (cond == Zero) || (cond == NonZero));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   960
+            m_assembler.orcc_r(src, dest, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   961
+            return Jump(m_assembler.branch(SparcCondition(cond)));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   962
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   963
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   964
+        void breakpoint()
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   965
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   966
+            m_assembler.ta_imm(8);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   967
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   968
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   969
+        Call nearCall()
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   970
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   971
+            return Call(m_assembler.call(), Call::LinkableNear);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   972
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   973
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   974
+        Call call(RegisterID target)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   975
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   976
+            m_assembler.jmpl_r(target, SparcRegisters::g0, SparcRegisters::o7);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   977
+            m_assembler.nop();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   978
+            JmpSrc jmpSrc;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   979
+            return Call(jmpSrc, Call::None);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   980
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   981
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   982
+        void call(Address address)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   983
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   984
+            if (m_assembler.isimm13(address.offset)) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   985
+                m_assembler.jmpl_imm(address.base, address.offset, SparcRegisters::o7);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   986
+                m_assembler.nop();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   987
+            } else {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   988
+                m_assembler.move_nocheck(address.offset, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   989
+                m_assembler.jmpl_r(address.base, SparcRegisters::g3, SparcRegisters::o7);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   990
+                m_assembler.nop();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   991
+            }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   992
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   993
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   994
+        void ret()
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   995
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   996
+            m_assembler.jmpl_imm(SparcRegisters::i7, 8, SparcRegisters::g0);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   997
+            m_assembler.nop();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   998
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
   999
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1000
+        void ret_and_restore()
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1001
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1002
+            m_assembler.jmpl_imm(SparcRegisters::i7, 8, SparcRegisters::g0);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1003
+            m_assembler.restore_r(SparcRegisters::g0, SparcRegisters::g0, SparcRegisters::g0);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1004
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1005
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1006
+        void save(Imm32 size)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1007
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1008
+            if (m_assembler.isimm13(size.m_value)) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1009
+                m_assembler.save_imm(SparcRegisters::sp, size.m_value, SparcRegisters::sp);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1010
+            } else {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1011
+                m_assembler.move_nocheck(size.m_value, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1012
+                m_assembler.save_r(SparcRegisters::sp, SparcRegisters::g3, SparcRegisters::sp);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1013
+            }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1014
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1015
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1016
+        void set32(Condition cond, Address left, RegisterID right, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1017
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1018
+            load32(left, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1019
+            set32(cond, SparcRegisters::g2, right, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1020
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1021
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1022
+        void set32(Condition cond, RegisterID left, Address right, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1023
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1024
+            load32(right, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1025
+            set32(cond, left, SparcRegisters::g2, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1026
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1027
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1028
+        void set32(Condition cond, RegisterID left, RegisterID right, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1029
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1030
+            m_assembler.subcc_r(left, right, SparcRegisters::g0);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1031
+            m_assembler.or_imm(SparcRegisters::g0, 0, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1032
+            m_assembler.movcc_imm(1, dest, SparcCondition(cond));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1033
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1034
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1035
+        void set32(Condition cond, RegisterID left, Imm32 right, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1036
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1037
+            if (m_assembler.isimm13(right.m_value))
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1038
+                m_assembler.subcc_imm(left, right.m_value, SparcRegisters::g0);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1039
+            else {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1040
+                m_assembler.move_nocheck(right.m_value, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1041
+                m_assembler.subcc_r(left, SparcRegisters::g3, SparcRegisters::g0);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1042
+            }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1043
+            m_assembler.or_imm(SparcRegisters::g0, 0, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1044
+            m_assembler.movcc_imm(1, dest, SparcCondition(cond));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1045
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1046
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1047
+        void set32(Condition cond, Address left, Imm32 right, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1048
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1049
+            load32(left, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1050
+            set32(cond, SparcRegisters::g2, right, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1051
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1052
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1053
+        void set8(Condition cond, RegisterID left, RegisterID right, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1054
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1055
+            // Sparc does not have byte register.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1056
+            set32(cond, left, right, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1057
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1058
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1059
+        void set8(Condition cond, Address left, RegisterID right, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1060
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1061
+            // Sparc doesn't have byte registers
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1062
+            load32(left, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1063
+            set32(cond, SparcRegisters::g2, right, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1064
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1065
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1066
+        void set8(Condition cond, RegisterID left, Imm32 right, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1067
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1068
+            // Sparc does not have byte register.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1069
+            set32(cond, left, right, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1070
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1071
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1072
+        void setTest32(Condition cond, Address address, Imm32 mask, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1073
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1074
+            load32(address, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1075
+            if (m_assembler.isimm13(mask.m_value))
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1076
+                m_assembler.andcc_imm(SparcRegisters::g2, mask.m_value, SparcRegisters::g0);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1077
+            else {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1078
+                m_assembler.move_nocheck(mask.m_value, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1079
+                m_assembler.andcc_r(SparcRegisters::g3, SparcRegisters::g2, SparcRegisters::g0);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1080
+            }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1081
+            m_assembler.or_imm(SparcRegisters::g0, 0, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1082
+            m_assembler.movcc_imm(1, dest, SparcCondition(cond));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1083
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1084
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1085
+        void setTest8(Condition cond, Address address, Imm32 mask, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1086
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1087
+            // Sparc does not have byte register.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1088
+            setTest32(cond, address, mask, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1089
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1090
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1091
+        void lea(Address address, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1092
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1093
+            if (m_assembler.isimm13(address.offset))
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1094
+                m_assembler.add_imm(address.base, address.offset, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1095
+            else {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1096
+                m_assembler.move_nocheck(address.offset, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1097
+                m_assembler.add_r(address.base, SparcRegisters::g3, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1098
+            }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1099
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1100
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1101
+        void lea(BaseIndex address, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1102
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1103
+            // lea only used by PolyIC.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1104
+            // PolyIC is not enabled for sparc now.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1105
+            ASSERT(0);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1106
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1107
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1108
+        void add32(Imm32 imm, AbsoluteAddress address)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1109
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1110
+            load32(address.m_ptr, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1111
+            add32(imm, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1112
+            store32(SparcRegisters::g2, address.m_ptr);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1113
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1114
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1115
+        void sub32(Imm32 imm, AbsoluteAddress address)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1116
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1117
+            load32(address.m_ptr, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1118
+            sub32(imm, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1119
+            store32(SparcRegisters::g2, address.m_ptr);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1120
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1121
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1122
+        void load32(void* address, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1123
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1124
+            m_assembler.move_nocheck((int)address, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1125
+            m_assembler.lduw_r(SparcRegisters::g3, SparcRegisters::g0, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1126
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1127
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1128
+        Jump branch32(Condition cond, AbsoluteAddress left, RegisterID right)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1129
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1130
+            load32(left.m_ptr, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1131
+            return branch32(cond, SparcRegisters::g2, right);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1132
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1133
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1134
+        Jump branch32(Condition cond, AbsoluteAddress left, Imm32 right)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1135
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1136
+            load32(left.m_ptr, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1137
+            return branch32(cond, SparcRegisters::g2, right);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1138
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1139
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1140
+        Call call()
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1141
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1142
+            m_assembler.rdpc(SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1143
+            m_assembler.add_imm(SparcRegisters::g2, 32, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1144
+            m_assembler.stw_imm(SparcRegisters::g2, SparcRegisters::fp, -8);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1145
+            Call cl = Call(m_assembler.call(), Call::Linkable);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1146
+            m_assembler.lduw_imm(SparcRegisters::fp, -8, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1147
+            m_assembler.jmpl_imm(SparcRegisters::g2, 0, SparcRegisters::g0);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1148
+            m_assembler.nop();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1149
+            return cl;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1150
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1151
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1152
+        Call tailRecursiveCall()
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1153
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1154
+            return Call::fromTailJump(jump());
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1155
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1156
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1157
+        Call makeTailRecursiveCall(Jump oldJump)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1158
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1159
+            return Call::fromTailJump(oldJump);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1160
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1161
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1162
+        DataLabelPtr moveWithPatch(ImmPtr initialValue, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1163
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1164
+            DataLabelPtr dataLabel(this);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1165
+            Imm32 imm = Imm32(initialValue);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1166
+            m_assembler.move_nocheck(imm.m_value, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1167
+            return dataLabel;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1168
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1169
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1170
+        DataLabel32 moveWithPatch(Imm32 initialValue, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1171
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1172
+            DataLabel32 dataLabel(this);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1173
+            m_assembler.move_nocheck(initialValue.m_value, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1174
+            return dataLabel;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1175
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1176
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1177
+        Jump branchPtrWithPatch(Condition cond, RegisterID left, DataLabelPtr& dataLabel, ImmPtr initialRightValue = ImmPtr(0))
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1178
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1179
+            dataLabel = moveWithPatch(initialRightValue, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1180
+            Jump jump = branch32(cond, left, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1181
+            return jump;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1182
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1183
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1184
+        Jump branchPtrWithPatch(Condition cond, Address left, DataLabelPtr& dataLabel, ImmPtr initialRightValue = ImmPtr(0))
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1185
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1186
+            load32(left, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1187
+            dataLabel = moveWithPatch(initialRightValue, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1188
+            Jump jump = branch32(cond, SparcRegisters::g3, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1189
+            return jump;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1190
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1191
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1192
+        DataLabelPtr storePtrWithPatch(ImmPtr initialValue, ImplicitAddress address)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1193
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1194
+            DataLabelPtr dataLabel = moveWithPatch(initialValue, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1195
+            store32(SparcRegisters::g2, address);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1196
+            return dataLabel;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1197
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1198
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1199
+        DataLabelPtr storePtrWithPatch(ImplicitAddress address)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1200
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1201
+            return storePtrWithPatch(ImmPtr(0), address);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1202
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1203
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1204
+        // Floating point operators
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1205
+        bool supportsFloatingPoint() const
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1206
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1207
+            return true;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1208
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1209
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1210
+        bool supportsFloatingPointTruncate() const
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1211
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1212
+            return true;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1213
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1214
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1215
+        bool supportsFloatingPointSqrt() const
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1216
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1217
+            return true;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1218
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1219
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1220
+        void moveDouble(FPRegisterID src, FPRegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1221
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1222
+            m_assembler.fmovd_r(src, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1223
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1224
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1225
+        void loadFloat(BaseIndex address, FPRegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1226
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1227
+            m_assembler.sll_imm(address.index, address.scale, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1228
+            add32(Imm32(address.offset), SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1229
+            m_assembler.ldf_r(address.base, SparcRegisters::g2, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1230
+            m_assembler.fstod_r(dest, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1231
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1232
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1233
+        void loadFloat(ImplicitAddress address, FPRegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1234
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1235
+            if (m_assembler.isimm13(address.offset))
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1236
+                m_assembler.ldf_imm(address.base, address.offset, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1237
+            else {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1238
+                m_assembler.move_nocheck(address.offset, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1239
+                m_assembler.ldf_r(address.base, SparcRegisters::g3, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1240
+            }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1241
+            m_assembler.fstod_r(dest, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1242
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1243
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1244
+        void loadFloat(const void* address, FPRegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1245
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1246
+            m_assembler.move_nocheck((int)address, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1247
+            m_assembler.ldf_r(SparcRegisters::g3, SparcRegisters::g0, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1248
+            m_assembler.fstod_r(dest, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1249
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1250
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1251
+        void loadDouble(BaseIndex address, FPRegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1252
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1253
+            m_assembler.sll_imm(address.index, address.scale, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1254
+            add32(Imm32(address.offset), SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1255
+            m_assembler.ldf_r(address.base, SparcRegisters::g2, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1256
+            m_assembler.add_imm(SparcRegisters::g2, 4, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1257
+            m_assembler.ldf_r(address.base, SparcRegisters::g2, dest + 1);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1258
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1259
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1260
+        void loadDouble(ImplicitAddress address, FPRegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1261
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1262
+            m_assembler.move_nocheck(address.offset, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1263
+            m_assembler.ldf_r(address.base, SparcRegisters::g3, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1264
+            m_assembler.add_imm(SparcRegisters::g3, 4, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1265
+            m_assembler.ldf_r(address.base, SparcRegisters::g3, dest + 1);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1266
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1267
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1268
+        DataLabelPtr loadDouble(const void* address, FPRegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1269
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1270
+            DataLabelPtr dataLabel(this);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1271
+            m_assembler.move_nocheck((int)address, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1272
+            m_assembler.ldf_imm(SparcRegisters::g3, 0, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1273
+            m_assembler.ldf_imm(SparcRegisters::g3, 4, dest + 1);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1274
+            return dataLabel;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1275
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1276
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1277
+        void storeFloat(FPRegisterID src, BaseIndex address)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1278
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1279
+            m_assembler.sll_imm(address.index, address.scale, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1280
+            add32(Imm32(address.offset), SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1281
+            m_assembler.stf_r(src, address.base, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1282
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1283
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1284
+        void storeFloat(FPRegisterID src, ImplicitAddress address)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1285
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1286
+            if (m_assembler.isimm13(address.offset))
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1287
+                m_assembler.stf_imm(src, address.base, address.offset);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1288
+            else {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1289
+                m_assembler.move_nocheck(address.offset, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1290
+                m_assembler.stf_r(src, address.base, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1291
+            }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1292
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1293
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1294
+        void storeFloat(ImmDouble imm, Address address)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1295
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1296
+            union {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1297
+                float f;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1298
+                uint32 u32;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1299
+            } u;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1300
+            u.f = imm.u.d;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1301
+            store32(Imm32(u.u32), address);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1302
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1303
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1304
+        void storeFloat(ImmDouble imm, BaseIndex address)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1305
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1306
+            union {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1307
+                float f;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1308
+                uint32 u32;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1309
+            } u;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1310
+            u.f = imm.u.d;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1311
+            store32(Imm32(u.u32), address);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1312
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1313
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1314
+        void storeDouble(FPRegisterID src, BaseIndex address)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1315
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1316
+            m_assembler.sll_imm(address.index, address.scale, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1317
+            add32(Imm32(address.offset), SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1318
+            m_assembler.stf_r(src, address.base, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1319
+            m_assembler.add_imm(SparcRegisters::g2, 4, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1320
+            m_assembler.stf_r(src + 1, address.base, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1321
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1322
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1323
+        void storeDouble(FPRegisterID src, ImplicitAddress address)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1324
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1325
+            if (m_assembler.isimm13(address.offset + 4)) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1326
+                m_assembler.stf_imm(src, address.base, address.offset);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1327
+                m_assembler.stf_imm(src + 1, address.base, address.offset + 4);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1328
+            } else {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1329
+                m_assembler.move_nocheck(address.offset, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1330
+                m_assembler.stf_r(src, address.base, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1331
+                m_assembler.add_imm(SparcRegisters::g3, 4, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1332
+                m_assembler.stf_r(src + 1, address.base, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1333
+            }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1334
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1335
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1336
+        void storeDouble(ImmDouble imm, Address address)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1337
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1338
+            store32(Imm32(imm.u.s.msb), address);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1339
+            store32(Imm32(imm.u.s.lsb), Address(address.base, address.offset + 4));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1340
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1341
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1342
+        void storeDouble(ImmDouble imm, BaseIndex address)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1343
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1344
+            store32(Imm32(imm.u.s.msb), address);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1345
+            store32(Imm32(imm.u.s.lsb),
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1346
+                    BaseIndex(address.base, address.index, address.scale, address.offset + 4));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1347
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1348
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1349
+        void addDouble(FPRegisterID src, FPRegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1350
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1351
+            m_assembler.faddd_r(src, dest, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1352
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1353
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1354
+        void addDouble(Address src, FPRegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1355
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1356
+            loadDouble(src, SparcRegisters::f30);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1357
+            m_assembler.faddd_r(SparcRegisters::f30, dest, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1358
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1359
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1360
+        void divDouble(FPRegisterID src, FPRegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1361
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1362
+            m_assembler.fdivd_r(dest, src, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1363
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1364
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1365
+        void divDouble(Address src, FPRegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1366
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1367
+            loadDouble(src, SparcRegisters::f30);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1368
+            m_assembler.fdivd_r(dest, SparcRegisters::f30, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1369
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1370
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1371
+        void subDouble(FPRegisterID src, FPRegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1372
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1373
+            m_assembler.fsubd_r(dest, src, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1374
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1375
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1376
+        void subDouble(Address src, FPRegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1377
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1378
+            loadDouble(src, SparcRegisters::f30);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1379
+            m_assembler.fsubd_r(dest, SparcRegisters::f30, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1380
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1381
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1382
+        void mulDouble(FPRegisterID src, FPRegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1383
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1384
+            m_assembler.fmuld_r(src, dest, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1385
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1386
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1387
+        void mulDouble(Address src, FPRegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1388
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1389
+            loadDouble(src, SparcRegisters::f30);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1390
+            m_assembler.fmuld_r(SparcRegisters::f30, dest, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1391
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1392
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1393
+        void sqrtDouble(FPRegisterID src, FPRegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1394
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1395
+            m_assembler.fsqrtd_r(src, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1396
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1397
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1398
+        void negDouble(FPRegisterID src, FPRegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1399
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1400
+            m_assembler.fnegd_r(src, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1401
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1402
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1403
+        void convertUInt32ToDouble(RegisterID src, FPRegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1404
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1405
+            m_assembler.move_nocheck(0x43300000, SparcRegisters::g1);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1406
+            m_assembler.stw_imm(SparcRegisters::g1, SparcRegisters::sp, 0x60);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1407
+            m_assembler.stw_imm(src, SparcRegisters::sp, 0x64);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1408
+            m_assembler.lddf_imm(SparcRegisters::sp, 0x60, SparcRegisters::f30);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1409
+            m_assembler.stw_imm(SparcRegisters::g0, SparcRegisters::sp, 0x64);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1410
+            m_assembler.lddf_imm(SparcRegisters::sp, 0x60, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1411
+            m_assembler.fsubd_r(SparcRegisters::f30, dest, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1412
+            m_assembler.fabss_r(dest, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1413
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1414
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1415
+        void convertInt32ToDouble(RegisterID src, FPRegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1416
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1417
+            m_assembler.stw_imm(src, SparcRegisters::sp, 0x60);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1418
+            m_assembler.ldf_imm(SparcRegisters::sp, 0x60, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1419
+            m_assembler.fitod_r(dest, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1420
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1421
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1422
+        void convertInt32ToDouble(Address address, FPRegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1423
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1424
+            if (m_assembler.isimm13(address.offset))
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1425
+                m_assembler.ldf_imm(address.base, address.offset, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1426
+            else {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1427
+                m_assembler.move_nocheck(address.offset, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1428
+                m_assembler.ldf_r(address.base, SparcRegisters::g3, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1429
+            }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1430
+            m_assembler.fitod_r(dest, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1431
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1432
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1433
+        void convertInt32ToDouble(AbsoluteAddress src, FPRegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1434
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1435
+            m_assembler.move_nocheck((int)src.m_ptr, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1436
+            m_assembler.ldf_r(SparcRegisters::g3, SparcRegisters::g0, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1437
+            m_assembler.fitod_r(dest, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1438
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1439
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1440
+        void fastLoadDouble(RegisterID lo, RegisterID hi, FPRegisterID fpReg)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1441
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1442
+            m_assembler.stw_imm(lo, SparcRegisters::sp, 0x64);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1443
+            m_assembler.stw_imm(hi, SparcRegisters::sp, 0x60);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1444
+            m_assembler.lddf_imm(SparcRegisters::sp, 0x60, fpReg);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1445
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1446
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1447
+        void convertDoubleToFloat(FPRegisterID src, FPRegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1448
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1449
+            m_assembler.fdtos_r(src, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1450
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1451
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1452
+        void breakDoubleTo32(FPRegisterID srcDest, RegisterID typeReg, RegisterID dataReg) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1453
+            m_assembler.stdf_imm(srcDest, SparcRegisters::sp, 0x60);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1454
+            m_assembler.lduw_imm(SparcRegisters::sp, 0x60, typeReg);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1455
+            m_assembler.lduw_imm(SparcRegisters::sp, 0x64, dataReg);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1456
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1457
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1458
+        Jump branchDouble(DoubleCondition cond, FPRegisterID left, FPRegisterID right)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1459
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1460
+            m_assembler.fcmpd_r(left, right);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1461
+            return Jump(m_assembler.fbranch(SparcDoubleCondition(cond)));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1462
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1463
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1464
+        // Truncates 'src' to an integer, and places the resulting 'dest'.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1465
+        // If the result is not representable as a 32 bit value, branch.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1466
+        // May also branch for some values that are representable in 32 bits
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1467
+        // (specifically, in this case, INT_MIN).
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1468
+        Jump branchTruncateDoubleToInt32(FPRegisterID src, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1469
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1470
+            m_assembler.fdtoi_r(src, SparcRegisters::f30);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1471
+            m_assembler.stf_imm(SparcRegisters::f30, SparcRegisters::sp, 0x60);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1472
+            m_assembler.lduw_imm(SparcRegisters::sp, 0x60, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1473
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1474
+            m_assembler.or_r(SparcRegisters::g0, SparcRegisters::g0, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1475
+            m_assembler.move_nocheck(0x80000000, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1476
+            m_assembler.subcc_r(SparcRegisters::g3, dest, SparcRegisters::g0);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1477
+            m_assembler.movcc_imm(1, SparcRegisters::g2, SparcCondition(Equal));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1478
+            m_assembler.move_nocheck(0x7fffffff, SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1479
+            m_assembler.subcc_r(SparcRegisters::g3, dest, SparcRegisters::g0);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1480
+            m_assembler.movcc_imm(1, SparcRegisters::g2, SparcCondition(Equal));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1481
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1482
+            return branch32(Equal, SparcRegisters::g2, Imm32(1));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1483
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1484
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1485
+        // Convert 'src' to an integer, and places the resulting 'dest'.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1486
+        // If the result is not representable as a 32 bit value, branch.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1487
+        // May also branch for some values that are representable in 32 bits
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1488
+        // (specifically, in this case, 0).
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1489
+        void branchConvertDoubleToInt32(FPRegisterID src, RegisterID dest, JumpList& failureCases, FPRegisterID fpTemp)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1490
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1491
+            m_assembler.fdtoi_r(src, SparcRegisters::f30);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1492
+            m_assembler.stf_imm(SparcRegisters::f30, SparcRegisters::sp, 0x60);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1493
+            m_assembler.lduw_imm(SparcRegisters::sp, 0x60, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1494
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1495
+            // Convert the integer result back to float & compare to the original value - if not equal or unordered (NaN) then jump.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1496
+            m_assembler.fitod_r(SparcRegisters::f30, SparcRegisters::f30);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1497
+            failureCases.append(branchDouble(DoubleNotEqualOrUnordered, src, SparcRegisters::f30));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1498
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1499
+            // If the result is zero, it might have been -0.0, and 0.0 equals to -0.0
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1500
+            failureCases.append(branchTest32(Zero, dest));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1501
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1502
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1503
+        void zeroDouble(FPRegisterID srcDest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1504
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1505
+            m_assembler.fsubd_r(srcDest, srcDest, srcDest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1506
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1507
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1508
+    protected:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1509
+        SparcAssembler::Condition SparcCondition(Condition cond)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1510
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1511
+            return static_cast<SparcAssembler::Condition>(cond);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1512
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1513
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1514
+        SparcAssembler::DoubleCondition SparcDoubleCondition(DoubleCondition cond)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1515
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1516
+            return static_cast<SparcAssembler::DoubleCondition>(cond);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1517
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1518
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1519
+    private:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1520
+        friend class LinkBuffer;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1521
+        friend class RepatchBuffer;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1522
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1523
+        static void linkCall(void* code, Call call, FunctionPtr function)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1524
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1525
+            SparcAssembler::linkCall(code, call.m_jmp, function.value());
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1526
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1527
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1528
+        static void repatchCall(CodeLocationCall call, CodeLocationLabel destination)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1529
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1530
+            SparcAssembler::relinkCall(call.dataLocation(), destination.executableAddress());
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1531
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1532
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1533
+        static void repatchCall(CodeLocationCall call, FunctionPtr destination)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1534
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1535
+            SparcAssembler::relinkCall(call.dataLocation(), destination.executableAddress());
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1536
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1537
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1538
+    };
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1539
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1540
+}
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1541
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1542
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1543
+#endif // ENABLE(ASSEMBLER) && CPU(SPARC)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1544
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1545
+#endif // MacroAssemblerSparc_h
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1546
diff --git a/js/src/assembler/assembler/SparcAssembler.h b/js/src/assembler/assembler/SparcAssembler.h
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1547
new file mode 100644
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1548
index 0000000..72f03fa
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1549
--- /dev/null
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1550
+++ b/js/src/assembler/assembler/SparcAssembler.h
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1551
@@ -0,0 +1,1289 @@
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1552
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1553
+ * vim: set ts=4 sw=4 et tw=99:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1554
+ *
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1555
+ * ***** BEGIN LICENSE BLOCK *****
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1556
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1557
+ *
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1558
+ * The contents of this file are subject to the Mozilla Public License Version
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1559
+ * 1.1 (the "License"); you may not use this file except in compliance with
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1560
+ * the License. You may obtain a copy of the License at
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1561
+ * http://www.mozilla.org/MPL/
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1562
+ *
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1563
+ * Software distributed under the License is distributed on an "AS IS" basis,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1564
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1565
+ * for the specific language governing rights and limitations under the
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1566
+ * License.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1567
+ *
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1568
+ * The Original Code is Mozilla SpiderMonkey JavaScript 1.9 code, released
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1569
+ * May 28, 2008.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1570
+ *
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1571
+ * The Initial Developer of the Original Code is
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1572
+ * Leon Sha <[email protected]>
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1573
+ * 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1574
+ * Portions created by the Initial Developer are Copyright (C) 2010-2011
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1575
+ * the Initial Developer. All Rights Reserved.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1576
+ *
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1577
+ * Contributor(s):
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1578
+ *
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1579
+ * Alternatively, the contents of this file may be used under the terms of
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1580
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1581
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1582
+ * in which case the provisions of the GPL or the LGPL are applicable instead
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1583
+ * of those above. If you wish to allow use of your version of this file only
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1584
+ * under the terms of either the GPL or the LGPL, and not to allow others to
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1585
+ * use your version of this file under the terms of the MPL, indicate your
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1586
+ * decision by deleting the provisions above and replace them with the notice
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1587
+ * and other provisions required by the GPL or the LGPL. If you do not delete
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1588
+ * the provisions above, a recipient may use your version of this file under
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1589
+ * the terms of any one of the MPL, the GPL or the LGPL.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1590
+ *
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1591
+ * ***** END LICENSE BLOCK ***** */
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1592
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1593
+#ifndef SparcAssembler_h
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1594
+#define SparcAssembler_h
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1595
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1596
+#include <wtf/Platform.h>
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1597
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1598
+// Some debug code uses s(n)printf for instruction logging.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1599
+#include <stdio.h>
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1600
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1601
+#if ENABLE_ASSEMBLER && WTF_CPU_SPARC
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1602
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1603
+#include "AssemblerBufferWithConstantPool.h"
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1604
+#include <wtf/Assertions.h>
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1605
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1606
+#include "methodjit/Logging.h"
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1607
+#define IPFX  "        %s"
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1608
+#define ISPFX "        "
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1609
+#ifdef JS_METHODJIT_SPEW
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1610
+# define MAYBE_PAD (isOOLPath ? ">  " : "")
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1611
+# define PRETTY_PRINT_OFFSET(os) (((os)<0)?"-":""), (((os)<0)?-(os):(os))
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1612
+# define FIXME_INSN_PRINTING                                \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1613
+    do {                                                    \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1614
+        js::JaegerSpew(js::JSpew_Insns,                     \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1615
+                       ISPFX "FIXME insn printing %s:%d\n", \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1616
+                       __FILE__, __LINE__);                 \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1617
+    } while (0)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1618
+#else
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1619
+# define MAYBE_PAD ""
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1620
+# define FIXME_INSN_PRINTING ((void) 0)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1621
+# define PRETTY_PRINT_OFFSET(os) "", 0
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1622
+#endif
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1623
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1624
+namespace JSC {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1625
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1626
+    typedef uint32_t SparcWord;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1627
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1628
+    namespace SparcRegisters {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1629
+        typedef enum {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1630
+            g0 = 0, // g0 is always 0
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1631
+            g1 = 1, // g1 is a scratch register for v8
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1632
+            g2 = 2,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1633
+            g3 = 3,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1634
+            g4 = 4,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1635
+            g5 = 5, // Reserved for system
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1636
+            g6 = 6, // Reserved for system
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1637
+            g7 = 7, // Reserved for system
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1638
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1639
+            o0 = 8,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1640
+            o1 = 9,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1641
+            o2 = 10,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1642
+            o3 = 11,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1643
+            o4 = 12,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1644
+            o5 = 13,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1645
+            o6 = 14, // SP
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1646
+            o7 = 15,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1647
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1648
+            l0 = 16,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1649
+            l1 = 17,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1650
+            l2 = 18,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1651
+            l3 = 19,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1652
+            l4 = 20,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1653
+            l5 = 21,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1654
+            l6 = 22,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1655
+            l7 = 23,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1656
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1657
+            i0 = 24,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1658
+            i1 = 25,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1659
+            i2 = 26,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1660
+            i3 = 27,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1661
+            i4 = 28,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1662
+            i5 = 29,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1663
+            i6 = 30, // FP
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1664
+            i7 = 31,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1665
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1666
+            sp = o6,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1667
+            fp = i6
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1668
+        } RegisterID;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1669
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1670
+        typedef enum {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1671
+            f0 = 0,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1672
+            f1 = 1,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1673
+            f2 = 2,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1674
+            f3 = 3,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1675
+            f4 = 4,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1676
+            f5 = 5,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1677
+            f6 = 6,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1678
+            f7 = 7,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1679
+            f8 = 8,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1680
+            f9 = 9,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1681
+            f10 = 10,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1682
+            f11 = 11,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1683
+            f12 = 12,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1684
+            f13 = 13,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1685
+            f14 = 14,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1686
+            f15 = 15,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1687
+            f16 = 16,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1688
+            f17 = 17,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1689
+            f18 = 18,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1690
+            f19 = 19,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1691
+            f20 = 20,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1692
+            f21 = 21,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1693
+            f22 = 22,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1694
+            f23 = 23,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1695
+            f24 = 24,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1696
+            f25 = 25,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1697
+            f26 = 26,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1698
+            f27 = 27,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1699
+            f28 = 28,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1700
+            f29 = 29,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1701
+            f30 = 30,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1702
+            f31 = 31
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1703
+        } FPRegisterID;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1704
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1705
+    } // namespace SparcRegisters
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1706
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1707
+    class SparcAssembler {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1708
+    public:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1709
+        typedef SparcRegisters::RegisterID RegisterID;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1710
+        typedef SparcRegisters::FPRegisterID FPRegisterID;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1711
+        AssemblerBuffer m_buffer;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1712
+        bool oom() const { return m_buffer.oom(); }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1713
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1714
+#ifdef JS_METHODJIT_SPEW
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1715
+        bool isOOLPath;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1716
+        SparcAssembler() : isOOLPath(false) { }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1717
+#else
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1718
+        SparcAssembler() { }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1719
+#endif
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1720
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1721
+        // Sparc conditional constants
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1722
+        typedef enum {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1723
+            ConditionE   = 0x1, // Zero
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1724
+            ConditionLE  = 0x2,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1725
+            ConditionL   = 0x3,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1726
+            ConditionLEU = 0x4,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1727
+            ConditionCS  = 0x5,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1728
+            ConditionNEG = 0x6,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1729
+            ConditionVS  = 0x7,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1730
+            ConditionA   = 0x8, // branch_always
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1731
+            ConditionNE  = 0x9, // Non-zero
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1732
+            ConditionG   = 0xa,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1733
+            ConditionGE  = 0xb,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1734
+            ConditionGU  = 0xc,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1735
+            ConditionCC  = 0xd,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1736
+            ConditionVC  = 0xf
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1737
+        } Condition;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1738
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1739
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1740
+        typedef enum {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1741
+            DoubleConditionNE  = 0x1,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1742
+            DoubleConditionUL  = 0x3,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1743
+            DoubleConditionL   = 0x4,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1744
+            DoubleConditionUG  = 0x5,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1745
+            DoubleConditionG   = 0x6,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1746
+            DoubleConditionE   = 0x9,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1747
+            DoubleConditionUE  = 0xa,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1748
+            DoubleConditionGE  = 0xb,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1749
+            DoubleConditionUGE = 0xc,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1750
+            DoubleConditionLE  = 0xd,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1751
+            DoubleConditionULE = 0xe
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1752
+        } DoubleCondition;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1753
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1754
+        typedef enum {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1755
+            BranchOnCondition,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1756
+            BranchOnDoubleCondition
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1757
+        } BranchType;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1758
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1759
+        class JmpSrc {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1760
+            friend class SparcAssembler;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1761
+        public:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1762
+            JmpSrc()
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1763
+                : m_offset(-1)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1764
+            {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1765
+            }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1766
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1767
+        private:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1768
+            JmpSrc(int offset)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1769
+                : m_offset(offset)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1770
+            {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1771
+            }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1772
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1773
+            int m_offset;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1774
+        };
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1775
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1776
+        class JmpDst {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1777
+            friend class SparcAssembler;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1778
+        public:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1779
+            JmpDst()
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1780
+                : m_offset(-1)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1781
+                , m_used(false)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1782
+            {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1783
+            }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1784
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1785
+            bool isUsed() const { return m_used; }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1786
+            void used() { m_used = true; }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1787
+            bool isValid() const { return m_offset != -1; }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1788
+        private:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1789
+            JmpDst(int offset)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1790
+                : m_offset(offset)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1791
+                , m_used(false)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1792
+            {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1793
+                ASSERT(m_offset == offset);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1794
+            }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1795
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1796
+            int m_used : 1;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1797
+            signed int m_offset : 31;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1798
+        };
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1799
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1800
+        // Instruction formating
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1801
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1802
+        void format_2_1(int rd, int op2, int imm22)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1803
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1804
+            m_buffer.putInt(rd << 25 | op2 << 22 | (imm22 & 0x3FFFFF));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1805
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1806
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1807
+        void format_2_2(int a, int cond, int op2, int disp22)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1808
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1809
+            format_2_1((a & 0x1) << 4 | (cond & 0xF), op2, disp22);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1810
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1811
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1812
+        void format_2_3(int a, int cond, int op2, int cc1, int cc0, int p, int disp19)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1813
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1814
+            format_2_2(a, cond, op2, (cc1 & 0x1) << 21 | (cc0 & 0x1) << 20 | (p & 0x1) << 19 | (disp19 & 0x7FFFF));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1815
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1816
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1817
+        void format_2_4(int a, int rcond, int op2, int d16hi, int p, int rs1, int d16lo)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1818
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1819
+            format_2_2(a, (rcond & 0x7), op2, (d16hi & 0x3) << 20 | (p & 0x1) << 19 | rs1 << 14 | (d16lo & 0x3FFF));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1820
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1821
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1822
+        void format_3(int op1, int rd, int op3, int bits19)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1823
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1824
+            m_buffer.putInt(op1 << 30 | rd << 25 | op3 << 19 | (bits19 & 0x7FFFF));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1825
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1826
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1827
+        void format_3_1(int op1, int rd, int op3, int rs1, int bit8, int rs2)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1828
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1829
+            format_3(op1, rd, op3, rs1 << 14 | (bit8 & 0xFF) << 5 | rs2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1830
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1831
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1832
+        void format_3_1_imm(int op1, int rd, int op3, int rs1, int simm13)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1833
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1834
+            format_3(op1, rd, op3, rs1 << 14 | 1 << 13 | (simm13 & 0x1FFF));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1835
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1836
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1837
+        void format_3_2(int op1, int rd, int op3, int rs1, int rcond, int rs2)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1838
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1839
+            format_3(op1, rd, op3, rs1 << 14 | (rcond & 0x3) << 10 | rs2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1840
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1841
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1842
+        void format_3_2_imm(int op1, int rd, int op3, int rs1, int rcond, int simm10)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1843
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1844
+            format_3(op1, rd, op3, rs1 << 14 | 1 << 13 | (rcond & 0x3) << 10 | (simm10 & 0x1FFF));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1845
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1846
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1847
+        void format_3_3(int op1, int rd, int op3, int rs1, int cmask, int mmask)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1848
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1849
+            format_3(op1, rd, op3, rs1 << 14 | 1 << 13 | (cmask & 0x7) << 5 | (mmask & 0xF));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1850
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1851
+        void format_3_4(int op1, int rd, int op3, int bits19)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1852
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1853
+            format_3(op1, rd, op3, bits19);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1854
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1855
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1856
+        void format_3_5(int op1, int rd, int op3, int rs1, int x, int rs2)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1857
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1858
+            format_3(op1, rd, op3, rs1 << 14 | (x & 0x1) << 12 | rs2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1859
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1860
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1861
+        void format_3_6(int op1, int rd, int op3, int rs1, int shcnt32)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1862
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1863
+            format_3(op1, rd, op3, rs1 << 14 | 1 << 13 | (shcnt32 & 0x1F));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1864
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1865
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1866
+        void format_3_7(int op1, int rd, int op3, int rs1, int shcnt64)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1867
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1868
+            format_3(op1, rd, op3, rs1 << 14 | 1 << 13 | 1 << 12 | (shcnt64 & 0x3F));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1869
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1870
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1871
+        void format_3_8(int op1, int rd, int op3, int rs1, int bits9, int rs2)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1872
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1873
+            format_3(op1, rd, op3, rs1 << 14 | (bits9 & 0x1FF) << 5 | rs2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1874
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1875
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1876
+        void format_3_9(int op1, int cc1, int cc0, int op3, int rs1, int bits9, int rs2)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1877
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1878
+            format_3(op1, (cc1 & 0x1) << 1 | (cc0 & 0x1), op3, rs1 << 14 | (bits9 & 0x1FF) << 5 | rs2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1879
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1880
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1881
+        void format_4_1(int rd, int op3, int rs1, int cc1, int cc0, int rs2)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1882
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1883
+            format_3(2, rd, op3, rs1 << 14 | (cc1 & 0x1) << 12 | (cc0 & 0x1) << 11 | rs2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1884
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1885
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1886
+        void format_4_1_imm(int rd, int op3, int rs1, int cc1, int cc0, int simm11)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1887
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1888
+            format_3(2, rd, op3, rs1 << 14 | (cc1 & 0x1) << 12 | 1 << 13 |(cc0 & 0x1) << 11 | (simm11 & 0x7FF));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1889
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1890
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1891
+        void format_4_2(int rd, int op3, int cc2, int cond, int cc1, int cc0, int rs2)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1892
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1893
+            format_3(2, rd, op3, (cc2 & 0x1) << 18 | (cond & 0xF) << 14 | (cc1 & 0x1) << 12 | (cc0 & 0x1) << 11 | rs2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1894
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1895
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1896
+        void format_4_2_imm(int rd, int op3, int cc2, int cond, int cc1, int cc0, int simm11)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1897
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1898
+            format_3(2, rd, op3, (cc2 & 0x1) << 18 | (cond & 0xF) << 14 | 1 << 13 | (cc1 & 0x1) << 12 | (cc0 & 0x1) << 11 | (simm11 & 0x7FF));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1899
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1900
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1901
+        void format_4_3(int rd, int op3, int rs1, int cc1, int cc0, int swap_trap)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1902
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1903
+            format_3(2, rd, op3, rs1 << 14 | 1 << 13 | (cc1 & 0x1) << 12 | (cc0 & 0x1) << 11 | (swap_trap & 0x7F));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1904
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1905
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1906
+        void format_4_4(int rd, int op3, int rs1, int rcond, int opf_low, int rs2)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1907
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1908
+            format_3(2, rd, op3, rs1 << 14 | (rcond & 0x7) << 10 | (opf_low & 0x1F) << 5 | rs2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1909
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1910
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1911
+        void format_4_5(int rd, int op3, int cond, int opf_cc, int opf_low, int rs2)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1912
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1913
+            format_3(2, rd, op3, (cond & 0xF) << 14 | (opf_cc & 0x7) << 11 | (opf_low & 0x3F) << 5 | rs2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1914
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1915
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1916
+        void addcc_r(int rs1, int rs2, int rd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1917
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1918
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1919
+                           IPFX "addcc       %s, %s, %s\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1920
+                           nameGpReg(rs1), nameGpReg(rs2), nameGpReg(rd));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1921
+            format_3_1(2, rd, 0x10, rs1, 0, rs2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1922
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1923
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1924
+        void addcc_imm(int rs1, int simm13, int rd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1925
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1926
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1927
+                           IPFX "addcc       %s, %d, %s\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1928
+                           nameGpReg(rs1), simm13, nameGpReg(rd));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1929
+            format_3_1_imm(2, rd, 0x10, rs1, simm13);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1930
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1931
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1932
+        void add_r(int rs1, int rs2, int rd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1933
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1934
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1935
+                           IPFX "add         %s, %s, %s\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1936
+                           nameGpReg(rs1), nameGpReg(rs2), nameGpReg(rd));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1937
+            format_3_1(2, rd, 0, rs1, 0, rs2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1938
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1939
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1940
+        void add_imm(int rs1, int simm13, int rd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1941
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1942
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1943
+                           IPFX "add         %s, %d, %s\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1944
+                           nameGpReg(rs1), simm13, nameGpReg(rd));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1945
+            format_3_1_imm(2, rd, 0, rs1, simm13);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1946
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1947
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1948
+        void andcc_r(int rs1, int rs2, int rd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1949
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1950
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1951
+                           IPFX "andcc       %s, %s, %s\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1952
+                           nameGpReg(rs1), nameGpReg(rs2), nameGpReg(rd));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1953
+            format_3_1(2, rd, 0x11, rs1, 0, rs2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1954
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1955
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1956
+        void andcc_imm(int rs1, int simm13, int rd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1957
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1958
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1959
+                           IPFX "andcc       %s, %d, %s\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1960
+                           nameGpReg(rs1), simm13, nameGpReg(rd));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1961
+            format_3_1_imm(2, rd, 0x11, rs1, simm13);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1962
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1963
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1964
+        void or_r(int rs1, int rs2, int rd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1965
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1966
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1967
+                           IPFX "or          %s, %s, %s\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1968
+                           nameGpReg(rs1), nameGpReg(rs2), nameGpReg(rd));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1969
+            format_3_1(2, rd, 0x2, rs1, 0, rs2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1970
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1971
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1972
+        void or_imm(int rs1, int simm13, int rd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1973
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1974
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1975
+                           IPFX "or          %s, %d, %s\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1976
+                           nameGpReg(rs1), simm13, nameGpReg(rd));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1977
+            format_3_1_imm(2, rd, 0x2, rs1, simm13);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1978
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1979
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1980
+        // sethi %hi(imm22) rd
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1981
+        void sethi(int imm22, int rd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1982
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1983
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1984
+                           IPFX "sethi       %%hi(0x%x), %s\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1985
+                           imm22, nameGpReg(rd));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1986
+            format_2_1(rd, 0x4, (imm22 >> 10));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1987
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1988
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1989
+        void sll_r(int rs1, int rs2, int rd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1990
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1991
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1992
+                           IPFX "sll         %s, %s, %s\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1993
+                           nameGpReg(rs1), nameGpReg(rs2), nameGpReg(rd));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1994
+            format_3_5(2, rd, 0x25, rs1, 0, rs2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1995
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1996
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1997
+        void sll_imm(int rs1, int shcnt32, int rd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1998
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  1999
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2000
+                           IPFX "sll         %s, %d, %s\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2001
+                           nameGpReg(rs1), shcnt32, nameGpReg(rd));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2002
+            format_3_6(2, rd, 0x25, rs1, shcnt32);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2003
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2004
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2005
+        void sra_r(int rs1, int rs2, int rd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2006
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2007
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2008
+                           IPFX "sra         %s, %s, %s\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2009
+                           nameGpReg(rs1), nameGpReg(rs2), nameGpReg(rd));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2010
+            format_3_5(2, rd, 0x27, rs1, 0, rs2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2011
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2012
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2013
+        void sra_imm(int rs1, int shcnt32, int rd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2014
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2015
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2016
+                           IPFX "sra         %s, %d, %s\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2017
+                           nameGpReg(rs1), shcnt32, nameGpReg(rd));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2018
+            format_3_6(2, rd, 0x27, rs1, shcnt32);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2019
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2020
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2021
+        void srl_r(int rs1, int rs2, int rd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2022
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2023
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2024
+                           IPFX "srl         %s, %s, %s\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2025
+                           nameGpReg(rs1), nameGpReg(rs2), nameGpReg(rd));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2026
+            format_3_5(2, rd, 0x26, rs1, 0, rs2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2027
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2028
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2029
+        void srl_imm(int rs1, int shcnt32, int rd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2030
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2031
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2032
+                           IPFX "srl         %s, %d, %s\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2033
+                           nameGpReg(rs1), shcnt32, nameGpReg(rd));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2034
+            format_3_6(2, rd, 0x26, rs1, shcnt32);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2035
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2036
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2037
+        void subcc_r(int rs1, int rs2, int rd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2038
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2039
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2040
+                           IPFX "subcc       %s, %s, %s\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2041
+                           nameGpReg(rs1), nameGpReg(rs2), nameGpReg(rd));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2042
+            format_3_1(2, rd, 0x14, rs1, 0, rs2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2043
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2044
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2045
+        void subcc_imm(int rs1, int simm13, int rd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2046
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2047
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2048
+                           IPFX "subcc       %s, %d, %s\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2049
+                           nameGpReg(rs1), simm13, nameGpReg(rd));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2050
+            format_3_1_imm(2, rd, 0x14, rs1, simm13);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2051
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2052
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2053
+        void orcc_r(int rs1, int rs2, int rd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2054
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2055
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2056
+                           IPFX "orcc        %s, %s, %s\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2057
+                           nameGpReg(rs1), nameGpReg(rs2), nameGpReg(rd));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2058
+            format_3_1(2, rd, 0x12, rs1, 0, rs2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2059
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2060
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2061
+        void orcc_imm(int rs1, int simm13, int rd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2062
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2063
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2064
+                           IPFX "orcc        %s, %d, %s\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2065
+                           nameGpReg(rs1), simm13, nameGpReg(rd));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2066
+            format_3_1_imm(2, rd, 0x12, rs1, simm13);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2067
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2068
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2069
+        void xorcc_r(int rs1, int rs2, int rd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2070
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2071
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2072
+                           IPFX "xorcc       %s, %s, %s\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2073
+                           nameGpReg(rs1), nameGpReg(rs2), nameGpReg(rd));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2074
+            format_3_1(2, rd, 0x13, rs1, 0, rs2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2075
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2076
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2077
+        void xorcc_imm(int rs1, int simm13, int rd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2078
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2079
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2080
+                           IPFX "xorcc       %s, %d, %s\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2081
+                           nameGpReg(rs1), simm13, nameGpReg(rd));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2082
+            format_3_1_imm(2, rd, 0x13, rs1, simm13);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2083
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2084
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2085
+        void xnorcc_r(int rs1, int rs2, int rd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2086
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2087
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2088
+                           IPFX "xnorcc      %s, %s, %s\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2089
+                           nameGpReg(rs1), nameGpReg(rs2), nameGpReg(rd));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2090
+            format_3_1(2, rd, 0x17, rs1, 0, rs2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2091
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2092
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2093
+        void xnorcc_imm(int rs1, int simm13, int rd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2094
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2095
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2096
+                           IPFX "xnorcc      %s, %d, %s\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2097
+                           nameGpReg(rs1), simm13, nameGpReg(rd));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2098
+            format_3_1_imm(2, rd, 0x17, rs1, simm13);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2099
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2100
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2101
+        void smulcc_r(int rs1, int rs2, int rd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2102
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2103
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2104
+                           IPFX "smulcc      %s, %s, %s\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2105
+                           nameGpReg(rs1), nameGpReg(rs2), nameGpReg(rd));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2106
+            format_3_1(2, rd, 0x1b, rs1, 0, rs2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2107
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2108
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2109
+        void smulcc_imm(int rs1, int simm13, int rd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2110
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2111
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2112
+                           IPFX "smulcc      %s, %d, %s\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2113
+                           nameGpReg(rs1), simm13, nameGpReg(rd));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2114
+            format_3_1_imm(2, rd, 0x1b, rs1, simm13);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2115
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2116
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2117
+        void ldsb_r(int rs1, int rs2, int rd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2118
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2119
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2120
+                           IPFX "ldsb        [%s + %s], %s\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2121
+                           nameGpReg(rs1), nameGpReg(rs2), nameGpReg(rd));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2122
+            format_3_1(3, rd, 0x9, rs1, 0, rs2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2123
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2124
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2125
+        void ldsb_imm(int rs1, int simm13, int rd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2126
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2127
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2128
+                           IPFX "ldsb        [%s + %d], %s\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2129
+                           nameGpReg(rs1), simm13, nameGpReg(rd));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2130
+            format_3_1_imm(3, rd, 0x9, rs1, simm13);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2131
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2132
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2133
+        void ldub_r(int rs1, int rs2, int rd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2134
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2135
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2136
+                           IPFX "ldub        [%s + %s], %s\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2137
+                           nameGpReg(rs1), nameGpReg(rs2), nameGpReg(rd));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2138
+            format_3_1(3, rd, 0x1, rs1, 0, rs2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2139
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2140
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2141
+        void ldub_imm(int rs1, int simm13, int rd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2142
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2143
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2144
+                           IPFX "ldub        [%s + %d], %s\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2145
+                           nameGpReg(rs1), simm13, nameGpReg(rd));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2146
+            format_3_1_imm(3, rd, 0x1, rs1, simm13);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2147
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2148
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2149
+        void lduw_r(int rs1, int rs2, int rd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2150
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2151
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2152
+                           IPFX "lduw        [%s + %s], %s\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2153
+                           nameGpReg(rs1), nameGpReg(rs2), nameGpReg(rd));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2154
+            format_3_1(3, rd, 0x0, rs1, 0, rs2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2155
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2156
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2157
+        void lduwa_r(int rs1, int rs2, int rd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2158
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2159
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2160
+                           IPFX "lduwa       [%s + %s], %s\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2161
+                           nameGpReg(rs1), nameGpReg(rs2), nameGpReg(rd));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2162
+            format_3_1(3, rd, 0x10, rs1, 0x82, rs2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2163
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2164
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2165
+        void lduw_imm(int rs1, int simm13, int rd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2166
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2167
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2168
+                           IPFX "lduw        [%s + %d], %s\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2169
+                           nameGpReg(rs1), simm13, nameGpReg(rd));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2170
+            format_3_1_imm(3, rd, 0x0, rs1, simm13);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2171
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2172
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2173
+        void ldsh_r(int rs1, int rs2, int rd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2174
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2175
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2176
+                           IPFX "ldsh        [%s + %s], %s\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2177
+                           nameGpReg(rs1), nameGpReg(rs2), nameGpReg(rd));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2178
+            format_3_1(3, rd, 0xa, rs1, 0, rs2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2179
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2180
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2181
+        void ldsh_imm(int rs1, int simm13, int rd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2182
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2183
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2184
+                           IPFX "ldsh        [%s + %d], %s\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2185
+                           nameGpReg(rs1), simm13, nameGpReg(rd));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2186
+            format_3_1_imm(3, rd, 0xa, rs1, simm13);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2187
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2188
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2189
+        void lduh_r(int rs1, int rs2, int rd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2190
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2191
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2192
+                           IPFX "lduh        [%s + %s], %s\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2193
+                           nameGpReg(rs1), nameGpReg(rs2), nameGpReg(rd));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2194
+            format_3_1(3, rd, 0x2, rs1, 0, rs2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2195
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2196
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2197
+        void lduh_imm(int rs1, int simm13, int rd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2198
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2199
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2200
+                           IPFX "lduh        [%s + %d], %s\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2201
+                           nameGpReg(rs1), simm13, nameGpReg(rd));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2202
+            format_3_1_imm(3, rd, 0x2, rs1, simm13);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2203
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2204
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2205
+        void stb_r(int rd, int rs2, int rs1)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2206
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2207
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2208
+                           IPFX "stb         %s, [%s + %s]\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2209
+                           nameGpReg(rd), nameGpReg(rs1), nameGpReg(rs2));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2210
+            format_3_1(3, rd, 0x5, rs1, 0, rs2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2211
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2212
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2213
+        void stb_imm(int rd, int rs1, int simm13)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2214
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2215
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2216
+                           IPFX "stb         %s, [%s + %d]\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2217
+                           nameGpReg(rd), nameGpReg(rs1), simm13);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2218
+            format_3_1_imm(3, rd, 0x5, rs1, simm13);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2219
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2220
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2221
+        void sth_r(int rd, int rs2, int rs1)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2222
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2223
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2224
+                           IPFX "sth         %s, [%s + %s]\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2225
+                           nameGpReg(rd), nameGpReg(rs1), nameGpReg(rs2));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2226
+            format_3_1(3, rd, 0x6, rs1, 0, rs2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2227
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2228
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2229
+        void sth_imm(int rd, int rs1, int simm13)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2230
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2231
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2232
+                           IPFX "sth         %s, [%s + %d]\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2233
+                           nameGpReg(rd), nameGpReg(rs1), simm13);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2234
+            format_3_1_imm(3, rd, 0x6, rs1, simm13);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2235
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2236
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2237
+        void stw_r(int rd, int rs2, int rs1)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2238
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2239
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2240
+                           IPFX "stw         %s, [%s + %s]\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2241
+                           nameGpReg(rd), nameGpReg(rs1), nameGpReg(rs2));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2242
+            format_3_1(3, rd, 0x4, rs1, 0, rs2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2243
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2244
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2245
+        void stw_imm(int rd, int rs1, int simm13)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2246
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2247
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2248
+                           IPFX "stw         %s, [%s + %d]\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2249
+                           nameGpReg(rd), nameGpReg(rs1), simm13);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2250
+            format_3_1_imm(3, rd, 0x4, rs1, simm13);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2251
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2252
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2253
+        void ldf_r(int rs1, int rs2, int rd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2254
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2255
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2256
+                           IPFX "ld          [%s + %s], %s\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2257
+                           nameGpReg(rs1), nameGpReg(rs2), nameFpReg(rd));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2258
+            format_3_1(3, rd, 0x20, rs1, 0, rs2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2259
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2260
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2261
+        void ldf_imm(int rs1, int simm13, int rd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2262
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2263
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2264
+                           IPFX "ld          [%s + %d], %s\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2265
+                           nameGpReg(rs1), simm13, nameFpReg(rd));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2266
+            format_3_1_imm(3, rd, 0x20, rs1, simm13);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2267
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2268
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2269
+        // lddf and stdf will have mem align problem.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2270
+        void lddf_r(int rs1, int rs2, int rd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2271
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2272
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2273
+                           IPFX "ldd         [%s + %s], %s\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2274
+                           nameGpReg(rs1), nameGpReg(rs2), nameFpReg(rd));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2275
+            format_3_1(3, rd, 0x23, rs1, 0, rs2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2276
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2277
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2278
+        void lddf_imm(int rs1, int simm13, int rd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2279
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2280
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2281
+                           IPFX "ldd         [%s + %d], %s\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2282
+                           nameGpReg(rs1), simm13, nameFpReg(rd));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2283
+            format_3_1_imm(3, rd, 0x23, rs1, simm13);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2284
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2285
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2286
+        void stdf_r(int rd, int rs2, int rs1)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2287
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2288
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2289
+                           IPFX "std         %s, [%s + %s]\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2290
+                           nameFpReg(rd), nameGpReg(rs1), nameGpReg(rs2));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2291
+            format_3_1(3, rd, 0x27, rs1, 0, rs2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2292
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2293
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2294
+        void stdf_imm(int rd, int rs1, int simm13)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2295
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2296
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2297
+                           IPFX "std         %s, [%s + %d]\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2298
+                           nameFpReg(rd), nameGpReg(rs1), simm13);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2299
+            format_3_1_imm(3, rd, 0x27, rs1, simm13);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2300
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2301
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2302
+        void stf_r(int rd, int rs2, int rs1)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2303
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2304
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2305
+                           IPFX "st          %s, [%s + %s]\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2306
+                           nameFpReg(rd), nameGpReg(rs1), nameGpReg(rs2));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2307
+            format_3_1(3, rd, 0x24, rs1, 0, rs2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2308
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2309
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2310
+        void stf_imm(int rd, int rs1, int simm13)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2311
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2312
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2313
+                           IPFX "st          %s, [%s + %d]\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2314
+                           nameFpReg(rd), nameGpReg(rs1), simm13);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2315
+            format_3_1_imm(3, rd, 0x24, rs1, simm13);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2316
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2317
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2318
+        void fmovd_r(int rs2, int rd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2319
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2320
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2321
+                           IPFX "fmovd       %s, %s\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2322
+                           nameFpReg(rs2), nameFpReg(rd));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2323
+            format_3_8(2, rd, 0x34, 0, 0x2, rs2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2324
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2325
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2326
+        void fcmpd_r(int rs1, int rs2)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2327
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2328
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2329
+                           IPFX "fcmpd       %s, %s\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2330
+                           nameFpReg(rs1), nameFpReg(rs2));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2331
+            format_3_9(2, 0, 0, 0x35, rs1, 0x52, rs2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2332
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2333
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2334
+        void nop()
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2335
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2336
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2337
+                           IPFX "nop\n", MAYBE_PAD);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2338
+            format_2_1(0, 0x4, 0);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2339
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2340
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2341
+        void branch_con(Condition cond, int target)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2342
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2343
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2344
+                           IPFX "b%s         0x%x\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2345
+                           nameICC(cond), target);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2346
+            format_2_2(0, cond, 0x2, target);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2347
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2348
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2349
+        void fbranch_con(DoubleCondition cond, int target)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2350
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2351
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2352
+                           IPFX "fb%s        0x%x\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2353
+                           nameFCC(cond), target);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2354
+            format_2_2(0, cond, 0x6, target);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2355
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2356
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2357
+        void rdy(int rd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2358
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2359
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2360
+                           IPFX "rdy         %s\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2361
+                           nameFpReg(rd));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2362
+            format_3_1(2, rd, 0x28, 0, 0, 0);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2363
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2364
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2365
+        void rdpc(int rd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2366
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2367
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2368
+                           IPFX "rdpc        %s\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2369
+                           nameGpReg(rd));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2370
+            format_3_1(2, rd, 0x28, 5, 0, 0);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2371
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2372
+        void jmpl_r(int rs1, int rs2, int rd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2373
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2374
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2375
+                           IPFX "jmpl        %s + %s, %s\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2376
+                           nameGpReg(rs1), nameGpReg(rs2), nameGpReg(rd));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2377
+            format_3_1(2, rd, 0x38, rs1, 0, rs2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2378
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2379
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2380
+        void jmpl_imm(int rs1, int simm13, int rd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2381
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2382
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2383
+                           IPFX "jmpl        %s + %d, %s\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2384
+                           nameGpReg(rs1), simm13, nameGpReg(rd));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2385
+            format_3_1_imm(2, rd, 0x38, rs1, simm13);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2386
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2387
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2388
+        void save_r(int rs1, int rs2, int rd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2389
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2390
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2391
+                           IPFX "save        %s, %s, %s\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2392
+                           nameGpReg(rs1), nameGpReg(rs2), nameGpReg(rd));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2393
+            format_3_1(2, rd, 0x3c, rs1, 0, rs2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2394
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2395
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2396
+        void save_imm(int rs1, int simm13, int rd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2397
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2398
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2399
+                           IPFX "save        %s, %d, %s\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2400
+                           nameGpReg(rs1), simm13, nameGpReg(rd));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2401
+            format_3_1_imm(2, rd, 0x3c, rs1, simm13);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2402
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2403
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2404
+        void restore_r(int rs1, int rs2, int rd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2405
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2406
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2407
+                           IPFX "restore     %s, %s, %s\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2408
+                           nameGpReg(rs1), nameGpReg(rs2), nameGpReg(rd));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2409
+            format_3_1(2, rd, 0x3d, rs1, 0, rs2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2410
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2411
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2412
+        void ta_imm(int swap_trap)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2413
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2414
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2415
+                           IPFX "ta          %d\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2416
+                           swap_trap);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2417
+            format_4_3(0x8, 0xa, 0, 0, 0, swap_trap);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2418
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2419
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2420
+        void movcc_imm(int simm11, int rd, Condition cond)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2421
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2422
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2423
+                           IPFX "mov%s       %d, %s\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2424
+                           nameICC(cond), simm11, nameGpReg(rd));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2425
+            format_4_2_imm(rd, 0x2c, 1, cond, 0, 0, simm11);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2426
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2427
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2428
+        void fabss_r(int rs2, int rd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2429
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2430
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2431
+                           IPFX "fabss       %s, %s\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2432
+                           nameFpReg(rs2), nameFpReg(rd));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2433
+            format_3_8(2, rd, 0x34, 0, 0x9, rs2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2434
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2435
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2436
+        void faddd_r(int rs1, int rs2, int rd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2437
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2438
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2439
+                           IPFX "faddd       %s, %s, %s\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2440
+                           nameFpReg(rs1), nameFpReg(rs2), nameFpReg(rd));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2441
+            format_3_8(2, rd, 0x34, rs1, 0x42, rs2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2442
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2443
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2444
+        void fsubd_r(int rs1, int rs2, int rd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2445
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2446
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2447
+                           IPFX "fsubd       %s, %s, %s\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2448
+                           nameFpReg(rs1), nameFpReg(rs2), nameFpReg(rd));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2449
+            format_3_8(2, rd, 0x34, rs1, 0x46, rs2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2450
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2451
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2452
+        void fmuld_r(int rs1, int rs2, int rd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2453
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2454
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2455
+                           IPFX "fmuld       %s, %s, %s\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2456
+                           nameFpReg(rs1), nameFpReg(rs2), nameFpReg(rd));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2457
+            format_3_8(2, rd, 0x34, rs1, 0x4a, rs2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2458
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2459
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2460
+        void fdivd_r(int rs1, int rs2, int rd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2461
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2462
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2463
+                           IPFX "fdivd       %s, %s, %s\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2464
+                           nameFpReg(rs1), nameFpReg(rs2), nameFpReg(rd));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2465
+            format_3_8(2, rd, 0x34, rs1, 0x4e, rs2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2466
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2467
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2468
+        void fsqrtd_r(int rs2, int rd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2469
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2470
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2471
+                           IPFX "fsqartd     %s, %s\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2472
+                           nameFpReg(rs2), nameFpReg(rd));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2473
+            format_3_8(2, rd, 0x34, 0, 0x2a, rs2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2474
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2475
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2476
+        void fnegd_r(int rs2, int rd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2477
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2478
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2479
+                           IPFX "fnegd       %s, %s\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2480
+                           nameFpReg(rs2), nameFpReg(rd));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2481
+            format_3_8(2, rd, 0x34, 0, 0x06, rs2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2482
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2483
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2484
+        void fitod_r(int rs2, int rd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2485
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2486
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2487
+                           IPFX "fitod       %s, %s\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2488
+                           nameFpReg(rs2), nameFpReg(rd));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2489
+            format_3_8(2, rd, 0x34, 0, 0xc8, rs2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2490
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2491
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2492
+        void fdtoi_r(int rs2, int rd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2493
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2494
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2495
+                           IPFX "fdtoi       %s, %s\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2496
+                           nameFpReg(rs2), nameFpReg(rd));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2497
+            format_3_8(2, rd, 0x34, 0, 0xd2, rs2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2498
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2499
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2500
+        void fdtos_r(int rs2, int rd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2501
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2502
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2503
+                           IPFX "fdtos       %s, %s\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2504
+                           nameFpReg(rs2), nameFpReg(rd));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2505
+            format_3_8(2, rd, 0x34, 0, 0xc6, rs2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2506
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2507
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2508
+        void fstod_r(int rs2, int rd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2509
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2510
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2511
+                           IPFX "fstod       %s, %s\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2512
+                           nameFpReg(rs2), nameFpReg(rd));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2513
+            format_3_8(2, rd, 0x34, 0, 0xc9, rs2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2514
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2515
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2516
+        static bool isimm13(int imm)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2517
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2518
+            return (imm) <= 0xfff && (imm) >= -0x1000;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2519
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2520
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2521
+        static bool isimm22(int imm)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2522
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2523
+            return (imm) <= 0x1fffff && (imm) >= -0x200000;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2524
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2525
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2526
+        void move_nocheck(int imm_v, RegisterID dest)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2527
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2528
+            sethi(imm_v, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2529
+            or_imm(dest, imm_v & 0x3FF, dest);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2530
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2531
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2532
+        JmpSrc call()
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2533
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2534
+            JmpSrc r = JmpSrc(m_buffer.size());
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2535
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2536
+                           IPFX "call        %d\n", MAYBE_PAD,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2537
+                           r.m_offset);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2538
+            m_buffer.putInt(0x40000000);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2539
+            nop();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2540
+            return r;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2541
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2542
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2543
+        JmpSrc jump_common(BranchType branchtype, int cond)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2544
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2545
+            if (branchtype == BranchOnCondition)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2546
+                branch_con(Condition(cond), 0);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2547
+            else
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2548
+                fbranch_con(DoubleCondition(cond), 0);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2549
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2550
+            nop();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2551
+            branch_con(ConditionA, 7);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2552
+            nop();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2553
+            move_nocheck(0, SparcRegisters::g2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2554
+            rdpc(SparcRegisters::g3);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2555
+            jmpl_r(SparcRegisters::g2, SparcRegisters::g3, SparcRegisters::g0);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2556
+            nop();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2557
+            return JmpSrc(m_buffer.size());
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2558
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2559
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2560
+        JmpSrc branch(Condition cond)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2561
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2562
+            return jump_common(BranchOnCondition, cond);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2563
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2564
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2565
+        JmpSrc fbranch(DoubleCondition cond)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2566
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2567
+            return jump_common(BranchOnDoubleCondition, cond);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2568
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2569
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2570
+        JmpSrc jmp()
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2571
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2572
+            return jump_common(BranchOnCondition, ConditionA);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2573
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2574
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2575
+        // Assembler admin methods:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2576
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2577
+        JmpDst label()
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2578
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2579
+            JmpDst r = JmpDst(m_buffer.size());
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2580
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2581
+                           IPFX "#label     ((%d))\n", MAYBE_PAD, r.m_offset);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2582
+            return r;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2583
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2584
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2585
+        // General helpers
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2586
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2587
+        size_t size() const { return m_buffer.size(); }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2588
+        unsigned char *buffer() const { return m_buffer.buffer(); }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2589
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2590
+        static int getDifferenceBetweenLabels(JmpDst src, JmpDst dst)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2591
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2592
+            return dst.m_offset - src.m_offset;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2593
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2594
+    
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2595
+        static int getDifferenceBetweenLabels(JmpDst src, JmpSrc dst)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2596
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2597
+            return dst.m_offset - src.m_offset;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2598
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2599
+    
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2600
+        static int getDifferenceBetweenLabels(JmpSrc src, JmpDst dst)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2601
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2602
+            return dst.m_offset - src.m_offset;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2603
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2604
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2605
+        static unsigned getCallReturnOffset(JmpSrc call)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2606
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2607
+            return call.m_offset + 20;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2608
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2609
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2610
+        static void* getRelocatedAddress(void* code, JmpSrc jump)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2611
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2612
+            ASSERT(jump.m_offset != -1);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2613
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2614
+            return reinterpret_cast<void*>(reinterpret_cast<ptrdiff_t>(code) + jump.m_offset);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2615
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2616
+    
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2617
+        static void* getRelocatedAddress(void* code, JmpDst destination)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2618
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2619
+            ASSERT(destination.m_offset != -1);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2620
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2621
+            return reinterpret_cast<void*>(reinterpret_cast<ptrdiff_t>(code) + destination.m_offset);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2622
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2623
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2624
+        void* executableCopy(ExecutablePool* allocator)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2625
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2626
+            return m_buffer.executableCopy(allocator);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2627
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2628
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2629
+        void* executableCopy(void* buffer)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2630
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2631
+            return memcpy(buffer, m_buffer.buffer(), size());
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2632
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2633
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2634
+        static void patchPointerInternal(void* where, int value)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2635
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2636
+            // Patch move_nocheck.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2637
+            uint32_t *branch = (uint32_t*) where;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2638
+            branch[0] &= 0xFFC00000;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2639
+            branch[0] |= (value >> 10) & 0x3FFFFF;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2640
+            branch[1] &= 0xFFFFFC00;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2641
+            branch[1] |= value & 0x3FF;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2642
+            ExecutableAllocator::cacheFlush(where, 8);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2643
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2644
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2645
+        static void patchbranch(void* where, int value)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2646
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2647
+            uint32_t *branch = (uint32_t*) where;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2648
+            branch[0] &= 0xFFC00000;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2649
+            branch[0] |= value & 0x3FFFFF;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2650
+            ExecutableAllocator::cacheFlush(where, 4);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2651
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2652
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2653
+        static bool canRelinkJump(void* from, void* to)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2654
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2655
+            return true;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2656
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2657
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2658
+        static void relinkJump(void* from, void* to)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2659
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2660
+            from = (void *)((int)from - 36);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2661
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2662
+                           ISPFX "##link     ((%p)) jumps to ((%p))\n",
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2663
+                           from, to);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2664
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2665
+            int value = ((int)to - (int)from) / 4;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2666
+            if (isimm22(value)) 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2667
+                patchbranch(from, value);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2668
+            else {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2669
+                patchbranch(from, 4);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2670
+                from = (void *)((intptr_t)from + 16);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2671
+                patchPointerInternal(from, (int)(value * 4 - 24));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2672
+            }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2673
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2674
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2675
+        void linkJump(JmpSrc from, JmpDst to)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2676
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2677
+            ASSERT(from.m_offset != -1);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2678
+            ASSERT(to.m_offset != -1);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2679
+            intptr_t code = (intptr_t)(m_buffer.data());
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2680
+            void *where = (void *)((intptr_t)code + from.m_offset);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2681
+            void *target = (void *)((intptr_t)code + to.m_offset);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2682
+            relinkJump(where, target);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2683
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2684
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2685
+        static void linkJump(void* code, JmpSrc from, void* to)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2686
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2687
+            ASSERT(from.m_offset != -1);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2688
+            void *where = (void *)((intptr_t)code + from.m_offset);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2689
+            relinkJump(where, to);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2690
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2691
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2692
+        static void relinkCall(void* from, void* to)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2693
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2694
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2695
+                           ISPFX "##linkCall ((from=%p)) ((to=%p))\n",
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2696
+                           from, to);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2697
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2698
+            int disp = ((int)to - (int)from)/4;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2699
+            *(uint32_t *)((int)from) &= 0x40000000;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2700
+            *(uint32_t *)((int)from) |= disp & 0x3fffffff;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2701
+            ExecutableAllocator::cacheFlush(from, 4);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2702
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2703
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2704
+        static void linkCall(void* code, JmpSrc where, void* to)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2705
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2706
+            void *from = (void *)((intptr_t)code + where.m_offset);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2707
+            relinkCall(from, to);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2708
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2709
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2710
+        static void linkPointer(void* code, JmpDst where, void* value)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2711
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2712
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2713
+                           ISPFX "##linkPointer     ((%p + %#x)) points to ((%p))\n",
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2714
+                           code, where.m_offset, value);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2715
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2716
+            void *from = (void *)((intptr_t)code + where.m_offset);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2717
+            patchPointerInternal(from, (int)value);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2718
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2719
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2720
+        static void repatchInt32(void* where, int value)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2721
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2722
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2723
+                           ISPFX "##repatchInt32 ((where=%p)) holds ((value=%d))\n",
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2724
+                           where, value);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2725
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2726
+            patchPointerInternal(where, value);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2727
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2728
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2729
+        static void repatchPointer(void* where, void* value)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2730
+        { 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2731
+            js::JaegerSpew(js::JSpew_Insns,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2732
+                           ISPFX "##repatchPointer ((where = %p)) points to ((%p))\n",
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2733
+                           where, value);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2734
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2735
+            patchPointerInternal(where, (int)value);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2736
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2737
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2738
+        static void repatchLoadPtrToLEA(void* where)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2739
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2740
+            // sethi is used. The offset is in a register
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2741
+            if (*(uint32_t *)((int)where) & 0x01000000)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2742
+                where = (void *)((intptr_t)where + 8);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2743
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2744
+            *(uint32_t *)((int)where) &= 0x3fffffff;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2745
+            *(uint32_t *)((int)where) |= 0x80000000;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2746
+            ExecutableAllocator::cacheFlush(where, 4);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2747
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2748
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2749
+        static void repatchLEAToLoadPtr(void* where)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2750
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2751
+            // sethi is used. The offset is in a register
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2752
+            if (*(uint32_t *)((int)where) & 0x01000000)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2753
+                where = (void *)((intptr_t)where + 8);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2754
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2755
+            *(uint32_t *)((int)where) &= 0x3fffffff;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2756
+            *(uint32_t *)((int)where) |= 0xc0000000;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2757
+            ExecutableAllocator::cacheFlush(where, 4);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2758
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2759
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2760
+    private:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2761
+        static char const * nameGpReg(int reg)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2762
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2763
+            ASSERT(reg <= 31);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2764
+            ASSERT(reg >= 0);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2765
+            static char const * names[] = {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2766
+                "%g0", "%g1", "%g2", "%g3",
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2767
+                "%g4", "%g5", "%g6", "%g7",
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2768
+                "%o0", "%o1", "%o2", "%o3",
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2769
+                "%o4", "%o5", "%sp", "%o7",
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2770
+                "%l0", "%l1", "%l2", "%l3",
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2771
+                "%l4", "%l5", "%l6", "%l7",
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2772
+                "%i0", "%i1", "%i2", "%i3",
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2773
+                "%i4", "%i5", "%fp", "%i7"
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2774
+            };
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2775
+            return names[reg];
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2776
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2777
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2778
+        static char const * nameFpReg(int reg)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2779
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2780
+            ASSERT(reg <= 31);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2781
+            ASSERT(reg >= 0);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2782
+            static char const * names[] = {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2783
+                "%f0",   "%f1",   "%f2",   "%f3",
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2784
+                "%f4",   "%f5",   "%f6",   "%f7",
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2785
+                "%f8",   "%f9",  "%f10",  "%f11",
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2786
+                "%f12",  "%f13",  "%f14",  "%f15",
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2787
+                "%f16",  "%f17",  "%f18",  "%f19",
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2788
+                "%f20",  "%f21",  "%f22",  "%f23",
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2789
+                "%f24",  "%f25",  "%f26",  "%f27",
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2790
+                "%f28",  "%f29",  "%f30",  "%f31"
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2791
+            };
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2792
+            return names[reg];
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2793
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2794
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2795
+        static char const * nameICC(Condition cc)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2796
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2797
+            ASSERT(cc <= ConditionVC);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2798
+            ASSERT(cc >= 0);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2799
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2800
+            uint32_t    ccIndex = cc;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2801
+            static char const * inames[] = {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2802
+                "   ", "e  ",
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2803
+                "le ", "l  ",
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2804
+                "leu", "cs ",
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2805
+                "neg", "vs ",
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2806
+                "a  ", "ne ",
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2807
+                "g  ", "ge ",
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2808
+                "gu ", "cc ",
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2809
+                "   ", "vc "
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2810
+            };
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2811
+            return inames[ccIndex];
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2812
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2813
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2814
+        static char const * nameFCC(DoubleCondition cc)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2815
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2816
+            ASSERT(cc <= DoubleConditionULE);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2817
+            ASSERT(cc >= 0);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2818
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2819
+            uint32_t    ccIndex = cc;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2820
+            static char const * fnames[] = {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2821
+                "   ", "ne ",
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2822
+                "   ", "ul ",
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2823
+                "l  ", "ug ",
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2824
+                "g  ", "   ",
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2825
+                "   ", "e  ",
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2826
+                "ue ", "ge ",
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2827
+                "ugu", "le ",
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2828
+                "ule", "   "
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2829
+            };
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2830
+            return fnames[ccIndex];
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2831
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2832
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2833
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2834
+    };
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2835
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2836
+} // namespace JSC
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2837
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2838
+#endif // ENABLE(ASSEMBLER) && CPU(SPARC)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2839
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2840
+#endif // SparcAssembler_h
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2841
diff --git a/js/src/assembler/jit/ExecutableAllocator.h b/js/src/assembler/jit/ExecutableAllocator.h
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2842
index 511aebf..50d58ef 100644
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2843
--- a/js/src/assembler/jit/ExecutableAllocator.h
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2844
+++ b/js/src/assembler/jit/ExecutableAllocator.h
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2845
@@ -35,6 +35,10 @@
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2846
 #include "jsvector.h"
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2847
 #include "jslock.h"
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2848
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2849
+#if WTF_CPU_SPARC
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2850
+extern  "C" void sync_instruction_memory(caddr_t v, u_int len);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2851
+#endif
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2852
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2853
 #if WTF_PLATFORM_IPHONE
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2854
 #include <libkern/OSCacheControl.h>
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2855
 #include <sys/mman.h>
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2856
@@ -391,6 +395,11 @@ public:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2857
     {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2858
         CacheRangeFlush(code, size, CACHE_SYNC_ALL);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2859
     }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2860
+#elif WTF_CPU_SPARC
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2861
+    static void cacheFlush(void* code, size_t size)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2862
+    {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2863
+        sync_instruction_memory((caddr_t)code, size);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2864
+    }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2865
 #else
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2866
     #error "The cacheFlush support is missing on this platform."
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2867
 #endif
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2868
diff --git a/js/src/assembler/wtf/Platform.h b/js/src/assembler/wtf/Platform.h
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2869
index 3dfad2a..5ad3f75 100644
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2870
--- a/js/src/assembler/wtf/Platform.h
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2871
+++ b/js/src/assembler/wtf/Platform.h
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2872
@@ -159,7 +159,7 @@
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2873
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2874
 /* CPU(SPARC) - any SPARC, true for CPU(SPARC32) and CPU(SPARC64) */
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2875
 #if WTF_CPU_SPARC32 || WTF_CPU_SPARC64
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2876
-#define WTF_CPU_SPARC
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2877
+#define WTF_CPU_SPARC 1
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2878
 #endif
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2879
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2880
 /* CPU(X86) - i386 / x86 32-bit */
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2881
@@ -857,6 +857,8 @@ on MinGW. See https://bugs.webkit.org/show_bug.cgi?id=29268 */
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2882
 /* The JIT is tested & working on x86 Windows */
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2883
 #elif WTF_CPU_X86 && WTF_PLATFORM_WIN
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2884
     #define ENABLE_JIT 1
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2885
+#elif WTF_CPU_SPARC
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2886
+    #define ENABLE_JIT 1
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2887
 #endif
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2888
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2889
 #if WTF_PLATFORM_QT
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2890
@@ -918,8 +920,10 @@ on MinGW. See https://bugs.webkit.org/show_bug.cgi?id=29268 */
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2891
 #if !defined(ENABLE_YARR_JIT)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2892
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2893
 /* YARR supports x86 & x86-64, and has been tested on Mac and Windows. */
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2894
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2895
 #if (WTF_CPU_X86 \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2896
  || WTF_CPU_X86_64 \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2897
+ || WTF_CPU_SPARC \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2898
  || WTF_CPU_ARM_TRADITIONAL \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2899
  || WTF_CPU_ARM_THUMB2 \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2900
  || WTF_CPU_X86)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2901
diff --git a/js/src/configure.in b/js/src/configure.in
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2902
index 5d5365b..faac6b5 100644
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2903
--- a/js/src/configure.in
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2904
+++ b/js/src/configure.in
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2905
@@ -2959,7 +2959,12 @@ arm*-*)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2906
 sparc*-*)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2907
     ENABLE_TRACEJIT=1
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2908
     NANOJIT_ARCH=Sparc
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2909
+    ENABLE_METHODJIT=1
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2910
+    ENABLE_MONOIC=1
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2911
+    ENABLE_POLYIC=1
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2912
+    ENABLE_POLYIC_TYPED_ARRAY=1
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2913
     AC_DEFINE(JS_CPU_SPARC)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2914
+    AC_DEFINE(JS_NUNBOX32)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2915
     ;;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2916
 esac
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2917
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2918
diff --git a/js/src/jsgc.cpp b/js/src/jsgc.cpp
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2919
index 3fe567d..a912902 100644
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2920
--- a/js/src/jsgc.cpp
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2921
+++ b/js/src/jsgc.cpp
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2922
@@ -2799,7 +2799,7 @@ js_GC(JSContext *cx, JSCompartment *comp, JSGCInvocationKind gckind)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2923
                  JS_CHECK_STACK_SIZE(cx->stackLimit + (1 << 14), &stackDummy));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2924
 # else
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2925
     /* -16k because it is possible to perform a GC during an overrecursion report. */
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2926
-    JS_ASSERT_IF(cx->stackLimit, JS_CHECK_STACK_SIZE(cx->stackLimit - (1 << 14), &stackDummy));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2927
+    JS_ASSERT_IF(cx->stackLimit, JS_CHECK_STACK_SIZE(cx->stackLimit - (1 << 15), &stackDummy));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2928
 # endif
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2929
 #endif
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2930
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2931
diff --git a/js/src/methodjit/BaseAssembler.h b/js/src/methodjit/BaseAssembler.h
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2932
index bc7cd97..400e373 100644
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2933
--- a/js/src/methodjit/BaseAssembler.h
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2934
+++ b/js/src/methodjit/BaseAssembler.h
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2935
@@ -176,6 +176,8 @@ class Assembler : public ValueAssembler
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2936
     static const RegisterID ClobberInCall = JSC::X86Registers::ecx;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2937
 #elif defined(JS_CPU_ARM)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2938
     static const RegisterID ClobberInCall = JSC::ARMRegisters::r2;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2939
+#elif defined(JS_CPU_SPARC)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2940
+    static const RegisterID ClobberInCall = JSC::SparcRegisters::l1;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2941
 #endif
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2942
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2943
     /* :TODO: OOM */
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2944
@@ -225,6 +227,10 @@ static const JSC::MacroAssembler::RegisterID JSParamReg_Argc   = JSC::X86Registe
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2945
 static const JSC::MacroAssembler::RegisterID JSReturnReg_Type  = JSC::ARMRegisters::r2;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2946
 static const JSC::MacroAssembler::RegisterID JSReturnReg_Data  = JSC::ARMRegisters::r1;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2947
 static const JSC::MacroAssembler::RegisterID JSParamReg_Argc   = JSC::ARMRegisters::r1;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2948
+#elif defined(JS_CPU_SPARC)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2949
+static const JSC::MacroAssembler::RegisterID JSReturnReg_Type = JSC::SparcRegisters::i0;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2950
+static const JSC::MacroAssembler::RegisterID JSReturnReg_Data = JSC::SparcRegisters::i1;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2951
+static const JSC::MacroAssembler::RegisterID JSParamReg_Argc  = JSC::SparcRegisters::i2;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2952
 #endif
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2953
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2954
     size_t distanceOf(Label l) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2955
@@ -364,10 +370,18 @@ static const JSC::MacroAssembler::RegisterID JSParamReg_Argc   = JSC::ARMRegiste
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2956
     // Windows x64 requires extra space in between calls.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2957
 #ifdef _WIN64
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2958
     static const uint32 ShadowStackSpace = 32;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2959
+#elif defined(JS_CPU_SPARC)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2960
+    static const uint32 ShadowStackSpace = 92;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2961
 #else
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2962
     static const uint32 ShadowStackSpace = 0;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2963
 #endif
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2964
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2965
+#if defined(JS_CPU_SPARC)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2966
+    static const uint32 BaseStackSpace = 104;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2967
+#else
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2968
+    static const uint32 BaseStackSpace = 0;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2969
+#endif
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2970
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2971
     // Prepare the stack for a call sequence. This must be called AFTER all
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2972
     // volatile regs have been saved, and BEFORE pushArg() is used. The stack
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2973
     // is assumed to be aligned to 16-bytes plus any pushes that occured via
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2974
@@ -426,7 +440,7 @@ static const JSC::MacroAssembler::RegisterID JSParamReg_Argc   = JSC::ARMRegiste
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2975
         //
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2976
         // Note that it's not required we're in a call - stackAdjust can be 0.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2977
         JS_ASSERT(marker.base <= extraStackSpace);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2978
-        return Address(stackPointerRegister, stackAdjust + extraStackSpace - marker.base);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2979
+        return Address(stackPointerRegister, BaseStackSpace + stackAdjust + extraStackSpace - marker.base);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2980
     }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2981
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2982
     // This is an internal function only for use inside a setupABICall(),
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2983
@@ -651,9 +665,9 @@ static const JSC::MacroAssembler::RegisterID JSParamReg_Argc   = JSC::ARMRegiste
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2984
         Address capacity(objReg, offsetof(JSObject, capacity));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2985
         if (key.isConstant()) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2986
             JS_ASSERT(key.index() >= 0);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2987
-            return branch32(BelowOrEqual, payloadOf(capacity), Imm32(key.index()));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2988
+            return branch32(BelowOrEqual, capacity, Imm32(key.index()));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2989
         }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2990
-        return branch32(BelowOrEqual, payloadOf(capacity), key.reg());
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2991
+        return branch32(BelowOrEqual, capacity, key.reg());
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2992
     }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2993
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2994
     // Load a jsval from an array slot, given a key. |objReg| is clobbered.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2995
diff --git a/js/src/methodjit/Compiler.cpp b/js/src/methodjit/Compiler.cpp
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2996
index 5d77692..02c75e5 100644
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2997
--- a/js/src/methodjit/Compiler.cpp
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2998
+++ b/js/src/methodjit/Compiler.cpp
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  2999
@@ -1845,7 +1845,7 @@ mjit::Compiler::generateMethod()
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3000
             // obj->getFlatClosureUpvars()
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3001
             masm.loadPtr(Address(reg, offsetof(JSObject, slots)), reg);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3002
             Address upvarAddress(reg, JSObject::JSSLOT_FLAT_CLOSURE_UPVARS * sizeof(Value));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3003
-            masm.loadPrivate(upvarAddress, reg);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3004
+            masm.loadPrivate(masm.payloadOf(upvarAddress), reg);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3005
             // push ((Value *) reg)[index]
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3006
             frame.freeReg(reg);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3007
             frame.push(Address(reg, index * sizeof(Value)));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3008
@@ -3605,7 +3605,7 @@ mjit::Compiler::jsop_bindname(JSAtom *atom, bool usePropCache)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3009
     masm.loadPtr(Address(JSFrameReg, JSStackFrame::offsetOfScopeChain()), pic.objReg);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3010
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3011
     pic.shapeGuard = masm.label();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3012
-    Jump inlineJump = masm.branchPtr(Assembler::NotEqual, masm.payloadOf(parent), ImmPtr(0));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3013
+    Jump inlineJump = masm.branchPtr(Assembler::NotEqual, parent, ImmPtr(0));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3014
     {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3015
         RESERVE_OOL_SPACE(stubcc.masm);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3016
         pic.slowPathStart = stubcc.linkExit(inlineJump, Uses(0));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3017
@@ -3674,7 +3674,7 @@ mjit::Compiler::jsop_bindname(JSAtom *atom, bool usePropCache)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3018
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3019
     Address address(reg, offsetof(JSObject, parent));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3020
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3021
-    Jump j = masm.branchPtr(Assembler::NotEqual, masm.payloadOf(address), ImmPtr(0));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3022
+    Jump j = masm.branchPtr(Assembler::NotEqual, address, ImmPtr(0));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3023
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3024
     stubcc.linkExit(j, Uses(0));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3025
     stubcc.leave();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3026
@@ -4614,7 +4614,7 @@ mjit::Compiler::jsop_instanceof()
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3027
     Label loop = masm.label();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3028
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3029
     /* Walk prototype chain, break out on NULL or hit. */
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3030
-    masm.loadPayload(protoAddr, obj);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3031
+    masm.loadPtr(protoAddr, obj);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3032
     Jump isFalse2 = masm.branchTestPtr(Assembler::Zero, obj, obj);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3033
     Jump isTrue = masm.branchPtr(Assembler::NotEqual, obj, proto);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3034
     isTrue.linkTo(loop, &masm);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3035
diff --git a/js/src/methodjit/FastArithmetic.cpp b/js/src/methodjit/FastArithmetic.cpp
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3036
index 653581d..3eb151b 100644
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3037
--- a/js/src/methodjit/FastArithmetic.cpp
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3038
+++ b/js/src/methodjit/FastArithmetic.cpp
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3039
@@ -771,7 +771,7 @@ mjit::Compiler::jsop_neg()
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3040
 #if defined JS_CPU_X86 || defined JS_CPU_X64
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3041
         masm.loadDouble(&DoubleNegMask, FPRegisters::Second);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3042
         masm.xorDouble(FPRegisters::Second, fpreg);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3043
-#elif defined JS_CPU_ARM
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3044
+#elif defined JS_CPU_ARM || defined JS_CPU_SPARC
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3045
         masm.negDouble(fpreg, fpreg);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3046
 #endif
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3047
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3048
diff --git a/js/src/methodjit/FastOps.cpp b/js/src/methodjit/FastOps.cpp
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3049
index 7e1c5b1..3227e30 100644
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3050
--- a/js/src/methodjit/FastOps.cpp
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3051
+++ b/js/src/methodjit/FastOps.cpp
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3052
@@ -1556,13 +1556,13 @@ mjit::Compiler::jsop_stricteq(JSOp op)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3053
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3054
         Assembler::Condition oppositeCond = (op == JSOP_STRICTEQ) ? Assembler::NotEqual : Assembler::Equal;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3055
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3056
-#if defined JS_CPU_X86 || defined JS_CPU_ARM
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3057
+#ifndef JS_CPU_X64
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3058
         static const int CanonicalNaNType = 0x7FF80000;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3059
         masm.setPtr(oppositeCond, treg, Imm32(CanonicalNaNType), result);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3060
-#elif defined JS_CPU_X64
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3061
+#else
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3062
         static const void *CanonicalNaNType = (void *)0x7FF8000000000000; 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3063
-        masm.move(ImmPtr(CanonicalNaNType), JSC::X86Registers::r11);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3064
-        masm.setPtr(oppositeCond, treg, JSC::X86Registers::r11, result);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3065
+        masm.move(ImmPtr(CanonicalNaNType), Registers::ScratchReg);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3066
+        masm.setPtr(oppositeCond, treg, Registers::ScratchReg, result);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3067
 #endif
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3068
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3069
         frame.popn(2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3070
@@ -1585,13 +1585,13 @@ mjit::Compiler::jsop_stricteq(JSOp op)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3071
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3072
         /* This is only true if the other side is |null|. */
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3073
         RegisterID result = frame.allocReg(Registers::SingleByteRegs);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3074
-#if defined JS_CPU_X86 || defined JS_CPU_ARM
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3075
+#ifndef JS_CPU_X64
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3076
         JSValueTag mask = known->getKnownTag();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3077
         if (frame.shouldAvoidTypeRemat(test))
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3078
             masm.set32(cond, masm.tagOf(frame.addressOf(test)), Imm32(mask), result);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3079
         else
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3080
             masm.set32(cond, frame.tempRegForType(test), Imm32(mask), result);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3081
-#elif defined JS_CPU_X64
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3082
+#else
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3083
         RegisterID maskReg = frame.allocReg();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3084
         masm.move(ImmTag(known->getKnownTag()), maskReg);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3085
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3086
@@ -1667,7 +1667,7 @@ mjit::Compiler::jsop_stricteq(JSOp op)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3087
         return;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3088
     }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3089
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3090
-#ifndef JS_CPU_ARM
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3091
+#if !defined JS_CPU_ARM && !defined JS_CPU_SPARC
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3092
     /* Try an integer fast-path. */
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3093
     bool needStub = false;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3094
     if (!lhs->isTypeKnown()) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3095
diff --git a/js/src/methodjit/FrameState-inl.h b/js/src/methodjit/FrameState-inl.h
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3096
index 9dfeb82..7764a3f 100644
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3097
--- a/js/src/methodjit/FrameState-inl.h
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3098
+++ b/js/src/methodjit/FrameState-inl.h
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3099
@@ -137,7 +137,7 @@ FrameState::convertInt32ToDouble(Assembler &masm, FrameEntry *fe, FPRegisterID f
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3100
     if (fe->data.inRegister())
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3101
         masm.convertInt32ToDouble(fe->data.reg(), fpreg);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3102
     else
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3103
-        masm.convertInt32ToDouble(addressOf(fe), fpreg);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3104
+        masm.convertInt32ToDouble(masm.payloadOf(addressOf(fe)), fpreg);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3105
 }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3106
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3107
 inline bool
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3108
diff --git a/js/src/methodjit/ICLabels.h b/js/src/methodjit/ICLabels.h
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3109
index cddcf7a..98fdffd 100644
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3110
--- a/js/src/methodjit/ICLabels.h
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3111
+++ b/js/src/methodjit/ICLabels.h
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3112
@@ -64,7 +64,7 @@ namespace ic {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3113
  * implementation.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3114
  */
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3115
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3116
-#if defined JS_CPU_X64 || defined JS_CPU_ARM
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3117
+#if defined JS_CPU_X64 || defined JS_CPU_ARM || defined JS_CPU_SPARC
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3118
 # define JS_HAS_IC_LABELS
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3119
 #endif
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3120
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3121
@@ -172,7 +172,7 @@ struct GetPropLabels : MacroAssemblerTypedefs {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3122
     int getInlineTypeJumpOffset() {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3123
 #if defined JS_CPU_X86 || defined JS_CPU_X64
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3124
         return INLINE_TYPE_JUMP;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3125
-#elif defined JS_CPU_ARM
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3126
+#elif defined JS_CPU_ARM || defined JS_CPU_SPARC
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3127
         return POST_INST_OFFSET(inlineTypeJumpOffset);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3128
 #endif
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3129
     }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3130
@@ -180,7 +180,7 @@ struct GetPropLabels : MacroAssemblerTypedefs {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3131
     void setInlineTypeJumpOffset(int offset) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3132
 #if defined JS_CPU_X86 || defined JS_CPU_X64
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3133
         JS_ASSERT(INLINE_TYPE_JUMP == offset);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3134
-#elif defined JS_CPU_ARM
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3135
+#elif defined JS_CPU_ARM || defined JS_CPU_SPARC
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3136
         inlineTypeJumpOffset = offset;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3137
         JS_ASSERT(offset == inlineTypeJumpOffset);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3138
 #endif
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3139
@@ -225,6 +225,10 @@ struct GetPropLabels : MacroAssemblerTypedefs {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3140
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3141
     /* Offset from the fast path to the type guard jump. */
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3142
     int32 inlineTypeJumpOffset : 8;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3143
+#elif defined JS_CPU_SPARC
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3144
+    static const int32 INLINE_SHAPE_JUMP = 48;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3145
+    static const int32 INLINE_TYPE_JUMP = 48;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3146
+    int32 inlineTypeJumpOffset : 8;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3147
 #endif
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3148
 };
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3149
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3150
diff --git a/js/src/methodjit/ICRepatcher.h b/js/src/methodjit/ICRepatcher.h
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3151
index 59d8e78..24b08b9 100644
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3152
--- a/js/src/methodjit/ICRepatcher.h
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3153
+++ b/js/src/methodjit/ICRepatcher.h
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3154
@@ -72,7 +72,7 @@ class Repatcher : public JSC::RepatchBuffer
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3155
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3156
     /* Patch a stub call. */
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3157
     void relink(CodeLocationCall call, FunctionPtr stub) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3158
-#if defined JS_CPU_X64 || defined JS_CPU_X86
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3159
+#if defined JS_CPU_X64 || defined JS_CPU_X86 || defined JS_CPU_SPARC
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3160
         JSC::RepatchBuffer::relink(call, stub);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3161
 #elif defined JS_CPU_ARM
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3162
         /*
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3163
@@ -95,7 +95,7 @@ class Repatcher : public JSC::RepatchBuffer
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3164
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3165
     /* Patch the offset of a Value load emitted by loadValueWithAddressOffsetPatch. */
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3166
     void patchAddressOffsetForValueLoad(CodeLocationLabel label, uint32 offset) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3167
-#if defined JS_CPU_X64 || defined JS_CPU_ARM
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3168
+#if defined JS_CPU_X64 || defined JS_CPU_ARM || defined JS_CPU_SPARC
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3169
         repatch(label.dataLabel32AtOffset(0), offset);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3170
 #elif defined JS_CPU_X86
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3171
         static const unsigned LOAD_TYPE_OFFSET = 6;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3172
@@ -115,7 +115,7 @@ class Repatcher : public JSC::RepatchBuffer
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3173
     }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3174
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3175
     void patchAddressOffsetForValueStore(CodeLocationLabel label, uint32 offset, bool typeConst) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3176
-#if defined JS_CPU_ARM || defined JS_CPU_X64
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3177
+#if defined JS_CPU_ARM || defined JS_CPU_X64 || defined JS_CPU_SPARC
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3178
         (void) typeConst;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3179
         repatch(label.dataLabel32AtOffset(0), offset);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3180
 #elif defined JS_CPU_X86
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3181
diff --git a/js/src/methodjit/MachineRegs.h b/js/src/methodjit/MachineRegs.h
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3182
index 149f188..c786cd3 100644
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3183
--- a/js/src/methodjit/MachineRegs.h
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3184
+++ b/js/src/methodjit/MachineRegs.h
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3185
@@ -60,6 +60,7 @@ struct Registers {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3186
     static const RegisterID TypeMaskReg = JSC::X86Registers::r13;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3187
     static const RegisterID PayloadMaskReg = JSC::X86Registers::r14;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3188
     static const RegisterID ValueReg = JSC::X86Registers::r10;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3189
+    static const RegisterID ScratchReg = JSC::X86Registers::r11;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3190
 #endif
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3191
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3192
     // Register that homes the current JSStackFrame.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3193
@@ -67,6 +68,8 @@ struct Registers {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3194
     static const RegisterID JSFrameReg = JSC::X86Registers::ebx;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3195
 #elif defined(JS_CPU_ARM)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3196
     static const RegisterID JSFrameReg = JSC::ARMRegisters::r11;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3197
+#elif defined(JS_CPU_SPARC)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3198
+    static const RegisterID JSFrameReg = JSC::SparcRegisters::l0;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3199
 #endif
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3200
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3201
 #if defined(JS_CPU_X86) || defined(JS_CPU_X64)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3202
@@ -87,6 +90,14 @@ struct Registers {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3203
     static const RegisterID ArgReg0 = JSC::ARMRegisters::r0;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3204
     static const RegisterID ArgReg1 = JSC::ARMRegisters::r1;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3205
     static const RegisterID ArgReg2 = JSC::ARMRegisters::r2;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3206
+#elif JS_CPU_SPARC
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3207
+    static const RegisterID ReturnReg = JSC::SparcRegisters::o0;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3208
+    static const RegisterID ArgReg0 = JSC::SparcRegisters::o0;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3209
+    static const RegisterID ArgReg1 = JSC::SparcRegisters::o1;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3210
+    static const RegisterID ArgReg2 = JSC::SparcRegisters::o2;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3211
+    static const RegisterID ArgReg3 = JSC::SparcRegisters::o3;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3212
+    static const RegisterID ArgReg4 = JSC::SparcRegisters::o4;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3213
+    static const RegisterID ArgReg5 = JSC::SparcRegisters::o5;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3214
 #endif
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3215
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3216
     static const RegisterID StackPointer = JSC::MacroAssembler::stackPointerRegister;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3217
@@ -168,6 +179,30 @@ struct Registers {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3218
     // r15 is PC (program counter).
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3219
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3220
     static const uint32 SingleByteRegs = TempRegs | SavedRegs;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3221
+#elif defined(JS_CPU_SPARC)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3222
+    static const uint32 TempRegs =
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3223
+          (1 << JSC::SparcRegisters::o0)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3224
+        | (1 << JSC::SparcRegisters::o1)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3225
+        | (1 << JSC::SparcRegisters::o2)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3226
+        | (1 << JSC::SparcRegisters::o3)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3227
+        | (1 << JSC::SparcRegisters::o4)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3228
+        | (1 << JSC::SparcRegisters::o5);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3229
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3230
+    static const uint32 SavedRegs =
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3231
+          (1 << JSC::SparcRegisters::l2)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3232
+        | (1 << JSC::SparcRegisters::l3)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3233
+        | (1 << JSC::SparcRegisters::l4)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3234
+        | (1 << JSC::SparcRegisters::l5)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3235
+        | (1 << JSC::SparcRegisters::l6)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3236
+        | (1 << JSC::SparcRegisters::l7)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3237
+        | (1 << JSC::SparcRegisters::i0)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3238
+        | (1 << JSC::SparcRegisters::i1)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3239
+        | (1 << JSC::SparcRegisters::i2)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3240
+        | (1 << JSC::SparcRegisters::i3)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3241
+        | (1 << JSC::SparcRegisters::i4)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3242
+        | (1 << JSC::SparcRegisters::i5);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3243
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3244
+    static const uint32 SingleByteRegs = TempRegs | SavedRegs;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3245
 #else
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3246
 # error "Unsupported platform"
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3247
 #endif
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3248
@@ -195,6 +230,8 @@ struct Registers {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3249
 # endif
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3250
 #elif defined(JS_CPU_ARM)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3251
         return 4;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3252
+#elif defined(JS_CPU_SPARC)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3253
+        return 6;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3254
 #endif
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3255
     }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3256
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3257
@@ -236,6 +273,15 @@ struct Registers {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3258
             JSC::ARMRegisters::r2,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3259
             JSC::ARMRegisters::r3
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3260
         };
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3261
+#elif defined(JS_CPU_SPARC)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3262
+        static const RegisterID regs[] = {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3263
+            JSC::SparcRegisters::o0,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3264
+            JSC::SparcRegisters::o1,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3265
+            JSC::SparcRegisters::o2,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3266
+            JSC::SparcRegisters::o3,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3267
+            JSC::SparcRegisters::o4,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3268
+            JSC::SparcRegisters::o5
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3269
+        };
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3270
 #endif
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3271
         JS_ASSERT(numArgRegs(conv) == JS_ARRAY_LENGTH(regs));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3272
         if (i > JS_ARRAY_LENGTH(regs))
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3273
@@ -362,6 +408,27 @@ struct FPRegisters {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3274
     static const FPRegisterID Second = JSC::ARMRegisters::d1;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3275
     static const FPRegisterID Temp0 = JSC::ARMRegisters::d2;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3276
     static const FPRegisterID Temp1 = JSC::ARMRegisters::d3;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3277
+#elif defined(JS_CPU_SPARC)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3278
+    static const uint32 TotalFPRegisters = 16;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3279
+    static const uint32 TempFPRegs = 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3280
+          (1 << JSC::SparcRegisters::f0)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3281
+        | (1 << JSC::SparcRegisters::f2)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3282
+        | (1 << JSC::SparcRegisters::f4)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3283
+        | (1 << JSC::SparcRegisters::f6)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3284
+        | (1 << JSC::SparcRegisters::f8)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3285
+        | (1 << JSC::SparcRegisters::f10)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3286
+        | (1 << JSC::SparcRegisters::f12)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3287
+        | (1 << JSC::SparcRegisters::f14)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3288
+        | (1 << JSC::SparcRegisters::f16)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3289
+        | (1 << JSC::SparcRegisters::f18)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3290
+        | (1 << JSC::SparcRegisters::f20)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3291
+        | (1 << JSC::SparcRegisters::f22)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3292
+        | (1 << JSC::SparcRegisters::f24)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3293
+        | (1 << JSC::SparcRegisters::f26)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3294
+        | (1 << JSC::SparcRegisters::f28);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3295
+    /* FIXME: Temporary hack until FPRegister allocation exists. */
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3296
+    static const FPRegisterID First  = JSC::SparcRegisters::f0;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3297
+    static const FPRegisterID Second = JSC::SparcRegisters::f2;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3298
 #else
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3299
 # error "Unsupported platform"
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3300
 #endif
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3301
diff --git a/js/src/methodjit/MethodJIT.cpp b/js/src/methodjit/MethodJIT.cpp
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3302
index 6169972..089a3be 100644
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3303
--- a/js/src/methodjit/MethodJIT.cpp
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3304
+++ b/js/src/methodjit/MethodJIT.cpp
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3305
@@ -555,6 +555,7 @@ SYMBOL_STRING(JaegerStubVeneer) ":"         "\n"
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3306
 "   pop     {ip,pc}"                        "\n"
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3307
 );
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3308
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3309
+# elif defined(JS_CPU_SPARC)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3310
 # else
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3311
 #  error "Unsupported CPU!"
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3312
 # endif
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3313
diff --git a/js/src/methodjit/MethodJIT.h b/js/src/methodjit/MethodJIT.h
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3314
index 8c2ab39..9529486 100644
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3315
--- a/js/src/methodjit/MethodJIT.h
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3316
+++ b/js/src/methodjit/MethodJIT.h
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3317
@@ -45,6 +45,7 @@
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3318
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3319
 #if !defined JS_CPU_X64 && \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3320
     !defined JS_CPU_X86 && \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3321
+    !defined JS_CPU_SPARC && \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3322
     !defined JS_CPU_ARM
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3323
 # error "Oh no, you should define a platform so this compiles."
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3324
 #endif
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3325
@@ -59,6 +60,39 @@ namespace mjit { struct JITScript; }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3326
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3327
 struct VMFrame
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3328
 {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3329
+#if defined(JS_CPU_SPARC)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3330
+    void *savedL0;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3331
+    void *savedL1;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3332
+    void *savedL2;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3333
+    void *savedL3;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3334
+    void *savedL4;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3335
+    void *savedL5;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3336
+    void *savedL6;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3337
+    void *savedL7;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3338
+    void *savedI0;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3339
+    void *savedI1;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3340
+    void *savedI2;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3341
+    void *savedI3;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3342
+    void *savedI4;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3343
+    void *savedI5;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3344
+    void *savedI6;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3345
+    void *savedI7;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3346
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3347
+    void *str_p;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3348
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3349
+    void *outgoing_p0;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3350
+    void *outgoing_p1;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3351
+    void *outgoing_p2;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3352
+    void *outgoing_p3;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3353
+    void *outgoing_p4;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3354
+    void *outgoing_p5;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3355
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3356
+    void *outgoing_p6;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3357
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3358
+    void *reserve_0;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3359
+    void *reserve_1;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3360
+#endif
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3361
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3362
     union Arguments {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3363
         struct {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3364
             void *ptr;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3365
@@ -131,6 +165,13 @@ struct VMFrame
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3366
     inline void** returnAddressLocation() {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3367
         return reinterpret_cast<void**>(this) - 1;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3368
     }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3369
+#elif defined(JS_CPU_SPARC)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3370
+    JSStackFrame *topRetrunAddr;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3371
+    void* veneerReturn;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3372
+    void* _align;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3373
+    inline void** returnAddressLocation() {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3374
+        return reinterpret_cast<void**>(&this->veneerReturn);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3375
+    }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3376
 #else
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3377
 # error "The VMFrame layout isn't defined for your processor architecture!"
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3378
 #endif
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3379
diff --git a/js/src/methodjit/MonoIC.h b/js/src/methodjit/MonoIC.h
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3380
index 66254b1..ec33db7 100644
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3381
--- a/js/src/methodjit/MonoIC.h
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3382
+++ b/js/src/methodjit/MonoIC.h
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3383
@@ -125,15 +125,15 @@ struct SetGlobalNameIC : public GlobalNameIC
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3384
     JSC::JITCode            extraStub;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3385
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3386
     /* SET only, if we had to generate an out-of-line path. */
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3387
-    int inlineShapeJump : 10;   /* Offset into inline path for shape jump. */
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3388
-    int extraShapeGuard : 6;    /* Offset into stub for shape guard. */
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3389
+    int32 inlineShapeJump : 10;   /* Offset into inline path for shape jump. */
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3390
+    int32 extraShapeGuard : 6;    /* Offset into stub for shape guard. */
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3391
     bool objConst : 1;          /* True if the object is constant. */
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3392
     RegisterID objReg   : 5;    /* Register for object, if objConst is false. */
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3393
     RegisterID shapeReg : 5;    /* Register for shape; volatile. */
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3394
     bool hasExtraStub : 1;      /* Extra stub is preset. */
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3395
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3396
-    int fastRejoinOffset : 16;  /* Offset from fastPathStart to rejoin. */
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3397
-    int extraStoreOffset : 16;  /* Offset into store code. */
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3398
+    int32 fastRejoinOffset : 16;  /* Offset from fastPathStart to rejoin. */
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3399
+    int32 extraStoreOffset : 16;  /* Offset into store code. */
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3400
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3401
     /* SET only. */
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3402
     ValueRemat vr;              /* RHS value. */
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3403
diff --git a/js/src/methodjit/NunboxAssembler.h b/js/src/methodjit/NunboxAssembler.h
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3404
index 6ce0ac8..fcce552 100644
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3405
--- a/js/src/methodjit/NunboxAssembler.h
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3406
+++ b/js/src/methodjit/NunboxAssembler.h
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3407
@@ -72,16 +72,24 @@ struct ImmPayload : JSC::MacroAssembler::Imm32
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3408
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3409
 class NunboxAssembler : public JSC::MacroAssembler
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3410
 {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3411
+  public:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3412
+#ifdef IS_BIG_ENDIAN
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3413
+    static const uint32 PAYLOAD_OFFSET = 4;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3414
+    static const uint32 TAG_OFFSET     = 0;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3415
+#else
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3416
     static const uint32 PAYLOAD_OFFSET = 0;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3417
     static const uint32 TAG_OFFSET     = 4;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3418
+#endif
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3419
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3420
   public:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3421
     static const JSC::MacroAssembler::Scale JSVAL_SCALE = JSC::MacroAssembler::TimesEight;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3422
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3423
-    template <typename T>
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3424
-    T payloadOf(T address) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3425
-        JS_ASSERT(PAYLOAD_OFFSET == 0);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3426
-        return address;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3427
+    Address payloadOf(Address address) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3428
+        return Address(address.base, address.offset + PAYLOAD_OFFSET);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3429
+    }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3430
+  
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3431
+    BaseIndex payloadOf(BaseIndex address) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3432
+        return BaseIndex(address.base, address.index, address.scale, address.offset + PAYLOAD_OFFSET);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3433
     }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3434
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3435
     Address tagOf(Address address) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3436
@@ -185,7 +193,7 @@ class NunboxAssembler : public JSC::MacroAssembler
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3437
         JS_ASSERT(differenceBetween(start, endType) == 6);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3438
         JS_ASSERT(differenceBetween(endType, endPayload) == 6);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3439
         return start;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3440
-#elif defined JS_CPU_ARM
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3441
+#elif defined JS_CPU_ARM || defined JS_CPU_SPARC
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3442
         /* 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3443
          * On ARM, the first instruction loads the offset from a literal pool, so the label
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3444
          * returned points at that instruction.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3445
@@ -217,7 +225,7 @@ class NunboxAssembler : public JSC::MacroAssembler
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3446
         JS_ASSERT(differenceBetween(start, endType) == 6);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3447
         JS_ASSERT(differenceBetween(endType, endPayload) == 6);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3448
         return start;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3449
-#elif defined JS_CPU_ARM
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3450
+#elif defined JS_CPU_ARM || defined JS_CPU_SPARC
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3451
         return store64WithAddressOffsetPatch(treg, dreg, address);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3452
 #endif
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3453
     }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3454
@@ -233,7 +241,7 @@ class NunboxAssembler : public JSC::MacroAssembler
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3455
         JS_ASSERT(differenceBetween(start, endType) == 10);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3456
         JS_ASSERT(differenceBetween(endType, endPayload) == 6);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3457
         return start;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3458
-#elif defined JS_CPU_ARM
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3459
+#elif defined JS_CPU_ARM || defined JS_CPU_SPARC
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3460
         return store64WithAddressOffsetPatch(type, dreg, address);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3461
 #endif
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3462
     }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3463
@@ -253,7 +261,7 @@ class NunboxAssembler : public JSC::MacroAssembler
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3464
         JS_ASSERT(differenceBetween(start, endType) == 10);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3465
         JS_ASSERT(differenceBetween(endType, endPayload) == 10);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3466
         return start;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3467
-#elif defined JS_CPU_ARM
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3468
+#elif defined JS_CPU_ARM || defined JS_CPU_SPARC
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3469
         return store64WithAddressOffsetPatch(type, payload, address);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3470
 #endif
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3471
     }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3472
@@ -435,6 +443,8 @@ class NunboxAssembler : public JSC::MacroAssembler
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3473
         m_assembler.movd_rr(srcDest, dataReg);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3474
         m_assembler.psrldq_rr(srcDest, 4);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3475
         m_assembler.movd_rr(srcDest, typeReg);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3476
+#elif defined JS_CPU_SPARC
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3477
+        breakDoubleTo32(srcDest, typeReg, dataReg);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3478
 #else
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3479
         JS_NOT_REACHED("implement this - push double, pop pop is easiest");
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3480
 #endif
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3481
diff --git a/js/src/methodjit/PolyIC.cpp b/js/src/methodjit/PolyIC.cpp
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3482
index aa82dab..dc7f3da 100644
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3483
--- a/js/src/methodjit/PolyIC.cpp
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3484
+++ b/js/src/methodjit/PolyIC.cpp
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3485
@@ -431,7 +431,7 @@ class SetPropCompiler : public PICStubCompiler
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3486
             for (Jump *pj = otherGuards.begin(); pj != otherGuards.end(); ++pj)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3487
                 pj->linkTo(masm.label(), &masm);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3488
             slowExit = masm.jump();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3489
-            pic.secondShapeGuard = masm.distanceOf(masm.label()) - masm.distanceOf(start);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3490
+            pic.secondShapeGuard = masm.differenceBetween(start, slowExit.get());
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3491
         } else {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3492
             pic.secondShapeGuard = 0;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3493
         }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3494
@@ -1075,7 +1075,7 @@ class GetPropCompiler : public PICStubCompiler
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3495
             if (!shapeMismatches.append(j))
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3496
                 return error();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3497
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3498
-            pic.secondShapeGuard = masm.distanceOf(masm.label()) - masm.distanceOf(start);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3499
+            pic.secondShapeGuard = masm.differenceBetween(start, j);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3500
         } else {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3501
             pic.secondShapeGuard = 0;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3502
         }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3503
diff --git a/js/src/methodjit/PolyIC.h b/js/src/methodjit/PolyIC.h
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3504
index 14e53e3..f6a025f 100644
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3505
--- a/js/src/methodjit/PolyIC.h
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3506
+++ b/js/src/methodjit/PolyIC.h
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3507
@@ -94,7 +94,7 @@ struct BaseIC : public MacroAssemblerTypedefs {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3508
     // Offset from start of stub to jump target of second shape guard as Nitro
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3509
     // asm data location. This is 0 if there is only one shape guard in the
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3510
     // last stub.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3511
-    int secondShapeGuard : 11;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3512
+    int32 secondShapeGuard : 11;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3513
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3514
     // Opcode this was compiled for.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3515
     JSOp op : 9;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3516
@@ -255,9 +255,9 @@ struct GetElementIC : public BasePolyIC {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3517
     // These offsets are used for string-key dependent stubs, such as named
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3518
     // property accesses. They are separated from the int-key dependent stubs,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3519
     // in order to guarantee that the id type needs only one guard per type.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3520
-    int atomGuard : 8;          // optional, non-zero if present
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3521
-    int firstShapeGuard : 8;    // always set
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3522
-    int secondShapeGuard : 8;   // optional, non-zero if present
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3523
+    int32 atomGuard : 8;          // optional, non-zero if present
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3524
+    int32 firstShapeGuard : 11;    // always set
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3525
+    int32 secondShapeGuard : 11;   // optional, non-zero if present
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3526
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3527
     bool hasLastStringStub : 1;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3528
     JITCode lastStringStub;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3529
@@ -336,7 +336,7 @@ struct SetElementIC : public BaseIC {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3530
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3531
     // A bitmask of registers that are volatile and must be preserved across
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3532
     // stub calls inside the IC.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3533
-    uint32 volatileMask : 16;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3534
+    uint32 volatileMask;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3535
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3536
     // If true, then keyValue contains a constant index value >= 0. Otherwise,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3537
     // keyReg contains a dynamic integer index in any range.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3538
diff --git a/js/src/methodjit/TrampolineSparc.s b/js/src/methodjit/TrampolineSparc.s
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3539
new file mode 100644
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3540
index 0000000..7fb929f
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3541
--- /dev/null
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3542
+++ b/js/src/methodjit/TrampolineSparc.s
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3543
@@ -0,0 +1,117 @@
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3544
+! -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3545
+! ***** BEGIN LICENSE BLOCK *****
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3546
+! Version: MPL 1.1!GPL 2.0!LGPL 2.1
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3547
+!
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3548
+! The contents of this file are subject to the Mozilla Public License Version
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3549
+! 1.1 (the "License")! you may not use this file except in compliance with
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3550
+! the License. You may obtain a copy of the License at
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3551
+! http:!!www.mozilla.org!MPL!
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3552
+!
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3553
+! Software distributed under the License is distributed on an "AS IS" basis,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3554
+! WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3555
+! for the specific language governing rights and limitations under the
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3556
+! License.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3557
+!
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3558
+! The Original Code is Mozilla SpiderMonkey JavaScript 1.9 code, released
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3559
+! May 28, 2008.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3560
+! 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3561
+! The Initial Developer of the Original Code is
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3562
+!    Leon Sha <[email protected]>
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3563
+!
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3564
+! Portions created by the Initial Developer are Copyright (C) 2010-2011
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3565
+! the Initial Developer. All Rights Reserved.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3566
+!
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3567
+! Contributor(s):
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3568
+!
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3569
+! Alternatively, the contents of this file may be used under the terms of
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3570
+! either the GNU General Public License Version 2 or later (the "GPL"), or
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3571
+! the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3572
+! in which case the provisions of the GPL or the LGPL are applicable instead
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3573
+! of those above. If you wish to allow use of your version of this file only
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3574
+! under the terms of either the GPL or the LGPL, and not to allow others to
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3575
+! use your version of this file under the terms of the MPL, indicate your
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3576
+! decision by deleting the provisions above and replace them with the notice
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3577
+! and other provisions required by the GPL or the LGPL. If you do not delete
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3578
+! the provisions above, a recipient may use your version of this file under
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3579
+! the terms of any one of the MPL, the GPL or the LGPL.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3580
+!
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3581
+! ***** END LICENSE BLOCK *****
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3582
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3583
+.text
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3584
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3585
+! JSBool JaegerTrampoline(JSContext *cx, JSStackFrame *fp, void *code,
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3586
+!                        , uintptr_t inlineCallCount)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3587
+.global JaegerTrampoline
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3588
+.type   JaegerTrampoline, #function
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3589
+JaegerTrampoline:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3590
+    save    %sp,-160,%sp
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3591
+    st      %i3, [%fp - 20]         ! stackLimit
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3592
+    st      %i0, [%fp - 24]        ! cx
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3593
+    st      %i1, [%fp - 16]         ! entryFp
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3594
+    st      %i1, [%fp - 28]        ! regs->fp
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3595
+    mov     %i1, %l0               ! fp
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3596
+    call    SetVMFrameRegs
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3597
+    mov     %sp, %o0
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3598
+    call    PushActiveVMFrame
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3599
+    mov     %sp, %o0
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3600
+    jmp     %i2
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3601
+    st      %i7, [%fp - 12]         ! return address
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3602
+.size   JaegerTrampoline, . - JaegerTrampoline
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3603
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3604
+! void JaegerTrampolineReturn()
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3605
+.global JaegerTrampolineReturn
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3606
+.type   JaegerTrampolineReturn, #function
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3607
+JaegerTrampolineReturn:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3608
+    st      %i0, [%l0 + 0x18]                        /* fp->rval type */
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3609
+    st      %i1, [%l0 + 0x1c]                        /* fp->rval data */
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3610
+    call    PopActiveVMFrame
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3611
+    mov     %sp, %o0
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3612
+    ld      [%fp - 12], %i7         ! return address
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3613
+    mov     1, %i0
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3614
+    ret
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3615
+    restore		
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3616
+.size   JaegerTrampolineReturn, . - JaegerTrampolineReturn
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3617
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3618
+! void *JaegerThrowpoline(js::VMFrame *vmFrame)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3619
+.global JaegerThrowpoline
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3620
+.type   JaegerThrowpoline, #function
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3621
+JaegerThrowpoline:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3622
+    call    js_InternalThrow
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3623
+    mov     %sp,%o0
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3624
+    tst     %o0
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3625
+    be      throwpoline_exit
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3626
+    nop
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3627
+    jmp     %o0
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3628
+    nop
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3629
+throwpoline_exit:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3630
+    ta      3
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3631
+    mov     %sp, %o2
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3632
+    mov     %fp, %o3
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3633
+    ldd     [%o2 + (0*8)], %l0
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3634
+    ldd     [%o2 + (1*8)], %l2
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3635
+    ldd     [%o2 + (2*8)], %l4
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3636
+    ldd     [%o2 + (3*8)], %l6
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3637
+    ldd     [%o2 + (4*8)], %i0
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3638
+    ldd     [%o2 + (5*8)], %i2
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3639
+    ldd     [%o2 + (6*8)], %i4
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3640
+    ldd     [%o2 + (7*8)], %i6
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3641
+    ld      [%o3 - 12], %i7         ! return address
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3642
+    mov     %o2, %sp
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3643
+    call    PopActiveVMFrame
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3644
+    mov     %sp, %o0
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3645
+    clr     %i0
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3646
+    ret
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3647
+    restore
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3648
+.size   JaegerThrowpoline, . - JaegerThrowpoline
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3649
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3650
+.global InjectJaegerReturn
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3651
+.type   InjectJaegerReturn, #function
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3652
+InjectJaegerReturn:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3653
+    ld      [%l0 + 0x18], %i0                        /* fp->rval type */
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3654
+    ld      [%l0 + 0x1c], %i1                        /* fp->rval data */
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3655
+    ld      [%l0 + 0x14], %i7                        /* fp->ncode */
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3656
+    sub     %i7, 8, %i7
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3657
+    ld      [%fp - 28], %l0
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3658
+    ret
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3659
+    nop
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3660
+.size   InjectJaegerReturn, . - InjectJaegerReturn
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3661
diff --git a/js/src/methodjit/TypedArrayIC.h b/js/src/methodjit/TypedArrayIC.h
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3662
index 88f8175..f97e6b0 100644
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3663
--- a/js/src/methodjit/TypedArrayIC.h
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3664
+++ b/js/src/methodjit/TypedArrayIC.h
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3665
@@ -46,7 +46,7 @@
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3666
 namespace js {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3667
 namespace mjit {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3668
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3669
-#if defined(JS_POLYIC) && (defined JS_CPU_X86 || defined JS_CPU_X64)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3670
+#if defined(JS_POLYIC_TYPED_ARRAY)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3671
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3672
 typedef JSC::MacroAssembler::RegisterID RegisterID;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3673
 typedef JSC::MacroAssembler::FPRegisterID FPRegisterID;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3674
diff --git a/js/src/nanojit/NativeSparc.cpp b/js/src/nanojit/NativeSparc.cpp
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3675
index 029a22a..a73be3d 100644
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3676
--- a/js/src/nanojit/NativeSparc.cpp
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3677
+++ b/js/src/nanojit/NativeSparc.cpp
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3678
@@ -46,9 +46,33 @@
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3679
 namespace nanojit
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3680
 {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3681
 #ifdef FEATURE_NANOJIT
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3682
+    class SafeUnderrunProtect
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3683
+    {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3684
+        public:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3685
+            SafeUnderrunProtect(Assembler* assembler, int n)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3686
+            {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3687
+                _nprotect = n;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3688
+                _assembler = assembler;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3689
+                _assembler->underrunProtect(n);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3690
+                _priorIns = _assembler->_nIns;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3691
+                _priorStart = _assembler->codeStart;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3692
+            };
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3693
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3694
+            ~SafeUnderrunProtect()
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3695
+            {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3696
+                NanoAssert(_priorStart == _assembler->codeStart);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3697
+                NanoAssert((intptr_t)_priorIns - (intptr_t)_assembler->_nIns <= _nprotect);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3698
+            };
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3699
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3700
+        private:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3701
+            int _nprotect;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3702
+            Assembler* _assembler;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3703
+            NIns* _priorIns;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3704
+            NIns* _priorStart;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3705
+    };
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3706
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3707
 #ifdef NJ_VERBOSE
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3708
-    const char *regNames[] = {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3709
+    const char* regNames[] = {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3710
         "%g0", "%g1", "%g2", "%g3", "%g4", "%g5", "%g6", "%g7",
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3711
         "%o0", "%o1", "%o2", "%o3", "%o4", "%o5", "%sp", "%o7",
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3712
         "%l0", "%l1", "%l2", "%l3", "%l4", "%l5", "%l6", "%l7",
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3713
@@ -78,13 +102,13 @@ namespace nanojit
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3714
     }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3715
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3716
     inline void Assembler::IntegerOperation
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3717
-        (Register rs1, Register rs2, Register rd, int32_t op3, const char *opcode) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3718
+        (Register rs1, Register rs2, Register rd, int32_t op3, const char* opcode) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3719
         Format_3_1(2, rd, op3, rs1, 0, rs2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3720
         asm_output("%s %s, %s, %s", opcode, gpn(rs1), gpn(rs2), gpn(rd));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3721
     }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3722
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3723
     inline void Assembler::IntegerOperationI
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3724
-        (Register rs1, int32_t simm13, Register rd, int32_t op3, const char *opcode) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3725
+        (Register rs1, int32_t simm13, Register rd, int32_t op3, const char* opcode) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3726
         Format_3_1I(2, rd, op3, rs1, simm13);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3727
         asm_output("%s %s, %d, %s", opcode, gpn(rs1), simm13, gpn(rd));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3728
     }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3729
@@ -126,9 +150,9 @@ namespace nanojit
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3730
         IntegerOperation(rs1, rs2, rd, 0x3, "xor");
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3731
     }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3732
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3733
-    inline void Assembler::Bicc(int32_t a, int32_t dsp22, int32_t cond, const char *opcode) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3734
+    inline void Assembler::Bicc(int32_t a, int32_t dsp22, int32_t cond, const char* opcode) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3735
         Format_2_2(a, cond, 0x2, dsp22);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3736
-        asm_output("%s 0x%x", opcode, _nIns + dsp22 - 1);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3737
+        asm_output("%s 0x%x", opcode, _nIns + dsp22);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3738
     }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3739
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3740
     inline void Assembler::BA  (int32_t a, int32_t dsp22) { Bicc(a, dsp22, 0x8, "ba");   }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3741
@@ -155,7 +179,7 @@ namespace nanojit
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3742
         asm_output("faddd %s, %s, %s", gpn(rs1), gpn(rs2), gpn(rd));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3743
     }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3744
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3745
-    inline void Assembler::FBfcc(int32_t a, int32_t dsp22, int32_t cond, const char *opcode) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3746
+    inline void Assembler::FBfcc(int32_t a, int32_t dsp22, int32_t cond, const char* opcode) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3747
         Format_2_2(a, cond, 0x6, dsp22);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3748
         asm_output("%s 0x%x", opcode, _nIns + dsp22 - 1);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3749
     }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3750
@@ -178,7 +202,7 @@ namespace nanojit
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3751
     }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3752
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3753
     inline void Assembler::FloatOperation
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3754
-        (Register rs1, Register rs2, Register rd, int32_t opf, const char *opcode) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3755
+        (Register rs1, Register rs2, Register rd, int32_t opf, const char* opcode) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3756
         Format_3_8(2, rd, 0x34, rs1, opf, rs2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3757
         if (rs1 != G0) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3758
           asm_output("%s %s, %s, %s", opcode, gpn(rs1), gpn(rs2), gpn(rd));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3759
@@ -346,13 +370,13 @@ namespace nanojit
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3760
     }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3761
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3762
     inline void Assembler::MOVcc
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3763
-        (Register rs, int32_t cc2, int32_t cc1, int32_t cc0, Register rd, int32_t cond, const char *opcode) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3764
+        (Register rs, int32_t cc2, int32_t cc1, int32_t cc0, Register rd, int32_t cond, const char* opcode) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3765
         Format_4_2(rd, 0x2c, cc2, cond, cc1, cc0, rs);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3766
         asm_output("%s %s, %s", opcode, gpn(rs), gpn(rd));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3767
     }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3768
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3769
     inline void Assembler::MOVccI
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3770
-        (int32_t simm11, int32_t cc2, int32_t cc1, int32_t cc0, Register rd, int32_t cond, const char *opcode) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3771
+        (int32_t simm11, int32_t cc2, int32_t cc1, int32_t cc0, Register rd, int32_t cond, const char* opcode) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3772
         Format_4_2I(rd, 0x2c, cc2, cond, cc1, cc0, simm11);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3773
         asm_output("%s 0x%x, %s", opcode, simm11, gpn(rd));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3774
     }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3775
@@ -385,7 +409,7 @@ namespace nanojit
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3776
     inline void Assembler::MOVFGI (int32_t simm11, Register rd) { MOVccI(simm11, 0, 0, 0, rd, 0x6, "movfg");  }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3777
     inline void Assembler::MOVFGEI(int32_t simm11, Register rd) { MOVccI(simm11, 0, 0, 0, rd, 0xb, "movfge"); }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3778
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3779
-    inline void Assembler::FMOVDcc(Register rs, int32_t opt_cc, Register rd, int32_t cond, const char *opcode) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3780
+    inline void Assembler::FMOVDcc(Register rs, int32_t opt_cc, Register rd, int32_t cond, const char* opcode) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3781
         Format_4_5(rd, 0x35, cond, opt_cc, 0x2, rs);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3782
         asm_output("%s %s, %s", opcode, gpn(rs), gpn(rd));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3783
     }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3784
@@ -555,24 +579,31 @@ namespace nanojit
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3785
     }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3786
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3787
     // general Assemble
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3788
-    inline void Assembler::JMP_long_nocheck(int32_t t) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3789
+    inline void Assembler::JMP_long(int32_t t) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3790
+        SafeUnderrunProtect protect(this, 16);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3791
+    /*    if (t) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3792
+            int32_t tt = ((intptr_t)t - (intptr_t)_nIns + 16) >> 2;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3793
+            if (isIMM22(tt)) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3794
+                NOP();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3795
+                NOP();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3796
+                NOP();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3797
+                BA(0,tt);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3798
+                return;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3799
+            }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3800
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3801
+*/
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3802
         NOP();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3803
         JMPL(G0, G2, G0);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3804
         ORI(G2, t & 0x3FF, G2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3805
         SETHI(t, G2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3806
     }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3807
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3808
-    inline void Assembler::JMP_long(int32_t t) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3809
-        underrunProtect(16);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3810
-        JMP_long_nocheck(t);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3811
-    }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3812
-
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3813
     inline void Assembler::JMP_long_placeholder() {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3814
         JMP_long(0);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3815
     }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3816
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3817
-    inline int32_t Assembler::JCC(void *t) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3818
-        underrunProtect(32);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3819
+    inline int32_t Assembler::JCC(void* t) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3820
+        SafeUnderrunProtect protect(this, 32);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3821
         int32_t tt = ((intptr_t)t - (intptr_t)_nIns + 8) >> 2;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3822
         if( !(isIMM22(tt)) ) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3823
             NOP();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3824
@@ -586,7 +617,7 @@ namespace nanojit
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3825
         return tt;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3826
     }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3827
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3828
-    void Assembler::JMP(void *t) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3829
+    void Assembler::JMP(void* t) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3830
         if (!t) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3831
             JMP_long_placeholder();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3832
         } else {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3833
@@ -596,7 +627,6 @@ namespace nanojit
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3834
     }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3835
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3836
     void Assembler::MR(Register rd, Register rs) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3837
-        underrunProtect(4);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3838
         ORI(rs, 0, rd);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3839
     }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3840
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3841
@@ -613,7 +643,7 @@ namespace nanojit
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3842
         /**
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3843
          * Prologue
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3844
          */
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3845
-        underrunProtect(16);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3846
+        SafeUnderrunProtect protect(this, 28);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3847
         uint32_t stackNeeded = STACK_GRANULARITY * _activation.stackSlotsNeeded();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3848
         uint32_t frameSize = stackNeeded + kcalleeAreaSize + kLinkageAreaSize;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3849
         frameSize = BIT_ROUND_UP(frameSize, 8);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3850
@@ -631,7 +661,7 @@ namespace nanojit
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3851
             outputf("        0x%x:",_nIns);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3852
             outputf("        patch entry:");
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3853
         })
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3854
-        NIns *patchEntry = _nIns;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3855
+        NIns* patchEntry = _nIns;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3856
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3857
         // The frame size in SAVE is faked. We will still re-caculate SP later.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3858
         // We can use 0 here but it is not good for debuggers.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3859
@@ -643,7 +673,8 @@ namespace nanojit
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3860
         return patchEntry;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3861
     }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3862
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3863
-    void Assembler::asm_align_code() {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3864
+    void Assembler::asm_align_code()
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3865
+    {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3866
         while(uintptr_t(_nIns) & 15) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3867
             NOP();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3868
         }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3869
@@ -652,30 +683,27 @@ namespace nanojit
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3870
     void Assembler::nFragExit(LIns* guard)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3871
     {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3872
         SideExit* exit = guard->record()->exit;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3873
-        Fragment *frag = exit->target;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3874
-        GuardRecord *lr;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3875
-        if (frag && frag->fragEntry)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3876
-            {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3877
-                JMP(frag->fragEntry);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3878
-                lr = 0;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3879
-            }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3880
-        else
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3881
-            {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3882
-                // Target doesn't exit yet. Emit jump to epilog, and set up to patch later.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3883
-                if (!_epilogue)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3884
-                    _epilogue = genEpilogue();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3885
-                lr = guard->record();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3886
-                JMP_long((intptr_t)_epilogue);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3887
-                lr->jmp = _nIns;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3888
-            }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3889
+        Fragment* frag = exit->target;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3890
+        GuardRecord* lr;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3891
+        if (frag && frag->fragEntry) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3892
+            JMP(frag->fragEntry);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3893
+            lr = 0;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3894
+        } else {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3895
+            // Target doesn't exit yet. Emit jump to epilog, and set up to patch later.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3896
+            if (!_epilogue)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3897
+                _epilogue = genEpilogue();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3898
+            lr = guard->record();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3899
+            JMP_long((intptr_t)_epilogue);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3900
+            lr->jmp = _nIns;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3901
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3902
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3903
         // return value is GuardRecord*
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3904
         SET32(int(lr), O0);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3905
     }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3906
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3907
-    NIns *Assembler::genEpilogue()
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3908
+    NIns* Assembler::genEpilogue()
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3909
     {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3910
-        underrunProtect(12);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3911
+        SafeUnderrunProtect protect(this, 12);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3912
         RESTORE(G0, G0, G0); //restore
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3913
         JMPLI(I7, 8, G0); //ret
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3914
         ORI(O0, 0, I0);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3915
@@ -685,19 +713,15 @@ namespace nanojit
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3916
     void Assembler::asm_call(LIns* ins)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3917
     {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3918
         if (!ins->isop(LIR_callv)) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3919
-            Register retReg = ( ins->isop(LIR_calld) ? F0 : retRegs[0] );
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3920
-            deprecated_prepResultReg(ins, rmask(retReg));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3921
+            Register retReg = (ins->isop(LIR_calld) ? F0 : retRegs[0]);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3922
+            prepareResultReg(ins, rmask(retReg));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3923
+            evictScratchRegsExcept(rmask(retReg));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3924
+        } else {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3925
+            evictScratchRegsExcept(0);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3926
         }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3927
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3928
-        // Do this after we've handled the call result, so we don't
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3929
-        // force the call result to be spilled unnecessarily.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3930
-        evictScratchRegsExcept(0);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3931
-
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3932
         const CallInfo* ci = ins->callInfo();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3933
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3934
-        underrunProtect(8);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3935
-        NOP();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3936
-
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3937
         ArgType argTypes[MAXARGS];
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3938
         uint32_t argc = ci->getArgTypes(argTypes);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3939
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3940
@@ -705,53 +729,59 @@ namespace nanojit
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3941
                    ins->isop(LIR_calld));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3942
         verbose_only(if (_logc->lcbits & LC_Native)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3943
                      outputf("        0x%x:", _nIns);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3944
-                     )
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3945
+                    )
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3946
         bool indirect = ci->isIndirect();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3947
-        if (!indirect) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3948
-            CALL(ci);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3949
-        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3950
-        else {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3951
-            argc--;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3952
-            Register r = findSpecificRegFor(ins->arg(argc), I0);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3953
-            JMPL(G0, I0, O7);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3954
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3955
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3956
+            SafeUnderrunProtect protect(this, 8);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3957
+            NOP();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3958
+            if (!indirect) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3959
+                CALL(ci);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3960
+            }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3961
+            else {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3962
+                argc--;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3963
+                Register r = findSpecificRegFor(ins->arg(argc), I0);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3964
+                JMPL(G0, I0, O7);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3965
+            }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3966
         }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3967
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3968
+        freeResourcesOf(ins);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3969
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3970
         Register GPRIndex = O0;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3971
         uint32_t offset = kLinkageAreaSize; // start of parameters stack postion.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3972
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3973
-        for(int i=0; i<argc; i++)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3974
-            {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3975
-                uint32_t j = argc-i-1;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3976
-                ArgType ty = argTypes[j];
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3977
-                if (ty == ARGTYPE_D) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3978
-                    Register r = findRegFor(ins->arg(j), FpRegs);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3979
-
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3980
-                    underrunProtect(48);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3981
-                    // We might be calling a varargs function.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3982
-                    // So, make sure the GPR's are also loaded with
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3983
-                    // the value, or the stack contains it.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3984
-                    if (GPRIndex <= O5) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3985
-                        LDSW32(SP, offset, GPRIndex);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3986
-                    }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3987
-                    GPRIndex = GPRIndex + 1;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3988
-                    if (GPRIndex <= O5) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3989
-                        LDSW32(SP, offset+4, GPRIndex);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3990
-                    }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3991
-                    GPRIndex = GPRIndex + 1;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3992
-                    STDF32(r, offset, SP);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3993
-                    offset += 8;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3994
+        for (int i = 0; i < argc; i++) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3995
+            uint32_t j = argc-i-1;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3996
+            ArgType ty = argTypes[j];
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3997
+            if (ty == ARGTYPE_D) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3998
+                Register r = findRegFor(ins->arg(j), FpRegs);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  3999
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4000
+                SafeUnderrunProtect protect(this, 48);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4001
+                // We might be calling a varargs function.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4002
+                // So, make sure the GPR's are also loaded with
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4003
+                // the value, or the stack contains it.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4004
+                if (GPRIndex <= O5) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4005
+                    LDSW32(SP, offset, GPRIndex);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4006
+                }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4007
+                GPRIndex = GPRIndex + 1;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4008
+                if (GPRIndex <= O5) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4009
+                    LDSW32(SP, offset+4, GPRIndex);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4010
+                }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4011
+                GPRIndex = GPRIndex + 1;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4012
+                STDF32(r, offset, SP);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4013
+                offset += 8;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4014
+            } else {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4015
+                if (GPRIndex > O5) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4016
+                    SafeUnderrunProtect protect(this, 12);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4017
+                    Register r = findRegFor(ins->arg(j), GpRegs);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4018
+                    STW32(r, offset, SP);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4019
                 } else {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4020
-                    if (GPRIndex > O5) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4021
-                        underrunProtect(12);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4022
-                        Register r = findRegFor(ins->arg(j), GpRegs);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4023
-                        STW32(r, offset, SP);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4024
-                    } else {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4025
-                        Register r = findSpecificRegFor(ins->arg(j), GPRIndex);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4026
-                    }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4027
-                    GPRIndex = GPRIndex + 1;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4028
-                    offset += 4;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4029
+                    Register r = findSpecificRegFor(ins->arg(j), GPRIndex);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4030
                 }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4031
+                GPRIndex = GPRIndex + 1;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4032
+                offset += 4;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4033
             }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4034
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4035
     }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4036
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4037
     Register Assembler::nRegisterAllocFromSet(RegisterMask set)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4038
@@ -772,10 +802,16 @@ namespace nanojit
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4039
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4040
     void Assembler::nPatchBranch(NIns* branch, NIns* location)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4041
     {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4042
-        *(uint32_t*)&branch[0] &= 0xFFC00000;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4043
-        *(uint32_t*)&branch[0] |= ((intptr_t)location >> 10) & 0x3FFFFF;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4044
-        *(uint32_t*)&branch[1] &= 0xFFFFFC00;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4045
-        *(uint32_t*)&branch[1] |= (intptr_t)location & 0x3FF;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4046
+        intptr_t addr_diff = ((intptr_t)location - (intptr_t)branch) >> 2;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4047
+        if ( !isIMM22(addr_diff)) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4048
+            *(uint32_t*)&branch[0] = 0x05000000 | ((intptr_t)location >> 10) & 0x3FFFFF; // sethi ..., %g2
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4049
+            *(uint32_t*)&branch[1] = 0x8410a000 | (intptr_t)location & 0x3FF; // bset ..., %g2
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4050
+            *(uint32_t*)&branch[2] = 0x81c00002; // jmp %g2
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4051
+        } else {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4052
+            *(uint32_t*)&branch[0] = 0x10800000 | (addr_diff & 0x3FFFFF); // ba
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4053
+            *(uint32_t*)&branch[1] = 0x01000000; // nop
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4054
+            *(uint32_t*)&branch[2] = 0x01000000; // nop
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4055
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4056
     }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4057
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4058
     RegisterMask Assembler::nHint(LIns* ins)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4059
@@ -792,10 +828,10 @@ namespace nanojit
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4060
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4061
     void Assembler::asm_restore(LIns* i, Register r)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4062
     {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4063
-        underrunProtect(24);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4064
+        SafeUnderrunProtect protect(this, 24);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4065
         if (i->isop(LIR_allocp)) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4066
             ADD(FP, L2, r);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4067
-            int32_t d = deprecated_disp(i);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4068
+            int32_t d = arDisp(i);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4069
             SET32(d, L2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4070
         }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4071
         else if (i->isImmI()) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4072
@@ -811,7 +847,7 @@ namespace nanojit
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4073
         }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4074
     }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4075
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4076
-    void Assembler::asm_store32(LOpcode op, LIns *value, int dr, LIns *base)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4077
+    void Assembler::asm_store32(LOpcode op, LIns* value, int dr, LIns* base)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4078
     {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4079
         switch (op) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4080
             case LIR_sti:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4081
@@ -824,53 +860,38 @@ namespace nanojit
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4082
                 return;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4083
         }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4084
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4085
-        underrunProtect(20);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4086
-        if (value->isImmI())
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4087
-            {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4088
-                Register rb = getBaseReg(base, dr, GpRegs);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4089
-                int c = value->immI();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4090
-                switch (op) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4091
-                case LIR_sti:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4092
-                    STW32(L2, dr, rb);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4093
-                    break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4094
-                case LIR_sti2c:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4095
-                    STB32(L2, dr, rb);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4096
-                    break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4097
-                case LIR_sti2s:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4098
-                    STH32(L2, dr, rb);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4099
-                    break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4100
-                }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4101
-                SET32(c, L2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4102
+        SafeUnderrunProtect protect(this, 20);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4103
+        if (value->isImmI()) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4104
+            Register rb = getBaseReg(base, dr, GpRegs);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4105
+            int c = value->immI();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4106
+            switch (op) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4107
+                case LIR_sti:   STW32(L2, dr, rb); break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4108
+                case LIR_sti2c: STB32(L2, dr, rb); break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4109
+                case LIR_sti2s: STH32(L2, dr, rb); break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4110
             }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4111
-        else
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4112
-            {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4113
-                // make sure what is in a register
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4114
-                Register ra, rb;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4115
-                if (base->isImmI()) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4116
-                    // absolute address
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4117
-                    dr += base->immI();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4118
-                    ra = findRegFor(value, GpRegs);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4119
-                    rb = G0;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4120
-                } else {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4121
-                    getBaseReg2(GpRegs, value, ra, GpRegs, base, rb, dr);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4122
-                }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4123
-                switch (op) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4124
-                case LIR_sti:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4125
-                    STW32(ra, dr, rb);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4126
-                    break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4127
-                case LIR_sti2c:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4128
-                    STB32(ra, dr, rb);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4129
-                    break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4130
-                case LIR_sti2s:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4131
-                    STH32(ra, dr, rb);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4132
-                    break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4133
-                }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4134
+            SET32(c, L2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4135
+        } else {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4136
+            // make sure what is in a register
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4137
+            Register ra, rb;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4138
+            if (base->isImmI()) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4139
+                // absolute address
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4140
+                dr += base->immI();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4141
+                ra = findRegFor(value, GpRegs);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4142
+                rb = G0;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4143
+            } else {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4144
+                getBaseReg2(GpRegs, value, ra, GpRegs, base, rb, dr);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4145
+            }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4146
+            switch (op) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4147
+                case LIR_sti:   STW32(ra, dr, rb); break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4148
+                case LIR_sti2c: STB32(ra, dr, rb); break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4149
+                case LIR_sti2s: STH32(ra, dr, rb); break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4150
             }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4151
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4152
     }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4153
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4154
     void Assembler::asm_spill(Register rr, int d, bool quad)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4155
     {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4156
-        underrunProtect(24);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4157
+        SafeUnderrunProtect protect(this, 24);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4158
         (void)quad;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4159
         NanoAssert(d);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4160
         if (rmask(rr) & FpRegs) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4161
@@ -892,7 +913,7 @@ namespace nanojit
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4162
                 return;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4163
         }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4164
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4165
-        underrunProtect(48);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4166
+        SafeUnderrunProtect protect(this, 48);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4167
         LIns* base = ins->oprnd1();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4168
         int db = ins->disp();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4169
         Register rb = getBaseReg(base, db, GpRegs);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4170
@@ -937,7 +958,7 @@ namespace nanojit
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4171
                 return;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4172
         }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4173
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4174
-        underrunProtect(48);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4175
+        SafeUnderrunProtect protect(this, 48);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4176
         Register rb = getBaseReg(base, dr, GpRegs);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4177
         if (op == LIR_std2f) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4178
             Register rv = ( !value->isInReg()
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4179
@@ -949,32 +970,30 @@ namespace nanojit
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4180
             return;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4181
         }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4182
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4183
-        if (value->isImmD())
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4184
-            {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4185
-                // if a constant 64-bit value just store it now rather than
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4186
-                // generating a pointless store/load/store sequence
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4187
-                STW32(L2, dr+4, rb);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4188
-                SET32(value->immDlo(), L2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4189
-                STW32(L2, dr, rb);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4190
-                SET32(value->immDhi(), L2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4191
-                return;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4192
-            }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4193
+        if (value->isImmD()) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4194
+            // if a constant 64-bit value just store it now rather than
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4195
+            // generating a pointless store/load/store sequence
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4196
+            STW32(L2, dr+4, rb);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4197
+            SET32(value->immDlo(), L2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4198
+            STW32(L2, dr, rb);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4199
+            SET32(value->immDhi(), L2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4200
+            return;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4201
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4202
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4203
-        if (value->isop(LIR_ldd))
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4204
-            {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4205
-                // value is 64bit struct or int64_t, or maybe a double.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4206
-                // it may be live in an FPU reg.  Either way, don't
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4207
-                // put it in an FPU reg just to load & store it.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4208
+        if (value->isop(LIR_ldd)) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4209
+            // value is 64bit struct or int64_t, or maybe a double.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4210
+            // it may be live in an FPU reg.  Either way, don't
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4211
+            // put it in an FPU reg just to load & store it.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4212
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4213
-                // a) if we know it's not a double, this is right.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4214
-                // b) if we guarded that its a double, this store could be on
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4215
-                // the side exit, copying a non-double.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4216
-                // c) maybe its a double just being stored.  oh well.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4217
+            // a) if we know it's not a double, this is right.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4218
+            // b) if we guarded that its a double, this store could be on
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4219
+            // the side exit, copying a non-double.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4220
+            // c) maybe its a double just being stored.  oh well.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4221
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4222
-                int da = findMemFor(value);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4223
-                asm_mmq(rb, dr, FP, da);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4224
-                return;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4225
-            }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4226
+            int da = findMemFor(value);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4227
+             asm_mmq(rb, dr, FP, da);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4228
+             return;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4229
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4230
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4231
         // if value already in a reg, use that, otherwise
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4232
         // get it into FPU regs.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4233
@@ -1005,66 +1024,56 @@ namespace nanojit
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4234
         NIns* at = 0;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4235
         LOpcode condop = cond->opcode();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4236
         NanoAssert(cond->isCmp());
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4237
-        if (isCmpDOpcode(condop))
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4238
-            {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4239
-                return asm_branchd(branchOnFalse, cond, targ);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4240
-            }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4241
-
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4242
-        underrunProtect(32);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4243
-        intptr_t tt = ((intptr_t)targ - (intptr_t)_nIns + 8) >> 2;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4244
-        // !targ means that it needs patch.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4245
-        if( !(isIMM22((int32_t)tt)) || !targ ) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4246
-            JMP_long_nocheck((intptr_t)targ);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4247
-            at = _nIns;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4248
-            NOP();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4249
-            BA(0, 5);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4250
-            tt = 4;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4251
+        if (isCmpDOpcode(condop)) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4252
+            return asm_branchd(branchOnFalse, cond, targ);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4253
         }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4254
-        NOP();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4255
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4256
-        // produce the branch
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4257
-        if (branchOnFalse)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4258
-            {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4259
-                if (condop == LIR_eqi)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4260
-                    BNE(0, tt);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4261
-                else if (condop == LIR_lti)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4262
-                    BGE(0, tt);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4263
-                else if (condop == LIR_lei)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4264
-                    BG(0, tt);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4265
-                else if (condop == LIR_gti)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4266
-                    BLE(0, tt);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4267
-                else if (condop == LIR_gei)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4268
-                    BL(0, tt);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4269
-                else if (condop == LIR_ltui)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4270
-                    BCC(0, tt);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4271
-                else if (condop == LIR_leui)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4272
-                    BGU(0, tt);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4273
-                else if (condop == LIR_gtui)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4274
-                    BLEU(0, tt);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4275
-                else //if (condop == LIR_geui)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4276
-                    BCS(0, tt);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4277
+        {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4278
+            SafeUnderrunProtect protect(this, 32);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4279
+            intptr_t tt = ((intptr_t)targ - (intptr_t)_nIns + 8) >> 2;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4280
+            // !targ means that it needs patch.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4281
+            if( !(isIMM22((int32_t)tt)) || !targ ) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4282
+                JMP_long((intptr_t)targ);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4283
+                at = _nIns;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4284
+                NOP();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4285
+                BA(0, 5);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4286
+                tt = 4;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4287
             }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4288
-        else // op == LIR_xt
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4289
-            {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4290
-                if (condop == LIR_eqi)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4291
-                    BE(0, tt);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4292
-                else if (condop == LIR_lti)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4293
-                    BL(0, tt);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4294
-                else if (condop == LIR_lei)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4295
-                    BLE(0, tt);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4296
-                else if (condop == LIR_gti)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4297
-                    BG(0, tt);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4298
-                else if (condop == LIR_gei)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4299
-                    BGE(0, tt);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4300
-                else if (condop == LIR_ltui)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4301
-                    BCS(0, tt);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4302
-                else if (condop == LIR_leui)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4303
-                    BLEU(0, tt);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4304
-                else if (condop == LIR_gtui)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4305
-                    BGU(0, tt);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4306
-                else //if (condop == LIR_geui)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4307
-                    BCC(0, tt);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4308
+            NOP();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4309
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4310
+            // produce the branch
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4311
+            if (branchOnFalse) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4312
+                switch (condop) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4313
+                    case LIR_eqi : BNE (0, tt); break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4314
+                    case LIR_lti : BGE (0, tt); break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4315
+                    case LIR_lei : BG  (0, tt); break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4316
+                    case LIR_gti : BLE (0, tt); break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4317
+                    case LIR_gei : BL  (0, tt); break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4318
+                    case LIR_ltui: BCC (0, tt); break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4319
+                    case LIR_leui: BGU (0, tt); break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4320
+                    case LIR_gtui: BLEU(0, tt); break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4321
+                    case LIR_geui: BCS (0, tt); break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4322
+                    default:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4323
+                        NanoAssertMsg(0, "asm_branch should never receive this cond opcode");
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4324
+                        return;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4325
+                }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4326
+            } else {// op == LIR_xt
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4327
+                switch (condop) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4328
+                    case LIR_eqi : BE  (0, tt); break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4329
+                    case LIR_lti : BL  (0, tt); break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4330
+                    case LIR_lei : BLE (0, tt); break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4331
+                    case LIR_gti : BG  (0, tt); break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4332
+                    case LIR_gei : BGE (0, tt); break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4333
+                    case LIR_ltui: BCS (0, tt); break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4334
+                    case LIR_leui: BLEU(0, tt); break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4335
+                    case LIR_gtui: BGU (0, tt); break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4336
+                    case LIR_geui: BCC (0, tt); break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4337
+                    default:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4338
+                        NanoAssertMsg(0, "asm_branch should never receive this cond opcode");
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4339
+                        return;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4340
+                }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4341
             }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4342
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4343
         asm_cmp(cond);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4344
         return at;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4345
     }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4346
@@ -1072,11 +1081,11 @@ namespace nanojit
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4347
     NIns* Assembler::asm_branch_ov(LOpcode op, NIns* targ)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4348
     {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4349
         NIns* at = 0;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4350
-        underrunProtect(32);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4351
+        SafeUnderrunProtect protect(this, 32);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4352
         intptr_t tt = ((intptr_t)targ - (intptr_t)_nIns + 8) >> 2;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4353
         // !targ means that it needs patch.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4354
-        if( !(isIMM22((int32_t)tt)) || !targ ) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4355
-            JMP_long_nocheck((intptr_t)targ);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4356
+        if (!(isIMM22((int32_t)tt)) || !targ) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4357
+            JMP_long((intptr_t)targ);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4358
             at = _nIns;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4359
             NOP();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4360
             BA(0, 5);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4361
@@ -1084,242 +1093,264 @@ namespace nanojit
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4362
         }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4363
         NOP();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4364
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4365
-        if( op == LIR_mulxovi || op == LIR_muljovi )
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4366
+        if (op == LIR_mulxovi || op == LIR_muljovi)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4367
             BNE(0, tt);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4368
         else
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4369
             BVS(0, tt);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4370
         return at;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4371
     }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4372
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4373
-    void Assembler::asm_cmp(LIns *cond)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4374
+    void Assembler::asm_cmp(LIns* cond)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4375
     {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4376
-        underrunProtect(12);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4377
-
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4378
         LIns* lhs = cond->oprnd1();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4379
         LIns* rhs = cond->oprnd2();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4380
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4381
         NanoAssert(lhs->isI() && rhs->isI());
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4382
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4383
         // ready to issue the compare
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4384
-        if (rhs->isImmI())
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4385
-            {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4386
-                int c = rhs->immI();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4387
-                Register r = findRegFor(lhs, GpRegs);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4388
-                if (c == 0 && cond->isop(LIR_eqi)) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4389
-                    ANDCC(r, r, G0);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4390
-                }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4391
-                else {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4392
-                    SUBCC(r, L2, G0);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4393
-                    SET32(c, L2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4394
-                }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4395
-            }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4396
-        else
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4397
-            {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4398
-                Register ra, rb;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4399
-                findRegFor2(GpRegs, lhs, ra, GpRegs, rhs, rb);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4400
-                SUBCC(ra, rb, G0);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4401
+        if (rhs->isImmI()) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4402
+            int c = rhs->immI();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4403
+            Register r = findRegFor(lhs, GpRegs);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4404
+            SafeUnderrunProtect protect(this, 12);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4405
+            if (c == 0 && cond->isop(LIR_eqi)) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4406
+                ANDCC(r, r, G0);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4407
+            } else {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4408
+                SUBCC(r, L2, G0);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4409
+                SET32(c, L2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4410
             }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4411
+        } else {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4412
+            Register ra, rb;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4413
+            findRegFor2(GpRegs, lhs, ra, GpRegs, rhs, rb);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4414
+            SUBCC(ra, rb, G0);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4415
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4416
     }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4417
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4418
     void Assembler::asm_condd(LIns* ins)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4419
     {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4420
         // only want certain regs
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4421
-        Register r = deprecated_prepResultReg(ins, AllowableFlagRegs);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4422
-        underrunProtect(8);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4423
+        Register r = prepareResultReg(ins, AllowableFlagRegs);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4424
+        SafeUnderrunProtect protect(this, 12);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4425
         LOpcode condop = ins->opcode();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4426
         NanoAssert(isCmpDOpcode(condop));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4427
-        if (condop == LIR_eqd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4428
-            MOVFEI(1, r);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4429
-        else if (condop == LIR_led)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4430
-            MOVFLEI(1, r);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4431
-        else if (condop == LIR_ltd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4432
-            MOVFLI(1, r);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4433
-        else if (condop == LIR_ged)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4434
-            MOVFGEI(1, r);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4435
-        else // if (condop == LIR_gtd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4436
-            MOVFGI(1, r);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4437
+        switch (condop) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4438
+            case LIR_eqd: MOVFEI (1, r); break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4439
+            case LIR_led: MOVFLEI(1, r); break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4440
+            case LIR_ltd: MOVFLI (1, r); break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4441
+            case LIR_ged: MOVFGEI(1, r); break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4442
+            case LIR_gtd: MOVFGI (1, r); break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4443
+            default:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4444
+                NanoAssertMsg(0, "asm_condd should never receive this cond opcode");
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4445
+                return;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4446
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4447
         ORI(G0, 0, r);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4448
+        freeResourcesOf(ins);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4449
         asm_cmpd(ins);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4450
     }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4451
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4452
     void Assembler::asm_cond(LIns* ins)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4453
     {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4454
-        underrunProtect(8);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4455
         // only want certain regs
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4456
-        LOpcode op = ins->opcode();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4457
-        Register r = deprecated_prepResultReg(ins, AllowableFlagRegs);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4458
-
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4459
-        if (op == LIR_eqi)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4460
-            MOVEI(1, r);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4461
-        else if (op == LIR_lti)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4462
-            MOVLI(1, r);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4463
-        else if (op == LIR_lei)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4464
-            MOVLEI(1, r);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4465
-        else if (op == LIR_gti)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4466
-            MOVGI(1, r);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4467
-        else if (op == LIR_gei)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4468
-            MOVGEI(1, r);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4469
-        else if (op == LIR_ltui)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4470
-            MOVCSI(1, r);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4471
-        else if (op == LIR_leui)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4472
-            MOVLEUI(1, r);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4473
-        else if (op == LIR_gtui)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4474
-            MOVGUI(1, r);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4475
-        else // if (op == LIR_geui)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4476
-            MOVCCI(1, r);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4477
+        LOpcode condop = ins->opcode();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4478
+        Register r = prepareResultReg(ins, AllowableFlagRegs);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4479
+        SafeUnderrunProtect protect(this, 20);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4480
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4481
+        switch (condop) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4482
+            case LIR_eqi : MOVEI  (1, r); break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4483
+            case LIR_lti : MOVLI  (1, r); break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4484
+            case LIR_lei : MOVLEI (1, r); break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4485
+            case LIR_gti : MOVGI  (1, r); break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4486
+            case LIR_gei : MOVGEI (1, r); break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4487
+            case LIR_ltui: MOVCSI (1, r); break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4488
+            case LIR_leui: MOVLEUI(1, r); break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4489
+            case LIR_gtui: MOVGUI (1, r); break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4490
+            case LIR_geui: MOVCCI (1, r); break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4491
+            default:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4492
+                NanoAssertMsg(0, "asm_cond should never receive this cond opcode");
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4493
+                return;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4494
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4495
         ORI(G0, 0, r);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4496
+        freeResourcesOf(ins);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4497
         asm_cmp(ins);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4498
     }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4499
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4500
     void Assembler::asm_arith(LIns* ins)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4501
     {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4502
-        underrunProtect(28);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4503
+        SafeUnderrunProtect protect(this, 28);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4504
         LOpcode op = ins->opcode();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4505
         LIns* lhs = ins->oprnd1();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4506
         LIns* rhs = ins->oprnd2();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4507
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4508
-        Register rb = deprecated_UnknownReg;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4509
+        Register rb;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4510
         RegisterMask allow = GpRegs;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4511
         bool forceReg = (op == LIR_muli || op == LIR_mulxovi || op == LIR_muljovi || !rhs->isImmI());
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4512
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4513
-        if (lhs != rhs && forceReg)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4514
-            {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4515
-                if ((rb = asm_binop_rhs_reg(ins)) == deprecated_UnknownReg) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4516
-                    rb = findRegFor(rhs, allow);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4517
-                }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4518
-                allow &= ~rmask(rb);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4519
-            }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4520
-        else if ((op == LIR_addi || op == LIR_addxovi || op == LIR_addjovi) && lhs->isop(LIR_allocp) && rhs->isImmI()) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4521
+        if (lhs != rhs && forceReg) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4522
+            rb = findRegFor(rhs, allow);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4523
+            allow &= ~rmask(rb);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4524
+        } else if ((op == LIR_addi || op == LIR_addxovi || op == LIR_addjovi) && lhs->isop(LIR_allocp) && rhs->isImmI()) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4525
             // add alloc+const, use lea
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4526
-            Register rr = deprecated_prepResultReg(ins, allow);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4527
+            Register rr = prepareResultReg(ins, allow);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4528
             int d = findMemFor(lhs) + rhs->immI();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4529
+            SafeUnderrunProtect protect(this, 12);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4530
             ADD(FP, L2, rr);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4531
             SET32(d, L2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4532
+            freeResourcesOf(ins);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4533
             return;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4534
         }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4535
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4536
-        Register rr = deprecated_prepResultReg(ins, allow);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4537
-        // if this is last use of lhs in reg, we can re-use result reg
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4538
-        // else, lhs already has a register assigned.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4539
-        Register ra = ( !lhs->isInReg()
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4540
-                      ? findSpecificRegFor(lhs, rr)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4541
-                      : lhs->deprecated_getReg() );
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4542
+        Register rr = prepareResultReg(ins, allow);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4543
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4544
-        if (forceReg)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4545
-            {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4546
-                if (lhs == rhs)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4547
-                    rb = ra;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4548
+        // If 'lhs' isn't in a register, it can be clobbered by 'ins'.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4549
+        Register ra = lhs->isInReg() ? lhs->getReg() : rr;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4550
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4551
+        if (forceReg) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4552
+            if (lhs == rhs)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4553
+                rb = ra;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4554
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4555
-                if (op == LIR_addi || op == LIR_addxovi || op == LIR_addjovi)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4556
+            switch (op) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4557
+                case LIR_addi:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4558
+                case LIR_addxovi:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4559
+                case LIR_addjovi:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4560
                     ADDCC(rr, rb, rr);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4561
-                else if (op == LIR_subi || op == LIR_subxovi || op == LIR_subjovi)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4562
+                    break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4563
+                case LIR_subi:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4564
+                case LIR_subxovi:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4565
+                case LIR_subjovi:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4566
                     SUBCC(rr, rb, rr);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4567
-                else if (op == LIR_muli)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4568
+                    break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4569
+                case LIR_muli:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4570
                     SMULCC(rr, rb, rr);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4571
-                else if (op == LIR_mulxovi || op == LIR_muljovi) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4572
+                    break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4573
+                case LIR_mulxovi:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4574
+                case LIR_muljovi:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4575
                     SUBCC(L4, L6, L4);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4576
                     SRAI(rr, 31, L6);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4577
                     RDY(L4);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4578
                     SMULCC(rr, rb, rr);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4579
-                }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4580
-                else if (op == LIR_andi)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4581
+                    break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4582
+                case LIR_andi:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4583
                     AND(rr, rb, rr);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4584
-                else if (op == LIR_ori)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4585
+                    break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4586
+                case LIR_ori:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4587
                     OR(rr, rb, rr);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4588
-                else if (op == LIR_xori)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4589
+                    break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4590
+                case LIR_xori:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4591
                     XOR(rr, rb, rr);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4592
-                else if (op == LIR_lshi)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4593
+                    break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4594
+                case LIR_lshi:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4595
                     SLL(rr, rb, rr);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4596
-                else if (op == LIR_rshi)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4597
+                    break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4598
+                case LIR_rshi:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4599
                     SRA(rr, rb, rr);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4600
-                else if (op == LIR_rshui)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4601
+                    break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4602
+                case LIR_rshui:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4603
                     SRL(rr, rb, rr);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4604
-                else
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4605
+                    break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4606
+                default:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4607
                     NanoAssertMsg(0, "Unsupported");
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4608
+                    return;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4609
             }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4610
-        else
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4611
-            {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4612
-                int c = rhs->immI();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4613
-                if (op == LIR_addi || op == LIR_addxovi || op == LIR_addjovi)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4614
+        } else {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4615
+            int c = rhs->immI();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4616
+            switch (op) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4617
+                case LIR_addi:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4618
+                case LIR_addxovi:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4619
+                case LIR_addjovi:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4620
                     ADDCC(rr, L2, rr);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4621
-                else if (op == LIR_subi || op == LIR_subxovi || op == LIR_subjovi)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4622
+                    break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4623
+                case LIR_subi:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4624
+                case LIR_subxovi:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4625
+                case LIR_subjovi:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4626
                     SUBCC(rr, L2, rr);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4627
-                else if (op == LIR_andi)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4628
+                    break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4629
+                case LIR_andi:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4630
                     AND(rr, L2, rr);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4631
-                else if (op == LIR_ori)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4632
+                    break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4633
+                case LIR_ori:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4634
                     OR(rr, L2, rr);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4635
-                else if (op == LIR_xori)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4636
+                    break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4637
+                case LIR_xori:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4638
                     XOR(rr, L2, rr);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4639
-                else if (op == LIR_lshi)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4640
+                    break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4641
+                case LIR_lshi:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4642
                     SLL(rr, L2, rr);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4643
-                else if (op == LIR_rshi)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4644
+                    break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4645
+                case LIR_rshi:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4646
                     SRA(rr, L2, rr);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4647
-                else if (op == LIR_rshui)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4648
+                    break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4649
+                case LIR_rshui:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4650
                     SRL(rr, L2, rr);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4651
-                else
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4652
+                    break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4653
+                default:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4654
                     NanoAssertMsg(0, "Unsupported");
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4655
-                SET32(c, L2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4656
+                    return;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4657
             }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4658
+            SET32(c, L2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4659
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4660
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4661
-        if ( rr != ra )
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4662
+        if (rr != ra)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4663
             ORI(ra, 0, rr);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4664
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4665
+        freeResourcesOf(ins);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4666
+        if (!lhs->isInReg()) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4667
+            NanoAssert(ra == rr);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4668
+            findSpecificRegForUnallocated(lhs, ra);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4669
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4670
     }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4671
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4672
     void Assembler::asm_neg_not(LIns* ins)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4673
     {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4674
-        underrunProtect(8);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4675
         LOpcode op = ins->opcode();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4676
-        Register rr = deprecated_prepResultReg(ins, GpRegs);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4677
+        Register rr = prepareResultReg(ins, GpRegs);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4678
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4679
+        SafeUnderrunProtect protect(this, 16);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4680
         LIns* lhs = ins->oprnd1();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4681
-        // if this is last use of lhs in reg, we can re-use result reg
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4682
-        // else, lhs already has a register assigned.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4683
-        Register ra = ( !lhs->isInReg()
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4684
-                      ? findSpecificRegFor(lhs, rr)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4685
-                      : lhs->deprecated_getReg() );
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4686
+        // If 'lhs' isn't in a register, it can be clobbered by 'ins'.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4687
+        Register ra = lhs->isInReg() ? lhs->getReg() : rr;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4688
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4689
         if (op == LIR_noti)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4690
             ORN(G0, rr, rr);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4691
         else
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4692
             SUB(G0, rr, rr);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4693
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4694
-        if ( rr != ra )
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4695
+        if (rr != ra)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4696
             ORI(ra, 0, rr);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4697
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4698
+        freeResourcesOf(ins);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4699
+        if (!lhs->isInReg()) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4700
+            NanoAssert(ra == rr);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4701
+            findSpecificRegForUnallocated(lhs, ra);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4702
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4703
     }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4704
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4705
     void Assembler::asm_load32(LIns* ins)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4706
     {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4707
-        underrunProtect(12);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4708
         LOpcode op = ins->opcode();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4709
         LIns* base = ins->oprnd1();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4710
         int d = ins->disp();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4711
-        Register rr = deprecated_prepResultReg(ins, GpRegs);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4712
+        Register rr = prepareResultReg(ins, GpRegs);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4713
         Register ra = getBaseReg(base, d, GpRegs);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4714
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4715
+        SafeUnderrunProtect protect(this, 12);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4716
         switch(op) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4717
-            case LIR_lduc2ui:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4718
-                LDUB32(ra, d, rr);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4719
-                break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4720
-            case LIR_ldus2ui:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4721
-                LDUH32(ra, d, rr);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4722
-                break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4723
-            case LIR_ldi:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4724
-                LDSW32(ra, d, rr);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4725
-                break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4726
-            case LIR_ldc2i:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4727
-                LDSB32(ra, d, rr);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4728
-                break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4729
-            case LIR_lds2i:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4730
-                LDSH32(ra, d, rr);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4731
-                break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4732
+            case LIR_lduc2ui: LDUB32(ra, d, rr); break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4733
+            case LIR_ldus2ui: LDUH32(ra, d, rr); break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4734
+            case LIR_ldi    : LDSW32(ra, d, rr); break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4735
+            case LIR_ldc2i  : LDSB32(ra, d, rr); break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4736
+            case LIR_lds2i  : LDSH32(ra, d, rr); break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4737
             default:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4738
                 NanoAssertMsg(0, "asm_load32 should never receive this LIR opcode");
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4739
                 return;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4740
         }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4741
+        freeResourcesOf(ins);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4742
+        if (!base->isop(LIR_allocp) && !base->isInReg()) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4743
+            NanoAssert(ra == rr);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4744
+            findSpecificRegForUnallocated(base, ra);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4745
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4746
     }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4747
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4748
     void Assembler::asm_cmov(LIns* ins)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4749
     {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4750
-        underrunProtect(4);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4751
         LOpcode op = ins->opcode();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4752
         LIns* condval = ins->oprnd1();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4753
         LIns* iftrue  = ins->oprnd2();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4754
@@ -1330,7 +1361,7 @@ namespace nanojit
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4755
                   (op == LIR_cmovd && iftrue->isD() && iffalse->isD()));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4756
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4757
         RegisterMask rm = (op == LIR_cmovi) ? GpRegs : FpRegs;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4758
-        const Register rr = deprecated_prepResultReg(ins, rm);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4759
+        const Register rr = prepareResultReg(ins, rm);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4760
         const Register iffalsereg = findRegFor(iffalse, rm & ~rmask(rr));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4761
         bool isIcc = true;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4762
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4763
@@ -1346,7 +1377,9 @@ namespace nanojit
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4764
                 case LIR_leui: MOVGU (iffalsereg, rr); break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4765
                 case LIR_gtui: MOVLEU(iffalsereg, rr); break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4766
                 case LIR_geui: MOVCS (iffalsereg, rr); break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4767
-                debug_only( default: NanoAssert(0); break; )
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4768
+                default:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4769
+                    NanoAssertMsg(0, "asm_comv should never receive this cond opcode");
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4770
+                    return;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4771
             }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4772
         } else {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4773
             switch (condval->opcode()) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4774
@@ -1365,10 +1398,13 @@ namespace nanojit
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4775
                 case LIR_ltd:  FMOVDFUGE(iffalsereg, rr); isIcc = false; break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4776
                 case LIR_ged:  FMOVDFUL (iffalsereg, rr); isIcc = false; break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4777
                 case LIR_gtd:  FMOVDFULE(iffalsereg, rr); isIcc = false; break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4778
-                debug_only( default: NanoAssert(0); break; )
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4779
+                default:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4780
+                    NanoAssertMsg(0, "asm_comv should never receive this cond opcode");
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4781
+                    return;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4782
             }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4783
         }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4784
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4785
+        freeResourcesOf(ins);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4786
         /*const Register iftruereg =*/ findSpecificRegFor(iftrue, rr);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4787
         if (isIcc)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4788
             asm_cmp(condval);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4789
@@ -1379,16 +1415,16 @@ namespace nanojit
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4790
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4791
     void Assembler::asm_param(LIns* ins)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4792
     {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4793
-        underrunProtect(12);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4794
         uint32_t a = ins->paramArg();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4795
         NanoAssertMsg(ins->paramKind() == 0, "savedRegs are not used on SPARC");
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4796
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4797
-        if (a < sizeof(argRegs)/sizeof(argRegs[0])) { // i0 - i5
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4798
+        if (a < sizeof(argRegs) / sizeof(argRegs[0])) { // i0 - i5
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4799
             prepareResultReg(ins, rmask(argRegs[a]));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4800
         } else {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4801
             // Incoming arg is on stack
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4802
             Register r = prepareResultReg(ins, GpRegs);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4803
             int32_t d = a * sizeof (intptr_t) + kLinkageAreaSize;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4804
+            SafeUnderrunProtect protect(this, 12);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4805
             LDSW32(FP, d, r);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4806
         }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4807
         freeResourcesOf(ins);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4808
@@ -1396,100 +1432,102 @@ namespace nanojit
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4809
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4810
     void Assembler::asm_immi(LIns* ins)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4811
     {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4812
-        underrunProtect(8);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4813
-        Register rr = deprecated_prepResultReg(ins, GpRegs);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4814
+        Register rr = prepareResultReg(ins, GpRegs);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4815
+        SafeUnderrunProtect protect(this, 12);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4816
         int32_t val = ins->immI();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4817
         if (val == 0)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4818
             XOR(rr, rr, rr);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4819
         else
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4820
             SET32(val, rr);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4821
+        freeResourcesOf(ins);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4822
     }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4823
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4824
     void Assembler::asm_immd(LIns* ins)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4825
     {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4826
-        underrunProtect(64);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4827
-        Register rr = ins->deprecated_getReg();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4828
-        if (rr != deprecated_UnknownReg)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4829
-            {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4830
-                // @todo -- add special-cases for 0 and 1
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4831
-                _allocator.retire(rr);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4832
-                ins->clearReg();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4833
-                NanoAssert((rmask(rr) & FpRegs) != 0);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4834
-                findMemFor(ins);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4835
-                int d = deprecated_disp(ins);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4836
-                LDDF32(FP, d, rr);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4837
-            }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4838
+        SafeUnderrunProtect protect(this, 64);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4839
+        if (ins->isInReg()) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4840
+            Register rr = ins->getReg();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4841
+            // @todo -- add special-cases for 0 and 1
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4842
+            _allocator.retire(rr);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4843
+            ins->clearReg();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4844
+            NanoAssert((rmask(rr) & FpRegs) != 0);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4845
+            findMemFor(ins);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4846
+            int d = arDisp(ins);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4847
+            LDDF32(FP, d, rr);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4848
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4849
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4850
         // @todo, if we used xor, ldsd, fldz, etc above, we don't need mem here
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4851
-        int d = deprecated_disp(ins);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4852
-        deprecated_freeRsrcOf(ins);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4853
-        if (d)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4854
-            {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4855
-                STW32(L2, d+4, FP);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4856
-                SET32(ins->immDlo(), L2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4857
-                STW32(L2, d, FP);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4858
-                SET32(ins->immDhi(), L2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4859
-            }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4860
+        int d = arDisp(ins);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4861
+        if (d) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4862
+            STW32(L2, d+4, FP);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4863
+            SET32(ins->immDlo(), L2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4864
+            STW32(L2, d, FP);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4865
+            SET32(ins->immDhi(), L2);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4866
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4867
+        freeResourcesOf(ins);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4868
     }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4869
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4870
     void Assembler::asm_fneg(LIns* ins)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4871
     {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4872
-        underrunProtect(4);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4873
-        Register rr = deprecated_prepResultReg(ins, FpRegs);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4874
+        Register rr = prepareResultReg(ins, FpRegs);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4875
         LIns* lhs = ins->oprnd1();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4876
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4877
-        // lhs into reg, prefer same reg as result
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4878
-        // if this is last use of lhs in reg, we can re-use result reg
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4879
-        // else, lhs already has a different reg assigned
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4880
-        Register ra = ( !lhs->isInReg()
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4881
-                      ? findSpecificRegFor(lhs, rr)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4882
-                      : findRegFor(lhs, FpRegs) );
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4883
+        // If 'lhs' isn't in a register, it can be clobbered by 'ins'.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4884
+        Register ra = lhs->isInReg() ? lhs->getReg() : rr;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4885
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4886
         FNEGD(ra, rr);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4887
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4888
+        freeResourcesOf(ins);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4889
+        if (!lhs->isInReg()) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4890
+            NanoAssert(ra == rr);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4891
+            findSpecificRegForUnallocated(lhs, ra);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4892
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4893
     }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4894
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4895
     void Assembler::asm_fop(LIns* ins)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4896
     {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4897
-        underrunProtect(4);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4898
         LOpcode op = ins->opcode();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4899
-        LIns *lhs = ins->oprnd1();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4900
-        LIns *rhs = ins->oprnd2();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4901
+        LIns* lhs = ins->oprnd1();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4902
+        LIns* rhs = ins->oprnd2();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4903
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4904
         RegisterMask allow = FpRegs;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4905
         Register ra, rb;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4906
         findRegFor2(allow, lhs, ra, allow, rhs, rb);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4907
-        Register rr = deprecated_prepResultReg(ins, allow);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4908
+        Register rr = prepareResultReg(ins, allow);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4909
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4910
-        if (op == LIR_addd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4911
-            FADDD(ra, rb, rr);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4912
-        else if (op == LIR_subd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4913
-            FSUBD(ra, rb, rr);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4914
-        else if (op == LIR_muld)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4915
-            FMULD(ra, rb, rr);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4916
-        else //if (op == LIR_divd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4917
-            FDIVD(ra, rb, rr);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4918
+        switch (op) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4919
+            case LIR_addd: FADDD(ra, rb, rr); break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4920
+            case LIR_subd: FSUBD(ra, rb, rr); break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4921
+            case LIR_muld: FMULD(ra, rb, rr); break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4922
+            case LIR_divd: FDIVD(ra, rb, rr); break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4923
+            default:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4924
+                NanoAssertMsg(0, "asm_fop should never receive this opcode");
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4925
+                return;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4926
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4927
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4928
+        freeResourcesOf(ins);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4929
     }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4930
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4931
     void Assembler::asm_i2d(LIns* ins)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4932
     {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4933
-        underrunProtect(32);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4934
         // where our result goes
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4935
-        Register rr = deprecated_prepResultReg(ins, FpRegs);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4936
+        Register rr = prepareResultReg(ins, FpRegs);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4937
+        SafeUnderrunProtect protect(this, 32);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4938
         int d = findMemFor(ins->oprnd1());
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4939
         FITOD(rr, rr);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4940
         LDDF32(FP, d, rr);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4941
+        freeResourcesOf(ins);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4942
     }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4943
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4944
     void Assembler::asm_ui2d(LIns* ins)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4945
     {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4946
-        underrunProtect(72);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4947
         // where our result goes
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4948
-        Register rr = deprecated_prepResultReg(ins, FpRegs);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4949
+        Register rr = prepareResultReg(ins, FpRegs);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4950
         Register rt = registerAllocTmp(FpRegs & ~(rmask(rr)));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4951
         Register gr = findRegFor(ins->oprnd1(), GpRegs);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4952
         int disp = -8;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4953
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4954
+        SafeUnderrunProtect protect(this, 72);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4955
         FABSS(rr, rr);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4956
         FSUBD(rt, rr, rr);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4957
         LDDF32(SP, disp, rr);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4958
@@ -1498,37 +1536,37 @@ namespace nanojit
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4959
         STWI(gr, disp+4, SP);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4960
         STWI(G1, disp, SP);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4961
         SETHI(0x43300000, G1);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4962
+        freeResourcesOf(ins);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4963
     }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4964
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4965
     void Assembler::asm_d2i(LIns* ins) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4966
-        underrunProtect(28);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4967
-        LIns *lhs = ins->oprnd1();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4968
+        LIns* lhs = ins->oprnd1();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4969
         Register rr = prepareResultReg(ins, GpRegs);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4970
         Register ra = findRegFor(lhs, FpRegs);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4971
         int d = findMemFor(ins);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4972
+        SafeUnderrunProtect protect(this, 28);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4973
         LDSW32(FP, d, rr);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4974
-        STF32(ra, d, FP);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4975
-        FDTOI(ra, ra);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4976
+        STF32(F28, d, FP);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4977
+        FDTOI(ra, F28);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4978
         freeResourcesOf(ins);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4979
     }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4980
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4981
     void Assembler::asm_nongp_copy(Register r, Register s)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4982
     {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4983
-        underrunProtect(4);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4984
         NanoAssert((rmask(r) & FpRegs) && (rmask(s) & FpRegs));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4985
         FMOVD(s, r);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4986
     }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4987
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4988
-    NIns * Assembler::asm_branchd(bool branchOnFalse, LIns *cond, NIns *targ)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4989
+    NIns* Assembler::asm_branchd(bool branchOnFalse, LIns* cond, NIns* targ)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4990
     {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4991
-        NIns *at = 0;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4992
+        NIns* at = 0;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4993
         LOpcode condop = cond->opcode();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4994
         NanoAssert(isCmpDOpcode(condop));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4995
-        underrunProtect(32);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4996
+        SafeUnderrunProtect protect(this, 32);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4997
         intptr_t tt = ((intptr_t)targ - (intptr_t)_nIns + 8) >> 2;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4998
         // !targ means that it needs patch.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  4999
         if( !(isIMM22((int32_t)tt)) || !targ ) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5000
-            JMP_long_nocheck((intptr_t)targ);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5001
+            JMP_long((intptr_t)targ);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5002
             at = _nIns;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5003
             NOP();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5004
             BA(0, 5);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5005
@@ -1537,39 +1575,35 @@ namespace nanojit
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5006
         NOP();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5007
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5008
         // produce the branch
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5009
-        if (branchOnFalse)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5010
-            {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5011
-                if (condop == LIR_eqd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5012
-                    FBNE(0, tt);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5013
-                else if (condop == LIR_led)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5014
-                    FBUG(0, tt);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5015
-                else if (condop == LIR_ltd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5016
-                    FBUGE(0, tt);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5017
-                else if (condop == LIR_ged)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5018
-                    FBUL(0, tt);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5019
-                else //if (condop == LIR_gtd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5020
-                    FBULE(0, tt);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5021
+        if (branchOnFalse) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5022
+            switch (condop) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5023
+                case LIR_eqd: FBNE (0, tt); break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5024
+                case LIR_led: FBUG (0, tt); break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5025
+                case LIR_ltd: FBUGE(0, tt); break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5026
+                case LIR_ged: FBUL (0, tt); break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5027
+                case LIR_gtd: FBULE(0, tt); break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5028
+                default:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5029
+                    NanoAssertMsg(0, "asm_branchd should never receive this cond opcode");
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5030
+                    return;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5031
             }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5032
-        else // op == LIR_xt
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5033
-            {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5034
-                if (condop == LIR_eqd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5035
-                    FBE(0, tt);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5036
-                else if (condop == LIR_led)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5037
-                    FBLE(0, tt);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5038
-                else if (condop == LIR_ltd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5039
-                    FBL(0, tt);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5040
-                else if (condop == LIR_ged)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5041
-                    FBGE(0, tt);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5042
-                else //if (condop == LIR_gtd)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5043
-                    FBG(0, tt);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5044
+        } else { // op == LIR_xt
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5045
+            switch (condop) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5046
+                case LIR_eqd: FBE (0, tt); break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5047
+                case LIR_led: FBLE(0, tt); break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5048
+                case LIR_ltd: FBL (0, tt); break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5049
+                case LIR_ged: FBGE(0, tt); break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5050
+                case LIR_gtd: FBG (0, tt); break;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5051
+                default:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5052
+                    NanoAssertMsg(0, "asm_branchd should never receive this cond opcode");
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5053
+                    return;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5054
             }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5055
+        }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5056
         asm_cmpd(cond);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5057
         return at;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5058
     }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5059
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5060
-    void Assembler::asm_cmpd(LIns *cond)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5061
+    void Assembler::asm_cmpd(LIns* cond)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5062
     {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5063
-        underrunProtect(4);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5064
         LIns* lhs = cond->oprnd1();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5065
         LIns* rhs = cond->oprnd2();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5066
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5067
@@ -1583,11 +1617,6 @@ namespace nanojit
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5068
     {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5069
     }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5070
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5071
-    Register Assembler::asm_binop_rhs_reg(LIns* ins)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5072
-    {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5073
-        return deprecated_UnknownReg;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5074
-    }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5075
-
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5076
     void Assembler::nativePageSetup()
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5077
     {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5078
         NanoAssert(!_inExit);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5079
@@ -1607,11 +1636,12 @@ namespace nanojit
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5080
     void
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5081
     Assembler::underrunProtect(int n)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5082
     {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5083
-        NIns *eip = _nIns;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5084
+        NIns* eip = _nIns;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5085
+        NanoAssertMsg(n <= LARGEST_UNDERRUN_PROT, "constant LARGEST_UNDERRUN_PROT is too small %d");
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5086
         // This may be in a normal code chunk or an exit code chunk.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5087
-        if (eip - n < codeStart) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5088
+        if ((intptr_t)eip - n < (intptr_t)codeStart) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5089
             codeAlloc(codeStart, codeEnd, _nIns verbose_only(, codeBytes));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5090
-            JMP_long_nocheck((intptr_t)eip);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5091
+            JMP_long((intptr_t)eip);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5092
         }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5093
     }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5094
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5095
@@ -1620,7 +1650,7 @@ namespace nanojit
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5096
         genEpilogue();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5097
         releaseRegisters();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5098
         assignSavedRegs();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5099
-        LIns *val = ins->oprnd1();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5100
+        LIns* val = ins->oprnd1();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5101
         if (ins->isop(LIR_reti)) {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5102
             findSpecificRegFor(val, retRegs[0]);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5103
         } else {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5104
diff --git a/js/src/nanojit/NativeSparc.h b/js/src/nanojit/NativeSparc.h
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5105
index 2a69caa..462ffc8 100644
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5106
--- a/js/src/nanojit/NativeSparc.h
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5107
+++ b/js/src/nanojit/NativeSparc.h
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5108
@@ -71,7 +71,7 @@ namespace nanojit
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5109
 {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5110
     const int NJ_MAX_REGISTERS = 30; // L0 - L7, I0 - I5, F2 - F14
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5111
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5112
-    const int LARGEST_UNDERRUN_PROT = 32;  // largest value passed to underrunProtect
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5113
+    const int LARGEST_UNDERRUN_PROT = 72;  // largest value passed to underrunProtect
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5114
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5115
 #define NJ_MAX_STACK_ENTRY              8192
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5116
 #define NJ_MAX_PARAMETERS               1
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5117
@@ -203,6 +203,7 @@ namespace nanojit
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5118
 #define DECLARE_PLATFORM_REGALLOC()
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5119
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5120
 #define DECLARE_PLATFORM_ASSEMBLER()    \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5121
+     friend class SafeUnderrunProtect; \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5122
      const static Register argRegs[6], retRegs[1]; \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5123
      bool has_cmov; \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5124
      void nativePageReset(); \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5125
@@ -210,10 +211,11 @@ namespace nanojit
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5126
      void underrunProtect(int bytes); \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5127
      bool hardenNopInsertion(const Config& /*c*/) { return false; } \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5128
      void asm_align_code(); \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5129
-     void asm_cmp(LIns *cond); \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5130
-     void asm_cmpd(LIns *cond); \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5131
+     void asm_cmp(LIns* cond); \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5132
+     void asm_cmpd(LIns* cond); \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5133
      NIns* asm_branchd(bool, LIns*, NIns*); \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5134
      void IMM32(int32_t i) { \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5135
+         underrunProtect(4); \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5136
          --_nIns; \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5137
          *((int32_t*)_nIns) = i; \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5138
      } \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5139
@@ -295,16 +297,16 @@ namespace nanojit
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5140
     void Format_4_5(Register rd, int32_t op3, int32_t cond, int32_t opf_cc, int32_t opf_low, Register rs2) { \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5141
         Format_3A(2, rd, op3, (cond & 0xF) << 14 | (opf_cc & 0x7) << 11 | (opf_low & 0x3F) << 5 | _reg_(rs2)); \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5142
     } \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5143
-    void IntegerOperation(Register rs1, Register rs2, Register rd, int32_t op3, const char *opcode); \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5144
-    void IntegerOperationI(Register rs1, int32_t simm13, Register rd, int32_t op3, const char *opcode); \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5145
-    void FloatOperation(Register rs1, Register rs2, Register rd, int32_t op3, const char *opcode); \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5146
-    void Bicc(int32_t a, int32_t dsp22, int32_t cond, const char *opcode); \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5147
-    void FBfcc(int32_t a, int32_t dsp22, int32_t cond, const char *opcode); \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5148
+    void IntegerOperation(Register rs1, Register rs2, Register rd, int32_t op3, const char* opcode); \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5149
+    void IntegerOperationI(Register rs1, int32_t simm13, Register rd, int32_t op3, const char* opcode); \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5150
+    void FloatOperation(Register rs1, Register rs2, Register rd, int32_t op3, const char* opcode); \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5151
+    void Bicc(int32_t a, int32_t dsp22, int32_t cond, const char* opcode); \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5152
+    void FBfcc(int32_t a, int32_t dsp22, int32_t cond, const char* opcode); \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5153
     void LoadOperation(Register rs1, Register rs2, Register rd, int32_t op3, const char* opcode); \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5154
     void LoadOperationI(Register rs1, int32_t simm13, Register rd, int32_t op3, const char* opcode); \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5155
-    void MOVcc(Register rs, int32_t cc2, int32_t cc1, int32_t cc0, Register rd, int32_t cond, const char *opcode); \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5156
-    void MOVccI(int32_t simm11, int32_t cc2, int32_t cc1, int32_t cc0, Register rd, int32_t cond, const char *opcode); \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5157
-    void FMOVDcc(Register rs, int32_t opt_cc, Register rd, int32_t cond, const char *opcode); \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5158
+    void MOVcc(Register rs, int32_t cc2, int32_t cc1, int32_t cc0, Register rd, int32_t cond, const char* opcode); \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5159
+    void MOVccI(int32_t simm11, int32_t cc2, int32_t cc1, int32_t cc0, Register rd, int32_t cond, const char* opcode); \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5160
+    void FMOVDcc(Register rs, int32_t opt_cc, Register rd, int32_t cond, const char* opcode); \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5161
     void ShiftOperation(Register rs1, Register rs2, Register rd, int32_t op3, const char* opcode); \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5162
     void ShiftOperationI(Register rs1, int32_t shcnt32, Register rd, int32_t op3, const char* opcode); \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5163
     void Store(Register rd, Register rs1, Register rs2, int32_t op3, const char* opcode); \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5164
@@ -443,14 +445,13 @@ namespace nanojit
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5165
     void STB(Register rd, Register rs1, Register rs2); \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5166
     void STBI(Register rd, int32_t simm13, Register rs1); \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5167
     void STB32(Register rd, int32_t immI, Register rs1); \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5168
-    bool isIMM13(int32_t imm) { return (imm) <= 0xfff && (imm) >= -0x1000; } \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5169
-    bool isIMM19(int32_t imm) { return (imm) <= 0x3ffff && (imm) >= -0x40000; } \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5170
-    bool isIMM22(int32_t imm) { return (imm) <= 0x1fffff && (imm) >= -0x200000; } \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5171
-    void JMP_long_nocheck(int32_t t); \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5172
+    static bool isIMM13(int32_t imm) { return (imm) <= 0xfff && (imm) >= -0x1000; } \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5173
+    static bool isIMM19(int32_t imm) { return (imm) <= 0x3ffff && (imm) >= -0x40000; } \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5174
+    static bool isIMM22(int32_t imm) { return (imm) <= 0x1fffff && (imm) >= -0x200000; } \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5175
     void JMP_long(int32_t t); \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5176
     void JMP_long_placeholder(); \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5177
-    int32_t JCC(void *t); \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5178
-    void JMP(void *t); \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5179
+    int32_t JCC(void* t); \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5180
+    void JMP(void* t); \
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5181
     void MR(Register rd, Register rs);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5182
 }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5183
 #endif // __nanojit_NativeSparc__
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5184
index c8fd987..3caf5cf 100644
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5185
--- a/js/src/yarr/yarr/RegexCompiler.cpp
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5186
+++ b/js/src/yarr/yarr/RegexCompiler.cpp
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5187
@@ -34,6 +34,12 @@ namespace JSC { namespace Yarr {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5188
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5189
 #include "RegExpJitTables.h"
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5190
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5191
+#if WTF_CPU_SPARC
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5192
+#define BASE_FRAME_SIZE 24
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5193
+#else
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5194
+#define BASE_FRAME_SIZE 0
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5195
+#endif
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5196
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5197
 class CharacterClassConstructor {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5198
 public:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5199
     CharacterClassConstructor(bool isCaseInsensitive = false)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5200
@@ -592,7 +598,7 @@ public:
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5201
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5202
     void setupOffsets()
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5203
     {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5204
-        setupDisjunctionOffsets(m_pattern.m_body, 0, 0);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5205
+        setupDisjunctionOffsets(m_pattern.m_body, BASE_FRAME_SIZE, 0);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5206
     }
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5207
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5208
     // This optimization identifies sets of parentheses that we will never need to backtrack.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5209
diff --git a/js/src/yarr/yarr/RegexJIT.cpp b/js/src/yarr/yarr/RegexJIT.cpp
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5210
index 9b58ee7..e11907a 100644
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5211
--- a/js/src/yarr/yarr/RegexJIT.cpp
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5212
+++ b/js/src/yarr/yarr/RegexJIT.cpp
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5213
@@ -62,6 +62,16 @@ class RegexGenerator : private MacroAssembler {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5214
     static const RegisterID regT1 = MIPSRegisters::t5;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5215
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5216
     static const RegisterID returnRegister = MIPSRegisters::v0;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5217
+#elif WTF_CPU_SPARC
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5218
+    static const RegisterID input = SparcRegisters::i0;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5219
+    static const RegisterID index = SparcRegisters::i1;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5220
+    static const RegisterID length = SparcRegisters::i2;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5221
+    static const RegisterID output = SparcRegisters::i3;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5222
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5223
+    static const RegisterID regT0 = SparcRegisters::i4;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5224
+    static const RegisterID regT1 = SparcRegisters::i5;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5225
+
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5226
+    static const RegisterID returnRegister = SparcRegisters::i0;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5227
 #elif WTF_CPU_X86
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5228
     static const RegisterID input = X86Registers::eax;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5229
     static const RegisterID index = X86Registers::edx;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5230
@@ -564,8 +574,13 @@ class RegexGenerator : private MacroAssembler {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5231
     void generatePatternCharacterPair(TermGenerationState& state)
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5232
     {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5233
         const RegisterID character = regT0;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5234
+#if WTF_CPU_BIG_ENDIAN
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5235
+        UChar ch2 = state.term().patternCharacter;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5236
+        UChar ch1 = state.lookaheadTerm().patternCharacter;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5237
+#else
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5238
         UChar ch1 = state.term().patternCharacter;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5239
         UChar ch2 = state.lookaheadTerm().patternCharacter;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5240
+#endif
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5241
 
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5242
         int mask = 0;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5243
         int chPair = ch1 | (ch2 << 16);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5244
@@ -1449,6 +1464,10 @@ class RegexGenerator : private MacroAssembler {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5245
         push(ARMRegisters::r8); // scratch register
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5246
 #endif
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5247
         move(ARMRegisters::r3, output);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5248
+#elif WTF_CPU_SPARC
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5249
+        save(Imm32(-m_pattern.m_body->m_callFrameSize * sizeof(void*)));
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5250
+        // set m_callFrameSize to 0 avoid and stack movement later.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5251
+        m_pattern.m_body->m_callFrameSize = 0;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5252
 #elif WTF_CPU_MIPS
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5253
         // Do nothing.
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5254
 #endif
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5255
@@ -1471,6 +1490,9 @@ class RegexGenerator : private MacroAssembler {
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5256
         pop(ARMRegisters::r6);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5257
         pop(ARMRegisters::r5);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5258
         pop(ARMRegisters::r4);
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5259
+#elif WTF_CPU_SPARC
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5260
+        ret_and_restore();
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5261
+        return;
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5262
 #elif WTF_CPU_MIPS
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5263
         // Do nothing
66caadcb64c4 2011-10-22 Brian Cameron <[email protected]>
yippi
parents:
diff changeset
  5264
 #endif