File: | jdk/build/linux-x86_64-server-fastdebug/hotspot/variant-server/gensrc/adfiles/ad_x86_expand.cpp |
Warning: | line 3203, column 12 Value stored to 'C' during its initialization is never read |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
1 | #line 1 "ad_x86_expand.cpp" |
2 | // |
3 | // Copyright (c) 2003, 2021, Oracle and/or its affiliates. All rights reserved. |
4 | // DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
5 | // |
6 | // This code is free software; you can redistribute it and/or modify it |
7 | // under the terms of the GNU General Public License version 2 only, as |
8 | // published by the Free Software Foundation. |
9 | // |
10 | // This code is distributed in the hope that it will be useful, but WITHOUT |
11 | // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
12 | // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
13 | // version 2 for more details (a copy is included in the LICENSE file that |
14 | // accompanied this code). |
15 | // |
16 | // You should have received a copy of the GNU General Public License version |
17 | // 2 along with this work; if not, write to the Free Software Foundation, |
18 | // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
19 | // |
20 | // Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
21 | // or visit www.oracle.com if you need additional information or have any |
22 | // questions. |
23 | // |
24 | // |
25 | |
26 | // Machine Generated File. Do Not Edit! |
27 | |
28 | #include "precompiled.hpp" |
29 | #include "adfiles/ad_x86.hpp" |
30 | #include "oops/compressedOops.hpp" |
31 | |
32 | // Register masks, one for each register class. |
33 | const RegMask _NO_REG_mask( 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 ); |
34 | const RegMask _ALL_REG_mask( 0xffffffff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 ); |
35 | const RegMask _ALL_INT_REG_mask( 0x5555555, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 ); |
36 | const RegMask _PTR_RAX_REG_mask( 0x300000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 ); |
37 | const RegMask _PTR_RBX_REG_mask( 0x3000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 ); |
38 | const RegMask _PTR_RSI_REG_mask( 0xc0000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 ); |
39 | const RegMask _PTR_RBP_REG_mask( 0xc00000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 ); |
40 | const RegMask _PTR_RDI_REG_mask( 0xc000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 ); |
41 | const RegMask _PTR_RSP_REG_mask( 0xc0000000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 ); |
42 | const RegMask _PTR_R15_REG_mask( 0x30000000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 ); |
43 | const RegMask _LONG_RAX_REG_mask( 0x300000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 ); |
44 | const RegMask _LONG_RCX_REG_mask( 0xc00, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 ); |
45 | const RegMask _LONG_RDX_REG_mask( 0x30000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 ); |
46 | const RegMask _INT_RAX_REG_mask( 0x100000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 ); |
47 | const RegMask _INT_RBX_REG_mask( 0x1000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 ); |
48 | const RegMask _INT_RCX_REG_mask( 0x400, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 ); |
49 | const RegMask _INT_RDX_REG_mask( 0x10000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 ); |
50 | const RegMask _INT_RDI_REG_mask( 0x4000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 ); |
51 | const RegMask _VECTMASK_REG_mask( 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3fff, 0x0, 0x0, 0x0, 0x0 ); |
52 | const RegMask _VECTMASK_REG_K1_mask( 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3000, 0x0, 0x0, 0x0, 0x0 ); |
53 | const RegMask _VECTMASK_REG_K2_mask( 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc00, 0x0, 0x0, 0x0, 0x0 ); |
54 | const RegMask _VECTMASK_REG_K3_mask( 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x300, 0x0, 0x0, 0x0, 0x0 ); |
55 | const RegMask _VECTMASK_REG_K4_mask( 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, 0x0, 0x0, 0x0, 0x0 ); |
56 | const RegMask _VECTMASK_REG_K5_mask( 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0 ); |
57 | const RegMask _VECTMASK_REG_K6_mask( 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0x0 ); |
58 | const RegMask _VECTMASK_REG_K7_mask( 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0 ); |
59 | const RegMask _INT_FLAGS_mask( 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4000, 0x0, 0x0, 0x0, 0x0 ); |
60 | const RegMask _FLOAT_REG_LEGACY_mask( 0x0, 0x10001, 0x10001, 0x10001, 0x10001, 0x10001, 0x10001, 0x10001, 0x10001, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 ); |
61 | const RegMask _STACK_OR_FLOAT_REG_LEGACY_mask( 0x0, 0x10001, 0x10001, 0x10001, 0x10001, 0x10001, 0x10001, 0x10001, 0x10001, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xffff0000, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff ); |
62 | const RegMask _FLOAT_REG_EVEX_mask( 0x0, 0x10001, 0x10001, 0x10001, 0x10001, 0x10001, 0x10001, 0x10001, 0x10001, 0x10001, 0x10001, 0x10001, 0x10001, 0x10001, 0x10001, 0x10001, 0x10001, 0x0, 0x0, 0x0, 0x0, 0x0 ); |
63 | const RegMask _STACK_OR_FLOAT_REG_EVEX_mask( 0x0, 0x10001, 0x10001, 0x10001, 0x10001, 0x10001, 0x10001, 0x10001, 0x10001, 0x10001, 0x10001, 0x10001, 0x10001, 0x10001, 0x10001, 0x10001, 0x10001, 0xffff0000, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff ); |
64 | const RegMask _DOUBLE_REG_LEGACY_mask( 0x0, 0x30003, 0x30003, 0x30003, 0x30003, 0x30003, 0x30003, 0x30003, 0x30003, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 ); |
65 | const RegMask _STACK_OR_DOUBLE_REG_LEGACY_mask( 0x0, 0x30003, 0x30003, 0x30003, 0x30003, 0x30003, 0x30003, 0x30003, 0x30003, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xffff0000, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff ); |
66 | const RegMask _DOUBLE_REG_EVEX_mask( 0x0, 0x30003, 0x30003, 0x30003, 0x30003, 0x30003, 0x30003, 0x30003, 0x30003, 0x30003, 0x30003, 0x30003, 0x30003, 0x30003, 0x30003, 0x30003, 0x30003, 0x0, 0x0, 0x0, 0x0, 0x0 ); |
67 | const RegMask _STACK_OR_DOUBLE_REG_EVEX_mask( 0x0, 0x30003, 0x30003, 0x30003, 0x30003, 0x30003, 0x30003, 0x30003, 0x30003, 0x30003, 0x30003, 0x30003, 0x30003, 0x30003, 0x30003, 0x30003, 0x30003, 0xffff0000, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff ); |
68 | const RegMask _VECTORS_REG_LEGACY_mask( 0x0, 0x10001, 0x10001, 0x10001, 0x10001, 0x10001, 0x10001, 0x10001, 0x10001, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 ); |
69 | const RegMask _VECTORS_REG_EVEX_mask( 0x0, 0x10001, 0x10001, 0x10001, 0x10001, 0x10001, 0x10001, 0x10001, 0x10001, 0x10001, 0x10001, 0x10001, 0x10001, 0x10001, 0x10001, 0x10001, 0x10001, 0x0, 0x0, 0x0, 0x0, 0x0 ); |
70 | const RegMask _VECTORD_REG_LEGACY_mask( 0x0, 0x30003, 0x30003, 0x30003, 0x30003, 0x30003, 0x30003, 0x30003, 0x30003, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 ); |
71 | const RegMask _VECTORD_REG_EVEX_mask( 0x0, 0x30003, 0x30003, 0x30003, 0x30003, 0x30003, 0x30003, 0x30003, 0x30003, 0x30003, 0x30003, 0x30003, 0x30003, 0x30003, 0x30003, 0x30003, 0x30003, 0x0, 0x0, 0x0, 0x0, 0x0 ); |
72 | const RegMask _VECTORX_REG_LEGACY_mask( 0x0, 0xf000f, 0xf000f, 0xf000f, 0xf000f, 0xf000f, 0xf000f, 0xf000f, 0xf000f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 ); |
73 | const RegMask _VECTORX_REG_EVEX_mask( 0x0, 0xf000f, 0xf000f, 0xf000f, 0xf000f, 0xf000f, 0xf000f, 0xf000f, 0xf000f, 0xf000f, 0xf000f, 0xf000f, 0xf000f, 0xf000f, 0xf000f, 0xf000f, 0xf000f, 0x0, 0x0, 0x0, 0x0, 0x0 ); |
74 | const RegMask _VECTORY_REG_LEGACY_mask( 0x0, 0xff00ff, 0xff00ff, 0xff00ff, 0xff00ff, 0xff00ff, 0xff00ff, 0xff00ff, 0xff00ff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 ); |
75 | const RegMask _VECTORY_REG_EVEX_mask( 0x0, 0xff00ff, 0xff00ff, 0xff00ff, 0xff00ff, 0xff00ff, 0xff00ff, 0xff00ff, 0xff00ff, 0xff00ff, 0xff00ff, 0xff00ff, 0xff00ff, 0xff00ff, 0xff00ff, 0xff00ff, 0xff00ff, 0x0, 0x0, 0x0, 0x0, 0x0 ); |
76 | const RegMask _VECTORZ_REG_EVEX_mask( 0x0, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x0, 0x0, 0x0, 0x0, 0x0 ); |
77 | const RegMask _VECTORZ_REG_LEGACY_mask( 0x0, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 ); |
78 | const RegMask _XMM0_REG_mask( 0x0, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 ); |
79 | const RegMask _STACK_SLOTS_mask( 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 ); |
80 | const RegMask _STACK_OR_STACK_SLOTS_mask( 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xffff0000, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff ); |
81 | const RegMask _DYNAMIC_mask( 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 ); |
82 | MachNode* loadUB2L_immINode::Expand(State* state, Node_List& proj_list, Node* mem) { |
83 | Compile* C = Compile::current(); |
84 | // Add projection edges for additional defs or kills |
85 | // DEF/KILL cr |
86 | MachProjNode *kill; |
87 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
88 | proj_list.push(kill); |
89 | |
90 | return this; |
91 | } |
92 | |
93 | MachNode* loadS2BNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
94 | Compile* C = Compile::current(); |
95 | // Remove duplicated operands and inputs which use the same name. |
96 | if (num_opnds() == 4) { |
97 | unsigned num0 = 0; |
98 | unsigned num1 = opnd_array(1)->num_edges(); // mem |
99 | unsigned num2 = opnd_array(2)->num_edges(); // twentyfour |
100 | unsigned num3 = opnd_array(3)->num_edges(); // twentyfour |
101 | unsigned idx0 = oper_input_base(); |
102 | unsigned idx1 = idx0 + num0; |
103 | unsigned idx2 = idx1 + num1; |
104 | unsigned idx3 = idx2 + num2; |
105 | unsigned idx4 = idx3 + num3; |
106 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
107 | del_req(i); |
108 | } |
109 | _num_opnds = 3; |
110 | } else { |
111 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 110, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
112 | } |
113 | |
114 | return this; |
115 | } |
116 | |
117 | MachNode* loadUS2BNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
118 | Compile* C = Compile::current(); |
119 | // Remove duplicated operands and inputs which use the same name. |
120 | if (num_opnds() == 4) { |
121 | unsigned num0 = 0; |
122 | unsigned num1 = opnd_array(1)->num_edges(); // mem |
123 | unsigned num2 = opnd_array(2)->num_edges(); // twentyfour |
124 | unsigned num3 = opnd_array(3)->num_edges(); // twentyfour |
125 | unsigned idx0 = oper_input_base(); |
126 | unsigned idx1 = idx0 + num0; |
127 | unsigned idx2 = idx1 + num1; |
128 | unsigned idx3 = idx2 + num2; |
129 | unsigned idx4 = idx3 + num3; |
130 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
131 | del_req(i); |
132 | } |
133 | _num_opnds = 3; |
134 | } else { |
135 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 134, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
136 | } |
137 | |
138 | return this; |
139 | } |
140 | |
141 | MachNode* loadUS2L_immINode::Expand(State* state, Node_List& proj_list, Node* mem) { |
142 | Compile* C = Compile::current(); |
143 | // Add projection edges for additional defs or kills |
144 | // DEF/KILL cr |
145 | MachProjNode *kill; |
146 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
147 | proj_list.push(kill); |
148 | |
149 | return this; |
150 | } |
151 | |
152 | MachNode* loadI2BNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
153 | Compile* C = Compile::current(); |
154 | // Remove duplicated operands and inputs which use the same name. |
155 | if (num_opnds() == 4) { |
156 | unsigned num0 = 0; |
157 | unsigned num1 = opnd_array(1)->num_edges(); // mem |
158 | unsigned num2 = opnd_array(2)->num_edges(); // twentyfour |
159 | unsigned num3 = opnd_array(3)->num_edges(); // twentyfour |
160 | unsigned idx0 = oper_input_base(); |
161 | unsigned idx1 = idx0 + num0; |
162 | unsigned idx2 = idx1 + num1; |
163 | unsigned idx3 = idx2 + num2; |
164 | unsigned idx4 = idx3 + num3; |
165 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
166 | del_req(i); |
167 | } |
168 | _num_opnds = 3; |
169 | } else { |
170 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 169, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
171 | } |
172 | |
173 | return this; |
174 | } |
175 | |
176 | MachNode* loadI2SNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
177 | Compile* C = Compile::current(); |
178 | // Remove duplicated operands and inputs which use the same name. |
179 | if (num_opnds() == 4) { |
180 | unsigned num0 = 0; |
181 | unsigned num1 = opnd_array(1)->num_edges(); // mem |
182 | unsigned num2 = opnd_array(2)->num_edges(); // sixteen |
183 | unsigned num3 = opnd_array(3)->num_edges(); // sixteen |
184 | unsigned idx0 = oper_input_base(); |
185 | unsigned idx1 = idx0 + num0; |
186 | unsigned idx2 = idx1 + num1; |
187 | unsigned idx3 = idx2 + num2; |
188 | unsigned idx4 = idx3 + num3; |
189 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
190 | del_req(i); |
191 | } |
192 | _num_opnds = 3; |
193 | } else { |
194 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 193, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
195 | } |
196 | |
197 | return this; |
198 | } |
199 | |
200 | MachNode* loadI2L_immU31Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
201 | Compile* C = Compile::current(); |
202 | // Add projection edges for additional defs or kills |
203 | // DEF/KILL cr |
204 | MachProjNode *kill; |
205 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
206 | proj_list.push(kill); |
207 | |
208 | return this; |
209 | } |
210 | |
211 | MachNode* maxF_regNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
212 | Compile* C = Compile::current(); |
213 | // Add projection edges for additional defs or kills |
214 | // TEMP tmp |
215 | MachTempNode *def; |
216 | def = new MachTempNode(state->MachOperGenerator(LEGREGF)); |
217 | add_req(def); |
218 | // TEMP atmp |
219 | def = new MachTempNode(state->MachOperGenerator(LEGREGF)); |
220 | add_req(def); |
221 | // TEMP btmp |
222 | def = new MachTempNode(state->MachOperGenerator(LEGREGF)); |
223 | add_req(def); |
224 | |
225 | return this; |
226 | } |
227 | |
228 | MachNode* maxF_reduction_regNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
229 | Compile* C = Compile::current(); |
230 | // Add projection edges for additional defs or kills |
231 | // TEMP xmmt |
232 | MachTempNode *def; |
233 | def = new MachTempNode(state->MachOperGenerator(LEGREGF)); |
234 | add_req(def); |
235 | // TEMP tmp |
236 | def = new MachTempNode(state->MachOperGenerator(RREGI)); |
237 | add_req(def); |
238 | // DEF/KILL cr |
239 | MachProjNode *kill; |
240 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
241 | proj_list.push(kill); |
242 | |
243 | return this; |
244 | } |
245 | |
246 | MachNode* maxD_regNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
247 | Compile* C = Compile::current(); |
248 | // Add projection edges for additional defs or kills |
249 | // TEMP tmp |
250 | MachTempNode *def; |
251 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
252 | add_req(def); |
253 | // TEMP atmp |
254 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
255 | add_req(def); |
256 | // TEMP btmp |
257 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
258 | add_req(def); |
259 | |
260 | return this; |
261 | } |
262 | |
263 | MachNode* maxD_reduction_regNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
264 | Compile* C = Compile::current(); |
265 | // Add projection edges for additional defs or kills |
266 | // TEMP xmmt |
267 | MachTempNode *def; |
268 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
269 | add_req(def); |
270 | // TEMP tmp |
271 | def = new MachTempNode(state->MachOperGenerator(RREGL)); |
272 | add_req(def); |
273 | // DEF/KILL cr |
274 | MachProjNode *kill; |
275 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
276 | proj_list.push(kill); |
277 | |
278 | return this; |
279 | } |
280 | |
281 | MachNode* minF_regNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
282 | Compile* C = Compile::current(); |
283 | // Add projection edges for additional defs or kills |
284 | // TEMP tmp |
285 | MachTempNode *def; |
286 | def = new MachTempNode(state->MachOperGenerator(LEGREGF)); |
287 | add_req(def); |
288 | // TEMP atmp |
289 | def = new MachTempNode(state->MachOperGenerator(LEGREGF)); |
290 | add_req(def); |
291 | // TEMP btmp |
292 | def = new MachTempNode(state->MachOperGenerator(LEGREGF)); |
293 | add_req(def); |
294 | |
295 | return this; |
296 | } |
297 | |
298 | MachNode* minF_reduction_regNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
299 | Compile* C = Compile::current(); |
300 | // Add projection edges for additional defs or kills |
301 | // TEMP xmmt |
302 | MachTempNode *def; |
303 | def = new MachTempNode(state->MachOperGenerator(LEGREGF)); |
304 | add_req(def); |
305 | // TEMP tmp |
306 | def = new MachTempNode(state->MachOperGenerator(RREGI)); |
307 | add_req(def); |
308 | // DEF/KILL cr |
309 | MachProjNode *kill; |
310 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
311 | proj_list.push(kill); |
312 | |
313 | return this; |
314 | } |
315 | |
316 | MachNode* minD_regNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
317 | Compile* C = Compile::current(); |
318 | // Add projection edges for additional defs or kills |
319 | // TEMP tmp |
320 | MachTempNode *def; |
321 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
322 | add_req(def); |
323 | // TEMP atmp |
324 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
325 | add_req(def); |
326 | // TEMP btmp |
327 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
328 | add_req(def); |
329 | |
330 | return this; |
331 | } |
332 | |
333 | MachNode* minD_reduction_regNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
334 | Compile* C = Compile::current(); |
335 | // Add projection edges for additional defs or kills |
336 | // TEMP xmmt |
337 | MachTempNode *def; |
338 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
339 | add_req(def); |
340 | // TEMP tmp |
341 | def = new MachTempNode(state->MachOperGenerator(RREGL)); |
342 | add_req(def); |
343 | // DEF/KILL cr |
344 | MachProjNode *kill; |
345 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
346 | proj_list.push(kill); |
347 | |
348 | return this; |
349 | } |
350 | |
351 | MachNode* loadConI0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
352 | Compile* C = Compile::current(); |
353 | // Add projection edges for additional defs or kills |
354 | // DEF/KILL cr |
355 | MachProjNode *kill; |
356 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
357 | proj_list.push(kill); |
358 | |
359 | return this; |
360 | } |
361 | |
362 | MachNode* loadConL0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
363 | Compile* C = Compile::current(); |
364 | // Add projection edges for additional defs or kills |
365 | // DEF/KILL cr |
366 | MachProjNode *kill; |
367 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
368 | proj_list.push(kill); |
369 | |
370 | return this; |
371 | } |
372 | |
373 | MachNode* loadConP0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
374 | Compile* C = Compile::current(); |
375 | // Add projection edges for additional defs or kills |
376 | // DEF/KILL cr |
377 | MachProjNode *kill; |
378 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
379 | proj_list.push(kill); |
380 | |
381 | return this; |
382 | } |
383 | |
384 | MachNode* loadConP31Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
385 | Compile* C = Compile::current(); |
386 | // Add projection edges for additional defs or kills |
387 | // DEF/KILL cr |
388 | MachProjNode *kill; |
389 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
390 | proj_list.push(kill); |
391 | |
392 | return this; |
393 | } |
394 | |
395 | MachNode* loadConFNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
396 | Compile* C = Compile::current(); |
397 | add_req(C->mach_constant_base_node()); |
398 | |
399 | return this; |
400 | } |
401 | |
402 | MachNode* loadConN0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
403 | Compile* C = Compile::current(); |
404 | // Add projection edges for additional defs or kills |
405 | // DEF/KILL cr |
406 | MachProjNode *kill; |
407 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
408 | proj_list.push(kill); |
409 | |
410 | return this; |
411 | } |
412 | |
413 | MachNode* loadConDNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
414 | Compile* C = Compile::current(); |
415 | add_req(C->mach_constant_base_node()); |
416 | |
417 | return this; |
418 | } |
419 | |
420 | MachNode* bytes_reverse_unsigned_shortNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
421 | Compile* C = Compile::current(); |
422 | // Add projection edges for additional defs or kills |
423 | // DEF/KILL cr |
424 | MachProjNode *kill; |
425 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
426 | proj_list.push(kill); |
427 | |
428 | return this; |
429 | } |
430 | |
431 | MachNode* bytes_reverse_shortNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
432 | Compile* C = Compile::current(); |
433 | // Add projection edges for additional defs or kills |
434 | // DEF/KILL cr |
435 | MachProjNode *kill; |
436 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
437 | proj_list.push(kill); |
438 | |
439 | return this; |
440 | } |
441 | |
442 | MachNode* countLeadingZerosINode::Expand(State* state, Node_List& proj_list, Node* mem) { |
443 | Compile* C = Compile::current(); |
444 | // Add projection edges for additional defs or kills |
445 | // DEF/KILL cr |
446 | MachProjNode *kill; |
447 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
448 | proj_list.push(kill); |
449 | |
450 | return this; |
451 | } |
452 | |
453 | MachNode* countLeadingZerosI_bsrNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
454 | Compile* C = Compile::current(); |
455 | // Add projection edges for additional defs or kills |
456 | // DEF/KILL cr |
457 | MachProjNode *kill; |
458 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
459 | proj_list.push(kill); |
460 | |
461 | return this; |
462 | } |
463 | |
464 | MachNode* countLeadingZerosLNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
465 | Compile* C = Compile::current(); |
466 | // Add projection edges for additional defs or kills |
467 | // DEF/KILL cr |
468 | MachProjNode *kill; |
469 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
470 | proj_list.push(kill); |
471 | |
472 | return this; |
473 | } |
474 | |
475 | MachNode* countLeadingZerosL_bsrNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
476 | Compile* C = Compile::current(); |
477 | // Add projection edges for additional defs or kills |
478 | // DEF/KILL cr |
479 | MachProjNode *kill; |
480 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
481 | proj_list.push(kill); |
482 | |
483 | return this; |
484 | } |
485 | |
486 | MachNode* countTrailingZerosINode::Expand(State* state, Node_List& proj_list, Node* mem) { |
487 | Compile* C = Compile::current(); |
488 | // Add projection edges for additional defs or kills |
489 | // DEF/KILL cr |
490 | MachProjNode *kill; |
491 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
492 | proj_list.push(kill); |
493 | |
494 | return this; |
495 | } |
496 | |
497 | MachNode* countTrailingZerosI_bsfNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
498 | Compile* C = Compile::current(); |
499 | // Add projection edges for additional defs or kills |
500 | // DEF/KILL cr |
501 | MachProjNode *kill; |
502 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
503 | proj_list.push(kill); |
504 | |
505 | return this; |
506 | } |
507 | |
508 | MachNode* countTrailingZerosLNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
509 | Compile* C = Compile::current(); |
510 | // Add projection edges for additional defs or kills |
511 | // DEF/KILL cr |
512 | MachProjNode *kill; |
513 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
514 | proj_list.push(kill); |
515 | |
516 | return this; |
517 | } |
518 | |
519 | MachNode* countTrailingZerosL_bsfNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
520 | Compile* C = Compile::current(); |
521 | // Add projection edges for additional defs or kills |
522 | // DEF/KILL cr |
523 | MachProjNode *kill; |
524 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
525 | proj_list.push(kill); |
526 | |
527 | return this; |
528 | } |
529 | |
530 | MachNode* popCountINode::Expand(State* state, Node_List& proj_list, Node* mem) { |
531 | Compile* C = Compile::current(); |
532 | // Add projection edges for additional defs or kills |
533 | // DEF/KILL cr |
534 | MachProjNode *kill; |
535 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
536 | proj_list.push(kill); |
537 | |
538 | return this; |
539 | } |
540 | |
541 | MachNode* popCountI_memNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
542 | Compile* C = Compile::current(); |
543 | // Add projection edges for additional defs or kills |
544 | // DEF/KILL cr |
545 | MachProjNode *kill; |
546 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
547 | proj_list.push(kill); |
548 | |
549 | return this; |
550 | } |
551 | |
552 | MachNode* popCountLNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
553 | Compile* C = Compile::current(); |
554 | // Add projection edges for additional defs or kills |
555 | // DEF/KILL cr |
556 | MachProjNode *kill; |
557 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
558 | proj_list.push(kill); |
559 | |
560 | return this; |
561 | } |
562 | |
563 | MachNode* popCountL_memNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
564 | Compile* C = Compile::current(); |
565 | // Add projection edges for additional defs or kills |
566 | // DEF/KILL cr |
567 | MachProjNode *kill; |
568 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
569 | proj_list.push(kill); |
570 | |
571 | return this; |
572 | } |
573 | |
574 | MachNode* membar_volatileNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
575 | Compile* C = Compile::current(); |
576 | // Add projection edges for additional defs or kills |
577 | // DEF/KILL cr |
578 | MachProjNode *kill; |
579 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
580 | proj_list.push(kill); |
581 | |
582 | return this; |
583 | } |
584 | |
585 | MachNode* encodeHeapOopNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
586 | Compile* C = Compile::current(); |
587 | // Add projection edges for additional defs or kills |
588 | // DEF/KILL cr |
589 | MachProjNode *kill; |
590 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
591 | proj_list.push(kill); |
592 | |
593 | return this; |
594 | } |
595 | |
596 | MachNode* encodeHeapOop_not_nullNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
597 | Compile* C = Compile::current(); |
598 | // Add projection edges for additional defs or kills |
599 | // DEF/KILL cr |
600 | MachProjNode *kill; |
601 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
602 | proj_list.push(kill); |
603 | |
604 | return this; |
605 | } |
606 | |
607 | MachNode* decodeHeapOopNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
608 | Compile* C = Compile::current(); |
609 | // Add projection edges for additional defs or kills |
610 | // DEF/KILL cr |
611 | MachProjNode *kill; |
612 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
613 | proj_list.push(kill); |
614 | |
615 | return this; |
616 | } |
617 | |
618 | MachNode* decodeHeapOop_not_nullNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
619 | Compile* C = Compile::current(); |
620 | // Add projection edges for additional defs or kills |
621 | // DEF/KILL cr |
622 | MachProjNode *kill; |
623 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
624 | proj_list.push(kill); |
625 | |
626 | return this; |
627 | } |
628 | |
629 | MachNode* encodeKlass_not_nullNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
630 | Compile* C = Compile::current(); |
631 | // Add projection edges for additional defs or kills |
632 | // TEMP dst |
633 | MachTempNode *def; |
634 | def = new MachTempNode(state->MachOperGenerator(RREGN)); |
635 | add_req(def); |
636 | // DEF/KILL cr |
637 | MachProjNode *kill; |
638 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
639 | proj_list.push(kill); |
640 | |
641 | return this; |
642 | } |
643 | |
644 | MachNode* decodeKlass_not_nullNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
645 | Compile* C = Compile::current(); |
646 | // Add projection edges for additional defs or kills |
647 | // TEMP dst |
648 | MachTempNode *def; |
649 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
650 | add_req(def); |
651 | // DEF/KILL cr |
652 | MachProjNode *kill; |
653 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
654 | proj_list.push(kill); |
655 | |
656 | return this; |
657 | } |
658 | |
659 | MachNode* jumpXtnd_offsetNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
660 | Compile* C = Compile::current(); |
661 | // Add projection edges for additional defs or kills |
662 | // TEMP dest |
663 | MachTempNode *def; |
664 | def = new MachTempNode(state->MachOperGenerator(RREGI)); |
665 | add_req(def); |
666 | add_req(C->mach_constant_base_node()); |
667 | |
668 | return this; |
669 | } |
670 | |
671 | MachNode* jumpXtnd_addrNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
672 | Compile* C = Compile::current(); |
673 | // Add projection edges for additional defs or kills |
674 | // TEMP dest |
675 | MachTempNode *def; |
676 | def = new MachTempNode(state->MachOperGenerator(RREGI)); |
677 | add_req(def); |
678 | add_req(C->mach_constant_base_node()); |
679 | |
680 | return this; |
681 | } |
682 | |
683 | MachNode* jumpXtndNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
684 | Compile* C = Compile::current(); |
685 | // Add projection edges for additional defs or kills |
686 | // TEMP dest |
687 | MachTempNode *def; |
688 | def = new MachTempNode(state->MachOperGenerator(RREGI)); |
689 | add_req(def); |
690 | add_req(C->mach_constant_base_node()); |
691 | |
692 | return this; |
693 | } |
694 | |
695 | MachNode* cmovI_regUCFNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
696 | Compile* C = Compile::current(); |
697 | MachNode *tmp0 = this; |
698 | MachNode *tmp1 = this; |
699 | MachNode *tmp2 = this; |
700 | MachNode *tmp3 = this; |
701 | MachNode *tmp4 = this; |
702 | unsigned num0 = 0; |
703 | unsigned num1 = opnd_array(1)->num_edges(); |
704 | unsigned num2 = opnd_array(2)->num_edges(); |
705 | unsigned num3 = opnd_array(3)->num_edges(); |
706 | unsigned num4 = opnd_array(4)->num_edges(); |
707 | unsigned idx0 = oper_input_base(); |
708 | unsigned idx1 = idx0 + num0; |
709 | unsigned idx2 = idx1 + num1; |
710 | unsigned idx3 = idx2 + num2; |
711 | unsigned idx4 = idx3 + num3; |
712 | unsigned idx5 = idx4 + num4; |
713 | MachNode *result = NULL__null; |
714 | |
715 | cmovI_regUNode *n0 = new cmovI_regUNode(); |
716 | n0->add_req(_in[0]); |
717 | n0->set_opnd_array(0, state->MachOperGenerator(RREGI)); |
718 | n0->set_opnd_array(1, opnd_array(1)->clone()); // cop |
719 | if(tmp1 == this) { |
720 | for(unsigned i = 0; i < num1; i++) { |
721 | n0->add_req(_in[i + idx1]); |
722 | } |
723 | } |
724 | else n0->add_req(tmp1); |
725 | n0->set_opnd_array(2, opnd_array(2)->clone()); // cr |
726 | if(tmp2 == this) { |
727 | for(unsigned i = 0; i < num2; i++) { |
728 | n0->add_req(_in[i + idx2]); |
729 | } |
730 | } |
731 | else n0->add_req(tmp2); |
732 | n0->set_opnd_array(3, opnd_array(3)->clone()); // dst |
733 | if(tmp3 == this) { |
734 | for(unsigned i = 0; i < num3; i++) { |
735 | n0->add_req(_in[i + idx3]); |
736 | } |
737 | } |
738 | else n0->add_req(tmp3); |
739 | tmp3 = n0; |
740 | n0->set_opnd_array(4, opnd_array(4)->clone()); // src |
741 | if(tmp4 == this) { |
742 | for(unsigned i = 0; i < num4; i++) { |
743 | n0->add_req(_in[i + idx4]); |
744 | } |
745 | } |
746 | else n0->add_req(tmp4); |
747 | result = n0->Expand( state, proj_list, mem ); |
748 | |
749 | |
750 | return result; |
751 | } |
752 | |
753 | MachNode* cmovI_memUCFNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
754 | Compile* C = Compile::current(); |
755 | MachNode *tmp0 = this; |
756 | MachNode *tmp1 = this; |
757 | MachNode *tmp2 = this; |
758 | MachNode *tmp3 = this; |
759 | MachNode *tmp4 = this; |
760 | unsigned num0 = 0; |
761 | unsigned num1 = opnd_array(1)->num_edges(); |
762 | unsigned num2 = opnd_array(2)->num_edges(); |
763 | unsigned num3 = opnd_array(3)->num_edges(); |
764 | unsigned num4 = opnd_array(4)->num_edges(); |
765 | unsigned idx0 = oper_input_base(); |
766 | if (mem == (Node*)1) { |
767 | idx0--; // Adjust base because memory edge hasn't been inserted yet |
768 | } |
769 | unsigned idx1 = idx0 + num0; |
770 | unsigned idx2 = idx1 + num1; |
771 | unsigned idx3 = idx2 + num2; |
772 | unsigned idx4 = idx3 + num3; |
773 | unsigned idx5 = idx4 + num4; |
774 | MachNode *result = NULL__null; |
775 | |
776 | cmovI_memUNode *n0 = new cmovI_memUNode(); |
777 | n0->add_req(_in[0]); |
778 | n0->set_opnd_array(0, state->MachOperGenerator(RREGI)); |
779 | if (mem != (Node*)1) { |
780 | n0->add_req(_in[1]); // Add memory edge |
781 | } |
782 | n0->set_opnd_array(1, opnd_array(1)->clone()); // cop |
783 | if(tmp1 == this) { |
784 | for(unsigned i = 0; i < num1; i++) { |
785 | n0->add_req(_in[i + idx1]); |
786 | } |
787 | } |
788 | else n0->add_req(tmp1); |
789 | n0->set_opnd_array(2, opnd_array(2)->clone()); // cr |
790 | if(tmp2 == this) { |
791 | for(unsigned i = 0; i < num2; i++) { |
792 | n0->add_req(_in[i + idx2]); |
793 | } |
794 | } |
795 | else n0->add_req(tmp2); |
796 | n0->set_opnd_array(3, opnd_array(3)->clone()); // dst |
797 | if(tmp3 == this) { |
798 | for(unsigned i = 0; i < num3; i++) { |
799 | n0->add_req(_in[i + idx3]); |
800 | } |
801 | } |
802 | else n0->add_req(tmp3); |
803 | tmp3 = n0; |
804 | n0->set_opnd_array(4, opnd_array(4)->clone()); // src |
805 | if(tmp4 == this) { |
806 | for(unsigned i = 0; i < num4; i++) { |
807 | n0->add_req(_in[i + idx4]); |
808 | } |
809 | } |
810 | else n0->add_req(tmp4); |
811 | result = n0->Expand( state, proj_list, mem ); |
812 | |
813 | |
814 | return result; |
815 | } |
816 | |
817 | MachNode* cmovN_regUCFNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
818 | Compile* C = Compile::current(); |
819 | MachNode *tmp0 = this; |
820 | MachNode *tmp1 = this; |
821 | MachNode *tmp2 = this; |
822 | MachNode *tmp3 = this; |
823 | MachNode *tmp4 = this; |
824 | unsigned num0 = 0; |
825 | unsigned num1 = opnd_array(1)->num_edges(); |
826 | unsigned num2 = opnd_array(2)->num_edges(); |
827 | unsigned num3 = opnd_array(3)->num_edges(); |
828 | unsigned num4 = opnd_array(4)->num_edges(); |
829 | unsigned idx0 = oper_input_base(); |
830 | unsigned idx1 = idx0 + num0; |
831 | unsigned idx2 = idx1 + num1; |
832 | unsigned idx3 = idx2 + num2; |
833 | unsigned idx4 = idx3 + num3; |
834 | unsigned idx5 = idx4 + num4; |
835 | MachNode *result = NULL__null; |
836 | |
837 | cmovN_regUNode *n0 = new cmovN_regUNode(); |
838 | n0->add_req(_in[0]); |
839 | n0->set_opnd_array(0, state->MachOperGenerator(RREGN)); |
840 | n0->set_opnd_array(1, opnd_array(1)->clone()); // cop |
841 | if(tmp1 == this) { |
842 | for(unsigned i = 0; i < num1; i++) { |
843 | n0->add_req(_in[i + idx1]); |
844 | } |
845 | } |
846 | else n0->add_req(tmp1); |
847 | n0->set_opnd_array(2, opnd_array(2)->clone()); // cr |
848 | if(tmp2 == this) { |
849 | for(unsigned i = 0; i < num2; i++) { |
850 | n0->add_req(_in[i + idx2]); |
851 | } |
852 | } |
853 | else n0->add_req(tmp2); |
854 | n0->set_opnd_array(3, opnd_array(3)->clone()); // dst |
855 | if(tmp3 == this) { |
856 | for(unsigned i = 0; i < num3; i++) { |
857 | n0->add_req(_in[i + idx3]); |
858 | } |
859 | } |
860 | else n0->add_req(tmp3); |
861 | tmp3 = n0; |
862 | n0->set_opnd_array(4, opnd_array(4)->clone()); // src |
863 | if(tmp4 == this) { |
864 | for(unsigned i = 0; i < num4; i++) { |
865 | n0->add_req(_in[i + idx4]); |
866 | } |
867 | } |
868 | else n0->add_req(tmp4); |
869 | result = n0->Expand( state, proj_list, mem ); |
870 | |
871 | |
872 | return result; |
873 | } |
874 | |
875 | MachNode* cmovP_regUCFNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
876 | Compile* C = Compile::current(); |
877 | MachNode *tmp0 = this; |
878 | MachNode *tmp1 = this; |
879 | MachNode *tmp2 = this; |
880 | MachNode *tmp3 = this; |
881 | MachNode *tmp4 = this; |
882 | unsigned num0 = 0; |
883 | unsigned num1 = opnd_array(1)->num_edges(); |
884 | unsigned num2 = opnd_array(2)->num_edges(); |
885 | unsigned num3 = opnd_array(3)->num_edges(); |
886 | unsigned num4 = opnd_array(4)->num_edges(); |
887 | unsigned idx0 = oper_input_base(); |
888 | unsigned idx1 = idx0 + num0; |
889 | unsigned idx2 = idx1 + num1; |
890 | unsigned idx3 = idx2 + num2; |
891 | unsigned idx4 = idx3 + num3; |
892 | unsigned idx5 = idx4 + num4; |
893 | MachNode *result = NULL__null; |
894 | |
895 | cmovP_regUNode *n0 = new cmovP_regUNode(); |
896 | n0->add_req(_in[0]); |
897 | n0->set_opnd_array(0, state->MachOperGenerator(RREGP)); |
898 | n0->set_opnd_array(1, opnd_array(1)->clone()); // cop |
899 | if(tmp1 == this) { |
900 | for(unsigned i = 0; i < num1; i++) { |
901 | n0->add_req(_in[i + idx1]); |
902 | } |
903 | } |
904 | else n0->add_req(tmp1); |
905 | n0->set_opnd_array(2, opnd_array(2)->clone()); // cr |
906 | if(tmp2 == this) { |
907 | for(unsigned i = 0; i < num2; i++) { |
908 | n0->add_req(_in[i + idx2]); |
909 | } |
910 | } |
911 | else n0->add_req(tmp2); |
912 | n0->set_opnd_array(3, opnd_array(3)->clone()); // dst |
913 | if(tmp3 == this) { |
914 | for(unsigned i = 0; i < num3; i++) { |
915 | n0->add_req(_in[i + idx3]); |
916 | } |
917 | } |
918 | else n0->add_req(tmp3); |
919 | tmp3 = n0; |
920 | n0->set_opnd_array(4, opnd_array(4)->clone()); // src |
921 | if(tmp4 == this) { |
922 | for(unsigned i = 0; i < num4; i++) { |
923 | n0->add_req(_in[i + idx4]); |
924 | } |
925 | } |
926 | else n0->add_req(tmp4); |
927 | result = n0->Expand( state, proj_list, mem ); |
928 | |
929 | |
930 | return result; |
931 | } |
932 | |
933 | MachNode* cmovL_regUCFNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
934 | Compile* C = Compile::current(); |
935 | MachNode *tmp0 = this; |
936 | MachNode *tmp1 = this; |
937 | MachNode *tmp2 = this; |
938 | MachNode *tmp3 = this; |
939 | MachNode *tmp4 = this; |
940 | unsigned num0 = 0; |
941 | unsigned num1 = opnd_array(1)->num_edges(); |
942 | unsigned num2 = opnd_array(2)->num_edges(); |
943 | unsigned num3 = opnd_array(3)->num_edges(); |
944 | unsigned num4 = opnd_array(4)->num_edges(); |
945 | unsigned idx0 = oper_input_base(); |
946 | unsigned idx1 = idx0 + num0; |
947 | unsigned idx2 = idx1 + num1; |
948 | unsigned idx3 = idx2 + num2; |
949 | unsigned idx4 = idx3 + num3; |
950 | unsigned idx5 = idx4 + num4; |
951 | MachNode *result = NULL__null; |
952 | |
953 | cmovL_regUNode *n0 = new cmovL_regUNode(); |
954 | n0->add_req(_in[0]); |
955 | n0->set_opnd_array(0, state->MachOperGenerator(RREGL)); |
956 | n0->set_opnd_array(1, opnd_array(1)->clone()); // cop |
957 | if(tmp1 == this) { |
958 | for(unsigned i = 0; i < num1; i++) { |
959 | n0->add_req(_in[i + idx1]); |
960 | } |
961 | } |
962 | else n0->add_req(tmp1); |
963 | n0->set_opnd_array(2, opnd_array(2)->clone()); // cr |
964 | if(tmp2 == this) { |
965 | for(unsigned i = 0; i < num2; i++) { |
966 | n0->add_req(_in[i + idx2]); |
967 | } |
968 | } |
969 | else n0->add_req(tmp2); |
970 | n0->set_opnd_array(3, opnd_array(3)->clone()); // dst |
971 | if(tmp3 == this) { |
972 | for(unsigned i = 0; i < num3; i++) { |
973 | n0->add_req(_in[i + idx3]); |
974 | } |
975 | } |
976 | else n0->add_req(tmp3); |
977 | tmp3 = n0; |
978 | n0->set_opnd_array(4, opnd_array(4)->clone()); // src |
979 | if(tmp4 == this) { |
980 | for(unsigned i = 0; i < num4; i++) { |
981 | n0->add_req(_in[i + idx4]); |
982 | } |
983 | } |
984 | else n0->add_req(tmp4); |
985 | result = n0->Expand( state, proj_list, mem ); |
986 | |
987 | |
988 | return result; |
989 | } |
990 | |
991 | MachNode* cmovL_memUCFNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
992 | Compile* C = Compile::current(); |
993 | MachNode *tmp0 = this; |
994 | MachNode *tmp1 = this; |
995 | MachNode *tmp2 = this; |
996 | MachNode *tmp3 = this; |
997 | MachNode *tmp4 = this; |
998 | unsigned num0 = 0; |
999 | unsigned num1 = opnd_array(1)->num_edges(); |
1000 | unsigned num2 = opnd_array(2)->num_edges(); |
1001 | unsigned num3 = opnd_array(3)->num_edges(); |
1002 | unsigned num4 = opnd_array(4)->num_edges(); |
1003 | unsigned idx0 = oper_input_base(); |
1004 | if (mem == (Node*)1) { |
1005 | idx0--; // Adjust base because memory edge hasn't been inserted yet |
1006 | } |
1007 | unsigned idx1 = idx0 + num0; |
1008 | unsigned idx2 = idx1 + num1; |
1009 | unsigned idx3 = idx2 + num2; |
1010 | unsigned idx4 = idx3 + num3; |
1011 | unsigned idx5 = idx4 + num4; |
1012 | MachNode *result = NULL__null; |
1013 | |
1014 | cmovL_memUNode *n0 = new cmovL_memUNode(); |
1015 | n0->add_req(_in[0]); |
1016 | n0->set_opnd_array(0, state->MachOperGenerator(RREGL)); |
1017 | if (mem != (Node*)1) { |
1018 | n0->add_req(_in[1]); // Add memory edge |
1019 | } |
1020 | n0->set_opnd_array(1, opnd_array(1)->clone()); // cop |
1021 | if(tmp1 == this) { |
1022 | for(unsigned i = 0; i < num1; i++) { |
1023 | n0->add_req(_in[i + idx1]); |
1024 | } |
1025 | } |
1026 | else n0->add_req(tmp1); |
1027 | n0->set_opnd_array(2, opnd_array(2)->clone()); // cr |
1028 | if(tmp2 == this) { |
1029 | for(unsigned i = 0; i < num2; i++) { |
1030 | n0->add_req(_in[i + idx2]); |
1031 | } |
1032 | } |
1033 | else n0->add_req(tmp2); |
1034 | n0->set_opnd_array(3, opnd_array(3)->clone()); // dst |
1035 | if(tmp3 == this) { |
1036 | for(unsigned i = 0; i < num3; i++) { |
1037 | n0->add_req(_in[i + idx3]); |
1038 | } |
1039 | } |
1040 | else n0->add_req(tmp3); |
1041 | tmp3 = n0; |
1042 | n0->set_opnd_array(4, opnd_array(4)->clone()); // src |
1043 | if(tmp4 == this) { |
1044 | for(unsigned i = 0; i < num4; i++) { |
1045 | n0->add_req(_in[i + idx4]); |
1046 | } |
1047 | } |
1048 | else n0->add_req(tmp4); |
1049 | result = n0->Expand( state, proj_list, mem ); |
1050 | |
1051 | |
1052 | return result; |
1053 | } |
1054 | |
1055 | MachNode* cmovF_regUCFNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
1056 | Compile* C = Compile::current(); |
1057 | MachNode *tmp0 = this; |
1058 | MachNode *tmp1 = this; |
1059 | MachNode *tmp2 = this; |
1060 | MachNode *tmp3 = this; |
1061 | MachNode *tmp4 = this; |
1062 | unsigned num0 = 0; |
1063 | unsigned num1 = opnd_array(1)->num_edges(); |
1064 | unsigned num2 = opnd_array(2)->num_edges(); |
1065 | unsigned num3 = opnd_array(3)->num_edges(); |
1066 | unsigned num4 = opnd_array(4)->num_edges(); |
1067 | unsigned idx0 = oper_input_base(); |
1068 | unsigned idx1 = idx0 + num0; |
1069 | unsigned idx2 = idx1 + num1; |
1070 | unsigned idx3 = idx2 + num2; |
1071 | unsigned idx4 = idx3 + num3; |
1072 | unsigned idx5 = idx4 + num4; |
1073 | MachNode *result = NULL__null; |
1074 | |
1075 | cmovF_regUNode *n0 = new cmovF_regUNode(); |
1076 | n0->add_req(_in[0]); |
1077 | n0->set_opnd_array(0, state->MachOperGenerator(REGF)); |
1078 | n0->set_opnd_array(1, opnd_array(1)->clone()); // cop |
1079 | if(tmp1 == this) { |
1080 | for(unsigned i = 0; i < num1; i++) { |
1081 | n0->add_req(_in[i + idx1]); |
1082 | } |
1083 | } |
1084 | else n0->add_req(tmp1); |
1085 | n0->set_opnd_array(2, opnd_array(2)->clone()); // cr |
1086 | if(tmp2 == this) { |
1087 | for(unsigned i = 0; i < num2; i++) { |
1088 | n0->add_req(_in[i + idx2]); |
1089 | } |
1090 | } |
1091 | else n0->add_req(tmp2); |
1092 | n0->set_opnd_array(3, opnd_array(3)->clone()); // dst |
1093 | if(tmp3 == this) { |
1094 | for(unsigned i = 0; i < num3; i++) { |
1095 | n0->add_req(_in[i + idx3]); |
1096 | } |
1097 | } |
1098 | else n0->add_req(tmp3); |
1099 | tmp3 = n0; |
1100 | n0->set_opnd_array(4, opnd_array(4)->clone()); // src |
1101 | if(tmp4 == this) { |
1102 | for(unsigned i = 0; i < num4; i++) { |
1103 | n0->add_req(_in[i + idx4]); |
1104 | } |
1105 | } |
1106 | else n0->add_req(tmp4); |
1107 | result = n0->Expand( state, proj_list, mem ); |
1108 | |
1109 | |
1110 | return result; |
1111 | } |
1112 | |
1113 | MachNode* cmovD_regUCFNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
1114 | Compile* C = Compile::current(); |
1115 | MachNode *tmp0 = this; |
1116 | MachNode *tmp1 = this; |
1117 | MachNode *tmp2 = this; |
1118 | MachNode *tmp3 = this; |
1119 | MachNode *tmp4 = this; |
1120 | unsigned num0 = 0; |
1121 | unsigned num1 = opnd_array(1)->num_edges(); |
1122 | unsigned num2 = opnd_array(2)->num_edges(); |
1123 | unsigned num3 = opnd_array(3)->num_edges(); |
1124 | unsigned num4 = opnd_array(4)->num_edges(); |
1125 | unsigned idx0 = oper_input_base(); |
1126 | unsigned idx1 = idx0 + num0; |
1127 | unsigned idx2 = idx1 + num1; |
1128 | unsigned idx3 = idx2 + num2; |
1129 | unsigned idx4 = idx3 + num3; |
1130 | unsigned idx5 = idx4 + num4; |
1131 | MachNode *result = NULL__null; |
1132 | |
1133 | cmovD_regUNode *n0 = new cmovD_regUNode(); |
1134 | n0->add_req(_in[0]); |
1135 | n0->set_opnd_array(0, state->MachOperGenerator(REGD)); |
1136 | n0->set_opnd_array(1, opnd_array(1)->clone()); // cop |
1137 | if(tmp1 == this) { |
1138 | for(unsigned i = 0; i < num1; i++) { |
1139 | n0->add_req(_in[i + idx1]); |
1140 | } |
1141 | } |
1142 | else n0->add_req(tmp1); |
1143 | n0->set_opnd_array(2, opnd_array(2)->clone()); // cr |
1144 | if(tmp2 == this) { |
1145 | for(unsigned i = 0; i < num2; i++) { |
1146 | n0->add_req(_in[i + idx2]); |
1147 | } |
1148 | } |
1149 | else n0->add_req(tmp2); |
1150 | n0->set_opnd_array(3, opnd_array(3)->clone()); // dst |
1151 | if(tmp3 == this) { |
1152 | for(unsigned i = 0; i < num3; i++) { |
1153 | n0->add_req(_in[i + idx3]); |
1154 | } |
1155 | } |
1156 | else n0->add_req(tmp3); |
1157 | tmp3 = n0; |
1158 | n0->set_opnd_array(4, opnd_array(4)->clone()); // src |
1159 | if(tmp4 == this) { |
1160 | for(unsigned i = 0; i < num4; i++) { |
1161 | n0->add_req(_in[i + idx4]); |
1162 | } |
1163 | } |
1164 | else n0->add_req(tmp4); |
1165 | result = n0->Expand( state, proj_list, mem ); |
1166 | |
1167 | |
1168 | return result; |
1169 | } |
1170 | |
1171 | MachNode* addI_rRegNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
1172 | Compile* C = Compile::current(); |
1173 | // Add projection edges for additional defs or kills |
1174 | // DEF/KILL cr |
1175 | MachProjNode *kill; |
1176 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
1177 | proj_list.push(kill); |
1178 | |
1179 | return this; |
1180 | } |
1181 | |
1182 | MachNode* addI_rReg_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
1183 | Compile* C = Compile::current(); |
1184 | // Add projection edges for additional defs or kills |
1185 | // DEF/KILL cr |
1186 | MachProjNode *kill; |
1187 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
1188 | proj_list.push(kill); |
1189 | |
1190 | return this; |
1191 | } |
1192 | |
1193 | MachNode* addI_rReg_memNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
1194 | Compile* C = Compile::current(); |
1195 | // Add projection edges for additional defs or kills |
1196 | // DEF/KILL cr |
1197 | MachProjNode *kill; |
1198 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
1199 | proj_list.push(kill); |
1200 | |
1201 | return this; |
1202 | } |
1203 | |
1204 | MachNode* addI_rReg_mem_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
1205 | Compile* C = Compile::current(); |
1206 | // Add projection edges for additional defs or kills |
1207 | // DEF/KILL cr |
1208 | MachProjNode *kill; |
1209 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
1210 | proj_list.push(kill); |
1211 | |
1212 | return this; |
1213 | } |
1214 | |
1215 | MachNode* addI_mem_rRegNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
1216 | Compile* C = Compile::current(); |
1217 | // Add projection edges for additional defs or kills |
1218 | // DEF/KILL cr |
1219 | MachProjNode *kill; |
1220 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
1221 | proj_list.push(kill); |
1222 | // Remove duplicated operands and inputs which use the same name. |
1223 | if (num_opnds() == 4) { |
1224 | unsigned num0 = 0; |
1225 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
1226 | unsigned num2 = opnd_array(2)->num_edges(); // dst |
1227 | unsigned num3 = opnd_array(3)->num_edges(); // src |
1228 | unsigned idx0 = oper_input_base(); |
1229 | unsigned idx1 = idx0 + num0; |
1230 | unsigned idx2 = idx1 + num1; |
1231 | unsigned idx3 = idx2 + num2; |
1232 | unsigned idx4 = idx3 + num3; |
1233 | set_opnd_array(2, opnd_array(3)->clone()); // src |
1234 | for (unsigned i = 0; i < num3; i++) { |
1235 | set_req(i + idx2, _in[i + idx3]); |
1236 | } |
1237 | num2 = num3; |
1238 | idx3 = idx2 + num2; |
1239 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
1240 | del_req(i); |
1241 | } |
1242 | _num_opnds = 3; |
1243 | } else { |
1244 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 1243, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
1245 | } |
1246 | |
1247 | return this; |
1248 | } |
1249 | |
1250 | MachNode* addI_mem_rReg_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
1251 | Compile* C = Compile::current(); |
1252 | // Add projection edges for additional defs or kills |
1253 | // DEF/KILL cr |
1254 | MachProjNode *kill; |
1255 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
1256 | proj_list.push(kill); |
1257 | // Remove duplicated operands and inputs which use the same name. |
1258 | if (num_opnds() == 4) { |
1259 | unsigned num0 = 0; |
1260 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
1261 | unsigned num2 = opnd_array(2)->num_edges(); // src |
1262 | unsigned num3 = opnd_array(3)->num_edges(); // dst |
1263 | unsigned idx0 = oper_input_base(); |
1264 | unsigned idx1 = idx0 + num0; |
1265 | unsigned idx2 = idx1 + num1; |
1266 | unsigned idx3 = idx2 + num2; |
1267 | unsigned idx4 = idx3 + num3; |
1268 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
1269 | del_req(i); |
1270 | } |
1271 | _num_opnds = 3; |
1272 | } else { |
1273 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 1272, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
1274 | } |
1275 | |
1276 | return this; |
1277 | } |
1278 | |
1279 | MachNode* addI_mem_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
1280 | Compile* C = Compile::current(); |
1281 | // Add projection edges for additional defs or kills |
1282 | // DEF/KILL cr |
1283 | MachProjNode *kill; |
1284 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
1285 | proj_list.push(kill); |
1286 | // Remove duplicated operands and inputs which use the same name. |
1287 | if (num_opnds() == 4) { |
1288 | unsigned num0 = 0; |
1289 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
1290 | unsigned num2 = opnd_array(2)->num_edges(); // dst |
1291 | unsigned num3 = opnd_array(3)->num_edges(); // src |
1292 | unsigned idx0 = oper_input_base(); |
1293 | unsigned idx1 = idx0 + num0; |
1294 | unsigned idx2 = idx1 + num1; |
1295 | unsigned idx3 = idx2 + num2; |
1296 | unsigned idx4 = idx3 + num3; |
1297 | set_opnd_array(2, opnd_array(3)->clone()); // src |
1298 | for (unsigned i = 0; i < num3; i++) { |
1299 | set_req(i + idx2, _in[i + idx3]); |
1300 | } |
1301 | num2 = num3; |
1302 | idx3 = idx2 + num2; |
1303 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
1304 | del_req(i); |
1305 | } |
1306 | _num_opnds = 3; |
1307 | } else { |
1308 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 1307, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
1309 | } |
1310 | |
1311 | return this; |
1312 | } |
1313 | |
1314 | MachNode* incI_rRegNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
1315 | Compile* C = Compile::current(); |
1316 | // Add projection edges for additional defs or kills |
1317 | // DEF/KILL cr |
1318 | MachProjNode *kill; |
1319 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
1320 | proj_list.push(kill); |
1321 | |
1322 | return this; |
1323 | } |
1324 | |
1325 | MachNode* incI_memNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
1326 | Compile* C = Compile::current(); |
1327 | // Add projection edges for additional defs or kills |
1328 | // DEF/KILL cr |
1329 | MachProjNode *kill; |
1330 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
1331 | proj_list.push(kill); |
1332 | // Remove duplicated operands and inputs which use the same name. |
1333 | if (num_opnds() == 4) { |
1334 | unsigned num0 = 0; |
1335 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
1336 | unsigned num2 = opnd_array(2)->num_edges(); // dst |
1337 | unsigned num3 = opnd_array(3)->num_edges(); // src |
1338 | unsigned idx0 = oper_input_base(); |
1339 | unsigned idx1 = idx0 + num0; |
1340 | unsigned idx2 = idx1 + num1; |
1341 | unsigned idx3 = idx2 + num2; |
1342 | unsigned idx4 = idx3 + num3; |
1343 | set_opnd_array(2, opnd_array(3)->clone()); // src |
1344 | for (unsigned i = 0; i < num3; i++) { |
1345 | set_req(i + idx2, _in[i + idx3]); |
1346 | } |
1347 | num2 = num3; |
1348 | idx3 = idx2 + num2; |
1349 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
1350 | del_req(i); |
1351 | } |
1352 | _num_opnds = 3; |
1353 | } else { |
1354 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 1353, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
1355 | } |
1356 | |
1357 | return this; |
1358 | } |
1359 | |
1360 | MachNode* decI_rRegNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
1361 | Compile* C = Compile::current(); |
1362 | // Add projection edges for additional defs or kills |
1363 | // DEF/KILL cr |
1364 | MachProjNode *kill; |
1365 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
1366 | proj_list.push(kill); |
1367 | |
1368 | return this; |
1369 | } |
1370 | |
1371 | MachNode* decI_memNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
1372 | Compile* C = Compile::current(); |
1373 | // Add projection edges for additional defs or kills |
1374 | // DEF/KILL cr |
1375 | MachProjNode *kill; |
1376 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
1377 | proj_list.push(kill); |
1378 | // Remove duplicated operands and inputs which use the same name. |
1379 | if (num_opnds() == 4) { |
1380 | unsigned num0 = 0; |
1381 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
1382 | unsigned num2 = opnd_array(2)->num_edges(); // dst |
1383 | unsigned num3 = opnd_array(3)->num_edges(); // src |
1384 | unsigned idx0 = oper_input_base(); |
1385 | unsigned idx1 = idx0 + num0; |
1386 | unsigned idx2 = idx1 + num1; |
1387 | unsigned idx3 = idx2 + num2; |
1388 | unsigned idx4 = idx3 + num3; |
1389 | set_opnd_array(2, opnd_array(3)->clone()); // src |
1390 | for (unsigned i = 0; i < num3; i++) { |
1391 | set_req(i + idx2, _in[i + idx3]); |
1392 | } |
1393 | num2 = num3; |
1394 | idx3 = idx2 + num2; |
1395 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
1396 | del_req(i); |
1397 | } |
1398 | _num_opnds = 3; |
1399 | } else { |
1400 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 1399, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
1401 | } |
1402 | |
1403 | return this; |
1404 | } |
1405 | |
1406 | MachNode* addL_rRegNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
1407 | Compile* C = Compile::current(); |
1408 | // Add projection edges for additional defs or kills |
1409 | // DEF/KILL cr |
1410 | MachProjNode *kill; |
1411 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
1412 | proj_list.push(kill); |
1413 | |
1414 | return this; |
1415 | } |
1416 | |
1417 | MachNode* addL_rReg_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
1418 | Compile* C = Compile::current(); |
1419 | // Add projection edges for additional defs or kills |
1420 | // DEF/KILL cr |
1421 | MachProjNode *kill; |
1422 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
1423 | proj_list.push(kill); |
1424 | |
1425 | return this; |
1426 | } |
1427 | |
1428 | MachNode* addL_rReg_memNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
1429 | Compile* C = Compile::current(); |
1430 | // Add projection edges for additional defs or kills |
1431 | // DEF/KILL cr |
1432 | MachProjNode *kill; |
1433 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
1434 | proj_list.push(kill); |
1435 | |
1436 | return this; |
1437 | } |
1438 | |
1439 | MachNode* addL_rReg_mem_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
1440 | Compile* C = Compile::current(); |
1441 | // Add projection edges for additional defs or kills |
1442 | // DEF/KILL cr |
1443 | MachProjNode *kill; |
1444 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
1445 | proj_list.push(kill); |
1446 | |
1447 | return this; |
1448 | } |
1449 | |
1450 | MachNode* addL_mem_rRegNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
1451 | Compile* C = Compile::current(); |
1452 | // Add projection edges for additional defs or kills |
1453 | // DEF/KILL cr |
1454 | MachProjNode *kill; |
1455 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
1456 | proj_list.push(kill); |
1457 | // Remove duplicated operands and inputs which use the same name. |
1458 | if (num_opnds() == 4) { |
1459 | unsigned num0 = 0; |
1460 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
1461 | unsigned num2 = opnd_array(2)->num_edges(); // dst |
1462 | unsigned num3 = opnd_array(3)->num_edges(); // src |
1463 | unsigned idx0 = oper_input_base(); |
1464 | unsigned idx1 = idx0 + num0; |
1465 | unsigned idx2 = idx1 + num1; |
1466 | unsigned idx3 = idx2 + num2; |
1467 | unsigned idx4 = idx3 + num3; |
1468 | set_opnd_array(2, opnd_array(3)->clone()); // src |
1469 | for (unsigned i = 0; i < num3; i++) { |
1470 | set_req(i + idx2, _in[i + idx3]); |
1471 | } |
1472 | num2 = num3; |
1473 | idx3 = idx2 + num2; |
1474 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
1475 | del_req(i); |
1476 | } |
1477 | _num_opnds = 3; |
1478 | } else { |
1479 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 1478, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
1480 | } |
1481 | |
1482 | return this; |
1483 | } |
1484 | |
1485 | MachNode* addL_mem_rReg_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
1486 | Compile* C = Compile::current(); |
1487 | // Add projection edges for additional defs or kills |
1488 | // DEF/KILL cr |
1489 | MachProjNode *kill; |
1490 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
1491 | proj_list.push(kill); |
1492 | // Remove duplicated operands and inputs which use the same name. |
1493 | if (num_opnds() == 4) { |
1494 | unsigned num0 = 0; |
1495 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
1496 | unsigned num2 = opnd_array(2)->num_edges(); // src |
1497 | unsigned num3 = opnd_array(3)->num_edges(); // dst |
1498 | unsigned idx0 = oper_input_base(); |
1499 | unsigned idx1 = idx0 + num0; |
1500 | unsigned idx2 = idx1 + num1; |
1501 | unsigned idx3 = idx2 + num2; |
1502 | unsigned idx4 = idx3 + num3; |
1503 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
1504 | del_req(i); |
1505 | } |
1506 | _num_opnds = 3; |
1507 | } else { |
1508 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 1507, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
1509 | } |
1510 | |
1511 | return this; |
1512 | } |
1513 | |
1514 | MachNode* addL_mem_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
1515 | Compile* C = Compile::current(); |
1516 | // Add projection edges for additional defs or kills |
1517 | // DEF/KILL cr |
1518 | MachProjNode *kill; |
1519 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
1520 | proj_list.push(kill); |
1521 | // Remove duplicated operands and inputs which use the same name. |
1522 | if (num_opnds() == 4) { |
1523 | unsigned num0 = 0; |
1524 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
1525 | unsigned num2 = opnd_array(2)->num_edges(); // dst |
1526 | unsigned num3 = opnd_array(3)->num_edges(); // src |
1527 | unsigned idx0 = oper_input_base(); |
1528 | unsigned idx1 = idx0 + num0; |
1529 | unsigned idx2 = idx1 + num1; |
1530 | unsigned idx3 = idx2 + num2; |
1531 | unsigned idx4 = idx3 + num3; |
1532 | set_opnd_array(2, opnd_array(3)->clone()); // src |
1533 | for (unsigned i = 0; i < num3; i++) { |
1534 | set_req(i + idx2, _in[i + idx3]); |
1535 | } |
1536 | num2 = num3; |
1537 | idx3 = idx2 + num2; |
1538 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
1539 | del_req(i); |
1540 | } |
1541 | _num_opnds = 3; |
1542 | } else { |
1543 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 1542, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
1544 | } |
1545 | |
1546 | return this; |
1547 | } |
1548 | |
1549 | MachNode* incL_rRegNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
1550 | Compile* C = Compile::current(); |
1551 | // Add projection edges for additional defs or kills |
1552 | // DEF/KILL cr |
1553 | MachProjNode *kill; |
1554 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
1555 | proj_list.push(kill); |
1556 | |
1557 | return this; |
1558 | } |
1559 | |
1560 | MachNode* incL_memNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
1561 | Compile* C = Compile::current(); |
1562 | // Add projection edges for additional defs or kills |
1563 | // DEF/KILL cr |
1564 | MachProjNode *kill; |
1565 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
1566 | proj_list.push(kill); |
1567 | // Remove duplicated operands and inputs which use the same name. |
1568 | if (num_opnds() == 4) { |
1569 | unsigned num0 = 0; |
1570 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
1571 | unsigned num2 = opnd_array(2)->num_edges(); // dst |
1572 | unsigned num3 = opnd_array(3)->num_edges(); // src |
1573 | unsigned idx0 = oper_input_base(); |
1574 | unsigned idx1 = idx0 + num0; |
1575 | unsigned idx2 = idx1 + num1; |
1576 | unsigned idx3 = idx2 + num2; |
1577 | unsigned idx4 = idx3 + num3; |
1578 | set_opnd_array(2, opnd_array(3)->clone()); // src |
1579 | for (unsigned i = 0; i < num3; i++) { |
1580 | set_req(i + idx2, _in[i + idx3]); |
1581 | } |
1582 | num2 = num3; |
1583 | idx3 = idx2 + num2; |
1584 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
1585 | del_req(i); |
1586 | } |
1587 | _num_opnds = 3; |
1588 | } else { |
1589 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 1588, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
1590 | } |
1591 | |
1592 | return this; |
1593 | } |
1594 | |
1595 | MachNode* decL_rRegNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
1596 | Compile* C = Compile::current(); |
1597 | // Add projection edges for additional defs or kills |
1598 | // DEF/KILL cr |
1599 | MachProjNode *kill; |
1600 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
1601 | proj_list.push(kill); |
1602 | |
1603 | return this; |
1604 | } |
1605 | |
1606 | MachNode* decL_memNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
1607 | Compile* C = Compile::current(); |
1608 | // Add projection edges for additional defs or kills |
1609 | // DEF/KILL cr |
1610 | MachProjNode *kill; |
1611 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
1612 | proj_list.push(kill); |
1613 | // Remove duplicated operands and inputs which use the same name. |
1614 | if (num_opnds() == 4) { |
1615 | unsigned num0 = 0; |
1616 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
1617 | unsigned num2 = opnd_array(2)->num_edges(); // dst |
1618 | unsigned num3 = opnd_array(3)->num_edges(); // src |
1619 | unsigned idx0 = oper_input_base(); |
1620 | unsigned idx1 = idx0 + num0; |
1621 | unsigned idx2 = idx1 + num1; |
1622 | unsigned idx3 = idx2 + num2; |
1623 | unsigned idx4 = idx3 + num3; |
1624 | set_opnd_array(2, opnd_array(3)->clone()); // src |
1625 | for (unsigned i = 0; i < num3; i++) { |
1626 | set_req(i + idx2, _in[i + idx3]); |
1627 | } |
1628 | num2 = num3; |
1629 | idx3 = idx2 + num2; |
1630 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
1631 | del_req(i); |
1632 | } |
1633 | _num_opnds = 3; |
1634 | } else { |
1635 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 1634, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
1636 | } |
1637 | |
1638 | return this; |
1639 | } |
1640 | |
1641 | MachNode* addP_rRegNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
1642 | Compile* C = Compile::current(); |
1643 | // Add projection edges for additional defs or kills |
1644 | // DEF/KILL cr |
1645 | MachProjNode *kill; |
1646 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
1647 | proj_list.push(kill); |
1648 | |
1649 | return this; |
1650 | } |
1651 | |
1652 | MachNode* addP_rReg_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
1653 | Compile* C = Compile::current(); |
1654 | // Add projection edges for additional defs or kills |
1655 | // DEF/KILL cr |
1656 | MachProjNode *kill; |
1657 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
1658 | proj_list.push(kill); |
1659 | |
1660 | return this; |
1661 | } |
1662 | |
1663 | MachNode* storeIConditionalNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
1664 | Compile* C = Compile::current(); |
1665 | // Add projection edges for additional defs or kills |
1666 | // DEF/KILL oldval |
1667 | MachProjNode *kill; |
1668 | kill = new MachProjNode( this, 1, (INT_RAX_REG_mask()), Op_RegI ); |
1669 | proj_list.push(kill); |
1670 | |
1671 | return this; |
1672 | } |
1673 | |
1674 | MachNode* storeLConditionalNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
1675 | Compile* C = Compile::current(); |
1676 | // Add projection edges for additional defs or kills |
1677 | // DEF/KILL oldval |
1678 | MachProjNode *kill; |
1679 | kill = new MachProjNode( this, 1, (LONG_RAX_REG_mask()), Op_RegL ); |
1680 | proj_list.push(kill); |
1681 | |
1682 | return this; |
1683 | } |
1684 | |
1685 | MachNode* compareAndSwapPNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
1686 | Compile* C = Compile::current(); |
1687 | // Add projection edges for additional defs or kills |
1688 | // DEF/KILL oldval |
1689 | MachProjNode *kill; |
1690 | kill = new MachProjNode( this, 1, (PTR_RAX_REG_mask()), Op_RegP ); |
1691 | proj_list.push(kill); |
1692 | // DEF/KILL cr |
1693 | kill = new MachProjNode( this, 2, (INT_FLAGS_mask()), Op_RegFlags ); |
1694 | proj_list.push(kill); |
1695 | |
1696 | return this; |
1697 | } |
1698 | |
1699 | MachNode* compareAndSwapP_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
1700 | Compile* C = Compile::current(); |
1701 | // Add projection edges for additional defs or kills |
1702 | // DEF/KILL oldval |
1703 | MachProjNode *kill; |
1704 | kill = new MachProjNode( this, 1, (PTR_RAX_REG_mask()), Op_RegP ); |
1705 | proj_list.push(kill); |
1706 | // DEF/KILL cr |
1707 | kill = new MachProjNode( this, 2, (INT_FLAGS_mask()), Op_RegFlags ); |
1708 | proj_list.push(kill); |
1709 | |
1710 | return this; |
1711 | } |
1712 | |
1713 | MachNode* compareAndSwapLNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
1714 | Compile* C = Compile::current(); |
1715 | // Add projection edges for additional defs or kills |
1716 | // DEF/KILL oldval |
1717 | MachProjNode *kill; |
1718 | kill = new MachProjNode( this, 1, (LONG_RAX_REG_mask()), Op_RegL ); |
1719 | proj_list.push(kill); |
1720 | // DEF/KILL cr |
1721 | kill = new MachProjNode( this, 2, (INT_FLAGS_mask()), Op_RegFlags ); |
1722 | proj_list.push(kill); |
1723 | |
1724 | return this; |
1725 | } |
1726 | |
1727 | MachNode* compareAndSwapL_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
1728 | Compile* C = Compile::current(); |
1729 | // Add projection edges for additional defs or kills |
1730 | // DEF/KILL oldval |
1731 | MachProjNode *kill; |
1732 | kill = new MachProjNode( this, 1, (LONG_RAX_REG_mask()), Op_RegL ); |
1733 | proj_list.push(kill); |
1734 | // DEF/KILL cr |
1735 | kill = new MachProjNode( this, 2, (INT_FLAGS_mask()), Op_RegFlags ); |
1736 | proj_list.push(kill); |
1737 | |
1738 | return this; |
1739 | } |
1740 | |
1741 | MachNode* compareAndSwapINode::Expand(State* state, Node_List& proj_list, Node* mem) { |
1742 | Compile* C = Compile::current(); |
1743 | // Add projection edges for additional defs or kills |
1744 | // DEF/KILL oldval |
1745 | MachProjNode *kill; |
1746 | kill = new MachProjNode( this, 1, (INT_RAX_REG_mask()), Op_RegI ); |
1747 | proj_list.push(kill); |
1748 | // DEF/KILL cr |
1749 | kill = new MachProjNode( this, 2, (INT_FLAGS_mask()), Op_RegFlags ); |
1750 | proj_list.push(kill); |
1751 | |
1752 | return this; |
1753 | } |
1754 | |
1755 | MachNode* compareAndSwapI_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
1756 | Compile* C = Compile::current(); |
1757 | // Add projection edges for additional defs or kills |
1758 | // DEF/KILL oldval |
1759 | MachProjNode *kill; |
1760 | kill = new MachProjNode( this, 1, (INT_RAX_REG_mask()), Op_RegI ); |
1761 | proj_list.push(kill); |
1762 | // DEF/KILL cr |
1763 | kill = new MachProjNode( this, 2, (INT_FLAGS_mask()), Op_RegFlags ); |
1764 | proj_list.push(kill); |
1765 | |
1766 | return this; |
1767 | } |
1768 | |
1769 | MachNode* compareAndSwapBNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
1770 | Compile* C = Compile::current(); |
1771 | // Add projection edges for additional defs or kills |
1772 | // DEF/KILL oldval |
1773 | MachProjNode *kill; |
1774 | kill = new MachProjNode( this, 1, (INT_RAX_REG_mask()), Op_RegI ); |
1775 | proj_list.push(kill); |
1776 | // DEF/KILL cr |
1777 | kill = new MachProjNode( this, 2, (INT_FLAGS_mask()), Op_RegFlags ); |
1778 | proj_list.push(kill); |
1779 | |
1780 | return this; |
1781 | } |
1782 | |
1783 | MachNode* compareAndSwapB_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
1784 | Compile* C = Compile::current(); |
1785 | // Add projection edges for additional defs or kills |
1786 | // DEF/KILL oldval |
1787 | MachProjNode *kill; |
1788 | kill = new MachProjNode( this, 1, (INT_RAX_REG_mask()), Op_RegI ); |
1789 | proj_list.push(kill); |
1790 | // DEF/KILL cr |
1791 | kill = new MachProjNode( this, 2, (INT_FLAGS_mask()), Op_RegFlags ); |
1792 | proj_list.push(kill); |
1793 | |
1794 | return this; |
1795 | } |
1796 | |
1797 | MachNode* compareAndSwapSNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
1798 | Compile* C = Compile::current(); |
1799 | // Add projection edges for additional defs or kills |
1800 | // DEF/KILL oldval |
1801 | MachProjNode *kill; |
1802 | kill = new MachProjNode( this, 1, (INT_RAX_REG_mask()), Op_RegI ); |
1803 | proj_list.push(kill); |
1804 | // DEF/KILL cr |
1805 | kill = new MachProjNode( this, 2, (INT_FLAGS_mask()), Op_RegFlags ); |
1806 | proj_list.push(kill); |
1807 | |
1808 | return this; |
1809 | } |
1810 | |
1811 | MachNode* compareAndSwapS_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
1812 | Compile* C = Compile::current(); |
1813 | // Add projection edges for additional defs or kills |
1814 | // DEF/KILL oldval |
1815 | MachProjNode *kill; |
1816 | kill = new MachProjNode( this, 1, (INT_RAX_REG_mask()), Op_RegI ); |
1817 | proj_list.push(kill); |
1818 | // DEF/KILL cr |
1819 | kill = new MachProjNode( this, 2, (INT_FLAGS_mask()), Op_RegFlags ); |
1820 | proj_list.push(kill); |
1821 | |
1822 | return this; |
1823 | } |
1824 | |
1825 | MachNode* compareAndSwapNNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
1826 | Compile* C = Compile::current(); |
1827 | // Add projection edges for additional defs or kills |
1828 | // DEF/KILL oldval |
1829 | MachProjNode *kill; |
1830 | kill = new MachProjNode( this, 1, (INT_RAX_REG_mask()), Op_RegN ); |
1831 | proj_list.push(kill); |
1832 | // DEF/KILL cr |
1833 | kill = new MachProjNode( this, 2, (INT_FLAGS_mask()), Op_RegFlags ); |
1834 | proj_list.push(kill); |
1835 | |
1836 | return this; |
1837 | } |
1838 | |
1839 | MachNode* compareAndSwapN_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
1840 | Compile* C = Compile::current(); |
1841 | // Add projection edges for additional defs or kills |
1842 | // DEF/KILL oldval |
1843 | MachProjNode *kill; |
1844 | kill = new MachProjNode( this, 1, (INT_RAX_REG_mask()), Op_RegN ); |
1845 | proj_list.push(kill); |
1846 | // DEF/KILL cr |
1847 | kill = new MachProjNode( this, 2, (INT_FLAGS_mask()), Op_RegFlags ); |
1848 | proj_list.push(kill); |
1849 | |
1850 | return this; |
1851 | } |
1852 | |
1853 | MachNode* compareAndExchangeBNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
1854 | Compile* C = Compile::current(); |
1855 | // Add projection edges for additional defs or kills |
1856 | // DEF/KILL cr |
1857 | MachProjNode *kill; |
1858 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
1859 | proj_list.push(kill); |
1860 | |
1861 | return this; |
1862 | } |
1863 | |
1864 | MachNode* compareAndExchangeSNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
1865 | Compile* C = Compile::current(); |
1866 | // Add projection edges for additional defs or kills |
1867 | // DEF/KILL cr |
1868 | MachProjNode *kill; |
1869 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
1870 | proj_list.push(kill); |
1871 | |
1872 | return this; |
1873 | } |
1874 | |
1875 | MachNode* compareAndExchangeINode::Expand(State* state, Node_List& proj_list, Node* mem) { |
1876 | Compile* C = Compile::current(); |
1877 | // Add projection edges for additional defs or kills |
1878 | // DEF/KILL cr |
1879 | MachProjNode *kill; |
1880 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
1881 | proj_list.push(kill); |
1882 | |
1883 | return this; |
1884 | } |
1885 | |
1886 | MachNode* compareAndExchangeLNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
1887 | Compile* C = Compile::current(); |
1888 | // Add projection edges for additional defs or kills |
1889 | // DEF/KILL cr |
1890 | MachProjNode *kill; |
1891 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
1892 | proj_list.push(kill); |
1893 | |
1894 | return this; |
1895 | } |
1896 | |
1897 | MachNode* compareAndExchangeNNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
1898 | Compile* C = Compile::current(); |
1899 | // Add projection edges for additional defs or kills |
1900 | // DEF/KILL cr |
1901 | MachProjNode *kill; |
1902 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
1903 | proj_list.push(kill); |
1904 | |
1905 | return this; |
1906 | } |
1907 | |
1908 | MachNode* compareAndExchangePNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
1909 | Compile* C = Compile::current(); |
1910 | // Add projection edges for additional defs or kills |
1911 | // DEF/KILL cr |
1912 | MachProjNode *kill; |
1913 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
1914 | proj_list.push(kill); |
1915 | |
1916 | return this; |
1917 | } |
1918 | |
1919 | MachNode* xaddB_no_resNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
1920 | Compile* C = Compile::current(); |
1921 | // Add projection edges for additional defs or kills |
1922 | // DEF/KILL cr |
1923 | MachProjNode *kill; |
1924 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
1925 | proj_list.push(kill); |
1926 | |
1927 | return this; |
1928 | } |
1929 | |
1930 | MachNode* xaddBNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
1931 | Compile* C = Compile::current(); |
1932 | // Add projection edges for additional defs or kills |
1933 | // DEF/KILL cr |
1934 | MachProjNode *kill; |
1935 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
1936 | proj_list.push(kill); |
1937 | |
1938 | return this; |
1939 | } |
1940 | |
1941 | MachNode* xaddS_no_resNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
1942 | Compile* C = Compile::current(); |
1943 | // Add projection edges for additional defs or kills |
1944 | // DEF/KILL cr |
1945 | MachProjNode *kill; |
1946 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
1947 | proj_list.push(kill); |
1948 | |
1949 | return this; |
1950 | } |
1951 | |
1952 | MachNode* xaddSNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
1953 | Compile* C = Compile::current(); |
1954 | // Add projection edges for additional defs or kills |
1955 | // DEF/KILL cr |
1956 | MachProjNode *kill; |
1957 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
1958 | proj_list.push(kill); |
1959 | |
1960 | return this; |
1961 | } |
1962 | |
1963 | MachNode* xaddI_no_resNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
1964 | Compile* C = Compile::current(); |
1965 | // Add projection edges for additional defs or kills |
1966 | // DEF/KILL cr |
1967 | MachProjNode *kill; |
1968 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
1969 | proj_list.push(kill); |
1970 | |
1971 | return this; |
1972 | } |
1973 | |
1974 | MachNode* xaddINode::Expand(State* state, Node_List& proj_list, Node* mem) { |
1975 | Compile* C = Compile::current(); |
1976 | // Add projection edges for additional defs or kills |
1977 | // DEF/KILL cr |
1978 | MachProjNode *kill; |
1979 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
1980 | proj_list.push(kill); |
1981 | |
1982 | return this; |
1983 | } |
1984 | |
1985 | MachNode* xaddL_no_resNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
1986 | Compile* C = Compile::current(); |
1987 | // Add projection edges for additional defs or kills |
1988 | // DEF/KILL cr |
1989 | MachProjNode *kill; |
1990 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
1991 | proj_list.push(kill); |
1992 | |
1993 | return this; |
1994 | } |
1995 | |
1996 | MachNode* xaddLNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
1997 | Compile* C = Compile::current(); |
1998 | // Add projection edges for additional defs or kills |
1999 | // DEF/KILL cr |
2000 | MachProjNode *kill; |
2001 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
2002 | proj_list.push(kill); |
2003 | |
2004 | return this; |
2005 | } |
2006 | |
2007 | MachNode* absI_rRegNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
2008 | Compile* C = Compile::current(); |
2009 | // Add projection edges for additional defs or kills |
2010 | // TEMP dst |
2011 | MachTempNode *def; |
2012 | def = new MachTempNode(state->MachOperGenerator(RREGI)); |
2013 | add_req(def); |
2014 | // TEMP tmp |
2015 | def = new MachTempNode(state->MachOperGenerator(RREGI)); |
2016 | add_req(def); |
2017 | // DEF/KILL cr |
2018 | MachProjNode *kill; |
2019 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
2020 | proj_list.push(kill); |
2021 | |
2022 | return this; |
2023 | } |
2024 | |
2025 | MachNode* absL_rRegNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
2026 | Compile* C = Compile::current(); |
2027 | // Add projection edges for additional defs or kills |
2028 | // TEMP dst |
2029 | MachTempNode *def; |
2030 | def = new MachTempNode(state->MachOperGenerator(RREGL)); |
2031 | add_req(def); |
2032 | // TEMP tmp |
2033 | def = new MachTempNode(state->MachOperGenerator(RREGL)); |
2034 | add_req(def); |
2035 | // DEF/KILL cr |
2036 | MachProjNode *kill; |
2037 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
2038 | proj_list.push(kill); |
2039 | |
2040 | return this; |
2041 | } |
2042 | |
2043 | MachNode* subI_rRegNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
2044 | Compile* C = Compile::current(); |
2045 | // Add projection edges for additional defs or kills |
2046 | // DEF/KILL cr |
2047 | MachProjNode *kill; |
2048 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
2049 | proj_list.push(kill); |
2050 | |
2051 | return this; |
2052 | } |
2053 | |
2054 | MachNode* subI_rReg_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
2055 | Compile* C = Compile::current(); |
2056 | // Add projection edges for additional defs or kills |
2057 | // DEF/KILL cr |
2058 | MachProjNode *kill; |
2059 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
2060 | proj_list.push(kill); |
2061 | |
2062 | return this; |
2063 | } |
2064 | |
2065 | MachNode* subI_rReg_memNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
2066 | Compile* C = Compile::current(); |
2067 | // Add projection edges for additional defs or kills |
2068 | // DEF/KILL cr |
2069 | MachProjNode *kill; |
2070 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
2071 | proj_list.push(kill); |
2072 | |
2073 | return this; |
2074 | } |
2075 | |
2076 | MachNode* subI_mem_rRegNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
2077 | Compile* C = Compile::current(); |
2078 | // Add projection edges for additional defs or kills |
2079 | // DEF/KILL cr |
2080 | MachProjNode *kill; |
2081 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
2082 | proj_list.push(kill); |
2083 | // Remove duplicated operands and inputs which use the same name. |
2084 | if (num_opnds() == 4) { |
2085 | unsigned num0 = 0; |
2086 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
2087 | unsigned num2 = opnd_array(2)->num_edges(); // dst |
2088 | unsigned num3 = opnd_array(3)->num_edges(); // src |
2089 | unsigned idx0 = oper_input_base(); |
2090 | unsigned idx1 = idx0 + num0; |
2091 | unsigned idx2 = idx1 + num1; |
2092 | unsigned idx3 = idx2 + num2; |
2093 | unsigned idx4 = idx3 + num3; |
2094 | set_opnd_array(2, opnd_array(3)->clone()); // src |
2095 | for (unsigned i = 0; i < num3; i++) { |
2096 | set_req(i + idx2, _in[i + idx3]); |
2097 | } |
2098 | num2 = num3; |
2099 | idx3 = idx2 + num2; |
2100 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
2101 | del_req(i); |
2102 | } |
2103 | _num_opnds = 3; |
2104 | } else { |
2105 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 2104, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
2106 | } |
2107 | |
2108 | return this; |
2109 | } |
2110 | |
2111 | MachNode* subI_mem_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
2112 | Compile* C = Compile::current(); |
2113 | // Add projection edges for additional defs or kills |
2114 | // DEF/KILL cr |
2115 | MachProjNode *kill; |
2116 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
2117 | proj_list.push(kill); |
2118 | // Remove duplicated operands and inputs which use the same name. |
2119 | if (num_opnds() == 4) { |
2120 | unsigned num0 = 0; |
2121 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
2122 | unsigned num2 = opnd_array(2)->num_edges(); // dst |
2123 | unsigned num3 = opnd_array(3)->num_edges(); // src |
2124 | unsigned idx0 = oper_input_base(); |
2125 | unsigned idx1 = idx0 + num0; |
2126 | unsigned idx2 = idx1 + num1; |
2127 | unsigned idx3 = idx2 + num2; |
2128 | unsigned idx4 = idx3 + num3; |
2129 | set_opnd_array(2, opnd_array(3)->clone()); // src |
2130 | for (unsigned i = 0; i < num3; i++) { |
2131 | set_req(i + idx2, _in[i + idx3]); |
2132 | } |
2133 | num2 = num3; |
2134 | idx3 = idx2 + num2; |
2135 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
2136 | del_req(i); |
2137 | } |
2138 | _num_opnds = 3; |
2139 | } else { |
2140 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 2139, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
2141 | } |
2142 | |
2143 | return this; |
2144 | } |
2145 | |
2146 | MachNode* subL_rRegNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
2147 | Compile* C = Compile::current(); |
2148 | // Add projection edges for additional defs or kills |
2149 | // DEF/KILL cr |
2150 | MachProjNode *kill; |
2151 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
2152 | proj_list.push(kill); |
2153 | |
2154 | return this; |
2155 | } |
2156 | |
2157 | MachNode* subL_rReg_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
2158 | Compile* C = Compile::current(); |
2159 | // Add projection edges for additional defs or kills |
2160 | // DEF/KILL cr |
2161 | MachProjNode *kill; |
2162 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
2163 | proj_list.push(kill); |
2164 | |
2165 | return this; |
2166 | } |
2167 | |
2168 | MachNode* subL_rReg_memNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
2169 | Compile* C = Compile::current(); |
2170 | // Add projection edges for additional defs or kills |
2171 | // DEF/KILL cr |
2172 | MachProjNode *kill; |
2173 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
2174 | proj_list.push(kill); |
2175 | |
2176 | return this; |
2177 | } |
2178 | |
2179 | MachNode* subL_mem_rRegNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
2180 | Compile* C = Compile::current(); |
2181 | // Add projection edges for additional defs or kills |
2182 | // DEF/KILL cr |
2183 | MachProjNode *kill; |
2184 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
2185 | proj_list.push(kill); |
2186 | // Remove duplicated operands and inputs which use the same name. |
2187 | if (num_opnds() == 4) { |
2188 | unsigned num0 = 0; |
2189 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
2190 | unsigned num2 = opnd_array(2)->num_edges(); // dst |
2191 | unsigned num3 = opnd_array(3)->num_edges(); // src |
2192 | unsigned idx0 = oper_input_base(); |
2193 | unsigned idx1 = idx0 + num0; |
2194 | unsigned idx2 = idx1 + num1; |
2195 | unsigned idx3 = idx2 + num2; |
2196 | unsigned idx4 = idx3 + num3; |
2197 | set_opnd_array(2, opnd_array(3)->clone()); // src |
2198 | for (unsigned i = 0; i < num3; i++) { |
2199 | set_req(i + idx2, _in[i + idx3]); |
2200 | } |
2201 | num2 = num3; |
2202 | idx3 = idx2 + num2; |
2203 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
2204 | del_req(i); |
2205 | } |
2206 | _num_opnds = 3; |
2207 | } else { |
2208 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 2207, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
2209 | } |
2210 | |
2211 | return this; |
2212 | } |
2213 | |
2214 | MachNode* subL_mem_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
2215 | Compile* C = Compile::current(); |
2216 | // Add projection edges for additional defs or kills |
2217 | // DEF/KILL cr |
2218 | MachProjNode *kill; |
2219 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
2220 | proj_list.push(kill); |
2221 | // Remove duplicated operands and inputs which use the same name. |
2222 | if (num_opnds() == 4) { |
2223 | unsigned num0 = 0; |
2224 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
2225 | unsigned num2 = opnd_array(2)->num_edges(); // dst |
2226 | unsigned num3 = opnd_array(3)->num_edges(); // src |
2227 | unsigned idx0 = oper_input_base(); |
2228 | unsigned idx1 = idx0 + num0; |
2229 | unsigned idx2 = idx1 + num1; |
2230 | unsigned idx3 = idx2 + num2; |
2231 | unsigned idx4 = idx3 + num3; |
2232 | set_opnd_array(2, opnd_array(3)->clone()); // src |
2233 | for (unsigned i = 0; i < num3; i++) { |
2234 | set_req(i + idx2, _in[i + idx3]); |
2235 | } |
2236 | num2 = num3; |
2237 | idx3 = idx2 + num2; |
2238 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
2239 | del_req(i); |
2240 | } |
2241 | _num_opnds = 3; |
2242 | } else { |
2243 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 2242, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
2244 | } |
2245 | |
2246 | return this; |
2247 | } |
2248 | |
2249 | MachNode* subP_rRegNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
2250 | Compile* C = Compile::current(); |
2251 | // Add projection edges for additional defs or kills |
2252 | // DEF/KILL cr |
2253 | MachProjNode *kill; |
2254 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
2255 | proj_list.push(kill); |
2256 | |
2257 | return this; |
2258 | } |
2259 | |
2260 | MachNode* negI_rRegNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
2261 | Compile* C = Compile::current(); |
2262 | // Add projection edges for additional defs or kills |
2263 | // DEF/KILL cr |
2264 | MachProjNode *kill; |
2265 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
2266 | proj_list.push(kill); |
2267 | |
2268 | return this; |
2269 | } |
2270 | |
2271 | MachNode* negI_rReg_2Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
2272 | Compile* C = Compile::current(); |
2273 | // Add projection edges for additional defs or kills |
2274 | // DEF/KILL cr |
2275 | MachProjNode *kill; |
2276 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
2277 | proj_list.push(kill); |
2278 | |
2279 | return this; |
2280 | } |
2281 | |
2282 | MachNode* negI_memNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
2283 | Compile* C = Compile::current(); |
2284 | // Add projection edges for additional defs or kills |
2285 | // DEF/KILL cr |
2286 | MachProjNode *kill; |
2287 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
2288 | proj_list.push(kill); |
2289 | // Remove duplicated operands and inputs which use the same name. |
2290 | if (num_opnds() == 4) { |
2291 | unsigned num0 = 0; |
2292 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
2293 | unsigned num2 = opnd_array(2)->num_edges(); // zero |
2294 | unsigned num3 = opnd_array(3)->num_edges(); // dst |
2295 | unsigned idx0 = oper_input_base(); |
2296 | unsigned idx1 = idx0 + num0; |
2297 | unsigned idx2 = idx1 + num1; |
2298 | unsigned idx3 = idx2 + num2; |
2299 | unsigned idx4 = idx3 + num3; |
2300 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
2301 | del_req(i); |
2302 | } |
2303 | _num_opnds = 3; |
2304 | } else { |
2305 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 2304, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
2306 | } |
2307 | |
2308 | return this; |
2309 | } |
2310 | |
2311 | MachNode* negL_rRegNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
2312 | Compile* C = Compile::current(); |
2313 | // Add projection edges for additional defs or kills |
2314 | // DEF/KILL cr |
2315 | MachProjNode *kill; |
2316 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
2317 | proj_list.push(kill); |
2318 | |
2319 | return this; |
2320 | } |
2321 | |
2322 | MachNode* negL_rReg_2Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
2323 | Compile* C = Compile::current(); |
2324 | // Add projection edges for additional defs or kills |
2325 | // DEF/KILL cr |
2326 | MachProjNode *kill; |
2327 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
2328 | proj_list.push(kill); |
2329 | |
2330 | return this; |
2331 | } |
2332 | |
2333 | MachNode* negL_memNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
2334 | Compile* C = Compile::current(); |
2335 | // Add projection edges for additional defs or kills |
2336 | // DEF/KILL cr |
2337 | MachProjNode *kill; |
2338 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
2339 | proj_list.push(kill); |
2340 | // Remove duplicated operands and inputs which use the same name. |
2341 | if (num_opnds() == 4) { |
2342 | unsigned num0 = 0; |
2343 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
2344 | unsigned num2 = opnd_array(2)->num_edges(); // zero |
2345 | unsigned num3 = opnd_array(3)->num_edges(); // dst |
2346 | unsigned idx0 = oper_input_base(); |
2347 | unsigned idx1 = idx0 + num0; |
2348 | unsigned idx2 = idx1 + num1; |
2349 | unsigned idx3 = idx2 + num2; |
2350 | unsigned idx4 = idx3 + num3; |
2351 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
2352 | del_req(i); |
2353 | } |
2354 | _num_opnds = 3; |
2355 | } else { |
2356 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 2355, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
2357 | } |
2358 | |
2359 | return this; |
2360 | } |
2361 | |
2362 | MachNode* mulI_rRegNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
2363 | Compile* C = Compile::current(); |
2364 | // Add projection edges for additional defs or kills |
2365 | // DEF/KILL cr |
2366 | MachProjNode *kill; |
2367 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
2368 | proj_list.push(kill); |
2369 | |
2370 | return this; |
2371 | } |
2372 | |
2373 | MachNode* mulI_rReg_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
2374 | Compile* C = Compile::current(); |
2375 | // Add projection edges for additional defs or kills |
2376 | // DEF/KILL cr |
2377 | MachProjNode *kill; |
2378 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
2379 | proj_list.push(kill); |
2380 | |
2381 | return this; |
2382 | } |
2383 | |
2384 | MachNode* mulI_memNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
2385 | Compile* C = Compile::current(); |
2386 | // Add projection edges for additional defs or kills |
2387 | // DEF/KILL cr |
2388 | MachProjNode *kill; |
2389 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
2390 | proj_list.push(kill); |
2391 | |
2392 | return this; |
2393 | } |
2394 | |
2395 | MachNode* mulI_mem_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
2396 | Compile* C = Compile::current(); |
2397 | // Add projection edges for additional defs or kills |
2398 | // DEF/KILL cr |
2399 | MachProjNode *kill; |
2400 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
2401 | proj_list.push(kill); |
2402 | |
2403 | return this; |
2404 | } |
2405 | |
2406 | MachNode* mulI_mem_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
2407 | Compile* C = Compile::current(); |
2408 | // Add projection edges for additional defs or kills |
2409 | // DEF/KILL cr |
2410 | MachProjNode *kill; |
2411 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
2412 | proj_list.push(kill); |
2413 | |
2414 | return this; |
2415 | } |
2416 | |
2417 | MachNode* mulAddS2I_rRegNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
2418 | Compile* C = Compile::current(); |
2419 | MachNode *tmp0 = this; |
2420 | MachNode *tmp1 = this; |
2421 | MachNode *tmp2 = this; |
2422 | MachNode *tmp3 = this; |
2423 | MachNode *tmp4 = this; |
2424 | unsigned num0 = 0; |
2425 | unsigned num1 = opnd_array(1)->num_edges(); |
2426 | unsigned num2 = opnd_array(2)->num_edges(); |
2427 | unsigned num3 = opnd_array(3)->num_edges(); |
2428 | unsigned num4 = opnd_array(4)->num_edges(); |
2429 | unsigned idx0 = oper_input_base(); |
2430 | unsigned idx1 = idx0 + num0; |
2431 | unsigned idx2 = idx1 + num1; |
2432 | unsigned idx3 = idx2 + num2; |
2433 | unsigned idx4 = idx3 + num3; |
2434 | unsigned idx5 = idx4 + num4; |
2435 | MachNode *result = NULL__null; |
2436 | |
2437 | mulI_rRegNode *n0 = new mulI_rRegNode(); |
2438 | n0->add_req(_in[0]); |
2439 | n0->set_opnd_array(0, state->MachOperGenerator(RREGI)); |
2440 | n0->set_opnd_array(1, opnd_array(1)->clone()); // dst |
2441 | if(tmp1 == this) { |
2442 | for(unsigned i = 0; i < num1; i++) { |
2443 | n0->add_req(_in[i + idx1]); |
2444 | } |
2445 | } |
2446 | else n0->add_req(tmp1); |
2447 | tmp1 = n0; |
2448 | n0->set_opnd_array(2, opnd_array(2)->clone()); // src1 |
2449 | if(tmp2 == this) { |
2450 | for(unsigned i = 0; i < num2; i++) { |
2451 | n0->add_req(_in[i + idx2]); |
2452 | } |
2453 | } |
2454 | else n0->add_req(tmp2); |
2455 | result = n0->Expand( state, proj_list, mem ); |
2456 | |
2457 | mulI_rRegNode *n1 = new mulI_rRegNode(); |
2458 | n1->add_req(_in[0]); |
2459 | n1->set_opnd_array(0, state->MachOperGenerator(RREGI)); |
2460 | n1->set_opnd_array(1, opnd_array(3)->clone()); // src2 |
2461 | if(tmp3 == this) { |
2462 | for(unsigned i = 0; i < num3; i++) { |
2463 | n1->add_req(_in[i + idx3]); |
2464 | } |
2465 | } |
2466 | else n1->add_req(tmp3); |
2467 | tmp3 = n1; |
2468 | n1->set_opnd_array(2, opnd_array(4)->clone()); // src3 |
2469 | if(tmp4 == this) { |
2470 | for(unsigned i = 0; i < num4; i++) { |
2471 | n1->add_req(_in[i + idx4]); |
2472 | } |
2473 | } |
2474 | else n1->add_req(tmp4); |
2475 | result = n1->Expand( state, proj_list, mem ); |
2476 | |
2477 | addI_rRegNode *n2 = new addI_rRegNode(); |
2478 | n2->add_req(_in[0]); |
2479 | n2->set_opnd_array(0, state->MachOperGenerator(RREGI)); |
2480 | n2->set_opnd_array(1, opnd_array(1)->clone()); // dst |
2481 | if(tmp1 == this) { |
2482 | for(unsigned i = 0; i < num1; i++) { |
2483 | n2->add_req(_in[i + idx1]); |
2484 | } |
2485 | } |
2486 | else n2->add_req(tmp1); |
2487 | tmp1 = n2; |
2488 | n2->set_opnd_array(2, opnd_array(3)->clone()); // src2 |
2489 | if(tmp3 == this) { |
2490 | for(unsigned i = 0; i < num3; i++) { |
2491 | n2->add_req(_in[i + idx3]); |
2492 | } |
2493 | } |
2494 | else n2->add_req(tmp3); |
2495 | result = n2->Expand( state, proj_list, mem ); |
2496 | |
2497 | |
2498 | return result; |
2499 | } |
2500 | |
2501 | MachNode* mulL_rRegNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
2502 | Compile* C = Compile::current(); |
2503 | // Add projection edges for additional defs or kills |
2504 | // DEF/KILL cr |
2505 | MachProjNode *kill; |
2506 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
2507 | proj_list.push(kill); |
2508 | |
2509 | return this; |
2510 | } |
2511 | |
2512 | MachNode* mulL_rReg_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
2513 | Compile* C = Compile::current(); |
2514 | // Add projection edges for additional defs or kills |
2515 | // DEF/KILL cr |
2516 | MachProjNode *kill; |
2517 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
2518 | proj_list.push(kill); |
2519 | |
2520 | return this; |
2521 | } |
2522 | |
2523 | MachNode* mulL_memNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
2524 | Compile* C = Compile::current(); |
2525 | // Add projection edges for additional defs or kills |
2526 | // DEF/KILL cr |
2527 | MachProjNode *kill; |
2528 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
2529 | proj_list.push(kill); |
2530 | |
2531 | return this; |
2532 | } |
2533 | |
2534 | MachNode* mulL_mem_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
2535 | Compile* C = Compile::current(); |
2536 | // Add projection edges for additional defs or kills |
2537 | // DEF/KILL cr |
2538 | MachProjNode *kill; |
2539 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
2540 | proj_list.push(kill); |
2541 | |
2542 | return this; |
2543 | } |
2544 | |
2545 | MachNode* mulL_mem_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
2546 | Compile* C = Compile::current(); |
2547 | // Add projection edges for additional defs or kills |
2548 | // DEF/KILL cr |
2549 | MachProjNode *kill; |
2550 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
2551 | proj_list.push(kill); |
2552 | |
2553 | return this; |
2554 | } |
2555 | |
2556 | MachNode* mulHiL_rRegNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
2557 | Compile* C = Compile::current(); |
2558 | // Add projection edges for additional defs or kills |
2559 | // DEF/KILL rax |
2560 | MachProjNode *kill; |
2561 | kill = new MachProjNode( this, 1, (LONG_RAX_REG_mask()), Op_RegL ); |
2562 | proj_list.push(kill); |
2563 | // DEF/KILL cr |
2564 | kill = new MachProjNode( this, 2, (INT_FLAGS_mask()), Op_RegFlags ); |
2565 | proj_list.push(kill); |
2566 | |
2567 | return this; |
2568 | } |
2569 | |
2570 | MachNode* umulHiL_rRegNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
2571 | Compile* C = Compile::current(); |
2572 | // Add projection edges for additional defs or kills |
2573 | // DEF/KILL rax |
2574 | MachProjNode *kill; |
2575 | kill = new MachProjNode( this, 1, (LONG_RAX_REG_mask()), Op_RegL ); |
2576 | proj_list.push(kill); |
2577 | // DEF/KILL cr |
2578 | kill = new MachProjNode( this, 2, (INT_FLAGS_mask()), Op_RegFlags ); |
2579 | proj_list.push(kill); |
2580 | |
2581 | return this; |
2582 | } |
2583 | |
2584 | MachNode* divI_rRegNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
2585 | Compile* C = Compile::current(); |
2586 | // Add projection edges for additional defs or kills |
2587 | // DEF/KILL rdx |
2588 | MachProjNode *kill; |
2589 | kill = new MachProjNode( this, 1, (INT_RDX_REG_mask()), Op_RegI ); |
2590 | proj_list.push(kill); |
2591 | // DEF/KILL cr |
2592 | kill = new MachProjNode( this, 2, (INT_FLAGS_mask()), Op_RegFlags ); |
2593 | proj_list.push(kill); |
2594 | |
2595 | return this; |
2596 | } |
2597 | |
2598 | MachNode* divL_rRegNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
2599 | Compile* C = Compile::current(); |
2600 | // Add projection edges for additional defs or kills |
2601 | // DEF/KILL rdx |
2602 | MachProjNode *kill; |
2603 | kill = new MachProjNode( this, 1, (LONG_RDX_REG_mask()), Op_RegL ); |
2604 | proj_list.push(kill); |
2605 | // DEF/KILL cr |
2606 | kill = new MachProjNode( this, 2, (INT_FLAGS_mask()), Op_RegFlags ); |
2607 | proj_list.push(kill); |
2608 | |
2609 | return this; |
2610 | } |
2611 | |
2612 | MachNode* divModI_rReg_divmodNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
2613 | Compile* C = Compile::current(); |
2614 | // Add projection edges for additional defs or kills |
2615 | // DEF/KILL cr |
2616 | MachProjNode *kill; |
2617 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
2618 | proj_list.push(kill); |
2619 | |
2620 | return this; |
2621 | } |
2622 | |
2623 | MachNode* divModL_rReg_divmodNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
2624 | Compile* C = Compile::current(); |
2625 | // Add projection edges for additional defs or kills |
2626 | // DEF/KILL cr |
2627 | MachProjNode *kill; |
2628 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
2629 | proj_list.push(kill); |
2630 | |
2631 | return this; |
2632 | } |
2633 | |
2634 | MachNode* mul_hiNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
2635 | Compile* C = Compile::current(); |
2636 | // Add projection edges for additional defs or kills |
2637 | // DEF/KILL rax |
2638 | MachProjNode *kill; |
2639 | kill = new MachProjNode( this, 1, (LONG_RAX_REG_mask()), Op_RegL ); |
2640 | proj_list.push(kill); |
2641 | // DEF/KILL cr |
2642 | kill = new MachProjNode( this, 2, (INT_FLAGS_mask()), Op_RegFlags ); |
2643 | proj_list.push(kill); |
2644 | |
2645 | return this; |
2646 | } |
2647 | |
2648 | MachNode* sarL_rReg_63Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
2649 | Compile* C = Compile::current(); |
2650 | // Add projection edges for additional defs or kills |
2651 | // DEF/KILL cr |
2652 | MachProjNode *kill; |
2653 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
2654 | proj_list.push(kill); |
2655 | |
2656 | return this; |
2657 | } |
2658 | |
2659 | MachNode* sarL_rReg_2Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
2660 | Compile* C = Compile::current(); |
2661 | // Add projection edges for additional defs or kills |
2662 | // DEF/KILL cr |
2663 | MachProjNode *kill; |
2664 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
2665 | proj_list.push(kill); |
2666 | |
2667 | return this; |
2668 | } |
2669 | |
2670 | MachNode* divL_10Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
2671 | Compile* C = Compile::current(); |
2672 | MachOper *op0 = new rax_RegLOper(); |
2673 | MachOper *op1 = new rFlagsRegOper(); |
2674 | MachNode *tmp0 = this; |
2675 | MachNode *tmp1 = this; |
2676 | MachNode *tmp2 = this; |
2677 | MachNode *tmp3 = NULL__null; |
2678 | MachNode *tmp4 = NULL__null; |
2679 | unsigned num0 = 0; |
2680 | unsigned num1 = opnd_array(1)->num_edges(); |
2681 | unsigned num2 = opnd_array(2)->num_edges(); |
2682 | unsigned idx0 = oper_input_base(); |
2683 | unsigned idx1 = idx0 + num0; |
2684 | unsigned idx2 = idx1 + num1; |
2685 | unsigned idx3 = idx2 + num2; |
2686 | MachNode *result = NULL__null; |
2687 | |
2688 | loadConL_0x6666666666666667Node *n0 = new loadConL_0x6666666666666667Node(); |
2689 | n0->add_req(_in[0]); |
2690 | n0->set_opnd_array(0, state->MachOperGenerator(RREGL)); |
2691 | tmp3 = n0; |
2692 | result = n0->Expand( state, proj_list, mem ); |
2693 | |
2694 | mul_hiNode *n1 = new mul_hiNode(); |
2695 | n1->add_req(_in[0]); |
2696 | n1->set_opnd_array(0, state->MachOperGenerator(RDX_REGL)); |
2697 | tmp0 = n1; |
2698 | n1->set_opnd_array(1, opnd_array(1)->clone()); // src |
2699 | if(tmp1 == this) { |
2700 | for(unsigned i = 0; i < num1; i++) { |
2701 | n1->add_req(_in[i + idx1]); |
2702 | } |
2703 | } |
2704 | else n1->add_req(tmp1); |
2705 | n1->set_opnd_array(2, op0->clone()); // rax |
2706 | if(tmp3 != NULL__null) |
2707 | n1->add_req(tmp3); |
2708 | result = n1->Expand( state, proj_list, mem ); |
2709 | |
2710 | sarL_rReg_63Node *n2 = new sarL_rReg_63Node(); |
2711 | n2->add_req(_in[0]); |
2712 | n2->set_opnd_array(0, state->MachOperGenerator(RREGL)); |
2713 | n2->set_opnd_array(1, opnd_array(1)->clone()); // src |
2714 | if(tmp1 == this) { |
2715 | for(unsigned i = 0; i < num1; i++) { |
2716 | n2->add_req(_in[i + idx1]); |
2717 | } |
2718 | } |
2719 | else n2->add_req(tmp1); |
2720 | tmp1 = n2; |
2721 | result = n2->Expand( state, proj_list, mem ); |
2722 | |
2723 | sarL_rReg_2Node *n3 = new sarL_rReg_2Node(); |
2724 | n3->add_req(_in[0]); |
2725 | n3->set_opnd_array(0, state->MachOperGenerator(RREGL)); |
2726 | n3->set_opnd_array(1, opnd_array(0)->clone()); // dst |
2727 | if(tmp0 == this) { |
2728 | for(unsigned i = 0; i < num0; i++) { |
2729 | n3->add_req(_in[i + idx0]); |
2730 | } |
2731 | } |
2732 | else n3->add_req(tmp0); |
2733 | tmp0 = n3; |
2734 | result = n3->Expand( state, proj_list, mem ); |
2735 | |
2736 | subL_rRegNode *n4 = new subL_rRegNode(); |
2737 | n4->add_req(_in[0]); |
2738 | n4->set_opnd_array(0, state->MachOperGenerator(RREGL)); |
2739 | n4->set_opnd_array(1, opnd_array(0)->clone()); // dst |
2740 | if(tmp0 == this) { |
2741 | for(unsigned i = 0; i < num0; i++) { |
2742 | n4->add_req(_in[i + idx0]); |
2743 | } |
2744 | } |
2745 | else n4->add_req(tmp0); |
2746 | tmp0 = n4; |
2747 | n4->set_opnd_array(2, opnd_array(1)->clone()); // src |
2748 | if(tmp1 == this) { |
2749 | for(unsigned i = 0; i < num1; i++) { |
2750 | n4->add_req(_in[i + idx1]); |
2751 | } |
2752 | } |
2753 | else n4->add_req(tmp1); |
2754 | result = n4->Expand( state, proj_list, mem ); |
2755 | |
2756 | |
2757 | return result; |
2758 | } |
2759 | |
2760 | MachNode* modI_rRegNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
2761 | Compile* C = Compile::current(); |
2762 | // Add projection edges for additional defs or kills |
2763 | // DEF/KILL rax |
2764 | MachProjNode *kill; |
2765 | kill = new MachProjNode( this, 1, (INT_RAX_REG_mask()), Op_RegI ); |
2766 | proj_list.push(kill); |
2767 | // DEF/KILL cr |
2768 | kill = new MachProjNode( this, 2, (INT_FLAGS_mask()), Op_RegFlags ); |
2769 | proj_list.push(kill); |
2770 | |
2771 | return this; |
2772 | } |
2773 | |
2774 | MachNode* modL_rRegNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
2775 | Compile* C = Compile::current(); |
2776 | // Add projection edges for additional defs or kills |
2777 | // DEF/KILL rax |
2778 | MachProjNode *kill; |
2779 | kill = new MachProjNode( this, 1, (LONG_RAX_REG_mask()), Op_RegL ); |
2780 | proj_list.push(kill); |
2781 | // DEF/KILL cr |
2782 | kill = new MachProjNode( this, 2, (INT_FLAGS_mask()), Op_RegFlags ); |
2783 | proj_list.push(kill); |
2784 | |
2785 | return this; |
2786 | } |
2787 | |
2788 | MachNode* salI_rReg_1Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
2789 | Compile* C = Compile::current(); |
2790 | // Add projection edges for additional defs or kills |
2791 | // DEF/KILL cr |
2792 | MachProjNode *kill; |
2793 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
2794 | proj_list.push(kill); |
2795 | |
2796 | return this; |
2797 | } |
2798 | |
2799 | MachNode* salI_mem_1Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
2800 | Compile* C = Compile::current(); |
2801 | // Add projection edges for additional defs or kills |
2802 | // DEF/KILL cr |
2803 | MachProjNode *kill; |
2804 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
2805 | proj_list.push(kill); |
2806 | // Remove duplicated operands and inputs which use the same name. |
2807 | if (num_opnds() == 4) { |
2808 | unsigned num0 = 0; |
2809 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
2810 | unsigned num2 = opnd_array(2)->num_edges(); // dst |
2811 | unsigned num3 = opnd_array(3)->num_edges(); // shift |
2812 | unsigned idx0 = oper_input_base(); |
2813 | unsigned idx1 = idx0 + num0; |
2814 | unsigned idx2 = idx1 + num1; |
2815 | unsigned idx3 = idx2 + num2; |
2816 | unsigned idx4 = idx3 + num3; |
2817 | set_opnd_array(2, opnd_array(3)->clone()); // shift |
2818 | for (unsigned i = 0; i < num3; i++) { |
2819 | set_req(i + idx2, _in[i + idx3]); |
2820 | } |
2821 | num2 = num3; |
2822 | idx3 = idx2 + num2; |
2823 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
2824 | del_req(i); |
2825 | } |
2826 | _num_opnds = 3; |
2827 | } else { |
2828 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 2827, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
2829 | } |
2830 | |
2831 | return this; |
2832 | } |
2833 | |
2834 | MachNode* salI_rReg_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
2835 | Compile* C = Compile::current(); |
2836 | // Add projection edges for additional defs or kills |
2837 | // DEF/KILL cr |
2838 | MachProjNode *kill; |
2839 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
2840 | proj_list.push(kill); |
2841 | |
2842 | return this; |
2843 | } |
2844 | |
2845 | MachNode* salI_mem_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
2846 | Compile* C = Compile::current(); |
2847 | // Add projection edges for additional defs or kills |
2848 | // DEF/KILL cr |
2849 | MachProjNode *kill; |
2850 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
2851 | proj_list.push(kill); |
2852 | // Remove duplicated operands and inputs which use the same name. |
2853 | if (num_opnds() == 4) { |
2854 | unsigned num0 = 0; |
2855 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
2856 | unsigned num2 = opnd_array(2)->num_edges(); // dst |
2857 | unsigned num3 = opnd_array(3)->num_edges(); // shift |
2858 | unsigned idx0 = oper_input_base(); |
2859 | unsigned idx1 = idx0 + num0; |
2860 | unsigned idx2 = idx1 + num1; |
2861 | unsigned idx3 = idx2 + num2; |
2862 | unsigned idx4 = idx3 + num3; |
2863 | set_opnd_array(2, opnd_array(3)->clone()); // shift |
2864 | for (unsigned i = 0; i < num3; i++) { |
2865 | set_req(i + idx2, _in[i + idx3]); |
2866 | } |
2867 | num2 = num3; |
2868 | idx3 = idx2 + num2; |
2869 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
2870 | del_req(i); |
2871 | } |
2872 | _num_opnds = 3; |
2873 | } else { |
2874 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 2873, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
2875 | } |
2876 | |
2877 | return this; |
2878 | } |
2879 | |
2880 | MachNode* salI_rReg_CLNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
2881 | Compile* C = Compile::current(); |
2882 | // Add projection edges for additional defs or kills |
2883 | // DEF/KILL cr |
2884 | MachProjNode *kill; |
2885 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
2886 | proj_list.push(kill); |
2887 | |
2888 | return this; |
2889 | } |
2890 | |
2891 | MachNode* salI_mem_CLNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
2892 | Compile* C = Compile::current(); |
2893 | // Add projection edges for additional defs or kills |
2894 | // DEF/KILL cr |
2895 | MachProjNode *kill; |
2896 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
2897 | proj_list.push(kill); |
2898 | // Remove duplicated operands and inputs which use the same name. |
2899 | if (num_opnds() == 4) { |
2900 | unsigned num0 = 0; |
2901 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
2902 | unsigned num2 = opnd_array(2)->num_edges(); // dst |
2903 | unsigned num3 = opnd_array(3)->num_edges(); // shift |
2904 | unsigned idx0 = oper_input_base(); |
2905 | unsigned idx1 = idx0 + num0; |
2906 | unsigned idx2 = idx1 + num1; |
2907 | unsigned idx3 = idx2 + num2; |
2908 | unsigned idx4 = idx3 + num3; |
2909 | set_opnd_array(2, opnd_array(3)->clone()); // shift |
2910 | for (unsigned i = 0; i < num3; i++) { |
2911 | set_req(i + idx2, _in[i + idx3]); |
2912 | } |
2913 | num2 = num3; |
2914 | idx3 = idx2 + num2; |
2915 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
2916 | del_req(i); |
2917 | } |
2918 | _num_opnds = 3; |
2919 | } else { |
2920 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 2919, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
2921 | } |
2922 | |
2923 | return this; |
2924 | } |
2925 | |
2926 | MachNode* sarI_rReg_1Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
2927 | Compile* C = Compile::current(); |
2928 | // Add projection edges for additional defs or kills |
2929 | // DEF/KILL cr |
2930 | MachProjNode *kill; |
2931 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
2932 | proj_list.push(kill); |
2933 | |
2934 | return this; |
2935 | } |
2936 | |
2937 | MachNode* sarI_mem_1Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
2938 | Compile* C = Compile::current(); |
2939 | // Add projection edges for additional defs or kills |
2940 | // DEF/KILL cr |
2941 | MachProjNode *kill; |
2942 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
2943 | proj_list.push(kill); |
2944 | // Remove duplicated operands and inputs which use the same name. |
2945 | if (num_opnds() == 4) { |
2946 | unsigned num0 = 0; |
2947 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
2948 | unsigned num2 = opnd_array(2)->num_edges(); // dst |
2949 | unsigned num3 = opnd_array(3)->num_edges(); // shift |
2950 | unsigned idx0 = oper_input_base(); |
2951 | unsigned idx1 = idx0 + num0; |
2952 | unsigned idx2 = idx1 + num1; |
2953 | unsigned idx3 = idx2 + num2; |
2954 | unsigned idx4 = idx3 + num3; |
2955 | set_opnd_array(2, opnd_array(3)->clone()); // shift |
2956 | for (unsigned i = 0; i < num3; i++) { |
2957 | set_req(i + idx2, _in[i + idx3]); |
2958 | } |
2959 | num2 = num3; |
2960 | idx3 = idx2 + num2; |
2961 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
2962 | del_req(i); |
2963 | } |
2964 | _num_opnds = 3; |
2965 | } else { |
2966 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 2965, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
2967 | } |
2968 | |
2969 | return this; |
2970 | } |
2971 | |
2972 | MachNode* sarI_rReg_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
2973 | Compile* C = Compile::current(); |
2974 | // Add projection edges for additional defs or kills |
2975 | // DEF/KILL cr |
2976 | MachProjNode *kill; |
2977 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
2978 | proj_list.push(kill); |
2979 | |
2980 | return this; |
2981 | } |
2982 | |
2983 | MachNode* sarI_mem_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
2984 | Compile* C = Compile::current(); |
2985 | // Add projection edges for additional defs or kills |
2986 | // DEF/KILL cr |
2987 | MachProjNode *kill; |
2988 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
2989 | proj_list.push(kill); |
2990 | // Remove duplicated operands and inputs which use the same name. |
2991 | if (num_opnds() == 4) { |
2992 | unsigned num0 = 0; |
2993 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
2994 | unsigned num2 = opnd_array(2)->num_edges(); // dst |
2995 | unsigned num3 = opnd_array(3)->num_edges(); // shift |
2996 | unsigned idx0 = oper_input_base(); |
2997 | unsigned idx1 = idx0 + num0; |
2998 | unsigned idx2 = idx1 + num1; |
2999 | unsigned idx3 = idx2 + num2; |
3000 | unsigned idx4 = idx3 + num3; |
3001 | set_opnd_array(2, opnd_array(3)->clone()); // shift |
3002 | for (unsigned i = 0; i < num3; i++) { |
3003 | set_req(i + idx2, _in[i + idx3]); |
3004 | } |
3005 | num2 = num3; |
3006 | idx3 = idx2 + num2; |
3007 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
3008 | del_req(i); |
3009 | } |
3010 | _num_opnds = 3; |
3011 | } else { |
3012 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 3011, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
3013 | } |
3014 | |
3015 | return this; |
3016 | } |
3017 | |
3018 | MachNode* sarI_rReg_CLNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
3019 | Compile* C = Compile::current(); |
3020 | // Add projection edges for additional defs or kills |
3021 | // DEF/KILL cr |
3022 | MachProjNode *kill; |
3023 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
3024 | proj_list.push(kill); |
3025 | |
3026 | return this; |
3027 | } |
3028 | |
3029 | MachNode* sarI_mem_CLNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
3030 | Compile* C = Compile::current(); |
3031 | // Add projection edges for additional defs or kills |
3032 | // DEF/KILL cr |
3033 | MachProjNode *kill; |
3034 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
3035 | proj_list.push(kill); |
3036 | // Remove duplicated operands and inputs which use the same name. |
3037 | if (num_opnds() == 4) { |
3038 | unsigned num0 = 0; |
3039 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
3040 | unsigned num2 = opnd_array(2)->num_edges(); // dst |
3041 | unsigned num3 = opnd_array(3)->num_edges(); // shift |
3042 | unsigned idx0 = oper_input_base(); |
3043 | unsigned idx1 = idx0 + num0; |
3044 | unsigned idx2 = idx1 + num1; |
3045 | unsigned idx3 = idx2 + num2; |
3046 | unsigned idx4 = idx3 + num3; |
3047 | set_opnd_array(2, opnd_array(3)->clone()); // shift |
3048 | for (unsigned i = 0; i < num3; i++) { |
3049 | set_req(i + idx2, _in[i + idx3]); |
3050 | } |
3051 | num2 = num3; |
3052 | idx3 = idx2 + num2; |
3053 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
3054 | del_req(i); |
3055 | } |
3056 | _num_opnds = 3; |
3057 | } else { |
3058 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 3057, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
3059 | } |
3060 | |
3061 | return this; |
3062 | } |
3063 | |
3064 | MachNode* shrI_rReg_1Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
3065 | Compile* C = Compile::current(); |
3066 | // Add projection edges for additional defs or kills |
3067 | // DEF/KILL cr |
3068 | MachProjNode *kill; |
3069 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
3070 | proj_list.push(kill); |
3071 | |
3072 | return this; |
3073 | } |
3074 | |
3075 | MachNode* shrI_mem_1Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
3076 | Compile* C = Compile::current(); |
3077 | // Add projection edges for additional defs or kills |
3078 | // DEF/KILL cr |
3079 | MachProjNode *kill; |
3080 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
3081 | proj_list.push(kill); |
3082 | // Remove duplicated operands and inputs which use the same name. |
3083 | if (num_opnds() == 4) { |
3084 | unsigned num0 = 0; |
3085 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
3086 | unsigned num2 = opnd_array(2)->num_edges(); // dst |
3087 | unsigned num3 = opnd_array(3)->num_edges(); // shift |
3088 | unsigned idx0 = oper_input_base(); |
3089 | unsigned idx1 = idx0 + num0; |
3090 | unsigned idx2 = idx1 + num1; |
3091 | unsigned idx3 = idx2 + num2; |
3092 | unsigned idx4 = idx3 + num3; |
3093 | set_opnd_array(2, opnd_array(3)->clone()); // shift |
3094 | for (unsigned i = 0; i < num3; i++) { |
3095 | set_req(i + idx2, _in[i + idx3]); |
3096 | } |
3097 | num2 = num3; |
3098 | idx3 = idx2 + num2; |
3099 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
3100 | del_req(i); |
3101 | } |
3102 | _num_opnds = 3; |
3103 | } else { |
3104 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 3103, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
3105 | } |
3106 | |
3107 | return this; |
3108 | } |
3109 | |
3110 | MachNode* shrI_rReg_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
3111 | Compile* C = Compile::current(); |
3112 | // Add projection edges for additional defs or kills |
3113 | // DEF/KILL cr |
3114 | MachProjNode *kill; |
3115 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
3116 | proj_list.push(kill); |
3117 | |
3118 | return this; |
3119 | } |
3120 | |
3121 | MachNode* shrI_mem_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
3122 | Compile* C = Compile::current(); |
3123 | // Add projection edges for additional defs or kills |
3124 | // DEF/KILL cr |
3125 | MachProjNode *kill; |
3126 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
3127 | proj_list.push(kill); |
3128 | // Remove duplicated operands and inputs which use the same name. |
3129 | if (num_opnds() == 4) { |
3130 | unsigned num0 = 0; |
3131 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
3132 | unsigned num2 = opnd_array(2)->num_edges(); // dst |
3133 | unsigned num3 = opnd_array(3)->num_edges(); // shift |
3134 | unsigned idx0 = oper_input_base(); |
3135 | unsigned idx1 = idx0 + num0; |
3136 | unsigned idx2 = idx1 + num1; |
3137 | unsigned idx3 = idx2 + num2; |
3138 | unsigned idx4 = idx3 + num3; |
3139 | set_opnd_array(2, opnd_array(3)->clone()); // shift |
3140 | for (unsigned i = 0; i < num3; i++) { |
3141 | set_req(i + idx2, _in[i + idx3]); |
3142 | } |
3143 | num2 = num3; |
3144 | idx3 = idx2 + num2; |
3145 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
3146 | del_req(i); |
3147 | } |
3148 | _num_opnds = 3; |
3149 | } else { |
3150 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 3149, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
3151 | } |
3152 | |
3153 | return this; |
3154 | } |
3155 | |
3156 | MachNode* shrI_rReg_CLNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
3157 | Compile* C = Compile::current(); |
3158 | // Add projection edges for additional defs or kills |
3159 | // DEF/KILL cr |
3160 | MachProjNode *kill; |
3161 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
3162 | proj_list.push(kill); |
3163 | |
3164 | return this; |
3165 | } |
3166 | |
3167 | MachNode* shrI_mem_CLNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
3168 | Compile* C = Compile::current(); |
3169 | // Add projection edges for additional defs or kills |
3170 | // DEF/KILL cr |
3171 | MachProjNode *kill; |
3172 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
3173 | proj_list.push(kill); |
3174 | // Remove duplicated operands and inputs which use the same name. |
3175 | if (num_opnds() == 4) { |
3176 | unsigned num0 = 0; |
3177 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
3178 | unsigned num2 = opnd_array(2)->num_edges(); // dst |
3179 | unsigned num3 = opnd_array(3)->num_edges(); // shift |
3180 | unsigned idx0 = oper_input_base(); |
3181 | unsigned idx1 = idx0 + num0; |
3182 | unsigned idx2 = idx1 + num1; |
3183 | unsigned idx3 = idx2 + num2; |
3184 | unsigned idx4 = idx3 + num3; |
3185 | set_opnd_array(2, opnd_array(3)->clone()); // shift |
3186 | for (unsigned i = 0; i < num3; i++) { |
3187 | set_req(i + idx2, _in[i + idx3]); |
3188 | } |
3189 | num2 = num3; |
3190 | idx3 = idx2 + num2; |
3191 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
3192 | del_req(i); |
3193 | } |
3194 | _num_opnds = 3; |
3195 | } else { |
3196 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 3195, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
3197 | } |
3198 | |
3199 | return this; |
3200 | } |
3201 | |
3202 | MachNode* salL_rReg_1Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
3203 | Compile* C = Compile::current(); |
Value stored to 'C' during its initialization is never read | |
3204 | // Add projection edges for additional defs or kills |
3205 | // DEF/KILL cr |
3206 | MachProjNode *kill; |
3207 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
3208 | proj_list.push(kill); |
3209 | |
3210 | return this; |
3211 | } |
3212 | |
3213 | MachNode* salL_mem_1Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
3214 | Compile* C = Compile::current(); |
3215 | // Add projection edges for additional defs or kills |
3216 | // DEF/KILL cr |
3217 | MachProjNode *kill; |
3218 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
3219 | proj_list.push(kill); |
3220 | // Remove duplicated operands and inputs which use the same name. |
3221 | if (num_opnds() == 4) { |
3222 | unsigned num0 = 0; |
3223 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
3224 | unsigned num2 = opnd_array(2)->num_edges(); // dst |
3225 | unsigned num3 = opnd_array(3)->num_edges(); // shift |
3226 | unsigned idx0 = oper_input_base(); |
3227 | unsigned idx1 = idx0 + num0; |
3228 | unsigned idx2 = idx1 + num1; |
3229 | unsigned idx3 = idx2 + num2; |
3230 | unsigned idx4 = idx3 + num3; |
3231 | set_opnd_array(2, opnd_array(3)->clone()); // shift |
3232 | for (unsigned i = 0; i < num3; i++) { |
3233 | set_req(i + idx2, _in[i + idx3]); |
3234 | } |
3235 | num2 = num3; |
3236 | idx3 = idx2 + num2; |
3237 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
3238 | del_req(i); |
3239 | } |
3240 | _num_opnds = 3; |
3241 | } else { |
3242 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 3241, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
3243 | } |
3244 | |
3245 | return this; |
3246 | } |
3247 | |
3248 | MachNode* salL_rReg_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
3249 | Compile* C = Compile::current(); |
3250 | // Add projection edges for additional defs or kills |
3251 | // DEF/KILL cr |
3252 | MachProjNode *kill; |
3253 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
3254 | proj_list.push(kill); |
3255 | |
3256 | return this; |
3257 | } |
3258 | |
3259 | MachNode* salL_mem_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
3260 | Compile* C = Compile::current(); |
3261 | // Add projection edges for additional defs or kills |
3262 | // DEF/KILL cr |
3263 | MachProjNode *kill; |
3264 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
3265 | proj_list.push(kill); |
3266 | // Remove duplicated operands and inputs which use the same name. |
3267 | if (num_opnds() == 4) { |
3268 | unsigned num0 = 0; |
3269 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
3270 | unsigned num2 = opnd_array(2)->num_edges(); // dst |
3271 | unsigned num3 = opnd_array(3)->num_edges(); // shift |
3272 | unsigned idx0 = oper_input_base(); |
3273 | unsigned idx1 = idx0 + num0; |
3274 | unsigned idx2 = idx1 + num1; |
3275 | unsigned idx3 = idx2 + num2; |
3276 | unsigned idx4 = idx3 + num3; |
3277 | set_opnd_array(2, opnd_array(3)->clone()); // shift |
3278 | for (unsigned i = 0; i < num3; i++) { |
3279 | set_req(i + idx2, _in[i + idx3]); |
3280 | } |
3281 | num2 = num3; |
3282 | idx3 = idx2 + num2; |
3283 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
3284 | del_req(i); |
3285 | } |
3286 | _num_opnds = 3; |
3287 | } else { |
3288 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 3287, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
3289 | } |
3290 | |
3291 | return this; |
3292 | } |
3293 | |
3294 | MachNode* salL_rReg_CLNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
3295 | Compile* C = Compile::current(); |
3296 | // Add projection edges for additional defs or kills |
3297 | // DEF/KILL cr |
3298 | MachProjNode *kill; |
3299 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
3300 | proj_list.push(kill); |
3301 | |
3302 | return this; |
3303 | } |
3304 | |
3305 | MachNode* salL_mem_CLNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
3306 | Compile* C = Compile::current(); |
3307 | // Add projection edges for additional defs or kills |
3308 | // DEF/KILL cr |
3309 | MachProjNode *kill; |
3310 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
3311 | proj_list.push(kill); |
3312 | // Remove duplicated operands and inputs which use the same name. |
3313 | if (num_opnds() == 4) { |
3314 | unsigned num0 = 0; |
3315 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
3316 | unsigned num2 = opnd_array(2)->num_edges(); // dst |
3317 | unsigned num3 = opnd_array(3)->num_edges(); // shift |
3318 | unsigned idx0 = oper_input_base(); |
3319 | unsigned idx1 = idx0 + num0; |
3320 | unsigned idx2 = idx1 + num1; |
3321 | unsigned idx3 = idx2 + num2; |
3322 | unsigned idx4 = idx3 + num3; |
3323 | set_opnd_array(2, opnd_array(3)->clone()); // shift |
3324 | for (unsigned i = 0; i < num3; i++) { |
3325 | set_req(i + idx2, _in[i + idx3]); |
3326 | } |
3327 | num2 = num3; |
3328 | idx3 = idx2 + num2; |
3329 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
3330 | del_req(i); |
3331 | } |
3332 | _num_opnds = 3; |
3333 | } else { |
3334 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 3333, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
3335 | } |
3336 | |
3337 | return this; |
3338 | } |
3339 | |
3340 | MachNode* sarL_rReg_1Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
3341 | Compile* C = Compile::current(); |
3342 | // Add projection edges for additional defs or kills |
3343 | // DEF/KILL cr |
3344 | MachProjNode *kill; |
3345 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
3346 | proj_list.push(kill); |
3347 | |
3348 | return this; |
3349 | } |
3350 | |
3351 | MachNode* sarL_mem_1Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
3352 | Compile* C = Compile::current(); |
3353 | // Add projection edges for additional defs or kills |
3354 | // DEF/KILL cr |
3355 | MachProjNode *kill; |
3356 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
3357 | proj_list.push(kill); |
3358 | // Remove duplicated operands and inputs which use the same name. |
3359 | if (num_opnds() == 4) { |
3360 | unsigned num0 = 0; |
3361 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
3362 | unsigned num2 = opnd_array(2)->num_edges(); // dst |
3363 | unsigned num3 = opnd_array(3)->num_edges(); // shift |
3364 | unsigned idx0 = oper_input_base(); |
3365 | unsigned idx1 = idx0 + num0; |
3366 | unsigned idx2 = idx1 + num1; |
3367 | unsigned idx3 = idx2 + num2; |
3368 | unsigned idx4 = idx3 + num3; |
3369 | set_opnd_array(2, opnd_array(3)->clone()); // shift |
3370 | for (unsigned i = 0; i < num3; i++) { |
3371 | set_req(i + idx2, _in[i + idx3]); |
3372 | } |
3373 | num2 = num3; |
3374 | idx3 = idx2 + num2; |
3375 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
3376 | del_req(i); |
3377 | } |
3378 | _num_opnds = 3; |
3379 | } else { |
3380 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 3379, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
3381 | } |
3382 | |
3383 | return this; |
3384 | } |
3385 | |
3386 | MachNode* sarL_rReg_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
3387 | Compile* C = Compile::current(); |
3388 | // Add projection edges for additional defs or kills |
3389 | // DEF/KILL cr |
3390 | MachProjNode *kill; |
3391 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
3392 | proj_list.push(kill); |
3393 | |
3394 | return this; |
3395 | } |
3396 | |
3397 | MachNode* sarL_mem_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
3398 | Compile* C = Compile::current(); |
3399 | // Add projection edges for additional defs or kills |
3400 | // DEF/KILL cr |
3401 | MachProjNode *kill; |
3402 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
3403 | proj_list.push(kill); |
3404 | // Remove duplicated operands and inputs which use the same name. |
3405 | if (num_opnds() == 4) { |
3406 | unsigned num0 = 0; |
3407 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
3408 | unsigned num2 = opnd_array(2)->num_edges(); // dst |
3409 | unsigned num3 = opnd_array(3)->num_edges(); // shift |
3410 | unsigned idx0 = oper_input_base(); |
3411 | unsigned idx1 = idx0 + num0; |
3412 | unsigned idx2 = idx1 + num1; |
3413 | unsigned idx3 = idx2 + num2; |
3414 | unsigned idx4 = idx3 + num3; |
3415 | set_opnd_array(2, opnd_array(3)->clone()); // shift |
3416 | for (unsigned i = 0; i < num3; i++) { |
3417 | set_req(i + idx2, _in[i + idx3]); |
3418 | } |
3419 | num2 = num3; |
3420 | idx3 = idx2 + num2; |
3421 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
3422 | del_req(i); |
3423 | } |
3424 | _num_opnds = 3; |
3425 | } else { |
3426 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 3425, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
3427 | } |
3428 | |
3429 | return this; |
3430 | } |
3431 | |
3432 | MachNode* sarL_rReg_CLNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
3433 | Compile* C = Compile::current(); |
3434 | // Add projection edges for additional defs or kills |
3435 | // DEF/KILL cr |
3436 | MachProjNode *kill; |
3437 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
3438 | proj_list.push(kill); |
3439 | |
3440 | return this; |
3441 | } |
3442 | |
3443 | MachNode* sarL_mem_CLNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
3444 | Compile* C = Compile::current(); |
3445 | // Add projection edges for additional defs or kills |
3446 | // DEF/KILL cr |
3447 | MachProjNode *kill; |
3448 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
3449 | proj_list.push(kill); |
3450 | // Remove duplicated operands and inputs which use the same name. |
3451 | if (num_opnds() == 4) { |
3452 | unsigned num0 = 0; |
3453 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
3454 | unsigned num2 = opnd_array(2)->num_edges(); // dst |
3455 | unsigned num3 = opnd_array(3)->num_edges(); // shift |
3456 | unsigned idx0 = oper_input_base(); |
3457 | unsigned idx1 = idx0 + num0; |
3458 | unsigned idx2 = idx1 + num1; |
3459 | unsigned idx3 = idx2 + num2; |
3460 | unsigned idx4 = idx3 + num3; |
3461 | set_opnd_array(2, opnd_array(3)->clone()); // shift |
3462 | for (unsigned i = 0; i < num3; i++) { |
3463 | set_req(i + idx2, _in[i + idx3]); |
3464 | } |
3465 | num2 = num3; |
3466 | idx3 = idx2 + num2; |
3467 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
3468 | del_req(i); |
3469 | } |
3470 | _num_opnds = 3; |
3471 | } else { |
3472 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 3471, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
3473 | } |
3474 | |
3475 | return this; |
3476 | } |
3477 | |
3478 | MachNode* shrL_rReg_1Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
3479 | Compile* C = Compile::current(); |
3480 | // Add projection edges for additional defs or kills |
3481 | // DEF/KILL cr |
3482 | MachProjNode *kill; |
3483 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
3484 | proj_list.push(kill); |
3485 | |
3486 | return this; |
3487 | } |
3488 | |
3489 | MachNode* shrL_mem_1Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
3490 | Compile* C = Compile::current(); |
3491 | // Add projection edges for additional defs or kills |
3492 | // DEF/KILL cr |
3493 | MachProjNode *kill; |
3494 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
3495 | proj_list.push(kill); |
3496 | // Remove duplicated operands and inputs which use the same name. |
3497 | if (num_opnds() == 4) { |
3498 | unsigned num0 = 0; |
3499 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
3500 | unsigned num2 = opnd_array(2)->num_edges(); // dst |
3501 | unsigned num3 = opnd_array(3)->num_edges(); // shift |
3502 | unsigned idx0 = oper_input_base(); |
3503 | unsigned idx1 = idx0 + num0; |
3504 | unsigned idx2 = idx1 + num1; |
3505 | unsigned idx3 = idx2 + num2; |
3506 | unsigned idx4 = idx3 + num3; |
3507 | set_opnd_array(2, opnd_array(3)->clone()); // shift |
3508 | for (unsigned i = 0; i < num3; i++) { |
3509 | set_req(i + idx2, _in[i + idx3]); |
3510 | } |
3511 | num2 = num3; |
3512 | idx3 = idx2 + num2; |
3513 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
3514 | del_req(i); |
3515 | } |
3516 | _num_opnds = 3; |
3517 | } else { |
3518 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 3517, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
3519 | } |
3520 | |
3521 | return this; |
3522 | } |
3523 | |
3524 | MachNode* shrL_rReg_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
3525 | Compile* C = Compile::current(); |
3526 | // Add projection edges for additional defs or kills |
3527 | // DEF/KILL cr |
3528 | MachProjNode *kill; |
3529 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
3530 | proj_list.push(kill); |
3531 | |
3532 | return this; |
3533 | } |
3534 | |
3535 | MachNode* shrL_mem_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
3536 | Compile* C = Compile::current(); |
3537 | // Add projection edges for additional defs or kills |
3538 | // DEF/KILL cr |
3539 | MachProjNode *kill; |
3540 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
3541 | proj_list.push(kill); |
3542 | // Remove duplicated operands and inputs which use the same name. |
3543 | if (num_opnds() == 4) { |
3544 | unsigned num0 = 0; |
3545 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
3546 | unsigned num2 = opnd_array(2)->num_edges(); // dst |
3547 | unsigned num3 = opnd_array(3)->num_edges(); // shift |
3548 | unsigned idx0 = oper_input_base(); |
3549 | unsigned idx1 = idx0 + num0; |
3550 | unsigned idx2 = idx1 + num1; |
3551 | unsigned idx3 = idx2 + num2; |
3552 | unsigned idx4 = idx3 + num3; |
3553 | set_opnd_array(2, opnd_array(3)->clone()); // shift |
3554 | for (unsigned i = 0; i < num3; i++) { |
3555 | set_req(i + idx2, _in[i + idx3]); |
3556 | } |
3557 | num2 = num3; |
3558 | idx3 = idx2 + num2; |
3559 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
3560 | del_req(i); |
3561 | } |
3562 | _num_opnds = 3; |
3563 | } else { |
3564 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 3563, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
3565 | } |
3566 | |
3567 | return this; |
3568 | } |
3569 | |
3570 | MachNode* shrL_rReg_CLNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
3571 | Compile* C = Compile::current(); |
3572 | // Add projection edges for additional defs or kills |
3573 | // DEF/KILL cr |
3574 | MachProjNode *kill; |
3575 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
3576 | proj_list.push(kill); |
3577 | |
3578 | return this; |
3579 | } |
3580 | |
3581 | MachNode* shrL_mem_CLNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
3582 | Compile* C = Compile::current(); |
3583 | // Add projection edges for additional defs or kills |
3584 | // DEF/KILL cr |
3585 | MachProjNode *kill; |
3586 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
3587 | proj_list.push(kill); |
3588 | // Remove duplicated operands and inputs which use the same name. |
3589 | if (num_opnds() == 4) { |
3590 | unsigned num0 = 0; |
3591 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
3592 | unsigned num2 = opnd_array(2)->num_edges(); // dst |
3593 | unsigned num3 = opnd_array(3)->num_edges(); // shift |
3594 | unsigned idx0 = oper_input_base(); |
3595 | unsigned idx1 = idx0 + num0; |
3596 | unsigned idx2 = idx1 + num1; |
3597 | unsigned idx3 = idx2 + num2; |
3598 | unsigned idx4 = idx3 + num3; |
3599 | set_opnd_array(2, opnd_array(3)->clone()); // shift |
3600 | for (unsigned i = 0; i < num3; i++) { |
3601 | set_req(i + idx2, _in[i + idx3]); |
3602 | } |
3603 | num2 = num3; |
3604 | idx3 = idx2 + num2; |
3605 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
3606 | del_req(i); |
3607 | } |
3608 | _num_opnds = 3; |
3609 | } else { |
3610 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 3609, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
3611 | } |
3612 | |
3613 | return this; |
3614 | } |
3615 | |
3616 | MachNode* i2bNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
3617 | Compile* C = Compile::current(); |
3618 | // Remove duplicated operands and inputs which use the same name. |
3619 | if (num_opnds() == 4) { |
3620 | unsigned num0 = 0; |
3621 | unsigned num1 = opnd_array(1)->num_edges(); // src |
3622 | unsigned num2 = opnd_array(2)->num_edges(); // twentyfour |
3623 | unsigned num3 = opnd_array(3)->num_edges(); // twentyfour |
3624 | unsigned idx0 = oper_input_base(); |
3625 | unsigned idx1 = idx0 + num0; |
3626 | unsigned idx2 = idx1 + num1; |
3627 | unsigned idx3 = idx2 + num2; |
3628 | unsigned idx4 = idx3 + num3; |
3629 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
3630 | del_req(i); |
3631 | } |
3632 | _num_opnds = 3; |
3633 | } else { |
3634 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 3633, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
3635 | } |
3636 | |
3637 | return this; |
3638 | } |
3639 | |
3640 | MachNode* i2sNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
3641 | Compile* C = Compile::current(); |
3642 | // Remove duplicated operands and inputs which use the same name. |
3643 | if (num_opnds() == 4) { |
3644 | unsigned num0 = 0; |
3645 | unsigned num1 = opnd_array(1)->num_edges(); // src |
3646 | unsigned num2 = opnd_array(2)->num_edges(); // sixteen |
3647 | unsigned num3 = opnd_array(3)->num_edges(); // sixteen |
3648 | unsigned idx0 = oper_input_base(); |
3649 | unsigned idx1 = idx0 + num0; |
3650 | unsigned idx2 = idx1 + num1; |
3651 | unsigned idx3 = idx2 + num2; |
3652 | unsigned idx4 = idx3 + num3; |
3653 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
3654 | del_req(i); |
3655 | } |
3656 | _num_opnds = 3; |
3657 | } else { |
3658 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 3657, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
3659 | } |
3660 | |
3661 | return this; |
3662 | } |
3663 | |
3664 | MachNode* rolI_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
3665 | Compile* C = Compile::current(); |
3666 | // Add projection edges for additional defs or kills |
3667 | // DEF/KILL cr |
3668 | MachProjNode *kill; |
3669 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
3670 | proj_list.push(kill); |
3671 | |
3672 | return this; |
3673 | } |
3674 | |
3675 | MachNode* rolI_rReg_VarNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
3676 | Compile* C = Compile::current(); |
3677 | // Add projection edges for additional defs or kills |
3678 | // DEF/KILL cr |
3679 | MachProjNode *kill; |
3680 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
3681 | proj_list.push(kill); |
3682 | |
3683 | return this; |
3684 | } |
3685 | |
3686 | MachNode* rorI_immI8_legacyNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
3687 | Compile* C = Compile::current(); |
3688 | // Add projection edges for additional defs or kills |
3689 | // DEF/KILL cr |
3690 | MachProjNode *kill; |
3691 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
3692 | proj_list.push(kill); |
3693 | |
3694 | return this; |
3695 | } |
3696 | |
3697 | MachNode* rorI_rReg_VarNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
3698 | Compile* C = Compile::current(); |
3699 | // Add projection edges for additional defs or kills |
3700 | // DEF/KILL cr |
3701 | MachProjNode *kill; |
3702 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
3703 | proj_list.push(kill); |
3704 | |
3705 | return this; |
3706 | } |
3707 | |
3708 | MachNode* rolL_immI8Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
3709 | Compile* C = Compile::current(); |
3710 | // Add projection edges for additional defs or kills |
3711 | // DEF/KILL cr |
3712 | MachProjNode *kill; |
3713 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
3714 | proj_list.push(kill); |
3715 | |
3716 | return this; |
3717 | } |
3718 | |
3719 | MachNode* rolL_rReg_VarNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
3720 | Compile* C = Compile::current(); |
3721 | // Add projection edges for additional defs or kills |
3722 | // DEF/KILL cr |
3723 | MachProjNode *kill; |
3724 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
3725 | proj_list.push(kill); |
3726 | |
3727 | return this; |
3728 | } |
3729 | |
3730 | MachNode* rorL_immI8_legacyNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
3731 | Compile* C = Compile::current(); |
3732 | // Add projection edges for additional defs or kills |
3733 | // DEF/KILL cr |
3734 | MachProjNode *kill; |
3735 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
3736 | proj_list.push(kill); |
3737 | |
3738 | return this; |
3739 | } |
3740 | |
3741 | MachNode* rorL_rReg_VarNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
3742 | Compile* C = Compile::current(); |
3743 | // Add projection edges for additional defs or kills |
3744 | // DEF/KILL cr |
3745 | MachProjNode *kill; |
3746 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
3747 | proj_list.push(kill); |
3748 | |
3749 | return this; |
3750 | } |
3751 | |
3752 | MachNode* andI_rRegNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
3753 | Compile* C = Compile::current(); |
3754 | // Add projection edges for additional defs or kills |
3755 | // DEF/KILL cr |
3756 | MachProjNode *kill; |
3757 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
3758 | proj_list.push(kill); |
3759 | |
3760 | return this; |
3761 | } |
3762 | |
3763 | MachNode* convI2LAndI_reg_immIbitmaskNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
3764 | Compile* C = Compile::current(); |
3765 | // Add projection edges for additional defs or kills |
3766 | // TEMP tmp |
3767 | MachTempNode *def; |
3768 | def = new MachTempNode(state->MachOperGenerator(RREGI)); |
3769 | add_req(def); |
3770 | // DEF/KILL cr |
3771 | MachProjNode *kill; |
3772 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
3773 | proj_list.push(kill); |
3774 | |
3775 | return this; |
3776 | } |
3777 | |
3778 | MachNode* andI_rReg_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
3779 | Compile* C = Compile::current(); |
3780 | // Add projection edges for additional defs or kills |
3781 | // DEF/KILL cr |
3782 | MachProjNode *kill; |
3783 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
3784 | proj_list.push(kill); |
3785 | |
3786 | return this; |
3787 | } |
3788 | |
3789 | MachNode* andI_rReg_memNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
3790 | Compile* C = Compile::current(); |
3791 | // Add projection edges for additional defs or kills |
3792 | // DEF/KILL cr |
3793 | MachProjNode *kill; |
3794 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
3795 | proj_list.push(kill); |
3796 | |
3797 | return this; |
3798 | } |
3799 | |
3800 | MachNode* andI_rReg_mem_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
3801 | Compile* C = Compile::current(); |
3802 | // Add projection edges for additional defs or kills |
3803 | // DEF/KILL cr |
3804 | MachProjNode *kill; |
3805 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
3806 | proj_list.push(kill); |
3807 | |
3808 | return this; |
3809 | } |
3810 | |
3811 | MachNode* andB_mem_rRegNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
3812 | Compile* C = Compile::current(); |
3813 | // Add projection edges for additional defs or kills |
3814 | // DEF/KILL cr |
3815 | MachProjNode *kill; |
3816 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
3817 | proj_list.push(kill); |
3818 | // Remove duplicated operands and inputs which use the same name. |
3819 | if (num_opnds() == 4) { |
3820 | unsigned num0 = 0; |
3821 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
3822 | unsigned num2 = opnd_array(2)->num_edges(); // dst |
3823 | unsigned num3 = opnd_array(3)->num_edges(); // src |
3824 | unsigned idx0 = oper_input_base(); |
3825 | unsigned idx1 = idx0 + num0; |
3826 | unsigned idx2 = idx1 + num1; |
3827 | unsigned idx3 = idx2 + num2; |
3828 | unsigned idx4 = idx3 + num3; |
3829 | set_opnd_array(2, opnd_array(3)->clone()); // src |
3830 | for (unsigned i = 0; i < num3; i++) { |
3831 | set_req(i + idx2, _in[i + idx3]); |
3832 | } |
3833 | num2 = num3; |
3834 | idx3 = idx2 + num2; |
3835 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
3836 | del_req(i); |
3837 | } |
3838 | _num_opnds = 3; |
3839 | } else { |
3840 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 3839, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
3841 | } |
3842 | |
3843 | return this; |
3844 | } |
3845 | |
3846 | MachNode* andB_mem_rReg_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
3847 | Compile* C = Compile::current(); |
3848 | // Add projection edges for additional defs or kills |
3849 | // DEF/KILL cr |
3850 | MachProjNode *kill; |
3851 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
3852 | proj_list.push(kill); |
3853 | // Remove duplicated operands and inputs which use the same name. |
3854 | if (num_opnds() == 4) { |
3855 | unsigned num0 = 0; |
3856 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
3857 | unsigned num2 = opnd_array(2)->num_edges(); // src |
3858 | unsigned num3 = opnd_array(3)->num_edges(); // dst |
3859 | unsigned idx0 = oper_input_base(); |
3860 | unsigned idx1 = idx0 + num0; |
3861 | unsigned idx2 = idx1 + num1; |
3862 | unsigned idx3 = idx2 + num2; |
3863 | unsigned idx4 = idx3 + num3; |
3864 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
3865 | del_req(i); |
3866 | } |
3867 | _num_opnds = 3; |
3868 | } else { |
3869 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 3868, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
3870 | } |
3871 | |
3872 | return this; |
3873 | } |
3874 | |
3875 | MachNode* andI_mem_rRegNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
3876 | Compile* C = Compile::current(); |
3877 | // Add projection edges for additional defs or kills |
3878 | // DEF/KILL cr |
3879 | MachProjNode *kill; |
3880 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
3881 | proj_list.push(kill); |
3882 | // Remove duplicated operands and inputs which use the same name. |
3883 | if (num_opnds() == 4) { |
3884 | unsigned num0 = 0; |
3885 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
3886 | unsigned num2 = opnd_array(2)->num_edges(); // dst |
3887 | unsigned num3 = opnd_array(3)->num_edges(); // src |
3888 | unsigned idx0 = oper_input_base(); |
3889 | unsigned idx1 = idx0 + num0; |
3890 | unsigned idx2 = idx1 + num1; |
3891 | unsigned idx3 = idx2 + num2; |
3892 | unsigned idx4 = idx3 + num3; |
3893 | set_opnd_array(2, opnd_array(3)->clone()); // src |
3894 | for (unsigned i = 0; i < num3; i++) { |
3895 | set_req(i + idx2, _in[i + idx3]); |
3896 | } |
3897 | num2 = num3; |
3898 | idx3 = idx2 + num2; |
3899 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
3900 | del_req(i); |
3901 | } |
3902 | _num_opnds = 3; |
3903 | } else { |
3904 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 3903, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
3905 | } |
3906 | |
3907 | return this; |
3908 | } |
3909 | |
3910 | MachNode* andI_mem_rReg_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
3911 | Compile* C = Compile::current(); |
3912 | // Add projection edges for additional defs or kills |
3913 | // DEF/KILL cr |
3914 | MachProjNode *kill; |
3915 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
3916 | proj_list.push(kill); |
3917 | // Remove duplicated operands and inputs which use the same name. |
3918 | if (num_opnds() == 4) { |
3919 | unsigned num0 = 0; |
3920 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
3921 | unsigned num2 = opnd_array(2)->num_edges(); // src |
3922 | unsigned num3 = opnd_array(3)->num_edges(); // dst |
3923 | unsigned idx0 = oper_input_base(); |
3924 | unsigned idx1 = idx0 + num0; |
3925 | unsigned idx2 = idx1 + num1; |
3926 | unsigned idx3 = idx2 + num2; |
3927 | unsigned idx4 = idx3 + num3; |
3928 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
3929 | del_req(i); |
3930 | } |
3931 | _num_opnds = 3; |
3932 | } else { |
3933 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 3932, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
3934 | } |
3935 | |
3936 | return this; |
3937 | } |
3938 | |
3939 | MachNode* andI_mem_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
3940 | Compile* C = Compile::current(); |
3941 | // Add projection edges for additional defs or kills |
3942 | // DEF/KILL cr |
3943 | MachProjNode *kill; |
3944 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
3945 | proj_list.push(kill); |
3946 | // Remove duplicated operands and inputs which use the same name. |
3947 | if (num_opnds() == 4) { |
3948 | unsigned num0 = 0; |
3949 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
3950 | unsigned num2 = opnd_array(2)->num_edges(); // dst |
3951 | unsigned num3 = opnd_array(3)->num_edges(); // src |
3952 | unsigned idx0 = oper_input_base(); |
3953 | unsigned idx1 = idx0 + num0; |
3954 | unsigned idx2 = idx1 + num1; |
3955 | unsigned idx3 = idx2 + num2; |
3956 | unsigned idx4 = idx3 + num3; |
3957 | set_opnd_array(2, opnd_array(3)->clone()); // src |
3958 | for (unsigned i = 0; i < num3; i++) { |
3959 | set_req(i + idx2, _in[i + idx3]); |
3960 | } |
3961 | num2 = num3; |
3962 | idx3 = idx2 + num2; |
3963 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
3964 | del_req(i); |
3965 | } |
3966 | _num_opnds = 3; |
3967 | } else { |
3968 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 3967, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
3969 | } |
3970 | |
3971 | return this; |
3972 | } |
3973 | |
3974 | MachNode* andnI_rReg_rReg_memNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
3975 | Compile* C = Compile::current(); |
3976 | // Add projection edges for additional defs or kills |
3977 | // DEF/KILL cr |
3978 | MachProjNode *kill; |
3979 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
3980 | proj_list.push(kill); |
3981 | |
3982 | return this; |
3983 | } |
3984 | |
3985 | MachNode* andnI_rReg_rReg_mem_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
3986 | Compile* C = Compile::current(); |
3987 | // Add projection edges for additional defs or kills |
3988 | // DEF/KILL cr |
3989 | MachProjNode *kill; |
3990 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
3991 | proj_list.push(kill); |
3992 | |
3993 | return this; |
3994 | } |
3995 | |
3996 | MachNode* andnI_rReg_rReg_rRegNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
3997 | Compile* C = Compile::current(); |
3998 | // Add projection edges for additional defs or kills |
3999 | // DEF/KILL cr |
4000 | MachProjNode *kill; |
4001 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
4002 | proj_list.push(kill); |
4003 | |
4004 | return this; |
4005 | } |
4006 | |
4007 | MachNode* andnI_rReg_rReg_rReg_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
4008 | Compile* C = Compile::current(); |
4009 | // Add projection edges for additional defs or kills |
4010 | // DEF/KILL cr |
4011 | MachProjNode *kill; |
4012 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
4013 | proj_list.push(kill); |
4014 | |
4015 | return this; |
4016 | } |
4017 | |
4018 | MachNode* blsiI_rReg_rRegNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
4019 | Compile* C = Compile::current(); |
4020 | // Add projection edges for additional defs or kills |
4021 | // DEF/KILL cr |
4022 | MachProjNode *kill; |
4023 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
4024 | proj_list.push(kill); |
4025 | // Remove duplicated operands and inputs which use the same name. |
4026 | if (num_opnds() == 4) { |
4027 | unsigned num0 = 0; |
4028 | unsigned num1 = opnd_array(1)->num_edges(); // imm_zero |
4029 | unsigned num2 = opnd_array(2)->num_edges(); // src |
4030 | unsigned num3 = opnd_array(3)->num_edges(); // src |
4031 | unsigned idx0 = oper_input_base(); |
4032 | unsigned idx1 = idx0 + num0; |
4033 | unsigned idx2 = idx1 + num1; |
4034 | unsigned idx3 = idx2 + num2; |
4035 | unsigned idx4 = idx3 + num3; |
4036 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
4037 | del_req(i); |
4038 | } |
4039 | _num_opnds = 3; |
4040 | } else { |
4041 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 4040, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
4042 | } |
4043 | |
4044 | return this; |
4045 | } |
4046 | |
4047 | MachNode* blsiI_rReg_rReg_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
4048 | Compile* C = Compile::current(); |
4049 | // Add projection edges for additional defs or kills |
4050 | // DEF/KILL cr |
4051 | MachProjNode *kill; |
4052 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
4053 | proj_list.push(kill); |
4054 | // Remove duplicated operands and inputs which use the same name. |
4055 | if (num_opnds() == 4) { |
4056 | unsigned num0 = 0; |
4057 | unsigned num1 = opnd_array(1)->num_edges(); // src |
4058 | unsigned num2 = opnd_array(2)->num_edges(); // imm_zero |
4059 | unsigned num3 = opnd_array(3)->num_edges(); // src |
4060 | unsigned idx0 = oper_input_base(); |
4061 | unsigned idx1 = idx0 + num0; |
4062 | unsigned idx2 = idx1 + num1; |
4063 | unsigned idx3 = idx2 + num2; |
4064 | unsigned idx4 = idx3 + num3; |
4065 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
4066 | del_req(i); |
4067 | } |
4068 | _num_opnds = 3; |
4069 | } else { |
4070 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 4069, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
4071 | } |
4072 | |
4073 | return this; |
4074 | } |
4075 | |
4076 | MachNode* blsiI_rReg_memNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
4077 | Compile* C = Compile::current(); |
4078 | // Add projection edges for additional defs or kills |
4079 | // DEF/KILL cr |
4080 | MachProjNode *kill; |
4081 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
4082 | proj_list.push(kill); |
4083 | // Remove duplicated operands and inputs which use the same name. |
4084 | if (num_opnds() == 4) { |
4085 | unsigned num0 = 0; |
4086 | unsigned num1 = opnd_array(1)->num_edges(); // imm_zero |
4087 | unsigned num2 = opnd_array(2)->num_edges(); // src |
4088 | unsigned num3 = opnd_array(3)->num_edges(); // src |
4089 | unsigned idx0 = oper_input_base(); |
4090 | unsigned idx1 = idx0 + num0; |
4091 | unsigned idx2 = idx1 + num1; |
4092 | unsigned idx3 = idx2 + num2; |
4093 | unsigned idx4 = idx3 + num3; |
4094 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
4095 | del_req(i); |
4096 | } |
4097 | _num_opnds = 3; |
4098 | } else { |
4099 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 4098, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
4100 | } |
4101 | |
4102 | return this; |
4103 | } |
4104 | |
4105 | MachNode* blsiI_rReg_mem_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
4106 | Compile* C = Compile::current(); |
4107 | // Add projection edges for additional defs or kills |
4108 | // DEF/KILL cr |
4109 | MachProjNode *kill; |
4110 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
4111 | proj_list.push(kill); |
4112 | // Remove duplicated operands and inputs which use the same name. |
4113 | if (num_opnds() == 4) { |
4114 | unsigned num0 = 0; |
4115 | unsigned num1 = opnd_array(1)->num_edges(); // src |
4116 | unsigned num2 = opnd_array(2)->num_edges(); // imm_zero |
4117 | unsigned num3 = opnd_array(3)->num_edges(); // src |
4118 | unsigned idx0 = oper_input_base(); |
4119 | unsigned idx1 = idx0 + num0; |
4120 | unsigned idx2 = idx1 + num1; |
4121 | unsigned idx3 = idx2 + num2; |
4122 | unsigned idx4 = idx3 + num3; |
4123 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
4124 | del_req(i); |
4125 | } |
4126 | _num_opnds = 3; |
4127 | } else { |
4128 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 4127, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
4129 | } |
4130 | |
4131 | return this; |
4132 | } |
4133 | |
4134 | MachNode* blsmskI_rReg_memNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
4135 | Compile* C = Compile::current(); |
4136 | // Add projection edges for additional defs or kills |
4137 | // DEF/KILL cr |
4138 | MachProjNode *kill; |
4139 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
4140 | proj_list.push(kill); |
4141 | // Remove duplicated operands and inputs which use the same name. |
4142 | if (num_opnds() == 4) { |
4143 | unsigned num0 = 0; |
4144 | unsigned num1 = opnd_array(1)->num_edges(); // src |
4145 | unsigned num2 = opnd_array(2)->num_edges(); // minus_1 |
4146 | unsigned num3 = opnd_array(3)->num_edges(); // src |
4147 | unsigned idx0 = oper_input_base(); |
4148 | unsigned idx1 = idx0 + num0; |
4149 | unsigned idx2 = idx1 + num1; |
4150 | unsigned idx3 = idx2 + num2; |
4151 | unsigned idx4 = idx3 + num3; |
4152 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
4153 | del_req(i); |
4154 | } |
4155 | _num_opnds = 3; |
4156 | } else { |
4157 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 4156, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
4158 | } |
4159 | |
4160 | return this; |
4161 | } |
4162 | |
4163 | MachNode* blsmskI_rReg_mem_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
4164 | Compile* C = Compile::current(); |
4165 | // Add projection edges for additional defs or kills |
4166 | // DEF/KILL cr |
4167 | MachProjNode *kill; |
4168 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
4169 | proj_list.push(kill); |
4170 | // Remove duplicated operands and inputs which use the same name. |
4171 | if (num_opnds() == 4) { |
4172 | unsigned num0 = 0; |
4173 | unsigned num1 = opnd_array(1)->num_edges(); // src |
4174 | unsigned num2 = opnd_array(2)->num_edges(); // src |
4175 | unsigned num3 = opnd_array(3)->num_edges(); // minus_1 |
4176 | unsigned idx0 = oper_input_base(); |
4177 | unsigned idx1 = idx0 + num0; |
4178 | unsigned idx2 = idx1 + num1; |
4179 | unsigned idx3 = idx2 + num2; |
4180 | unsigned idx4 = idx3 + num3; |
4181 | set_opnd_array(2, opnd_array(3)->clone()); // minus_1 |
4182 | for (unsigned i = 0; i < num3; i++) { |
4183 | set_req(i + idx2, _in[i + idx3]); |
4184 | } |
4185 | num2 = num3; |
4186 | idx3 = idx2 + num2; |
4187 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
4188 | del_req(i); |
4189 | } |
4190 | _num_opnds = 3; |
4191 | } else { |
4192 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 4191, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
4193 | } |
4194 | |
4195 | return this; |
4196 | } |
4197 | |
4198 | MachNode* blsmskI_rReg_rRegNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
4199 | Compile* C = Compile::current(); |
4200 | // Add projection edges for additional defs or kills |
4201 | // DEF/KILL cr |
4202 | MachProjNode *kill; |
4203 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
4204 | proj_list.push(kill); |
4205 | // Remove duplicated operands and inputs which use the same name. |
4206 | if (num_opnds() == 4) { |
4207 | unsigned num0 = 0; |
4208 | unsigned num1 = opnd_array(1)->num_edges(); // src |
4209 | unsigned num2 = opnd_array(2)->num_edges(); // minus_1 |
4210 | unsigned num3 = opnd_array(3)->num_edges(); // src |
4211 | unsigned idx0 = oper_input_base(); |
4212 | unsigned idx1 = idx0 + num0; |
4213 | unsigned idx2 = idx1 + num1; |
4214 | unsigned idx3 = idx2 + num2; |
4215 | unsigned idx4 = idx3 + num3; |
4216 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
4217 | del_req(i); |
4218 | } |
4219 | _num_opnds = 3; |
4220 | } else { |
4221 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 4220, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
4222 | } |
4223 | |
4224 | return this; |
4225 | } |
4226 | |
4227 | MachNode* blsmskI_rReg_rReg_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
4228 | Compile* C = Compile::current(); |
4229 | // Add projection edges for additional defs or kills |
4230 | // DEF/KILL cr |
4231 | MachProjNode *kill; |
4232 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
4233 | proj_list.push(kill); |
4234 | // Remove duplicated operands and inputs which use the same name. |
4235 | if (num_opnds() == 4) { |
4236 | unsigned num0 = 0; |
4237 | unsigned num1 = opnd_array(1)->num_edges(); // src |
4238 | unsigned num2 = opnd_array(2)->num_edges(); // src |
4239 | unsigned num3 = opnd_array(3)->num_edges(); // minus_1 |
4240 | unsigned idx0 = oper_input_base(); |
4241 | unsigned idx1 = idx0 + num0; |
4242 | unsigned idx2 = idx1 + num1; |
4243 | unsigned idx3 = idx2 + num2; |
4244 | unsigned idx4 = idx3 + num3; |
4245 | set_opnd_array(2, opnd_array(3)->clone()); // minus_1 |
4246 | for (unsigned i = 0; i < num3; i++) { |
4247 | set_req(i + idx2, _in[i + idx3]); |
4248 | } |
4249 | num2 = num3; |
4250 | idx3 = idx2 + num2; |
4251 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
4252 | del_req(i); |
4253 | } |
4254 | _num_opnds = 3; |
4255 | } else { |
4256 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 4255, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
4257 | } |
4258 | |
4259 | return this; |
4260 | } |
4261 | |
4262 | MachNode* blsrI_rReg_rRegNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
4263 | Compile* C = Compile::current(); |
4264 | // Add projection edges for additional defs or kills |
4265 | // DEF/KILL cr |
4266 | MachProjNode *kill; |
4267 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
4268 | proj_list.push(kill); |
4269 | // Remove duplicated operands and inputs which use the same name. |
4270 | if (num_opnds() == 4) { |
4271 | unsigned num0 = 0; |
4272 | unsigned num1 = opnd_array(1)->num_edges(); // src |
4273 | unsigned num2 = opnd_array(2)->num_edges(); // minus_1 |
4274 | unsigned num3 = opnd_array(3)->num_edges(); // src |
4275 | unsigned idx0 = oper_input_base(); |
4276 | unsigned idx1 = idx0 + num0; |
4277 | unsigned idx2 = idx1 + num1; |
4278 | unsigned idx3 = idx2 + num2; |
4279 | unsigned idx4 = idx3 + num3; |
4280 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
4281 | del_req(i); |
4282 | } |
4283 | _num_opnds = 3; |
4284 | } else { |
4285 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 4284, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
4286 | } |
4287 | |
4288 | return this; |
4289 | } |
4290 | |
4291 | MachNode* blsrI_rReg_rReg_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
4292 | Compile* C = Compile::current(); |
4293 | // Add projection edges for additional defs or kills |
4294 | // DEF/KILL cr |
4295 | MachProjNode *kill; |
4296 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
4297 | proj_list.push(kill); |
4298 | // Remove duplicated operands and inputs which use the same name. |
4299 | if (num_opnds() == 4) { |
4300 | unsigned num0 = 0; |
4301 | unsigned num1 = opnd_array(1)->num_edges(); // src |
4302 | unsigned num2 = opnd_array(2)->num_edges(); // src |
4303 | unsigned num3 = opnd_array(3)->num_edges(); // minus_1 |
4304 | unsigned idx0 = oper_input_base(); |
4305 | unsigned idx1 = idx0 + num0; |
4306 | unsigned idx2 = idx1 + num1; |
4307 | unsigned idx3 = idx2 + num2; |
4308 | unsigned idx4 = idx3 + num3; |
4309 | set_opnd_array(2, opnd_array(3)->clone()); // minus_1 |
4310 | for (unsigned i = 0; i < num3; i++) { |
4311 | set_req(i + idx2, _in[i + idx3]); |
4312 | } |
4313 | num2 = num3; |
4314 | idx3 = idx2 + num2; |
4315 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
4316 | del_req(i); |
4317 | } |
4318 | _num_opnds = 3; |
4319 | } else { |
4320 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 4319, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
4321 | } |
4322 | |
4323 | return this; |
4324 | } |
4325 | |
4326 | MachNode* blsrI_rReg_memNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
4327 | Compile* C = Compile::current(); |
4328 | // Add projection edges for additional defs or kills |
4329 | // DEF/KILL cr |
4330 | MachProjNode *kill; |
4331 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
4332 | proj_list.push(kill); |
4333 | // Remove duplicated operands and inputs which use the same name. |
4334 | if (num_opnds() == 4) { |
4335 | unsigned num0 = 0; |
4336 | unsigned num1 = opnd_array(1)->num_edges(); // src |
4337 | unsigned num2 = opnd_array(2)->num_edges(); // minus_1 |
4338 | unsigned num3 = opnd_array(3)->num_edges(); // src |
4339 | unsigned idx0 = oper_input_base(); |
4340 | unsigned idx1 = idx0 + num0; |
4341 | unsigned idx2 = idx1 + num1; |
4342 | unsigned idx3 = idx2 + num2; |
4343 | unsigned idx4 = idx3 + num3; |
4344 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
4345 | del_req(i); |
4346 | } |
4347 | _num_opnds = 3; |
4348 | } else { |
4349 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 4348, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
4350 | } |
4351 | |
4352 | return this; |
4353 | } |
4354 | |
4355 | MachNode* blsrI_rReg_mem_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
4356 | Compile* C = Compile::current(); |
4357 | // Add projection edges for additional defs or kills |
4358 | // DEF/KILL cr |
4359 | MachProjNode *kill; |
4360 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
4361 | proj_list.push(kill); |
4362 | // Remove duplicated operands and inputs which use the same name. |
4363 | if (num_opnds() == 4) { |
4364 | unsigned num0 = 0; |
4365 | unsigned num1 = opnd_array(1)->num_edges(); // src |
4366 | unsigned num2 = opnd_array(2)->num_edges(); // src |
4367 | unsigned num3 = opnd_array(3)->num_edges(); // minus_1 |
4368 | unsigned idx0 = oper_input_base(); |
4369 | unsigned idx1 = idx0 + num0; |
4370 | unsigned idx2 = idx1 + num1; |
4371 | unsigned idx3 = idx2 + num2; |
4372 | unsigned idx4 = idx3 + num3; |
4373 | set_opnd_array(2, opnd_array(3)->clone()); // minus_1 |
4374 | for (unsigned i = 0; i < num3; i++) { |
4375 | set_req(i + idx2, _in[i + idx3]); |
4376 | } |
4377 | num2 = num3; |
4378 | idx3 = idx2 + num2; |
4379 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
4380 | del_req(i); |
4381 | } |
4382 | _num_opnds = 3; |
4383 | } else { |
4384 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 4383, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
4385 | } |
4386 | |
4387 | return this; |
4388 | } |
4389 | |
4390 | MachNode* orI_rRegNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
4391 | Compile* C = Compile::current(); |
4392 | // Add projection edges for additional defs or kills |
4393 | // DEF/KILL cr |
4394 | MachProjNode *kill; |
4395 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
4396 | proj_list.push(kill); |
4397 | |
4398 | return this; |
4399 | } |
4400 | |
4401 | MachNode* orI_rReg_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
4402 | Compile* C = Compile::current(); |
4403 | // Add projection edges for additional defs or kills |
4404 | // DEF/KILL cr |
4405 | MachProjNode *kill; |
4406 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
4407 | proj_list.push(kill); |
4408 | |
4409 | return this; |
4410 | } |
4411 | |
4412 | MachNode* orI_rReg_memNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
4413 | Compile* C = Compile::current(); |
4414 | // Add projection edges for additional defs or kills |
4415 | // DEF/KILL cr |
4416 | MachProjNode *kill; |
4417 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
4418 | proj_list.push(kill); |
4419 | |
4420 | return this; |
4421 | } |
4422 | |
4423 | MachNode* orI_rReg_mem_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
4424 | Compile* C = Compile::current(); |
4425 | // Add projection edges for additional defs or kills |
4426 | // DEF/KILL cr |
4427 | MachProjNode *kill; |
4428 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
4429 | proj_list.push(kill); |
4430 | |
4431 | return this; |
4432 | } |
4433 | |
4434 | MachNode* orB_mem_rRegNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
4435 | Compile* C = Compile::current(); |
4436 | // Add projection edges for additional defs or kills |
4437 | // DEF/KILL cr |
4438 | MachProjNode *kill; |
4439 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
4440 | proj_list.push(kill); |
4441 | // Remove duplicated operands and inputs which use the same name. |
4442 | if (num_opnds() == 4) { |
4443 | unsigned num0 = 0; |
4444 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
4445 | unsigned num2 = opnd_array(2)->num_edges(); // dst |
4446 | unsigned num3 = opnd_array(3)->num_edges(); // src |
4447 | unsigned idx0 = oper_input_base(); |
4448 | unsigned idx1 = idx0 + num0; |
4449 | unsigned idx2 = idx1 + num1; |
4450 | unsigned idx3 = idx2 + num2; |
4451 | unsigned idx4 = idx3 + num3; |
4452 | set_opnd_array(2, opnd_array(3)->clone()); // src |
4453 | for (unsigned i = 0; i < num3; i++) { |
4454 | set_req(i + idx2, _in[i + idx3]); |
4455 | } |
4456 | num2 = num3; |
4457 | idx3 = idx2 + num2; |
4458 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
4459 | del_req(i); |
4460 | } |
4461 | _num_opnds = 3; |
4462 | } else { |
4463 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 4462, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
4464 | } |
4465 | |
4466 | return this; |
4467 | } |
4468 | |
4469 | MachNode* orB_mem_rReg_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
4470 | Compile* C = Compile::current(); |
4471 | // Add projection edges for additional defs or kills |
4472 | // DEF/KILL cr |
4473 | MachProjNode *kill; |
4474 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
4475 | proj_list.push(kill); |
4476 | // Remove duplicated operands and inputs which use the same name. |
4477 | if (num_opnds() == 4) { |
4478 | unsigned num0 = 0; |
4479 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
4480 | unsigned num2 = opnd_array(2)->num_edges(); // src |
4481 | unsigned num3 = opnd_array(3)->num_edges(); // dst |
4482 | unsigned idx0 = oper_input_base(); |
4483 | unsigned idx1 = idx0 + num0; |
4484 | unsigned idx2 = idx1 + num1; |
4485 | unsigned idx3 = idx2 + num2; |
4486 | unsigned idx4 = idx3 + num3; |
4487 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
4488 | del_req(i); |
4489 | } |
4490 | _num_opnds = 3; |
4491 | } else { |
4492 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 4491, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
4493 | } |
4494 | |
4495 | return this; |
4496 | } |
4497 | |
4498 | MachNode* orI_mem_rRegNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
4499 | Compile* C = Compile::current(); |
4500 | // Add projection edges for additional defs or kills |
4501 | // DEF/KILL cr |
4502 | MachProjNode *kill; |
4503 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
4504 | proj_list.push(kill); |
4505 | // Remove duplicated operands and inputs which use the same name. |
4506 | if (num_opnds() == 4) { |
4507 | unsigned num0 = 0; |
4508 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
4509 | unsigned num2 = opnd_array(2)->num_edges(); // dst |
4510 | unsigned num3 = opnd_array(3)->num_edges(); // src |
4511 | unsigned idx0 = oper_input_base(); |
4512 | unsigned idx1 = idx0 + num0; |
4513 | unsigned idx2 = idx1 + num1; |
4514 | unsigned idx3 = idx2 + num2; |
4515 | unsigned idx4 = idx3 + num3; |
4516 | set_opnd_array(2, opnd_array(3)->clone()); // src |
4517 | for (unsigned i = 0; i < num3; i++) { |
4518 | set_req(i + idx2, _in[i + idx3]); |
4519 | } |
4520 | num2 = num3; |
4521 | idx3 = idx2 + num2; |
4522 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
4523 | del_req(i); |
4524 | } |
4525 | _num_opnds = 3; |
4526 | } else { |
4527 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 4526, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
4528 | } |
4529 | |
4530 | return this; |
4531 | } |
4532 | |
4533 | MachNode* orI_mem_rReg_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
4534 | Compile* C = Compile::current(); |
4535 | // Add projection edges for additional defs or kills |
4536 | // DEF/KILL cr |
4537 | MachProjNode *kill; |
4538 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
4539 | proj_list.push(kill); |
4540 | // Remove duplicated operands and inputs which use the same name. |
4541 | if (num_opnds() == 4) { |
4542 | unsigned num0 = 0; |
4543 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
4544 | unsigned num2 = opnd_array(2)->num_edges(); // src |
4545 | unsigned num3 = opnd_array(3)->num_edges(); // dst |
4546 | unsigned idx0 = oper_input_base(); |
4547 | unsigned idx1 = idx0 + num0; |
4548 | unsigned idx2 = idx1 + num1; |
4549 | unsigned idx3 = idx2 + num2; |
4550 | unsigned idx4 = idx3 + num3; |
4551 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
4552 | del_req(i); |
4553 | } |
4554 | _num_opnds = 3; |
4555 | } else { |
4556 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 4555, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
4557 | } |
4558 | |
4559 | return this; |
4560 | } |
4561 | |
4562 | MachNode* orI_mem_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
4563 | Compile* C = Compile::current(); |
4564 | // Add projection edges for additional defs or kills |
4565 | // DEF/KILL cr |
4566 | MachProjNode *kill; |
4567 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
4568 | proj_list.push(kill); |
4569 | // Remove duplicated operands and inputs which use the same name. |
4570 | if (num_opnds() == 4) { |
4571 | unsigned num0 = 0; |
4572 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
4573 | unsigned num2 = opnd_array(2)->num_edges(); // dst |
4574 | unsigned num3 = opnd_array(3)->num_edges(); // src |
4575 | unsigned idx0 = oper_input_base(); |
4576 | unsigned idx1 = idx0 + num0; |
4577 | unsigned idx2 = idx1 + num1; |
4578 | unsigned idx3 = idx2 + num2; |
4579 | unsigned idx4 = idx3 + num3; |
4580 | set_opnd_array(2, opnd_array(3)->clone()); // src |
4581 | for (unsigned i = 0; i < num3; i++) { |
4582 | set_req(i + idx2, _in[i + idx3]); |
4583 | } |
4584 | num2 = num3; |
4585 | idx3 = idx2 + num2; |
4586 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
4587 | del_req(i); |
4588 | } |
4589 | _num_opnds = 3; |
4590 | } else { |
4591 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 4590, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
4592 | } |
4593 | |
4594 | return this; |
4595 | } |
4596 | |
4597 | MachNode* xorI_rRegNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
4598 | Compile* C = Compile::current(); |
4599 | // Add projection edges for additional defs or kills |
4600 | // DEF/KILL cr |
4601 | MachProjNode *kill; |
4602 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
4603 | proj_list.push(kill); |
4604 | |
4605 | return this; |
4606 | } |
4607 | |
4608 | MachNode* xorI_rReg_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
4609 | Compile* C = Compile::current(); |
4610 | // Add projection edges for additional defs or kills |
4611 | // DEF/KILL cr |
4612 | MachProjNode *kill; |
4613 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
4614 | proj_list.push(kill); |
4615 | |
4616 | return this; |
4617 | } |
4618 | |
4619 | MachNode* xorI_rReg_memNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
4620 | Compile* C = Compile::current(); |
4621 | // Add projection edges for additional defs or kills |
4622 | // DEF/KILL cr |
4623 | MachProjNode *kill; |
4624 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
4625 | proj_list.push(kill); |
4626 | |
4627 | return this; |
4628 | } |
4629 | |
4630 | MachNode* xorI_rReg_mem_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
4631 | Compile* C = Compile::current(); |
4632 | // Add projection edges for additional defs or kills |
4633 | // DEF/KILL cr |
4634 | MachProjNode *kill; |
4635 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
4636 | proj_list.push(kill); |
4637 | |
4638 | return this; |
4639 | } |
4640 | |
4641 | MachNode* xorB_mem_rRegNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
4642 | Compile* C = Compile::current(); |
4643 | // Add projection edges for additional defs or kills |
4644 | // DEF/KILL cr |
4645 | MachProjNode *kill; |
4646 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
4647 | proj_list.push(kill); |
4648 | // Remove duplicated operands and inputs which use the same name. |
4649 | if (num_opnds() == 4) { |
4650 | unsigned num0 = 0; |
4651 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
4652 | unsigned num2 = opnd_array(2)->num_edges(); // dst |
4653 | unsigned num3 = opnd_array(3)->num_edges(); // src |
4654 | unsigned idx0 = oper_input_base(); |
4655 | unsigned idx1 = idx0 + num0; |
4656 | unsigned idx2 = idx1 + num1; |
4657 | unsigned idx3 = idx2 + num2; |
4658 | unsigned idx4 = idx3 + num3; |
4659 | set_opnd_array(2, opnd_array(3)->clone()); // src |
4660 | for (unsigned i = 0; i < num3; i++) { |
4661 | set_req(i + idx2, _in[i + idx3]); |
4662 | } |
4663 | num2 = num3; |
4664 | idx3 = idx2 + num2; |
4665 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
4666 | del_req(i); |
4667 | } |
4668 | _num_opnds = 3; |
4669 | } else { |
4670 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 4669, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
4671 | } |
4672 | |
4673 | return this; |
4674 | } |
4675 | |
4676 | MachNode* xorB_mem_rReg_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
4677 | Compile* C = Compile::current(); |
4678 | // Add projection edges for additional defs or kills |
4679 | // DEF/KILL cr |
4680 | MachProjNode *kill; |
4681 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
4682 | proj_list.push(kill); |
4683 | // Remove duplicated operands and inputs which use the same name. |
4684 | if (num_opnds() == 4) { |
4685 | unsigned num0 = 0; |
4686 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
4687 | unsigned num2 = opnd_array(2)->num_edges(); // src |
4688 | unsigned num3 = opnd_array(3)->num_edges(); // dst |
4689 | unsigned idx0 = oper_input_base(); |
4690 | unsigned idx1 = idx0 + num0; |
4691 | unsigned idx2 = idx1 + num1; |
4692 | unsigned idx3 = idx2 + num2; |
4693 | unsigned idx4 = idx3 + num3; |
4694 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
4695 | del_req(i); |
4696 | } |
4697 | _num_opnds = 3; |
4698 | } else { |
4699 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 4698, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
4700 | } |
4701 | |
4702 | return this; |
4703 | } |
4704 | |
4705 | MachNode* xorI_mem_rRegNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
4706 | Compile* C = Compile::current(); |
4707 | // Add projection edges for additional defs or kills |
4708 | // DEF/KILL cr |
4709 | MachProjNode *kill; |
4710 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
4711 | proj_list.push(kill); |
4712 | // Remove duplicated operands and inputs which use the same name. |
4713 | if (num_opnds() == 4) { |
4714 | unsigned num0 = 0; |
4715 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
4716 | unsigned num2 = opnd_array(2)->num_edges(); // dst |
4717 | unsigned num3 = opnd_array(3)->num_edges(); // src |
4718 | unsigned idx0 = oper_input_base(); |
4719 | unsigned idx1 = idx0 + num0; |
4720 | unsigned idx2 = idx1 + num1; |
4721 | unsigned idx3 = idx2 + num2; |
4722 | unsigned idx4 = idx3 + num3; |
4723 | set_opnd_array(2, opnd_array(3)->clone()); // src |
4724 | for (unsigned i = 0; i < num3; i++) { |
4725 | set_req(i + idx2, _in[i + idx3]); |
4726 | } |
4727 | num2 = num3; |
4728 | idx3 = idx2 + num2; |
4729 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
4730 | del_req(i); |
4731 | } |
4732 | _num_opnds = 3; |
4733 | } else { |
4734 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 4733, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
4735 | } |
4736 | |
4737 | return this; |
4738 | } |
4739 | |
4740 | MachNode* xorI_mem_rReg_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
4741 | Compile* C = Compile::current(); |
4742 | // Add projection edges for additional defs or kills |
4743 | // DEF/KILL cr |
4744 | MachProjNode *kill; |
4745 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
4746 | proj_list.push(kill); |
4747 | // Remove duplicated operands and inputs which use the same name. |
4748 | if (num_opnds() == 4) { |
4749 | unsigned num0 = 0; |
4750 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
4751 | unsigned num2 = opnd_array(2)->num_edges(); // src |
4752 | unsigned num3 = opnd_array(3)->num_edges(); // dst |
4753 | unsigned idx0 = oper_input_base(); |
4754 | unsigned idx1 = idx0 + num0; |
4755 | unsigned idx2 = idx1 + num1; |
4756 | unsigned idx3 = idx2 + num2; |
4757 | unsigned idx4 = idx3 + num3; |
4758 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
4759 | del_req(i); |
4760 | } |
4761 | _num_opnds = 3; |
4762 | } else { |
4763 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 4762, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
4764 | } |
4765 | |
4766 | return this; |
4767 | } |
4768 | |
4769 | MachNode* xorI_mem_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
4770 | Compile* C = Compile::current(); |
4771 | // Add projection edges for additional defs or kills |
4772 | // DEF/KILL cr |
4773 | MachProjNode *kill; |
4774 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
4775 | proj_list.push(kill); |
4776 | // Remove duplicated operands and inputs which use the same name. |
4777 | if (num_opnds() == 4) { |
4778 | unsigned num0 = 0; |
4779 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
4780 | unsigned num2 = opnd_array(2)->num_edges(); // dst |
4781 | unsigned num3 = opnd_array(3)->num_edges(); // src |
4782 | unsigned idx0 = oper_input_base(); |
4783 | unsigned idx1 = idx0 + num0; |
4784 | unsigned idx2 = idx1 + num1; |
4785 | unsigned idx3 = idx2 + num2; |
4786 | unsigned idx4 = idx3 + num3; |
4787 | set_opnd_array(2, opnd_array(3)->clone()); // src |
4788 | for (unsigned i = 0; i < num3; i++) { |
4789 | set_req(i + idx2, _in[i + idx3]); |
4790 | } |
4791 | num2 = num3; |
4792 | idx3 = idx2 + num2; |
4793 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
4794 | del_req(i); |
4795 | } |
4796 | _num_opnds = 3; |
4797 | } else { |
4798 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 4797, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
4799 | } |
4800 | |
4801 | return this; |
4802 | } |
4803 | |
4804 | MachNode* andL_rRegNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
4805 | Compile* C = Compile::current(); |
4806 | // Add projection edges for additional defs or kills |
4807 | // DEF/KILL cr |
4808 | MachProjNode *kill; |
4809 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
4810 | proj_list.push(kill); |
4811 | |
4812 | return this; |
4813 | } |
4814 | |
4815 | MachNode* andL_rReg_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
4816 | Compile* C = Compile::current(); |
4817 | // Add projection edges for additional defs or kills |
4818 | // DEF/KILL cr |
4819 | MachProjNode *kill; |
4820 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
4821 | proj_list.push(kill); |
4822 | |
4823 | return this; |
4824 | } |
4825 | |
4826 | MachNode* andL_rReg_memNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
4827 | Compile* C = Compile::current(); |
4828 | // Add projection edges for additional defs or kills |
4829 | // DEF/KILL cr |
4830 | MachProjNode *kill; |
4831 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
4832 | proj_list.push(kill); |
4833 | |
4834 | return this; |
4835 | } |
4836 | |
4837 | MachNode* andL_rReg_mem_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
4838 | Compile* C = Compile::current(); |
4839 | // Add projection edges for additional defs or kills |
4840 | // DEF/KILL cr |
4841 | MachProjNode *kill; |
4842 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
4843 | proj_list.push(kill); |
4844 | |
4845 | return this; |
4846 | } |
4847 | |
4848 | MachNode* andL_mem_rRegNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
4849 | Compile* C = Compile::current(); |
4850 | // Add projection edges for additional defs or kills |
4851 | // DEF/KILL cr |
4852 | MachProjNode *kill; |
4853 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
4854 | proj_list.push(kill); |
4855 | // Remove duplicated operands and inputs which use the same name. |
4856 | if (num_opnds() == 4) { |
4857 | unsigned num0 = 0; |
4858 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
4859 | unsigned num2 = opnd_array(2)->num_edges(); // dst |
4860 | unsigned num3 = opnd_array(3)->num_edges(); // src |
4861 | unsigned idx0 = oper_input_base(); |
4862 | unsigned idx1 = idx0 + num0; |
4863 | unsigned idx2 = idx1 + num1; |
4864 | unsigned idx3 = idx2 + num2; |
4865 | unsigned idx4 = idx3 + num3; |
4866 | set_opnd_array(2, opnd_array(3)->clone()); // src |
4867 | for (unsigned i = 0; i < num3; i++) { |
4868 | set_req(i + idx2, _in[i + idx3]); |
4869 | } |
4870 | num2 = num3; |
4871 | idx3 = idx2 + num2; |
4872 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
4873 | del_req(i); |
4874 | } |
4875 | _num_opnds = 3; |
4876 | } else { |
4877 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 4876, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
4878 | } |
4879 | |
4880 | return this; |
4881 | } |
4882 | |
4883 | MachNode* andL_mem_rReg_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
4884 | Compile* C = Compile::current(); |
4885 | // Add projection edges for additional defs or kills |
4886 | // DEF/KILL cr |
4887 | MachProjNode *kill; |
4888 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
4889 | proj_list.push(kill); |
4890 | // Remove duplicated operands and inputs which use the same name. |
4891 | if (num_opnds() == 4) { |
4892 | unsigned num0 = 0; |
4893 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
4894 | unsigned num2 = opnd_array(2)->num_edges(); // src |
4895 | unsigned num3 = opnd_array(3)->num_edges(); // dst |
4896 | unsigned idx0 = oper_input_base(); |
4897 | unsigned idx1 = idx0 + num0; |
4898 | unsigned idx2 = idx1 + num1; |
4899 | unsigned idx3 = idx2 + num2; |
4900 | unsigned idx4 = idx3 + num3; |
4901 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
4902 | del_req(i); |
4903 | } |
4904 | _num_opnds = 3; |
4905 | } else { |
4906 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 4905, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
4907 | } |
4908 | |
4909 | return this; |
4910 | } |
4911 | |
4912 | MachNode* andL_mem_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
4913 | Compile* C = Compile::current(); |
4914 | // Add projection edges for additional defs or kills |
4915 | // DEF/KILL cr |
4916 | MachProjNode *kill; |
4917 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
4918 | proj_list.push(kill); |
4919 | // Remove duplicated operands and inputs which use the same name. |
4920 | if (num_opnds() == 4) { |
4921 | unsigned num0 = 0; |
4922 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
4923 | unsigned num2 = opnd_array(2)->num_edges(); // dst |
4924 | unsigned num3 = opnd_array(3)->num_edges(); // src |
4925 | unsigned idx0 = oper_input_base(); |
4926 | unsigned idx1 = idx0 + num0; |
4927 | unsigned idx2 = idx1 + num1; |
4928 | unsigned idx3 = idx2 + num2; |
4929 | unsigned idx4 = idx3 + num3; |
4930 | set_opnd_array(2, opnd_array(3)->clone()); // src |
4931 | for (unsigned i = 0; i < num3; i++) { |
4932 | set_req(i + idx2, _in[i + idx3]); |
4933 | } |
4934 | num2 = num3; |
4935 | idx3 = idx2 + num2; |
4936 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
4937 | del_req(i); |
4938 | } |
4939 | _num_opnds = 3; |
4940 | } else { |
4941 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 4940, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
4942 | } |
4943 | |
4944 | return this; |
4945 | } |
4946 | |
4947 | MachNode* btrL_mem_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
4948 | Compile* C = Compile::current(); |
4949 | // Add projection edges for additional defs or kills |
4950 | // DEF/KILL cr |
4951 | MachProjNode *kill; |
4952 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
4953 | proj_list.push(kill); |
4954 | // Remove duplicated operands and inputs which use the same name. |
4955 | if (num_opnds() == 4) { |
4956 | unsigned num0 = 0; |
4957 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
4958 | unsigned num2 = opnd_array(2)->num_edges(); // dst |
4959 | unsigned num3 = opnd_array(3)->num_edges(); // con |
4960 | unsigned idx0 = oper_input_base(); |
4961 | unsigned idx1 = idx0 + num0; |
4962 | unsigned idx2 = idx1 + num1; |
4963 | unsigned idx3 = idx2 + num2; |
4964 | unsigned idx4 = idx3 + num3; |
4965 | set_opnd_array(2, opnd_array(3)->clone()); // con |
4966 | for (unsigned i = 0; i < num3; i++) { |
4967 | set_req(i + idx2, _in[i + idx3]); |
4968 | } |
4969 | num2 = num3; |
4970 | idx3 = idx2 + num2; |
4971 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
4972 | del_req(i); |
4973 | } |
4974 | _num_opnds = 3; |
4975 | } else { |
4976 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 4975, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
4977 | } |
4978 | |
4979 | return this; |
4980 | } |
4981 | |
4982 | MachNode* andnL_rReg_rReg_memNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
4983 | Compile* C = Compile::current(); |
4984 | // Add projection edges for additional defs or kills |
4985 | // DEF/KILL cr |
4986 | MachProjNode *kill; |
4987 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
4988 | proj_list.push(kill); |
4989 | |
4990 | return this; |
4991 | } |
4992 | |
4993 | MachNode* andnL_rReg_rReg_mem_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
4994 | Compile* C = Compile::current(); |
4995 | // Add projection edges for additional defs or kills |
4996 | // DEF/KILL cr |
4997 | MachProjNode *kill; |
4998 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
4999 | proj_list.push(kill); |
5000 | |
5001 | return this; |
5002 | } |
5003 | |
5004 | MachNode* andnL_rReg_rReg_rRegNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
5005 | Compile* C = Compile::current(); |
5006 | // Add projection edges for additional defs or kills |
5007 | // DEF/KILL cr |
5008 | MachProjNode *kill; |
5009 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
5010 | proj_list.push(kill); |
5011 | |
5012 | return this; |
5013 | } |
5014 | |
5015 | MachNode* andnL_rReg_rReg_rReg_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
5016 | Compile* C = Compile::current(); |
5017 | // Add projection edges for additional defs or kills |
5018 | // DEF/KILL cr |
5019 | MachProjNode *kill; |
5020 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
5021 | proj_list.push(kill); |
5022 | |
5023 | return this; |
5024 | } |
5025 | |
5026 | MachNode* blsiL_rReg_rRegNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
5027 | Compile* C = Compile::current(); |
5028 | // Add projection edges for additional defs or kills |
5029 | // DEF/KILL cr |
5030 | MachProjNode *kill; |
5031 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
5032 | proj_list.push(kill); |
5033 | // Remove duplicated operands and inputs which use the same name. |
5034 | if (num_opnds() == 4) { |
5035 | unsigned num0 = 0; |
5036 | unsigned num1 = opnd_array(1)->num_edges(); // imm_zero |
5037 | unsigned num2 = opnd_array(2)->num_edges(); // src |
5038 | unsigned num3 = opnd_array(3)->num_edges(); // src |
5039 | unsigned idx0 = oper_input_base(); |
5040 | unsigned idx1 = idx0 + num0; |
5041 | unsigned idx2 = idx1 + num1; |
5042 | unsigned idx3 = idx2 + num2; |
5043 | unsigned idx4 = idx3 + num3; |
5044 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
5045 | del_req(i); |
5046 | } |
5047 | _num_opnds = 3; |
5048 | } else { |
5049 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 5048, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
5050 | } |
5051 | |
5052 | return this; |
5053 | } |
5054 | |
5055 | MachNode* blsiL_rReg_rReg_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
5056 | Compile* C = Compile::current(); |
5057 | // Add projection edges for additional defs or kills |
5058 | // DEF/KILL cr |
5059 | MachProjNode *kill; |
5060 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
5061 | proj_list.push(kill); |
5062 | // Remove duplicated operands and inputs which use the same name. |
5063 | if (num_opnds() == 4) { |
5064 | unsigned num0 = 0; |
5065 | unsigned num1 = opnd_array(1)->num_edges(); // src |
5066 | unsigned num2 = opnd_array(2)->num_edges(); // imm_zero |
5067 | unsigned num3 = opnd_array(3)->num_edges(); // src |
5068 | unsigned idx0 = oper_input_base(); |
5069 | unsigned idx1 = idx0 + num0; |
5070 | unsigned idx2 = idx1 + num1; |
5071 | unsigned idx3 = idx2 + num2; |
5072 | unsigned idx4 = idx3 + num3; |
5073 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
5074 | del_req(i); |
5075 | } |
5076 | _num_opnds = 3; |
5077 | } else { |
5078 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 5077, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
5079 | } |
5080 | |
5081 | return this; |
5082 | } |
5083 | |
5084 | MachNode* blsiL_rReg_memNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
5085 | Compile* C = Compile::current(); |
5086 | // Add projection edges for additional defs or kills |
5087 | // DEF/KILL cr |
5088 | MachProjNode *kill; |
5089 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
5090 | proj_list.push(kill); |
5091 | // Remove duplicated operands and inputs which use the same name. |
5092 | if (num_opnds() == 4) { |
5093 | unsigned num0 = 0; |
5094 | unsigned num1 = opnd_array(1)->num_edges(); // imm_zero |
5095 | unsigned num2 = opnd_array(2)->num_edges(); // src |
5096 | unsigned num3 = opnd_array(3)->num_edges(); // src |
5097 | unsigned idx0 = oper_input_base(); |
5098 | unsigned idx1 = idx0 + num0; |
5099 | unsigned idx2 = idx1 + num1; |
5100 | unsigned idx3 = idx2 + num2; |
5101 | unsigned idx4 = idx3 + num3; |
5102 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
5103 | del_req(i); |
5104 | } |
5105 | _num_opnds = 3; |
5106 | } else { |
5107 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 5106, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
5108 | } |
5109 | |
5110 | return this; |
5111 | } |
5112 | |
5113 | MachNode* blsiL_rReg_mem_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
5114 | Compile* C = Compile::current(); |
5115 | // Add projection edges for additional defs or kills |
5116 | // DEF/KILL cr |
5117 | MachProjNode *kill; |
5118 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
5119 | proj_list.push(kill); |
5120 | // Remove duplicated operands and inputs which use the same name. |
5121 | if (num_opnds() == 4) { |
5122 | unsigned num0 = 0; |
5123 | unsigned num1 = opnd_array(1)->num_edges(); // src |
5124 | unsigned num2 = opnd_array(2)->num_edges(); // imm_zero |
5125 | unsigned num3 = opnd_array(3)->num_edges(); // src |
5126 | unsigned idx0 = oper_input_base(); |
5127 | unsigned idx1 = idx0 + num0; |
5128 | unsigned idx2 = idx1 + num1; |
5129 | unsigned idx3 = idx2 + num2; |
5130 | unsigned idx4 = idx3 + num3; |
5131 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
5132 | del_req(i); |
5133 | } |
5134 | _num_opnds = 3; |
5135 | } else { |
5136 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 5135, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
5137 | } |
5138 | |
5139 | return this; |
5140 | } |
5141 | |
5142 | MachNode* blsmskL_rReg_memNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
5143 | Compile* C = Compile::current(); |
5144 | // Add projection edges for additional defs or kills |
5145 | // DEF/KILL cr |
5146 | MachProjNode *kill; |
5147 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
5148 | proj_list.push(kill); |
5149 | // Remove duplicated operands and inputs which use the same name. |
5150 | if (num_opnds() == 4) { |
5151 | unsigned num0 = 0; |
5152 | unsigned num1 = opnd_array(1)->num_edges(); // src |
5153 | unsigned num2 = opnd_array(2)->num_edges(); // minus_1 |
5154 | unsigned num3 = opnd_array(3)->num_edges(); // src |
5155 | unsigned idx0 = oper_input_base(); |
5156 | unsigned idx1 = idx0 + num0; |
5157 | unsigned idx2 = idx1 + num1; |
5158 | unsigned idx3 = idx2 + num2; |
5159 | unsigned idx4 = idx3 + num3; |
5160 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
5161 | del_req(i); |
5162 | } |
5163 | _num_opnds = 3; |
5164 | } else { |
5165 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 5164, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
5166 | } |
5167 | |
5168 | return this; |
5169 | } |
5170 | |
5171 | MachNode* blsmskL_rReg_mem_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
5172 | Compile* C = Compile::current(); |
5173 | // Add projection edges for additional defs or kills |
5174 | // DEF/KILL cr |
5175 | MachProjNode *kill; |
5176 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
5177 | proj_list.push(kill); |
5178 | // Remove duplicated operands and inputs which use the same name. |
5179 | if (num_opnds() == 4) { |
5180 | unsigned num0 = 0; |
5181 | unsigned num1 = opnd_array(1)->num_edges(); // src |
5182 | unsigned num2 = opnd_array(2)->num_edges(); // src |
5183 | unsigned num3 = opnd_array(3)->num_edges(); // minus_1 |
5184 | unsigned idx0 = oper_input_base(); |
5185 | unsigned idx1 = idx0 + num0; |
5186 | unsigned idx2 = idx1 + num1; |
5187 | unsigned idx3 = idx2 + num2; |
5188 | unsigned idx4 = idx3 + num3; |
5189 | set_opnd_array(2, opnd_array(3)->clone()); // minus_1 |
5190 | for (unsigned i = 0; i < num3; i++) { |
5191 | set_req(i + idx2, _in[i + idx3]); |
5192 | } |
5193 | num2 = num3; |
5194 | idx3 = idx2 + num2; |
5195 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
5196 | del_req(i); |
5197 | } |
5198 | _num_opnds = 3; |
5199 | } else { |
5200 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 5199, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
5201 | } |
5202 | |
5203 | return this; |
5204 | } |
5205 | |
5206 | MachNode* blsmskL_rReg_rRegNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
5207 | Compile* C = Compile::current(); |
5208 | // Add projection edges for additional defs or kills |
5209 | // DEF/KILL cr |
5210 | MachProjNode *kill; |
5211 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
5212 | proj_list.push(kill); |
5213 | // Remove duplicated operands and inputs which use the same name. |
5214 | if (num_opnds() == 4) { |
5215 | unsigned num0 = 0; |
5216 | unsigned num1 = opnd_array(1)->num_edges(); // src |
5217 | unsigned num2 = opnd_array(2)->num_edges(); // minus_1 |
5218 | unsigned num3 = opnd_array(3)->num_edges(); // src |
5219 | unsigned idx0 = oper_input_base(); |
5220 | unsigned idx1 = idx0 + num0; |
5221 | unsigned idx2 = idx1 + num1; |
5222 | unsigned idx3 = idx2 + num2; |
5223 | unsigned idx4 = idx3 + num3; |
5224 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
5225 | del_req(i); |
5226 | } |
5227 | _num_opnds = 3; |
5228 | } else { |
5229 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 5228, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
5230 | } |
5231 | |
5232 | return this; |
5233 | } |
5234 | |
5235 | MachNode* blsmskL_rReg_rReg_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
5236 | Compile* C = Compile::current(); |
5237 | // Add projection edges for additional defs or kills |
5238 | // DEF/KILL cr |
5239 | MachProjNode *kill; |
5240 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
5241 | proj_list.push(kill); |
5242 | // Remove duplicated operands and inputs which use the same name. |
5243 | if (num_opnds() == 4) { |
5244 | unsigned num0 = 0; |
5245 | unsigned num1 = opnd_array(1)->num_edges(); // src |
5246 | unsigned num2 = opnd_array(2)->num_edges(); // src |
5247 | unsigned num3 = opnd_array(3)->num_edges(); // minus_1 |
5248 | unsigned idx0 = oper_input_base(); |
5249 | unsigned idx1 = idx0 + num0; |
5250 | unsigned idx2 = idx1 + num1; |
5251 | unsigned idx3 = idx2 + num2; |
5252 | unsigned idx4 = idx3 + num3; |
5253 | set_opnd_array(2, opnd_array(3)->clone()); // minus_1 |
5254 | for (unsigned i = 0; i < num3; i++) { |
5255 | set_req(i + idx2, _in[i + idx3]); |
5256 | } |
5257 | num2 = num3; |
5258 | idx3 = idx2 + num2; |
5259 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
5260 | del_req(i); |
5261 | } |
5262 | _num_opnds = 3; |
5263 | } else { |
5264 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 5263, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
5265 | } |
5266 | |
5267 | return this; |
5268 | } |
5269 | |
5270 | MachNode* blsrL_rReg_rRegNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
5271 | Compile* C = Compile::current(); |
5272 | // Add projection edges for additional defs or kills |
5273 | // DEF/KILL cr |
5274 | MachProjNode *kill; |
5275 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
5276 | proj_list.push(kill); |
5277 | // Remove duplicated operands and inputs which use the same name. |
5278 | if (num_opnds() == 4) { |
5279 | unsigned num0 = 0; |
5280 | unsigned num1 = opnd_array(1)->num_edges(); // src |
5281 | unsigned num2 = opnd_array(2)->num_edges(); // minus_1 |
5282 | unsigned num3 = opnd_array(3)->num_edges(); // src |
5283 | unsigned idx0 = oper_input_base(); |
5284 | unsigned idx1 = idx0 + num0; |
5285 | unsigned idx2 = idx1 + num1; |
5286 | unsigned idx3 = idx2 + num2; |
5287 | unsigned idx4 = idx3 + num3; |
5288 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
5289 | del_req(i); |
5290 | } |
5291 | _num_opnds = 3; |
5292 | } else { |
5293 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 5292, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
5294 | } |
5295 | |
5296 | return this; |
5297 | } |
5298 | |
5299 | MachNode* blsrL_rReg_rReg_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
5300 | Compile* C = Compile::current(); |
5301 | // Add projection edges for additional defs or kills |
5302 | // DEF/KILL cr |
5303 | MachProjNode *kill; |
5304 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
5305 | proj_list.push(kill); |
5306 | // Remove duplicated operands and inputs which use the same name. |
5307 | if (num_opnds() == 4) { |
5308 | unsigned num0 = 0; |
5309 | unsigned num1 = opnd_array(1)->num_edges(); // src |
5310 | unsigned num2 = opnd_array(2)->num_edges(); // src |
5311 | unsigned num3 = opnd_array(3)->num_edges(); // minus_1 |
5312 | unsigned idx0 = oper_input_base(); |
5313 | unsigned idx1 = idx0 + num0; |
5314 | unsigned idx2 = idx1 + num1; |
5315 | unsigned idx3 = idx2 + num2; |
5316 | unsigned idx4 = idx3 + num3; |
5317 | set_opnd_array(2, opnd_array(3)->clone()); // minus_1 |
5318 | for (unsigned i = 0; i < num3; i++) { |
5319 | set_req(i + idx2, _in[i + idx3]); |
5320 | } |
5321 | num2 = num3; |
5322 | idx3 = idx2 + num2; |
5323 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
5324 | del_req(i); |
5325 | } |
5326 | _num_opnds = 3; |
5327 | } else { |
5328 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 5327, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
5329 | } |
5330 | |
5331 | return this; |
5332 | } |
5333 | |
5334 | MachNode* blsrL_rReg_memNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
5335 | Compile* C = Compile::current(); |
5336 | // Add projection edges for additional defs or kills |
5337 | // DEF/KILL cr |
5338 | MachProjNode *kill; |
5339 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
5340 | proj_list.push(kill); |
5341 | // Remove duplicated operands and inputs which use the same name. |
5342 | if (num_opnds() == 4) { |
5343 | unsigned num0 = 0; |
5344 | unsigned num1 = opnd_array(1)->num_edges(); // src |
5345 | unsigned num2 = opnd_array(2)->num_edges(); // minus_1 |
5346 | unsigned num3 = opnd_array(3)->num_edges(); // src |
5347 | unsigned idx0 = oper_input_base(); |
5348 | unsigned idx1 = idx0 + num0; |
5349 | unsigned idx2 = idx1 + num1; |
5350 | unsigned idx3 = idx2 + num2; |
5351 | unsigned idx4 = idx3 + num3; |
5352 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
5353 | del_req(i); |
5354 | } |
5355 | _num_opnds = 3; |
5356 | } else { |
5357 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 5356, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
5358 | } |
5359 | |
5360 | return this; |
5361 | } |
5362 | |
5363 | MachNode* blsrL_rReg_mem_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
5364 | Compile* C = Compile::current(); |
5365 | // Add projection edges for additional defs or kills |
5366 | // DEF/KILL cr |
5367 | MachProjNode *kill; |
5368 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
5369 | proj_list.push(kill); |
5370 | // Remove duplicated operands and inputs which use the same name. |
5371 | if (num_opnds() == 4) { |
5372 | unsigned num0 = 0; |
5373 | unsigned num1 = opnd_array(1)->num_edges(); // src |
5374 | unsigned num2 = opnd_array(2)->num_edges(); // src |
5375 | unsigned num3 = opnd_array(3)->num_edges(); // minus_1 |
5376 | unsigned idx0 = oper_input_base(); |
5377 | unsigned idx1 = idx0 + num0; |
5378 | unsigned idx2 = idx1 + num1; |
5379 | unsigned idx3 = idx2 + num2; |
5380 | unsigned idx4 = idx3 + num3; |
5381 | set_opnd_array(2, opnd_array(3)->clone()); // minus_1 |
5382 | for (unsigned i = 0; i < num3; i++) { |
5383 | set_req(i + idx2, _in[i + idx3]); |
5384 | } |
5385 | num2 = num3; |
5386 | idx3 = idx2 + num2; |
5387 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
5388 | del_req(i); |
5389 | } |
5390 | _num_opnds = 3; |
5391 | } else { |
5392 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 5391, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
5393 | } |
5394 | |
5395 | return this; |
5396 | } |
5397 | |
5398 | MachNode* orL_rRegNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
5399 | Compile* C = Compile::current(); |
5400 | // Add projection edges for additional defs or kills |
5401 | // DEF/KILL cr |
5402 | MachProjNode *kill; |
5403 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
5404 | proj_list.push(kill); |
5405 | |
5406 | return this; |
5407 | } |
5408 | |
5409 | MachNode* orL_rReg_castP2XNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
5410 | Compile* C = Compile::current(); |
5411 | // Add projection edges for additional defs or kills |
5412 | // DEF/KILL cr |
5413 | MachProjNode *kill; |
5414 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
5415 | proj_list.push(kill); |
5416 | |
5417 | return this; |
5418 | } |
5419 | |
5420 | MachNode* orL_rReg_castP2X_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
5421 | Compile* C = Compile::current(); |
5422 | // Add projection edges for additional defs or kills |
5423 | // DEF/KILL cr |
5424 | MachProjNode *kill; |
5425 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
5426 | proj_list.push(kill); |
5427 | |
5428 | return this; |
5429 | } |
5430 | |
5431 | MachNode* orL_rReg_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
5432 | Compile* C = Compile::current(); |
5433 | // Add projection edges for additional defs or kills |
5434 | // DEF/KILL cr |
5435 | MachProjNode *kill; |
5436 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
5437 | proj_list.push(kill); |
5438 | |
5439 | return this; |
5440 | } |
5441 | |
5442 | MachNode* orL_rReg_memNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
5443 | Compile* C = Compile::current(); |
5444 | // Add projection edges for additional defs or kills |
5445 | // DEF/KILL cr |
5446 | MachProjNode *kill; |
5447 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
5448 | proj_list.push(kill); |
5449 | |
5450 | return this; |
5451 | } |
5452 | |
5453 | MachNode* orL_rReg_mem_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
5454 | Compile* C = Compile::current(); |
5455 | // Add projection edges for additional defs or kills |
5456 | // DEF/KILL cr |
5457 | MachProjNode *kill; |
5458 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
5459 | proj_list.push(kill); |
5460 | |
5461 | return this; |
5462 | } |
5463 | |
5464 | MachNode* orL_mem_rRegNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
5465 | Compile* C = Compile::current(); |
5466 | // Add projection edges for additional defs or kills |
5467 | // DEF/KILL cr |
5468 | MachProjNode *kill; |
5469 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
5470 | proj_list.push(kill); |
5471 | // Remove duplicated operands and inputs which use the same name. |
5472 | if (num_opnds() == 4) { |
5473 | unsigned num0 = 0; |
5474 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
5475 | unsigned num2 = opnd_array(2)->num_edges(); // dst |
5476 | unsigned num3 = opnd_array(3)->num_edges(); // src |
5477 | unsigned idx0 = oper_input_base(); |
5478 | unsigned idx1 = idx0 + num0; |
5479 | unsigned idx2 = idx1 + num1; |
5480 | unsigned idx3 = idx2 + num2; |
5481 | unsigned idx4 = idx3 + num3; |
5482 | set_opnd_array(2, opnd_array(3)->clone()); // src |
5483 | for (unsigned i = 0; i < num3; i++) { |
5484 | set_req(i + idx2, _in[i + idx3]); |
5485 | } |
5486 | num2 = num3; |
5487 | idx3 = idx2 + num2; |
5488 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
5489 | del_req(i); |
5490 | } |
5491 | _num_opnds = 3; |
5492 | } else { |
5493 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 5492, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
5494 | } |
5495 | |
5496 | return this; |
5497 | } |
5498 | |
5499 | MachNode* orL_mem_rReg_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
5500 | Compile* C = Compile::current(); |
5501 | // Add projection edges for additional defs or kills |
5502 | // DEF/KILL cr |
5503 | MachProjNode *kill; |
5504 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
5505 | proj_list.push(kill); |
5506 | // Remove duplicated operands and inputs which use the same name. |
5507 | if (num_opnds() == 4) { |
5508 | unsigned num0 = 0; |
5509 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
5510 | unsigned num2 = opnd_array(2)->num_edges(); // src |
5511 | unsigned num3 = opnd_array(3)->num_edges(); // dst |
5512 | unsigned idx0 = oper_input_base(); |
5513 | unsigned idx1 = idx0 + num0; |
5514 | unsigned idx2 = idx1 + num1; |
5515 | unsigned idx3 = idx2 + num2; |
5516 | unsigned idx4 = idx3 + num3; |
5517 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
5518 | del_req(i); |
5519 | } |
5520 | _num_opnds = 3; |
5521 | } else { |
5522 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 5521, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
5523 | } |
5524 | |
5525 | return this; |
5526 | } |
5527 | |
5528 | MachNode* orL_mem_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
5529 | Compile* C = Compile::current(); |
5530 | // Add projection edges for additional defs or kills |
5531 | // DEF/KILL cr |
5532 | MachProjNode *kill; |
5533 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
5534 | proj_list.push(kill); |
5535 | // Remove duplicated operands and inputs which use the same name. |
5536 | if (num_opnds() == 4) { |
5537 | unsigned num0 = 0; |
5538 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
5539 | unsigned num2 = opnd_array(2)->num_edges(); // dst |
5540 | unsigned num3 = opnd_array(3)->num_edges(); // src |
5541 | unsigned idx0 = oper_input_base(); |
5542 | unsigned idx1 = idx0 + num0; |
5543 | unsigned idx2 = idx1 + num1; |
5544 | unsigned idx3 = idx2 + num2; |
5545 | unsigned idx4 = idx3 + num3; |
5546 | set_opnd_array(2, opnd_array(3)->clone()); // src |
5547 | for (unsigned i = 0; i < num3; i++) { |
5548 | set_req(i + idx2, _in[i + idx3]); |
5549 | } |
5550 | num2 = num3; |
5551 | idx3 = idx2 + num2; |
5552 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
5553 | del_req(i); |
5554 | } |
5555 | _num_opnds = 3; |
5556 | } else { |
5557 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 5556, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
5558 | } |
5559 | |
5560 | return this; |
5561 | } |
5562 | |
5563 | MachNode* btsL_mem_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
5564 | Compile* C = Compile::current(); |
5565 | // Add projection edges for additional defs or kills |
5566 | // DEF/KILL cr |
5567 | MachProjNode *kill; |
5568 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
5569 | proj_list.push(kill); |
5570 | // Remove duplicated operands and inputs which use the same name. |
5571 | if (num_opnds() == 4) { |
5572 | unsigned num0 = 0; |
5573 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
5574 | unsigned num2 = opnd_array(2)->num_edges(); // dst |
5575 | unsigned num3 = opnd_array(3)->num_edges(); // con |
5576 | unsigned idx0 = oper_input_base(); |
5577 | unsigned idx1 = idx0 + num0; |
5578 | unsigned idx2 = idx1 + num1; |
5579 | unsigned idx3 = idx2 + num2; |
5580 | unsigned idx4 = idx3 + num3; |
5581 | set_opnd_array(2, opnd_array(3)->clone()); // con |
5582 | for (unsigned i = 0; i < num3; i++) { |
5583 | set_req(i + idx2, _in[i + idx3]); |
5584 | } |
5585 | num2 = num3; |
5586 | idx3 = idx2 + num2; |
5587 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
5588 | del_req(i); |
5589 | } |
5590 | _num_opnds = 3; |
5591 | } else { |
5592 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 5591, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
5593 | } |
5594 | |
5595 | return this; |
5596 | } |
5597 | |
5598 | MachNode* xorL_rRegNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
5599 | Compile* C = Compile::current(); |
5600 | // Add projection edges for additional defs or kills |
5601 | // DEF/KILL cr |
5602 | MachProjNode *kill; |
5603 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
5604 | proj_list.push(kill); |
5605 | |
5606 | return this; |
5607 | } |
5608 | |
5609 | MachNode* xorL_rReg_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
5610 | Compile* C = Compile::current(); |
5611 | // Add projection edges for additional defs or kills |
5612 | // DEF/KILL cr |
5613 | MachProjNode *kill; |
5614 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
5615 | proj_list.push(kill); |
5616 | |
5617 | return this; |
5618 | } |
5619 | |
5620 | MachNode* xorL_rReg_memNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
5621 | Compile* C = Compile::current(); |
5622 | // Add projection edges for additional defs or kills |
5623 | // DEF/KILL cr |
5624 | MachProjNode *kill; |
5625 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
5626 | proj_list.push(kill); |
5627 | |
5628 | return this; |
5629 | } |
5630 | |
5631 | MachNode* xorL_rReg_mem_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
5632 | Compile* C = Compile::current(); |
5633 | // Add projection edges for additional defs or kills |
5634 | // DEF/KILL cr |
5635 | MachProjNode *kill; |
5636 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
5637 | proj_list.push(kill); |
5638 | |
5639 | return this; |
5640 | } |
5641 | |
5642 | MachNode* xorL_mem_rRegNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
5643 | Compile* C = Compile::current(); |
5644 | // Add projection edges for additional defs or kills |
5645 | // DEF/KILL cr |
5646 | MachProjNode *kill; |
5647 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
5648 | proj_list.push(kill); |
5649 | // Remove duplicated operands and inputs which use the same name. |
5650 | if (num_opnds() == 4) { |
5651 | unsigned num0 = 0; |
5652 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
5653 | unsigned num2 = opnd_array(2)->num_edges(); // dst |
5654 | unsigned num3 = opnd_array(3)->num_edges(); // src |
5655 | unsigned idx0 = oper_input_base(); |
5656 | unsigned idx1 = idx0 + num0; |
5657 | unsigned idx2 = idx1 + num1; |
5658 | unsigned idx3 = idx2 + num2; |
5659 | unsigned idx4 = idx3 + num3; |
5660 | set_opnd_array(2, opnd_array(3)->clone()); // src |
5661 | for (unsigned i = 0; i < num3; i++) { |
5662 | set_req(i + idx2, _in[i + idx3]); |
5663 | } |
5664 | num2 = num3; |
5665 | idx3 = idx2 + num2; |
5666 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
5667 | del_req(i); |
5668 | } |
5669 | _num_opnds = 3; |
5670 | } else { |
5671 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 5670, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
5672 | } |
5673 | |
5674 | return this; |
5675 | } |
5676 | |
5677 | MachNode* xorL_mem_rReg_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
5678 | Compile* C = Compile::current(); |
5679 | // Add projection edges for additional defs or kills |
5680 | // DEF/KILL cr |
5681 | MachProjNode *kill; |
5682 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
5683 | proj_list.push(kill); |
5684 | // Remove duplicated operands and inputs which use the same name. |
5685 | if (num_opnds() == 4) { |
5686 | unsigned num0 = 0; |
5687 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
5688 | unsigned num2 = opnd_array(2)->num_edges(); // src |
5689 | unsigned num3 = opnd_array(3)->num_edges(); // dst |
5690 | unsigned idx0 = oper_input_base(); |
5691 | unsigned idx1 = idx0 + num0; |
5692 | unsigned idx2 = idx1 + num1; |
5693 | unsigned idx3 = idx2 + num2; |
5694 | unsigned idx4 = idx3 + num3; |
5695 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
5696 | del_req(i); |
5697 | } |
5698 | _num_opnds = 3; |
5699 | } else { |
5700 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 5699, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
5701 | } |
5702 | |
5703 | return this; |
5704 | } |
5705 | |
5706 | MachNode* xorL_mem_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
5707 | Compile* C = Compile::current(); |
5708 | // Add projection edges for additional defs or kills |
5709 | // DEF/KILL cr |
5710 | MachProjNode *kill; |
5711 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
5712 | proj_list.push(kill); |
5713 | // Remove duplicated operands and inputs which use the same name. |
5714 | if (num_opnds() == 4) { |
5715 | unsigned num0 = 0; |
5716 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
5717 | unsigned num2 = opnd_array(2)->num_edges(); // dst |
5718 | unsigned num3 = opnd_array(3)->num_edges(); // src |
5719 | unsigned idx0 = oper_input_base(); |
5720 | unsigned idx1 = idx0 + num0; |
5721 | unsigned idx2 = idx1 + num1; |
5722 | unsigned idx3 = idx2 + num2; |
5723 | unsigned idx4 = idx3 + num3; |
5724 | set_opnd_array(2, opnd_array(3)->clone()); // src |
5725 | for (unsigned i = 0; i < num3; i++) { |
5726 | set_req(i + idx2, _in[i + idx3]); |
5727 | } |
5728 | num2 = num3; |
5729 | idx3 = idx2 + num2; |
5730 | for (int i = idx4 - 1; i >= (int)idx3; i--) { |
5731 | del_req(i); |
5732 | } |
5733 | _num_opnds = 3; |
5734 | } else { |
5735 | assert(_num_opnds == 3, "There should be either 3 or 4 operands.")do { if (!(_num_opnds == 3)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 5734, "assert(" "_num_opnds == 3" ") failed" , "There should be either 3 or 4 operands."); ::breakpoint(); } } while (0); |
5736 | } |
5737 | |
5738 | return this; |
5739 | } |
5740 | |
5741 | MachNode* convI2BNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
5742 | Compile* C = Compile::current(); |
5743 | // Add projection edges for additional defs or kills |
5744 | // DEF/KILL cr |
5745 | MachProjNode *kill; |
5746 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
5747 | proj_list.push(kill); |
5748 | |
5749 | return this; |
5750 | } |
5751 | |
5752 | MachNode* convP2BNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
5753 | Compile* C = Compile::current(); |
5754 | // Add projection edges for additional defs or kills |
5755 | // DEF/KILL cr |
5756 | MachProjNode *kill; |
5757 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
5758 | proj_list.push(kill); |
5759 | |
5760 | return this; |
5761 | } |
5762 | |
5763 | MachNode* cmpLTMaskNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
5764 | Compile* C = Compile::current(); |
5765 | // Add projection edges for additional defs or kills |
5766 | // DEF/KILL cr |
5767 | MachProjNode *kill; |
5768 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
5769 | proj_list.push(kill); |
5770 | |
5771 | return this; |
5772 | } |
5773 | |
5774 | MachNode* cmpLTMask0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
5775 | Compile* C = Compile::current(); |
5776 | // Add projection edges for additional defs or kills |
5777 | // DEF/KILL cr |
5778 | MachProjNode *kill; |
5779 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
5780 | proj_list.push(kill); |
5781 | |
5782 | return this; |
5783 | } |
5784 | |
5785 | MachNode* cadd_cmpLTMaskNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
5786 | Compile* C = Compile::current(); |
5787 | // Add projection edges for additional defs or kills |
5788 | // DEF/KILL cr |
5789 | MachProjNode *kill; |
5790 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
5791 | proj_list.push(kill); |
5792 | // Remove duplicated operands and inputs which use the same name. |
5793 | if (num_opnds() == 6) { |
5794 | unsigned num0 = 0; |
5795 | unsigned num1 = opnd_array(1)->num_edges(); // p |
5796 | unsigned num2 = opnd_array(2)->num_edges(); // q |
5797 | unsigned num3 = opnd_array(3)->num_edges(); // y |
5798 | unsigned num4 = opnd_array(4)->num_edges(); // p |
5799 | unsigned num5 = opnd_array(5)->num_edges(); // q |
5800 | unsigned idx0 = oper_input_base(); |
5801 | unsigned idx1 = idx0 + num0; |
5802 | unsigned idx2 = idx1 + num1; |
5803 | unsigned idx3 = idx2 + num2; |
5804 | unsigned idx4 = idx3 + num3; |
5805 | unsigned idx5 = idx4 + num4; |
5806 | unsigned idx6 = idx5 + num5; |
5807 | for (int i = idx6 - 1; i >= (int)idx4; i--) { |
5808 | del_req(i); |
5809 | } |
5810 | _num_opnds = 4; |
5811 | } else { |
5812 | assert(_num_opnds == 4, "There should be either 4 or 6 operands.")do { if (!(_num_opnds == 4)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 5811, "assert(" "_num_opnds == 4" ") failed" , "There should be either 4 or 6 operands."); ::breakpoint(); } } while (0); |
5813 | } |
5814 | |
5815 | return this; |
5816 | } |
5817 | |
5818 | MachNode* cadd_cmpLTMask_1Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
5819 | Compile* C = Compile::current(); |
5820 | // Add projection edges for additional defs or kills |
5821 | // DEF/KILL cr |
5822 | MachProjNode *kill; |
5823 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
5824 | proj_list.push(kill); |
5825 | // Remove duplicated operands and inputs which use the same name. |
5826 | if (num_opnds() == 6) { |
5827 | unsigned num0 = 0; |
5828 | unsigned num1 = opnd_array(1)->num_edges(); // p |
5829 | unsigned num2 = opnd_array(2)->num_edges(); // q |
5830 | unsigned num3 = opnd_array(3)->num_edges(); // p |
5831 | unsigned num4 = opnd_array(4)->num_edges(); // q |
5832 | unsigned num5 = opnd_array(5)->num_edges(); // y |
5833 | unsigned idx0 = oper_input_base(); |
5834 | unsigned idx1 = idx0 + num0; |
5835 | unsigned idx2 = idx1 + num1; |
5836 | unsigned idx3 = idx2 + num2; |
5837 | unsigned idx4 = idx3 + num3; |
5838 | unsigned idx5 = idx4 + num4; |
5839 | unsigned idx6 = idx5 + num5; |
5840 | set_opnd_array(3, opnd_array(5)->clone()); // y |
5841 | for (unsigned i = 0; i < num5; i++) { |
5842 | set_req(i + idx3, _in[i + idx5]); |
5843 | } |
5844 | num3 = num5; |
5845 | idx4 = idx3 + num3; |
5846 | for (int i = idx6 - 1; i >= (int)idx4; i--) { |
5847 | del_req(i); |
5848 | } |
5849 | _num_opnds = 4; |
5850 | } else { |
5851 | assert(_num_opnds == 4, "There should be either 4 or 6 operands.")do { if (!(_num_opnds == 4)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 5850, "assert(" "_num_opnds == 4" ") failed" , "There should be either 4 or 6 operands."); ::breakpoint(); } } while (0); |
5852 | } |
5853 | |
5854 | return this; |
5855 | } |
5856 | |
5857 | MachNode* cadd_cmpLTMask_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
5858 | Compile* C = Compile::current(); |
5859 | // Add projection edges for additional defs or kills |
5860 | // DEF/KILL cr |
5861 | MachProjNode *kill; |
5862 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
5863 | proj_list.push(kill); |
5864 | // Remove duplicated operands and inputs which use the same name. |
5865 | if (num_opnds() == 6) { |
5866 | unsigned num0 = 0; |
5867 | unsigned num1 = opnd_array(1)->num_edges(); // y |
5868 | unsigned num2 = opnd_array(2)->num_edges(); // p |
5869 | unsigned num3 = opnd_array(3)->num_edges(); // q |
5870 | unsigned num4 = opnd_array(4)->num_edges(); // p |
5871 | unsigned num5 = opnd_array(5)->num_edges(); // q |
5872 | unsigned idx0 = oper_input_base(); |
5873 | unsigned idx1 = idx0 + num0; |
5874 | unsigned idx2 = idx1 + num1; |
5875 | unsigned idx3 = idx2 + num2; |
5876 | unsigned idx4 = idx3 + num3; |
5877 | unsigned idx5 = idx4 + num4; |
5878 | unsigned idx6 = idx5 + num5; |
5879 | for (int i = idx6 - 1; i >= (int)idx4; i--) { |
5880 | del_req(i); |
5881 | } |
5882 | _num_opnds = 4; |
5883 | } else { |
5884 | assert(_num_opnds == 4, "There should be either 4 or 6 operands.")do { if (!(_num_opnds == 4)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 5883, "assert(" "_num_opnds == 4" ") failed" , "There should be either 4 or 6 operands."); ::breakpoint(); } } while (0); |
5885 | } |
5886 | |
5887 | return this; |
5888 | } |
5889 | |
5890 | MachNode* cadd_cmpLTMask_2Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
5891 | Compile* C = Compile::current(); |
5892 | // Add projection edges for additional defs or kills |
5893 | // DEF/KILL cr |
5894 | MachProjNode *kill; |
5895 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
5896 | proj_list.push(kill); |
5897 | // Remove duplicated operands and inputs which use the same name. |
5898 | if (num_opnds() == 6) { |
5899 | unsigned num0 = 0; |
5900 | unsigned num1 = opnd_array(1)->num_edges(); // p |
5901 | unsigned num2 = opnd_array(2)->num_edges(); // q |
5902 | unsigned num3 = opnd_array(3)->num_edges(); // y |
5903 | unsigned num4 = opnd_array(4)->num_edges(); // p |
5904 | unsigned num5 = opnd_array(5)->num_edges(); // q |
5905 | unsigned idx0 = oper_input_base(); |
5906 | unsigned idx1 = idx0 + num0; |
5907 | unsigned idx2 = idx1 + num1; |
5908 | unsigned idx3 = idx2 + num2; |
5909 | unsigned idx4 = idx3 + num3; |
5910 | unsigned idx5 = idx4 + num4; |
5911 | unsigned idx6 = idx5 + num5; |
5912 | for (int i = idx6 - 1; i >= (int)idx4; i--) { |
5913 | del_req(i); |
5914 | } |
5915 | _num_opnds = 4; |
5916 | } else { |
5917 | assert(_num_opnds == 4, "There should be either 4 or 6 operands.")do { if (!(_num_opnds == 4)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 5916, "assert(" "_num_opnds == 4" ") failed" , "There should be either 4 or 6 operands."); ::breakpoint(); } } while (0); |
5918 | } |
5919 | |
5920 | return this; |
5921 | } |
5922 | |
5923 | MachNode* and_cmpLTMaskNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
5924 | Compile* C = Compile::current(); |
5925 | // Add projection edges for additional defs or kills |
5926 | // DEF/KILL cr |
5927 | MachProjNode *kill; |
5928 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
5929 | proj_list.push(kill); |
5930 | |
5931 | return this; |
5932 | } |
5933 | |
5934 | MachNode* and_cmpLTMask_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
5935 | Compile* C = Compile::current(); |
5936 | // Add projection edges for additional defs or kills |
5937 | // DEF/KILL cr |
5938 | MachProjNode *kill; |
5939 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
5940 | proj_list.push(kill); |
5941 | |
5942 | return this; |
5943 | } |
5944 | |
5945 | MachNode* cmpF_cc_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
5946 | Compile* C = Compile::current(); |
5947 | add_req(C->mach_constant_base_node()); |
5948 | |
5949 | return this; |
5950 | } |
5951 | |
5952 | MachNode* cmpF_cc_immCFNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
5953 | Compile* C = Compile::current(); |
5954 | add_req(C->mach_constant_base_node()); |
5955 | |
5956 | return this; |
5957 | } |
5958 | |
5959 | MachNode* cmpD_cc_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
5960 | Compile* C = Compile::current(); |
5961 | add_req(C->mach_constant_base_node()); |
5962 | |
5963 | return this; |
5964 | } |
5965 | |
5966 | MachNode* cmpD_cc_immCFNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
5967 | Compile* C = Compile::current(); |
5968 | add_req(C->mach_constant_base_node()); |
5969 | |
5970 | return this; |
5971 | } |
5972 | |
5973 | MachNode* cmpF_regNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
5974 | Compile* C = Compile::current(); |
5975 | // Add projection edges for additional defs or kills |
5976 | // DEF/KILL cr |
5977 | MachProjNode *kill; |
5978 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
5979 | proj_list.push(kill); |
5980 | |
5981 | return this; |
5982 | } |
5983 | |
5984 | MachNode* cmpF_memNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
5985 | Compile* C = Compile::current(); |
5986 | // Add projection edges for additional defs or kills |
5987 | // DEF/KILL cr |
5988 | MachProjNode *kill; |
5989 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
5990 | proj_list.push(kill); |
5991 | |
5992 | return this; |
5993 | } |
5994 | |
5995 | MachNode* cmpF_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
5996 | Compile* C = Compile::current(); |
5997 | // Add projection edges for additional defs or kills |
5998 | // DEF/KILL cr |
5999 | MachProjNode *kill; |
6000 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
6001 | proj_list.push(kill); |
6002 | add_req(C->mach_constant_base_node()); |
6003 | |
6004 | return this; |
6005 | } |
6006 | |
6007 | MachNode* cmpD_regNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
6008 | Compile* C = Compile::current(); |
6009 | // Add projection edges for additional defs or kills |
6010 | // DEF/KILL cr |
6011 | MachProjNode *kill; |
6012 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
6013 | proj_list.push(kill); |
6014 | |
6015 | return this; |
6016 | } |
6017 | |
6018 | MachNode* cmpD_memNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
6019 | Compile* C = Compile::current(); |
6020 | // Add projection edges for additional defs or kills |
6021 | // DEF/KILL cr |
6022 | MachProjNode *kill; |
6023 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
6024 | proj_list.push(kill); |
6025 | |
6026 | return this; |
6027 | } |
6028 | |
6029 | MachNode* cmpD_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
6030 | Compile* C = Compile::current(); |
6031 | // Add projection edges for additional defs or kills |
6032 | // DEF/KILL cr |
6033 | MachProjNode *kill; |
6034 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
6035 | proj_list.push(kill); |
6036 | add_req(C->mach_constant_base_node()); |
6037 | |
6038 | return this; |
6039 | } |
6040 | |
6041 | MachNode* convF2I_reg_regNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
6042 | Compile* C = Compile::current(); |
6043 | // Add projection edges for additional defs or kills |
6044 | // DEF/KILL cr |
6045 | MachProjNode *kill; |
6046 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
6047 | proj_list.push(kill); |
6048 | |
6049 | return this; |
6050 | } |
6051 | |
6052 | MachNode* convF2L_reg_regNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
6053 | Compile* C = Compile::current(); |
6054 | // Add projection edges for additional defs or kills |
6055 | // DEF/KILL cr |
6056 | MachProjNode *kill; |
6057 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
6058 | proj_list.push(kill); |
6059 | |
6060 | return this; |
6061 | } |
6062 | |
6063 | MachNode* convD2I_reg_regNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
6064 | Compile* C = Compile::current(); |
6065 | // Add projection edges for additional defs or kills |
6066 | // DEF/KILL cr |
6067 | MachProjNode *kill; |
6068 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
6069 | proj_list.push(kill); |
6070 | |
6071 | return this; |
6072 | } |
6073 | |
6074 | MachNode* convD2L_reg_regNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
6075 | Compile* C = Compile::current(); |
6076 | // Add projection edges for additional defs or kills |
6077 | // DEF/KILL cr |
6078 | MachProjNode *kill; |
6079 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
6080 | proj_list.push(kill); |
6081 | |
6082 | return this; |
6083 | } |
6084 | |
6085 | MachNode* rep_stosNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
6086 | Compile* C = Compile::current(); |
6087 | // Add projection edges for additional defs or kills |
6088 | // DEF/KILL cnt |
6089 | MachProjNode *kill; |
6090 | kill = new MachProjNode( this, 1, (LONG_RCX_REG_mask()), Op_RegL ); |
6091 | proj_list.push(kill); |
6092 | // DEF/KILL base |
6093 | kill = new MachProjNode( this, 2, (PTR_RDI_REG_mask()), Op_RegP ); |
6094 | proj_list.push(kill); |
6095 | // TEMP tmp |
6096 | MachTempNode *def; |
6097 | def = new MachTempNode(state->MachOperGenerator(REGD)); |
6098 | add_req(def); |
6099 | // DEF/KILL zero |
6100 | kill = new MachProjNode( this, 3, (INT_RAX_REG_mask()), Op_RegI ); |
6101 | proj_list.push(kill); |
6102 | // DEF/KILL cr |
6103 | kill = new MachProjNode( this, 4, (INT_FLAGS_mask()), Op_RegFlags ); |
6104 | proj_list.push(kill); |
6105 | |
6106 | return this; |
6107 | } |
6108 | |
6109 | MachNode* rep_stos_evexNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
6110 | Compile* C = Compile::current(); |
6111 | // Add projection edges for additional defs or kills |
6112 | // DEF/KILL cnt |
6113 | MachProjNode *kill; |
6114 | kill = new MachProjNode( this, 1, (LONG_RCX_REG_mask()), Op_RegL ); |
6115 | proj_list.push(kill); |
6116 | // DEF/KILL base |
6117 | kill = new MachProjNode( this, 2, (PTR_RDI_REG_mask()), Op_RegP ); |
6118 | proj_list.push(kill); |
6119 | // TEMP tmp |
6120 | MachTempNode *def; |
6121 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
6122 | add_req(def); |
6123 | // TEMP ktmp |
6124 | def = new MachTempNode(state->MachOperGenerator(KREG)); |
6125 | add_req(def); |
6126 | // DEF/KILL zero |
6127 | kill = new MachProjNode( this, 3, (INT_RAX_REG_mask()), Op_RegI ); |
6128 | proj_list.push(kill); |
6129 | // DEF/KILL cr |
6130 | kill = new MachProjNode( this, 4, (INT_FLAGS_mask()), Op_RegFlags ); |
6131 | proj_list.push(kill); |
6132 | |
6133 | return this; |
6134 | } |
6135 | |
6136 | MachNode* rep_stos_largeNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
6137 | Compile* C = Compile::current(); |
6138 | // Add projection edges for additional defs or kills |
6139 | // DEF/KILL cnt |
6140 | MachProjNode *kill; |
6141 | kill = new MachProjNode( this, 1, (LONG_RCX_REG_mask()), Op_RegL ); |
6142 | proj_list.push(kill); |
6143 | // DEF/KILL base |
6144 | kill = new MachProjNode( this, 2, (PTR_RDI_REG_mask()), Op_RegP ); |
6145 | proj_list.push(kill); |
6146 | // TEMP tmp |
6147 | MachTempNode *def; |
6148 | def = new MachTempNode(state->MachOperGenerator(REGD)); |
6149 | add_req(def); |
6150 | // DEF/KILL zero |
6151 | kill = new MachProjNode( this, 3, (INT_RAX_REG_mask()), Op_RegI ); |
6152 | proj_list.push(kill); |
6153 | // DEF/KILL cr |
6154 | kill = new MachProjNode( this, 4, (INT_FLAGS_mask()), Op_RegFlags ); |
6155 | proj_list.push(kill); |
6156 | |
6157 | return this; |
6158 | } |
6159 | |
6160 | MachNode* rep_stos_large_evexNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
6161 | Compile* C = Compile::current(); |
6162 | // Add projection edges for additional defs or kills |
6163 | // DEF/KILL cnt |
6164 | MachProjNode *kill; |
6165 | kill = new MachProjNode( this, 1, (LONG_RCX_REG_mask()), Op_RegL ); |
6166 | proj_list.push(kill); |
6167 | // DEF/KILL base |
6168 | kill = new MachProjNode( this, 2, (PTR_RDI_REG_mask()), Op_RegP ); |
6169 | proj_list.push(kill); |
6170 | // TEMP tmp |
6171 | MachTempNode *def; |
6172 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
6173 | add_req(def); |
6174 | // TEMP ktmp |
6175 | def = new MachTempNode(state->MachOperGenerator(KREG)); |
6176 | add_req(def); |
6177 | // DEF/KILL zero |
6178 | kill = new MachProjNode( this, 3, (INT_RAX_REG_mask()), Op_RegI ); |
6179 | proj_list.push(kill); |
6180 | // DEF/KILL cr |
6181 | kill = new MachProjNode( this, 4, (INT_FLAGS_mask()), Op_RegFlags ); |
6182 | proj_list.push(kill); |
6183 | |
6184 | return this; |
6185 | } |
6186 | |
6187 | MachNode* rep_stos_imNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
6188 | Compile* C = Compile::current(); |
6189 | // Add projection edges for additional defs or kills |
6190 | // TEMP tmp |
6191 | MachTempNode *def; |
6192 | def = new MachTempNode(state->MachOperGenerator(REGD)); |
6193 | add_req(def); |
6194 | // TEMP zero |
6195 | def = new MachTempNode(state->MachOperGenerator(RREGI)); |
6196 | add_req(def); |
6197 | // TEMP ktmp |
6198 | def = new MachTempNode(state->MachOperGenerator(KREG)); |
6199 | add_req(def); |
6200 | // DEF/KILL cr |
6201 | MachProjNode *kill; |
6202 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
6203 | proj_list.push(kill); |
6204 | |
6205 | return this; |
6206 | } |
6207 | |
6208 | MachNode* string_compareLNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
6209 | Compile* C = Compile::current(); |
6210 | // Add projection edges for additional defs or kills |
6211 | // DEF/KILL str1 |
6212 | MachProjNode *kill; |
6213 | kill = new MachProjNode( this, 1, (PTR_RDI_REG_mask()), Op_RegP ); |
6214 | proj_list.push(kill); |
6215 | // DEF/KILL cnt1 |
6216 | kill = new MachProjNode( this, 2, (INT_RCX_REG_mask()), Op_RegI ); |
6217 | proj_list.push(kill); |
6218 | // DEF/KILL str2 |
6219 | kill = new MachProjNode( this, 3, (PTR_RSI_REG_mask()), Op_RegP ); |
6220 | proj_list.push(kill); |
6221 | // DEF/KILL cnt2 |
6222 | kill = new MachProjNode( this, 4, (INT_RDX_REG_mask()), Op_RegI ); |
6223 | proj_list.push(kill); |
6224 | // TEMP tmp1 |
6225 | MachTempNode *def; |
6226 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
6227 | add_req(def); |
6228 | // DEF/KILL cr |
6229 | kill = new MachProjNode( this, 5, (INT_FLAGS_mask()), Op_RegFlags ); |
6230 | proj_list.push(kill); |
6231 | |
6232 | return this; |
6233 | } |
6234 | |
6235 | MachNode* string_compareL_evexNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
6236 | Compile* C = Compile::current(); |
6237 | // Add projection edges for additional defs or kills |
6238 | // DEF/KILL str1 |
6239 | MachProjNode *kill; |
6240 | kill = new MachProjNode( this, 1, (PTR_RDI_REG_mask()), Op_RegP ); |
6241 | proj_list.push(kill); |
6242 | // DEF/KILL cnt1 |
6243 | kill = new MachProjNode( this, 2, (INT_RCX_REG_mask()), Op_RegI ); |
6244 | proj_list.push(kill); |
6245 | // DEF/KILL str2 |
6246 | kill = new MachProjNode( this, 3, (PTR_RSI_REG_mask()), Op_RegP ); |
6247 | proj_list.push(kill); |
6248 | // DEF/KILL cnt2 |
6249 | kill = new MachProjNode( this, 4, (INT_RDX_REG_mask()), Op_RegI ); |
6250 | proj_list.push(kill); |
6251 | // TEMP tmp1 |
6252 | MachTempNode *def; |
6253 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
6254 | add_req(def); |
6255 | // TEMP ktmp |
6256 | def = new MachTempNode(state->MachOperGenerator(KREG)); |
6257 | add_req(def); |
6258 | // DEF/KILL cr |
6259 | kill = new MachProjNode( this, 5, (INT_FLAGS_mask()), Op_RegFlags ); |
6260 | proj_list.push(kill); |
6261 | |
6262 | return this; |
6263 | } |
6264 | |
6265 | MachNode* string_compareUNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
6266 | Compile* C = Compile::current(); |
6267 | // Add projection edges for additional defs or kills |
6268 | // DEF/KILL str1 |
6269 | MachProjNode *kill; |
6270 | kill = new MachProjNode( this, 1, (PTR_RDI_REG_mask()), Op_RegP ); |
6271 | proj_list.push(kill); |
6272 | // DEF/KILL cnt1 |
6273 | kill = new MachProjNode( this, 2, (INT_RCX_REG_mask()), Op_RegI ); |
6274 | proj_list.push(kill); |
6275 | // DEF/KILL str2 |
6276 | kill = new MachProjNode( this, 3, (PTR_RSI_REG_mask()), Op_RegP ); |
6277 | proj_list.push(kill); |
6278 | // DEF/KILL cnt2 |
6279 | kill = new MachProjNode( this, 4, (INT_RDX_REG_mask()), Op_RegI ); |
6280 | proj_list.push(kill); |
6281 | // TEMP tmp1 |
6282 | MachTempNode *def; |
6283 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
6284 | add_req(def); |
6285 | // DEF/KILL cr |
6286 | kill = new MachProjNode( this, 5, (INT_FLAGS_mask()), Op_RegFlags ); |
6287 | proj_list.push(kill); |
6288 | |
6289 | return this; |
6290 | } |
6291 | |
6292 | MachNode* string_compareU_evexNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
6293 | Compile* C = Compile::current(); |
6294 | // Add projection edges for additional defs or kills |
6295 | // DEF/KILL str1 |
6296 | MachProjNode *kill; |
6297 | kill = new MachProjNode( this, 1, (PTR_RDI_REG_mask()), Op_RegP ); |
6298 | proj_list.push(kill); |
6299 | // DEF/KILL cnt1 |
6300 | kill = new MachProjNode( this, 2, (INT_RCX_REG_mask()), Op_RegI ); |
6301 | proj_list.push(kill); |
6302 | // DEF/KILL str2 |
6303 | kill = new MachProjNode( this, 3, (PTR_RSI_REG_mask()), Op_RegP ); |
6304 | proj_list.push(kill); |
6305 | // DEF/KILL cnt2 |
6306 | kill = new MachProjNode( this, 4, (INT_RDX_REG_mask()), Op_RegI ); |
6307 | proj_list.push(kill); |
6308 | // TEMP tmp1 |
6309 | MachTempNode *def; |
6310 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
6311 | add_req(def); |
6312 | // TEMP ktmp |
6313 | def = new MachTempNode(state->MachOperGenerator(KREG)); |
6314 | add_req(def); |
6315 | // DEF/KILL cr |
6316 | kill = new MachProjNode( this, 5, (INT_FLAGS_mask()), Op_RegFlags ); |
6317 | proj_list.push(kill); |
6318 | |
6319 | return this; |
6320 | } |
6321 | |
6322 | MachNode* string_compareLUNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
6323 | Compile* C = Compile::current(); |
6324 | // Add projection edges for additional defs or kills |
6325 | // DEF/KILL str1 |
6326 | MachProjNode *kill; |
6327 | kill = new MachProjNode( this, 1, (PTR_RDI_REG_mask()), Op_RegP ); |
6328 | proj_list.push(kill); |
6329 | // DEF/KILL cnt1 |
6330 | kill = new MachProjNode( this, 2, (INT_RCX_REG_mask()), Op_RegI ); |
6331 | proj_list.push(kill); |
6332 | // DEF/KILL str2 |
6333 | kill = new MachProjNode( this, 3, (PTR_RSI_REG_mask()), Op_RegP ); |
6334 | proj_list.push(kill); |
6335 | // DEF/KILL cnt2 |
6336 | kill = new MachProjNode( this, 4, (INT_RDX_REG_mask()), Op_RegI ); |
6337 | proj_list.push(kill); |
6338 | // TEMP tmp1 |
6339 | MachTempNode *def; |
6340 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
6341 | add_req(def); |
6342 | // DEF/KILL cr |
6343 | kill = new MachProjNode( this, 5, (INT_FLAGS_mask()), Op_RegFlags ); |
6344 | proj_list.push(kill); |
6345 | |
6346 | return this; |
6347 | } |
6348 | |
6349 | MachNode* string_compareLU_evexNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
6350 | Compile* C = Compile::current(); |
6351 | // Add projection edges for additional defs or kills |
6352 | // DEF/KILL str1 |
6353 | MachProjNode *kill; |
6354 | kill = new MachProjNode( this, 1, (PTR_RDI_REG_mask()), Op_RegP ); |
6355 | proj_list.push(kill); |
6356 | // DEF/KILL cnt1 |
6357 | kill = new MachProjNode( this, 2, (INT_RCX_REG_mask()), Op_RegI ); |
6358 | proj_list.push(kill); |
6359 | // DEF/KILL str2 |
6360 | kill = new MachProjNode( this, 3, (PTR_RSI_REG_mask()), Op_RegP ); |
6361 | proj_list.push(kill); |
6362 | // DEF/KILL cnt2 |
6363 | kill = new MachProjNode( this, 4, (INT_RDX_REG_mask()), Op_RegI ); |
6364 | proj_list.push(kill); |
6365 | // TEMP tmp1 |
6366 | MachTempNode *def; |
6367 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
6368 | add_req(def); |
6369 | // TEMP ktmp |
6370 | def = new MachTempNode(state->MachOperGenerator(KREG)); |
6371 | add_req(def); |
6372 | // DEF/KILL cr |
6373 | kill = new MachProjNode( this, 5, (INT_FLAGS_mask()), Op_RegFlags ); |
6374 | proj_list.push(kill); |
6375 | |
6376 | return this; |
6377 | } |
6378 | |
6379 | MachNode* string_compareULNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
6380 | Compile* C = Compile::current(); |
6381 | // Add projection edges for additional defs or kills |
6382 | // DEF/KILL str1 |
6383 | MachProjNode *kill; |
6384 | kill = new MachProjNode( this, 1, (PTR_RSI_REG_mask()), Op_RegP ); |
6385 | proj_list.push(kill); |
6386 | // DEF/KILL cnt1 |
6387 | kill = new MachProjNode( this, 2, (INT_RDX_REG_mask()), Op_RegI ); |
6388 | proj_list.push(kill); |
6389 | // DEF/KILL str2 |
6390 | kill = new MachProjNode( this, 3, (PTR_RDI_REG_mask()), Op_RegP ); |
6391 | proj_list.push(kill); |
6392 | // DEF/KILL cnt2 |
6393 | kill = new MachProjNode( this, 4, (INT_RCX_REG_mask()), Op_RegI ); |
6394 | proj_list.push(kill); |
6395 | // TEMP tmp1 |
6396 | MachTempNode *def; |
6397 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
6398 | add_req(def); |
6399 | // DEF/KILL cr |
6400 | kill = new MachProjNode( this, 5, (INT_FLAGS_mask()), Op_RegFlags ); |
6401 | proj_list.push(kill); |
6402 | |
6403 | return this; |
6404 | } |
6405 | |
6406 | MachNode* string_compareUL_evexNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
6407 | Compile* C = Compile::current(); |
6408 | // Add projection edges for additional defs or kills |
6409 | // DEF/KILL str1 |
6410 | MachProjNode *kill; |
6411 | kill = new MachProjNode( this, 1, (PTR_RSI_REG_mask()), Op_RegP ); |
6412 | proj_list.push(kill); |
6413 | // DEF/KILL cnt1 |
6414 | kill = new MachProjNode( this, 2, (INT_RDX_REG_mask()), Op_RegI ); |
6415 | proj_list.push(kill); |
6416 | // DEF/KILL str2 |
6417 | kill = new MachProjNode( this, 3, (PTR_RDI_REG_mask()), Op_RegP ); |
6418 | proj_list.push(kill); |
6419 | // DEF/KILL cnt2 |
6420 | kill = new MachProjNode( this, 4, (INT_RCX_REG_mask()), Op_RegI ); |
6421 | proj_list.push(kill); |
6422 | // TEMP tmp1 |
6423 | MachTempNode *def; |
6424 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
6425 | add_req(def); |
6426 | // TEMP ktmp |
6427 | def = new MachTempNode(state->MachOperGenerator(KREG)); |
6428 | add_req(def); |
6429 | // DEF/KILL cr |
6430 | kill = new MachProjNode( this, 5, (INT_FLAGS_mask()), Op_RegFlags ); |
6431 | proj_list.push(kill); |
6432 | |
6433 | return this; |
6434 | } |
6435 | |
6436 | MachNode* string_indexof_conLNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
6437 | Compile* C = Compile::current(); |
6438 | // Add projection edges for additional defs or kills |
6439 | // DEF/KILL str1 |
6440 | MachProjNode *kill; |
6441 | kill = new MachProjNode( this, 1, (PTR_RDI_REG_mask()), Op_RegP ); |
6442 | proj_list.push(kill); |
6443 | // DEF/KILL cnt1 |
6444 | kill = new MachProjNode( this, 2, (INT_RDX_REG_mask()), Op_RegI ); |
6445 | proj_list.push(kill); |
6446 | // DEF/KILL str2 |
6447 | kill = new MachProjNode( this, 3, (PTR_RSI_REG_mask()), Op_RegP ); |
6448 | proj_list.push(kill); |
6449 | // TEMP tmp_vec |
6450 | MachTempNode *def; |
6451 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
6452 | add_req(def); |
6453 | // DEF/KILL cnt2 |
6454 | kill = new MachProjNode( this, 4, (INT_RAX_REG_mask()), Op_RegI ); |
6455 | proj_list.push(kill); |
6456 | // DEF/KILL tmp |
6457 | kill = new MachProjNode( this, 5, (INT_RCX_REG_mask()), Op_RegI ); |
6458 | proj_list.push(kill); |
6459 | // DEF/KILL cr |
6460 | kill = new MachProjNode( this, 6, (INT_FLAGS_mask()), Op_RegFlags ); |
6461 | proj_list.push(kill); |
6462 | |
6463 | return this; |
6464 | } |
6465 | |
6466 | MachNode* string_indexof_conUNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
6467 | Compile* C = Compile::current(); |
6468 | // Add projection edges for additional defs or kills |
6469 | // DEF/KILL str1 |
6470 | MachProjNode *kill; |
6471 | kill = new MachProjNode( this, 1, (PTR_RDI_REG_mask()), Op_RegP ); |
6472 | proj_list.push(kill); |
6473 | // DEF/KILL cnt1 |
6474 | kill = new MachProjNode( this, 2, (INT_RDX_REG_mask()), Op_RegI ); |
6475 | proj_list.push(kill); |
6476 | // DEF/KILL str2 |
6477 | kill = new MachProjNode( this, 3, (PTR_RSI_REG_mask()), Op_RegP ); |
6478 | proj_list.push(kill); |
6479 | // TEMP tmp_vec |
6480 | MachTempNode *def; |
6481 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
6482 | add_req(def); |
6483 | // DEF/KILL cnt2 |
6484 | kill = new MachProjNode( this, 4, (INT_RAX_REG_mask()), Op_RegI ); |
6485 | proj_list.push(kill); |
6486 | // DEF/KILL tmp |
6487 | kill = new MachProjNode( this, 5, (INT_RCX_REG_mask()), Op_RegI ); |
6488 | proj_list.push(kill); |
6489 | // DEF/KILL cr |
6490 | kill = new MachProjNode( this, 6, (INT_FLAGS_mask()), Op_RegFlags ); |
6491 | proj_list.push(kill); |
6492 | |
6493 | return this; |
6494 | } |
6495 | |
6496 | MachNode* string_indexof_conULNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
6497 | Compile* C = Compile::current(); |
6498 | // Add projection edges for additional defs or kills |
6499 | // DEF/KILL str1 |
6500 | MachProjNode *kill; |
6501 | kill = new MachProjNode( this, 1, (PTR_RDI_REG_mask()), Op_RegP ); |
6502 | proj_list.push(kill); |
6503 | // DEF/KILL cnt1 |
6504 | kill = new MachProjNode( this, 2, (INT_RDX_REG_mask()), Op_RegI ); |
6505 | proj_list.push(kill); |
6506 | // DEF/KILL str2 |
6507 | kill = new MachProjNode( this, 3, (PTR_RSI_REG_mask()), Op_RegP ); |
6508 | proj_list.push(kill); |
6509 | // TEMP tmp_vec |
6510 | MachTempNode *def; |
6511 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
6512 | add_req(def); |
6513 | // DEF/KILL cnt2 |
6514 | kill = new MachProjNode( this, 4, (INT_RAX_REG_mask()), Op_RegI ); |
6515 | proj_list.push(kill); |
6516 | // DEF/KILL tmp |
6517 | kill = new MachProjNode( this, 5, (INT_RCX_REG_mask()), Op_RegI ); |
6518 | proj_list.push(kill); |
6519 | // DEF/KILL cr |
6520 | kill = new MachProjNode( this, 6, (INT_FLAGS_mask()), Op_RegFlags ); |
6521 | proj_list.push(kill); |
6522 | |
6523 | return this; |
6524 | } |
6525 | |
6526 | MachNode* string_indexofLNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
6527 | Compile* C = Compile::current(); |
6528 | // Add projection edges for additional defs or kills |
6529 | // DEF/KILL str1 |
6530 | MachProjNode *kill; |
6531 | kill = new MachProjNode( this, 1, (PTR_RDI_REG_mask()), Op_RegP ); |
6532 | proj_list.push(kill); |
6533 | // DEF/KILL cnt1 |
6534 | kill = new MachProjNode( this, 2, (INT_RDX_REG_mask()), Op_RegI ); |
6535 | proj_list.push(kill); |
6536 | // DEF/KILL str2 |
6537 | kill = new MachProjNode( this, 3, (PTR_RSI_REG_mask()), Op_RegP ); |
6538 | proj_list.push(kill); |
6539 | // DEF/KILL cnt2 |
6540 | kill = new MachProjNode( this, 4, (INT_RAX_REG_mask()), Op_RegI ); |
6541 | proj_list.push(kill); |
6542 | // TEMP tmp_vec |
6543 | MachTempNode *def; |
6544 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
6545 | add_req(def); |
6546 | // DEF/KILL tmp |
6547 | kill = new MachProjNode( this, 5, (INT_RCX_REG_mask()), Op_RegI ); |
6548 | proj_list.push(kill); |
6549 | // DEF/KILL cr |
6550 | kill = new MachProjNode( this, 6, (INT_FLAGS_mask()), Op_RegFlags ); |
6551 | proj_list.push(kill); |
6552 | |
6553 | return this; |
6554 | } |
6555 | |
6556 | MachNode* string_indexofUNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
6557 | Compile* C = Compile::current(); |
6558 | // Add projection edges for additional defs or kills |
6559 | // DEF/KILL str1 |
6560 | MachProjNode *kill; |
6561 | kill = new MachProjNode( this, 1, (PTR_RDI_REG_mask()), Op_RegP ); |
6562 | proj_list.push(kill); |
6563 | // DEF/KILL cnt1 |
6564 | kill = new MachProjNode( this, 2, (INT_RDX_REG_mask()), Op_RegI ); |
6565 | proj_list.push(kill); |
6566 | // DEF/KILL str2 |
6567 | kill = new MachProjNode( this, 3, (PTR_RSI_REG_mask()), Op_RegP ); |
6568 | proj_list.push(kill); |
6569 | // DEF/KILL cnt2 |
6570 | kill = new MachProjNode( this, 4, (INT_RAX_REG_mask()), Op_RegI ); |
6571 | proj_list.push(kill); |
6572 | // TEMP tmp_vec |
6573 | MachTempNode *def; |
6574 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
6575 | add_req(def); |
6576 | // DEF/KILL tmp |
6577 | kill = new MachProjNode( this, 5, (INT_RCX_REG_mask()), Op_RegI ); |
6578 | proj_list.push(kill); |
6579 | // DEF/KILL cr |
6580 | kill = new MachProjNode( this, 6, (INT_FLAGS_mask()), Op_RegFlags ); |
6581 | proj_list.push(kill); |
6582 | |
6583 | return this; |
6584 | } |
6585 | |
6586 | MachNode* string_indexofULNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
6587 | Compile* C = Compile::current(); |
6588 | // Add projection edges for additional defs or kills |
6589 | // DEF/KILL str1 |
6590 | MachProjNode *kill; |
6591 | kill = new MachProjNode( this, 1, (PTR_RDI_REG_mask()), Op_RegP ); |
6592 | proj_list.push(kill); |
6593 | // DEF/KILL cnt1 |
6594 | kill = new MachProjNode( this, 2, (INT_RDX_REG_mask()), Op_RegI ); |
6595 | proj_list.push(kill); |
6596 | // DEF/KILL str2 |
6597 | kill = new MachProjNode( this, 3, (PTR_RSI_REG_mask()), Op_RegP ); |
6598 | proj_list.push(kill); |
6599 | // DEF/KILL cnt2 |
6600 | kill = new MachProjNode( this, 4, (INT_RAX_REG_mask()), Op_RegI ); |
6601 | proj_list.push(kill); |
6602 | // TEMP tmp_vec |
6603 | MachTempNode *def; |
6604 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
6605 | add_req(def); |
6606 | // DEF/KILL tmp |
6607 | kill = new MachProjNode( this, 5, (INT_RCX_REG_mask()), Op_RegI ); |
6608 | proj_list.push(kill); |
6609 | // DEF/KILL cr |
6610 | kill = new MachProjNode( this, 6, (INT_FLAGS_mask()), Op_RegFlags ); |
6611 | proj_list.push(kill); |
6612 | |
6613 | return this; |
6614 | } |
6615 | |
6616 | MachNode* string_indexof_charNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
6617 | Compile* C = Compile::current(); |
6618 | // Add projection edges for additional defs or kills |
6619 | // DEF/KILL str1 |
6620 | MachProjNode *kill; |
6621 | kill = new MachProjNode( this, 1, (PTR_RDI_REG_mask()), Op_RegP ); |
6622 | proj_list.push(kill); |
6623 | // DEF/KILL cnt1 |
6624 | kill = new MachProjNode( this, 2, (INT_RDX_REG_mask()), Op_RegI ); |
6625 | proj_list.push(kill); |
6626 | // DEF/KILL ch |
6627 | kill = new MachProjNode( this, 3, (INT_RAX_REG_mask()), Op_RegI ); |
6628 | proj_list.push(kill); |
6629 | // TEMP tmp_vec1 |
6630 | MachTempNode *def; |
6631 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
6632 | add_req(def); |
6633 | // TEMP tmp_vec2 |
6634 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
6635 | add_req(def); |
6636 | // TEMP tmp_vec3 |
6637 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
6638 | add_req(def); |
6639 | // TEMP tmp |
6640 | def = new MachTempNode(state->MachOperGenerator(RCX_REGI)); |
6641 | add_req(def); |
6642 | // DEF/KILL cr |
6643 | kill = new MachProjNode( this, 4, (INT_FLAGS_mask()), Op_RegFlags ); |
6644 | proj_list.push(kill); |
6645 | |
6646 | return this; |
6647 | } |
6648 | |
6649 | MachNode* stringL_indexof_charNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
6650 | Compile* C = Compile::current(); |
6651 | // Add projection edges for additional defs or kills |
6652 | // DEF/KILL str1 |
6653 | MachProjNode *kill; |
6654 | kill = new MachProjNode( this, 1, (PTR_RDI_REG_mask()), Op_RegP ); |
6655 | proj_list.push(kill); |
6656 | // DEF/KILL cnt1 |
6657 | kill = new MachProjNode( this, 2, (INT_RDX_REG_mask()), Op_RegI ); |
6658 | proj_list.push(kill); |
6659 | // DEF/KILL ch |
6660 | kill = new MachProjNode( this, 3, (INT_RAX_REG_mask()), Op_RegI ); |
6661 | proj_list.push(kill); |
6662 | // TEMP tmp_vec1 |
6663 | MachTempNode *def; |
6664 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
6665 | add_req(def); |
6666 | // TEMP tmp_vec2 |
6667 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
6668 | add_req(def); |
6669 | // TEMP tmp_vec3 |
6670 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
6671 | add_req(def); |
6672 | // TEMP tmp |
6673 | def = new MachTempNode(state->MachOperGenerator(RCX_REGI)); |
6674 | add_req(def); |
6675 | // DEF/KILL cr |
6676 | kill = new MachProjNode( this, 4, (INT_FLAGS_mask()), Op_RegFlags ); |
6677 | proj_list.push(kill); |
6678 | |
6679 | return this; |
6680 | } |
6681 | |
6682 | MachNode* string_equalsNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
6683 | Compile* C = Compile::current(); |
6684 | // Add projection edges for additional defs or kills |
6685 | // DEF/KILL str1 |
6686 | MachProjNode *kill; |
6687 | kill = new MachProjNode( this, 1, (PTR_RDI_REG_mask()), Op_RegP ); |
6688 | proj_list.push(kill); |
6689 | // DEF/KILL str2 |
6690 | kill = new MachProjNode( this, 2, (PTR_RSI_REG_mask()), Op_RegP ); |
6691 | proj_list.push(kill); |
6692 | // DEF/KILL cnt |
6693 | kill = new MachProjNode( this, 3, (INT_RCX_REG_mask()), Op_RegI ); |
6694 | proj_list.push(kill); |
6695 | // TEMP tmp1 |
6696 | MachTempNode *def; |
6697 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
6698 | add_req(def); |
6699 | // TEMP tmp2 |
6700 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
6701 | add_req(def); |
6702 | // DEF/KILL tmp3 |
6703 | kill = new MachProjNode( this, 4, (INT_RBX_REG_mask()), Op_RegI ); |
6704 | proj_list.push(kill); |
6705 | // DEF/KILL cr |
6706 | kill = new MachProjNode( this, 5, (INT_FLAGS_mask()), Op_RegFlags ); |
6707 | proj_list.push(kill); |
6708 | |
6709 | return this; |
6710 | } |
6711 | |
6712 | MachNode* string_equals_evexNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
6713 | Compile* C = Compile::current(); |
6714 | // Add projection edges for additional defs or kills |
6715 | // DEF/KILL str1 |
6716 | MachProjNode *kill; |
6717 | kill = new MachProjNode( this, 1, (PTR_RDI_REG_mask()), Op_RegP ); |
6718 | proj_list.push(kill); |
6719 | // DEF/KILL str2 |
6720 | kill = new MachProjNode( this, 2, (PTR_RSI_REG_mask()), Op_RegP ); |
6721 | proj_list.push(kill); |
6722 | // DEF/KILL cnt |
6723 | kill = new MachProjNode( this, 3, (INT_RCX_REG_mask()), Op_RegI ); |
6724 | proj_list.push(kill); |
6725 | // TEMP tmp1 |
6726 | MachTempNode *def; |
6727 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
6728 | add_req(def); |
6729 | // TEMP tmp2 |
6730 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
6731 | add_req(def); |
6732 | // TEMP ktmp |
6733 | def = new MachTempNode(state->MachOperGenerator(KREG)); |
6734 | add_req(def); |
6735 | // DEF/KILL tmp3 |
6736 | kill = new MachProjNode( this, 4, (INT_RBX_REG_mask()), Op_RegI ); |
6737 | proj_list.push(kill); |
6738 | // DEF/KILL cr |
6739 | kill = new MachProjNode( this, 5, (INT_FLAGS_mask()), Op_RegFlags ); |
6740 | proj_list.push(kill); |
6741 | |
6742 | return this; |
6743 | } |
6744 | |
6745 | MachNode* array_equalsBNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
6746 | Compile* C = Compile::current(); |
6747 | // Add projection edges for additional defs or kills |
6748 | // DEF/KILL ary1 |
6749 | MachProjNode *kill; |
6750 | kill = new MachProjNode( this, 1, (PTR_RDI_REG_mask()), Op_RegP ); |
6751 | proj_list.push(kill); |
6752 | // DEF/KILL ary2 |
6753 | kill = new MachProjNode( this, 2, (PTR_RSI_REG_mask()), Op_RegP ); |
6754 | proj_list.push(kill); |
6755 | // TEMP tmp1 |
6756 | MachTempNode *def; |
6757 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
6758 | add_req(def); |
6759 | // TEMP tmp2 |
6760 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
6761 | add_req(def); |
6762 | // DEF/KILL tmp3 |
6763 | kill = new MachProjNode( this, 3, (INT_RCX_REG_mask()), Op_RegI ); |
6764 | proj_list.push(kill); |
6765 | // DEF/KILL tmp4 |
6766 | kill = new MachProjNode( this, 4, (INT_RBX_REG_mask()), Op_RegI ); |
6767 | proj_list.push(kill); |
6768 | // DEF/KILL cr |
6769 | kill = new MachProjNode( this, 5, (INT_FLAGS_mask()), Op_RegFlags ); |
6770 | proj_list.push(kill); |
6771 | |
6772 | return this; |
6773 | } |
6774 | |
6775 | MachNode* array_equalsB_evexNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
6776 | Compile* C = Compile::current(); |
6777 | // Add projection edges for additional defs or kills |
6778 | // DEF/KILL ary1 |
6779 | MachProjNode *kill; |
6780 | kill = new MachProjNode( this, 1, (PTR_RDI_REG_mask()), Op_RegP ); |
6781 | proj_list.push(kill); |
6782 | // DEF/KILL ary2 |
6783 | kill = new MachProjNode( this, 2, (PTR_RSI_REG_mask()), Op_RegP ); |
6784 | proj_list.push(kill); |
6785 | // TEMP tmp1 |
6786 | MachTempNode *def; |
6787 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
6788 | add_req(def); |
6789 | // TEMP tmp2 |
6790 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
6791 | add_req(def); |
6792 | // TEMP ktmp |
6793 | def = new MachTempNode(state->MachOperGenerator(KREG)); |
6794 | add_req(def); |
6795 | // DEF/KILL tmp3 |
6796 | kill = new MachProjNode( this, 3, (INT_RCX_REG_mask()), Op_RegI ); |
6797 | proj_list.push(kill); |
6798 | // DEF/KILL tmp4 |
6799 | kill = new MachProjNode( this, 4, (INT_RBX_REG_mask()), Op_RegI ); |
6800 | proj_list.push(kill); |
6801 | // DEF/KILL cr |
6802 | kill = new MachProjNode( this, 5, (INT_FLAGS_mask()), Op_RegFlags ); |
6803 | proj_list.push(kill); |
6804 | |
6805 | return this; |
6806 | } |
6807 | |
6808 | MachNode* array_equalsCNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
6809 | Compile* C = Compile::current(); |
6810 | // Add projection edges for additional defs or kills |
6811 | // DEF/KILL ary1 |
6812 | MachProjNode *kill; |
6813 | kill = new MachProjNode( this, 1, (PTR_RDI_REG_mask()), Op_RegP ); |
6814 | proj_list.push(kill); |
6815 | // DEF/KILL ary2 |
6816 | kill = new MachProjNode( this, 2, (PTR_RSI_REG_mask()), Op_RegP ); |
6817 | proj_list.push(kill); |
6818 | // TEMP tmp1 |
6819 | MachTempNode *def; |
6820 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
6821 | add_req(def); |
6822 | // TEMP tmp2 |
6823 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
6824 | add_req(def); |
6825 | // DEF/KILL tmp3 |
6826 | kill = new MachProjNode( this, 3, (INT_RCX_REG_mask()), Op_RegI ); |
6827 | proj_list.push(kill); |
6828 | // DEF/KILL tmp4 |
6829 | kill = new MachProjNode( this, 4, (INT_RBX_REG_mask()), Op_RegI ); |
6830 | proj_list.push(kill); |
6831 | // DEF/KILL cr |
6832 | kill = new MachProjNode( this, 5, (INT_FLAGS_mask()), Op_RegFlags ); |
6833 | proj_list.push(kill); |
6834 | |
6835 | return this; |
6836 | } |
6837 | |
6838 | MachNode* array_equalsC_evexNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
6839 | Compile* C = Compile::current(); |
6840 | // Add projection edges for additional defs or kills |
6841 | // DEF/KILL ary1 |
6842 | MachProjNode *kill; |
6843 | kill = new MachProjNode( this, 1, (PTR_RDI_REG_mask()), Op_RegP ); |
6844 | proj_list.push(kill); |
6845 | // DEF/KILL ary2 |
6846 | kill = new MachProjNode( this, 2, (PTR_RSI_REG_mask()), Op_RegP ); |
6847 | proj_list.push(kill); |
6848 | // TEMP tmp1 |
6849 | MachTempNode *def; |
6850 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
6851 | add_req(def); |
6852 | // TEMP tmp2 |
6853 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
6854 | add_req(def); |
6855 | // TEMP ktmp |
6856 | def = new MachTempNode(state->MachOperGenerator(KREG)); |
6857 | add_req(def); |
6858 | // DEF/KILL tmp3 |
6859 | kill = new MachProjNode( this, 3, (INT_RCX_REG_mask()), Op_RegI ); |
6860 | proj_list.push(kill); |
6861 | // DEF/KILL tmp4 |
6862 | kill = new MachProjNode( this, 4, (INT_RBX_REG_mask()), Op_RegI ); |
6863 | proj_list.push(kill); |
6864 | // DEF/KILL cr |
6865 | kill = new MachProjNode( this, 5, (INT_FLAGS_mask()), Op_RegFlags ); |
6866 | proj_list.push(kill); |
6867 | |
6868 | return this; |
6869 | } |
6870 | |
6871 | MachNode* has_negativesNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
6872 | Compile* C = Compile::current(); |
6873 | // Add projection edges for additional defs or kills |
6874 | // DEF/KILL ary1 |
6875 | MachProjNode *kill; |
6876 | kill = new MachProjNode( this, 1, (PTR_RSI_REG_mask()), Op_RegP ); |
6877 | proj_list.push(kill); |
6878 | // DEF/KILL len |
6879 | kill = new MachProjNode( this, 2, (INT_RCX_REG_mask()), Op_RegI ); |
6880 | proj_list.push(kill); |
6881 | // TEMP tmp1 |
6882 | MachTempNode *def; |
6883 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
6884 | add_req(def); |
6885 | // TEMP tmp2 |
6886 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
6887 | add_req(def); |
6888 | // DEF/KILL tmp3 |
6889 | kill = new MachProjNode( this, 3, (INT_RBX_REG_mask()), Op_RegI ); |
6890 | proj_list.push(kill); |
6891 | // DEF/KILL cr |
6892 | kill = new MachProjNode( this, 4, (INT_FLAGS_mask()), Op_RegFlags ); |
6893 | proj_list.push(kill); |
6894 | |
6895 | return this; |
6896 | } |
6897 | |
6898 | MachNode* has_negatives_evexNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
6899 | Compile* C = Compile::current(); |
6900 | // Add projection edges for additional defs or kills |
6901 | // DEF/KILL ary1 |
6902 | MachProjNode *kill; |
6903 | kill = new MachProjNode( this, 1, (PTR_RSI_REG_mask()), Op_RegP ); |
6904 | proj_list.push(kill); |
6905 | // DEF/KILL len |
6906 | kill = new MachProjNode( this, 2, (INT_RCX_REG_mask()), Op_RegI ); |
6907 | proj_list.push(kill); |
6908 | // TEMP tmp1 |
6909 | MachTempNode *def; |
6910 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
6911 | add_req(def); |
6912 | // TEMP tmp2 |
6913 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
6914 | add_req(def); |
6915 | // TEMP ktmp1 |
6916 | def = new MachTempNode(state->MachOperGenerator(KREG)); |
6917 | add_req(def); |
6918 | // TEMP ktmp2 |
6919 | def = new MachTempNode(state->MachOperGenerator(KREG)); |
6920 | add_req(def); |
6921 | // DEF/KILL tmp3 |
6922 | kill = new MachProjNode( this, 3, (INT_RBX_REG_mask()), Op_RegI ); |
6923 | proj_list.push(kill); |
6924 | // DEF/KILL cr |
6925 | kill = new MachProjNode( this, 4, (INT_FLAGS_mask()), Op_RegFlags ); |
6926 | proj_list.push(kill); |
6927 | |
6928 | return this; |
6929 | } |
6930 | |
6931 | MachNode* string_compressNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
6932 | Compile* C = Compile::current(); |
6933 | // Add projection edges for additional defs or kills |
6934 | // DEF/KILL src |
6935 | MachProjNode *kill; |
6936 | kill = new MachProjNode( this, 1, (PTR_RSI_REG_mask()), Op_RegP ); |
6937 | proj_list.push(kill); |
6938 | // DEF/KILL dst |
6939 | kill = new MachProjNode( this, 2, (PTR_RDI_REG_mask()), Op_RegP ); |
6940 | proj_list.push(kill); |
6941 | // DEF/KILL len |
6942 | kill = new MachProjNode( this, 3, (INT_RDX_REG_mask()), Op_RegI ); |
6943 | proj_list.push(kill); |
6944 | // TEMP tmp1 |
6945 | MachTempNode *def; |
6946 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
6947 | add_req(def); |
6948 | // TEMP tmp2 |
6949 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
6950 | add_req(def); |
6951 | // TEMP tmp3 |
6952 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
6953 | add_req(def); |
6954 | // TEMP tmp4 |
6955 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
6956 | add_req(def); |
6957 | // DEF/KILL tmp5 |
6958 | kill = new MachProjNode( this, 4, (INT_RCX_REG_mask()), Op_RegI ); |
6959 | proj_list.push(kill); |
6960 | // DEF/KILL cr |
6961 | kill = new MachProjNode( this, 5, (INT_FLAGS_mask()), Op_RegFlags ); |
6962 | proj_list.push(kill); |
6963 | |
6964 | return this; |
6965 | } |
6966 | |
6967 | MachNode* string_compress_evexNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
6968 | Compile* C = Compile::current(); |
6969 | // Add projection edges for additional defs or kills |
6970 | // DEF/KILL src |
6971 | MachProjNode *kill; |
6972 | kill = new MachProjNode( this, 1, (PTR_RSI_REG_mask()), Op_RegP ); |
6973 | proj_list.push(kill); |
6974 | // DEF/KILL dst |
6975 | kill = new MachProjNode( this, 2, (PTR_RDI_REG_mask()), Op_RegP ); |
6976 | proj_list.push(kill); |
6977 | // DEF/KILL len |
6978 | kill = new MachProjNode( this, 3, (INT_RDX_REG_mask()), Op_RegI ); |
6979 | proj_list.push(kill); |
6980 | // TEMP tmp1 |
6981 | MachTempNode *def; |
6982 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
6983 | add_req(def); |
6984 | // TEMP tmp2 |
6985 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
6986 | add_req(def); |
6987 | // TEMP tmp3 |
6988 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
6989 | add_req(def); |
6990 | // TEMP tmp4 |
6991 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
6992 | add_req(def); |
6993 | // TEMP ktmp1 |
6994 | def = new MachTempNode(state->MachOperGenerator(KREG)); |
6995 | add_req(def); |
6996 | // TEMP ktmp2 |
6997 | def = new MachTempNode(state->MachOperGenerator(KREG)); |
6998 | add_req(def); |
6999 | // DEF/KILL tmp5 |
7000 | kill = new MachProjNode( this, 4, (INT_RCX_REG_mask()), Op_RegI ); |
7001 | proj_list.push(kill); |
7002 | // DEF/KILL cr |
7003 | kill = new MachProjNode( this, 5, (INT_FLAGS_mask()), Op_RegFlags ); |
7004 | proj_list.push(kill); |
7005 | |
7006 | return this; |
7007 | } |
7008 | |
7009 | MachNode* string_inflateNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
7010 | Compile* C = Compile::current(); |
7011 | // Add projection edges for additional defs or kills |
7012 | // DEF/KILL src |
7013 | MachProjNode *kill; |
7014 | kill = new MachProjNode( this, 1, (PTR_RSI_REG_mask()), Op_RegP ); |
7015 | proj_list.push(kill); |
7016 | // DEF/KILL dst |
7017 | kill = new MachProjNode( this, 2, (PTR_RDI_REG_mask()), Op_RegP ); |
7018 | proj_list.push(kill); |
7019 | // DEF/KILL len |
7020 | kill = new MachProjNode( this, 3, (INT_RDX_REG_mask()), Op_RegI ); |
7021 | proj_list.push(kill); |
7022 | // TEMP tmp1 |
7023 | MachTempNode *def; |
7024 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
7025 | add_req(def); |
7026 | // TEMP tmp2 |
7027 | def = new MachTempNode(state->MachOperGenerator(RCX_REGI)); |
7028 | add_req(def); |
7029 | // DEF/KILL cr |
7030 | kill = new MachProjNode( this, 4, (INT_FLAGS_mask()), Op_RegFlags ); |
7031 | proj_list.push(kill); |
7032 | |
7033 | return this; |
7034 | } |
7035 | |
7036 | MachNode* string_inflate_evexNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
7037 | Compile* C = Compile::current(); |
7038 | // Add projection edges for additional defs or kills |
7039 | // DEF/KILL src |
7040 | MachProjNode *kill; |
7041 | kill = new MachProjNode( this, 1, (PTR_RSI_REG_mask()), Op_RegP ); |
7042 | proj_list.push(kill); |
7043 | // DEF/KILL dst |
7044 | kill = new MachProjNode( this, 2, (PTR_RDI_REG_mask()), Op_RegP ); |
7045 | proj_list.push(kill); |
7046 | // DEF/KILL len |
7047 | kill = new MachProjNode( this, 3, (INT_RDX_REG_mask()), Op_RegI ); |
7048 | proj_list.push(kill); |
7049 | // TEMP tmp1 |
7050 | MachTempNode *def; |
7051 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
7052 | add_req(def); |
7053 | // TEMP ktmp |
7054 | def = new MachTempNode(state->MachOperGenerator(KREG)); |
7055 | add_req(def); |
7056 | // TEMP tmp2 |
7057 | def = new MachTempNode(state->MachOperGenerator(RCX_REGI)); |
7058 | add_req(def); |
7059 | // DEF/KILL cr |
7060 | kill = new MachProjNode( this, 4, (INT_FLAGS_mask()), Op_RegFlags ); |
7061 | proj_list.push(kill); |
7062 | |
7063 | return this; |
7064 | } |
7065 | |
7066 | MachNode* encode_iso_arrayNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
7067 | Compile* C = Compile::current(); |
7068 | // Add projection edges for additional defs or kills |
7069 | // DEF/KILL src |
7070 | MachProjNode *kill; |
7071 | kill = new MachProjNode( this, 1, (PTR_RSI_REG_mask()), Op_RegP ); |
7072 | proj_list.push(kill); |
7073 | // DEF/KILL dst |
7074 | kill = new MachProjNode( this, 2, (PTR_RDI_REG_mask()), Op_RegP ); |
7075 | proj_list.push(kill); |
7076 | // DEF/KILL len |
7077 | kill = new MachProjNode( this, 3, (INT_RDX_REG_mask()), Op_RegI ); |
7078 | proj_list.push(kill); |
7079 | // TEMP tmp1 |
7080 | MachTempNode *def; |
7081 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
7082 | add_req(def); |
7083 | // TEMP tmp2 |
7084 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
7085 | add_req(def); |
7086 | // TEMP tmp3 |
7087 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
7088 | add_req(def); |
7089 | // TEMP tmp4 |
7090 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
7091 | add_req(def); |
7092 | // DEF/KILL tmp5 |
7093 | kill = new MachProjNode( this, 4, (INT_RCX_REG_mask()), Op_RegI ); |
7094 | proj_list.push(kill); |
7095 | // DEF/KILL cr |
7096 | kill = new MachProjNode( this, 5, (INT_FLAGS_mask()), Op_RegFlags ); |
7097 | proj_list.push(kill); |
7098 | |
7099 | return this; |
7100 | } |
7101 | |
7102 | MachNode* encode_ascii_arrayNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
7103 | Compile* C = Compile::current(); |
7104 | // Add projection edges for additional defs or kills |
7105 | // DEF/KILL src |
7106 | MachProjNode *kill; |
7107 | kill = new MachProjNode( this, 1, (PTR_RSI_REG_mask()), Op_RegP ); |
7108 | proj_list.push(kill); |
7109 | // DEF/KILL dst |
7110 | kill = new MachProjNode( this, 2, (PTR_RDI_REG_mask()), Op_RegP ); |
7111 | proj_list.push(kill); |
7112 | // DEF/KILL len |
7113 | kill = new MachProjNode( this, 3, (INT_RDX_REG_mask()), Op_RegI ); |
7114 | proj_list.push(kill); |
7115 | // TEMP tmp1 |
7116 | MachTempNode *def; |
7117 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
7118 | add_req(def); |
7119 | // TEMP tmp2 |
7120 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
7121 | add_req(def); |
7122 | // TEMP tmp3 |
7123 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
7124 | add_req(def); |
7125 | // TEMP tmp4 |
7126 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
7127 | add_req(def); |
7128 | // DEF/KILL tmp5 |
7129 | kill = new MachProjNode( this, 4, (INT_RCX_REG_mask()), Op_RegI ); |
7130 | proj_list.push(kill); |
7131 | // DEF/KILL cr |
7132 | kill = new MachProjNode( this, 5, (INT_FLAGS_mask()), Op_RegFlags ); |
7133 | proj_list.push(kill); |
7134 | |
7135 | return this; |
7136 | } |
7137 | |
7138 | MachNode* overflowAddI_rRegNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
7139 | Compile* C = Compile::current(); |
7140 | // Add projection edges for additional defs or kills |
7141 | // DEF/KILL op1 |
7142 | MachProjNode *kill; |
7143 | kill = new MachProjNode( this, 1, (INT_RAX_REG_mask()), Op_RegI ); |
7144 | proj_list.push(kill); |
7145 | |
7146 | return this; |
7147 | } |
7148 | |
7149 | MachNode* overflowAddI_rReg_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
7150 | Compile* C = Compile::current(); |
7151 | // Add projection edges for additional defs or kills |
7152 | // DEF/KILL op1 |
7153 | MachProjNode *kill; |
7154 | kill = new MachProjNode( this, 1, (INT_RAX_REG_mask()), Op_RegI ); |
7155 | proj_list.push(kill); |
7156 | |
7157 | return this; |
7158 | } |
7159 | |
7160 | MachNode* overflowAddL_rRegNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
7161 | Compile* C = Compile::current(); |
7162 | // Add projection edges for additional defs or kills |
7163 | // DEF/KILL op1 |
7164 | MachProjNode *kill; |
7165 | kill = new MachProjNode( this, 1, (LONG_RAX_REG_mask()), Op_RegL ); |
7166 | proj_list.push(kill); |
7167 | |
7168 | return this; |
7169 | } |
7170 | |
7171 | MachNode* overflowAddL_rReg_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
7172 | Compile* C = Compile::current(); |
7173 | // Add projection edges for additional defs or kills |
7174 | // DEF/KILL op1 |
7175 | MachProjNode *kill; |
7176 | kill = new MachProjNode( this, 1, (LONG_RAX_REG_mask()), Op_RegL ); |
7177 | proj_list.push(kill); |
7178 | |
7179 | return this; |
7180 | } |
7181 | |
7182 | MachNode* overflowNegI_rRegNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
7183 | Compile* C = Compile::current(); |
7184 | // Add projection edges for additional defs or kills |
7185 | // DEF/KILL op2 |
7186 | MachProjNode *kill; |
7187 | kill = new MachProjNode( this, 1, (INT_RAX_REG_mask()), Op_RegI ); |
7188 | proj_list.push(kill); |
7189 | |
7190 | return this; |
7191 | } |
7192 | |
7193 | MachNode* overflowNegL_rRegNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
7194 | Compile* C = Compile::current(); |
7195 | // Add projection edges for additional defs or kills |
7196 | // DEF/KILL op2 |
7197 | MachProjNode *kill; |
7198 | kill = new MachProjNode( this, 1, (LONG_RAX_REG_mask()), Op_RegL ); |
7199 | proj_list.push(kill); |
7200 | |
7201 | return this; |
7202 | } |
7203 | |
7204 | MachNode* overflowMulI_rRegNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
7205 | Compile* C = Compile::current(); |
7206 | // Add projection edges for additional defs or kills |
7207 | // DEF/KILL op1 |
7208 | MachProjNode *kill; |
7209 | kill = new MachProjNode( this, 1, (INT_RAX_REG_mask()), Op_RegI ); |
7210 | proj_list.push(kill); |
7211 | |
7212 | return this; |
7213 | } |
7214 | |
7215 | MachNode* overflowMulI_rReg_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
7216 | Compile* C = Compile::current(); |
7217 | // Add projection edges for additional defs or kills |
7218 | // TEMP tmp |
7219 | MachTempNode *def; |
7220 | def = new MachTempNode(state->MachOperGenerator(RREGI)); |
7221 | add_req(def); |
7222 | |
7223 | return this; |
7224 | } |
7225 | |
7226 | MachNode* overflowMulL_rRegNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
7227 | Compile* C = Compile::current(); |
7228 | // Add projection edges for additional defs or kills |
7229 | // DEF/KILL op1 |
7230 | MachProjNode *kill; |
7231 | kill = new MachProjNode( this, 1, (LONG_RAX_REG_mask()), Op_RegL ); |
7232 | proj_list.push(kill); |
7233 | |
7234 | return this; |
7235 | } |
7236 | |
7237 | MachNode* overflowMulL_rReg_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
7238 | Compile* C = Compile::current(); |
7239 | // Add projection edges for additional defs or kills |
7240 | // TEMP tmp |
7241 | MachTempNode *def; |
7242 | def = new MachTempNode(state->MachOperGenerator(RREGL)); |
7243 | add_req(def); |
7244 | |
7245 | return this; |
7246 | } |
7247 | |
7248 | MachNode* cmpL3_reg_regNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
7249 | Compile* C = Compile::current(); |
7250 | // Add projection edges for additional defs or kills |
7251 | // DEF/KILL flags |
7252 | MachProjNode *kill; |
7253 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
7254 | proj_list.push(kill); |
7255 | |
7256 | return this; |
7257 | } |
7258 | |
7259 | MachNode* minI_rRegNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
7260 | Compile* C = Compile::current(); |
7261 | MachOper *op0 = new rFlagsRegOper(); |
7262 | MachNode *tmp0 = this; |
7263 | MachNode *tmp1 = this; |
7264 | MachNode *tmp2 = this; |
7265 | MachNode *tmp3 = NULL__null; |
7266 | unsigned num0 = 0; |
7267 | unsigned num1 = opnd_array(1)->num_edges(); |
7268 | unsigned num2 = opnd_array(2)->num_edges(); |
7269 | unsigned idx0 = oper_input_base(); |
7270 | unsigned idx1 = idx0 + num0; |
7271 | unsigned idx2 = idx1 + num1; |
7272 | unsigned idx3 = idx2 + num2; |
7273 | MachNode *result = NULL__null; |
7274 | |
7275 | compI_rRegNode *n0 = new compI_rRegNode(); |
7276 | n0->add_req(_in[0]); |
7277 | n0->set_opnd_array(0, state->MachOperGenerator(RFLAGSREG)); |
7278 | tmp3 = n0; |
7279 | n0->set_opnd_array(1, opnd_array(1)->clone()); // dst |
7280 | if(tmp1 == this) { |
7281 | for(unsigned i = 0; i < num1; i++) { |
7282 | n0->add_req(_in[i + idx1]); |
7283 | } |
7284 | } |
7285 | else n0->add_req(tmp1); |
7286 | n0->set_opnd_array(2, opnd_array(2)->clone()); // src |
7287 | if(tmp2 == this) { |
7288 | for(unsigned i = 0; i < num2; i++) { |
7289 | n0->add_req(_in[i + idx2]); |
7290 | } |
7291 | } |
7292 | else n0->add_req(tmp2); |
7293 | result = n0->Expand( state, proj_list, mem ); |
7294 | |
7295 | cmovI_reg_gNode *n1 = new cmovI_reg_gNode(); |
7296 | n1->add_req(_in[0]); |
7297 | n1->set_opnd_array(0, state->MachOperGenerator(RREGI)); |
7298 | n1->set_opnd_array(1, opnd_array(1)->clone()); // dst |
7299 | if(tmp1 == this) { |
7300 | for(unsigned i = 0; i < num1; i++) { |
7301 | n1->add_req(_in[i + idx1]); |
7302 | } |
7303 | } |
7304 | else n1->add_req(tmp1); |
7305 | tmp1 = n1; |
7306 | n1->set_opnd_array(2, opnd_array(2)->clone()); // src |
7307 | if(tmp2 == this) { |
7308 | for(unsigned i = 0; i < num2; i++) { |
7309 | n1->add_req(_in[i + idx2]); |
7310 | } |
7311 | } |
7312 | else n1->add_req(tmp2); |
7313 | n1->set_opnd_array(3, op0->clone()); // cr |
7314 | if(tmp3 != NULL__null) |
7315 | n1->add_req(tmp3); |
7316 | result = n1->Expand( state, proj_list, mem ); |
7317 | |
7318 | |
7319 | return result; |
7320 | } |
7321 | |
7322 | MachNode* maxI_rRegNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
7323 | Compile* C = Compile::current(); |
7324 | MachOper *op0 = new rFlagsRegOper(); |
7325 | MachNode *tmp0 = this; |
7326 | MachNode *tmp1 = this; |
7327 | MachNode *tmp2 = this; |
7328 | MachNode *tmp3 = NULL__null; |
7329 | unsigned num0 = 0; |
7330 | unsigned num1 = opnd_array(1)->num_edges(); |
7331 | unsigned num2 = opnd_array(2)->num_edges(); |
7332 | unsigned idx0 = oper_input_base(); |
7333 | unsigned idx1 = idx0 + num0; |
7334 | unsigned idx2 = idx1 + num1; |
7335 | unsigned idx3 = idx2 + num2; |
7336 | MachNode *result = NULL__null; |
7337 | |
7338 | compI_rRegNode *n0 = new compI_rRegNode(); |
7339 | n0->add_req(_in[0]); |
7340 | n0->set_opnd_array(0, state->MachOperGenerator(RFLAGSREG)); |
7341 | tmp3 = n0; |
7342 | n0->set_opnd_array(1, opnd_array(1)->clone()); // dst |
7343 | if(tmp1 == this) { |
7344 | for(unsigned i = 0; i < num1; i++) { |
7345 | n0->add_req(_in[i + idx1]); |
7346 | } |
7347 | } |
7348 | else n0->add_req(tmp1); |
7349 | n0->set_opnd_array(2, opnd_array(2)->clone()); // src |
7350 | if(tmp2 == this) { |
7351 | for(unsigned i = 0; i < num2; i++) { |
7352 | n0->add_req(_in[i + idx2]); |
7353 | } |
7354 | } |
7355 | else n0->add_req(tmp2); |
7356 | result = n0->Expand( state, proj_list, mem ); |
7357 | |
7358 | cmovI_reg_lNode *n1 = new cmovI_reg_lNode(); |
7359 | n1->add_req(_in[0]); |
7360 | n1->set_opnd_array(0, state->MachOperGenerator(RREGI)); |
7361 | n1->set_opnd_array(1, opnd_array(1)->clone()); // dst |
7362 | if(tmp1 == this) { |
7363 | for(unsigned i = 0; i < num1; i++) { |
7364 | n1->add_req(_in[i + idx1]); |
7365 | } |
7366 | } |
7367 | else n1->add_req(tmp1); |
7368 | tmp1 = n1; |
7369 | n1->set_opnd_array(2, opnd_array(2)->clone()); // src |
7370 | if(tmp2 == this) { |
7371 | for(unsigned i = 0; i < num2; i++) { |
7372 | n1->add_req(_in[i + idx2]); |
7373 | } |
7374 | } |
7375 | else n1->add_req(tmp2); |
7376 | n1->set_opnd_array(3, op0->clone()); // cr |
7377 | if(tmp3 != NULL__null) |
7378 | n1->add_req(tmp3); |
7379 | result = n1->Expand( state, proj_list, mem ); |
7380 | |
7381 | |
7382 | return result; |
7383 | } |
7384 | |
7385 | MachNode* jmpLoopEnd_and_restoreMaskNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
7386 | Compile* C = Compile::current(); |
7387 | // Add projection edges for additional defs or kills |
7388 | // TEMP ktmp |
7389 | MachTempNode *def; |
7390 | def = new MachTempNode(state->MachOperGenerator(KREG_K1)); |
7391 | add_req(def); |
7392 | |
7393 | return this; |
7394 | } |
7395 | |
7396 | MachNode* jmpLoopEndU_and_restoreMaskNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
7397 | Compile* C = Compile::current(); |
7398 | // Add projection edges for additional defs or kills |
7399 | // TEMP ktmp |
7400 | MachTempNode *def; |
7401 | def = new MachTempNode(state->MachOperGenerator(KREG_K1)); |
7402 | add_req(def); |
7403 | |
7404 | return this; |
7405 | } |
7406 | |
7407 | MachNode* jmpLoopEndUCF_and_restoreMaskNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
7408 | Compile* C = Compile::current(); |
7409 | // Add projection edges for additional defs or kills |
7410 | // TEMP ktmp |
7411 | MachTempNode *def; |
7412 | def = new MachTempNode(state->MachOperGenerator(KREG_K1)); |
7413 | add_req(def); |
7414 | |
7415 | return this; |
7416 | } |
7417 | |
7418 | MachNode* partialSubtypeCheckNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
7419 | Compile* C = Compile::current(); |
7420 | // Add projection edges for additional defs or kills |
7421 | // DEF/KILL rcx |
7422 | MachProjNode *kill; |
7423 | kill = new MachProjNode( this, 1, (INT_RCX_REG_mask()), Op_RegI ); |
7424 | proj_list.push(kill); |
7425 | // DEF/KILL cr |
7426 | kill = new MachProjNode( this, 2, (INT_FLAGS_mask()), Op_RegFlags ); |
7427 | proj_list.push(kill); |
7428 | |
7429 | return this; |
7430 | } |
7431 | |
7432 | MachNode* partialSubtypeCheck_vs_ZeroNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
7433 | Compile* C = Compile::current(); |
7434 | // Add projection edges for additional defs or kills |
7435 | // DEF/KILL rcx |
7436 | MachProjNode *kill; |
7437 | kill = new MachProjNode( this, 1, (INT_RCX_REG_mask()), Op_RegI ); |
7438 | proj_list.push(kill); |
7439 | // DEF/KILL result |
7440 | kill = new MachProjNode( this, 2, (PTR_RDI_REG_mask()), Op_RegP ); |
7441 | proj_list.push(kill); |
7442 | |
7443 | return this; |
7444 | } |
7445 | |
7446 | MachNode* cmpFastLockRTMNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
7447 | Compile* C = Compile::current(); |
7448 | // Add projection edges for additional defs or kills |
7449 | // DEF/KILL box |
7450 | MachProjNode *kill; |
7451 | kill = new MachProjNode( this, 1, (PTR_RBX_REG_mask()), Op_RegP ); |
7452 | proj_list.push(kill); |
7453 | // TEMP tmp |
7454 | MachTempNode *def; |
7455 | def = new MachTempNode(state->MachOperGenerator(RAX_REGI)); |
7456 | add_req(def); |
7457 | // TEMP scr |
7458 | def = new MachTempNode(state->MachOperGenerator(RDX_REGI)); |
7459 | add_req(def); |
7460 | // TEMP cx1 |
7461 | def = new MachTempNode(state->MachOperGenerator(RREGI)); |
7462 | add_req(def); |
7463 | // TEMP cx2 |
7464 | def = new MachTempNode(state->MachOperGenerator(RREGI)); |
7465 | add_req(def); |
7466 | |
7467 | return this; |
7468 | } |
7469 | |
7470 | MachNode* cmpFastLockNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
7471 | Compile* C = Compile::current(); |
7472 | // Add projection edges for additional defs or kills |
7473 | // DEF/KILL box |
7474 | MachProjNode *kill; |
7475 | kill = new MachProjNode( this, 1, (PTR_RBX_REG_mask()), Op_RegP ); |
7476 | proj_list.push(kill); |
7477 | // TEMP tmp |
7478 | MachTempNode *def; |
7479 | def = new MachTempNode(state->MachOperGenerator(RAX_REGI)); |
7480 | add_req(def); |
7481 | // TEMP scr |
7482 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
7483 | add_req(def); |
7484 | // TEMP cx1 |
7485 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
7486 | add_req(def); |
7487 | |
7488 | return this; |
7489 | } |
7490 | |
7491 | MachNode* cmpFastUnlockNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
7492 | Compile* C = Compile::current(); |
7493 | // Add projection edges for additional defs or kills |
7494 | // DEF/KILL box |
7495 | MachProjNode *kill; |
7496 | kill = new MachProjNode( this, 1, (PTR_RAX_REG_mask()), Op_RegP ); |
7497 | proj_list.push(kill); |
7498 | // TEMP tmp |
7499 | MachTempNode *def; |
7500 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
7501 | add_req(def); |
7502 | |
7503 | return this; |
7504 | } |
7505 | |
7506 | MachNode* safePoint_poll_tlsNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
7507 | Compile* C = Compile::current(); |
7508 | // Add projection edges for additional defs or kills |
7509 | // DEF/KILL cr |
7510 | MachProjNode *kill; |
7511 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
7512 | proj_list.push(kill); |
7513 | |
7514 | return this; |
7515 | } |
7516 | |
7517 | MachNode* setMaskNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
7518 | Compile* C = Compile::current(); |
7519 | // Add projection edges for additional defs or kills |
7520 | // TEMP dst |
7521 | MachTempNode *def; |
7522 | def = new MachTempNode(state->MachOperGenerator(RREGI)); |
7523 | add_req(def); |
7524 | |
7525 | return this; |
7526 | } |
7527 | |
7528 | MachNode* addF_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
7529 | Compile* C = Compile::current(); |
7530 | add_req(C->mach_constant_base_node()); |
7531 | |
7532 | return this; |
7533 | } |
7534 | |
7535 | MachNode* addF_reg_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
7536 | Compile* C = Compile::current(); |
7537 | add_req(C->mach_constant_base_node()); |
7538 | |
7539 | return this; |
7540 | } |
7541 | |
7542 | MachNode* addD_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
7543 | Compile* C = Compile::current(); |
7544 | add_req(C->mach_constant_base_node()); |
7545 | |
7546 | return this; |
7547 | } |
7548 | |
7549 | MachNode* addD_reg_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
7550 | Compile* C = Compile::current(); |
7551 | add_req(C->mach_constant_base_node()); |
7552 | |
7553 | return this; |
7554 | } |
7555 | |
7556 | MachNode* subF_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
7557 | Compile* C = Compile::current(); |
7558 | add_req(C->mach_constant_base_node()); |
7559 | |
7560 | return this; |
7561 | } |
7562 | |
7563 | MachNode* subF_reg_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
7564 | Compile* C = Compile::current(); |
7565 | add_req(C->mach_constant_base_node()); |
7566 | |
7567 | return this; |
7568 | } |
7569 | |
7570 | MachNode* subD_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
7571 | Compile* C = Compile::current(); |
7572 | add_req(C->mach_constant_base_node()); |
7573 | |
7574 | return this; |
7575 | } |
7576 | |
7577 | MachNode* subD_reg_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
7578 | Compile* C = Compile::current(); |
7579 | add_req(C->mach_constant_base_node()); |
7580 | |
7581 | return this; |
7582 | } |
7583 | |
7584 | MachNode* mulF_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
7585 | Compile* C = Compile::current(); |
7586 | add_req(C->mach_constant_base_node()); |
7587 | |
7588 | return this; |
7589 | } |
7590 | |
7591 | MachNode* mulF_reg_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
7592 | Compile* C = Compile::current(); |
7593 | add_req(C->mach_constant_base_node()); |
7594 | |
7595 | return this; |
7596 | } |
7597 | |
7598 | MachNode* mulD_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
7599 | Compile* C = Compile::current(); |
7600 | add_req(C->mach_constant_base_node()); |
7601 | |
7602 | return this; |
7603 | } |
7604 | |
7605 | MachNode* mulD_reg_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
7606 | Compile* C = Compile::current(); |
7607 | add_req(C->mach_constant_base_node()); |
7608 | |
7609 | return this; |
7610 | } |
7611 | |
7612 | MachNode* divF_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
7613 | Compile* C = Compile::current(); |
7614 | add_req(C->mach_constant_base_node()); |
7615 | |
7616 | return this; |
7617 | } |
7618 | |
7619 | MachNode* divF_reg_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
7620 | Compile* C = Compile::current(); |
7621 | add_req(C->mach_constant_base_node()); |
7622 | |
7623 | return this; |
7624 | } |
7625 | |
7626 | MachNode* divD_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
7627 | Compile* C = Compile::current(); |
7628 | add_req(C->mach_constant_base_node()); |
7629 | |
7630 | return this; |
7631 | } |
7632 | |
7633 | MachNode* divD_reg_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
7634 | Compile* C = Compile::current(); |
7635 | add_req(C->mach_constant_base_node()); |
7636 | |
7637 | return this; |
7638 | } |
7639 | |
7640 | MachNode* reinterpret_mask_W2BNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
7641 | Compile* C = Compile::current(); |
7642 | // Add projection edges for additional defs or kills |
7643 | // TEMP xtmp |
7644 | MachTempNode *def; |
7645 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
7646 | add_req(def); |
7647 | |
7648 | return this; |
7649 | } |
7650 | |
7651 | MachNode* reinterpret_mask_D2BNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
7652 | Compile* C = Compile::current(); |
7653 | // Add projection edges for additional defs or kills |
7654 | // TEMP xtmp |
7655 | MachTempNode *def; |
7656 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
7657 | add_req(def); |
7658 | |
7659 | return this; |
7660 | } |
7661 | |
7662 | MachNode* reinterpret_mask_Q2BNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
7663 | Compile* C = Compile::current(); |
7664 | // Add projection edges for additional defs or kills |
7665 | // TEMP xtmp |
7666 | MachTempNode *def; |
7667 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
7668 | add_req(def); |
7669 | |
7670 | return this; |
7671 | } |
7672 | |
7673 | MachNode* reinterpret_expandNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
7674 | Compile* C = Compile::current(); |
7675 | // Add projection edges for additional defs or kills |
7676 | // TEMP dst |
7677 | MachTempNode *def; |
7678 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
7679 | add_req(def); |
7680 | // TEMP scratch |
7681 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
7682 | add_req(def); |
7683 | |
7684 | return this; |
7685 | } |
7686 | |
7687 | MachNode* vreinterpret_expand4Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
7688 | Compile* C = Compile::current(); |
7689 | // Add projection edges for additional defs or kills |
7690 | // TEMP scratch |
7691 | MachTempNode *def; |
7692 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
7693 | add_req(def); |
7694 | |
7695 | return this; |
7696 | } |
7697 | |
7698 | MachNode* roundD_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
7699 | Compile* C = Compile::current(); |
7700 | // Add projection edges for additional defs or kills |
7701 | // TEMP scratch_reg |
7702 | MachTempNode *def; |
7703 | def = new MachTempNode(state->MachOperGenerator(RREGI)); |
7704 | add_req(def); |
7705 | add_req(C->mach_constant_base_node()); |
7706 | |
7707 | return this; |
7708 | } |
7709 | |
7710 | MachNode* gatherNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
7711 | Compile* C = Compile::current(); |
7712 | // Add projection edges for additional defs or kills |
7713 | // TEMP dst |
7714 | MachTempNode *def; |
7715 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
7716 | add_req(def); |
7717 | // TEMP tmp |
7718 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
7719 | add_req(def); |
7720 | // TEMP mask |
7721 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
7722 | add_req(def); |
7723 | |
7724 | return this; |
7725 | } |
7726 | |
7727 | MachNode* evgatherNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
7728 | Compile* C = Compile::current(); |
7729 | // Add projection edges for additional defs or kills |
7730 | // TEMP dst |
7731 | MachTempNode *def; |
7732 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
7733 | add_req(def); |
7734 | // TEMP tmp |
7735 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
7736 | add_req(def); |
7737 | // TEMP ktmp |
7738 | def = new MachTempNode(state->MachOperGenerator(KREG)); |
7739 | add_req(def); |
7740 | |
7741 | return this; |
7742 | } |
7743 | |
7744 | MachNode* evgather_maskedNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
7745 | Compile* C = Compile::current(); |
7746 | // Add projection edges for additional defs or kills |
7747 | // TEMP dst |
7748 | MachTempNode *def; |
7749 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
7750 | add_req(def); |
7751 | // TEMP ktmp |
7752 | def = new MachTempNode(state->MachOperGenerator(KREG)); |
7753 | add_req(def); |
7754 | // TEMP tmp |
7755 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
7756 | add_req(def); |
7757 | |
7758 | return this; |
7759 | } |
7760 | |
7761 | MachNode* scatterNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
7762 | Compile* C = Compile::current(); |
7763 | // Add projection edges for additional defs or kills |
7764 | // TEMP tmp |
7765 | MachTempNode *def; |
7766 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
7767 | add_req(def); |
7768 | // TEMP ktmp |
7769 | def = new MachTempNode(state->MachOperGenerator(KREG)); |
7770 | add_req(def); |
7771 | |
7772 | return this; |
7773 | } |
7774 | |
7775 | MachNode* scatter_maskedNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
7776 | Compile* C = Compile::current(); |
7777 | // Add projection edges for additional defs or kills |
7778 | // TEMP ktmp |
7779 | MachTempNode *def; |
7780 | def = new MachTempNode(state->MachOperGenerator(KREG)); |
7781 | add_req(def); |
7782 | // TEMP tmp |
7783 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
7784 | add_req(def); |
7785 | |
7786 | return this; |
7787 | } |
7788 | |
7789 | MachNode* ReplB_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
7790 | Compile* C = Compile::current(); |
7791 | add_req(C->mach_constant_base_node()); |
7792 | |
7793 | return this; |
7794 | } |
7795 | |
7796 | MachNode* ReplS_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
7797 | Compile* C = Compile::current(); |
7798 | add_req(C->mach_constant_base_node()); |
7799 | |
7800 | return this; |
7801 | } |
7802 | |
7803 | MachNode* ReplI_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
7804 | Compile* C = Compile::current(); |
7805 | add_req(C->mach_constant_base_node()); |
7806 | |
7807 | return this; |
7808 | } |
7809 | |
7810 | MachNode* ReplI_M1Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
7811 | Compile* C = Compile::current(); |
7812 | // Add projection edges for additional defs or kills |
7813 | // TEMP dst |
7814 | MachTempNode *def; |
7815 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
7816 | add_req(def); |
7817 | |
7818 | return this; |
7819 | } |
7820 | |
7821 | MachNode* ReplI_M1_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
7822 | Compile* C = Compile::current(); |
7823 | // Add projection edges for additional defs or kills |
7824 | // TEMP dst |
7825 | MachTempNode *def; |
7826 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
7827 | add_req(def); |
7828 | |
7829 | return this; |
7830 | } |
7831 | |
7832 | MachNode* ReplI_M1_1Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
7833 | Compile* C = Compile::current(); |
7834 | // Add projection edges for additional defs or kills |
7835 | // TEMP dst |
7836 | MachTempNode *def; |
7837 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
7838 | add_req(def); |
7839 | |
7840 | return this; |
7841 | } |
7842 | |
7843 | MachNode* ReplL_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
7844 | Compile* C = Compile::current(); |
7845 | add_req(C->mach_constant_base_node()); |
7846 | |
7847 | return this; |
7848 | } |
7849 | |
7850 | MachNode* ReplL_M1Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
7851 | Compile* C = Compile::current(); |
7852 | // Add projection edges for additional defs or kills |
7853 | // TEMP dst |
7854 | MachTempNode *def; |
7855 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
7856 | add_req(def); |
7857 | |
7858 | return this; |
7859 | } |
7860 | |
7861 | MachNode* insert32Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
7862 | Compile* C = Compile::current(); |
7863 | // Add projection edges for additional defs or kills |
7864 | // TEMP vtmp |
7865 | MachTempNode *def; |
7866 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
7867 | add_req(def); |
7868 | |
7869 | return this; |
7870 | } |
7871 | |
7872 | MachNode* insert64Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
7873 | Compile* C = Compile::current(); |
7874 | // Add projection edges for additional defs or kills |
7875 | // TEMP vtmp |
7876 | MachTempNode *def; |
7877 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
7878 | add_req(def); |
7879 | |
7880 | return this; |
7881 | } |
7882 | |
7883 | MachNode* insert4LNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
7884 | Compile* C = Compile::current(); |
7885 | // Add projection edges for additional defs or kills |
7886 | // TEMP vtmp |
7887 | MachTempNode *def; |
7888 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
7889 | add_req(def); |
7890 | |
7891 | return this; |
7892 | } |
7893 | |
7894 | MachNode* insert8LNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
7895 | Compile* C = Compile::current(); |
7896 | // Add projection edges for additional defs or kills |
7897 | // TEMP vtmp |
7898 | MachTempNode *def; |
7899 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
7900 | add_req(def); |
7901 | |
7902 | return this; |
7903 | } |
7904 | |
7905 | MachNode* vinsertFNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
7906 | Compile* C = Compile::current(); |
7907 | // Add projection edges for additional defs or kills |
7908 | // TEMP vtmp |
7909 | MachTempNode *def; |
7910 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
7911 | add_req(def); |
7912 | |
7913 | return this; |
7914 | } |
7915 | |
7916 | MachNode* insert2DNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
7917 | Compile* C = Compile::current(); |
7918 | // Add projection edges for additional defs or kills |
7919 | // TEMP tmp |
7920 | MachTempNode *def; |
7921 | def = new MachTempNode(state->MachOperGenerator(RREGL)); |
7922 | add_req(def); |
7923 | |
7924 | return this; |
7925 | } |
7926 | |
7927 | MachNode* insert4DNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
7928 | Compile* C = Compile::current(); |
7929 | // Add projection edges for additional defs or kills |
7930 | // TEMP tmp |
7931 | MachTempNode *def; |
7932 | def = new MachTempNode(state->MachOperGenerator(RREGL)); |
7933 | add_req(def); |
7934 | // TEMP vtmp |
7935 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
7936 | add_req(def); |
7937 | |
7938 | return this; |
7939 | } |
7940 | |
7941 | MachNode* insert8DNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
7942 | Compile* C = Compile::current(); |
7943 | // Add projection edges for additional defs or kills |
7944 | // TEMP tmp |
7945 | MachTempNode *def; |
7946 | def = new MachTempNode(state->MachOperGenerator(RREGL)); |
7947 | add_req(def); |
7948 | // TEMP vtmp |
7949 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
7950 | add_req(def); |
7951 | |
7952 | return this; |
7953 | } |
7954 | |
7955 | MachNode* reductionINode::Expand(State* state, Node_List& proj_list, Node* mem) { |
7956 | Compile* C = Compile::current(); |
7957 | // Add projection edges for additional defs or kills |
7958 | // TEMP vtmp1 |
7959 | MachTempNode *def; |
7960 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
7961 | add_req(def); |
7962 | // TEMP vtmp2 |
7963 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
7964 | add_req(def); |
7965 | |
7966 | return this; |
7967 | } |
7968 | |
7969 | MachNode* reductionI_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
7970 | Compile* C = Compile::current(); |
7971 | // Add projection edges for additional defs or kills |
7972 | // TEMP vtmp1 |
7973 | MachTempNode *def; |
7974 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
7975 | add_req(def); |
7976 | // TEMP vtmp2 |
7977 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
7978 | add_req(def); |
7979 | |
7980 | return this; |
7981 | } |
7982 | |
7983 | MachNode* reductionI_1Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
7984 | Compile* C = Compile::current(); |
7985 | // Add projection edges for additional defs or kills |
7986 | // TEMP vtmp1 |
7987 | MachTempNode *def; |
7988 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
7989 | add_req(def); |
7990 | // TEMP vtmp2 |
7991 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
7992 | add_req(def); |
7993 | |
7994 | return this; |
7995 | } |
7996 | |
7997 | MachNode* reductionI_2Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
7998 | Compile* C = Compile::current(); |
7999 | // Add projection edges for additional defs or kills |
8000 | // TEMP vtmp1 |
8001 | MachTempNode *def; |
8002 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
8003 | add_req(def); |
8004 | // TEMP vtmp2 |
8005 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
8006 | add_req(def); |
8007 | |
8008 | return this; |
8009 | } |
8010 | |
8011 | MachNode* reductionI_3Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
8012 | Compile* C = Compile::current(); |
8013 | // Add projection edges for additional defs or kills |
8014 | // TEMP vtmp1 |
8015 | MachTempNode *def; |
8016 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
8017 | add_req(def); |
8018 | // TEMP vtmp2 |
8019 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
8020 | add_req(def); |
8021 | |
8022 | return this; |
8023 | } |
8024 | |
8025 | MachNode* reductionI_4Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
8026 | Compile* C = Compile::current(); |
8027 | // Add projection edges for additional defs or kills |
8028 | // TEMP vtmp1 |
8029 | MachTempNode *def; |
8030 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
8031 | add_req(def); |
8032 | // TEMP vtmp2 |
8033 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
8034 | add_req(def); |
8035 | |
8036 | return this; |
8037 | } |
8038 | |
8039 | MachNode* reductionI_5Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
8040 | Compile* C = Compile::current(); |
8041 | // Add projection edges for additional defs or kills |
8042 | // TEMP vtmp1 |
8043 | MachTempNode *def; |
8044 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
8045 | add_req(def); |
8046 | // TEMP vtmp2 |
8047 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
8048 | add_req(def); |
8049 | |
8050 | return this; |
8051 | } |
8052 | |
8053 | MachNode* reductionLNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
8054 | Compile* C = Compile::current(); |
8055 | // Add projection edges for additional defs or kills |
8056 | // TEMP vtmp1 |
8057 | MachTempNode *def; |
8058 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
8059 | add_req(def); |
8060 | // TEMP vtmp2 |
8061 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
8062 | add_req(def); |
8063 | |
8064 | return this; |
8065 | } |
8066 | |
8067 | MachNode* reductionL_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
8068 | Compile* C = Compile::current(); |
8069 | // Add projection edges for additional defs or kills |
8070 | // TEMP vtmp1 |
8071 | MachTempNode *def; |
8072 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
8073 | add_req(def); |
8074 | // TEMP vtmp2 |
8075 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
8076 | add_req(def); |
8077 | |
8078 | return this; |
8079 | } |
8080 | |
8081 | MachNode* reductionL_1Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
8082 | Compile* C = Compile::current(); |
8083 | // Add projection edges for additional defs or kills |
8084 | // TEMP vtmp1 |
8085 | MachTempNode *def; |
8086 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
8087 | add_req(def); |
8088 | // TEMP vtmp2 |
8089 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
8090 | add_req(def); |
8091 | |
8092 | return this; |
8093 | } |
8094 | |
8095 | MachNode* reductionL_2Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
8096 | Compile* C = Compile::current(); |
8097 | // Add projection edges for additional defs or kills |
8098 | // TEMP vtmp1 |
8099 | MachTempNode *def; |
8100 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
8101 | add_req(def); |
8102 | // TEMP vtmp2 |
8103 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
8104 | add_req(def); |
8105 | |
8106 | return this; |
8107 | } |
8108 | |
8109 | MachNode* reductionL_3Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
8110 | Compile* C = Compile::current(); |
8111 | // Add projection edges for additional defs or kills |
8112 | // TEMP vtmp1 |
8113 | MachTempNode *def; |
8114 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
8115 | add_req(def); |
8116 | // TEMP vtmp2 |
8117 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
8118 | add_req(def); |
8119 | |
8120 | return this; |
8121 | } |
8122 | |
8123 | MachNode* reductionL_4Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
8124 | Compile* C = Compile::current(); |
8125 | // Add projection edges for additional defs or kills |
8126 | // TEMP vtmp1 |
8127 | MachTempNode *def; |
8128 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
8129 | add_req(def); |
8130 | // TEMP vtmp2 |
8131 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
8132 | add_req(def); |
8133 | |
8134 | return this; |
8135 | } |
8136 | |
8137 | MachNode* reductionL_5Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
8138 | Compile* C = Compile::current(); |
8139 | // Add projection edges for additional defs or kills |
8140 | // TEMP vtmp1 |
8141 | MachTempNode *def; |
8142 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
8143 | add_req(def); |
8144 | // TEMP vtmp2 |
8145 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
8146 | add_req(def); |
8147 | |
8148 | return this; |
8149 | } |
8150 | |
8151 | MachNode* reductionL_avx512dqNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
8152 | Compile* C = Compile::current(); |
8153 | // Add projection edges for additional defs or kills |
8154 | // TEMP vtmp1 |
8155 | MachTempNode *def; |
8156 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
8157 | add_req(def); |
8158 | // TEMP vtmp2 |
8159 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
8160 | add_req(def); |
8161 | |
8162 | return this; |
8163 | } |
8164 | |
8165 | MachNode* reductionL_avx512dq_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
8166 | Compile* C = Compile::current(); |
8167 | // Add projection edges for additional defs or kills |
8168 | // TEMP vtmp1 |
8169 | MachTempNode *def; |
8170 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
8171 | add_req(def); |
8172 | // TEMP vtmp2 |
8173 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
8174 | add_req(def); |
8175 | |
8176 | return this; |
8177 | } |
8178 | |
8179 | MachNode* reductionL_avx512dq_1Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
8180 | Compile* C = Compile::current(); |
8181 | // Add projection edges for additional defs or kills |
8182 | // TEMP vtmp1 |
8183 | MachTempNode *def; |
8184 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
8185 | add_req(def); |
8186 | // TEMP vtmp2 |
8187 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
8188 | add_req(def); |
8189 | |
8190 | return this; |
8191 | } |
8192 | |
8193 | MachNode* reductionL_avx512dq_2Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
8194 | Compile* C = Compile::current(); |
8195 | // Add projection edges for additional defs or kills |
8196 | // TEMP vtmp1 |
8197 | MachTempNode *def; |
8198 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
8199 | add_req(def); |
8200 | // TEMP vtmp2 |
8201 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
8202 | add_req(def); |
8203 | |
8204 | return this; |
8205 | } |
8206 | |
8207 | MachNode* reductionL_avx512dq_3Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
8208 | Compile* C = Compile::current(); |
8209 | // Add projection edges for additional defs or kills |
8210 | // TEMP vtmp1 |
8211 | MachTempNode *def; |
8212 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
8213 | add_req(def); |
8214 | // TEMP vtmp2 |
8215 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
8216 | add_req(def); |
8217 | |
8218 | return this; |
8219 | } |
8220 | |
8221 | MachNode* reductionL_avx512dq_4Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
8222 | Compile* C = Compile::current(); |
8223 | // Add projection edges for additional defs or kills |
8224 | // TEMP vtmp1 |
8225 | MachTempNode *def; |
8226 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
8227 | add_req(def); |
8228 | // TEMP vtmp2 |
8229 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
8230 | add_req(def); |
8231 | |
8232 | return this; |
8233 | } |
8234 | |
8235 | MachNode* reductionL_avx512dq_5Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
8236 | Compile* C = Compile::current(); |
8237 | // Add projection edges for additional defs or kills |
8238 | // TEMP vtmp1 |
8239 | MachTempNode *def; |
8240 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
8241 | add_req(def); |
8242 | // TEMP vtmp2 |
8243 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
8244 | add_req(def); |
8245 | |
8246 | return this; |
8247 | } |
8248 | |
8249 | MachNode* reductionF128Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
8250 | Compile* C = Compile::current(); |
8251 | // Add projection edges for additional defs or kills |
8252 | // TEMP dst |
8253 | MachTempNode *def; |
8254 | def = new MachTempNode(state->MachOperGenerator(REGF)); |
8255 | add_req(def); |
8256 | // TEMP vtmp |
8257 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
8258 | add_req(def); |
8259 | // Remove duplicated operands and inputs which use the same name. |
8260 | if (num_opnds() == 5) { |
8261 | unsigned num0 = 0; |
8262 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
8263 | unsigned num2 = opnd_array(2)->num_edges(); // src |
8264 | unsigned num3 = opnd_array(3)->num_edges(); // dst |
8265 | unsigned num4 = opnd_array(4)->num_edges(); // vtmp |
8266 | unsigned idx0 = oper_input_base(); |
8267 | unsigned idx1 = idx0 + num0; |
8268 | unsigned idx2 = idx1 + num1; |
8269 | unsigned idx3 = idx2 + num2; |
8270 | unsigned idx4 = idx3 + num3; |
8271 | unsigned idx5 = idx4 + num4; |
8272 | set_opnd_array(3, opnd_array(4)->clone()); // vtmp |
8273 | for (unsigned i = 0; i < num4; i++) { |
8274 | set_req(i + idx3, _in[i + idx4]); |
8275 | } |
8276 | num3 = num4; |
8277 | idx4 = idx3 + num3; |
8278 | for (int i = idx5 - 1; i >= (int)idx4; i--) { |
8279 | del_req(i); |
8280 | } |
8281 | _num_opnds = 4; |
8282 | } else { |
8283 | assert(_num_opnds == 4, "There should be either 4 or 5 operands.")do { if (!(_num_opnds == 4)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 8282, "assert(" "_num_opnds == 4" ") failed" , "There should be either 4 or 5 operands."); ::breakpoint(); } } while (0); |
8284 | } |
8285 | |
8286 | return this; |
8287 | } |
8288 | |
8289 | MachNode* reductionF128_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
8290 | Compile* C = Compile::current(); |
8291 | // Add projection edges for additional defs or kills |
8292 | // TEMP dst |
8293 | MachTempNode *def; |
8294 | def = new MachTempNode(state->MachOperGenerator(REGF)); |
8295 | add_req(def); |
8296 | // TEMP vtmp |
8297 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
8298 | add_req(def); |
8299 | // Remove duplicated operands and inputs which use the same name. |
8300 | if (num_opnds() == 5) { |
8301 | unsigned num0 = 0; |
8302 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
8303 | unsigned num2 = opnd_array(2)->num_edges(); // src |
8304 | unsigned num3 = opnd_array(3)->num_edges(); // dst |
8305 | unsigned num4 = opnd_array(4)->num_edges(); // vtmp |
8306 | unsigned idx0 = oper_input_base(); |
8307 | unsigned idx1 = idx0 + num0; |
8308 | unsigned idx2 = idx1 + num1; |
8309 | unsigned idx3 = idx2 + num2; |
8310 | unsigned idx4 = idx3 + num3; |
8311 | unsigned idx5 = idx4 + num4; |
8312 | set_opnd_array(3, opnd_array(4)->clone()); // vtmp |
8313 | for (unsigned i = 0; i < num4; i++) { |
8314 | set_req(i + idx3, _in[i + idx4]); |
8315 | } |
8316 | num3 = num4; |
8317 | idx4 = idx3 + num3; |
8318 | for (int i = idx5 - 1; i >= (int)idx4; i--) { |
8319 | del_req(i); |
8320 | } |
8321 | _num_opnds = 4; |
8322 | } else { |
8323 | assert(_num_opnds == 4, "There should be either 4 or 5 operands.")do { if (!(_num_opnds == 4)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 8322, "assert(" "_num_opnds == 4" ") failed" , "There should be either 4 or 5 operands."); ::breakpoint(); } } while (0); |
8324 | } |
8325 | |
8326 | return this; |
8327 | } |
8328 | |
8329 | MachNode* reduction8FNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
8330 | Compile* C = Compile::current(); |
8331 | // Add projection edges for additional defs or kills |
8332 | // TEMP dst |
8333 | MachTempNode *def; |
8334 | def = new MachTempNode(state->MachOperGenerator(REGF)); |
8335 | add_req(def); |
8336 | // TEMP vtmp1 |
8337 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
8338 | add_req(def); |
8339 | // TEMP vtmp2 |
8340 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
8341 | add_req(def); |
8342 | // Remove duplicated operands and inputs which use the same name. |
8343 | if (num_opnds() == 6) { |
8344 | unsigned num0 = 0; |
8345 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
8346 | unsigned num2 = opnd_array(2)->num_edges(); // src |
8347 | unsigned num3 = opnd_array(3)->num_edges(); // dst |
8348 | unsigned num4 = opnd_array(4)->num_edges(); // vtmp1 |
8349 | unsigned num5 = opnd_array(5)->num_edges(); // vtmp2 |
8350 | unsigned idx0 = oper_input_base(); |
8351 | unsigned idx1 = idx0 + num0; |
8352 | unsigned idx2 = idx1 + num1; |
8353 | unsigned idx3 = idx2 + num2; |
8354 | unsigned idx4 = idx3 + num3; |
8355 | unsigned idx5 = idx4 + num4; |
8356 | unsigned idx6 = idx5 + num5; |
8357 | set_opnd_array(3, opnd_array(4)->clone()); // vtmp1 |
8358 | for (unsigned i = 0; i < num4; i++) { |
8359 | set_req(i + idx3, _in[i + idx4]); |
8360 | } |
8361 | num3 = num4; |
8362 | idx4 = idx3 + num3; |
8363 | set_opnd_array(4, opnd_array(5)->clone()); // vtmp2 |
8364 | for (unsigned i = 0; i < num5; i++) { |
8365 | set_req(i + idx4, _in[i + idx5]); |
8366 | } |
8367 | num4 = num5; |
8368 | idx5 = idx4 + num4; |
8369 | for (int i = idx6 - 1; i >= (int)idx5; i--) { |
8370 | del_req(i); |
8371 | } |
8372 | _num_opnds = 5; |
8373 | } else { |
8374 | assert(_num_opnds == 5, "There should be either 5 or 6 operands.")do { if (!(_num_opnds == 5)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 8373, "assert(" "_num_opnds == 5" ") failed" , "There should be either 5 or 6 operands."); ::breakpoint(); } } while (0); |
8375 | } |
8376 | |
8377 | return this; |
8378 | } |
8379 | |
8380 | MachNode* reduction8F_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
8381 | Compile* C = Compile::current(); |
8382 | // Add projection edges for additional defs or kills |
8383 | // TEMP dst |
8384 | MachTempNode *def; |
8385 | def = new MachTempNode(state->MachOperGenerator(REGF)); |
8386 | add_req(def); |
8387 | // TEMP vtmp1 |
8388 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
8389 | add_req(def); |
8390 | // TEMP vtmp2 |
8391 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
8392 | add_req(def); |
8393 | // Remove duplicated operands and inputs which use the same name. |
8394 | if (num_opnds() == 6) { |
8395 | unsigned num0 = 0; |
8396 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
8397 | unsigned num2 = opnd_array(2)->num_edges(); // src |
8398 | unsigned num3 = opnd_array(3)->num_edges(); // dst |
8399 | unsigned num4 = opnd_array(4)->num_edges(); // vtmp1 |
8400 | unsigned num5 = opnd_array(5)->num_edges(); // vtmp2 |
8401 | unsigned idx0 = oper_input_base(); |
8402 | unsigned idx1 = idx0 + num0; |
8403 | unsigned idx2 = idx1 + num1; |
8404 | unsigned idx3 = idx2 + num2; |
8405 | unsigned idx4 = idx3 + num3; |
8406 | unsigned idx5 = idx4 + num4; |
8407 | unsigned idx6 = idx5 + num5; |
8408 | set_opnd_array(3, opnd_array(4)->clone()); // vtmp1 |
8409 | for (unsigned i = 0; i < num4; i++) { |
8410 | set_req(i + idx3, _in[i + idx4]); |
8411 | } |
8412 | num3 = num4; |
8413 | idx4 = idx3 + num3; |
8414 | set_opnd_array(4, opnd_array(5)->clone()); // vtmp2 |
8415 | for (unsigned i = 0; i < num5; i++) { |
8416 | set_req(i + idx4, _in[i + idx5]); |
8417 | } |
8418 | num4 = num5; |
8419 | idx5 = idx4 + num4; |
8420 | for (int i = idx6 - 1; i >= (int)idx5; i--) { |
8421 | del_req(i); |
8422 | } |
8423 | _num_opnds = 5; |
8424 | } else { |
8425 | assert(_num_opnds == 5, "There should be either 5 or 6 operands.")do { if (!(_num_opnds == 5)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 8424, "assert(" "_num_opnds == 5" ") failed" , "There should be either 5 or 6 operands."); ::breakpoint(); } } while (0); |
8426 | } |
8427 | |
8428 | return this; |
8429 | } |
8430 | |
8431 | MachNode* reduction16FNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
8432 | Compile* C = Compile::current(); |
8433 | // Add projection edges for additional defs or kills |
8434 | // TEMP dst |
8435 | MachTempNode *def; |
8436 | def = new MachTempNode(state->MachOperGenerator(REGF)); |
8437 | add_req(def); |
8438 | // TEMP vtmp1 |
8439 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
8440 | add_req(def); |
8441 | // TEMP vtmp2 |
8442 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
8443 | add_req(def); |
8444 | // Remove duplicated operands and inputs which use the same name. |
8445 | if (num_opnds() == 6) { |
8446 | unsigned num0 = 0; |
8447 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
8448 | unsigned num2 = opnd_array(2)->num_edges(); // src |
8449 | unsigned num3 = opnd_array(3)->num_edges(); // dst |
8450 | unsigned num4 = opnd_array(4)->num_edges(); // vtmp1 |
8451 | unsigned num5 = opnd_array(5)->num_edges(); // vtmp2 |
8452 | unsigned idx0 = oper_input_base(); |
8453 | unsigned idx1 = idx0 + num0; |
8454 | unsigned idx2 = idx1 + num1; |
8455 | unsigned idx3 = idx2 + num2; |
8456 | unsigned idx4 = idx3 + num3; |
8457 | unsigned idx5 = idx4 + num4; |
8458 | unsigned idx6 = idx5 + num5; |
8459 | set_opnd_array(3, opnd_array(4)->clone()); // vtmp1 |
8460 | for (unsigned i = 0; i < num4; i++) { |
8461 | set_req(i + idx3, _in[i + idx4]); |
8462 | } |
8463 | num3 = num4; |
8464 | idx4 = idx3 + num3; |
8465 | set_opnd_array(4, opnd_array(5)->clone()); // vtmp2 |
8466 | for (unsigned i = 0; i < num5; i++) { |
8467 | set_req(i + idx4, _in[i + idx5]); |
8468 | } |
8469 | num4 = num5; |
8470 | idx5 = idx4 + num4; |
8471 | for (int i = idx6 - 1; i >= (int)idx5; i--) { |
8472 | del_req(i); |
8473 | } |
8474 | _num_opnds = 5; |
8475 | } else { |
8476 | assert(_num_opnds == 5, "There should be either 5 or 6 operands.")do { if (!(_num_opnds == 5)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 8475, "assert(" "_num_opnds == 5" ") failed" , "There should be either 5 or 6 operands."); ::breakpoint(); } } while (0); |
8477 | } |
8478 | |
8479 | return this; |
8480 | } |
8481 | |
8482 | MachNode* reduction16F_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
8483 | Compile* C = Compile::current(); |
8484 | // Add projection edges for additional defs or kills |
8485 | // TEMP dst |
8486 | MachTempNode *def; |
8487 | def = new MachTempNode(state->MachOperGenerator(REGF)); |
8488 | add_req(def); |
8489 | // TEMP vtmp1 |
8490 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
8491 | add_req(def); |
8492 | // TEMP vtmp2 |
8493 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
8494 | add_req(def); |
8495 | // Remove duplicated operands and inputs which use the same name. |
8496 | if (num_opnds() == 6) { |
8497 | unsigned num0 = 0; |
8498 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
8499 | unsigned num2 = opnd_array(2)->num_edges(); // src |
8500 | unsigned num3 = opnd_array(3)->num_edges(); // dst |
8501 | unsigned num4 = opnd_array(4)->num_edges(); // vtmp1 |
8502 | unsigned num5 = opnd_array(5)->num_edges(); // vtmp2 |
8503 | unsigned idx0 = oper_input_base(); |
8504 | unsigned idx1 = idx0 + num0; |
8505 | unsigned idx2 = idx1 + num1; |
8506 | unsigned idx3 = idx2 + num2; |
8507 | unsigned idx4 = idx3 + num3; |
8508 | unsigned idx5 = idx4 + num4; |
8509 | unsigned idx6 = idx5 + num5; |
8510 | set_opnd_array(3, opnd_array(4)->clone()); // vtmp1 |
8511 | for (unsigned i = 0; i < num4; i++) { |
8512 | set_req(i + idx3, _in[i + idx4]); |
8513 | } |
8514 | num3 = num4; |
8515 | idx4 = idx3 + num3; |
8516 | set_opnd_array(4, opnd_array(5)->clone()); // vtmp2 |
8517 | for (unsigned i = 0; i < num5; i++) { |
8518 | set_req(i + idx4, _in[i + idx5]); |
8519 | } |
8520 | num4 = num5; |
8521 | idx5 = idx4 + num4; |
8522 | for (int i = idx6 - 1; i >= (int)idx5; i--) { |
8523 | del_req(i); |
8524 | } |
8525 | _num_opnds = 5; |
8526 | } else { |
8527 | assert(_num_opnds == 5, "There should be either 5 or 6 operands.")do { if (!(_num_opnds == 5)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 8526, "assert(" "_num_opnds == 5" ") failed" , "There should be either 5 or 6 operands."); ::breakpoint(); } } while (0); |
8528 | } |
8529 | |
8530 | return this; |
8531 | } |
8532 | |
8533 | MachNode* reduction2DNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
8534 | Compile* C = Compile::current(); |
8535 | // Add projection edges for additional defs or kills |
8536 | // TEMP dst |
8537 | MachTempNode *def; |
8538 | def = new MachTempNode(state->MachOperGenerator(REGD)); |
8539 | add_req(def); |
8540 | // TEMP vtmp |
8541 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
8542 | add_req(def); |
8543 | // Remove duplicated operands and inputs which use the same name. |
8544 | if (num_opnds() == 5) { |
8545 | unsigned num0 = 0; |
8546 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
8547 | unsigned num2 = opnd_array(2)->num_edges(); // src |
8548 | unsigned num3 = opnd_array(3)->num_edges(); // dst |
8549 | unsigned num4 = opnd_array(4)->num_edges(); // vtmp |
8550 | unsigned idx0 = oper_input_base(); |
8551 | unsigned idx1 = idx0 + num0; |
8552 | unsigned idx2 = idx1 + num1; |
8553 | unsigned idx3 = idx2 + num2; |
8554 | unsigned idx4 = idx3 + num3; |
8555 | unsigned idx5 = idx4 + num4; |
8556 | set_opnd_array(3, opnd_array(4)->clone()); // vtmp |
8557 | for (unsigned i = 0; i < num4; i++) { |
8558 | set_req(i + idx3, _in[i + idx4]); |
8559 | } |
8560 | num3 = num4; |
8561 | idx4 = idx3 + num3; |
8562 | for (int i = idx5 - 1; i >= (int)idx4; i--) { |
8563 | del_req(i); |
8564 | } |
8565 | _num_opnds = 4; |
8566 | } else { |
8567 | assert(_num_opnds == 4, "There should be either 4 or 5 operands.")do { if (!(_num_opnds == 4)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 8566, "assert(" "_num_opnds == 4" ") failed" , "There should be either 4 or 5 operands."); ::breakpoint(); } } while (0); |
8568 | } |
8569 | |
8570 | return this; |
8571 | } |
8572 | |
8573 | MachNode* reduction2D_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
8574 | Compile* C = Compile::current(); |
8575 | // Add projection edges for additional defs or kills |
8576 | // TEMP dst |
8577 | MachTempNode *def; |
8578 | def = new MachTempNode(state->MachOperGenerator(REGD)); |
8579 | add_req(def); |
8580 | // TEMP vtmp |
8581 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
8582 | add_req(def); |
8583 | // Remove duplicated operands and inputs which use the same name. |
8584 | if (num_opnds() == 5) { |
8585 | unsigned num0 = 0; |
8586 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
8587 | unsigned num2 = opnd_array(2)->num_edges(); // src |
8588 | unsigned num3 = opnd_array(3)->num_edges(); // dst |
8589 | unsigned num4 = opnd_array(4)->num_edges(); // vtmp |
8590 | unsigned idx0 = oper_input_base(); |
8591 | unsigned idx1 = idx0 + num0; |
8592 | unsigned idx2 = idx1 + num1; |
8593 | unsigned idx3 = idx2 + num2; |
8594 | unsigned idx4 = idx3 + num3; |
8595 | unsigned idx5 = idx4 + num4; |
8596 | set_opnd_array(3, opnd_array(4)->clone()); // vtmp |
8597 | for (unsigned i = 0; i < num4; i++) { |
8598 | set_req(i + idx3, _in[i + idx4]); |
8599 | } |
8600 | num3 = num4; |
8601 | idx4 = idx3 + num3; |
8602 | for (int i = idx5 - 1; i >= (int)idx4; i--) { |
8603 | del_req(i); |
8604 | } |
8605 | _num_opnds = 4; |
8606 | } else { |
8607 | assert(_num_opnds == 4, "There should be either 4 or 5 operands.")do { if (!(_num_opnds == 4)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 8606, "assert(" "_num_opnds == 4" ") failed" , "There should be either 4 or 5 operands."); ::breakpoint(); } } while (0); |
8608 | } |
8609 | |
8610 | return this; |
8611 | } |
8612 | |
8613 | MachNode* reduction4DNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
8614 | Compile* C = Compile::current(); |
8615 | // Add projection edges for additional defs or kills |
8616 | // TEMP dst |
8617 | MachTempNode *def; |
8618 | def = new MachTempNode(state->MachOperGenerator(REGD)); |
8619 | add_req(def); |
8620 | // TEMP vtmp1 |
8621 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
8622 | add_req(def); |
8623 | // TEMP vtmp2 |
8624 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
8625 | add_req(def); |
8626 | // Remove duplicated operands and inputs which use the same name. |
8627 | if (num_opnds() == 6) { |
8628 | unsigned num0 = 0; |
8629 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
8630 | unsigned num2 = opnd_array(2)->num_edges(); // src |
8631 | unsigned num3 = opnd_array(3)->num_edges(); // dst |
8632 | unsigned num4 = opnd_array(4)->num_edges(); // vtmp1 |
8633 | unsigned num5 = opnd_array(5)->num_edges(); // vtmp2 |
8634 | unsigned idx0 = oper_input_base(); |
8635 | unsigned idx1 = idx0 + num0; |
8636 | unsigned idx2 = idx1 + num1; |
8637 | unsigned idx3 = idx2 + num2; |
8638 | unsigned idx4 = idx3 + num3; |
8639 | unsigned idx5 = idx4 + num4; |
8640 | unsigned idx6 = idx5 + num5; |
8641 | set_opnd_array(3, opnd_array(4)->clone()); // vtmp1 |
8642 | for (unsigned i = 0; i < num4; i++) { |
8643 | set_req(i + idx3, _in[i + idx4]); |
8644 | } |
8645 | num3 = num4; |
8646 | idx4 = idx3 + num3; |
8647 | set_opnd_array(4, opnd_array(5)->clone()); // vtmp2 |
8648 | for (unsigned i = 0; i < num5; i++) { |
8649 | set_req(i + idx4, _in[i + idx5]); |
8650 | } |
8651 | num4 = num5; |
8652 | idx5 = idx4 + num4; |
8653 | for (int i = idx6 - 1; i >= (int)idx5; i--) { |
8654 | del_req(i); |
8655 | } |
8656 | _num_opnds = 5; |
8657 | } else { |
8658 | assert(_num_opnds == 5, "There should be either 5 or 6 operands.")do { if (!(_num_opnds == 5)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 8657, "assert(" "_num_opnds == 5" ") failed" , "There should be either 5 or 6 operands."); ::breakpoint(); } } while (0); |
8659 | } |
8660 | |
8661 | return this; |
8662 | } |
8663 | |
8664 | MachNode* reduction4D_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
8665 | Compile* C = Compile::current(); |
8666 | // Add projection edges for additional defs or kills |
8667 | // TEMP dst |
8668 | MachTempNode *def; |
8669 | def = new MachTempNode(state->MachOperGenerator(REGD)); |
8670 | add_req(def); |
8671 | // TEMP vtmp1 |
8672 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
8673 | add_req(def); |
8674 | // TEMP vtmp2 |
8675 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
8676 | add_req(def); |
8677 | // Remove duplicated operands and inputs which use the same name. |
8678 | if (num_opnds() == 6) { |
8679 | unsigned num0 = 0; |
8680 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
8681 | unsigned num2 = opnd_array(2)->num_edges(); // src |
8682 | unsigned num3 = opnd_array(3)->num_edges(); // dst |
8683 | unsigned num4 = opnd_array(4)->num_edges(); // vtmp1 |
8684 | unsigned num5 = opnd_array(5)->num_edges(); // vtmp2 |
8685 | unsigned idx0 = oper_input_base(); |
8686 | unsigned idx1 = idx0 + num0; |
8687 | unsigned idx2 = idx1 + num1; |
8688 | unsigned idx3 = idx2 + num2; |
8689 | unsigned idx4 = idx3 + num3; |
8690 | unsigned idx5 = idx4 + num4; |
8691 | unsigned idx6 = idx5 + num5; |
8692 | set_opnd_array(3, opnd_array(4)->clone()); // vtmp1 |
8693 | for (unsigned i = 0; i < num4; i++) { |
8694 | set_req(i + idx3, _in[i + idx4]); |
8695 | } |
8696 | num3 = num4; |
8697 | idx4 = idx3 + num3; |
8698 | set_opnd_array(4, opnd_array(5)->clone()); // vtmp2 |
8699 | for (unsigned i = 0; i < num5; i++) { |
8700 | set_req(i + idx4, _in[i + idx5]); |
8701 | } |
8702 | num4 = num5; |
8703 | idx5 = idx4 + num4; |
8704 | for (int i = idx6 - 1; i >= (int)idx5; i--) { |
8705 | del_req(i); |
8706 | } |
8707 | _num_opnds = 5; |
8708 | } else { |
8709 | assert(_num_opnds == 5, "There should be either 5 or 6 operands.")do { if (!(_num_opnds == 5)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 8708, "assert(" "_num_opnds == 5" ") failed" , "There should be either 5 or 6 operands."); ::breakpoint(); } } while (0); |
8710 | } |
8711 | |
8712 | return this; |
8713 | } |
8714 | |
8715 | MachNode* reduction8DNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
8716 | Compile* C = Compile::current(); |
8717 | // Add projection edges for additional defs or kills |
8718 | // TEMP dst |
8719 | MachTempNode *def; |
8720 | def = new MachTempNode(state->MachOperGenerator(REGD)); |
8721 | add_req(def); |
8722 | // TEMP vtmp1 |
8723 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
8724 | add_req(def); |
8725 | // TEMP vtmp2 |
8726 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
8727 | add_req(def); |
8728 | // Remove duplicated operands and inputs which use the same name. |
8729 | if (num_opnds() == 6) { |
8730 | unsigned num0 = 0; |
8731 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
8732 | unsigned num2 = opnd_array(2)->num_edges(); // src |
8733 | unsigned num3 = opnd_array(3)->num_edges(); // dst |
8734 | unsigned num4 = opnd_array(4)->num_edges(); // vtmp1 |
8735 | unsigned num5 = opnd_array(5)->num_edges(); // vtmp2 |
8736 | unsigned idx0 = oper_input_base(); |
8737 | unsigned idx1 = idx0 + num0; |
8738 | unsigned idx2 = idx1 + num1; |
8739 | unsigned idx3 = idx2 + num2; |
8740 | unsigned idx4 = idx3 + num3; |
8741 | unsigned idx5 = idx4 + num4; |
8742 | unsigned idx6 = idx5 + num5; |
8743 | set_opnd_array(3, opnd_array(4)->clone()); // vtmp1 |
8744 | for (unsigned i = 0; i < num4; i++) { |
8745 | set_req(i + idx3, _in[i + idx4]); |
8746 | } |
8747 | num3 = num4; |
8748 | idx4 = idx3 + num3; |
8749 | set_opnd_array(4, opnd_array(5)->clone()); // vtmp2 |
8750 | for (unsigned i = 0; i < num5; i++) { |
8751 | set_req(i + idx4, _in[i + idx5]); |
8752 | } |
8753 | num4 = num5; |
8754 | idx5 = idx4 + num4; |
8755 | for (int i = idx6 - 1; i >= (int)idx5; i--) { |
8756 | del_req(i); |
8757 | } |
8758 | _num_opnds = 5; |
8759 | } else { |
8760 | assert(_num_opnds == 5, "There should be either 5 or 6 operands.")do { if (!(_num_opnds == 5)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 8759, "assert(" "_num_opnds == 5" ") failed" , "There should be either 5 or 6 operands."); ::breakpoint(); } } while (0); |
8761 | } |
8762 | |
8763 | return this; |
8764 | } |
8765 | |
8766 | MachNode* reduction8D_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
8767 | Compile* C = Compile::current(); |
8768 | // Add projection edges for additional defs or kills |
8769 | // TEMP dst |
8770 | MachTempNode *def; |
8771 | def = new MachTempNode(state->MachOperGenerator(REGD)); |
8772 | add_req(def); |
8773 | // TEMP vtmp1 |
8774 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
8775 | add_req(def); |
8776 | // TEMP vtmp2 |
8777 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
8778 | add_req(def); |
8779 | // Remove duplicated operands and inputs which use the same name. |
8780 | if (num_opnds() == 6) { |
8781 | unsigned num0 = 0; |
8782 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
8783 | unsigned num2 = opnd_array(2)->num_edges(); // src |
8784 | unsigned num3 = opnd_array(3)->num_edges(); // dst |
8785 | unsigned num4 = opnd_array(4)->num_edges(); // vtmp1 |
8786 | unsigned num5 = opnd_array(5)->num_edges(); // vtmp2 |
8787 | unsigned idx0 = oper_input_base(); |
8788 | unsigned idx1 = idx0 + num0; |
8789 | unsigned idx2 = idx1 + num1; |
8790 | unsigned idx3 = idx2 + num2; |
8791 | unsigned idx4 = idx3 + num3; |
8792 | unsigned idx5 = idx4 + num4; |
8793 | unsigned idx6 = idx5 + num5; |
8794 | set_opnd_array(3, opnd_array(4)->clone()); // vtmp1 |
8795 | for (unsigned i = 0; i < num4; i++) { |
8796 | set_req(i + idx3, _in[i + idx4]); |
8797 | } |
8798 | num3 = num4; |
8799 | idx4 = idx3 + num3; |
8800 | set_opnd_array(4, opnd_array(5)->clone()); // vtmp2 |
8801 | for (unsigned i = 0; i < num5; i++) { |
8802 | set_req(i + idx4, _in[i + idx5]); |
8803 | } |
8804 | num4 = num5; |
8805 | idx5 = idx4 + num4; |
8806 | for (int i = idx6 - 1; i >= (int)idx5; i--) { |
8807 | del_req(i); |
8808 | } |
8809 | _num_opnds = 5; |
8810 | } else { |
8811 | assert(_num_opnds == 5, "There should be either 5 or 6 operands.")do { if (!(_num_opnds == 5)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 8810, "assert(" "_num_opnds == 5" ") failed" , "There should be either 5 or 6 operands."); ::breakpoint(); } } while (0); |
8812 | } |
8813 | |
8814 | return this; |
8815 | } |
8816 | |
8817 | MachNode* reductionBNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
8818 | Compile* C = Compile::current(); |
8819 | // Add projection edges for additional defs or kills |
8820 | // TEMP vtmp1 |
8821 | MachTempNode *def; |
8822 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
8823 | add_req(def); |
8824 | // TEMP vtmp2 |
8825 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
8826 | add_req(def); |
8827 | |
8828 | return this; |
8829 | } |
8830 | |
8831 | MachNode* reductionB_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
8832 | Compile* C = Compile::current(); |
8833 | // Add projection edges for additional defs or kills |
8834 | // TEMP vtmp1 |
8835 | MachTempNode *def; |
8836 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
8837 | add_req(def); |
8838 | // TEMP vtmp2 |
8839 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
8840 | add_req(def); |
8841 | |
8842 | return this; |
8843 | } |
8844 | |
8845 | MachNode* reductionB_1Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
8846 | Compile* C = Compile::current(); |
8847 | // Add projection edges for additional defs or kills |
8848 | // TEMP vtmp1 |
8849 | MachTempNode *def; |
8850 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
8851 | add_req(def); |
8852 | // TEMP vtmp2 |
8853 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
8854 | add_req(def); |
8855 | |
8856 | return this; |
8857 | } |
8858 | |
8859 | MachNode* reductionB_2Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
8860 | Compile* C = Compile::current(); |
8861 | // Add projection edges for additional defs or kills |
8862 | // TEMP vtmp1 |
8863 | MachTempNode *def; |
8864 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
8865 | add_req(def); |
8866 | // TEMP vtmp2 |
8867 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
8868 | add_req(def); |
8869 | |
8870 | return this; |
8871 | } |
8872 | |
8873 | MachNode* reductionB_3Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
8874 | Compile* C = Compile::current(); |
8875 | // Add projection edges for additional defs or kills |
8876 | // TEMP vtmp1 |
8877 | MachTempNode *def; |
8878 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
8879 | add_req(def); |
8880 | // TEMP vtmp2 |
8881 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
8882 | add_req(def); |
8883 | |
8884 | return this; |
8885 | } |
8886 | |
8887 | MachNode* reductionB_4Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
8888 | Compile* C = Compile::current(); |
8889 | // Add projection edges for additional defs or kills |
8890 | // TEMP vtmp1 |
8891 | MachTempNode *def; |
8892 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
8893 | add_req(def); |
8894 | // TEMP vtmp2 |
8895 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
8896 | add_req(def); |
8897 | |
8898 | return this; |
8899 | } |
8900 | |
8901 | MachNode* reductionB_avx512bwNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
8902 | Compile* C = Compile::current(); |
8903 | // Add projection edges for additional defs or kills |
8904 | // TEMP vtmp1 |
8905 | MachTempNode *def; |
8906 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
8907 | add_req(def); |
8908 | // TEMP vtmp2 |
8909 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
8910 | add_req(def); |
8911 | |
8912 | return this; |
8913 | } |
8914 | |
8915 | MachNode* reductionB_avx512bw_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
8916 | Compile* C = Compile::current(); |
8917 | // Add projection edges for additional defs or kills |
8918 | // TEMP vtmp1 |
8919 | MachTempNode *def; |
8920 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
8921 | add_req(def); |
8922 | // TEMP vtmp2 |
8923 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
8924 | add_req(def); |
8925 | |
8926 | return this; |
8927 | } |
8928 | |
8929 | MachNode* reductionB_avx512bw_1Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
8930 | Compile* C = Compile::current(); |
8931 | // Add projection edges for additional defs or kills |
8932 | // TEMP vtmp1 |
8933 | MachTempNode *def; |
8934 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
8935 | add_req(def); |
8936 | // TEMP vtmp2 |
8937 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
8938 | add_req(def); |
8939 | |
8940 | return this; |
8941 | } |
8942 | |
8943 | MachNode* reductionB_avx512bw_2Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
8944 | Compile* C = Compile::current(); |
8945 | // Add projection edges for additional defs or kills |
8946 | // TEMP vtmp1 |
8947 | MachTempNode *def; |
8948 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
8949 | add_req(def); |
8950 | // TEMP vtmp2 |
8951 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
8952 | add_req(def); |
8953 | |
8954 | return this; |
8955 | } |
8956 | |
8957 | MachNode* reductionB_avx512bw_3Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
8958 | Compile* C = Compile::current(); |
8959 | // Add projection edges for additional defs or kills |
8960 | // TEMP vtmp1 |
8961 | MachTempNode *def; |
8962 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
8963 | add_req(def); |
8964 | // TEMP vtmp2 |
8965 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
8966 | add_req(def); |
8967 | |
8968 | return this; |
8969 | } |
8970 | |
8971 | MachNode* reductionB_avx512bw_4Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
8972 | Compile* C = Compile::current(); |
8973 | // Add projection edges for additional defs or kills |
8974 | // TEMP vtmp1 |
8975 | MachTempNode *def; |
8976 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
8977 | add_req(def); |
8978 | // TEMP vtmp2 |
8979 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
8980 | add_req(def); |
8981 | |
8982 | return this; |
8983 | } |
8984 | |
8985 | MachNode* reductionSNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
8986 | Compile* C = Compile::current(); |
8987 | // Add projection edges for additional defs or kills |
8988 | // TEMP vtmp1 |
8989 | MachTempNode *def; |
8990 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
8991 | add_req(def); |
8992 | // TEMP vtmp2 |
8993 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
8994 | add_req(def); |
8995 | |
8996 | return this; |
8997 | } |
8998 | |
8999 | MachNode* reductionS_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
9000 | Compile* C = Compile::current(); |
9001 | // Add projection edges for additional defs or kills |
9002 | // TEMP vtmp1 |
9003 | MachTempNode *def; |
9004 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9005 | add_req(def); |
9006 | // TEMP vtmp2 |
9007 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9008 | add_req(def); |
9009 | |
9010 | return this; |
9011 | } |
9012 | |
9013 | MachNode* reductionS_1Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
9014 | Compile* C = Compile::current(); |
9015 | // Add projection edges for additional defs or kills |
9016 | // TEMP vtmp1 |
9017 | MachTempNode *def; |
9018 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9019 | add_req(def); |
9020 | // TEMP vtmp2 |
9021 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9022 | add_req(def); |
9023 | |
9024 | return this; |
9025 | } |
9026 | |
9027 | MachNode* reductionS_2Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
9028 | Compile* C = Compile::current(); |
9029 | // Add projection edges for additional defs or kills |
9030 | // TEMP vtmp1 |
9031 | MachTempNode *def; |
9032 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9033 | add_req(def); |
9034 | // TEMP vtmp2 |
9035 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9036 | add_req(def); |
9037 | |
9038 | return this; |
9039 | } |
9040 | |
9041 | MachNode* reductionS_3Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
9042 | Compile* C = Compile::current(); |
9043 | // Add projection edges for additional defs or kills |
9044 | // TEMP vtmp1 |
9045 | MachTempNode *def; |
9046 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9047 | add_req(def); |
9048 | // TEMP vtmp2 |
9049 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9050 | add_req(def); |
9051 | |
9052 | return this; |
9053 | } |
9054 | |
9055 | MachNode* reductionS_4Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
9056 | Compile* C = Compile::current(); |
9057 | // Add projection edges for additional defs or kills |
9058 | // TEMP vtmp1 |
9059 | MachTempNode *def; |
9060 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9061 | add_req(def); |
9062 | // TEMP vtmp2 |
9063 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9064 | add_req(def); |
9065 | |
9066 | return this; |
9067 | } |
9068 | |
9069 | MachNode* reductionS_5Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
9070 | Compile* C = Compile::current(); |
9071 | // Add projection edges for additional defs or kills |
9072 | // TEMP vtmp1 |
9073 | MachTempNode *def; |
9074 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9075 | add_req(def); |
9076 | // TEMP vtmp2 |
9077 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9078 | add_req(def); |
9079 | |
9080 | return this; |
9081 | } |
9082 | |
9083 | MachNode* mul_reductionBNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
9084 | Compile* C = Compile::current(); |
9085 | // Add projection edges for additional defs or kills |
9086 | // TEMP dst |
9087 | MachTempNode *def; |
9088 | def = new MachTempNode(state->MachOperGenerator(RREGI)); |
9089 | add_req(def); |
9090 | // TEMP vtmp1 |
9091 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
9092 | add_req(def); |
9093 | // TEMP vtmp2 |
9094 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
9095 | add_req(def); |
9096 | |
9097 | return this; |
9098 | } |
9099 | |
9100 | MachNode* mul_reduction64BNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
9101 | Compile* C = Compile::current(); |
9102 | // Add projection edges for additional defs or kills |
9103 | // TEMP dst |
9104 | MachTempNode *def; |
9105 | def = new MachTempNode(state->MachOperGenerator(RREGI)); |
9106 | add_req(def); |
9107 | // TEMP vtmp1 |
9108 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9109 | add_req(def); |
9110 | // TEMP vtmp2 |
9111 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9112 | add_req(def); |
9113 | |
9114 | return this; |
9115 | } |
9116 | |
9117 | MachNode* minmax_reduction2FNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
9118 | Compile* C = Compile::current(); |
9119 | // Add projection edges for additional defs or kills |
9120 | // TEMP dst |
9121 | MachTempNode *def; |
9122 | def = new MachTempNode(state->MachOperGenerator(LEGREGF)); |
9123 | add_req(def); |
9124 | // TEMP tmp |
9125 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9126 | add_req(def); |
9127 | // TEMP atmp |
9128 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9129 | add_req(def); |
9130 | // TEMP btmp |
9131 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9132 | add_req(def); |
9133 | // TEMP xmm_1 |
9134 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9135 | add_req(def); |
9136 | // DEF/KILL cr |
9137 | MachProjNode *kill; |
9138 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
9139 | proj_list.push(kill); |
9140 | |
9141 | return this; |
9142 | } |
9143 | |
9144 | MachNode* minmax_reduction2F_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
9145 | Compile* C = Compile::current(); |
9146 | // Add projection edges for additional defs or kills |
9147 | // TEMP dst |
9148 | MachTempNode *def; |
9149 | def = new MachTempNode(state->MachOperGenerator(LEGREGF)); |
9150 | add_req(def); |
9151 | // TEMP tmp |
9152 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9153 | add_req(def); |
9154 | // TEMP atmp |
9155 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9156 | add_req(def); |
9157 | // TEMP btmp |
9158 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9159 | add_req(def); |
9160 | // TEMP xmm_1 |
9161 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9162 | add_req(def); |
9163 | // DEF/KILL cr |
9164 | MachProjNode *kill; |
9165 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
9166 | proj_list.push(kill); |
9167 | |
9168 | return this; |
9169 | } |
9170 | |
9171 | MachNode* minmax_reductionFNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
9172 | Compile* C = Compile::current(); |
9173 | // Add projection edges for additional defs or kills |
9174 | // TEMP dst |
9175 | MachTempNode *def; |
9176 | def = new MachTempNode(state->MachOperGenerator(LEGREGF)); |
9177 | add_req(def); |
9178 | // TEMP tmp |
9179 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9180 | add_req(def); |
9181 | // TEMP atmp |
9182 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9183 | add_req(def); |
9184 | // TEMP btmp |
9185 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9186 | add_req(def); |
9187 | // TEMP xmm_0 |
9188 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9189 | add_req(def); |
9190 | // TEMP xmm_1 |
9191 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9192 | add_req(def); |
9193 | // DEF/KILL cr |
9194 | MachProjNode *kill; |
9195 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
9196 | proj_list.push(kill); |
9197 | |
9198 | return this; |
9199 | } |
9200 | |
9201 | MachNode* minmax_reductionF_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
9202 | Compile* C = Compile::current(); |
9203 | // Add projection edges for additional defs or kills |
9204 | // TEMP dst |
9205 | MachTempNode *def; |
9206 | def = new MachTempNode(state->MachOperGenerator(LEGREGF)); |
9207 | add_req(def); |
9208 | // TEMP tmp |
9209 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9210 | add_req(def); |
9211 | // TEMP atmp |
9212 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9213 | add_req(def); |
9214 | // TEMP btmp |
9215 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9216 | add_req(def); |
9217 | // TEMP xmm_0 |
9218 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9219 | add_req(def); |
9220 | // TEMP xmm_1 |
9221 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9222 | add_req(def); |
9223 | // DEF/KILL cr |
9224 | MachProjNode *kill; |
9225 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
9226 | proj_list.push(kill); |
9227 | |
9228 | return this; |
9229 | } |
9230 | |
9231 | MachNode* minmax_reduction2F_avNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
9232 | Compile* C = Compile::current(); |
9233 | // Add projection edges for additional defs or kills |
9234 | // TEMP dst |
9235 | MachTempNode *def; |
9236 | def = new MachTempNode(state->MachOperGenerator(LEGREGF)); |
9237 | add_req(def); |
9238 | // TEMP tmp |
9239 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9240 | add_req(def); |
9241 | // TEMP atmp |
9242 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9243 | add_req(def); |
9244 | // TEMP btmp |
9245 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9246 | add_req(def); |
9247 | // TEMP xmm_1 |
9248 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9249 | add_req(def); |
9250 | // DEF/KILL cr |
9251 | MachProjNode *kill; |
9252 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
9253 | proj_list.push(kill); |
9254 | // Remove duplicated operands and inputs which use the same name. |
9255 | if (num_opnds() == 8) { |
9256 | unsigned num0 = 0; |
9257 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
9258 | unsigned num2 = opnd_array(2)->num_edges(); // src |
9259 | unsigned num3 = opnd_array(3)->num_edges(); // dst |
9260 | unsigned num4 = opnd_array(4)->num_edges(); // tmp |
9261 | unsigned num5 = opnd_array(5)->num_edges(); // atmp |
9262 | unsigned num6 = opnd_array(6)->num_edges(); // btmp |
9263 | unsigned num7 = opnd_array(7)->num_edges(); // xmm_1 |
9264 | unsigned idx0 = oper_input_base(); |
9265 | unsigned idx1 = idx0 + num0; |
9266 | unsigned idx2 = idx1 + num1; |
9267 | unsigned idx3 = idx2 + num2; |
9268 | unsigned idx4 = idx3 + num3; |
9269 | unsigned idx5 = idx4 + num4; |
9270 | unsigned idx6 = idx5 + num5; |
9271 | unsigned idx7 = idx6 + num6; |
9272 | unsigned idx8 = idx7 + num7; |
9273 | set_opnd_array(3, opnd_array(4)->clone()); // tmp |
9274 | for (unsigned i = 0; i < num4; i++) { |
9275 | set_req(i + idx3, _in[i + idx4]); |
9276 | } |
9277 | num3 = num4; |
9278 | idx4 = idx3 + num3; |
9279 | set_opnd_array(4, opnd_array(5)->clone()); // atmp |
9280 | for (unsigned i = 0; i < num5; i++) { |
9281 | set_req(i + idx4, _in[i + idx5]); |
9282 | } |
9283 | num4 = num5; |
9284 | idx5 = idx4 + num4; |
9285 | set_opnd_array(5, opnd_array(6)->clone()); // btmp |
9286 | for (unsigned i = 0; i < num6; i++) { |
9287 | set_req(i + idx5, _in[i + idx6]); |
9288 | } |
9289 | num5 = num6; |
9290 | idx6 = idx5 + num5; |
9291 | set_opnd_array(6, opnd_array(7)->clone()); // xmm_1 |
9292 | for (unsigned i = 0; i < num7; i++) { |
9293 | set_req(i + idx6, _in[i + idx7]); |
9294 | } |
9295 | num6 = num7; |
9296 | idx7 = idx6 + num6; |
9297 | for (int i = idx8 - 1; i >= (int)idx7; i--) { |
9298 | del_req(i); |
9299 | } |
9300 | _num_opnds = 7; |
9301 | } else { |
9302 | assert(_num_opnds == 7, "There should be either 7 or 8 operands.")do { if (!(_num_opnds == 7)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 9301, "assert(" "_num_opnds == 7" ") failed" , "There should be either 7 or 8 operands."); ::breakpoint(); } } while (0); |
9303 | } |
9304 | |
9305 | return this; |
9306 | } |
9307 | |
9308 | MachNode* minmax_reduction2F_av_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
9309 | Compile* C = Compile::current(); |
9310 | // Add projection edges for additional defs or kills |
9311 | // TEMP dst |
9312 | MachTempNode *def; |
9313 | def = new MachTempNode(state->MachOperGenerator(LEGREGF)); |
9314 | add_req(def); |
9315 | // TEMP tmp |
9316 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9317 | add_req(def); |
9318 | // TEMP atmp |
9319 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9320 | add_req(def); |
9321 | // TEMP btmp |
9322 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9323 | add_req(def); |
9324 | // TEMP xmm_1 |
9325 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9326 | add_req(def); |
9327 | // DEF/KILL cr |
9328 | MachProjNode *kill; |
9329 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
9330 | proj_list.push(kill); |
9331 | // Remove duplicated operands and inputs which use the same name. |
9332 | if (num_opnds() == 8) { |
9333 | unsigned num0 = 0; |
9334 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
9335 | unsigned num2 = opnd_array(2)->num_edges(); // src |
9336 | unsigned num3 = opnd_array(3)->num_edges(); // dst |
9337 | unsigned num4 = opnd_array(4)->num_edges(); // tmp |
9338 | unsigned num5 = opnd_array(5)->num_edges(); // atmp |
9339 | unsigned num6 = opnd_array(6)->num_edges(); // btmp |
9340 | unsigned num7 = opnd_array(7)->num_edges(); // xmm_1 |
9341 | unsigned idx0 = oper_input_base(); |
9342 | unsigned idx1 = idx0 + num0; |
9343 | unsigned idx2 = idx1 + num1; |
9344 | unsigned idx3 = idx2 + num2; |
9345 | unsigned idx4 = idx3 + num3; |
9346 | unsigned idx5 = idx4 + num4; |
9347 | unsigned idx6 = idx5 + num5; |
9348 | unsigned idx7 = idx6 + num6; |
9349 | unsigned idx8 = idx7 + num7; |
9350 | set_opnd_array(3, opnd_array(4)->clone()); // tmp |
9351 | for (unsigned i = 0; i < num4; i++) { |
9352 | set_req(i + idx3, _in[i + idx4]); |
9353 | } |
9354 | num3 = num4; |
9355 | idx4 = idx3 + num3; |
9356 | set_opnd_array(4, opnd_array(5)->clone()); // atmp |
9357 | for (unsigned i = 0; i < num5; i++) { |
9358 | set_req(i + idx4, _in[i + idx5]); |
9359 | } |
9360 | num4 = num5; |
9361 | idx5 = idx4 + num4; |
9362 | set_opnd_array(5, opnd_array(6)->clone()); // btmp |
9363 | for (unsigned i = 0; i < num6; i++) { |
9364 | set_req(i + idx5, _in[i + idx6]); |
9365 | } |
9366 | num5 = num6; |
9367 | idx6 = idx5 + num5; |
9368 | set_opnd_array(6, opnd_array(7)->clone()); // xmm_1 |
9369 | for (unsigned i = 0; i < num7; i++) { |
9370 | set_req(i + idx6, _in[i + idx7]); |
9371 | } |
9372 | num6 = num7; |
9373 | idx7 = idx6 + num6; |
9374 | for (int i = idx8 - 1; i >= (int)idx7; i--) { |
9375 | del_req(i); |
9376 | } |
9377 | _num_opnds = 7; |
9378 | } else { |
9379 | assert(_num_opnds == 7, "There should be either 7 or 8 operands.")do { if (!(_num_opnds == 7)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 9378, "assert(" "_num_opnds == 7" ") failed" , "There should be either 7 or 8 operands."); ::breakpoint(); } } while (0); |
9380 | } |
9381 | |
9382 | return this; |
9383 | } |
9384 | |
9385 | MachNode* minmax_reductionF_avNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
9386 | Compile* C = Compile::current(); |
9387 | // Add projection edges for additional defs or kills |
9388 | // TEMP dst |
9389 | MachTempNode *def; |
9390 | def = new MachTempNode(state->MachOperGenerator(LEGREGF)); |
9391 | add_req(def); |
9392 | // TEMP tmp |
9393 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9394 | add_req(def); |
9395 | // TEMP atmp |
9396 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9397 | add_req(def); |
9398 | // TEMP btmp |
9399 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9400 | add_req(def); |
9401 | // TEMP xmm_0 |
9402 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9403 | add_req(def); |
9404 | // TEMP xmm_1 |
9405 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9406 | add_req(def); |
9407 | // DEF/KILL cr |
9408 | MachProjNode *kill; |
9409 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
9410 | proj_list.push(kill); |
9411 | // Remove duplicated operands and inputs which use the same name. |
9412 | if (num_opnds() == 9) { |
9413 | unsigned num0 = 0; |
9414 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
9415 | unsigned num2 = opnd_array(2)->num_edges(); // src |
9416 | unsigned num3 = opnd_array(3)->num_edges(); // dst |
9417 | unsigned num4 = opnd_array(4)->num_edges(); // tmp |
9418 | unsigned num5 = opnd_array(5)->num_edges(); // atmp |
9419 | unsigned num6 = opnd_array(6)->num_edges(); // btmp |
9420 | unsigned num7 = opnd_array(7)->num_edges(); // xmm_0 |
9421 | unsigned num8 = opnd_array(8)->num_edges(); // xmm_1 |
9422 | unsigned idx0 = oper_input_base(); |
9423 | unsigned idx1 = idx0 + num0; |
9424 | unsigned idx2 = idx1 + num1; |
9425 | unsigned idx3 = idx2 + num2; |
9426 | unsigned idx4 = idx3 + num3; |
9427 | unsigned idx5 = idx4 + num4; |
9428 | unsigned idx6 = idx5 + num5; |
9429 | unsigned idx7 = idx6 + num6; |
9430 | unsigned idx8 = idx7 + num7; |
9431 | unsigned idx9 = idx8 + num8; |
9432 | set_opnd_array(3, opnd_array(4)->clone()); // tmp |
9433 | for (unsigned i = 0; i < num4; i++) { |
9434 | set_req(i + idx3, _in[i + idx4]); |
9435 | } |
9436 | num3 = num4; |
9437 | idx4 = idx3 + num3; |
9438 | set_opnd_array(4, opnd_array(5)->clone()); // atmp |
9439 | for (unsigned i = 0; i < num5; i++) { |
9440 | set_req(i + idx4, _in[i + idx5]); |
9441 | } |
9442 | num4 = num5; |
9443 | idx5 = idx4 + num4; |
9444 | set_opnd_array(5, opnd_array(6)->clone()); // btmp |
9445 | for (unsigned i = 0; i < num6; i++) { |
9446 | set_req(i + idx5, _in[i + idx6]); |
9447 | } |
9448 | num5 = num6; |
9449 | idx6 = idx5 + num5; |
9450 | set_opnd_array(6, opnd_array(7)->clone()); // xmm_0 |
9451 | for (unsigned i = 0; i < num7; i++) { |
9452 | set_req(i + idx6, _in[i + idx7]); |
9453 | } |
9454 | num6 = num7; |
9455 | idx7 = idx6 + num6; |
9456 | set_opnd_array(7, opnd_array(8)->clone()); // xmm_1 |
9457 | for (unsigned i = 0; i < num8; i++) { |
9458 | set_req(i + idx7, _in[i + idx8]); |
9459 | } |
9460 | num7 = num8; |
9461 | idx8 = idx7 + num7; |
9462 | for (int i = idx9 - 1; i >= (int)idx8; i--) { |
9463 | del_req(i); |
9464 | } |
9465 | _num_opnds = 8; |
9466 | } else { |
9467 | assert(_num_opnds == 8, "There should be either 8 or 9 operands.")do { if (!(_num_opnds == 8)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 9466, "assert(" "_num_opnds == 8" ") failed" , "There should be either 8 or 9 operands."); ::breakpoint(); } } while (0); |
9468 | } |
9469 | |
9470 | return this; |
9471 | } |
9472 | |
9473 | MachNode* minmax_reductionF_av_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
9474 | Compile* C = Compile::current(); |
9475 | // Add projection edges for additional defs or kills |
9476 | // TEMP dst |
9477 | MachTempNode *def; |
9478 | def = new MachTempNode(state->MachOperGenerator(LEGREGF)); |
9479 | add_req(def); |
9480 | // TEMP tmp |
9481 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9482 | add_req(def); |
9483 | // TEMP atmp |
9484 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9485 | add_req(def); |
9486 | // TEMP btmp |
9487 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9488 | add_req(def); |
9489 | // TEMP xmm_0 |
9490 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9491 | add_req(def); |
9492 | // TEMP xmm_1 |
9493 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9494 | add_req(def); |
9495 | // DEF/KILL cr |
9496 | MachProjNode *kill; |
9497 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
9498 | proj_list.push(kill); |
9499 | // Remove duplicated operands and inputs which use the same name. |
9500 | if (num_opnds() == 9) { |
9501 | unsigned num0 = 0; |
9502 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
9503 | unsigned num2 = opnd_array(2)->num_edges(); // src |
9504 | unsigned num3 = opnd_array(3)->num_edges(); // dst |
9505 | unsigned num4 = opnd_array(4)->num_edges(); // tmp |
9506 | unsigned num5 = opnd_array(5)->num_edges(); // atmp |
9507 | unsigned num6 = opnd_array(6)->num_edges(); // btmp |
9508 | unsigned num7 = opnd_array(7)->num_edges(); // xmm_0 |
9509 | unsigned num8 = opnd_array(8)->num_edges(); // xmm_1 |
9510 | unsigned idx0 = oper_input_base(); |
9511 | unsigned idx1 = idx0 + num0; |
9512 | unsigned idx2 = idx1 + num1; |
9513 | unsigned idx3 = idx2 + num2; |
9514 | unsigned idx4 = idx3 + num3; |
9515 | unsigned idx5 = idx4 + num4; |
9516 | unsigned idx6 = idx5 + num5; |
9517 | unsigned idx7 = idx6 + num6; |
9518 | unsigned idx8 = idx7 + num7; |
9519 | unsigned idx9 = idx8 + num8; |
9520 | set_opnd_array(3, opnd_array(4)->clone()); // tmp |
9521 | for (unsigned i = 0; i < num4; i++) { |
9522 | set_req(i + idx3, _in[i + idx4]); |
9523 | } |
9524 | num3 = num4; |
9525 | idx4 = idx3 + num3; |
9526 | set_opnd_array(4, opnd_array(5)->clone()); // atmp |
9527 | for (unsigned i = 0; i < num5; i++) { |
9528 | set_req(i + idx4, _in[i + idx5]); |
9529 | } |
9530 | num4 = num5; |
9531 | idx5 = idx4 + num4; |
9532 | set_opnd_array(5, opnd_array(6)->clone()); // btmp |
9533 | for (unsigned i = 0; i < num6; i++) { |
9534 | set_req(i + idx5, _in[i + idx6]); |
9535 | } |
9536 | num5 = num6; |
9537 | idx6 = idx5 + num5; |
9538 | set_opnd_array(6, opnd_array(7)->clone()); // xmm_0 |
9539 | for (unsigned i = 0; i < num7; i++) { |
9540 | set_req(i + idx6, _in[i + idx7]); |
9541 | } |
9542 | num6 = num7; |
9543 | idx7 = idx6 + num6; |
9544 | set_opnd_array(7, opnd_array(8)->clone()); // xmm_1 |
9545 | for (unsigned i = 0; i < num8; i++) { |
9546 | set_req(i + idx7, _in[i + idx8]); |
9547 | } |
9548 | num7 = num8; |
9549 | idx8 = idx7 + num7; |
9550 | for (int i = idx9 - 1; i >= (int)idx8; i--) { |
9551 | del_req(i); |
9552 | } |
9553 | _num_opnds = 8; |
9554 | } else { |
9555 | assert(_num_opnds == 8, "There should be either 8 or 9 operands.")do { if (!(_num_opnds == 8)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 9554, "assert(" "_num_opnds == 8" ") failed" , "There should be either 8 or 9 operands."); ::breakpoint(); } } while (0); |
9556 | } |
9557 | |
9558 | return this; |
9559 | } |
9560 | |
9561 | MachNode* minmax_reduction2DNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
9562 | Compile* C = Compile::current(); |
9563 | // Add projection edges for additional defs or kills |
9564 | // TEMP dst |
9565 | MachTempNode *def; |
9566 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
9567 | add_req(def); |
9568 | // TEMP tmp1 |
9569 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9570 | add_req(def); |
9571 | // TEMP tmp2 |
9572 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9573 | add_req(def); |
9574 | // TEMP tmp3 |
9575 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9576 | add_req(def); |
9577 | // TEMP tmp4 |
9578 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9579 | add_req(def); |
9580 | // DEF/KILL cr |
9581 | MachProjNode *kill; |
9582 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
9583 | proj_list.push(kill); |
9584 | |
9585 | return this; |
9586 | } |
9587 | |
9588 | MachNode* minmax_reduction2D_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
9589 | Compile* C = Compile::current(); |
9590 | // Add projection edges for additional defs or kills |
9591 | // TEMP dst |
9592 | MachTempNode *def; |
9593 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
9594 | add_req(def); |
9595 | // TEMP tmp1 |
9596 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9597 | add_req(def); |
9598 | // TEMP tmp2 |
9599 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9600 | add_req(def); |
9601 | // TEMP tmp3 |
9602 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9603 | add_req(def); |
9604 | // TEMP tmp4 |
9605 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9606 | add_req(def); |
9607 | // DEF/KILL cr |
9608 | MachProjNode *kill; |
9609 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
9610 | proj_list.push(kill); |
9611 | |
9612 | return this; |
9613 | } |
9614 | |
9615 | MachNode* minmax_reductionDNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
9616 | Compile* C = Compile::current(); |
9617 | // Add projection edges for additional defs or kills |
9618 | // TEMP dst |
9619 | MachTempNode *def; |
9620 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
9621 | add_req(def); |
9622 | // TEMP tmp1 |
9623 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9624 | add_req(def); |
9625 | // TEMP tmp2 |
9626 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9627 | add_req(def); |
9628 | // TEMP tmp3 |
9629 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9630 | add_req(def); |
9631 | // TEMP tmp4 |
9632 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9633 | add_req(def); |
9634 | // TEMP tmp5 |
9635 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9636 | add_req(def); |
9637 | // DEF/KILL cr |
9638 | MachProjNode *kill; |
9639 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
9640 | proj_list.push(kill); |
9641 | |
9642 | return this; |
9643 | } |
9644 | |
9645 | MachNode* minmax_reductionD_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
9646 | Compile* C = Compile::current(); |
9647 | // Add projection edges for additional defs or kills |
9648 | // TEMP dst |
9649 | MachTempNode *def; |
9650 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
9651 | add_req(def); |
9652 | // TEMP tmp1 |
9653 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9654 | add_req(def); |
9655 | // TEMP tmp2 |
9656 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9657 | add_req(def); |
9658 | // TEMP tmp3 |
9659 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9660 | add_req(def); |
9661 | // TEMP tmp4 |
9662 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9663 | add_req(def); |
9664 | // TEMP tmp5 |
9665 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9666 | add_req(def); |
9667 | // DEF/KILL cr |
9668 | MachProjNode *kill; |
9669 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
9670 | proj_list.push(kill); |
9671 | |
9672 | return this; |
9673 | } |
9674 | |
9675 | MachNode* minmax_reduction2D_avNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
9676 | Compile* C = Compile::current(); |
9677 | // Add projection edges for additional defs or kills |
9678 | // TEMP dst |
9679 | MachTempNode *def; |
9680 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
9681 | add_req(def); |
9682 | // TEMP tmp1 |
9683 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9684 | add_req(def); |
9685 | // TEMP tmp2 |
9686 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9687 | add_req(def); |
9688 | // TEMP tmp3 |
9689 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9690 | add_req(def); |
9691 | // TEMP tmp4 |
9692 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9693 | add_req(def); |
9694 | // DEF/KILL cr |
9695 | MachProjNode *kill; |
9696 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
9697 | proj_list.push(kill); |
9698 | // Remove duplicated operands and inputs which use the same name. |
9699 | if (num_opnds() == 8) { |
9700 | unsigned num0 = 0; |
9701 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
9702 | unsigned num2 = opnd_array(2)->num_edges(); // src |
9703 | unsigned num3 = opnd_array(3)->num_edges(); // dst |
9704 | unsigned num4 = opnd_array(4)->num_edges(); // tmp1 |
9705 | unsigned num5 = opnd_array(5)->num_edges(); // tmp2 |
9706 | unsigned num6 = opnd_array(6)->num_edges(); // tmp3 |
9707 | unsigned num7 = opnd_array(7)->num_edges(); // tmp4 |
9708 | unsigned idx0 = oper_input_base(); |
9709 | unsigned idx1 = idx0 + num0; |
9710 | unsigned idx2 = idx1 + num1; |
9711 | unsigned idx3 = idx2 + num2; |
9712 | unsigned idx4 = idx3 + num3; |
9713 | unsigned idx5 = idx4 + num4; |
9714 | unsigned idx6 = idx5 + num5; |
9715 | unsigned idx7 = idx6 + num6; |
9716 | unsigned idx8 = idx7 + num7; |
9717 | set_opnd_array(3, opnd_array(4)->clone()); // tmp1 |
9718 | for (unsigned i = 0; i < num4; i++) { |
9719 | set_req(i + idx3, _in[i + idx4]); |
9720 | } |
9721 | num3 = num4; |
9722 | idx4 = idx3 + num3; |
9723 | set_opnd_array(4, opnd_array(5)->clone()); // tmp2 |
9724 | for (unsigned i = 0; i < num5; i++) { |
9725 | set_req(i + idx4, _in[i + idx5]); |
9726 | } |
9727 | num4 = num5; |
9728 | idx5 = idx4 + num4; |
9729 | set_opnd_array(5, opnd_array(6)->clone()); // tmp3 |
9730 | for (unsigned i = 0; i < num6; i++) { |
9731 | set_req(i + idx5, _in[i + idx6]); |
9732 | } |
9733 | num5 = num6; |
9734 | idx6 = idx5 + num5; |
9735 | set_opnd_array(6, opnd_array(7)->clone()); // tmp4 |
9736 | for (unsigned i = 0; i < num7; i++) { |
9737 | set_req(i + idx6, _in[i + idx7]); |
9738 | } |
9739 | num6 = num7; |
9740 | idx7 = idx6 + num6; |
9741 | for (int i = idx8 - 1; i >= (int)idx7; i--) { |
9742 | del_req(i); |
9743 | } |
9744 | _num_opnds = 7; |
9745 | } else { |
9746 | assert(_num_opnds == 7, "There should be either 7 or 8 operands.")do { if (!(_num_opnds == 7)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 9745, "assert(" "_num_opnds == 7" ") failed" , "There should be either 7 or 8 operands."); ::breakpoint(); } } while (0); |
9747 | } |
9748 | |
9749 | return this; |
9750 | } |
9751 | |
9752 | MachNode* minmax_reduction2D_av_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
9753 | Compile* C = Compile::current(); |
9754 | // Add projection edges for additional defs or kills |
9755 | // TEMP dst |
9756 | MachTempNode *def; |
9757 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
9758 | add_req(def); |
9759 | // TEMP tmp1 |
9760 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9761 | add_req(def); |
9762 | // TEMP tmp2 |
9763 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9764 | add_req(def); |
9765 | // TEMP tmp3 |
9766 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9767 | add_req(def); |
9768 | // TEMP tmp4 |
9769 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9770 | add_req(def); |
9771 | // DEF/KILL cr |
9772 | MachProjNode *kill; |
9773 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
9774 | proj_list.push(kill); |
9775 | // Remove duplicated operands and inputs which use the same name. |
9776 | if (num_opnds() == 8) { |
9777 | unsigned num0 = 0; |
9778 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
9779 | unsigned num2 = opnd_array(2)->num_edges(); // src |
9780 | unsigned num3 = opnd_array(3)->num_edges(); // dst |
9781 | unsigned num4 = opnd_array(4)->num_edges(); // tmp1 |
9782 | unsigned num5 = opnd_array(5)->num_edges(); // tmp2 |
9783 | unsigned num6 = opnd_array(6)->num_edges(); // tmp3 |
9784 | unsigned num7 = opnd_array(7)->num_edges(); // tmp4 |
9785 | unsigned idx0 = oper_input_base(); |
9786 | unsigned idx1 = idx0 + num0; |
9787 | unsigned idx2 = idx1 + num1; |
9788 | unsigned idx3 = idx2 + num2; |
9789 | unsigned idx4 = idx3 + num3; |
9790 | unsigned idx5 = idx4 + num4; |
9791 | unsigned idx6 = idx5 + num5; |
9792 | unsigned idx7 = idx6 + num6; |
9793 | unsigned idx8 = idx7 + num7; |
9794 | set_opnd_array(3, opnd_array(4)->clone()); // tmp1 |
9795 | for (unsigned i = 0; i < num4; i++) { |
9796 | set_req(i + idx3, _in[i + idx4]); |
9797 | } |
9798 | num3 = num4; |
9799 | idx4 = idx3 + num3; |
9800 | set_opnd_array(4, opnd_array(5)->clone()); // tmp2 |
9801 | for (unsigned i = 0; i < num5; i++) { |
9802 | set_req(i + idx4, _in[i + idx5]); |
9803 | } |
9804 | num4 = num5; |
9805 | idx5 = idx4 + num4; |
9806 | set_opnd_array(5, opnd_array(6)->clone()); // tmp3 |
9807 | for (unsigned i = 0; i < num6; i++) { |
9808 | set_req(i + idx5, _in[i + idx6]); |
9809 | } |
9810 | num5 = num6; |
9811 | idx6 = idx5 + num5; |
9812 | set_opnd_array(6, opnd_array(7)->clone()); // tmp4 |
9813 | for (unsigned i = 0; i < num7; i++) { |
9814 | set_req(i + idx6, _in[i + idx7]); |
9815 | } |
9816 | num6 = num7; |
9817 | idx7 = idx6 + num6; |
9818 | for (int i = idx8 - 1; i >= (int)idx7; i--) { |
9819 | del_req(i); |
9820 | } |
9821 | _num_opnds = 7; |
9822 | } else { |
9823 | assert(_num_opnds == 7, "There should be either 7 or 8 operands.")do { if (!(_num_opnds == 7)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 9822, "assert(" "_num_opnds == 7" ") failed" , "There should be either 7 or 8 operands."); ::breakpoint(); } } while (0); |
9824 | } |
9825 | |
9826 | return this; |
9827 | } |
9828 | |
9829 | MachNode* minmax_reductionD_avNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
9830 | Compile* C = Compile::current(); |
9831 | // Add projection edges for additional defs or kills |
9832 | // TEMP dst |
9833 | MachTempNode *def; |
9834 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
9835 | add_req(def); |
9836 | // TEMP tmp1 |
9837 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9838 | add_req(def); |
9839 | // TEMP tmp2 |
9840 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9841 | add_req(def); |
9842 | // TEMP tmp3 |
9843 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9844 | add_req(def); |
9845 | // TEMP tmp4 |
9846 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9847 | add_req(def); |
9848 | // TEMP tmp5 |
9849 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9850 | add_req(def); |
9851 | // DEF/KILL cr |
9852 | MachProjNode *kill; |
9853 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
9854 | proj_list.push(kill); |
9855 | // Remove duplicated operands and inputs which use the same name. |
9856 | if (num_opnds() == 9) { |
9857 | unsigned num0 = 0; |
9858 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
9859 | unsigned num2 = opnd_array(2)->num_edges(); // src |
9860 | unsigned num3 = opnd_array(3)->num_edges(); // dst |
9861 | unsigned num4 = opnd_array(4)->num_edges(); // tmp1 |
9862 | unsigned num5 = opnd_array(5)->num_edges(); // tmp2 |
9863 | unsigned num6 = opnd_array(6)->num_edges(); // tmp3 |
9864 | unsigned num7 = opnd_array(7)->num_edges(); // tmp4 |
9865 | unsigned num8 = opnd_array(8)->num_edges(); // tmp5 |
9866 | unsigned idx0 = oper_input_base(); |
9867 | unsigned idx1 = idx0 + num0; |
9868 | unsigned idx2 = idx1 + num1; |
9869 | unsigned idx3 = idx2 + num2; |
9870 | unsigned idx4 = idx3 + num3; |
9871 | unsigned idx5 = idx4 + num4; |
9872 | unsigned idx6 = idx5 + num5; |
9873 | unsigned idx7 = idx6 + num6; |
9874 | unsigned idx8 = idx7 + num7; |
9875 | unsigned idx9 = idx8 + num8; |
9876 | set_opnd_array(3, opnd_array(4)->clone()); // tmp1 |
9877 | for (unsigned i = 0; i < num4; i++) { |
9878 | set_req(i + idx3, _in[i + idx4]); |
9879 | } |
9880 | num3 = num4; |
9881 | idx4 = idx3 + num3; |
9882 | set_opnd_array(4, opnd_array(5)->clone()); // tmp2 |
9883 | for (unsigned i = 0; i < num5; i++) { |
9884 | set_req(i + idx4, _in[i + idx5]); |
9885 | } |
9886 | num4 = num5; |
9887 | idx5 = idx4 + num4; |
9888 | set_opnd_array(5, opnd_array(6)->clone()); // tmp3 |
9889 | for (unsigned i = 0; i < num6; i++) { |
9890 | set_req(i + idx5, _in[i + idx6]); |
9891 | } |
9892 | num5 = num6; |
9893 | idx6 = idx5 + num5; |
9894 | set_opnd_array(6, opnd_array(7)->clone()); // tmp4 |
9895 | for (unsigned i = 0; i < num7; i++) { |
9896 | set_req(i + idx6, _in[i + idx7]); |
9897 | } |
9898 | num6 = num7; |
9899 | idx7 = idx6 + num6; |
9900 | set_opnd_array(7, opnd_array(8)->clone()); // tmp5 |
9901 | for (unsigned i = 0; i < num8; i++) { |
9902 | set_req(i + idx7, _in[i + idx8]); |
9903 | } |
9904 | num7 = num8; |
9905 | idx8 = idx7 + num7; |
9906 | for (int i = idx9 - 1; i >= (int)idx8; i--) { |
9907 | del_req(i); |
9908 | } |
9909 | _num_opnds = 8; |
9910 | } else { |
9911 | assert(_num_opnds == 8, "There should be either 8 or 9 operands.")do { if (!(_num_opnds == 8)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 9910, "assert(" "_num_opnds == 8" ") failed" , "There should be either 8 or 9 operands."); ::breakpoint(); } } while (0); |
9912 | } |
9913 | |
9914 | return this; |
9915 | } |
9916 | |
9917 | MachNode* minmax_reductionD_av_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
9918 | Compile* C = Compile::current(); |
9919 | // Add projection edges for additional defs or kills |
9920 | // TEMP dst |
9921 | MachTempNode *def; |
9922 | def = new MachTempNode(state->MachOperGenerator(LEGREGD)); |
9923 | add_req(def); |
9924 | // TEMP tmp1 |
9925 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9926 | add_req(def); |
9927 | // TEMP tmp2 |
9928 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9929 | add_req(def); |
9930 | // TEMP tmp3 |
9931 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9932 | add_req(def); |
9933 | // TEMP tmp4 |
9934 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9935 | add_req(def); |
9936 | // TEMP tmp5 |
9937 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
9938 | add_req(def); |
9939 | // DEF/KILL cr |
9940 | MachProjNode *kill; |
9941 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
9942 | proj_list.push(kill); |
9943 | // Remove duplicated operands and inputs which use the same name. |
9944 | if (num_opnds() == 9) { |
9945 | unsigned num0 = 0; |
9946 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
9947 | unsigned num2 = opnd_array(2)->num_edges(); // src |
9948 | unsigned num3 = opnd_array(3)->num_edges(); // dst |
9949 | unsigned num4 = opnd_array(4)->num_edges(); // tmp1 |
9950 | unsigned num5 = opnd_array(5)->num_edges(); // tmp2 |
9951 | unsigned num6 = opnd_array(6)->num_edges(); // tmp3 |
9952 | unsigned num7 = opnd_array(7)->num_edges(); // tmp4 |
9953 | unsigned num8 = opnd_array(8)->num_edges(); // tmp5 |
9954 | unsigned idx0 = oper_input_base(); |
9955 | unsigned idx1 = idx0 + num0; |
9956 | unsigned idx2 = idx1 + num1; |
9957 | unsigned idx3 = idx2 + num2; |
9958 | unsigned idx4 = idx3 + num3; |
9959 | unsigned idx5 = idx4 + num4; |
9960 | unsigned idx6 = idx5 + num5; |
9961 | unsigned idx7 = idx6 + num6; |
9962 | unsigned idx8 = idx7 + num7; |
9963 | unsigned idx9 = idx8 + num8; |
9964 | set_opnd_array(3, opnd_array(4)->clone()); // tmp1 |
9965 | for (unsigned i = 0; i < num4; i++) { |
9966 | set_req(i + idx3, _in[i + idx4]); |
9967 | } |
9968 | num3 = num4; |
9969 | idx4 = idx3 + num3; |
9970 | set_opnd_array(4, opnd_array(5)->clone()); // tmp2 |
9971 | for (unsigned i = 0; i < num5; i++) { |
9972 | set_req(i + idx4, _in[i + idx5]); |
9973 | } |
9974 | num4 = num5; |
9975 | idx5 = idx4 + num4; |
9976 | set_opnd_array(5, opnd_array(6)->clone()); // tmp3 |
9977 | for (unsigned i = 0; i < num6; i++) { |
9978 | set_req(i + idx5, _in[i + idx6]); |
9979 | } |
9980 | num5 = num6; |
9981 | idx6 = idx5 + num5; |
9982 | set_opnd_array(6, opnd_array(7)->clone()); // tmp4 |
9983 | for (unsigned i = 0; i < num7; i++) { |
9984 | set_req(i + idx6, _in[i + idx7]); |
9985 | } |
9986 | num6 = num7; |
9987 | idx7 = idx6 + num6; |
9988 | set_opnd_array(7, opnd_array(8)->clone()); // tmp5 |
9989 | for (unsigned i = 0; i < num8; i++) { |
9990 | set_req(i + idx7, _in[i + idx8]); |
9991 | } |
9992 | num7 = num8; |
9993 | idx8 = idx7 + num7; |
9994 | for (int i = idx9 - 1; i >= (int)idx8; i--) { |
9995 | del_req(i); |
9996 | } |
9997 | _num_opnds = 8; |
9998 | } else { |
9999 | assert(_num_opnds == 8, "There should be either 8 or 9 operands.")do { if (!(_num_opnds == 8)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 9998, "assert(" "_num_opnds == 8" ") failed" , "There should be either 8 or 9 operands."); ::breakpoint(); } } while (0); |
10000 | } |
10001 | |
10002 | return this; |
10003 | } |
10004 | |
10005 | MachNode* mulB_regNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
10006 | Compile* C = Compile::current(); |
10007 | // Add projection edges for additional defs or kills |
10008 | // TEMP dst |
10009 | MachTempNode *def; |
10010 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10011 | add_req(def); |
10012 | // TEMP tmp |
10013 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10014 | add_req(def); |
10015 | // TEMP scratch |
10016 | def = new MachTempNode(state->MachOperGenerator(RREGI)); |
10017 | add_req(def); |
10018 | |
10019 | return this; |
10020 | } |
10021 | |
10022 | MachNode* mul16B_regNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
10023 | Compile* C = Compile::current(); |
10024 | // Add projection edges for additional defs or kills |
10025 | // TEMP dst |
10026 | MachTempNode *def; |
10027 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10028 | add_req(def); |
10029 | // TEMP tmp1 |
10030 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10031 | add_req(def); |
10032 | // TEMP tmp2 |
10033 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10034 | add_req(def); |
10035 | // TEMP scratch |
10036 | def = new MachTempNode(state->MachOperGenerator(RREGI)); |
10037 | add_req(def); |
10038 | |
10039 | return this; |
10040 | } |
10041 | |
10042 | MachNode* vmul16B_reg_avxNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
10043 | Compile* C = Compile::current(); |
10044 | // Add projection edges for additional defs or kills |
10045 | // TEMP dst |
10046 | MachTempNode *def; |
10047 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10048 | add_req(def); |
10049 | // TEMP tmp |
10050 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10051 | add_req(def); |
10052 | // TEMP scratch |
10053 | def = new MachTempNode(state->MachOperGenerator(RREGI)); |
10054 | add_req(def); |
10055 | |
10056 | return this; |
10057 | } |
10058 | |
10059 | MachNode* vmul32B_reg_avxNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
10060 | Compile* C = Compile::current(); |
10061 | // Add projection edges for additional defs or kills |
10062 | // TEMP dst |
10063 | MachTempNode *def; |
10064 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10065 | add_req(def); |
10066 | // TEMP tmp1 |
10067 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10068 | add_req(def); |
10069 | // TEMP tmp2 |
10070 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10071 | add_req(def); |
10072 | // TEMP scratch |
10073 | def = new MachTempNode(state->MachOperGenerator(RREGI)); |
10074 | add_req(def); |
10075 | |
10076 | return this; |
10077 | } |
10078 | |
10079 | MachNode* vmul64B_reg_avxNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
10080 | Compile* C = Compile::current(); |
10081 | // Add projection edges for additional defs or kills |
10082 | // TEMP dst |
10083 | MachTempNode *def; |
10084 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10085 | add_req(def); |
10086 | // TEMP tmp1 |
10087 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10088 | add_req(def); |
10089 | // TEMP tmp2 |
10090 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10091 | add_req(def); |
10092 | // TEMP scratch |
10093 | def = new MachTempNode(state->MachOperGenerator(RREGI)); |
10094 | add_req(def); |
10095 | |
10096 | return this; |
10097 | } |
10098 | |
10099 | MachNode* mul2L_regNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
10100 | Compile* C = Compile::current(); |
10101 | // Add projection edges for additional defs or kills |
10102 | // TEMP dst |
10103 | MachTempNode *def; |
10104 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10105 | add_req(def); |
10106 | // TEMP tmp |
10107 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
10108 | add_req(def); |
10109 | // Remove duplicated operands and inputs which use the same name. |
10110 | if (num_opnds() == 5) { |
10111 | unsigned num0 = 0; |
10112 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
10113 | unsigned num2 = opnd_array(2)->num_edges(); // src2 |
10114 | unsigned num3 = opnd_array(3)->num_edges(); // dst |
10115 | unsigned num4 = opnd_array(4)->num_edges(); // tmp |
10116 | unsigned idx0 = oper_input_base(); |
10117 | unsigned idx1 = idx0 + num0; |
10118 | unsigned idx2 = idx1 + num1; |
10119 | unsigned idx3 = idx2 + num2; |
10120 | unsigned idx4 = idx3 + num3; |
10121 | unsigned idx5 = idx4 + num4; |
10122 | set_opnd_array(3, opnd_array(4)->clone()); // tmp |
10123 | for (unsigned i = 0; i < num4; i++) { |
10124 | set_req(i + idx3, _in[i + idx4]); |
10125 | } |
10126 | num3 = num4; |
10127 | idx4 = idx3 + num3; |
10128 | for (int i = idx5 - 1; i >= (int)idx4; i--) { |
10129 | del_req(i); |
10130 | } |
10131 | _num_opnds = 4; |
10132 | } else { |
10133 | assert(_num_opnds == 4, "There should be either 4 or 5 operands.")do { if (!(_num_opnds == 4)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 10132, "assert(" "_num_opnds == 4" ") failed" , "There should be either 4 or 5 operands."); ::breakpoint(); } } while (0); |
10134 | } |
10135 | |
10136 | return this; |
10137 | } |
10138 | |
10139 | MachNode* vmul4L_reg_avxNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
10140 | Compile* C = Compile::current(); |
10141 | // Add projection edges for additional defs or kills |
10142 | // TEMP tmp |
10143 | MachTempNode *def; |
10144 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
10145 | add_req(def); |
10146 | // TEMP tmp1 |
10147 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
10148 | add_req(def); |
10149 | |
10150 | return this; |
10151 | } |
10152 | |
10153 | MachNode* vcmov8F_regNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
10154 | Compile* C = Compile::current(); |
10155 | // Add projection edges for additional defs or kills |
10156 | // TEMP dst |
10157 | MachTempNode *def; |
10158 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
10159 | add_req(def); |
10160 | |
10161 | return this; |
10162 | } |
10163 | |
10164 | MachNode* vcmov4D_regNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
10165 | Compile* C = Compile::current(); |
10166 | // Add projection edges for additional defs or kills |
10167 | // TEMP dst |
10168 | MachTempNode *def; |
10169 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
10170 | add_req(def); |
10171 | |
10172 | return this; |
10173 | } |
10174 | |
10175 | MachNode* minmaxL_reg_sseNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
10176 | Compile* C = Compile::current(); |
10177 | // Add projection edges for additional defs or kills |
10178 | // TEMP dst |
10179 | MachTempNode *def; |
10180 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10181 | add_req(def); |
10182 | // TEMP tmp |
10183 | def = new MachTempNode(state->MachOperGenerator(RXMM0)); |
10184 | add_req(def); |
10185 | // Remove duplicated operands and inputs which use the same name. |
10186 | if (num_opnds() == 5) { |
10187 | unsigned num0 = 0; |
10188 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
10189 | unsigned num2 = opnd_array(2)->num_edges(); // src |
10190 | unsigned num3 = opnd_array(3)->num_edges(); // dst |
10191 | unsigned num4 = opnd_array(4)->num_edges(); // tmp |
10192 | unsigned idx0 = oper_input_base(); |
10193 | unsigned idx1 = idx0 + num0; |
10194 | unsigned idx2 = idx1 + num1; |
10195 | unsigned idx3 = idx2 + num2; |
10196 | unsigned idx4 = idx3 + num3; |
10197 | unsigned idx5 = idx4 + num4; |
10198 | set_opnd_array(3, opnd_array(4)->clone()); // tmp |
10199 | for (unsigned i = 0; i < num4; i++) { |
10200 | set_req(i + idx3, _in[i + idx4]); |
10201 | } |
10202 | num3 = num4; |
10203 | idx4 = idx3 + num3; |
10204 | for (int i = idx5 - 1; i >= (int)idx4; i--) { |
10205 | del_req(i); |
10206 | } |
10207 | _num_opnds = 4; |
10208 | } else { |
10209 | assert(_num_opnds == 4, "There should be either 4 or 5 operands.")do { if (!(_num_opnds == 4)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 10208, "assert(" "_num_opnds == 4" ") failed" , "There should be either 4 or 5 operands."); ::breakpoint(); } } while (0); |
10210 | } |
10211 | |
10212 | return this; |
10213 | } |
10214 | |
10215 | MachNode* minmaxL_reg_sse_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
10216 | Compile* C = Compile::current(); |
10217 | // Add projection edges for additional defs or kills |
10218 | // TEMP dst |
10219 | MachTempNode *def; |
10220 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10221 | add_req(def); |
10222 | // TEMP tmp |
10223 | def = new MachTempNode(state->MachOperGenerator(RXMM0)); |
10224 | add_req(def); |
10225 | // Remove duplicated operands and inputs which use the same name. |
10226 | if (num_opnds() == 5) { |
10227 | unsigned num0 = 0; |
10228 | unsigned num1 = opnd_array(1)->num_edges(); // src |
10229 | unsigned num2 = opnd_array(2)->num_edges(); // dst |
10230 | unsigned num3 = opnd_array(3)->num_edges(); // dst |
10231 | unsigned num4 = opnd_array(4)->num_edges(); // tmp |
10232 | unsigned idx0 = oper_input_base(); |
10233 | unsigned idx1 = idx0 + num0; |
10234 | unsigned idx2 = idx1 + num1; |
10235 | unsigned idx3 = idx2 + num2; |
10236 | unsigned idx4 = idx3 + num3; |
10237 | unsigned idx5 = idx4 + num4; |
10238 | set_opnd_array(3, opnd_array(4)->clone()); // tmp |
10239 | for (unsigned i = 0; i < num4; i++) { |
10240 | set_req(i + idx3, _in[i + idx4]); |
10241 | } |
10242 | num3 = num4; |
10243 | idx4 = idx3 + num3; |
10244 | for (int i = idx5 - 1; i >= (int)idx4; i--) { |
10245 | del_req(i); |
10246 | } |
10247 | _num_opnds = 4; |
10248 | } else { |
10249 | assert(_num_opnds == 4, "There should be either 4 or 5 operands.")do { if (!(_num_opnds == 4)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 10248, "assert(" "_num_opnds == 4" ") failed" , "There should be either 4 or 5 operands."); ::breakpoint(); } } while (0); |
10250 | } |
10251 | |
10252 | return this; |
10253 | } |
10254 | |
10255 | MachNode* vminmaxL_reg_avxNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
10256 | Compile* C = Compile::current(); |
10257 | // Add projection edges for additional defs or kills |
10258 | // TEMP dst |
10259 | MachTempNode *def; |
10260 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
10261 | add_req(def); |
10262 | |
10263 | return this; |
10264 | } |
10265 | |
10266 | MachNode* vminmaxL_reg_avx_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
10267 | Compile* C = Compile::current(); |
10268 | // Add projection edges for additional defs or kills |
10269 | // TEMP dst |
10270 | MachTempNode *def; |
10271 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
10272 | add_req(def); |
10273 | |
10274 | return this; |
10275 | } |
10276 | |
10277 | MachNode* minmaxFP_regNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
10278 | Compile* C = Compile::current(); |
10279 | // Add projection edges for additional defs or kills |
10280 | // TEMP tmp |
10281 | MachTempNode *def; |
10282 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
10283 | add_req(def); |
10284 | // TEMP atmp |
10285 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
10286 | add_req(def); |
10287 | // TEMP btmp |
10288 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
10289 | add_req(def); |
10290 | |
10291 | return this; |
10292 | } |
10293 | |
10294 | MachNode* minmaxFP_reg_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
10295 | Compile* C = Compile::current(); |
10296 | // Add projection edges for additional defs or kills |
10297 | // TEMP tmp |
10298 | MachTempNode *def; |
10299 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
10300 | add_req(def); |
10301 | // TEMP atmp |
10302 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
10303 | add_req(def); |
10304 | // TEMP btmp |
10305 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
10306 | add_req(def); |
10307 | |
10308 | return this; |
10309 | } |
10310 | |
10311 | MachNode* evminmaxFP_reg_eavxNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
10312 | Compile* C = Compile::current(); |
10313 | // Add projection edges for additional defs or kills |
10314 | // TEMP dst |
10315 | MachTempNode *def; |
10316 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10317 | add_req(def); |
10318 | // TEMP atmp |
10319 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10320 | add_req(def); |
10321 | // TEMP btmp |
10322 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10323 | add_req(def); |
10324 | // TEMP ktmp |
10325 | def = new MachTempNode(state->MachOperGenerator(KREG)); |
10326 | add_req(def); |
10327 | |
10328 | return this; |
10329 | } |
10330 | |
10331 | MachNode* evminmaxFP_reg_eavx_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
10332 | Compile* C = Compile::current(); |
10333 | // Add projection edges for additional defs or kills |
10334 | // TEMP dst |
10335 | MachTempNode *def; |
10336 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10337 | add_req(def); |
10338 | // TEMP atmp |
10339 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10340 | add_req(def); |
10341 | // TEMP btmp |
10342 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10343 | add_req(def); |
10344 | // TEMP ktmp |
10345 | def = new MachTempNode(state->MachOperGenerator(KREG)); |
10346 | add_req(def); |
10347 | |
10348 | return this; |
10349 | } |
10350 | |
10351 | MachNode* signumF_regNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
10352 | Compile* C = Compile::current(); |
10353 | // Add projection edges for additional defs or kills |
10354 | // TEMP scratch |
10355 | MachTempNode *def; |
10356 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
10357 | add_req(def); |
10358 | // DEF/KILL cr |
10359 | MachProjNode *kill; |
10360 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
10361 | proj_list.push(kill); |
10362 | |
10363 | return this; |
10364 | } |
10365 | |
10366 | MachNode* signumD_regNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
10367 | Compile* C = Compile::current(); |
10368 | // Add projection edges for additional defs or kills |
10369 | // TEMP scratch |
10370 | MachTempNode *def; |
10371 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
10372 | add_req(def); |
10373 | // DEF/KILL cr |
10374 | MachProjNode *kill; |
10375 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
10376 | proj_list.push(kill); |
10377 | |
10378 | return this; |
10379 | } |
10380 | |
10381 | MachNode* copySignF_regNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
10382 | Compile* C = Compile::current(); |
10383 | // Add projection edges for additional defs or kills |
10384 | // TEMP tmp1 |
10385 | MachTempNode *def; |
10386 | def = new MachTempNode(state->MachOperGenerator(REGF)); |
10387 | add_req(def); |
10388 | // TEMP tmp2 |
10389 | def = new MachTempNode(state->MachOperGenerator(RREGI)); |
10390 | add_req(def); |
10391 | |
10392 | return this; |
10393 | } |
10394 | |
10395 | MachNode* copySignD_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
10396 | Compile* C = Compile::current(); |
10397 | // Add projection edges for additional defs or kills |
10398 | // TEMP tmp1 |
10399 | MachTempNode *def; |
10400 | def = new MachTempNode(state->MachOperGenerator(REGD)); |
10401 | add_req(def); |
10402 | // TEMP tmp2 |
10403 | def = new MachTempNode(state->MachOperGenerator(RREGL)); |
10404 | add_req(def); |
10405 | |
10406 | return this; |
10407 | } |
10408 | |
10409 | MachNode* vshiftBNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
10410 | Compile* C = Compile::current(); |
10411 | // Add projection edges for additional defs or kills |
10412 | // TEMP dst |
10413 | MachTempNode *def; |
10414 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10415 | add_req(def); |
10416 | // TEMP tmp |
10417 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10418 | add_req(def); |
10419 | // TEMP scratch |
10420 | def = new MachTempNode(state->MachOperGenerator(RREGI)); |
10421 | add_req(def); |
10422 | |
10423 | return this; |
10424 | } |
10425 | |
10426 | MachNode* vshiftB_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
10427 | Compile* C = Compile::current(); |
10428 | // Add projection edges for additional defs or kills |
10429 | // TEMP dst |
10430 | MachTempNode *def; |
10431 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10432 | add_req(def); |
10433 | // TEMP tmp |
10434 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10435 | add_req(def); |
10436 | // TEMP scratch |
10437 | def = new MachTempNode(state->MachOperGenerator(RREGI)); |
10438 | add_req(def); |
10439 | |
10440 | return this; |
10441 | } |
10442 | |
10443 | MachNode* vshiftB_1Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
10444 | Compile* C = Compile::current(); |
10445 | // Add projection edges for additional defs or kills |
10446 | // TEMP dst |
10447 | MachTempNode *def; |
10448 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10449 | add_req(def); |
10450 | // TEMP tmp |
10451 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10452 | add_req(def); |
10453 | // TEMP scratch |
10454 | def = new MachTempNode(state->MachOperGenerator(RREGI)); |
10455 | add_req(def); |
10456 | |
10457 | return this; |
10458 | } |
10459 | |
10460 | MachNode* vshift16BNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
10461 | Compile* C = Compile::current(); |
10462 | // Add projection edges for additional defs or kills |
10463 | // TEMP dst |
10464 | MachTempNode *def; |
10465 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10466 | add_req(def); |
10467 | // TEMP tmp1 |
10468 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10469 | add_req(def); |
10470 | // TEMP tmp2 |
10471 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10472 | add_req(def); |
10473 | // TEMP scratch |
10474 | def = new MachTempNode(state->MachOperGenerator(RREGI)); |
10475 | add_req(def); |
10476 | |
10477 | return this; |
10478 | } |
10479 | |
10480 | MachNode* vshift16B_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
10481 | Compile* C = Compile::current(); |
10482 | // Add projection edges for additional defs or kills |
10483 | // TEMP dst |
10484 | MachTempNode *def; |
10485 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10486 | add_req(def); |
10487 | // TEMP tmp1 |
10488 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10489 | add_req(def); |
10490 | // TEMP tmp2 |
10491 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10492 | add_req(def); |
10493 | // TEMP scratch |
10494 | def = new MachTempNode(state->MachOperGenerator(RREGI)); |
10495 | add_req(def); |
10496 | |
10497 | return this; |
10498 | } |
10499 | |
10500 | MachNode* vshift16B_1Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
10501 | Compile* C = Compile::current(); |
10502 | // Add projection edges for additional defs or kills |
10503 | // TEMP dst |
10504 | MachTempNode *def; |
10505 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10506 | add_req(def); |
10507 | // TEMP tmp1 |
10508 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10509 | add_req(def); |
10510 | // TEMP tmp2 |
10511 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10512 | add_req(def); |
10513 | // TEMP scratch |
10514 | def = new MachTempNode(state->MachOperGenerator(RREGI)); |
10515 | add_req(def); |
10516 | |
10517 | return this; |
10518 | } |
10519 | |
10520 | MachNode* vshift16B_avxNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
10521 | Compile* C = Compile::current(); |
10522 | // Add projection edges for additional defs or kills |
10523 | // TEMP dst |
10524 | MachTempNode *def; |
10525 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10526 | add_req(def); |
10527 | // TEMP tmp |
10528 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10529 | add_req(def); |
10530 | // TEMP scratch |
10531 | def = new MachTempNode(state->MachOperGenerator(RREGI)); |
10532 | add_req(def); |
10533 | |
10534 | return this; |
10535 | } |
10536 | |
10537 | MachNode* vshift16B_avx_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
10538 | Compile* C = Compile::current(); |
10539 | // Add projection edges for additional defs or kills |
10540 | // TEMP dst |
10541 | MachTempNode *def; |
10542 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10543 | add_req(def); |
10544 | // TEMP tmp |
10545 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10546 | add_req(def); |
10547 | // TEMP scratch |
10548 | def = new MachTempNode(state->MachOperGenerator(RREGI)); |
10549 | add_req(def); |
10550 | |
10551 | return this; |
10552 | } |
10553 | |
10554 | MachNode* vshift16B_avx_1Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
10555 | Compile* C = Compile::current(); |
10556 | // Add projection edges for additional defs or kills |
10557 | // TEMP dst |
10558 | MachTempNode *def; |
10559 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10560 | add_req(def); |
10561 | // TEMP tmp |
10562 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10563 | add_req(def); |
10564 | // TEMP scratch |
10565 | def = new MachTempNode(state->MachOperGenerator(RREGI)); |
10566 | add_req(def); |
10567 | |
10568 | return this; |
10569 | } |
10570 | |
10571 | MachNode* vshift32B_avxNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
10572 | Compile* C = Compile::current(); |
10573 | // Add projection edges for additional defs or kills |
10574 | // TEMP dst |
10575 | MachTempNode *def; |
10576 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10577 | add_req(def); |
10578 | // TEMP tmp |
10579 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10580 | add_req(def); |
10581 | // TEMP scratch |
10582 | def = new MachTempNode(state->MachOperGenerator(RREGI)); |
10583 | add_req(def); |
10584 | |
10585 | return this; |
10586 | } |
10587 | |
10588 | MachNode* vshift32B_avx_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
10589 | Compile* C = Compile::current(); |
10590 | // Add projection edges for additional defs or kills |
10591 | // TEMP dst |
10592 | MachTempNode *def; |
10593 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10594 | add_req(def); |
10595 | // TEMP tmp |
10596 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10597 | add_req(def); |
10598 | // TEMP scratch |
10599 | def = new MachTempNode(state->MachOperGenerator(RREGI)); |
10600 | add_req(def); |
10601 | |
10602 | return this; |
10603 | } |
10604 | |
10605 | MachNode* vshift32B_avx_1Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
10606 | Compile* C = Compile::current(); |
10607 | // Add projection edges for additional defs or kills |
10608 | // TEMP dst |
10609 | MachTempNode *def; |
10610 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10611 | add_req(def); |
10612 | // TEMP tmp |
10613 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10614 | add_req(def); |
10615 | // TEMP scratch |
10616 | def = new MachTempNode(state->MachOperGenerator(RREGI)); |
10617 | add_req(def); |
10618 | |
10619 | return this; |
10620 | } |
10621 | |
10622 | MachNode* vshift64B_avxNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
10623 | Compile* C = Compile::current(); |
10624 | // Add projection edges for additional defs or kills |
10625 | // TEMP dst |
10626 | MachTempNode *def; |
10627 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10628 | add_req(def); |
10629 | // TEMP tmp1 |
10630 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10631 | add_req(def); |
10632 | // TEMP tmp2 |
10633 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10634 | add_req(def); |
10635 | // TEMP scratch |
10636 | def = new MachTempNode(state->MachOperGenerator(RREGI)); |
10637 | add_req(def); |
10638 | |
10639 | return this; |
10640 | } |
10641 | |
10642 | MachNode* vshift64B_avx_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
10643 | Compile* C = Compile::current(); |
10644 | // Add projection edges for additional defs or kills |
10645 | // TEMP dst |
10646 | MachTempNode *def; |
10647 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10648 | add_req(def); |
10649 | // TEMP tmp1 |
10650 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10651 | add_req(def); |
10652 | // TEMP tmp2 |
10653 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10654 | add_req(def); |
10655 | // TEMP scratch |
10656 | def = new MachTempNode(state->MachOperGenerator(RREGI)); |
10657 | add_req(def); |
10658 | |
10659 | return this; |
10660 | } |
10661 | |
10662 | MachNode* vshift64B_avx_1Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
10663 | Compile* C = Compile::current(); |
10664 | // Add projection edges for additional defs or kills |
10665 | // TEMP dst |
10666 | MachTempNode *def; |
10667 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10668 | add_req(def); |
10669 | // TEMP tmp1 |
10670 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10671 | add_req(def); |
10672 | // TEMP tmp2 |
10673 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10674 | add_req(def); |
10675 | // TEMP scratch |
10676 | def = new MachTempNode(state->MachOperGenerator(RREGI)); |
10677 | add_req(def); |
10678 | |
10679 | return this; |
10680 | } |
10681 | |
10682 | MachNode* vshiftSNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
10683 | Compile* C = Compile::current(); |
10684 | // Add projection edges for additional defs or kills |
10685 | // TEMP dst |
10686 | MachTempNode *def; |
10687 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10688 | add_req(def); |
10689 | |
10690 | return this; |
10691 | } |
10692 | |
10693 | MachNode* vshiftS_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
10694 | Compile* C = Compile::current(); |
10695 | // Add projection edges for additional defs or kills |
10696 | // TEMP dst |
10697 | MachTempNode *def; |
10698 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10699 | add_req(def); |
10700 | |
10701 | return this; |
10702 | } |
10703 | |
10704 | MachNode* vshiftS_1Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
10705 | Compile* C = Compile::current(); |
10706 | // Add projection edges for additional defs or kills |
10707 | // TEMP dst |
10708 | MachTempNode *def; |
10709 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10710 | add_req(def); |
10711 | |
10712 | return this; |
10713 | } |
10714 | |
10715 | MachNode* vshiftINode::Expand(State* state, Node_List& proj_list, Node* mem) { |
10716 | Compile* C = Compile::current(); |
10717 | // Add projection edges for additional defs or kills |
10718 | // TEMP dst |
10719 | MachTempNode *def; |
10720 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10721 | add_req(def); |
10722 | |
10723 | return this; |
10724 | } |
10725 | |
10726 | MachNode* vshiftI_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
10727 | Compile* C = Compile::current(); |
10728 | // Add projection edges for additional defs or kills |
10729 | // TEMP dst |
10730 | MachTempNode *def; |
10731 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10732 | add_req(def); |
10733 | |
10734 | return this; |
10735 | } |
10736 | |
10737 | MachNode* vshiftI_1Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
10738 | Compile* C = Compile::current(); |
10739 | // Add projection edges for additional defs or kills |
10740 | // TEMP dst |
10741 | MachTempNode *def; |
10742 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10743 | add_req(def); |
10744 | |
10745 | return this; |
10746 | } |
10747 | |
10748 | MachNode* vshiftLNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
10749 | Compile* C = Compile::current(); |
10750 | // Add projection edges for additional defs or kills |
10751 | // TEMP dst |
10752 | MachTempNode *def; |
10753 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10754 | add_req(def); |
10755 | |
10756 | return this; |
10757 | } |
10758 | |
10759 | MachNode* vshiftL_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
10760 | Compile* C = Compile::current(); |
10761 | // Add projection edges for additional defs or kills |
10762 | // TEMP dst |
10763 | MachTempNode *def; |
10764 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10765 | add_req(def); |
10766 | |
10767 | return this; |
10768 | } |
10769 | |
10770 | MachNode* vshiftL_arith_regNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
10771 | Compile* C = Compile::current(); |
10772 | // Add projection edges for additional defs or kills |
10773 | // TEMP dst |
10774 | MachTempNode *def; |
10775 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10776 | add_req(def); |
10777 | // TEMP tmp |
10778 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10779 | add_req(def); |
10780 | // TEMP scratch |
10781 | def = new MachTempNode(state->MachOperGenerator(RREGI)); |
10782 | add_req(def); |
10783 | |
10784 | return this; |
10785 | } |
10786 | |
10787 | MachNode* vshift8B_var_nobwNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
10788 | Compile* C = Compile::current(); |
10789 | // Add projection edges for additional defs or kills |
10790 | // TEMP dst |
10791 | MachTempNode *def; |
10792 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10793 | add_req(def); |
10794 | // TEMP vtmp |
10795 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10796 | add_req(def); |
10797 | // TEMP scratch |
10798 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
10799 | add_req(def); |
10800 | |
10801 | return this; |
10802 | } |
10803 | |
10804 | MachNode* vshift8B_var_nobw_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
10805 | Compile* C = Compile::current(); |
10806 | // Add projection edges for additional defs or kills |
10807 | // TEMP dst |
10808 | MachTempNode *def; |
10809 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10810 | add_req(def); |
10811 | // TEMP vtmp |
10812 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10813 | add_req(def); |
10814 | // TEMP scratch |
10815 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
10816 | add_req(def); |
10817 | |
10818 | return this; |
10819 | } |
10820 | |
10821 | MachNode* vshift8B_var_nobw_1Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
10822 | Compile* C = Compile::current(); |
10823 | // Add projection edges for additional defs or kills |
10824 | // TEMP dst |
10825 | MachTempNode *def; |
10826 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10827 | add_req(def); |
10828 | // TEMP vtmp |
10829 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10830 | add_req(def); |
10831 | // TEMP scratch |
10832 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
10833 | add_req(def); |
10834 | |
10835 | return this; |
10836 | } |
10837 | |
10838 | MachNode* vshift16B_var_nobwNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
10839 | Compile* C = Compile::current(); |
10840 | // Add projection edges for additional defs or kills |
10841 | // TEMP dst |
10842 | MachTempNode *def; |
10843 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10844 | add_req(def); |
10845 | // TEMP vtmp1 |
10846 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10847 | add_req(def); |
10848 | // TEMP vtmp2 |
10849 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10850 | add_req(def); |
10851 | // TEMP scratch |
10852 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
10853 | add_req(def); |
10854 | |
10855 | return this; |
10856 | } |
10857 | |
10858 | MachNode* vshift16B_var_nobw_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
10859 | Compile* C = Compile::current(); |
10860 | // Add projection edges for additional defs or kills |
10861 | // TEMP dst |
10862 | MachTempNode *def; |
10863 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10864 | add_req(def); |
10865 | // TEMP vtmp1 |
10866 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10867 | add_req(def); |
10868 | // TEMP vtmp2 |
10869 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10870 | add_req(def); |
10871 | // TEMP scratch |
10872 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
10873 | add_req(def); |
10874 | |
10875 | return this; |
10876 | } |
10877 | |
10878 | MachNode* vshift16B_var_nobw_1Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
10879 | Compile* C = Compile::current(); |
10880 | // Add projection edges for additional defs or kills |
10881 | // TEMP dst |
10882 | MachTempNode *def; |
10883 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10884 | add_req(def); |
10885 | // TEMP vtmp1 |
10886 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10887 | add_req(def); |
10888 | // TEMP vtmp2 |
10889 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10890 | add_req(def); |
10891 | // TEMP scratch |
10892 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
10893 | add_req(def); |
10894 | |
10895 | return this; |
10896 | } |
10897 | |
10898 | MachNode* vshift32B_var_nobwNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
10899 | Compile* C = Compile::current(); |
10900 | // Add projection edges for additional defs or kills |
10901 | // TEMP dst |
10902 | MachTempNode *def; |
10903 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10904 | add_req(def); |
10905 | // TEMP vtmp1 |
10906 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10907 | add_req(def); |
10908 | // TEMP vtmp2 |
10909 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10910 | add_req(def); |
10911 | // TEMP vtmp3 |
10912 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10913 | add_req(def); |
10914 | // TEMP vtmp4 |
10915 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10916 | add_req(def); |
10917 | // TEMP scratch |
10918 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
10919 | add_req(def); |
10920 | |
10921 | return this; |
10922 | } |
10923 | |
10924 | MachNode* vshift32B_var_nobw_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
10925 | Compile* C = Compile::current(); |
10926 | // Add projection edges for additional defs or kills |
10927 | // TEMP dst |
10928 | MachTempNode *def; |
10929 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10930 | add_req(def); |
10931 | // TEMP vtmp1 |
10932 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10933 | add_req(def); |
10934 | // TEMP vtmp2 |
10935 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10936 | add_req(def); |
10937 | // TEMP vtmp3 |
10938 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10939 | add_req(def); |
10940 | // TEMP vtmp4 |
10941 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10942 | add_req(def); |
10943 | // TEMP scratch |
10944 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
10945 | add_req(def); |
10946 | |
10947 | return this; |
10948 | } |
10949 | |
10950 | MachNode* vshift32B_var_nobw_1Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
10951 | Compile* C = Compile::current(); |
10952 | // Add projection edges for additional defs or kills |
10953 | // TEMP dst |
10954 | MachTempNode *def; |
10955 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10956 | add_req(def); |
10957 | // TEMP vtmp1 |
10958 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10959 | add_req(def); |
10960 | // TEMP vtmp2 |
10961 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10962 | add_req(def); |
10963 | // TEMP vtmp3 |
10964 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10965 | add_req(def); |
10966 | // TEMP vtmp4 |
10967 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10968 | add_req(def); |
10969 | // TEMP scratch |
10970 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
10971 | add_req(def); |
10972 | |
10973 | return this; |
10974 | } |
10975 | |
10976 | MachNode* vshiftB_var_evex_bwNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
10977 | Compile* C = Compile::current(); |
10978 | // Add projection edges for additional defs or kills |
10979 | // TEMP dst |
10980 | MachTempNode *def; |
10981 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10982 | add_req(def); |
10983 | // TEMP vtmp |
10984 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10985 | add_req(def); |
10986 | // TEMP scratch |
10987 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
10988 | add_req(def); |
10989 | |
10990 | return this; |
10991 | } |
10992 | |
10993 | MachNode* vshiftB_var_evex_bw_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
10994 | Compile* C = Compile::current(); |
10995 | // Add projection edges for additional defs or kills |
10996 | // TEMP dst |
10997 | MachTempNode *def; |
10998 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
10999 | add_req(def); |
11000 | // TEMP vtmp |
11001 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
11002 | add_req(def); |
11003 | // TEMP scratch |
11004 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
11005 | add_req(def); |
11006 | |
11007 | return this; |
11008 | } |
11009 | |
11010 | MachNode* vshiftB_var_evex_bw_1Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
11011 | Compile* C = Compile::current(); |
11012 | // Add projection edges for additional defs or kills |
11013 | // TEMP dst |
11014 | MachTempNode *def; |
11015 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
11016 | add_req(def); |
11017 | // TEMP vtmp |
11018 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
11019 | add_req(def); |
11020 | // TEMP scratch |
11021 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
11022 | add_req(def); |
11023 | |
11024 | return this; |
11025 | } |
11026 | |
11027 | MachNode* vshift64B_var_evex_bwNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
11028 | Compile* C = Compile::current(); |
11029 | // Add projection edges for additional defs or kills |
11030 | // TEMP dst |
11031 | MachTempNode *def; |
11032 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
11033 | add_req(def); |
11034 | // TEMP vtmp1 |
11035 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
11036 | add_req(def); |
11037 | // TEMP vtmp2 |
11038 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
11039 | add_req(def); |
11040 | // TEMP scratch |
11041 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
11042 | add_req(def); |
11043 | |
11044 | return this; |
11045 | } |
11046 | |
11047 | MachNode* vshift64B_var_evex_bw_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
11048 | Compile* C = Compile::current(); |
11049 | // Add projection edges for additional defs or kills |
11050 | // TEMP dst |
11051 | MachTempNode *def; |
11052 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
11053 | add_req(def); |
11054 | // TEMP vtmp1 |
11055 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
11056 | add_req(def); |
11057 | // TEMP vtmp2 |
11058 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
11059 | add_req(def); |
11060 | // TEMP scratch |
11061 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
11062 | add_req(def); |
11063 | |
11064 | return this; |
11065 | } |
11066 | |
11067 | MachNode* vshift64B_var_evex_bw_1Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
11068 | Compile* C = Compile::current(); |
11069 | // Add projection edges for additional defs or kills |
11070 | // TEMP dst |
11071 | MachTempNode *def; |
11072 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
11073 | add_req(def); |
11074 | // TEMP vtmp1 |
11075 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
11076 | add_req(def); |
11077 | // TEMP vtmp2 |
11078 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
11079 | add_req(def); |
11080 | // TEMP scratch |
11081 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
11082 | add_req(def); |
11083 | |
11084 | return this; |
11085 | } |
11086 | |
11087 | MachNode* vshift8S_var_nobwNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
11088 | Compile* C = Compile::current(); |
11089 | // Add projection edges for additional defs or kills |
11090 | // TEMP dst |
11091 | MachTempNode *def; |
11092 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
11093 | add_req(def); |
11094 | // TEMP vtmp |
11095 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
11096 | add_req(def); |
11097 | // TEMP scratch |
11098 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
11099 | add_req(def); |
11100 | |
11101 | return this; |
11102 | } |
11103 | |
11104 | MachNode* vshift8S_var_nobw_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
11105 | Compile* C = Compile::current(); |
11106 | // Add projection edges for additional defs or kills |
11107 | // TEMP dst |
11108 | MachTempNode *def; |
11109 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
11110 | add_req(def); |
11111 | // TEMP vtmp |
11112 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
11113 | add_req(def); |
11114 | // TEMP scratch |
11115 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
11116 | add_req(def); |
11117 | |
11118 | return this; |
11119 | } |
11120 | |
11121 | MachNode* vshift8S_var_nobw_1Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
11122 | Compile* C = Compile::current(); |
11123 | // Add projection edges for additional defs or kills |
11124 | // TEMP dst |
11125 | MachTempNode *def; |
11126 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
11127 | add_req(def); |
11128 | // TEMP vtmp |
11129 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
11130 | add_req(def); |
11131 | // TEMP scratch |
11132 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
11133 | add_req(def); |
11134 | |
11135 | return this; |
11136 | } |
11137 | |
11138 | MachNode* vshift16S_var_nobwNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
11139 | Compile* C = Compile::current(); |
11140 | // Add projection edges for additional defs or kills |
11141 | // TEMP dst |
11142 | MachTempNode *def; |
11143 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
11144 | add_req(def); |
11145 | // TEMP vtmp1 |
11146 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
11147 | add_req(def); |
11148 | // TEMP vtmp2 |
11149 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
11150 | add_req(def); |
11151 | // TEMP scratch |
11152 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
11153 | add_req(def); |
11154 | |
11155 | return this; |
11156 | } |
11157 | |
11158 | MachNode* vshift16S_var_nobw_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
11159 | Compile* C = Compile::current(); |
11160 | // Add projection edges for additional defs or kills |
11161 | // TEMP dst |
11162 | MachTempNode *def; |
11163 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
11164 | add_req(def); |
11165 | // TEMP vtmp1 |
11166 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
11167 | add_req(def); |
11168 | // TEMP vtmp2 |
11169 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
11170 | add_req(def); |
11171 | // TEMP scratch |
11172 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
11173 | add_req(def); |
11174 | |
11175 | return this; |
11176 | } |
11177 | |
11178 | MachNode* vshift16S_var_nobw_1Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
11179 | Compile* C = Compile::current(); |
11180 | // Add projection edges for additional defs or kills |
11181 | // TEMP dst |
11182 | MachTempNode *def; |
11183 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
11184 | add_req(def); |
11185 | // TEMP vtmp1 |
11186 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
11187 | add_req(def); |
11188 | // TEMP vtmp2 |
11189 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
11190 | add_req(def); |
11191 | // TEMP scratch |
11192 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
11193 | add_req(def); |
11194 | |
11195 | return this; |
11196 | } |
11197 | |
11198 | MachNode* vshiftL_arith_varNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
11199 | Compile* C = Compile::current(); |
11200 | // Add projection edges for additional defs or kills |
11201 | // TEMP dst |
11202 | MachTempNode *def; |
11203 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
11204 | add_req(def); |
11205 | // TEMP vtmp |
11206 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
11207 | add_req(def); |
11208 | |
11209 | return this; |
11210 | } |
11211 | |
11212 | MachNode* castStoXNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
11213 | Compile* C = Compile::current(); |
11214 | // Add projection edges for additional defs or kills |
11215 | // TEMP scratch |
11216 | MachTempNode *def; |
11217 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
11218 | add_req(def); |
11219 | |
11220 | return this; |
11221 | } |
11222 | |
11223 | MachNode* vcastStoXNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
11224 | Compile* C = Compile::current(); |
11225 | // Add projection edges for additional defs or kills |
11226 | // TEMP dst |
11227 | MachTempNode *def; |
11228 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
11229 | add_req(def); |
11230 | // TEMP vtmp |
11231 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
11232 | add_req(def); |
11233 | // TEMP scratch |
11234 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
11235 | add_req(def); |
11236 | |
11237 | return this; |
11238 | } |
11239 | |
11240 | MachNode* castItoXNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
11241 | Compile* C = Compile::current(); |
11242 | // Add projection edges for additional defs or kills |
11243 | // TEMP scratch |
11244 | MachTempNode *def; |
11245 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
11246 | add_req(def); |
11247 | |
11248 | return this; |
11249 | } |
11250 | |
11251 | MachNode* vcastItoXNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
11252 | Compile* C = Compile::current(); |
11253 | // Add projection edges for additional defs or kills |
11254 | // TEMP dst |
11255 | MachTempNode *def; |
11256 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
11257 | add_req(def); |
11258 | // TEMP vtmp |
11259 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
11260 | add_req(def); |
11261 | // TEMP scratch |
11262 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
11263 | add_req(def); |
11264 | |
11265 | return this; |
11266 | } |
11267 | |
11268 | MachNode* vcastLtoBSNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
11269 | Compile* C = Compile::current(); |
11270 | // Add projection edges for additional defs or kills |
11271 | // TEMP scratch |
11272 | MachTempNode *def; |
11273 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
11274 | add_req(def); |
11275 | |
11276 | return this; |
11277 | } |
11278 | |
11279 | MachNode* vcastFtoI_reg_avxNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
11280 | Compile* C = Compile::current(); |
11281 | // Add projection edges for additional defs or kills |
11282 | // TEMP dst |
11283 | MachTempNode *def; |
11284 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
11285 | add_req(def); |
11286 | // TEMP xtmp1 |
11287 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
11288 | add_req(def); |
11289 | // TEMP xtmp2 |
11290 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
11291 | add_req(def); |
11292 | // TEMP xtmp3 |
11293 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
11294 | add_req(def); |
11295 | // TEMP xtmp4 |
11296 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
11297 | add_req(def); |
11298 | // TEMP scratch |
11299 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
11300 | add_req(def); |
11301 | // DEF/KILL cr |
11302 | MachProjNode *kill; |
11303 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
11304 | proj_list.push(kill); |
11305 | |
11306 | return this; |
11307 | } |
11308 | |
11309 | MachNode* vcastFtoI_reg_evexNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
11310 | Compile* C = Compile::current(); |
11311 | // Add projection edges for additional defs or kills |
11312 | // TEMP dst |
11313 | MachTempNode *def; |
11314 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
11315 | add_req(def); |
11316 | // TEMP xtmp1 |
11317 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
11318 | add_req(def); |
11319 | // TEMP xtmp2 |
11320 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
11321 | add_req(def); |
11322 | // TEMP ktmp1 |
11323 | def = new MachTempNode(state->MachOperGenerator(KREG)); |
11324 | add_req(def); |
11325 | // TEMP ktmp2 |
11326 | def = new MachTempNode(state->MachOperGenerator(KREG)); |
11327 | add_req(def); |
11328 | // TEMP scratch |
11329 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
11330 | add_req(def); |
11331 | // DEF/KILL cr |
11332 | MachProjNode *kill; |
11333 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
11334 | proj_list.push(kill); |
11335 | |
11336 | return this; |
11337 | } |
11338 | |
11339 | MachNode* vcastDtoL_reg_evexNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
11340 | Compile* C = Compile::current(); |
11341 | // Add projection edges for additional defs or kills |
11342 | // TEMP dst |
11343 | MachTempNode *def; |
11344 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
11345 | add_req(def); |
11346 | // TEMP xtmp1 |
11347 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
11348 | add_req(def); |
11349 | // TEMP xtmp2 |
11350 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
11351 | add_req(def); |
11352 | // TEMP ktmp1 |
11353 | def = new MachTempNode(state->MachOperGenerator(KREG)); |
11354 | add_req(def); |
11355 | // TEMP ktmp2 |
11356 | def = new MachTempNode(state->MachOperGenerator(KREG)); |
11357 | add_req(def); |
11358 | // TEMP scratch |
11359 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
11360 | add_req(def); |
11361 | // DEF/KILL cr |
11362 | MachProjNode *kill; |
11363 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
11364 | proj_list.push(kill); |
11365 | |
11366 | return this; |
11367 | } |
11368 | |
11369 | MachNode* evcmpFD64Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
11370 | Compile* C = Compile::current(); |
11371 | // Add projection edges for additional defs or kills |
11372 | // TEMP scratch |
11373 | MachTempNode *def; |
11374 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
11375 | add_req(def); |
11376 | // TEMP ktmp |
11377 | def = new MachTempNode(state->MachOperGenerator(KREG)); |
11378 | add_req(def); |
11379 | |
11380 | return this; |
11381 | } |
11382 | |
11383 | MachNode* vcmpNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
11384 | Compile* C = Compile::current(); |
11385 | // Add projection edges for additional defs or kills |
11386 | // TEMP scratch |
11387 | MachTempNode *def; |
11388 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
11389 | add_req(def); |
11390 | |
11391 | return this; |
11392 | } |
11393 | |
11394 | MachNode* vcmpuNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
11395 | Compile* C = Compile::current(); |
11396 | // Add projection edges for additional defs or kills |
11397 | // TEMP vtmp1 |
11398 | MachTempNode *def; |
11399 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
11400 | add_req(def); |
11401 | // TEMP vtmp2 |
11402 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
11403 | add_req(def); |
11404 | // TEMP scratch |
11405 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
11406 | add_req(def); |
11407 | |
11408 | return this; |
11409 | } |
11410 | |
11411 | MachNode* vcmpu32Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
11412 | Compile* C = Compile::current(); |
11413 | // Add projection edges for additional defs or kills |
11414 | // TEMP dst |
11415 | MachTempNode *def; |
11416 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
11417 | add_req(def); |
11418 | // TEMP vtmp1 |
11419 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
11420 | add_req(def); |
11421 | // TEMP vtmp2 |
11422 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
11423 | add_req(def); |
11424 | // TEMP vtmp3 |
11425 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
11426 | add_req(def); |
11427 | // TEMP scratch |
11428 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
11429 | add_req(def); |
11430 | |
11431 | return this; |
11432 | } |
11433 | |
11434 | MachNode* vcmpu64Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
11435 | Compile* C = Compile::current(); |
11436 | // Add projection edges for additional defs or kills |
11437 | // TEMP scratch |
11438 | MachTempNode *def; |
11439 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
11440 | add_req(def); |
11441 | // TEMP ktmp |
11442 | def = new MachTempNode(state->MachOperGenerator(KREG)); |
11443 | add_req(def); |
11444 | |
11445 | return this; |
11446 | } |
11447 | |
11448 | MachNode* vextractINode::Expand(State* state, Node_List& proj_list, Node* mem) { |
11449 | Compile* C = Compile::current(); |
11450 | // Add projection edges for additional defs or kills |
11451 | // TEMP vtmp |
11452 | MachTempNode *def; |
11453 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
11454 | add_req(def); |
11455 | |
11456 | return this; |
11457 | } |
11458 | |
11459 | MachNode* vextractI_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
11460 | Compile* C = Compile::current(); |
11461 | // Add projection edges for additional defs or kills |
11462 | // TEMP vtmp |
11463 | MachTempNode *def; |
11464 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
11465 | add_req(def); |
11466 | |
11467 | return this; |
11468 | } |
11469 | |
11470 | MachNode* vextractI_1Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
11471 | Compile* C = Compile::current(); |
11472 | // Add projection edges for additional defs or kills |
11473 | // TEMP vtmp |
11474 | MachTempNode *def; |
11475 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
11476 | add_req(def); |
11477 | |
11478 | return this; |
11479 | } |
11480 | |
11481 | MachNode* vextractLNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
11482 | Compile* C = Compile::current(); |
11483 | // Add projection edges for additional defs or kills |
11484 | // TEMP vtmp |
11485 | MachTempNode *def; |
11486 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
11487 | add_req(def); |
11488 | |
11489 | return this; |
11490 | } |
11491 | |
11492 | MachNode* extractFNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
11493 | Compile* C = Compile::current(); |
11494 | // Add projection edges for additional defs or kills |
11495 | // TEMP dst |
11496 | MachTempNode *def; |
11497 | def = new MachTempNode(state->MachOperGenerator(LEGREGF)); |
11498 | add_req(def); |
11499 | // TEMP tmp |
11500 | def = new MachTempNode(state->MachOperGenerator(RREGI)); |
11501 | add_req(def); |
11502 | // TEMP vtmp |
11503 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
11504 | add_req(def); |
11505 | |
11506 | return this; |
11507 | } |
11508 | |
11509 | MachNode* vextractFNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
11510 | Compile* C = Compile::current(); |
11511 | // Add projection edges for additional defs or kills |
11512 | // TEMP tmp |
11513 | MachTempNode *def; |
11514 | def = new MachTempNode(state->MachOperGenerator(RREGI)); |
11515 | add_req(def); |
11516 | // TEMP vtmp |
11517 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
11518 | add_req(def); |
11519 | |
11520 | return this; |
11521 | } |
11522 | |
11523 | MachNode* vextractDNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
11524 | Compile* C = Compile::current(); |
11525 | // Add projection edges for additional defs or kills |
11526 | // TEMP vtmp |
11527 | MachTempNode *def; |
11528 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
11529 | add_req(def); |
11530 | |
11531 | return this; |
11532 | } |
11533 | |
11534 | MachNode* blendvpNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
11535 | Compile* C = Compile::current(); |
11536 | // Add projection edges for additional defs or kills |
11537 | // TEMP tmp |
11538 | MachTempNode *def; |
11539 | def = new MachTempNode(state->MachOperGenerator(RXMM0)); |
11540 | add_req(def); |
11541 | |
11542 | return this; |
11543 | } |
11544 | |
11545 | MachNode* evblendvp64Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
11546 | Compile* C = Compile::current(); |
11547 | // Add projection edges for additional defs or kills |
11548 | // TEMP scratch |
11549 | MachTempNode *def; |
11550 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
11551 | add_req(def); |
11552 | // TEMP ktmp |
11553 | def = new MachTempNode(state->MachOperGenerator(KREG)); |
11554 | add_req(def); |
11555 | |
11556 | return this; |
11557 | } |
11558 | |
11559 | MachNode* evblendvp64_maskedNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
11560 | Compile* C = Compile::current(); |
11561 | // Add projection edges for additional defs or kills |
11562 | // TEMP scratch |
11563 | MachTempNode *def; |
11564 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
11565 | add_req(def); |
11566 | |
11567 | return this; |
11568 | } |
11569 | |
11570 | MachNode* vabsnegFNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
11571 | Compile* C = Compile::current(); |
11572 | // Add projection edges for additional defs or kills |
11573 | // TEMP scratch |
11574 | MachTempNode *def; |
11575 | def = new MachTempNode(state->MachOperGenerator(RREGI)); |
11576 | add_req(def); |
11577 | |
11578 | return this; |
11579 | } |
11580 | |
11581 | MachNode* vabsnegF_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
11582 | Compile* C = Compile::current(); |
11583 | // Add projection edges for additional defs or kills |
11584 | // TEMP scratch |
11585 | MachTempNode *def; |
11586 | def = new MachTempNode(state->MachOperGenerator(RREGI)); |
11587 | add_req(def); |
11588 | |
11589 | return this; |
11590 | } |
11591 | |
11592 | MachNode* vabsneg4FNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
11593 | Compile* C = Compile::current(); |
11594 | // Add projection edges for additional defs or kills |
11595 | // TEMP scratch |
11596 | MachTempNode *def; |
11597 | def = new MachTempNode(state->MachOperGenerator(RREGI)); |
11598 | add_req(def); |
11599 | |
11600 | return this; |
11601 | } |
11602 | |
11603 | MachNode* vabsneg4F_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
11604 | Compile* C = Compile::current(); |
11605 | // Add projection edges for additional defs or kills |
11606 | // TEMP scratch |
11607 | MachTempNode *def; |
11608 | def = new MachTempNode(state->MachOperGenerator(RREGI)); |
11609 | add_req(def); |
11610 | |
11611 | return this; |
11612 | } |
11613 | |
11614 | MachNode* vabsnegDNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
11615 | Compile* C = Compile::current(); |
11616 | // Add projection edges for additional defs or kills |
11617 | // TEMP scratch |
11618 | MachTempNode *def; |
11619 | def = new MachTempNode(state->MachOperGenerator(RREGI)); |
11620 | add_req(def); |
11621 | |
11622 | return this; |
11623 | } |
11624 | |
11625 | MachNode* vabsnegD_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
11626 | Compile* C = Compile::current(); |
11627 | // Add projection edges for additional defs or kills |
11628 | // TEMP scratch |
11629 | MachTempNode *def; |
11630 | def = new MachTempNode(state->MachOperGenerator(RREGI)); |
11631 | add_req(def); |
11632 | |
11633 | return this; |
11634 | } |
11635 | |
11636 | MachNode* vptest_alltrue_lt16Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
11637 | Compile* C = Compile::current(); |
11638 | // Add projection edges for additional defs or kills |
11639 | // TEMP vtmp1 |
11640 | MachTempNode *def; |
11641 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
11642 | add_req(def); |
11643 | // TEMP vtmp2 |
11644 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
11645 | add_req(def); |
11646 | // DEF/KILL cr |
11647 | MachProjNode *kill; |
11648 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
11649 | proj_list.push(kill); |
11650 | |
11651 | return this; |
11652 | } |
11653 | |
11654 | MachNode* vptest_alltrue_ge16Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
11655 | Compile* C = Compile::current(); |
11656 | // Add projection edges for additional defs or kills |
11657 | // DEF/KILL cr |
11658 | MachProjNode *kill; |
11659 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
11660 | proj_list.push(kill); |
11661 | |
11662 | return this; |
11663 | } |
11664 | |
11665 | MachNode* vptest_alltrue_lt8_evexNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
11666 | Compile* C = Compile::current(); |
11667 | // Add projection edges for additional defs or kills |
11668 | // TEMP kscratch |
11669 | MachTempNode *def; |
11670 | def = new MachTempNode(state->MachOperGenerator(KREG)); |
11671 | add_req(def); |
11672 | // DEF/KILL cr |
11673 | MachProjNode *kill; |
11674 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
11675 | proj_list.push(kill); |
11676 | |
11677 | return this; |
11678 | } |
11679 | |
11680 | MachNode* vptest_alltrue_ge8_evexNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
11681 | Compile* C = Compile::current(); |
11682 | // Add projection edges for additional defs or kills |
11683 | // DEF/KILL cr |
11684 | MachProjNode *kill; |
11685 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
11686 | proj_list.push(kill); |
11687 | |
11688 | return this; |
11689 | } |
11690 | |
11691 | MachNode* vptest_anytrue_lt16Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
11692 | Compile* C = Compile::current(); |
11693 | // Add projection edges for additional defs or kills |
11694 | // TEMP vtmp |
11695 | MachTempNode *def; |
11696 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
11697 | add_req(def); |
11698 | // DEF/KILL cr |
11699 | MachProjNode *kill; |
11700 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
11701 | proj_list.push(kill); |
11702 | |
11703 | return this; |
11704 | } |
11705 | |
11706 | MachNode* vptest_anytrue_ge16Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
11707 | Compile* C = Compile::current(); |
11708 | // Add projection edges for additional defs or kills |
11709 | // DEF/KILL cr |
11710 | MachProjNode *kill; |
11711 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
11712 | proj_list.push(kill); |
11713 | |
11714 | return this; |
11715 | } |
11716 | |
11717 | MachNode* vptest_anytrue_evexNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
11718 | Compile* C = Compile::current(); |
11719 | // Add projection edges for additional defs or kills |
11720 | // DEF/KILL cr |
11721 | MachProjNode *kill; |
11722 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
11723 | proj_list.push(kill); |
11724 | |
11725 | return this; |
11726 | } |
11727 | |
11728 | MachNode* cmpvptest_anytrue_lt16Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
11729 | Compile* C = Compile::current(); |
11730 | // Add projection edges for additional defs or kills |
11731 | // TEMP vtmp |
11732 | MachTempNode *def; |
11733 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
11734 | add_req(def); |
11735 | |
11736 | return this; |
11737 | } |
11738 | |
11739 | MachNode* loadMaskNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
11740 | Compile* C = Compile::current(); |
11741 | // Add projection edges for additional defs or kills |
11742 | // TEMP dst |
11743 | MachTempNode *def; |
11744 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
11745 | add_req(def); |
11746 | |
11747 | return this; |
11748 | } |
11749 | |
11750 | MachNode* loadMask64Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
11751 | Compile* C = Compile::current(); |
11752 | // Add projection edges for additional defs or kills |
11753 | // TEMP xtmp |
11754 | MachTempNode *def; |
11755 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
11756 | add_req(def); |
11757 | // TEMP tmp |
11758 | def = new MachTempNode(state->MachOperGenerator(RREGI)); |
11759 | add_req(def); |
11760 | |
11761 | return this; |
11762 | } |
11763 | |
11764 | MachNode* loadMask_evexNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
11765 | Compile* C = Compile::current(); |
11766 | // Add projection edges for additional defs or kills |
11767 | // TEMP xtmp |
11768 | MachTempNode *def; |
11769 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
11770 | add_req(def); |
11771 | |
11772 | return this; |
11773 | } |
11774 | |
11775 | MachNode* vstoreMask2BNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
11776 | Compile* C = Compile::current(); |
11777 | // Add projection edges for additional defs or kills |
11778 | // TEMP dst |
11779 | MachTempNode *def; |
11780 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
11781 | add_req(def); |
11782 | // TEMP xtmp |
11783 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
11784 | add_req(def); |
11785 | |
11786 | return this; |
11787 | } |
11788 | |
11789 | MachNode* vstoreMask4BNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
11790 | Compile* C = Compile::current(); |
11791 | // Add projection edges for additional defs or kills |
11792 | // TEMP dst |
11793 | MachTempNode *def; |
11794 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
11795 | add_req(def); |
11796 | // TEMP xtmp |
11797 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
11798 | add_req(def); |
11799 | |
11800 | return this; |
11801 | } |
11802 | |
11803 | MachNode* storeMask8BNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
11804 | Compile* C = Compile::current(); |
11805 | // Add projection edges for additional defs or kills |
11806 | // TEMP dst |
11807 | MachTempNode *def; |
11808 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
11809 | add_req(def); |
11810 | // TEMP xtmp |
11811 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
11812 | add_req(def); |
11813 | |
11814 | return this; |
11815 | } |
11816 | |
11817 | MachNode* storeMask8B_avxNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
11818 | Compile* C = Compile::current(); |
11819 | // Add projection edges for additional defs or kills |
11820 | // TEMP dst |
11821 | MachTempNode *def; |
11822 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
11823 | add_req(def); |
11824 | // TEMP vtmp |
11825 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
11826 | add_req(def); |
11827 | |
11828 | return this; |
11829 | } |
11830 | |
11831 | MachNode* vstoreMask_evex_vectmaskNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
11832 | Compile* C = Compile::current(); |
11833 | // Add projection edges for additional defs or kills |
11834 | // TEMP dst |
11835 | MachTempNode *def; |
11836 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
11837 | add_req(def); |
11838 | // TEMP tmp |
11839 | def = new MachTempNode(state->MachOperGenerator(RREGI)); |
11840 | add_req(def); |
11841 | |
11842 | return this; |
11843 | } |
11844 | |
11845 | MachNode* vstoreMask_evexNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
11846 | Compile* C = Compile::current(); |
11847 | // Add projection edges for additional defs or kills |
11848 | // TEMP dst |
11849 | MachTempNode *def; |
11850 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
11851 | add_req(def); |
11852 | |
11853 | return this; |
11854 | } |
11855 | |
11856 | MachNode* loadIotaIndicesNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
11857 | Compile* C = Compile::current(); |
11858 | // Add projection edges for additional defs or kills |
11859 | // TEMP scratch |
11860 | MachTempNode *def; |
11861 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
11862 | add_req(def); |
11863 | |
11864 | return this; |
11865 | } |
11866 | |
11867 | MachNode* rearrangeB_avxNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
11868 | Compile* C = Compile::current(); |
11869 | // Add projection edges for additional defs or kills |
11870 | // TEMP dst |
11871 | MachTempNode *def; |
11872 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
11873 | add_req(def); |
11874 | // TEMP vtmp1 |
11875 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
11876 | add_req(def); |
11877 | // TEMP vtmp2 |
11878 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
11879 | add_req(def); |
11880 | // TEMP scratch |
11881 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
11882 | add_req(def); |
11883 | |
11884 | return this; |
11885 | } |
11886 | |
11887 | MachNode* loadShuffleSNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
11888 | Compile* C = Compile::current(); |
11889 | // Add projection edges for additional defs or kills |
11890 | // TEMP dst |
11891 | MachTempNode *def; |
11892 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
11893 | add_req(def); |
11894 | // TEMP vtmp |
11895 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
11896 | add_req(def); |
11897 | // TEMP scratch |
11898 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
11899 | add_req(def); |
11900 | |
11901 | return this; |
11902 | } |
11903 | |
11904 | MachNode* rearrangeS_avxNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
11905 | Compile* C = Compile::current(); |
11906 | // Add projection edges for additional defs or kills |
11907 | // TEMP dst |
11908 | MachTempNode *def; |
11909 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
11910 | add_req(def); |
11911 | // TEMP vtmp1 |
11912 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
11913 | add_req(def); |
11914 | // TEMP vtmp2 |
11915 | def = new MachTempNode(state->MachOperGenerator(LEGVEC)); |
11916 | add_req(def); |
11917 | // TEMP scratch |
11918 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
11919 | add_req(def); |
11920 | |
11921 | return this; |
11922 | } |
11923 | |
11924 | MachNode* loadShuffleINode::Expand(State* state, Node_List& proj_list, Node* mem) { |
11925 | Compile* C = Compile::current(); |
11926 | // Add projection edges for additional defs or kills |
11927 | // TEMP dst |
11928 | MachTempNode *def; |
11929 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
11930 | add_req(def); |
11931 | // TEMP vtmp |
11932 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
11933 | add_req(def); |
11934 | // TEMP scratch |
11935 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
11936 | add_req(def); |
11937 | |
11938 | return this; |
11939 | } |
11940 | |
11941 | MachNode* loadShuffleLNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
11942 | Compile* C = Compile::current(); |
11943 | // Add projection edges for additional defs or kills |
11944 | // TEMP dst |
11945 | MachTempNode *def; |
11946 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
11947 | add_req(def); |
11948 | // TEMP vtmp |
11949 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
11950 | add_req(def); |
11951 | // TEMP scratch |
11952 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
11953 | add_req(def); |
11954 | |
11955 | return this; |
11956 | } |
11957 | |
11958 | MachNode* vpternlogNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
11959 | Compile* C = Compile::current(); |
11960 | // Add projection edges for additional defs or kills |
11961 | // TEMP dst |
11962 | MachTempNode *def; |
11963 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
11964 | add_req(def); |
11965 | // Remove duplicated operands and inputs which use the same name. |
11966 | if (num_opnds() == 6) { |
11967 | unsigned num0 = 0; |
11968 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
11969 | unsigned num2 = opnd_array(2)->num_edges(); // src2 |
11970 | unsigned num3 = opnd_array(3)->num_edges(); // src3 |
11971 | unsigned num4 = opnd_array(4)->num_edges(); // func |
11972 | unsigned num5 = opnd_array(5)->num_edges(); // dst |
11973 | unsigned idx0 = oper_input_base(); |
11974 | unsigned idx1 = idx0 + num0; |
11975 | unsigned idx2 = idx1 + num1; |
11976 | unsigned idx3 = idx2 + num2; |
11977 | unsigned idx4 = idx3 + num3; |
11978 | unsigned idx5 = idx4 + num4; |
11979 | unsigned idx6 = idx5 + num5; |
11980 | for (int i = idx6 - 1; i >= (int)idx5; i--) { |
11981 | del_req(i); |
11982 | } |
11983 | _num_opnds = 5; |
11984 | } else { |
11985 | assert(_num_opnds == 5, "There should be either 5 or 6 operands.")do { if (!(_num_opnds == 5)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 11984, "assert(" "_num_opnds == 5" ") failed" , "There should be either 5 or 6 operands."); ::breakpoint(); } } while (0); |
11986 | } |
11987 | |
11988 | return this; |
11989 | } |
11990 | |
11991 | MachNode* vpternlog_memNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
11992 | Compile* C = Compile::current(); |
11993 | // Add projection edges for additional defs or kills |
11994 | // TEMP dst |
11995 | MachTempNode *def; |
11996 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
11997 | add_req(def); |
11998 | // Remove duplicated operands and inputs which use the same name. |
11999 | if (num_opnds() == 6) { |
12000 | unsigned num0 = 0; |
12001 | unsigned num1 = opnd_array(1)->num_edges(); // dst |
12002 | unsigned num2 = opnd_array(2)->num_edges(); // src2 |
12003 | unsigned num3 = opnd_array(3)->num_edges(); // src3 |
12004 | unsigned num4 = opnd_array(4)->num_edges(); // func |
12005 | unsigned num5 = opnd_array(5)->num_edges(); // dst |
12006 | unsigned idx0 = oper_input_base(); |
12007 | unsigned idx1 = idx0 + num0; |
12008 | unsigned idx2 = idx1 + num1; |
12009 | unsigned idx3 = idx2 + num2; |
12010 | unsigned idx4 = idx3 + num3; |
12011 | unsigned idx5 = idx4 + num4; |
12012 | unsigned idx6 = idx5 + num5; |
12013 | for (int i = idx6 - 1; i >= (int)idx5; i--) { |
12014 | del_req(i); |
12015 | } |
12016 | _num_opnds = 5; |
12017 | } else { |
12018 | assert(_num_opnds == 5, "There should be either 5 or 6 operands.")do { if (!(_num_opnds == 5)) { (*g_assert_poison) = 'X';; report_vm_error ("ad_x86_expand.cpp", 12017, "assert(" "_num_opnds == 5" ") failed" , "There should be either 5 or 6 operands."); ::breakpoint(); } } while (0); |
12019 | } |
12020 | |
12021 | return this; |
12022 | } |
12023 | |
12024 | MachNode* vmask_cmp_nodeNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
12025 | Compile* C = Compile::current(); |
12026 | // Add projection edges for additional defs or kills |
12027 | // TEMP dst |
12028 | MachTempNode *def; |
12029 | def = new MachTempNode(state->MachOperGenerator(RREGI)); |
12030 | add_req(def); |
12031 | // TEMP ktmp1 |
12032 | def = new MachTempNode(state->MachOperGenerator(KREG)); |
12033 | add_req(def); |
12034 | // TEMP ktmp2 |
12035 | def = new MachTempNode(state->MachOperGenerator(KREG)); |
12036 | add_req(def); |
12037 | // DEF/KILL cr |
12038 | MachProjNode *kill; |
12039 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
12040 | proj_list.push(kill); |
12041 | |
12042 | return this; |
12043 | } |
12044 | |
12045 | MachNode* vmask_genNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
12046 | Compile* C = Compile::current(); |
12047 | // Add projection edges for additional defs or kills |
12048 | // TEMP temp |
12049 | MachTempNode *def; |
12050 | def = new MachTempNode(state->MachOperGenerator(RREGL)); |
12051 | add_req(def); |
12052 | |
12053 | return this; |
12054 | } |
12055 | |
12056 | MachNode* vmask_gen_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
12057 | Compile* C = Compile::current(); |
12058 | // Add projection edges for additional defs or kills |
12059 | // TEMP temp |
12060 | MachTempNode *def; |
12061 | def = new MachTempNode(state->MachOperGenerator(RREGL)); |
12062 | add_req(def); |
12063 | |
12064 | return this; |
12065 | } |
12066 | |
12067 | MachNode* vmask_tolong_evexNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
12068 | Compile* C = Compile::current(); |
12069 | // Add projection edges for additional defs or kills |
12070 | // TEMP dst |
12071 | MachTempNode *def; |
12072 | def = new MachTempNode(state->MachOperGenerator(RREGL)); |
12073 | add_req(def); |
12074 | // DEF/KILL cr |
12075 | MachProjNode *kill; |
12076 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
12077 | proj_list.push(kill); |
12078 | |
12079 | return this; |
12080 | } |
12081 | |
12082 | MachNode* vmask_tolong_boolNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
12083 | Compile* C = Compile::current(); |
12084 | // Add projection edges for additional defs or kills |
12085 | // TEMP dst |
12086 | MachTempNode *def; |
12087 | def = new MachTempNode(state->MachOperGenerator(RREGL)); |
12088 | add_req(def); |
12089 | // TEMP xtmp |
12090 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
12091 | add_req(def); |
12092 | // DEF/KILL cr |
12093 | MachProjNode *kill; |
12094 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
12095 | proj_list.push(kill); |
12096 | |
12097 | return this; |
12098 | } |
12099 | |
12100 | MachNode* vmask_tolong_avxNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
12101 | Compile* C = Compile::current(); |
12102 | // Add projection edges for additional defs or kills |
12103 | // TEMP dst |
12104 | MachTempNode *def; |
12105 | def = new MachTempNode(state->MachOperGenerator(RREGL)); |
12106 | add_req(def); |
12107 | // TEMP xtmp |
12108 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
12109 | add_req(def); |
12110 | // DEF/KILL cr |
12111 | MachProjNode *kill; |
12112 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
12113 | proj_list.push(kill); |
12114 | |
12115 | return this; |
12116 | } |
12117 | |
12118 | MachNode* vmask_truecount_evexNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
12119 | Compile* C = Compile::current(); |
12120 | // Add projection edges for additional defs or kills |
12121 | // TEMP dst |
12122 | MachTempNode *def; |
12123 | def = new MachTempNode(state->MachOperGenerator(RREGI)); |
12124 | add_req(def); |
12125 | // TEMP tmp |
12126 | def = new MachTempNode(state->MachOperGenerator(RREGL)); |
12127 | add_req(def); |
12128 | // DEF/KILL cr |
12129 | MachProjNode *kill; |
12130 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
12131 | proj_list.push(kill); |
12132 | |
12133 | return this; |
12134 | } |
12135 | |
12136 | MachNode* vmask_truecount_boolNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
12137 | Compile* C = Compile::current(); |
12138 | // Add projection edges for additional defs or kills |
12139 | // TEMP dst |
12140 | MachTempNode *def; |
12141 | def = new MachTempNode(state->MachOperGenerator(RREGI)); |
12142 | add_req(def); |
12143 | // TEMP tmp |
12144 | def = new MachTempNode(state->MachOperGenerator(RREGL)); |
12145 | add_req(def); |
12146 | // TEMP xtmp |
12147 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
12148 | add_req(def); |
12149 | // DEF/KILL cr |
12150 | MachProjNode *kill; |
12151 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
12152 | proj_list.push(kill); |
12153 | |
12154 | return this; |
12155 | } |
12156 | |
12157 | MachNode* vmask_truecount_avxNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
12158 | Compile* C = Compile::current(); |
12159 | // Add projection edges for additional defs or kills |
12160 | // TEMP dst |
12161 | MachTempNode *def; |
12162 | def = new MachTempNode(state->MachOperGenerator(RREGI)); |
12163 | add_req(def); |
12164 | // TEMP tmp |
12165 | def = new MachTempNode(state->MachOperGenerator(RREGL)); |
12166 | add_req(def); |
12167 | // TEMP xtmp |
12168 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
12169 | add_req(def); |
12170 | // DEF/KILL cr |
12171 | MachProjNode *kill; |
12172 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
12173 | proj_list.push(kill); |
12174 | |
12175 | return this; |
12176 | } |
12177 | |
12178 | MachNode* vmask_first_or_last_true_evexNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
12179 | Compile* C = Compile::current(); |
12180 | // Add projection edges for additional defs or kills |
12181 | // TEMP dst |
12182 | MachTempNode *def; |
12183 | def = new MachTempNode(state->MachOperGenerator(RREGI)); |
12184 | add_req(def); |
12185 | // TEMP tmp |
12186 | def = new MachTempNode(state->MachOperGenerator(RREGL)); |
12187 | add_req(def); |
12188 | // DEF/KILL cr |
12189 | MachProjNode *kill; |
12190 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
12191 | proj_list.push(kill); |
12192 | |
12193 | return this; |
12194 | } |
12195 | |
12196 | MachNode* vmask_first_or_last_true_evex_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
12197 | Compile* C = Compile::current(); |
12198 | // Add projection edges for additional defs or kills |
12199 | // TEMP dst |
12200 | MachTempNode *def; |
12201 | def = new MachTempNode(state->MachOperGenerator(RREGI)); |
12202 | add_req(def); |
12203 | // TEMP tmp |
12204 | def = new MachTempNode(state->MachOperGenerator(RREGL)); |
12205 | add_req(def); |
12206 | // DEF/KILL cr |
12207 | MachProjNode *kill; |
12208 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
12209 | proj_list.push(kill); |
12210 | |
12211 | return this; |
12212 | } |
12213 | |
12214 | MachNode* vmask_first_or_last_true_boolNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
12215 | Compile* C = Compile::current(); |
12216 | // Add projection edges for additional defs or kills |
12217 | // TEMP dst |
12218 | MachTempNode *def; |
12219 | def = new MachTempNode(state->MachOperGenerator(RREGI)); |
12220 | add_req(def); |
12221 | // TEMP tmp |
12222 | def = new MachTempNode(state->MachOperGenerator(RREGL)); |
12223 | add_req(def); |
12224 | // TEMP xtmp |
12225 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
12226 | add_req(def); |
12227 | // DEF/KILL cr |
12228 | MachProjNode *kill; |
12229 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
12230 | proj_list.push(kill); |
12231 | |
12232 | return this; |
12233 | } |
12234 | |
12235 | MachNode* vmask_first_or_last_true_bool_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
12236 | Compile* C = Compile::current(); |
12237 | // Add projection edges for additional defs or kills |
12238 | // TEMP dst |
12239 | MachTempNode *def; |
12240 | def = new MachTempNode(state->MachOperGenerator(RREGI)); |
12241 | add_req(def); |
12242 | // TEMP tmp |
12243 | def = new MachTempNode(state->MachOperGenerator(RREGL)); |
12244 | add_req(def); |
12245 | // TEMP xtmp |
12246 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
12247 | add_req(def); |
12248 | // DEF/KILL cr |
12249 | MachProjNode *kill; |
12250 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
12251 | proj_list.push(kill); |
12252 | |
12253 | return this; |
12254 | } |
12255 | |
12256 | MachNode* vmask_first_or_last_true_avxNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
12257 | Compile* C = Compile::current(); |
12258 | // Add projection edges for additional defs or kills |
12259 | // TEMP dst |
12260 | MachTempNode *def; |
12261 | def = new MachTempNode(state->MachOperGenerator(RREGI)); |
12262 | add_req(def); |
12263 | // TEMP tmp |
12264 | def = new MachTempNode(state->MachOperGenerator(RREGL)); |
12265 | add_req(def); |
12266 | // TEMP xtmp |
12267 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
12268 | add_req(def); |
12269 | // DEF/KILL cr |
12270 | MachProjNode *kill; |
12271 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
12272 | proj_list.push(kill); |
12273 | |
12274 | return this; |
12275 | } |
12276 | |
12277 | MachNode* vmask_first_or_last_true_avx_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
12278 | Compile* C = Compile::current(); |
12279 | // Add projection edges for additional defs or kills |
12280 | // TEMP dst |
12281 | MachTempNode *def; |
12282 | def = new MachTempNode(state->MachOperGenerator(RREGI)); |
12283 | add_req(def); |
12284 | // TEMP tmp |
12285 | def = new MachTempNode(state->MachOperGenerator(RREGL)); |
12286 | add_req(def); |
12287 | // TEMP xtmp |
12288 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
12289 | add_req(def); |
12290 | // DEF/KILL cr |
12291 | MachProjNode *kill; |
12292 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
12293 | proj_list.push(kill); |
12294 | |
12295 | return this; |
12296 | } |
12297 | |
12298 | MachNode* evcmp_maskedNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
12299 | Compile* C = Compile::current(); |
12300 | // Add projection edges for additional defs or kills |
12301 | // TEMP scratch |
12302 | MachTempNode *def; |
12303 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
12304 | add_req(def); |
12305 | |
12306 | return this; |
12307 | } |
12308 | |
12309 | MachNode* mask_all_evexI_immNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
12310 | Compile* C = Compile::current(); |
12311 | // Add projection edges for additional defs or kills |
12312 | // TEMP dst |
12313 | MachTempNode *def; |
12314 | def = new MachTempNode(state->MachOperGenerator(KREG)); |
12315 | add_req(def); |
12316 | // TEMP tmp |
12317 | def = new MachTempNode(state->MachOperGenerator(RREGL)); |
12318 | add_req(def); |
12319 | |
12320 | return this; |
12321 | } |
12322 | |
12323 | MachNode* mask_all_evexINode::Expand(State* state, Node_List& proj_list, Node* mem) { |
12324 | Compile* C = Compile::current(); |
12325 | // Add projection edges for additional defs or kills |
12326 | // TEMP dst |
12327 | MachTempNode *def; |
12328 | def = new MachTempNode(state->MachOperGenerator(KREG)); |
12329 | add_req(def); |
12330 | // TEMP tmp |
12331 | def = new MachTempNode(state->MachOperGenerator(RREGL)); |
12332 | add_req(def); |
12333 | |
12334 | return this; |
12335 | } |
12336 | |
12337 | MachNode* mask_all_evexLNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
12338 | Compile* C = Compile::current(); |
12339 | // Add projection edges for additional defs or kills |
12340 | // TEMP dst |
12341 | MachTempNode *def; |
12342 | def = new MachTempNode(state->MachOperGenerator(KREG)); |
12343 | add_req(def); |
12344 | |
12345 | return this; |
12346 | } |
12347 | |
12348 | MachNode* mask_not_immLT8Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
12349 | Compile* C = Compile::current(); |
12350 | // Add projection edges for additional defs or kills |
12351 | // TEMP dst |
12352 | MachTempNode *def; |
12353 | def = new MachTempNode(state->MachOperGenerator(KREG)); |
12354 | add_req(def); |
12355 | // TEMP rtmp |
12356 | def = new MachTempNode(state->MachOperGenerator(RREGI)); |
12357 | add_req(def); |
12358 | // TEMP ktmp |
12359 | def = new MachTempNode(state->MachOperGenerator(KREG)); |
12360 | add_req(def); |
12361 | |
12362 | return this; |
12363 | } |
12364 | |
12365 | MachNode* long_to_maskLE8_avxNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
12366 | Compile* C = Compile::current(); |
12367 | // Add projection edges for additional defs or kills |
12368 | // TEMP dst |
12369 | MachTempNode *def; |
12370 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
12371 | add_req(def); |
12372 | // TEMP rtmp1 |
12373 | def = new MachTempNode(state->MachOperGenerator(RREGL)); |
12374 | add_req(def); |
12375 | // TEMP rtmp2 |
12376 | def = new MachTempNode(state->MachOperGenerator(RREGL)); |
12377 | add_req(def); |
12378 | // TEMP xtmp |
12379 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
12380 | add_req(def); |
12381 | |
12382 | return this; |
12383 | } |
12384 | |
12385 | MachNode* long_to_maskGT8_avxNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
12386 | Compile* C = Compile::current(); |
12387 | // Add projection edges for additional defs or kills |
12388 | // TEMP dst |
12389 | MachTempNode *def; |
12390 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
12391 | add_req(def); |
12392 | // TEMP rtmp1 |
12393 | def = new MachTempNode(state->MachOperGenerator(RREGL)); |
12394 | add_req(def); |
12395 | // TEMP rtmp2 |
12396 | def = new MachTempNode(state->MachOperGenerator(RREGL)); |
12397 | add_req(def); |
12398 | // TEMP xtmp1 |
12399 | def = new MachTempNode(state->MachOperGenerator(VEC)); |
12400 | add_req(def); |
12401 | // DEF/KILL cr |
12402 | MachProjNode *kill; |
12403 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
12404 | proj_list.push(kill); |
12405 | |
12406 | return this; |
12407 | } |
12408 | |
12409 | MachNode* mask_opers_evexNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
12410 | Compile* C = Compile::current(); |
12411 | // Add projection edges for additional defs or kills |
12412 | // TEMP kscratch |
12413 | MachTempNode *def; |
12414 | def = new MachTempNode(state->MachOperGenerator(KREG)); |
12415 | add_req(def); |
12416 | |
12417 | return this; |
12418 | } |
12419 | |
12420 | MachNode* mask_opers_evex_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
12421 | Compile* C = Compile::current(); |
12422 | // Add projection edges for additional defs or kills |
12423 | // TEMP kscratch |
12424 | MachTempNode *def; |
12425 | def = new MachTempNode(state->MachOperGenerator(KREG)); |
12426 | add_req(def); |
12427 | |
12428 | return this; |
12429 | } |
12430 | |
12431 | MachNode* mask_opers_evex_1Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
12432 | Compile* C = Compile::current(); |
12433 | // Add projection edges for additional defs or kills |
12434 | // TEMP kscratch |
12435 | MachTempNode *def; |
12436 | def = new MachTempNode(state->MachOperGenerator(KREG)); |
12437 | add_req(def); |
12438 | |
12439 | return this; |
12440 | } |
12441 | |
12442 | MachNode* compareAndSwapP_shenandoahNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
12443 | Compile* C = Compile::current(); |
12444 | // Add projection edges for additional defs or kills |
12445 | // DEF/KILL oldval |
12446 | MachProjNode *kill; |
12447 | kill = new MachProjNode( this, 1, (PTR_RAX_REG_mask()), Op_RegP ); |
12448 | proj_list.push(kill); |
12449 | // TEMP tmp1 |
12450 | MachTempNode *def; |
12451 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
12452 | add_req(def); |
12453 | // TEMP tmp2 |
12454 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
12455 | add_req(def); |
12456 | // DEF/KILL cr |
12457 | kill = new MachProjNode( this, 2, (INT_FLAGS_mask()), Op_RegFlags ); |
12458 | proj_list.push(kill); |
12459 | |
12460 | return this; |
12461 | } |
12462 | |
12463 | MachNode* compareAndSwapP_shenandoah_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
12464 | Compile* C = Compile::current(); |
12465 | // Add projection edges for additional defs or kills |
12466 | // DEF/KILL oldval |
12467 | MachProjNode *kill; |
12468 | kill = new MachProjNode( this, 1, (PTR_RAX_REG_mask()), Op_RegP ); |
12469 | proj_list.push(kill); |
12470 | // TEMP tmp1 |
12471 | MachTempNode *def; |
12472 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
12473 | add_req(def); |
12474 | // TEMP tmp2 |
12475 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
12476 | add_req(def); |
12477 | // DEF/KILL cr |
12478 | kill = new MachProjNode( this, 2, (INT_FLAGS_mask()), Op_RegFlags ); |
12479 | proj_list.push(kill); |
12480 | |
12481 | return this; |
12482 | } |
12483 | |
12484 | MachNode* compareAndSwapN_shenandoahNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
12485 | Compile* C = Compile::current(); |
12486 | // Add projection edges for additional defs or kills |
12487 | // DEF/KILL oldval |
12488 | MachProjNode *kill; |
12489 | kill = new MachProjNode( this, 1, (INT_RAX_REG_mask()), Op_RegN ); |
12490 | proj_list.push(kill); |
12491 | // TEMP tmp1 |
12492 | MachTempNode *def; |
12493 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
12494 | add_req(def); |
12495 | // TEMP tmp2 |
12496 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
12497 | add_req(def); |
12498 | // DEF/KILL cr |
12499 | kill = new MachProjNode( this, 2, (INT_FLAGS_mask()), Op_RegFlags ); |
12500 | proj_list.push(kill); |
12501 | |
12502 | return this; |
12503 | } |
12504 | |
12505 | MachNode* compareAndSwapN_shenandoah_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
12506 | Compile* C = Compile::current(); |
12507 | // Add projection edges for additional defs or kills |
12508 | // DEF/KILL oldval |
12509 | MachProjNode *kill; |
12510 | kill = new MachProjNode( this, 1, (INT_RAX_REG_mask()), Op_RegN ); |
12511 | proj_list.push(kill); |
12512 | // TEMP tmp1 |
12513 | MachTempNode *def; |
12514 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
12515 | add_req(def); |
12516 | // TEMP tmp2 |
12517 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
12518 | add_req(def); |
12519 | // DEF/KILL cr |
12520 | kill = new MachProjNode( this, 2, (INT_FLAGS_mask()), Op_RegFlags ); |
12521 | proj_list.push(kill); |
12522 | |
12523 | return this; |
12524 | } |
12525 | |
12526 | MachNode* compareAndExchangeN_shenandoahNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
12527 | Compile* C = Compile::current(); |
12528 | // Add projection edges for additional defs or kills |
12529 | // TEMP tmp1 |
12530 | MachTempNode *def; |
12531 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
12532 | add_req(def); |
12533 | // TEMP tmp2 |
12534 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
12535 | add_req(def); |
12536 | // DEF/KILL cr |
12537 | MachProjNode *kill; |
12538 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
12539 | proj_list.push(kill); |
12540 | |
12541 | return this; |
12542 | } |
12543 | |
12544 | MachNode* compareAndExchangeP_shenandoahNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
12545 | Compile* C = Compile::current(); |
12546 | // Add projection edges for additional defs or kills |
12547 | // TEMP tmp1 |
12548 | MachTempNode *def; |
12549 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
12550 | add_req(def); |
12551 | // TEMP tmp2 |
12552 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
12553 | add_req(def); |
12554 | // DEF/KILL cr |
12555 | MachProjNode *kill; |
12556 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
12557 | proj_list.push(kill); |
12558 | |
12559 | return this; |
12560 | } |
12561 | |
12562 | MachNode* zLoadPNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
12563 | Compile* C = Compile::current(); |
12564 | // Add projection edges for additional defs or kills |
12565 | // TEMP dst |
12566 | MachTempNode *def; |
12567 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
12568 | add_req(def); |
12569 | // DEF/KILL cr |
12570 | MachProjNode *kill; |
12571 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
12572 | proj_list.push(kill); |
12573 | |
12574 | return this; |
12575 | } |
12576 | |
12577 | MachNode* zCompareAndExchangePNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
12578 | Compile* C = Compile::current(); |
12579 | // Add projection edges for additional defs or kills |
12580 | // TEMP tmp |
12581 | MachTempNode *def; |
12582 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
12583 | add_req(def); |
12584 | // DEF/KILL cr |
12585 | MachProjNode *kill; |
12586 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
12587 | proj_list.push(kill); |
12588 | |
12589 | return this; |
12590 | } |
12591 | |
12592 | MachNode* zCompareAndSwapPNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
12593 | Compile* C = Compile::current(); |
12594 | // Add projection edges for additional defs or kills |
12595 | // DEF/KILL oldval |
12596 | MachProjNode *kill; |
12597 | kill = new MachProjNode( this, 1, (PTR_RAX_REG_mask()), Op_RegP ); |
12598 | proj_list.push(kill); |
12599 | // TEMP tmp |
12600 | MachTempNode *def; |
12601 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
12602 | add_req(def); |
12603 | // DEF/KILL cr |
12604 | kill = new MachProjNode( this, 2, (INT_FLAGS_mask()), Op_RegFlags ); |
12605 | proj_list.push(kill); |
12606 | |
12607 | return this; |
12608 | } |
12609 | |
12610 | MachNode* zCompareAndSwapP_0Node::Expand(State* state, Node_List& proj_list, Node* mem) { |
12611 | Compile* C = Compile::current(); |
12612 | // Add projection edges for additional defs or kills |
12613 | // DEF/KILL oldval |
12614 | MachProjNode *kill; |
12615 | kill = new MachProjNode( this, 1, (PTR_RAX_REG_mask()), Op_RegP ); |
12616 | proj_list.push(kill); |
12617 | // TEMP tmp |
12618 | MachTempNode *def; |
12619 | def = new MachTempNode(state->MachOperGenerator(RREGP)); |
12620 | add_req(def); |
12621 | // DEF/KILL cr |
12622 | kill = new MachProjNode( this, 2, (INT_FLAGS_mask()), Op_RegFlags ); |
12623 | proj_list.push(kill); |
12624 | |
12625 | return this; |
12626 | } |
12627 | |
12628 | MachNode* zXChgPNode::Expand(State* state, Node_List& proj_list, Node* mem) { |
12629 | Compile* C = Compile::current(); |
12630 | // Add projection edges for additional defs or kills |
12631 | // DEF/KILL cr |
12632 | MachProjNode *kill; |
12633 | kill = new MachProjNode( this, 1, (INT_FLAGS_mask()), Op_RegFlags ); |
12634 | proj_list.push(kill); |
12635 | |
12636 | return this; |
12637 | } |
12638 | |
12639 | // Check consistency of C++ compilation with ADLC options: |
12640 | // Check adlc -DLINUX=1 |
12641 | #ifndef LINUX1 |
12642 | # error "LINUX must be defined" |
12643 | #endif // LINUX |
12644 | // Check adlc -D_GNU_SOURCE=1 |
12645 | #ifndef _GNU_SOURCE1 |
12646 | # error "_GNU_SOURCE must be defined" |
12647 | #endif // _GNU_SOURCE |
12648 | // Check adlc -DAMD64=1 |
12649 | #ifndef AMD641 |
12650 | # error "AMD64 must be defined" |
12651 | #endif // AMD64 |
12652 | // Check adlc -D_LP64=1 |
12653 | #ifndef _LP641 |
12654 | # error "_LP64 must be defined" |
12655 | #endif // _LP64 |