Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(7)

Side by Side Diff: test/unittests/compiler/mips64/instruction-selector-mips64-unittest.cc

Issue 1513543003: [turbofan] Make MachineType a pair of enums. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Moar rebase Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file 3 // found in the LICENSE file
4 4
5 #include "test/unittests/compiler/instruction-selector-unittest.h" 5 #include "test/unittests/compiler/instruction-selector-unittest.h"
6 6
7 namespace v8 { 7 namespace v8 {
8 namespace internal { 8 namespace internal {
9 namespace compiler { 9 namespace compiler {
10 10
(...skipping 23 matching lines...) Expand all
34 uint32_t expected_size; 34 uint32_t expected_size;
35 }; 35 };
36 36
37 struct FPCmp { 37 struct FPCmp {
38 MachInst2 mi; 38 MachInst2 mi;
39 FlagsCondition cond; 39 FlagsCondition cond;
40 }; 40 };
41 41
42 const FPCmp kFPCmpInstructions[] = { 42 const FPCmp kFPCmpInstructions[] = {
43 {{&RawMachineAssembler::Float64Equal, "Float64Equal", kMips64CmpD, 43 {{&RawMachineAssembler::Float64Equal, "Float64Equal", kMips64CmpD,
44 kMachFloat64}, 44 MachineType::Float64()},
45 kEqual}, 45 kEqual},
46 {{&RawMachineAssembler::Float64LessThan, "Float64LessThan", kMips64CmpD, 46 {{&RawMachineAssembler::Float64LessThan, "Float64LessThan", kMips64CmpD,
47 kMachFloat64}, 47 MachineType::Float64()},
48 kUnsignedLessThan}, 48 kUnsignedLessThan},
49 {{&RawMachineAssembler::Float64LessThanOrEqual, "Float64LessThanOrEqual", 49 {{&RawMachineAssembler::Float64LessThanOrEqual, "Float64LessThanOrEqual",
50 kMips64CmpD, kMachFloat64}, 50 kMips64CmpD, MachineType::Float64()},
51 kUnsignedLessThanOrEqual}, 51 kUnsignedLessThanOrEqual},
52 {{&RawMachineAssembler::Float64GreaterThan, "Float64GreaterThan", 52 {{&RawMachineAssembler::Float64GreaterThan, "Float64GreaterThan",
53 kMips64CmpD, kMachFloat64}, 53 kMips64CmpD, MachineType::Float64()},
54 kUnsignedLessThan}, 54 kUnsignedLessThan},
55 {{&RawMachineAssembler::Float64GreaterThanOrEqual, 55 {{&RawMachineAssembler::Float64GreaterThanOrEqual,
56 "Float64GreaterThanOrEqual", kMips64CmpD, kMachFloat64}, 56 "Float64GreaterThanOrEqual", kMips64CmpD, MachineType::Float64()},
57 kUnsignedLessThanOrEqual}}; 57 kUnsignedLessThanOrEqual}};
58 58
59 struct Conversion { 59 struct Conversion {
60 // The machine_type field in MachInst1 represents the destination type. 60 // The machine_type field in MachInst1 represents the destination type.
61 MachInst1 mi; 61 MachInst1 mi;
62 MachineType src_machine_type; 62 MachineType src_machine_type;
63 }; 63 };
64 64
65 65
66 // ---------------------------------------------------------------------------- 66 // ----------------------------------------------------------------------------
67 // Logical instructions. 67 // Logical instructions.
68 // ---------------------------------------------------------------------------- 68 // ----------------------------------------------------------------------------
69 69
70 70
71 const MachInst2 kLogicalInstructions[] = { 71 const MachInst2 kLogicalInstructions[] = {
72 {&RawMachineAssembler::Word32And, "Word32And", kMips64And, kMachInt32}, 72 {&RawMachineAssembler::Word32And, "Word32And", kMips64And,
73 {&RawMachineAssembler::Word64And, "Word64And", kMips64And, kMachInt64}, 73 MachineType::Int32()},
74 {&RawMachineAssembler::Word32Or, "Word32Or", kMips64Or, kMachInt32}, 74 {&RawMachineAssembler::Word64And, "Word64And", kMips64And,
75 {&RawMachineAssembler::Word64Or, "Word64Or", kMips64Or, kMachInt64}, 75 MachineType::Int64()},
76 {&RawMachineAssembler::Word32Xor, "Word32Xor", kMips64Xor, kMachInt32}, 76 {&RawMachineAssembler::Word32Or, "Word32Or", kMips64Or,
77 {&RawMachineAssembler::Word64Xor, "Word64Xor", kMips64Xor, kMachInt64}}; 77 MachineType::Int32()},
78 {&RawMachineAssembler::Word64Or, "Word64Or", kMips64Or,
79 MachineType::Int64()},
80 {&RawMachineAssembler::Word32Xor, "Word32Xor", kMips64Xor,
81 MachineType::Int32()},
82 {&RawMachineAssembler::Word64Xor, "Word64Xor", kMips64Xor,
83 MachineType::Int64()}};
78 84
79 85
80 // ---------------------------------------------------------------------------- 86 // ----------------------------------------------------------------------------
81 // Shift instructions. 87 // Shift instructions.
82 // ---------------------------------------------------------------------------- 88 // ----------------------------------------------------------------------------
83 89
84 90
85 const MachInst2 kShiftInstructions[] = { 91 const MachInst2 kShiftInstructions[] = {
86 {&RawMachineAssembler::Word32Shl, "Word32Shl", kMips64Shl, kMachInt32}, 92 {&RawMachineAssembler::Word32Shl, "Word32Shl", kMips64Shl,
87 {&RawMachineAssembler::Word64Shl, "Word64Shl", kMips64Dshl, kMachInt64}, 93 MachineType::Int32()},
88 {&RawMachineAssembler::Word32Shr, "Word32Shr", kMips64Shr, kMachInt32}, 94 {&RawMachineAssembler::Word64Shl, "Word64Shl", kMips64Dshl,
89 {&RawMachineAssembler::Word64Shr, "Word64Shr", kMips64Dshr, kMachInt64}, 95 MachineType::Int64()},
90 {&RawMachineAssembler::Word32Sar, "Word32Sar", kMips64Sar, kMachInt32}, 96 {&RawMachineAssembler::Word32Shr, "Word32Shr", kMips64Shr,
91 {&RawMachineAssembler::Word64Sar, "Word64Sar", kMips64Dsar, kMachInt64}, 97 MachineType::Int32()},
92 {&RawMachineAssembler::Word32Ror, "Word32Ror", kMips64Ror, kMachInt32}, 98 {&RawMachineAssembler::Word64Shr, "Word64Shr", kMips64Dshr,
93 {&RawMachineAssembler::Word64Ror, "Word64Ror", kMips64Dror, kMachInt64}}; 99 MachineType::Int64()},
100 {&RawMachineAssembler::Word32Sar, "Word32Sar", kMips64Sar,
101 MachineType::Int32()},
102 {&RawMachineAssembler::Word64Sar, "Word64Sar", kMips64Dsar,
103 MachineType::Int64()},
104 {&RawMachineAssembler::Word32Ror, "Word32Ror", kMips64Ror,
105 MachineType::Int32()},
106 {&RawMachineAssembler::Word64Ror, "Word64Ror", kMips64Dror,
107 MachineType::Int64()}};
94 108
95 109
96 // ---------------------------------------------------------------------------- 110 // ----------------------------------------------------------------------------
97 // MUL/DIV instructions. 111 // MUL/DIV instructions.
98 // ---------------------------------------------------------------------------- 112 // ----------------------------------------------------------------------------
99 113
100 114
101 const MachInst2 kMulDivInstructions[] = { 115 const MachInst2 kMulDivInstructions[] = {
102 {&RawMachineAssembler::Int32Mul, "Int32Mul", kMips64Mul, kMachInt32}, 116 {&RawMachineAssembler::Int32Mul, "Int32Mul", kMips64Mul,
103 {&RawMachineAssembler::Int32Div, "Int32Div", kMips64Div, kMachInt32}, 117 MachineType::Int32()},
104 {&RawMachineAssembler::Uint32Div, "Uint32Div", kMips64DivU, kMachUint32}, 118 {&RawMachineAssembler::Int32Div, "Int32Div", kMips64Div,
105 {&RawMachineAssembler::Int64Mul, "Int64Mul", kMips64Dmul, kMachInt64}, 119 MachineType::Int32()},
106 {&RawMachineAssembler::Int64Div, "Int64Div", kMips64Ddiv, kMachInt64}, 120 {&RawMachineAssembler::Uint32Div, "Uint32Div", kMips64DivU,
107 {&RawMachineAssembler::Uint64Div, "Uint64Div", kMips64DdivU, kMachUint64}, 121 MachineType::Uint32()},
108 {&RawMachineAssembler::Float64Mul, "Float64Mul", kMips64MulD, kMachFloat64}, 122 {&RawMachineAssembler::Int64Mul, "Int64Mul", kMips64Dmul,
123 MachineType::Int64()},
124 {&RawMachineAssembler::Int64Div, "Int64Div", kMips64Ddiv,
125 MachineType::Int64()},
126 {&RawMachineAssembler::Uint64Div, "Uint64Div", kMips64DdivU,
127 MachineType::Uint64()},
128 {&RawMachineAssembler::Float64Mul, "Float64Mul", kMips64MulD,
129 MachineType::Float64()},
109 {&RawMachineAssembler::Float64Div, "Float64Div", kMips64DivD, 130 {&RawMachineAssembler::Float64Div, "Float64Div", kMips64DivD,
110 kMachFloat64}}; 131 MachineType::Float64()}};
111 132
112 133
113 // ---------------------------------------------------------------------------- 134 // ----------------------------------------------------------------------------
114 // MOD instructions. 135 // MOD instructions.
115 // ---------------------------------------------------------------------------- 136 // ----------------------------------------------------------------------------
116 137
117 138
118 const MachInst2 kModInstructions[] = { 139 const MachInst2 kModInstructions[] = {
119 {&RawMachineAssembler::Int32Mod, "Int32Mod", kMips64Mod, kMachInt32}, 140 {&RawMachineAssembler::Int32Mod, "Int32Mod", kMips64Mod,
120 {&RawMachineAssembler::Uint32Mod, "Uint32Mod", kMips64ModU, kMachInt32}, 141 MachineType::Int32()},
142 {&RawMachineAssembler::Uint32Mod, "Uint32Mod", kMips64ModU,
143 MachineType::Int32()},
121 {&RawMachineAssembler::Float64Mod, "Float64Mod", kMips64ModD, 144 {&RawMachineAssembler::Float64Mod, "Float64Mod", kMips64ModD,
122 kMachFloat64}}; 145 MachineType::Float64()}};
123 146
124 147
125 // ---------------------------------------------------------------------------- 148 // ----------------------------------------------------------------------------
126 // Arithmetic FPU instructions. 149 // Arithmetic FPU instructions.
127 // ---------------------------------------------------------------------------- 150 // ----------------------------------------------------------------------------
128 151
129 152
130 const MachInst2 kFPArithInstructions[] = { 153 const MachInst2 kFPArithInstructions[] = {
131 {&RawMachineAssembler::Float64Add, "Float64Add", kMips64AddD, kMachFloat64}, 154 {&RawMachineAssembler::Float64Add, "Float64Add", kMips64AddD,
155 MachineType::Float64()},
132 {&RawMachineAssembler::Float64Sub, "Float64Sub", kMips64SubD, 156 {&RawMachineAssembler::Float64Sub, "Float64Sub", kMips64SubD,
133 kMachFloat64}}; 157 MachineType::Float64()}};
134 158
135 159
136 // ---------------------------------------------------------------------------- 160 // ----------------------------------------------------------------------------
137 // IntArithTest instructions, two nodes. 161 // IntArithTest instructions, two nodes.
138 // ---------------------------------------------------------------------------- 162 // ----------------------------------------------------------------------------
139 163
140 164
141 const MachInst2 kAddSubInstructions[] = { 165 const MachInst2 kAddSubInstructions[] = {
142 {&RawMachineAssembler::Int32Add, "Int32Add", kMips64Add, kMachInt32}, 166 {&RawMachineAssembler::Int32Add, "Int32Add", kMips64Add,
143 {&RawMachineAssembler::Int64Add, "Int64Add", kMips64Dadd, kMachInt64}, 167 MachineType::Int32()},
144 {&RawMachineAssembler::Int32Sub, "Int32Sub", kMips64Sub, kMachInt32}, 168 {&RawMachineAssembler::Int64Add, "Int64Add", kMips64Dadd,
145 {&RawMachineAssembler::Int64Sub, "Int64Sub", kMips64Dsub, kMachInt64}}; 169 MachineType::Int64()},
170 {&RawMachineAssembler::Int32Sub, "Int32Sub", kMips64Sub,
171 MachineType::Int32()},
172 {&RawMachineAssembler::Int64Sub, "Int64Sub", kMips64Dsub,
173 MachineType::Int64()}};
146 174
147 175
148 // ---------------------------------------------------------------------------- 176 // ----------------------------------------------------------------------------
149 // IntArithTest instructions, one node. 177 // IntArithTest instructions, one node.
150 // ---------------------------------------------------------------------------- 178 // ----------------------------------------------------------------------------
151 179
152 180
153 const MachInst1 kAddSubOneInstructions[] = { 181 const MachInst1 kAddSubOneInstructions[] = {
154 {&RawMachineAssembler::Int32Neg, "Int32Neg", kMips64Sub, kMachInt32}, 182 {&RawMachineAssembler::Int32Neg, "Int32Neg", kMips64Sub,
155 {&RawMachineAssembler::Int64Neg, "Int64Neg", kMips64Dsub, kMachInt64}}; 183 MachineType::Int32()},
184 {&RawMachineAssembler::Int64Neg, "Int64Neg", kMips64Dsub,
185 MachineType::Int64()}};
156 186
157 187
158 // ---------------------------------------------------------------------------- 188 // ----------------------------------------------------------------------------
159 // Arithmetic compare instructions. 189 // Arithmetic compare instructions.
160 // ---------------------------------------------------------------------------- 190 // ----------------------------------------------------------------------------
161 191
162 192
163 const IntCmp kCmpInstructions[] = { 193 const IntCmp kCmpInstructions[] = {
164 {{&RawMachineAssembler::WordEqual, "WordEqual", kMips64Cmp, kMachInt64}, 194 {{&RawMachineAssembler::WordEqual, "WordEqual", kMips64Cmp,
195 MachineType::Int64()},
165 1U}, 196 1U},
166 {{&RawMachineAssembler::WordNotEqual, "WordNotEqual", kMips64Cmp, 197 {{&RawMachineAssembler::WordNotEqual, "WordNotEqual", kMips64Cmp,
167 kMachInt64}, 198 MachineType::Int64()},
168 1U}, 199 1U},
169 {{&RawMachineAssembler::Word32Equal, "Word32Equal", kMips64Cmp, kMachInt32}, 200 {{&RawMachineAssembler::Word32Equal, "Word32Equal", kMips64Cmp,
201 MachineType::Int32()},
170 1U}, 202 1U},
171 {{&RawMachineAssembler::Word32NotEqual, "Word32NotEqual", kMips64Cmp, 203 {{&RawMachineAssembler::Word32NotEqual, "Word32NotEqual", kMips64Cmp,
172 kMachInt32}, 204 MachineType::Int32()},
173 1U}, 205 1U},
174 {{&RawMachineAssembler::Int32LessThan, "Int32LessThan", kMips64Cmp, 206 {{&RawMachineAssembler::Int32LessThan, "Int32LessThan", kMips64Cmp,
175 kMachInt32}, 207 MachineType::Int32()},
176 1U}, 208 1U},
177 {{&RawMachineAssembler::Int32LessThanOrEqual, "Int32LessThanOrEqual", 209 {{&RawMachineAssembler::Int32LessThanOrEqual, "Int32LessThanOrEqual",
178 kMips64Cmp, kMachInt32}, 210 kMips64Cmp, MachineType::Int32()},
179 1U}, 211 1U},
180 {{&RawMachineAssembler::Int32GreaterThan, "Int32GreaterThan", kMips64Cmp, 212 {{&RawMachineAssembler::Int32GreaterThan, "Int32GreaterThan", kMips64Cmp,
181 kMachInt32}, 213 MachineType::Int32()},
182 1U}, 214 1U},
183 {{&RawMachineAssembler::Int32GreaterThanOrEqual, "Int32GreaterThanOrEqual", 215 {{&RawMachineAssembler::Int32GreaterThanOrEqual, "Int32GreaterThanOrEqual",
184 kMips64Cmp, kMachInt32}, 216 kMips64Cmp, MachineType::Int32()},
185 1U}, 217 1U},
186 {{&RawMachineAssembler::Uint32LessThan, "Uint32LessThan", kMips64Cmp, 218 {{&RawMachineAssembler::Uint32LessThan, "Uint32LessThan", kMips64Cmp,
187 kMachUint32}, 219 MachineType::Uint32()},
188 1U}, 220 1U},
189 {{&RawMachineAssembler::Uint32LessThanOrEqual, "Uint32LessThanOrEqual", 221 {{&RawMachineAssembler::Uint32LessThanOrEqual, "Uint32LessThanOrEqual",
190 kMips64Cmp, kMachUint32}, 222 kMips64Cmp, MachineType::Uint32()},
191 1U}}; 223 1U}};
192 224
193 225
194 // ---------------------------------------------------------------------------- 226 // ----------------------------------------------------------------------------
195 // Conversion instructions. 227 // Conversion instructions.
196 // ---------------------------------------------------------------------------- 228 // ----------------------------------------------------------------------------
197 229
198 const Conversion kConversionInstructions[] = { 230 const Conversion kConversionInstructions[] = {
199 // Conversion instructions are related to machine_operator.h: 231 // Conversion instructions are related to machine_operator.h:
200 // FPU conversions: 232 // FPU conversions:
201 // Convert representation of integers between float64 and int32/uint32. 233 // Convert representation of integers between float64 and int32/uint32.
202 // The precise rounding mode and handling of out of range inputs are *not* 234 // The precise rounding mode and handling of out of range inputs are *not*
203 // defined for these operators, since they are intended only for use with 235 // defined for these operators, since they are intended only for use with
204 // integers. 236 // integers.
205 // mips instructions: 237 // mips instructions:
206 // mtc1, cvt.d.w 238 // mtc1, cvt.d.w
207 {{&RawMachineAssembler::ChangeInt32ToFloat64, "ChangeInt32ToFloat64", 239 {{&RawMachineAssembler::ChangeInt32ToFloat64, "ChangeInt32ToFloat64",
208 kMips64CvtDW, kMachFloat64}, 240 kMips64CvtDW, MachineType::Float64()},
209 kMachInt32}, 241 MachineType::Int32()},
210 242
211 // mips instructions: 243 // mips instructions:
212 // cvt.d.uw 244 // cvt.d.uw
213 {{&RawMachineAssembler::ChangeUint32ToFloat64, "ChangeUint32ToFloat64", 245 {{&RawMachineAssembler::ChangeUint32ToFloat64, "ChangeUint32ToFloat64",
214 kMips64CvtDUw, kMachFloat64}, 246 kMips64CvtDUw, MachineType::Float64()},
215 kMachInt32}, 247 MachineType::Int32()},
216 248
217 // mips instructions: 249 // mips instructions:
218 // mfc1, trunc double to word, for more details look at mips macro 250 // mfc1, trunc double to word, for more details look at mips macro
219 // asm and mips asm file 251 // asm and mips asm file
220 {{&RawMachineAssembler::ChangeFloat64ToInt32, "ChangeFloat64ToInt32", 252 {{&RawMachineAssembler::ChangeFloat64ToInt32, "ChangeFloat64ToInt32",
221 kMips64TruncWD, kMachFloat64}, 253 kMips64TruncWD, MachineType::Float64()},
222 kMachInt32}, 254 MachineType::Int32()},
223 255
224 // mips instructions: 256 // mips instructions:
225 // trunc double to unsigned word, for more details look at mips macro 257 // trunc double to unsigned word, for more details look at mips macro
226 // asm and mips asm file 258 // asm and mips asm file
227 {{&RawMachineAssembler::ChangeFloat64ToUint32, "ChangeFloat64ToUint32", 259 {{&RawMachineAssembler::ChangeFloat64ToUint32, "ChangeFloat64ToUint32",
228 kMips64TruncUwD, kMachFloat64}, 260 kMips64TruncUwD, MachineType::Float64()},
229 kMachInt32}}; 261 MachineType::Int32()}};
230 262
231 const Conversion kFloat64RoundInstructions[] = { 263 const Conversion kFloat64RoundInstructions[] = {
232 {{&RawMachineAssembler::Float64RoundUp, "Float64RoundUp", kMips64CeilWD, 264 {{&RawMachineAssembler::Float64RoundUp, "Float64RoundUp", kMips64CeilWD,
233 kMachFloat64}, 265 MachineType::Float64()},
234 kMachInt32}, 266 MachineType::Int32()},
235 {{&RawMachineAssembler::Float64RoundDown, "Float64RoundDown", 267 {{&RawMachineAssembler::Float64RoundDown, "Float64RoundDown",
236 kMips64FloorWD, kMachFloat64}, 268 kMips64FloorWD, MachineType::Float64()},
237 kMachInt32}, 269 MachineType::Int32()},
238 {{&RawMachineAssembler::Float64RoundTiesEven, "Float64RoundTiesEven", 270 {{&RawMachineAssembler::Float64RoundTiesEven, "Float64RoundTiesEven",
239 kMips64RoundWD, kMachFloat64}, 271 kMips64RoundWD, MachineType::Float64()},
240 kMachInt32}, 272 MachineType::Int32()},
241 {{&RawMachineAssembler::Float64RoundTruncate, "Float64RoundTruncate", 273 {{&RawMachineAssembler::Float64RoundTruncate, "Float64RoundTruncate",
242 kMips64TruncWD, kMachFloat64}, 274 kMips64TruncWD, MachineType::Float64()},
243 kMachInt32}}; 275 MachineType::Int32()}};
244 276
245 } // namespace 277 } // namespace
246 278
247 279
248 typedef InstructionSelectorTestWithParam<FPCmp> InstructionSelectorFPCmpTest; 280 typedef InstructionSelectorTestWithParam<FPCmp> InstructionSelectorFPCmpTest;
249 281
250 TEST_P(InstructionSelectorFPCmpTest, Parameter) { 282 TEST_P(InstructionSelectorFPCmpTest, Parameter) {
251 const FPCmp cmp = GetParam(); 283 const FPCmp cmp = GetParam();
252 StreamBuilder m(this, kMachInt32, cmp.mi.machine_type, cmp.mi.machine_type); 284 StreamBuilder m(this, MachineType::Int32(), cmp.mi.machine_type,
285 cmp.mi.machine_type);
253 m.Return((m.*cmp.mi.constructor)(m.Parameter(0), m.Parameter(1))); 286 m.Return((m.*cmp.mi.constructor)(m.Parameter(0), m.Parameter(1)));
254 Stream s = m.Build(); 287 Stream s = m.Build();
255 ASSERT_EQ(1U, s.size()); 288 ASSERT_EQ(1U, s.size());
256 EXPECT_EQ(cmp.mi.arch_opcode, s[0]->arch_opcode()); 289 EXPECT_EQ(cmp.mi.arch_opcode, s[0]->arch_opcode());
257 EXPECT_EQ(2U, s[0]->InputCount()); 290 EXPECT_EQ(2U, s[0]->InputCount());
258 EXPECT_EQ(1U, s[0]->OutputCount()); 291 EXPECT_EQ(1U, s[0]->OutputCount());
259 EXPECT_EQ(kFlags_set, s[0]->flags_mode()); 292 EXPECT_EQ(kFlags_set, s[0]->flags_mode());
260 EXPECT_EQ(cmp.cond, s[0]->flags_condition()); 293 EXPECT_EQ(cmp.cond, s[0]->flags_condition());
261 } 294 }
262 295
(...skipping 23 matching lines...) Expand all
286 319
287 // ---------------------------------------------------------------------------- 320 // ----------------------------------------------------------------------------
288 // Shift instructions. 321 // Shift instructions.
289 // ---------------------------------------------------------------------------- 322 // ----------------------------------------------------------------------------
290 typedef InstructionSelectorTestWithParam<MachInst2> 323 typedef InstructionSelectorTestWithParam<MachInst2>
291 InstructionSelectorShiftTest; 324 InstructionSelectorShiftTest;
292 325
293 TEST_P(InstructionSelectorShiftTest, Immediate) { 326 TEST_P(InstructionSelectorShiftTest, Immediate) {
294 const MachInst2 dpi = GetParam(); 327 const MachInst2 dpi = GetParam();
295 const MachineType type = dpi.machine_type; 328 const MachineType type = dpi.machine_type;
296 TRACED_FORRANGE(int32_t, imm, 0, (ElementSizeOf(type) * 8) - 1) { 329 TRACED_FORRANGE(int32_t, imm, 0,
330 ((1 << ElementSizeLog2Of(type.representation())) * 8) - 1) {
297 StreamBuilder m(this, type, type); 331 StreamBuilder m(this, type, type);
298 m.Return((m.*dpi.constructor)(m.Parameter(0), m.Int32Constant(imm))); 332 m.Return((m.*dpi.constructor)(m.Parameter(0), m.Int32Constant(imm)));
299 Stream s = m.Build(); 333 Stream s = m.Build();
300 ASSERT_EQ(1U, s.size()); 334 ASSERT_EQ(1U, s.size());
301 EXPECT_EQ(dpi.arch_opcode, s[0]->arch_opcode()); 335 EXPECT_EQ(dpi.arch_opcode, s[0]->arch_opcode());
302 EXPECT_EQ(2U, s[0]->InputCount()); 336 EXPECT_EQ(2U, s[0]->InputCount());
303 EXPECT_TRUE(s[0]->InputAt(1)->IsImmediate()); 337 EXPECT_TRUE(s[0]->InputAt(1)->IsImmediate());
304 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(1))); 338 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(1)));
305 EXPECT_EQ(1U, s[0]->OutputCount()); 339 EXPECT_EQ(1U, s[0]->OutputCount());
306 } 340 }
307 } 341 }
308 342
309 INSTANTIATE_TEST_CASE_P(InstructionSelectorTest, InstructionSelectorShiftTest, 343 INSTANTIATE_TEST_CASE_P(InstructionSelectorTest, InstructionSelectorShiftTest,
310 ::testing::ValuesIn(kShiftInstructions)); 344 ::testing::ValuesIn(kShiftInstructions));
311 345
312 TEST_F(InstructionSelectorTest, Word32ShrWithWord32AndWithImmediate) { 346 TEST_F(InstructionSelectorTest, Word32ShrWithWord32AndWithImmediate) {
313 // The available shift operand range is `0 <= imm < 32`, but we also test 347 // The available shift operand range is `0 <= imm < 32`, but we also test
314 // that immediates outside this range are handled properly (modulo-32). 348 // that immediates outside this range are handled properly (modulo-32).
315 TRACED_FORRANGE(int32_t, shift, -32, 63) { 349 TRACED_FORRANGE(int32_t, shift, -32, 63) {
316 int32_t lsb = shift & 0x1f; 350 int32_t lsb = shift & 0x1f;
317 TRACED_FORRANGE(int32_t, width, 1, 32 - lsb) { 351 TRACED_FORRANGE(int32_t, width, 1, 32 - lsb) {
318 uint32_t jnk = rng()->NextInt(); 352 uint32_t jnk = rng()->NextInt();
319 jnk = (lsb > 0) ? (jnk >> (32 - lsb)) : 0; 353 jnk = (lsb > 0) ? (jnk >> (32 - lsb)) : 0;
320 uint32_t msk = ((0xffffffffu >> (32 - width)) << lsb) | jnk; 354 uint32_t msk = ((0xffffffffu >> (32 - width)) << lsb) | jnk;
321 StreamBuilder m(this, kMachInt32, kMachInt32); 355 StreamBuilder m(this, MachineType::Int32(), MachineType::Int32());
322 m.Return(m.Word32Shr(m.Word32And(m.Parameter(0), m.Int32Constant(msk)), 356 m.Return(m.Word32Shr(m.Word32And(m.Parameter(0), m.Int32Constant(msk)),
323 m.Int32Constant(shift))); 357 m.Int32Constant(shift)));
324 Stream s = m.Build(); 358 Stream s = m.Build();
325 ASSERT_EQ(1U, s.size()); 359 ASSERT_EQ(1U, s.size());
326 EXPECT_EQ(kMips64Ext, s[0]->arch_opcode()); 360 EXPECT_EQ(kMips64Ext, s[0]->arch_opcode());
327 ASSERT_EQ(3U, s[0]->InputCount()); 361 ASSERT_EQ(3U, s[0]->InputCount());
328 EXPECT_EQ(lsb, s.ToInt32(s[0]->InputAt(1))); 362 EXPECT_EQ(lsb, s.ToInt32(s[0]->InputAt(1)));
329 EXPECT_EQ(width, s.ToInt32(s[0]->InputAt(2))); 363 EXPECT_EQ(width, s.ToInt32(s[0]->InputAt(2)));
330 } 364 }
331 } 365 }
332 TRACED_FORRANGE(int32_t, shift, -32, 63) { 366 TRACED_FORRANGE(int32_t, shift, -32, 63) {
333 int32_t lsb = shift & 0x1f; 367 int32_t lsb = shift & 0x1f;
334 TRACED_FORRANGE(int32_t, width, 1, 32 - lsb) { 368 TRACED_FORRANGE(int32_t, width, 1, 32 - lsb) {
335 uint32_t jnk = rng()->NextInt(); 369 uint32_t jnk = rng()->NextInt();
336 jnk = (lsb > 0) ? (jnk >> (32 - lsb)) : 0; 370 jnk = (lsb > 0) ? (jnk >> (32 - lsb)) : 0;
337 uint32_t msk = ((0xffffffffu >> (32 - width)) << lsb) | jnk; 371 uint32_t msk = ((0xffffffffu >> (32 - width)) << lsb) | jnk;
338 StreamBuilder m(this, kMachInt32, kMachInt32); 372 StreamBuilder m(this, MachineType::Int32(), MachineType::Int32());
339 m.Return(m.Word32Shr(m.Word32And(m.Int32Constant(msk), m.Parameter(0)), 373 m.Return(m.Word32Shr(m.Word32And(m.Int32Constant(msk), m.Parameter(0)),
340 m.Int32Constant(shift))); 374 m.Int32Constant(shift)));
341 Stream s = m.Build(); 375 Stream s = m.Build();
342 ASSERT_EQ(1U, s.size()); 376 ASSERT_EQ(1U, s.size());
343 EXPECT_EQ(kMips64Ext, s[0]->arch_opcode()); 377 EXPECT_EQ(kMips64Ext, s[0]->arch_opcode());
344 ASSERT_EQ(3U, s[0]->InputCount()); 378 ASSERT_EQ(3U, s[0]->InputCount());
345 EXPECT_EQ(lsb, s.ToInt32(s[0]->InputAt(1))); 379 EXPECT_EQ(lsb, s.ToInt32(s[0]->InputAt(1)));
346 EXPECT_EQ(width, s.ToInt32(s[0]->InputAt(2))); 380 EXPECT_EQ(width, s.ToInt32(s[0]->InputAt(2)));
347 } 381 }
348 } 382 }
349 } 383 }
350 384
351 385
352 TEST_F(InstructionSelectorTest, Word64ShrWithWord64AndWithImmediate) { 386 TEST_F(InstructionSelectorTest, Word64ShrWithWord64AndWithImmediate) {
353 // The available shift operand range is `0 <= imm < 64`, but we also test 387 // The available shift operand range is `0 <= imm < 64`, but we also test
354 // that immediates outside this range are handled properly (modulo-64). 388 // that immediates outside this range are handled properly (modulo-64).
355 TRACED_FORRANGE(int32_t, shift, -64, 127) { 389 TRACED_FORRANGE(int32_t, shift, -64, 127) {
356 int32_t lsb = shift & 0x3f; 390 int32_t lsb = shift & 0x3f;
357 TRACED_FORRANGE(int32_t, width, 1, 64 - lsb) { 391 TRACED_FORRANGE(int32_t, width, 1, 64 - lsb) {
358 uint64_t jnk = rng()->NextInt64(); 392 uint64_t jnk = rng()->NextInt64();
359 jnk = (lsb > 0) ? (jnk >> (64 - lsb)) : 0; 393 jnk = (lsb > 0) ? (jnk >> (64 - lsb)) : 0;
360 uint64_t msk = 394 uint64_t msk =
361 ((V8_UINT64_C(0xffffffffffffffff) >> (64 - width)) << lsb) | jnk; 395 ((V8_UINT64_C(0xffffffffffffffff) >> (64 - width)) << lsb) | jnk;
362 StreamBuilder m(this, kMachInt64, kMachInt64); 396 StreamBuilder m(this, MachineType::Int64(), MachineType::Int64());
363 m.Return(m.Word64Shr(m.Word64And(m.Parameter(0), m.Int64Constant(msk)), 397 m.Return(m.Word64Shr(m.Word64And(m.Parameter(0), m.Int64Constant(msk)),
364 m.Int64Constant(shift))); 398 m.Int64Constant(shift)));
365 Stream s = m.Build(); 399 Stream s = m.Build();
366 ASSERT_EQ(1U, s.size()); 400 ASSERT_EQ(1U, s.size());
367 EXPECT_EQ(kMips64Dext, s[0]->arch_opcode()); 401 EXPECT_EQ(kMips64Dext, s[0]->arch_opcode());
368 ASSERT_EQ(3U, s[0]->InputCount()); 402 ASSERT_EQ(3U, s[0]->InputCount());
369 EXPECT_EQ(lsb, s.ToInt64(s[0]->InputAt(1))); 403 EXPECT_EQ(lsb, s.ToInt64(s[0]->InputAt(1)));
370 EXPECT_EQ(width, s.ToInt64(s[0]->InputAt(2))); 404 EXPECT_EQ(width, s.ToInt64(s[0]->InputAt(2)));
371 } 405 }
372 } 406 }
373 TRACED_FORRANGE(int32_t, shift, -64, 127) { 407 TRACED_FORRANGE(int32_t, shift, -64, 127) {
374 int32_t lsb = shift & 0x3f; 408 int32_t lsb = shift & 0x3f;
375 TRACED_FORRANGE(int32_t, width, 1, 64 - lsb) { 409 TRACED_FORRANGE(int32_t, width, 1, 64 - lsb) {
376 uint64_t jnk = rng()->NextInt64(); 410 uint64_t jnk = rng()->NextInt64();
377 jnk = (lsb > 0) ? (jnk >> (64 - lsb)) : 0; 411 jnk = (lsb > 0) ? (jnk >> (64 - lsb)) : 0;
378 uint64_t msk = 412 uint64_t msk =
379 ((V8_UINT64_C(0xffffffffffffffff) >> (64 - width)) << lsb) | jnk; 413 ((V8_UINT64_C(0xffffffffffffffff) >> (64 - width)) << lsb) | jnk;
380 StreamBuilder m(this, kMachInt64, kMachInt64); 414 StreamBuilder m(this, MachineType::Int64(), MachineType::Int64());
381 m.Return(m.Word64Shr(m.Word64And(m.Int64Constant(msk), m.Parameter(0)), 415 m.Return(m.Word64Shr(m.Word64And(m.Int64Constant(msk), m.Parameter(0)),
382 m.Int64Constant(shift))); 416 m.Int64Constant(shift)));
383 Stream s = m.Build(); 417 Stream s = m.Build();
384 ASSERT_EQ(1U, s.size()); 418 ASSERT_EQ(1U, s.size());
385 EXPECT_EQ(kMips64Dext, s[0]->arch_opcode()); 419 EXPECT_EQ(kMips64Dext, s[0]->arch_opcode());
386 ASSERT_EQ(3U, s[0]->InputCount()); 420 ASSERT_EQ(3U, s[0]->InputCount());
387 EXPECT_EQ(lsb, s.ToInt64(s[0]->InputAt(1))); 421 EXPECT_EQ(lsb, s.ToInt64(s[0]->InputAt(1)));
388 EXPECT_EQ(width, s.ToInt64(s[0]->InputAt(2))); 422 EXPECT_EQ(width, s.ToInt64(s[0]->InputAt(2)));
389 } 423 }
390 } 424 }
391 } 425 }
392 426
393 427
394 TEST_F(InstructionSelectorTest, Word32AndToClearBits) { 428 TEST_F(InstructionSelectorTest, Word32AndToClearBits) {
395 TRACED_FORRANGE(int32_t, shift, 1, 31) { 429 TRACED_FORRANGE(int32_t, shift, 1, 31) {
396 int32_t mask = ~((1 << shift) - 1); 430 int32_t mask = ~((1 << shift) - 1);
397 StreamBuilder m(this, kMachInt32, kMachInt32); 431 StreamBuilder m(this, MachineType::Int32(), MachineType::Int32());
398 m.Return(m.Word32And(m.Parameter(0), m.Int32Constant(mask))); 432 m.Return(m.Word32And(m.Parameter(0), m.Int32Constant(mask)));
399 Stream s = m.Build(); 433 Stream s = m.Build();
400 ASSERT_EQ(1U, s.size()); 434 ASSERT_EQ(1U, s.size());
401 EXPECT_EQ(kMips64Ins, s[0]->arch_opcode()); 435 EXPECT_EQ(kMips64Ins, s[0]->arch_opcode());
402 ASSERT_EQ(3U, s[0]->InputCount()); 436 ASSERT_EQ(3U, s[0]->InputCount());
403 EXPECT_EQ(0, s.ToInt32(s[0]->InputAt(1))); 437 EXPECT_EQ(0, s.ToInt32(s[0]->InputAt(1)));
404 EXPECT_EQ(shift, s.ToInt32(s[0]->InputAt(2))); 438 EXPECT_EQ(shift, s.ToInt32(s[0]->InputAt(2)));
405 } 439 }
406 TRACED_FORRANGE(int32_t, shift, 1, 31) { 440 TRACED_FORRANGE(int32_t, shift, 1, 31) {
407 int32_t mask = ~((1 << shift) - 1); 441 int32_t mask = ~((1 << shift) - 1);
408 StreamBuilder m(this, kMachInt32, kMachInt32); 442 StreamBuilder m(this, MachineType::Int32(), MachineType::Int32());
409 m.Return(m.Word32And(m.Int32Constant(mask), m.Parameter(0))); 443 m.Return(m.Word32And(m.Int32Constant(mask), m.Parameter(0)));
410 Stream s = m.Build(); 444 Stream s = m.Build();
411 ASSERT_EQ(1U, s.size()); 445 ASSERT_EQ(1U, s.size());
412 EXPECT_EQ(kMips64Ins, s[0]->arch_opcode()); 446 EXPECT_EQ(kMips64Ins, s[0]->arch_opcode());
413 ASSERT_EQ(3U, s[0]->InputCount()); 447 ASSERT_EQ(3U, s[0]->InputCount());
414 EXPECT_EQ(0, s.ToInt32(s[0]->InputAt(1))); 448 EXPECT_EQ(0, s.ToInt32(s[0]->InputAt(1)));
415 EXPECT_EQ(shift, s.ToInt32(s[0]->InputAt(2))); 449 EXPECT_EQ(shift, s.ToInt32(s[0]->InputAt(2)));
416 } 450 }
417 } 451 }
418 452
419 453
420 TEST_F(InstructionSelectorTest, Word64AndToClearBits) { 454 TEST_F(InstructionSelectorTest, Word64AndToClearBits) {
421 TRACED_FORRANGE(int32_t, shift, 1, 31) { 455 TRACED_FORRANGE(int32_t, shift, 1, 31) {
422 int64_t mask = ~((1 << shift) - 1); 456 int64_t mask = ~((1 << shift) - 1);
423 StreamBuilder m(this, kMachInt64, kMachInt64); 457 StreamBuilder m(this, MachineType::Int64(), MachineType::Int64());
424 m.Return(m.Word64And(m.Parameter(0), m.Int64Constant(mask))); 458 m.Return(m.Word64And(m.Parameter(0), m.Int64Constant(mask)));
425 Stream s = m.Build(); 459 Stream s = m.Build();
426 ASSERT_EQ(1U, s.size()); 460 ASSERT_EQ(1U, s.size());
427 EXPECT_EQ(kMips64Dins, s[0]->arch_opcode()); 461 EXPECT_EQ(kMips64Dins, s[0]->arch_opcode());
428 ASSERT_EQ(3U, s[0]->InputCount()); 462 ASSERT_EQ(3U, s[0]->InputCount());
429 EXPECT_EQ(0, s.ToInt32(s[0]->InputAt(1))); 463 EXPECT_EQ(0, s.ToInt32(s[0]->InputAt(1)));
430 EXPECT_EQ(shift, s.ToInt32(s[0]->InputAt(2))); 464 EXPECT_EQ(shift, s.ToInt32(s[0]->InputAt(2)));
431 } 465 }
432 TRACED_FORRANGE(int32_t, shift, 1, 31) { 466 TRACED_FORRANGE(int32_t, shift, 1, 31) {
433 int64_t mask = ~((1 << shift) - 1); 467 int64_t mask = ~((1 << shift) - 1);
434 StreamBuilder m(this, kMachInt64, kMachInt64); 468 StreamBuilder m(this, MachineType::Int64(), MachineType::Int64());
435 m.Return(m.Word64And(m.Int64Constant(mask), m.Parameter(0))); 469 m.Return(m.Word64And(m.Int64Constant(mask), m.Parameter(0)));
436 Stream s = m.Build(); 470 Stream s = m.Build();
437 ASSERT_EQ(1U, s.size()); 471 ASSERT_EQ(1U, s.size());
438 EXPECT_EQ(kMips64Dins, s[0]->arch_opcode()); 472 EXPECT_EQ(kMips64Dins, s[0]->arch_opcode());
439 ASSERT_EQ(3U, s[0]->InputCount()); 473 ASSERT_EQ(3U, s[0]->InputCount());
440 EXPECT_EQ(0, s.ToInt32(s[0]->InputAt(1))); 474 EXPECT_EQ(0, s.ToInt32(s[0]->InputAt(1)));
441 EXPECT_EQ(shift, s.ToInt32(s[0]->InputAt(2))); 475 EXPECT_EQ(shift, s.ToInt32(s[0]->InputAt(2)));
442 } 476 }
443 } 477 }
444 478
(...skipping 16 matching lines...) Expand all
461 EXPECT_EQ(2U, s[0]->InputCount()); 495 EXPECT_EQ(2U, s[0]->InputCount());
462 EXPECT_EQ(1U, s[0]->OutputCount()); 496 EXPECT_EQ(1U, s[0]->OutputCount());
463 } 497 }
464 498
465 INSTANTIATE_TEST_CASE_P(InstructionSelectorTest, InstructionSelectorLogicalTest, 499 INSTANTIATE_TEST_CASE_P(InstructionSelectorTest, InstructionSelectorLogicalTest,
466 ::testing::ValuesIn(kLogicalInstructions)); 500 ::testing::ValuesIn(kLogicalInstructions));
467 501
468 502
469 TEST_F(InstructionSelectorTest, Word64XorMinusOneWithParameter) { 503 TEST_F(InstructionSelectorTest, Word64XorMinusOneWithParameter) {
470 { 504 {
471 StreamBuilder m(this, kMachInt64, kMachInt64); 505 StreamBuilder m(this, MachineType::Int64(), MachineType::Int64());
472 m.Return(m.Word64Xor(m.Parameter(0), m.Int64Constant(-1))); 506 m.Return(m.Word64Xor(m.Parameter(0), m.Int64Constant(-1)));
473 Stream s = m.Build(); 507 Stream s = m.Build();
474 ASSERT_EQ(1U, s.size()); 508 ASSERT_EQ(1U, s.size());
475 EXPECT_EQ(kMips64Nor, s[0]->arch_opcode()); 509 EXPECT_EQ(kMips64Nor, s[0]->arch_opcode());
476 EXPECT_EQ(2U, s[0]->InputCount()); 510 EXPECT_EQ(2U, s[0]->InputCount());
477 EXPECT_EQ(1U, s[0]->OutputCount()); 511 EXPECT_EQ(1U, s[0]->OutputCount());
478 } 512 }
479 { 513 {
480 StreamBuilder m(this, kMachInt64, kMachInt64); 514 StreamBuilder m(this, MachineType::Int64(), MachineType::Int64());
481 m.Return(m.Word64Xor(m.Int64Constant(-1), m.Parameter(0))); 515 m.Return(m.Word64Xor(m.Int64Constant(-1), m.Parameter(0)));
482 Stream s = m.Build(); 516 Stream s = m.Build();
483 ASSERT_EQ(1U, s.size()); 517 ASSERT_EQ(1U, s.size());
484 EXPECT_EQ(kMips64Nor, s[0]->arch_opcode()); 518 EXPECT_EQ(kMips64Nor, s[0]->arch_opcode());
485 EXPECT_EQ(2U, s[0]->InputCount()); 519 EXPECT_EQ(2U, s[0]->InputCount());
486 EXPECT_EQ(1U, s[0]->OutputCount()); 520 EXPECT_EQ(1U, s[0]->OutputCount());
487 } 521 }
488 } 522 }
489 523
490 524
491 TEST_F(InstructionSelectorTest, Word32XorMinusOneWithParameter) { 525 TEST_F(InstructionSelectorTest, Word32XorMinusOneWithParameter) {
492 { 526 {
493 StreamBuilder m(this, kMachInt32, kMachInt32); 527 StreamBuilder m(this, MachineType::Int32(), MachineType::Int32());
494 m.Return(m.Word32Xor(m.Parameter(0), m.Int32Constant(-1))); 528 m.Return(m.Word32Xor(m.Parameter(0), m.Int32Constant(-1)));
495 Stream s = m.Build(); 529 Stream s = m.Build();
496 ASSERT_EQ(1U, s.size()); 530 ASSERT_EQ(1U, s.size());
497 EXPECT_EQ(kMips64Nor, s[0]->arch_opcode()); 531 EXPECT_EQ(kMips64Nor, s[0]->arch_opcode());
498 EXPECT_EQ(2U, s[0]->InputCount()); 532 EXPECT_EQ(2U, s[0]->InputCount());
499 EXPECT_EQ(1U, s[0]->OutputCount()); 533 EXPECT_EQ(1U, s[0]->OutputCount());
500 } 534 }
501 { 535 {
502 StreamBuilder m(this, kMachInt32, kMachInt32); 536 StreamBuilder m(this, MachineType::Int32(), MachineType::Int32());
503 m.Return(m.Word32Xor(m.Int32Constant(-1), m.Parameter(0))); 537 m.Return(m.Word32Xor(m.Int32Constant(-1), m.Parameter(0)));
504 Stream s = m.Build(); 538 Stream s = m.Build();
505 ASSERT_EQ(1U, s.size()); 539 ASSERT_EQ(1U, s.size());
506 EXPECT_EQ(kMips64Nor, s[0]->arch_opcode()); 540 EXPECT_EQ(kMips64Nor, s[0]->arch_opcode());
507 EXPECT_EQ(2U, s[0]->InputCount()); 541 EXPECT_EQ(2U, s[0]->InputCount());
508 EXPECT_EQ(1U, s[0]->OutputCount()); 542 EXPECT_EQ(1U, s[0]->OutputCount());
509 } 543 }
510 } 544 }
511 545
512 546
513 TEST_F(InstructionSelectorTest, Word64XorMinusOneWithWord64Or) { 547 TEST_F(InstructionSelectorTest, Word64XorMinusOneWithWord64Or) {
514 { 548 {
515 StreamBuilder m(this, kMachInt64, kMachInt64); 549 StreamBuilder m(this, MachineType::Int64(), MachineType::Int64());
516 m.Return(m.Word64Xor(m.Word64Or(m.Parameter(0), m.Parameter(0)), 550 m.Return(m.Word64Xor(m.Word64Or(m.Parameter(0), m.Parameter(0)),
517 m.Int64Constant(-1))); 551 m.Int64Constant(-1)));
518 Stream s = m.Build(); 552 Stream s = m.Build();
519 ASSERT_EQ(1U, s.size()); 553 ASSERT_EQ(1U, s.size());
520 EXPECT_EQ(kMips64Nor, s[0]->arch_opcode()); 554 EXPECT_EQ(kMips64Nor, s[0]->arch_opcode());
521 EXPECT_EQ(2U, s[0]->InputCount()); 555 EXPECT_EQ(2U, s[0]->InputCount());
522 EXPECT_EQ(1U, s[0]->OutputCount()); 556 EXPECT_EQ(1U, s[0]->OutputCount());
523 } 557 }
524 { 558 {
525 StreamBuilder m(this, kMachInt64, kMachInt64); 559 StreamBuilder m(this, MachineType::Int64(), MachineType::Int64());
526 m.Return(m.Word64Xor(m.Int64Constant(-1), 560 m.Return(m.Word64Xor(m.Int64Constant(-1),
527 m.Word64Or(m.Parameter(0), m.Parameter(0)))); 561 m.Word64Or(m.Parameter(0), m.Parameter(0))));
528 Stream s = m.Build(); 562 Stream s = m.Build();
529 ASSERT_EQ(1U, s.size()); 563 ASSERT_EQ(1U, s.size());
530 EXPECT_EQ(kMips64Nor, s[0]->arch_opcode()); 564 EXPECT_EQ(kMips64Nor, s[0]->arch_opcode());
531 EXPECT_EQ(2U, s[0]->InputCount()); 565 EXPECT_EQ(2U, s[0]->InputCount());
532 EXPECT_EQ(1U, s[0]->OutputCount()); 566 EXPECT_EQ(1U, s[0]->OutputCount());
533 } 567 }
534 } 568 }
535 569
536 570
537 TEST_F(InstructionSelectorTest, Word32XorMinusOneWithWord32Or) { 571 TEST_F(InstructionSelectorTest, Word32XorMinusOneWithWord32Or) {
538 { 572 {
539 StreamBuilder m(this, kMachInt32, kMachInt32); 573 StreamBuilder m(this, MachineType::Int32(), MachineType::Int32());
540 m.Return(m.Word32Xor(m.Word32Or(m.Parameter(0), m.Parameter(0)), 574 m.Return(m.Word32Xor(m.Word32Or(m.Parameter(0), m.Parameter(0)),
541 m.Int32Constant(-1))); 575 m.Int32Constant(-1)));
542 Stream s = m.Build(); 576 Stream s = m.Build();
543 ASSERT_EQ(1U, s.size()); 577 ASSERT_EQ(1U, s.size());
544 EXPECT_EQ(kMips64Nor, s[0]->arch_opcode()); 578 EXPECT_EQ(kMips64Nor, s[0]->arch_opcode());
545 EXPECT_EQ(2U, s[0]->InputCount()); 579 EXPECT_EQ(2U, s[0]->InputCount());
546 EXPECT_EQ(1U, s[0]->OutputCount()); 580 EXPECT_EQ(1U, s[0]->OutputCount());
547 } 581 }
548 { 582 {
549 StreamBuilder m(this, kMachInt32, kMachInt32); 583 StreamBuilder m(this, MachineType::Int32(), MachineType::Int32());
550 m.Return(m.Word32Xor(m.Int32Constant(-1), 584 m.Return(m.Word32Xor(m.Int32Constant(-1),
551 m.Word32Or(m.Parameter(0), m.Parameter(0)))); 585 m.Word32Or(m.Parameter(0), m.Parameter(0))));
552 Stream s = m.Build(); 586 Stream s = m.Build();
553 ASSERT_EQ(1U, s.size()); 587 ASSERT_EQ(1U, s.size());
554 EXPECT_EQ(kMips64Nor, s[0]->arch_opcode()); 588 EXPECT_EQ(kMips64Nor, s[0]->arch_opcode());
555 EXPECT_EQ(2U, s[0]->InputCount()); 589 EXPECT_EQ(2U, s[0]->InputCount());
556 EXPECT_EQ(1U, s[0]->OutputCount()); 590 EXPECT_EQ(1U, s[0]->OutputCount());
557 } 591 }
558 } 592 }
559 593
560 594
561 TEST_F(InstructionSelectorTest, Word32AndWithImmediateWithWord32Shr) { 595 TEST_F(InstructionSelectorTest, Word32AndWithImmediateWithWord32Shr) {
562 // The available shift operand range is `0 <= imm < 32`, but we also test 596 // The available shift operand range is `0 <= imm < 32`, but we also test
563 // that immediates outside this range are handled properly (modulo-32). 597 // that immediates outside this range are handled properly (modulo-32).
564 TRACED_FORRANGE(int32_t, shift, -32, 63) { 598 TRACED_FORRANGE(int32_t, shift, -32, 63) {
565 int32_t lsb = shift & 0x1f; 599 int32_t lsb = shift & 0x1f;
566 TRACED_FORRANGE(int32_t, width, 1, 31) { 600 TRACED_FORRANGE(int32_t, width, 1, 31) {
567 uint32_t msk = (1 << width) - 1; 601 uint32_t msk = (1 << width) - 1;
568 StreamBuilder m(this, kMachInt32, kMachInt32); 602 StreamBuilder m(this, MachineType::Int32(), MachineType::Int32());
569 m.Return(m.Word32And(m.Word32Shr(m.Parameter(0), m.Int32Constant(shift)), 603 m.Return(m.Word32And(m.Word32Shr(m.Parameter(0), m.Int32Constant(shift)),
570 m.Int32Constant(msk))); 604 m.Int32Constant(msk)));
571 Stream s = m.Build(); 605 Stream s = m.Build();
572 ASSERT_EQ(1U, s.size()); 606 ASSERT_EQ(1U, s.size());
573 EXPECT_EQ(kMips64Ext, s[0]->arch_opcode()); 607 EXPECT_EQ(kMips64Ext, s[0]->arch_opcode());
574 ASSERT_EQ(3U, s[0]->InputCount()); 608 ASSERT_EQ(3U, s[0]->InputCount());
575 EXPECT_EQ(lsb, s.ToInt32(s[0]->InputAt(1))); 609 EXPECT_EQ(lsb, s.ToInt32(s[0]->InputAt(1)));
576 int32_t actual_width = (lsb + width > 32) ? (32 - lsb) : width; 610 int32_t actual_width = (lsb + width > 32) ? (32 - lsb) : width;
577 EXPECT_EQ(actual_width, s.ToInt32(s[0]->InputAt(2))); 611 EXPECT_EQ(actual_width, s.ToInt32(s[0]->InputAt(2)));
578 } 612 }
579 } 613 }
580 TRACED_FORRANGE(int32_t, shift, -32, 63) { 614 TRACED_FORRANGE(int32_t, shift, -32, 63) {
581 int32_t lsb = shift & 0x1f; 615 int32_t lsb = shift & 0x1f;
582 TRACED_FORRANGE(int32_t, width, 1, 31) { 616 TRACED_FORRANGE(int32_t, width, 1, 31) {
583 uint32_t msk = (1 << width) - 1; 617 uint32_t msk = (1 << width) - 1;
584 StreamBuilder m(this, kMachInt32, kMachInt32); 618 StreamBuilder m(this, MachineType::Int32(), MachineType::Int32());
585 m.Return( 619 m.Return(
586 m.Word32And(m.Int32Constant(msk), 620 m.Word32And(m.Int32Constant(msk),
587 m.Word32Shr(m.Parameter(0), m.Int32Constant(shift)))); 621 m.Word32Shr(m.Parameter(0), m.Int32Constant(shift))));
588 Stream s = m.Build(); 622 Stream s = m.Build();
589 ASSERT_EQ(1U, s.size()); 623 ASSERT_EQ(1U, s.size());
590 EXPECT_EQ(kMips64Ext, s[0]->arch_opcode()); 624 EXPECT_EQ(kMips64Ext, s[0]->arch_opcode());
591 ASSERT_EQ(3U, s[0]->InputCount()); 625 ASSERT_EQ(3U, s[0]->InputCount());
592 EXPECT_EQ(lsb, s.ToInt32(s[0]->InputAt(1))); 626 EXPECT_EQ(lsb, s.ToInt32(s[0]->InputAt(1)));
593 int32_t actual_width = (lsb + width > 32) ? (32 - lsb) : width; 627 int32_t actual_width = (lsb + width > 32) ? (32 - lsb) : width;
594 EXPECT_EQ(actual_width, s.ToInt32(s[0]->InputAt(2))); 628 EXPECT_EQ(actual_width, s.ToInt32(s[0]->InputAt(2)));
595 } 629 }
596 } 630 }
597 } 631 }
598 632
599 633
600 TEST_F(InstructionSelectorTest, Word64AndWithImmediateWithWord64Shr) { 634 TEST_F(InstructionSelectorTest, Word64AndWithImmediateWithWord64Shr) {
601 // The available shift operand range is `0 <= imm < 64`, but we also test 635 // The available shift operand range is `0 <= imm < 64`, but we also test
602 // that immediates outside this range are handled properly (modulo-64). 636 // that immediates outside this range are handled properly (modulo-64).
603 TRACED_FORRANGE(int64_t, shift, -64, 127) { 637 TRACED_FORRANGE(int64_t, shift, -64, 127) {
604 int64_t lsb = shift & 0x3f; 638 int64_t lsb = shift & 0x3f;
605 TRACED_FORRANGE(int64_t, width, 1, 63) { 639 TRACED_FORRANGE(int64_t, width, 1, 63) {
606 uint64_t msk = (V8_UINT64_C(1) << width) - 1; 640 uint64_t msk = (V8_UINT64_C(1) << width) - 1;
607 StreamBuilder m(this, kMachInt64, kMachInt64); 641 StreamBuilder m(this, MachineType::Int64(), MachineType::Int64());
608 m.Return(m.Word64And(m.Word64Shr(m.Parameter(0), m.Int64Constant(shift)), 642 m.Return(m.Word64And(m.Word64Shr(m.Parameter(0), m.Int64Constant(shift)),
609 m.Int64Constant(msk))); 643 m.Int64Constant(msk)));
610 Stream s = m.Build(); 644 Stream s = m.Build();
611 ASSERT_EQ(1U, s.size()); 645 ASSERT_EQ(1U, s.size());
612 EXPECT_EQ(kMips64Dext, s[0]->arch_opcode()); 646 EXPECT_EQ(kMips64Dext, s[0]->arch_opcode());
613 ASSERT_EQ(3U, s[0]->InputCount()); 647 ASSERT_EQ(3U, s[0]->InputCount());
614 EXPECT_EQ(lsb, s.ToInt64(s[0]->InputAt(1))); 648 EXPECT_EQ(lsb, s.ToInt64(s[0]->InputAt(1)));
615 int64_t actual_width = (lsb + width > 64) ? (64 - lsb) : width; 649 int64_t actual_width = (lsb + width > 64) ? (64 - lsb) : width;
616 EXPECT_EQ(actual_width, s.ToInt64(s[0]->InputAt(2))); 650 EXPECT_EQ(actual_width, s.ToInt64(s[0]->InputAt(2)));
617 } 651 }
618 } 652 }
619 TRACED_FORRANGE(int64_t, shift, -64, 127) { 653 TRACED_FORRANGE(int64_t, shift, -64, 127) {
620 int64_t lsb = shift & 0x3f; 654 int64_t lsb = shift & 0x3f;
621 TRACED_FORRANGE(int64_t, width, 1, 63) { 655 TRACED_FORRANGE(int64_t, width, 1, 63) {
622 uint64_t msk = (V8_UINT64_C(1) << width) - 1; 656 uint64_t msk = (V8_UINT64_C(1) << width) - 1;
623 StreamBuilder m(this, kMachInt64, kMachInt64); 657 StreamBuilder m(this, MachineType::Int64(), MachineType::Int64());
624 m.Return( 658 m.Return(
625 m.Word64And(m.Int64Constant(msk), 659 m.Word64And(m.Int64Constant(msk),
626 m.Word64Shr(m.Parameter(0), m.Int64Constant(shift)))); 660 m.Word64Shr(m.Parameter(0), m.Int64Constant(shift))));
627 Stream s = m.Build(); 661 Stream s = m.Build();
628 ASSERT_EQ(1U, s.size()); 662 ASSERT_EQ(1U, s.size());
629 EXPECT_EQ(kMips64Dext, s[0]->arch_opcode()); 663 EXPECT_EQ(kMips64Dext, s[0]->arch_opcode());
630 ASSERT_EQ(3U, s[0]->InputCount()); 664 ASSERT_EQ(3U, s[0]->InputCount());
631 EXPECT_EQ(lsb, s.ToInt64(s[0]->InputAt(1))); 665 EXPECT_EQ(lsb, s.ToInt64(s[0]->InputAt(1)));
632 int64_t actual_width = (lsb + width > 64) ? (64 - lsb) : width; 666 int64_t actual_width = (lsb + width > 64) ? (64 - lsb) : width;
633 EXPECT_EQ(actual_width, s.ToInt64(s[0]->InputAt(2))); 667 EXPECT_EQ(actual_width, s.ToInt64(s[0]->InputAt(2)));
634 } 668 }
635 } 669 }
636 } 670 }
637 671
638 672
639 TEST_F(InstructionSelectorTest, Word32ShlWithWord32And) { 673 TEST_F(InstructionSelectorTest, Word32ShlWithWord32And) {
640 TRACED_FORRANGE(int32_t, shift, 0, 30) { 674 TRACED_FORRANGE(int32_t, shift, 0, 30) {
641 StreamBuilder m(this, kMachInt32, kMachInt32); 675 StreamBuilder m(this, MachineType::Int32(), MachineType::Int32());
642 Node* const p0 = m.Parameter(0); 676 Node* const p0 = m.Parameter(0);
643 Node* const r = 677 Node* const r =
644 m.Word32Shl(m.Word32And(p0, m.Int32Constant((1 << (31 - shift)) - 1)), 678 m.Word32Shl(m.Word32And(p0, m.Int32Constant((1 << (31 - shift)) - 1)),
645 m.Int32Constant(shift + 1)); 679 m.Int32Constant(shift + 1));
646 m.Return(r); 680 m.Return(r);
647 Stream s = m.Build(); 681 Stream s = m.Build();
648 ASSERT_EQ(1U, s.size()); 682 ASSERT_EQ(1U, s.size());
649 EXPECT_EQ(kMips64Shl, s[0]->arch_opcode()); 683 EXPECT_EQ(kMips64Shl, s[0]->arch_opcode());
650 ASSERT_EQ(2U, s[0]->InputCount()); 684 ASSERT_EQ(2U, s[0]->InputCount());
651 EXPECT_EQ(s.ToVreg(p0), s.ToVreg(s[0]->InputAt(0))); 685 EXPECT_EQ(s.ToVreg(p0), s.ToVreg(s[0]->InputAt(0)));
652 ASSERT_EQ(1U, s[0]->OutputCount()); 686 ASSERT_EQ(1U, s[0]->OutputCount());
653 EXPECT_EQ(s.ToVreg(r), s.ToVreg(s[0]->Output())); 687 EXPECT_EQ(s.ToVreg(r), s.ToVreg(s[0]->Output()));
654 } 688 }
655 } 689 }
656 690
657 691
658 TEST_F(InstructionSelectorTest, Word64ShlWithWord64And) { 692 TEST_F(InstructionSelectorTest, Word64ShlWithWord64And) {
659 TRACED_FORRANGE(int32_t, shift, 0, 62) { 693 TRACED_FORRANGE(int32_t, shift, 0, 62) {
660 StreamBuilder m(this, kMachInt64, kMachInt64); 694 StreamBuilder m(this, MachineType::Int64(), MachineType::Int64());
661 Node* const p0 = m.Parameter(0); 695 Node* const p0 = m.Parameter(0);
662 Node* const r = 696 Node* const r =
663 m.Word64Shl(m.Word64And(p0, m.Int64Constant((1L << (63 - shift)) - 1)), 697 m.Word64Shl(m.Word64And(p0, m.Int64Constant((1L << (63 - shift)) - 1)),
664 m.Int64Constant(shift + 1)); 698 m.Int64Constant(shift + 1));
665 m.Return(r); 699 m.Return(r);
666 Stream s = m.Build(); 700 Stream s = m.Build();
667 ASSERT_EQ(1U, s.size()); 701 ASSERT_EQ(1U, s.size());
668 EXPECT_EQ(kMips64Dshl, s[0]->arch_opcode()); 702 EXPECT_EQ(kMips64Dshl, s[0]->arch_opcode());
669 ASSERT_EQ(2U, s[0]->InputCount()); 703 ASSERT_EQ(2U, s[0]->InputCount());
670 EXPECT_EQ(s.ToVreg(p0), s.ToVreg(s[0]->InputAt(0))); 704 EXPECT_EQ(s.ToVreg(p0), s.ToVreg(s[0]->InputAt(0)));
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
796 EXPECT_EQ(1U, s[0]->InputCount()); 830 EXPECT_EQ(1U, s[0]->InputCount());
797 EXPECT_EQ(1U, s[0]->OutputCount()); 831 EXPECT_EQ(1U, s[0]->OutputCount());
798 } 832 }
799 833
800 INSTANTIATE_TEST_CASE_P(InstructionSelectorTest, 834 INSTANTIATE_TEST_CASE_P(InstructionSelectorTest,
801 InstructionSelectorConversionTest, 835 InstructionSelectorConversionTest,
802 ::testing::ValuesIn(kConversionInstructions)); 836 ::testing::ValuesIn(kConversionInstructions));
803 837
804 TEST_F(InstructionSelectorTest, ChangesFromToSmi) { 838 TEST_F(InstructionSelectorTest, ChangesFromToSmi) {
805 { 839 {
806 StreamBuilder m(this, kMachInt32, kMachInt32); 840 StreamBuilder m(this, MachineType::Int32(), MachineType::Int32());
807 m.Return(m.TruncateInt64ToInt32( 841 m.Return(m.TruncateInt64ToInt32(
808 m.Word64Sar(m.Parameter(0), m.Int32Constant(32)))); 842 m.Word64Sar(m.Parameter(0), m.Int32Constant(32))));
809 Stream s = m.Build(); 843 Stream s = m.Build();
810 ASSERT_EQ(1U, s.size()); 844 ASSERT_EQ(1U, s.size());
811 EXPECT_EQ(kMips64Dsar, s[0]->arch_opcode()); 845 EXPECT_EQ(kMips64Dsar, s[0]->arch_opcode());
812 EXPECT_EQ(kMode_None, s[0]->addressing_mode()); 846 EXPECT_EQ(kMode_None, s[0]->addressing_mode());
813 ASSERT_EQ(2U, s[0]->InputCount()); 847 ASSERT_EQ(2U, s[0]->InputCount());
814 EXPECT_EQ(1U, s[0]->OutputCount()); 848 EXPECT_EQ(1U, s[0]->OutputCount());
815 } 849 }
816 { 850 {
817 StreamBuilder m(this, kMachInt32, kMachInt32); 851 StreamBuilder m(this, MachineType::Int32(), MachineType::Int32());
818 m.Return( 852 m.Return(
819 m.Word64Shl(m.ChangeInt32ToInt64(m.Parameter(0)), m.Int32Constant(32))); 853 m.Word64Shl(m.ChangeInt32ToInt64(m.Parameter(0)), m.Int32Constant(32)));
820 Stream s = m.Build(); 854 Stream s = m.Build();
821 ASSERT_EQ(1U, s.size()); 855 ASSERT_EQ(1U, s.size());
822 EXPECT_EQ(kMips64Dshl, s[0]->arch_opcode()); 856 EXPECT_EQ(kMips64Dshl, s[0]->arch_opcode());
823 ASSERT_EQ(2U, s[0]->InputCount()); 857 ASSERT_EQ(2U, s[0]->InputCount());
824 EXPECT_EQ(1U, s[0]->OutputCount()); 858 EXPECT_EQ(1U, s[0]->OutputCount());
825 } 859 }
826 } 860 }
827 861
(...skipping 15 matching lines...) Expand all
843 } 877 }
844 } 878 }
845 879
846 INSTANTIATE_TEST_CASE_P(InstructionSelectorTest, 880 INSTANTIATE_TEST_CASE_P(InstructionSelectorTest,
847 CombineChangeFloat64ToInt32WithRoundFloat64, 881 CombineChangeFloat64ToInt32WithRoundFloat64,
848 ::testing::ValuesIn(kFloat64RoundInstructions)); 882 ::testing::ValuesIn(kFloat64RoundInstructions));
849 883
850 884
851 TEST_F(InstructionSelectorTest, CombineShiftsWithMul) { 885 TEST_F(InstructionSelectorTest, CombineShiftsWithMul) {
852 { 886 {
853 StreamBuilder m(this, kMachInt32, kMachInt32); 887 StreamBuilder m(this, MachineType::Int32(), MachineType::Int32());
854 m.Return(m.Int32Mul(m.Word64Sar(m.Parameter(0), m.Int32Constant(32)), 888 m.Return(m.Int32Mul(m.Word64Sar(m.Parameter(0), m.Int32Constant(32)),
855 m.Word64Sar(m.Parameter(0), m.Int32Constant(32)))); 889 m.Word64Sar(m.Parameter(0), m.Int32Constant(32))));
856 Stream s = m.Build(); 890 Stream s = m.Build();
857 ASSERT_EQ(1U, s.size()); 891 ASSERT_EQ(1U, s.size());
858 EXPECT_EQ(kMips64DMulHigh, s[0]->arch_opcode()); 892 EXPECT_EQ(kMips64DMulHigh, s[0]->arch_opcode());
859 EXPECT_EQ(kMode_None, s[0]->addressing_mode()); 893 EXPECT_EQ(kMode_None, s[0]->addressing_mode());
860 ASSERT_EQ(2U, s[0]->InputCount()); 894 ASSERT_EQ(2U, s[0]->InputCount());
861 EXPECT_EQ(1U, s[0]->OutputCount()); 895 EXPECT_EQ(1U, s[0]->OutputCount());
862 } 896 }
863 } 897 }
864 898
865 899
866 TEST_F(InstructionSelectorTest, CombineShiftsWithDivMod) { 900 TEST_F(InstructionSelectorTest, CombineShiftsWithDivMod) {
867 { 901 {
868 StreamBuilder m(this, kMachInt32, kMachInt32); 902 StreamBuilder m(this, MachineType::Int32(), MachineType::Int32());
869 m.Return(m.Int32Div(m.Word64Sar(m.Parameter(0), m.Int32Constant(32)), 903 m.Return(m.Int32Div(m.Word64Sar(m.Parameter(0), m.Int32Constant(32)),
870 m.Word64Sar(m.Parameter(0), m.Int32Constant(32)))); 904 m.Word64Sar(m.Parameter(0), m.Int32Constant(32))));
871 Stream s = m.Build(); 905 Stream s = m.Build();
872 ASSERT_EQ(1U, s.size()); 906 ASSERT_EQ(1U, s.size());
873 EXPECT_EQ(kMips64Ddiv, s[0]->arch_opcode()); 907 EXPECT_EQ(kMips64Ddiv, s[0]->arch_opcode());
874 EXPECT_EQ(kMode_None, s[0]->addressing_mode()); 908 EXPECT_EQ(kMode_None, s[0]->addressing_mode());
875 ASSERT_EQ(2U, s[0]->InputCount()); 909 ASSERT_EQ(2U, s[0]->InputCount());
876 EXPECT_EQ(1U, s[0]->OutputCount()); 910 EXPECT_EQ(1U, s[0]->OutputCount());
877 } 911 }
878 { 912 {
879 StreamBuilder m(this, kMachInt32, kMachInt32); 913 StreamBuilder m(this, MachineType::Int32(), MachineType::Int32());
880 m.Return(m.Int32Mod(m.Word64Sar(m.Parameter(0), m.Int32Constant(32)), 914 m.Return(m.Int32Mod(m.Word64Sar(m.Parameter(0), m.Int32Constant(32)),
881 m.Word64Sar(m.Parameter(0), m.Int32Constant(32)))); 915 m.Word64Sar(m.Parameter(0), m.Int32Constant(32))));
882 Stream s = m.Build(); 916 Stream s = m.Build();
883 ASSERT_EQ(1U, s.size()); 917 ASSERT_EQ(1U, s.size());
884 EXPECT_EQ(kMips64Dmod, s[0]->arch_opcode()); 918 EXPECT_EQ(kMips64Dmod, s[0]->arch_opcode());
885 EXPECT_EQ(kMode_None, s[0]->addressing_mode()); 919 EXPECT_EQ(kMode_None, s[0]->addressing_mode());
886 ASSERT_EQ(2U, s[0]->InputCount()); 920 ASSERT_EQ(2U, s[0]->InputCount());
887 EXPECT_EQ(1U, s[0]->OutputCount()); 921 EXPECT_EQ(1U, s[0]->OutputCount());
888 } 922 }
889 } 923 }
890 924
891 925
892 // ---------------------------------------------------------------------------- 926 // ----------------------------------------------------------------------------
893 // Loads and stores. 927 // Loads and stores.
894 // ---------------------------------------------------------------------------- 928 // ----------------------------------------------------------------------------
895 929
896 930
897 namespace { 931 namespace {
898 932
899 struct MemoryAccess { 933 struct MemoryAccess {
900 MachineType type; 934 MachineType type;
901 ArchOpcode load_opcode; 935 ArchOpcode load_opcode;
902 ArchOpcode store_opcode; 936 ArchOpcode store_opcode;
903 }; 937 };
904 938
905 static const MemoryAccess kMemoryAccesses[] = { 939 static const MemoryAccess kMemoryAccesses[] = {
906 {kMachInt8, kMips64Lb, kMips64Sb}, 940 {MachineType::Int8(), kMips64Lb, kMips64Sb},
907 {kMachUint8, kMips64Lbu, kMips64Sb}, 941 {MachineType::Uint8(), kMips64Lbu, kMips64Sb},
908 {kMachInt16, kMips64Lh, kMips64Sh}, 942 {MachineType::Int16(), kMips64Lh, kMips64Sh},
909 {kMachUint16, kMips64Lhu, kMips64Sh}, 943 {MachineType::Uint16(), kMips64Lhu, kMips64Sh},
910 {kMachInt32, kMips64Lw, kMips64Sw}, 944 {MachineType::Int32(), kMips64Lw, kMips64Sw},
911 {kMachFloat32, kMips64Lwc1, kMips64Swc1}, 945 {MachineType::Float32(), kMips64Lwc1, kMips64Swc1},
912 {kMachFloat64, kMips64Ldc1, kMips64Sdc1}, 946 {MachineType::Float64(), kMips64Ldc1, kMips64Sdc1},
913 {kMachInt64, kMips64Ld, kMips64Sd}}; 947 {MachineType::Int64(), kMips64Ld, kMips64Sd}};
914 948
915 949
916 struct MemoryAccessImm { 950 struct MemoryAccessImm {
917 MachineType type; 951 MachineType type;
918 ArchOpcode load_opcode; 952 ArchOpcode load_opcode;
919 ArchOpcode store_opcode; 953 ArchOpcode store_opcode;
920 bool (InstructionSelectorTest::Stream::*val_predicate)( 954 bool (InstructionSelectorTest::Stream::*val_predicate)(
921 const InstructionOperand*) const; 955 const InstructionOperand*) const;
922 const int32_t immediates[40]; 956 const int32_t immediates[40];
923 }; 957 };
(...skipping 18 matching lines...) Expand all
942 return os << acc.type; 976 return os << acc.type;
943 } 977 }
944 978
945 979
946 // ---------------------------------------------------------------------------- 980 // ----------------------------------------------------------------------------
947 // Loads and stores immediate values 981 // Loads and stores immediate values
948 // ---------------------------------------------------------------------------- 982 // ----------------------------------------------------------------------------
949 983
950 984
951 const MemoryAccessImm kMemoryAccessesImm[] = { 985 const MemoryAccessImm kMemoryAccessesImm[] = {
952 {kMachInt8, 986 {MachineType::Int8(),
953 kMips64Lb, 987 kMips64Lb,
954 kMips64Sb, 988 kMips64Sb,
955 &InstructionSelectorTest::Stream::IsInteger, 989 &InstructionSelectorTest::Stream::IsInteger,
956 {-4095, -3340, -3231, -3224, -3088, -1758, -1203, -123, -117, -91, -89, 990 {-4095, -3340, -3231, -3224, -3088, -1758, -1203, -123, -117, -91, -89,
957 -87, -86, -82, -44, -23, -3, 0, 7, 10, 39, 52, 69, 71, 91, 92, 107, 109, 991 -87, -86, -82, -44, -23, -3, 0, 7, 10, 39, 52, 69, 71, 91, 92, 107, 109,
958 115, 124, 286, 655, 1362, 1569, 2587, 3067, 3096, 3462, 3510, 4095}}, 992 115, 124, 286, 655, 1362, 1569, 2587, 3067, 3096, 3462, 3510, 4095}},
959 {kMachUint8, 993 {MachineType::Uint8(),
960 kMips64Lbu, 994 kMips64Lbu,
961 kMips64Sb, 995 kMips64Sb,
962 &InstructionSelectorTest::Stream::IsInteger, 996 &InstructionSelectorTest::Stream::IsInteger,
963 {-4095, -3340, -3231, -3224, -3088, -1758, -1203, -123, -117, -91, -89, 997 {-4095, -3340, -3231, -3224, -3088, -1758, -1203, -123, -117, -91, -89,
964 -87, -86, -82, -44, -23, -3, 0, 7, 10, 39, 52, 69, 71, 91, 92, 107, 109, 998 -87, -86, -82, -44, -23, -3, 0, 7, 10, 39, 52, 69, 71, 91, 92, 107, 109,
965 115, 124, 286, 655, 1362, 1569, 2587, 3067, 3096, 3462, 3510, 4095}}, 999 115, 124, 286, 655, 1362, 1569, 2587, 3067, 3096, 3462, 3510, 4095}},
966 {kMachInt16, 1000 {MachineType::Int16(),
967 kMips64Lh, 1001 kMips64Lh,
968 kMips64Sh, 1002 kMips64Sh,
969 &InstructionSelectorTest::Stream::IsInteger, 1003 &InstructionSelectorTest::Stream::IsInteger,
970 {-4095, -3340, -3231, -3224, -3088, -1758, -1203, -123, -117, -91, -89, 1004 {-4095, -3340, -3231, -3224, -3088, -1758, -1203, -123, -117, -91, -89,
971 -87, -86, -82, -44, -23, -3, 0, 7, 10, 39, 52, 69, 71, 91, 92, 107, 109, 1005 -87, -86, -82, -44, -23, -3, 0, 7, 10, 39, 52, 69, 71, 91, 92, 107, 109,
972 115, 124, 286, 655, 1362, 1569, 2587, 3067, 3096, 3462, 3510, 4095}}, 1006 115, 124, 286, 655, 1362, 1569, 2587, 3067, 3096, 3462, 3510, 4095}},
973 {kMachUint16, 1007 {MachineType::Uint16(),
974 kMips64Lhu, 1008 kMips64Lhu,
975 kMips64Sh, 1009 kMips64Sh,
976 &InstructionSelectorTest::Stream::IsInteger, 1010 &InstructionSelectorTest::Stream::IsInteger,
977 {-4095, -3340, -3231, -3224, -3088, -1758, -1203, -123, -117, -91, -89, 1011 {-4095, -3340, -3231, -3224, -3088, -1758, -1203, -123, -117, -91, -89,
978 -87, -86, -82, -44, -23, -3, 0, 7, 10, 39, 52, 69, 71, 91, 92, 107, 109, 1012 -87, -86, -82, -44, -23, -3, 0, 7, 10, 39, 52, 69, 71, 91, 92, 107, 109,
979 115, 124, 286, 655, 1362, 1569, 2587, 3067, 3096, 3462, 3510, 4095}}, 1013 115, 124, 286, 655, 1362, 1569, 2587, 3067, 3096, 3462, 3510, 4095}},
980 {kMachInt32, 1014 {MachineType::Int32(),
981 kMips64Lw, 1015 kMips64Lw,
982 kMips64Sw, 1016 kMips64Sw,
983 &InstructionSelectorTest::Stream::IsInteger, 1017 &InstructionSelectorTest::Stream::IsInteger,
984 {-4095, -3340, -3231, -3224, -3088, -1758, -1203, -123, -117, -91, -89, 1018 {-4095, -3340, -3231, -3224, -3088, -1758, -1203, -123, -117, -91, -89,
985 -87, -86, -82, -44, -23, -3, 0, 7, 10, 39, 52, 69, 71, 91, 92, 107, 109, 1019 -87, -86, -82, -44, -23, -3, 0, 7, 10, 39, 52, 69, 71, 91, 92, 107, 109,
986 115, 124, 286, 655, 1362, 1569, 2587, 3067, 3096, 3462, 3510, 4095}}, 1020 115, 124, 286, 655, 1362, 1569, 2587, 3067, 3096, 3462, 3510, 4095}},
987 {kMachFloat32, 1021 {MachineType::Float32(),
988 kMips64Lwc1, 1022 kMips64Lwc1,
989 kMips64Swc1, 1023 kMips64Swc1,
990 &InstructionSelectorTest::Stream::IsDouble, 1024 &InstructionSelectorTest::Stream::IsDouble,
991 {-4095, -3340, -3231, -3224, -3088, -1758, -1203, -123, -117, -91, -89, 1025 {-4095, -3340, -3231, -3224, -3088, -1758, -1203, -123, -117, -91, -89,
992 -87, -86, -82, -44, -23, -3, 0, 7, 10, 39, 52, 69, 71, 91, 92, 107, 109, 1026 -87, -86, -82, -44, -23, -3, 0, 7, 10, 39, 52, 69, 71, 91, 92, 107, 109,
993 115, 124, 286, 655, 1362, 1569, 2587, 3067, 3096, 3462, 3510, 4095}}, 1027 115, 124, 286, 655, 1362, 1569, 2587, 3067, 3096, 3462, 3510, 4095}},
994 {kMachFloat64, 1028 {MachineType::Float64(),
995 kMips64Ldc1, 1029 kMips64Ldc1,
996 kMips64Sdc1, 1030 kMips64Sdc1,
997 &InstructionSelectorTest::Stream::IsDouble, 1031 &InstructionSelectorTest::Stream::IsDouble,
998 {-4095, -3340, -3231, -3224, -3088, -1758, -1203, -123, -117, -91, -89, 1032 {-4095, -3340, -3231, -3224, -3088, -1758, -1203, -123, -117, -91, -89,
999 -87, -86, -82, -44, -23, -3, 0, 7, 10, 39, 52, 69, 71, 91, 92, 107, 109, 1033 -87, -86, -82, -44, -23, -3, 0, 7, 10, 39, 52, 69, 71, 91, 92, 107, 109,
1000 115, 124, 286, 655, 1362, 1569, 2587, 3067, 3096, 3462, 3510, 4095}}, 1034 115, 124, 286, 655, 1362, 1569, 2587, 3067, 3096, 3462, 3510, 4095}},
1001 {kMachInt64, 1035 {MachineType::Int64(),
1002 kMips64Ld, 1036 kMips64Ld,
1003 kMips64Sd, 1037 kMips64Sd,
1004 &InstructionSelectorTest::Stream::IsInteger, 1038 &InstructionSelectorTest::Stream::IsInteger,
1005 {-4095, -3340, -3231, -3224, -3088, -1758, -1203, -123, -117, -91, -89, 1039 {-4095, -3340, -3231, -3224, -3088, -1758, -1203, -123, -117, -91, -89,
1006 -87, -86, -82, -44, -23, -3, 0, 7, 10, 39, 52, 69, 71, 91, 92, 107, 109, 1040 -87, -86, -82, -44, -23, -3, 0, 7, 10, 39, 52, 69, 71, 91, 92, 107, 109,
1007 115, 124, 286, 655, 1362, 1569, 2587, 3067, 3096, 3462, 3510, 4095}}}; 1041 115, 124, 286, 655, 1362, 1569, 2587, 3067, 3096, 3462, 3510, 4095}}};
1008 1042
1009 1043
1010 const MemoryAccessImm1 kMemoryAccessImmMoreThan16bit[] = { 1044 const MemoryAccessImm1 kMemoryAccessImmMoreThan16bit[] = {
1011 {kMachInt8, 1045 {MachineType::Int8(),
1012 kMips64Lb, 1046 kMips64Lb,
1013 kMips64Sb, 1047 kMips64Sb,
1014 &InstructionSelectorTest::Stream::IsInteger, 1048 &InstructionSelectorTest::Stream::IsInteger,
1015 {-65000, -55000, 32777, 55000, 65000}}, 1049 {-65000, -55000, 32777, 55000, 65000}},
1016 {kMachInt8, 1050 {MachineType::Int8(),
1017 kMips64Lbu, 1051 kMips64Lbu,
1018 kMips64Sb, 1052 kMips64Sb,
1019 &InstructionSelectorTest::Stream::IsInteger, 1053 &InstructionSelectorTest::Stream::IsInteger,
1020 {-65000, -55000, 32777, 55000, 65000}}, 1054 {-65000, -55000, 32777, 55000, 65000}},
1021 {kMachInt16, 1055 {MachineType::Int16(),
1022 kMips64Lh, 1056 kMips64Lh,
1023 kMips64Sh, 1057 kMips64Sh,
1024 &InstructionSelectorTest::Stream::IsInteger, 1058 &InstructionSelectorTest::Stream::IsInteger,
1025 {-65000, -55000, 32777, 55000, 65000}}, 1059 {-65000, -55000, 32777, 55000, 65000}},
1026 {kMachInt16, 1060 {MachineType::Int16(),
1027 kMips64Lhu, 1061 kMips64Lhu,
1028 kMips64Sh, 1062 kMips64Sh,
1029 &InstructionSelectorTest::Stream::IsInteger, 1063 &InstructionSelectorTest::Stream::IsInteger,
1030 {-65000, -55000, 32777, 55000, 65000}}, 1064 {-65000, -55000, 32777, 55000, 65000}},
1031 {kMachInt32, 1065 {MachineType::Int32(),
1032 kMips64Lw, 1066 kMips64Lw,
1033 kMips64Sw, 1067 kMips64Sw,
1034 &InstructionSelectorTest::Stream::IsInteger, 1068 &InstructionSelectorTest::Stream::IsInteger,
1035 {-65000, -55000, 32777, 55000, 65000}}, 1069 {-65000, -55000, 32777, 55000, 65000}},
1036 {kMachFloat32, 1070 {MachineType::Float32(),
1037 kMips64Lwc1, 1071 kMips64Lwc1,
1038 kMips64Swc1, 1072 kMips64Swc1,
1039 &InstructionSelectorTest::Stream::IsDouble, 1073 &InstructionSelectorTest::Stream::IsDouble,
1040 {-65000, -55000, 32777, 55000, 65000}}, 1074 {-65000, -55000, 32777, 55000, 65000}},
1041 {kMachFloat64, 1075 {MachineType::Float64(),
1042 kMips64Ldc1, 1076 kMips64Ldc1,
1043 kMips64Sdc1, 1077 kMips64Sdc1,
1044 &InstructionSelectorTest::Stream::IsDouble, 1078 &InstructionSelectorTest::Stream::IsDouble,
1045 {-65000, -55000, 32777, 55000, 65000}}, 1079 {-65000, -55000, 32777, 55000, 65000}},
1046 {kMachInt64, 1080 {MachineType::Int64(),
1047 kMips64Ld, 1081 kMips64Ld,
1048 kMips64Sd, 1082 kMips64Sd,
1049 &InstructionSelectorTest::Stream::IsInteger, 1083 &InstructionSelectorTest::Stream::IsInteger,
1050 {-65000, -55000, 32777, 55000, 65000}}}; 1084 {-65000, -55000, 32777, 55000, 65000}}};
1051 1085
1052 } // namespace 1086 } // namespace
1053 1087
1054 1088
1055 typedef InstructionSelectorTestWithParam<MemoryAccess> 1089 typedef InstructionSelectorTestWithParam<MemoryAccess>
1056 InstructionSelectorMemoryAccessTest; 1090 InstructionSelectorMemoryAccessTest;
1057 1091
1058 TEST_P(InstructionSelectorMemoryAccessTest, LoadWithParameters) { 1092 TEST_P(InstructionSelectorMemoryAccessTest, LoadWithParameters) {
1059 const MemoryAccess memacc = GetParam(); 1093 const MemoryAccess memacc = GetParam();
1060 StreamBuilder m(this, memacc.type, kMachPtr, kMachInt32); 1094 StreamBuilder m(this, memacc.type, MachineType::Pointer(),
1095 MachineType::Int32());
1061 m.Return(m.Load(memacc.type, m.Parameter(0))); 1096 m.Return(m.Load(memacc.type, m.Parameter(0)));
1062 Stream s = m.Build(); 1097 Stream s = m.Build();
1063 ASSERT_EQ(1U, s.size()); 1098 ASSERT_EQ(1U, s.size());
1064 EXPECT_EQ(memacc.load_opcode, s[0]->arch_opcode()); 1099 EXPECT_EQ(memacc.load_opcode, s[0]->arch_opcode());
1065 EXPECT_EQ(kMode_MRI, s[0]->addressing_mode()); 1100 EXPECT_EQ(kMode_MRI, s[0]->addressing_mode());
1066 } 1101 }
1067 1102
1068 1103
1069 TEST_P(InstructionSelectorMemoryAccessTest, StoreWithParameters) { 1104 TEST_P(InstructionSelectorMemoryAccessTest, StoreWithParameters) {
1070 const MemoryAccess memacc = GetParam(); 1105 const MemoryAccess memacc = GetParam();
1071 StreamBuilder m(this, kMachInt32, kMachPtr, kMachInt32, memacc.type); 1106 StreamBuilder m(this, MachineType::Int32(), MachineType::Pointer(),
1107 MachineType::Int32(), memacc.type);
1072 m.Store(memacc.type, m.Parameter(0), m.Parameter(1), kNoWriteBarrier); 1108 m.Store(memacc.type, m.Parameter(0), m.Parameter(1), kNoWriteBarrier);
1073 m.Return(m.Int32Constant(0)); 1109 m.Return(m.Int32Constant(0));
1074 Stream s = m.Build(); 1110 Stream s = m.Build();
1075 ASSERT_EQ(1U, s.size()); 1111 ASSERT_EQ(1U, s.size());
1076 EXPECT_EQ(memacc.store_opcode, s[0]->arch_opcode()); 1112 EXPECT_EQ(memacc.store_opcode, s[0]->arch_opcode());
1077 EXPECT_EQ(kMode_MRI, s[0]->addressing_mode()); 1113 EXPECT_EQ(kMode_MRI, s[0]->addressing_mode());
1078 } 1114 }
1079 1115
1080 INSTANTIATE_TEST_CASE_P(InstructionSelectorTest, 1116 INSTANTIATE_TEST_CASE_P(InstructionSelectorTest,
1081 InstructionSelectorMemoryAccessTest, 1117 InstructionSelectorMemoryAccessTest,
1082 ::testing::ValuesIn(kMemoryAccesses)); 1118 ::testing::ValuesIn(kMemoryAccesses));
1083 1119
1084 1120
1085 // ---------------------------------------------------------------------------- 1121 // ----------------------------------------------------------------------------
1086 // Load immediate. 1122 // Load immediate.
1087 // ---------------------------------------------------------------------------- 1123 // ----------------------------------------------------------------------------
1088 1124
1089 1125
1090 typedef InstructionSelectorTestWithParam<MemoryAccessImm> 1126 typedef InstructionSelectorTestWithParam<MemoryAccessImm>
1091 InstructionSelectorMemoryAccessImmTest; 1127 InstructionSelectorMemoryAccessImmTest;
1092 1128
1093 TEST_P(InstructionSelectorMemoryAccessImmTest, LoadWithImmediateIndex) { 1129 TEST_P(InstructionSelectorMemoryAccessImmTest, LoadWithImmediateIndex) {
1094 const MemoryAccessImm memacc = GetParam(); 1130 const MemoryAccessImm memacc = GetParam();
1095 TRACED_FOREACH(int32_t, index, memacc.immediates) { 1131 TRACED_FOREACH(int32_t, index, memacc.immediates) {
1096 StreamBuilder m(this, memacc.type, kMachPtr); 1132 StreamBuilder m(this, memacc.type, MachineType::Pointer());
1097 m.Return(m.Load(memacc.type, m.Parameter(0), m.Int32Constant(index))); 1133 m.Return(m.Load(memacc.type, m.Parameter(0), m.Int32Constant(index)));
1098 Stream s = m.Build(); 1134 Stream s = m.Build();
1099 ASSERT_EQ(1U, s.size()); 1135 ASSERT_EQ(1U, s.size());
1100 EXPECT_EQ(memacc.load_opcode, s[0]->arch_opcode()); 1136 EXPECT_EQ(memacc.load_opcode, s[0]->arch_opcode());
1101 EXPECT_EQ(kMode_MRI, s[0]->addressing_mode()); 1137 EXPECT_EQ(kMode_MRI, s[0]->addressing_mode());
1102 ASSERT_EQ(2U, s[0]->InputCount()); 1138 ASSERT_EQ(2U, s[0]->InputCount());
1103 ASSERT_EQ(InstructionOperand::IMMEDIATE, s[0]->InputAt(1)->kind()); 1139 ASSERT_EQ(InstructionOperand::IMMEDIATE, s[0]->InputAt(1)->kind());
1104 EXPECT_EQ(index, s.ToInt32(s[0]->InputAt(1))); 1140 EXPECT_EQ(index, s.ToInt32(s[0]->InputAt(1)));
1105 ASSERT_EQ(1U, s[0]->OutputCount()); 1141 ASSERT_EQ(1U, s[0]->OutputCount());
1106 EXPECT_TRUE((s.*memacc.val_predicate)(s[0]->Output())); 1142 EXPECT_TRUE((s.*memacc.val_predicate)(s[0]->Output()));
1107 } 1143 }
1108 } 1144 }
1109 1145
1110 1146
1111 // ---------------------------------------------------------------------------- 1147 // ----------------------------------------------------------------------------
1112 // Store immediate. 1148 // Store immediate.
1113 // ---------------------------------------------------------------------------- 1149 // ----------------------------------------------------------------------------
1114 1150
1115 1151
1116 TEST_P(InstructionSelectorMemoryAccessImmTest, StoreWithImmediateIndex) { 1152 TEST_P(InstructionSelectorMemoryAccessImmTest, StoreWithImmediateIndex) {
1117 const MemoryAccessImm memacc = GetParam(); 1153 const MemoryAccessImm memacc = GetParam();
1118 TRACED_FOREACH(int32_t, index, memacc.immediates) { 1154 TRACED_FOREACH(int32_t, index, memacc.immediates) {
1119 StreamBuilder m(this, kMachInt32, kMachPtr, memacc.type); 1155 StreamBuilder m(this, MachineType::Int32(), MachineType::Pointer(),
1156 memacc.type);
1120 m.Store(memacc.type, m.Parameter(0), m.Int32Constant(index), m.Parameter(1), 1157 m.Store(memacc.type, m.Parameter(0), m.Int32Constant(index), m.Parameter(1),
1121 kNoWriteBarrier); 1158 kNoWriteBarrier);
1122 m.Return(m.Int32Constant(0)); 1159 m.Return(m.Int32Constant(0));
1123 Stream s = m.Build(); 1160 Stream s = m.Build();
1124 ASSERT_EQ(1U, s.size()); 1161 ASSERT_EQ(1U, s.size());
1125 EXPECT_EQ(memacc.store_opcode, s[0]->arch_opcode()); 1162 EXPECT_EQ(memacc.store_opcode, s[0]->arch_opcode());
1126 EXPECT_EQ(kMode_MRI, s[0]->addressing_mode()); 1163 EXPECT_EQ(kMode_MRI, s[0]->addressing_mode());
1127 ASSERT_EQ(3U, s[0]->InputCount()); 1164 ASSERT_EQ(3U, s[0]->InputCount());
1128 ASSERT_EQ(InstructionOperand::IMMEDIATE, s[0]->InputAt(1)->kind()); 1165 ASSERT_EQ(InstructionOperand::IMMEDIATE, s[0]->InputAt(1)->kind());
1129 EXPECT_EQ(index, s.ToInt32(s[0]->InputAt(1))); 1166 EXPECT_EQ(index, s.ToInt32(s[0]->InputAt(1)));
(...skipping 11 matching lines...) Expand all
1141 // ---------------------------------------------------------------------------- 1178 // ----------------------------------------------------------------------------
1142 1179
1143 1180
1144 typedef InstructionSelectorTestWithParam<MemoryAccessImm1> 1181 typedef InstructionSelectorTestWithParam<MemoryAccessImm1>
1145 InstructionSelectorMemoryAccessImmMoreThan16bitTest; 1182 InstructionSelectorMemoryAccessImmMoreThan16bitTest;
1146 1183
1147 TEST_P(InstructionSelectorMemoryAccessImmMoreThan16bitTest, 1184 TEST_P(InstructionSelectorMemoryAccessImmMoreThan16bitTest,
1148 LoadWithImmediateIndex) { 1185 LoadWithImmediateIndex) {
1149 const MemoryAccessImm1 memacc = GetParam(); 1186 const MemoryAccessImm1 memacc = GetParam();
1150 TRACED_FOREACH(int32_t, index, memacc.immediates) { 1187 TRACED_FOREACH(int32_t, index, memacc.immediates) {
1151 StreamBuilder m(this, memacc.type, kMachPtr); 1188 StreamBuilder m(this, memacc.type, MachineType::Pointer());
1152 m.Return(m.Load(memacc.type, m.Parameter(0), m.Int32Constant(index))); 1189 m.Return(m.Load(memacc.type, m.Parameter(0), m.Int32Constant(index)));
1153 Stream s = m.Build(); 1190 Stream s = m.Build();
1154 ASSERT_EQ(2U, s.size()); 1191 ASSERT_EQ(2U, s.size());
1155 // kMips64Dadd is expected opcode 1192 // kMips64Dadd is expected opcode
1156 // size more than 16 bits wide 1193 // size more than 16 bits wide
1157 EXPECT_EQ(kMips64Dadd, s[0]->arch_opcode()); 1194 EXPECT_EQ(kMips64Dadd, s[0]->arch_opcode());
1158 EXPECT_EQ(kMode_None, s[0]->addressing_mode()); 1195 EXPECT_EQ(kMode_None, s[0]->addressing_mode());
1159 EXPECT_EQ(2U, s[0]->InputCount()); 1196 EXPECT_EQ(2U, s[0]->InputCount());
1160 EXPECT_EQ(1U, s[0]->OutputCount()); 1197 EXPECT_EQ(1U, s[0]->OutputCount());
1161 } 1198 }
1162 } 1199 }
1163 1200
1164 TEST_P(InstructionSelectorMemoryAccessImmMoreThan16bitTest, 1201 TEST_P(InstructionSelectorMemoryAccessImmMoreThan16bitTest,
1165 StoreWithImmediateIndex) { 1202 StoreWithImmediateIndex) {
1166 const MemoryAccessImm1 memacc = GetParam(); 1203 const MemoryAccessImm1 memacc = GetParam();
1167 TRACED_FOREACH(int32_t, index, memacc.immediates) { 1204 TRACED_FOREACH(int32_t, index, memacc.immediates) {
1168 StreamBuilder m(this, kMachInt32, kMachPtr, memacc.type); 1205 StreamBuilder m(this, MachineType::Int32(), MachineType::Pointer(),
1206 memacc.type);
1169 m.Store(memacc.type, m.Parameter(0), m.Int32Constant(index), m.Parameter(1), 1207 m.Store(memacc.type, m.Parameter(0), m.Int32Constant(index), m.Parameter(1),
1170 kNoWriteBarrier); 1208 kNoWriteBarrier);
1171 m.Return(m.Int32Constant(0)); 1209 m.Return(m.Int32Constant(0));
1172 Stream s = m.Build(); 1210 Stream s = m.Build();
1173 ASSERT_EQ(2U, s.size()); 1211 ASSERT_EQ(2U, s.size());
1174 // kMips64Add is expected opcode 1212 // kMips64Add is expected opcode
1175 // size more than 16 bits wide 1213 // size more than 16 bits wide
1176 EXPECT_EQ(kMips64Dadd, s[0]->arch_opcode()); 1214 EXPECT_EQ(kMips64Dadd, s[0]->arch_opcode());
1177 EXPECT_EQ(kMode_None, s[0]->addressing_mode()); 1215 EXPECT_EQ(kMode_None, s[0]->addressing_mode());
1178 EXPECT_EQ(2U, s[0]->InputCount()); 1216 EXPECT_EQ(2U, s[0]->InputCount());
1179 EXPECT_EQ(1U, s[0]->OutputCount()); 1217 EXPECT_EQ(1U, s[0]->OutputCount());
1180 } 1218 }
1181 } 1219 }
1182 1220
1183 INSTANTIATE_TEST_CASE_P(InstructionSelectorTest, 1221 INSTANTIATE_TEST_CASE_P(InstructionSelectorTest,
1184 InstructionSelectorMemoryAccessImmMoreThan16bitTest, 1222 InstructionSelectorMemoryAccessImmMoreThan16bitTest,
1185 ::testing::ValuesIn(kMemoryAccessImmMoreThan16bit)); 1223 ::testing::ValuesIn(kMemoryAccessImmMoreThan16bit));
1186 1224
1187 1225
1188 // ---------------------------------------------------------------------------- 1226 // ----------------------------------------------------------------------------
1189 // kMips64Cmp with zero testing. 1227 // kMips64Cmp with zero testing.
1190 // ---------------------------------------------------------------------------- 1228 // ----------------------------------------------------------------------------
1191 1229
1192 1230
1193 TEST_F(InstructionSelectorTest, Word32EqualWithZero) { 1231 TEST_F(InstructionSelectorTest, Word32EqualWithZero) {
1194 { 1232 {
1195 StreamBuilder m(this, kMachInt32, kMachInt32); 1233 StreamBuilder m(this, MachineType::Int32(), MachineType::Int32());
1196 m.Return(m.Word32Equal(m.Parameter(0), m.Int32Constant(0))); 1234 m.Return(m.Word32Equal(m.Parameter(0), m.Int32Constant(0)));
1197 Stream s = m.Build(); 1235 Stream s = m.Build();
1198 ASSERT_EQ(1U, s.size()); 1236 ASSERT_EQ(1U, s.size());
1199 EXPECT_EQ(kMips64Cmp, s[0]->arch_opcode()); 1237 EXPECT_EQ(kMips64Cmp, s[0]->arch_opcode());
1200 EXPECT_EQ(kMode_None, s[0]->addressing_mode()); 1238 EXPECT_EQ(kMode_None, s[0]->addressing_mode());
1201 ASSERT_EQ(2U, s[0]->InputCount()); 1239 ASSERT_EQ(2U, s[0]->InputCount());
1202 EXPECT_EQ(1U, s[0]->OutputCount()); 1240 EXPECT_EQ(1U, s[0]->OutputCount());
1203 EXPECT_EQ(kFlags_set, s[0]->flags_mode()); 1241 EXPECT_EQ(kFlags_set, s[0]->flags_mode());
1204 EXPECT_EQ(kEqual, s[0]->flags_condition()); 1242 EXPECT_EQ(kEqual, s[0]->flags_condition());
1205 } 1243 }
1206 { 1244 {
1207 StreamBuilder m(this, kMachInt32, kMachInt32); 1245 StreamBuilder m(this, MachineType::Int32(), MachineType::Int32());
1208 m.Return(m.Word32Equal(m.Int32Constant(0), m.Parameter(0))); 1246 m.Return(m.Word32Equal(m.Int32Constant(0), m.Parameter(0)));
1209 Stream s = m.Build(); 1247 Stream s = m.Build();
1210 ASSERT_EQ(1U, s.size()); 1248 ASSERT_EQ(1U, s.size());
1211 EXPECT_EQ(kMips64Cmp, s[0]->arch_opcode()); 1249 EXPECT_EQ(kMips64Cmp, s[0]->arch_opcode());
1212 EXPECT_EQ(kMode_None, s[0]->addressing_mode()); 1250 EXPECT_EQ(kMode_None, s[0]->addressing_mode());
1213 ASSERT_EQ(2U, s[0]->InputCount()); 1251 ASSERT_EQ(2U, s[0]->InputCount());
1214 EXPECT_EQ(1U, s[0]->OutputCount()); 1252 EXPECT_EQ(1U, s[0]->OutputCount());
1215 EXPECT_EQ(kFlags_set, s[0]->flags_mode()); 1253 EXPECT_EQ(kFlags_set, s[0]->flags_mode());
1216 EXPECT_EQ(kEqual, s[0]->flags_condition()); 1254 EXPECT_EQ(kEqual, s[0]->flags_condition());
1217 } 1255 }
1218 } 1256 }
1219 1257
1220 1258
1221 TEST_F(InstructionSelectorTest, Word64EqualWithZero) { 1259 TEST_F(InstructionSelectorTest, Word64EqualWithZero) {
1222 { 1260 {
1223 StreamBuilder m(this, kMachInt64, kMachInt64); 1261 StreamBuilder m(this, MachineType::Int64(), MachineType::Int64());
1224 m.Return(m.Word64Equal(m.Parameter(0), m.Int64Constant(0))); 1262 m.Return(m.Word64Equal(m.Parameter(0), m.Int64Constant(0)));
1225 Stream s = m.Build(); 1263 Stream s = m.Build();
1226 ASSERT_EQ(1U, s.size()); 1264 ASSERT_EQ(1U, s.size());
1227 EXPECT_EQ(kMips64Cmp, s[0]->arch_opcode()); 1265 EXPECT_EQ(kMips64Cmp, s[0]->arch_opcode());
1228 EXPECT_EQ(kMode_None, s[0]->addressing_mode()); 1266 EXPECT_EQ(kMode_None, s[0]->addressing_mode());
1229 ASSERT_EQ(2U, s[0]->InputCount()); 1267 ASSERT_EQ(2U, s[0]->InputCount());
1230 EXPECT_EQ(1U, s[0]->OutputCount()); 1268 EXPECT_EQ(1U, s[0]->OutputCount());
1231 EXPECT_EQ(kFlags_set, s[0]->flags_mode()); 1269 EXPECT_EQ(kFlags_set, s[0]->flags_mode());
1232 EXPECT_EQ(kEqual, s[0]->flags_condition()); 1270 EXPECT_EQ(kEqual, s[0]->flags_condition());
1233 } 1271 }
1234 { 1272 {
1235 StreamBuilder m(this, kMachInt64, kMachInt64); 1273 StreamBuilder m(this, MachineType::Int64(), MachineType::Int64());
1236 m.Return(m.Word64Equal(m.Int32Constant(0), m.Parameter(0))); 1274 m.Return(m.Word64Equal(m.Int32Constant(0), m.Parameter(0)));
1237 Stream s = m.Build(); 1275 Stream s = m.Build();
1238 ASSERT_EQ(1U, s.size()); 1276 ASSERT_EQ(1U, s.size());
1239 EXPECT_EQ(kMips64Cmp, s[0]->arch_opcode()); 1277 EXPECT_EQ(kMips64Cmp, s[0]->arch_opcode());
1240 EXPECT_EQ(kMode_None, s[0]->addressing_mode()); 1278 EXPECT_EQ(kMode_None, s[0]->addressing_mode());
1241 ASSERT_EQ(2U, s[0]->InputCount()); 1279 ASSERT_EQ(2U, s[0]->InputCount());
1242 EXPECT_EQ(1U, s[0]->OutputCount()); 1280 EXPECT_EQ(1U, s[0]->OutputCount());
1243 EXPECT_EQ(kFlags_set, s[0]->flags_mode()); 1281 EXPECT_EQ(kFlags_set, s[0]->flags_mode());
1244 EXPECT_EQ(kEqual, s[0]->flags_condition()); 1282 EXPECT_EQ(kEqual, s[0]->flags_condition());
1245 } 1283 }
1246 } 1284 }
1247 1285
1248 1286
1249 TEST_F(InstructionSelectorTest, Word32Clz) { 1287 TEST_F(InstructionSelectorTest, Word32Clz) {
1250 StreamBuilder m(this, kMachUint32, kMachUint32); 1288 StreamBuilder m(this, MachineType::Uint32(), MachineType::Uint32());
1251 Node* const p0 = m.Parameter(0); 1289 Node* const p0 = m.Parameter(0);
1252 Node* const n = m.Word32Clz(p0); 1290 Node* const n = m.Word32Clz(p0);
1253 m.Return(n); 1291 m.Return(n);
1254 Stream s = m.Build(); 1292 Stream s = m.Build();
1255 ASSERT_EQ(1U, s.size()); 1293 ASSERT_EQ(1U, s.size());
1256 EXPECT_EQ(kMips64Clz, s[0]->arch_opcode()); 1294 EXPECT_EQ(kMips64Clz, s[0]->arch_opcode());
1257 ASSERT_EQ(1U, s[0]->InputCount()); 1295 ASSERT_EQ(1U, s[0]->InputCount());
1258 EXPECT_EQ(s.ToVreg(p0), s.ToVreg(s[0]->InputAt(0))); 1296 EXPECT_EQ(s.ToVreg(p0), s.ToVreg(s[0]->InputAt(0)));
1259 ASSERT_EQ(1U, s[0]->OutputCount()); 1297 ASSERT_EQ(1U, s[0]->OutputCount());
1260 EXPECT_EQ(s.ToVreg(n), s.ToVreg(s[0]->Output())); 1298 EXPECT_EQ(s.ToVreg(n), s.ToVreg(s[0]->Output()));
1261 } 1299 }
1262 1300
1263 1301
1264 TEST_F(InstructionSelectorTest, Word64Clz) { 1302 TEST_F(InstructionSelectorTest, Word64Clz) {
1265 StreamBuilder m(this, kMachUint64, kMachUint64); 1303 StreamBuilder m(this, MachineType::Uint64(), MachineType::Uint64());
1266 Node* const p0 = m.Parameter(0); 1304 Node* const p0 = m.Parameter(0);
1267 Node* const n = m.Word64Clz(p0); 1305 Node* const n = m.Word64Clz(p0);
1268 m.Return(n); 1306 m.Return(n);
1269 Stream s = m.Build(); 1307 Stream s = m.Build();
1270 ASSERT_EQ(1U, s.size()); 1308 ASSERT_EQ(1U, s.size());
1271 EXPECT_EQ(kMips64Dclz, s[0]->arch_opcode()); 1309 EXPECT_EQ(kMips64Dclz, s[0]->arch_opcode());
1272 ASSERT_EQ(1U, s[0]->InputCount()); 1310 ASSERT_EQ(1U, s[0]->InputCount());
1273 EXPECT_EQ(s.ToVreg(p0), s.ToVreg(s[0]->InputAt(0))); 1311 EXPECT_EQ(s.ToVreg(p0), s.ToVreg(s[0]->InputAt(0)));
1274 ASSERT_EQ(1U, s[0]->OutputCount()); 1312 ASSERT_EQ(1U, s[0]->OutputCount());
1275 EXPECT_EQ(s.ToVreg(n), s.ToVreg(s[0]->Output())); 1313 EXPECT_EQ(s.ToVreg(n), s.ToVreg(s[0]->Output()));
1276 } 1314 }
1277 1315
1278 1316
1279 TEST_F(InstructionSelectorTest, Float32Abs) { 1317 TEST_F(InstructionSelectorTest, Float32Abs) {
1280 StreamBuilder m(this, kMachFloat32, kMachFloat32); 1318 StreamBuilder m(this, MachineType::Float32(), MachineType::Float32());
1281 Node* const p0 = m.Parameter(0); 1319 Node* const p0 = m.Parameter(0);
1282 Node* const n = m.Float32Abs(p0); 1320 Node* const n = m.Float32Abs(p0);
1283 m.Return(n); 1321 m.Return(n);
1284 Stream s = m.Build(); 1322 Stream s = m.Build();
1285 ASSERT_EQ(1U, s.size()); 1323 ASSERT_EQ(1U, s.size());
1286 EXPECT_EQ(kMips64AbsS, s[0]->arch_opcode()); 1324 EXPECT_EQ(kMips64AbsS, s[0]->arch_opcode());
1287 ASSERT_EQ(1U, s[0]->InputCount()); 1325 ASSERT_EQ(1U, s[0]->InputCount());
1288 EXPECT_EQ(s.ToVreg(p0), s.ToVreg(s[0]->InputAt(0))); 1326 EXPECT_EQ(s.ToVreg(p0), s.ToVreg(s[0]->InputAt(0)));
1289 ASSERT_EQ(1U, s[0]->OutputCount()); 1327 ASSERT_EQ(1U, s[0]->OutputCount());
1290 EXPECT_EQ(s.ToVreg(n), s.ToVreg(s[0]->Output())); 1328 EXPECT_EQ(s.ToVreg(n), s.ToVreg(s[0]->Output()));
1291 } 1329 }
1292 1330
1293 1331
1294 TEST_F(InstructionSelectorTest, Float64Abs) { 1332 TEST_F(InstructionSelectorTest, Float64Abs) {
1295 StreamBuilder m(this, kMachFloat64, kMachFloat64); 1333 StreamBuilder m(this, MachineType::Float64(), MachineType::Float64());
1296 Node* const p0 = m.Parameter(0); 1334 Node* const p0 = m.Parameter(0);
1297 Node* const n = m.Float64Abs(p0); 1335 Node* const n = m.Float64Abs(p0);
1298 m.Return(n); 1336 m.Return(n);
1299 Stream s = m.Build(); 1337 Stream s = m.Build();
1300 ASSERT_EQ(1U, s.size()); 1338 ASSERT_EQ(1U, s.size());
1301 EXPECT_EQ(kMips64AbsD, s[0]->arch_opcode()); 1339 EXPECT_EQ(kMips64AbsD, s[0]->arch_opcode());
1302 ASSERT_EQ(1U, s[0]->InputCount()); 1340 ASSERT_EQ(1U, s[0]->InputCount());
1303 EXPECT_EQ(s.ToVreg(p0), s.ToVreg(s[0]->InputAt(0))); 1341 EXPECT_EQ(s.ToVreg(p0), s.ToVreg(s[0]->InputAt(0)));
1304 ASSERT_EQ(1U, s[0]->OutputCount()); 1342 ASSERT_EQ(1U, s[0]->OutputCount());
1305 EXPECT_EQ(s.ToVreg(n), s.ToVreg(s[0]->Output())); 1343 EXPECT_EQ(s.ToVreg(n), s.ToVreg(s[0]->Output()));
1306 } 1344 }
1307 1345
1308 1346
1309 TEST_F(InstructionSelectorTest, Float32Max) { 1347 TEST_F(InstructionSelectorTest, Float32Max) {
1310 StreamBuilder m(this, kMachFloat32, kMachFloat32, kMachFloat32); 1348 StreamBuilder m(this, MachineType::Float32(), MachineType::Float32(),
1349 MachineType::Float32());
1311 Node* const p0 = m.Parameter(0); 1350 Node* const p0 = m.Parameter(0);
1312 Node* const p1 = m.Parameter(1); 1351 Node* const p1 = m.Parameter(1);
1313 Node* const n = m.Float32Max(p0, p1); 1352 Node* const n = m.Float32Max(p0, p1);
1314 m.Return(n); 1353 m.Return(n);
1315 Stream s = m.Build(); 1354 Stream s = m.Build();
1316 // Float32Max is `(b < a) ? a : b`. 1355 // Float32Max is `(b < a) ? a : b`.
1317 ASSERT_EQ(1U, s.size()); 1356 ASSERT_EQ(1U, s.size());
1318 EXPECT_EQ(kMips64Float32Max, s[0]->arch_opcode()); 1357 EXPECT_EQ(kMips64Float32Max, s[0]->arch_opcode());
1319 ASSERT_EQ(2U, s[0]->InputCount()); 1358 ASSERT_EQ(2U, s[0]->InputCount());
1320 ASSERT_EQ(1U, s[0]->OutputCount()); 1359 ASSERT_EQ(1U, s[0]->OutputCount());
1321 EXPECT_EQ(s.ToVreg(n), s.ToVreg(s[0]->Output())); 1360 EXPECT_EQ(s.ToVreg(n), s.ToVreg(s[0]->Output()));
1322 } 1361 }
1323 1362
1324 1363
1325 TEST_F(InstructionSelectorTest, Float32Min) { 1364 TEST_F(InstructionSelectorTest, Float32Min) {
1326 StreamBuilder m(this, kMachFloat32, kMachFloat32, kMachFloat32); 1365 StreamBuilder m(this, MachineType::Float32(), MachineType::Float32(),
1366 MachineType::Float32());
1327 Node* const p0 = m.Parameter(0); 1367 Node* const p0 = m.Parameter(0);
1328 Node* const p1 = m.Parameter(1); 1368 Node* const p1 = m.Parameter(1);
1329 Node* const n = m.Float32Min(p0, p1); 1369 Node* const n = m.Float32Min(p0, p1);
1330 m.Return(n); 1370 m.Return(n);
1331 Stream s = m.Build(); 1371 Stream s = m.Build();
1332 // Float32Min is `(a < b) ? a : b`. 1372 // Float32Min is `(a < b) ? a : b`.
1333 ASSERT_EQ(1U, s.size()); 1373 ASSERT_EQ(1U, s.size());
1334 EXPECT_EQ(kMips64Float32Min, s[0]->arch_opcode()); 1374 EXPECT_EQ(kMips64Float32Min, s[0]->arch_opcode());
1335 ASSERT_EQ(2U, s[0]->InputCount()); 1375 ASSERT_EQ(2U, s[0]->InputCount());
1336 ASSERT_EQ(1U, s[0]->OutputCount()); 1376 ASSERT_EQ(1U, s[0]->OutputCount());
1337 EXPECT_EQ(s.ToVreg(n), s.ToVreg(s[0]->Output())); 1377 EXPECT_EQ(s.ToVreg(n), s.ToVreg(s[0]->Output()));
1338 } 1378 }
1339 1379
1340 1380
1341 TEST_F(InstructionSelectorTest, Float64Max) { 1381 TEST_F(InstructionSelectorTest, Float64Max) {
1342 StreamBuilder m(this, kMachFloat64, kMachFloat64, kMachFloat64); 1382 StreamBuilder m(this, MachineType::Float64(), MachineType::Float64(),
1383 MachineType::Float64());
1343 Node* const p0 = m.Parameter(0); 1384 Node* const p0 = m.Parameter(0);
1344 Node* const p1 = m.Parameter(1); 1385 Node* const p1 = m.Parameter(1);
1345 Node* const n = m.Float64Max(p0, p1); 1386 Node* const n = m.Float64Max(p0, p1);
1346 m.Return(n); 1387 m.Return(n);
1347 Stream s = m.Build(); 1388 Stream s = m.Build();
1348 // Float64Max is `(b < a) ? a : b`. 1389 // Float64Max is `(b < a) ? a : b`.
1349 ASSERT_EQ(1U, s.size()); 1390 ASSERT_EQ(1U, s.size());
1350 EXPECT_EQ(kMips64Float64Max, s[0]->arch_opcode()); 1391 EXPECT_EQ(kMips64Float64Max, s[0]->arch_opcode());
1351 ASSERT_EQ(2U, s[0]->InputCount()); 1392 ASSERT_EQ(2U, s[0]->InputCount());
1352 ASSERT_EQ(1U, s[0]->OutputCount()); 1393 ASSERT_EQ(1U, s[0]->OutputCount());
1353 EXPECT_EQ(s.ToVreg(n), s.ToVreg(s[0]->Output())); 1394 EXPECT_EQ(s.ToVreg(n), s.ToVreg(s[0]->Output()));
1354 } 1395 }
1355 1396
1356 1397
1357 TEST_F(InstructionSelectorTest, Float64Min) { 1398 TEST_F(InstructionSelectorTest, Float64Min) {
1358 StreamBuilder m(this, kMachFloat64, kMachFloat64, kMachFloat64); 1399 StreamBuilder m(this, MachineType::Float64(), MachineType::Float64(),
1400 MachineType::Float64());
1359 Node* const p0 = m.Parameter(0); 1401 Node* const p0 = m.Parameter(0);
1360 Node* const p1 = m.Parameter(1); 1402 Node* const p1 = m.Parameter(1);
1361 Node* const n = m.Float64Min(p0, p1); 1403 Node* const n = m.Float64Min(p0, p1);
1362 m.Return(n); 1404 m.Return(n);
1363 Stream s = m.Build(); 1405 Stream s = m.Build();
1364 // Float64Min is `(a < b) ? a : b`. 1406 // Float64Min is `(a < b) ? a : b`.
1365 ASSERT_EQ(1U, s.size()); 1407 ASSERT_EQ(1U, s.size());
1366 EXPECT_EQ(kMips64Float64Min, s[0]->arch_opcode()); 1408 EXPECT_EQ(kMips64Float64Min, s[0]->arch_opcode());
1367 ASSERT_EQ(2U, s[0]->InputCount()); 1409 ASSERT_EQ(2U, s[0]->InputCount());
1368 ASSERT_EQ(1U, s[0]->OutputCount()); 1410 ASSERT_EQ(1U, s[0]->OutputCount());
1369 EXPECT_EQ(s.ToVreg(n), s.ToVreg(s[0]->Output())); 1411 EXPECT_EQ(s.ToVreg(n), s.ToVreg(s[0]->Output()));
1370 } 1412 }
1371 1413
1372 } // namespace compiler 1414 } // namespace compiler
1373 } // namespace internal 1415 } // namespace internal
1374 } // namespace v8 1416 } // namespace v8
OLDNEW
« no previous file with comments | « test/unittests/compiler/mips/instruction-selector-mips-unittest.cc ('k') | test/unittests/compiler/move-optimizer-unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698