OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 "src/mips64/codegen-mips64.h" | 5 #include "src/mips64/codegen-mips64.h" |
6 | 6 |
7 #if V8_TARGET_ARCH_MIPS64 | 7 #if V8_TARGET_ARCH_MIPS64 |
8 | 8 |
9 #include "src/codegen.h" | 9 #include "src/codegen.h" |
10 #include "src/macro-assembler.h" | 10 #include "src/macro-assembler.h" |
(...skipping 27 matching lines...) Expand all Loading... |
38 | 38 |
39 { | 39 { |
40 DoubleRegister input = f12; | 40 DoubleRegister input = f12; |
41 DoubleRegister result = f0; | 41 DoubleRegister result = f0; |
42 DoubleRegister double_scratch1 = f4; | 42 DoubleRegister double_scratch1 = f4; |
43 DoubleRegister double_scratch2 = f6; | 43 DoubleRegister double_scratch2 = f6; |
44 Register temp1 = a4; | 44 Register temp1 = a4; |
45 Register temp2 = a5; | 45 Register temp2 = a5; |
46 Register temp3 = a6; | 46 Register temp3 = a6; |
47 | 47 |
48 if (!IsMipsSoftFloatABI) { | 48 __ MovFromFloatParameter(input); |
49 // Input value is in f12 anyway, nothing to do. | |
50 } else { | |
51 __ Move(input, a0, a1); | |
52 } | |
53 __ Push(temp3, temp2, temp1); | 49 __ Push(temp3, temp2, temp1); |
54 MathExpGenerator::EmitMathExp( | 50 MathExpGenerator::EmitMathExp( |
55 &masm, input, result, double_scratch1, double_scratch2, | 51 &masm, input, result, double_scratch1, double_scratch2, |
56 temp1, temp2, temp3); | 52 temp1, temp2, temp3); |
57 __ Pop(temp3, temp2, temp1); | 53 __ Pop(temp3, temp2, temp1); |
58 if (!IsMipsSoftFloatABI) { | 54 __ MovToFloatResult(result); |
59 // Result is already in f0, nothing to do. | |
60 } else { | |
61 __ Move(v0, v1, result); | |
62 } | |
63 __ Ret(); | 55 __ Ret(); |
64 } | 56 } |
65 | 57 |
66 CodeDesc desc; | 58 CodeDesc desc; |
67 masm.GetCode(&desc); | 59 masm.GetCode(&desc); |
68 DCHECK(!RelocInfo::RequiresRelocation(desc)); | 60 DCHECK(!RelocInfo::RequiresRelocation(desc)); |
69 | 61 |
70 CpuFeatures::FlushICache(buffer, actual_size); | 62 CpuFeatures::FlushICache(buffer, actual_size); |
71 base::OS::ProtectCode(buffer, actual_size); | 63 base::OS::ProtectCode(buffer, actual_size); |
72 | 64 |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
134 // we can start copying at aligned. | 126 // we can start copying at aligned. |
135 __ xor_(t8, a1, a0); | 127 __ xor_(t8, a1, a0); |
136 __ andi(t8, t8, loadstore_chunk - 1); // t8 is a0/a1 word-displacement. | 128 __ andi(t8, t8, loadstore_chunk - 1); // t8 is a0/a1 word-displacement. |
137 __ bne(t8, zero_reg, &unaligned); | 129 __ bne(t8, zero_reg, &unaligned); |
138 __ subu(a3, zero_reg, a0); // In delay slot. | 130 __ subu(a3, zero_reg, a0); // In delay slot. |
139 | 131 |
140 __ andi(a3, a3, loadstore_chunk - 1); // Copy a3 bytes to align a0/a1. | 132 __ andi(a3, a3, loadstore_chunk - 1); // Copy a3 bytes to align a0/a1. |
141 __ beq(a3, zero_reg, &aligned); // Already aligned. | 133 __ beq(a3, zero_reg, &aligned); // Already aligned. |
142 __ subu(a2, a2, a3); // In delay slot. a2 is the remining bytes count. | 134 __ subu(a2, a2, a3); // In delay slot. a2 is the remining bytes count. |
143 | 135 |
144 __ lwr(t8, MemOperand(a1)); | 136 if (kArchEndian == kLittle) { |
145 __ addu(a1, a1, a3); | 137 __ lwr(t8, MemOperand(a1)); |
146 __ swr(t8, MemOperand(a0)); | 138 __ addu(a1, a1, a3); |
147 __ addu(a0, a0, a3); | 139 __ swr(t8, MemOperand(a0)); |
| 140 __ addu(a0, a0, a3); |
| 141 } else { |
| 142 __ lwl(t8, MemOperand(a1)); |
| 143 __ addu(a1, a1, a3); |
| 144 __ swl(t8, MemOperand(a0)); |
| 145 __ addu(a0, a0, a3); |
| 146 } |
148 | 147 |
149 // Now dst/src are both aligned to (word) aligned addresses. Set a2 to | 148 // Now dst/src are both aligned to (word) aligned addresses. Set a2 to |
150 // count how many bytes we have to copy after all the 64 byte chunks are | 149 // count how many bytes we have to copy after all the 64 byte chunks are |
151 // copied and a3 to the dst pointer after all the 64 byte chunks have been | 150 // copied and a3 to the dst pointer after all the 64 byte chunks have been |
152 // copied. We will loop, incrementing a0 and a1 until a0 equals a3. | 151 // copied. We will loop, incrementing a0 and a1 until a0 equals a3. |
153 __ bind(&aligned); | 152 __ bind(&aligned); |
154 __ andi(t8, a2, 0x3f); | 153 __ andi(t8, a2, 0x3f); |
155 __ beq(a2, t8, &chkw); // Less than 64? | 154 __ beq(a2, t8, &chkw); // Less than 64? |
156 __ subu(a3, a2, t8); // In delay slot. | 155 __ subu(a3, a2, t8); // In delay slot. |
157 __ addu(a3, a0, a3); // Now a3 is the final dst after loop. | 156 __ addu(a3, a0, a3); // Now a3 is the final dst after loop. |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
290 __ nop(); | 289 __ nop(); |
291 | 290 |
292 // Unaligned case. Only the dst gets aligned so we need to do partial | 291 // Unaligned case. Only the dst gets aligned so we need to do partial |
293 // loads of the source followed by normal stores to the dst (once we | 292 // loads of the source followed by normal stores to the dst (once we |
294 // have aligned the destination). | 293 // have aligned the destination). |
295 __ bind(&unaligned); | 294 __ bind(&unaligned); |
296 __ andi(a3, a3, loadstore_chunk - 1); // Copy a3 bytes to align a0/a1. | 295 __ andi(a3, a3, loadstore_chunk - 1); // Copy a3 bytes to align a0/a1. |
297 __ beq(a3, zero_reg, &ua_chk16w); | 296 __ beq(a3, zero_reg, &ua_chk16w); |
298 __ subu(a2, a2, a3); // In delay slot. | 297 __ subu(a2, a2, a3); // In delay slot. |
299 | 298 |
300 __ lwr(v1, MemOperand(a1)); | 299 if (kArchEndian == kLittle) { |
301 __ lwl(v1, | 300 __ lwr(v1, MemOperand(a1)); |
302 MemOperand(a1, 1, loadstore_chunk, MemOperand::offset_minus_one)); | 301 __ lwl(v1, |
303 __ addu(a1, a1, a3); | 302 MemOperand(a1, 1, loadstore_chunk, MemOperand::offset_minus_one)); |
304 __ swr(v1, MemOperand(a0)); | 303 __ addu(a1, a1, a3); |
305 __ addu(a0, a0, a3); | 304 __ swr(v1, MemOperand(a0)); |
| 305 __ addu(a0, a0, a3); |
| 306 } else { |
| 307 __ lwl(v1, MemOperand(a1)); |
| 308 __ lwr(v1, |
| 309 MemOperand(a1, 1, loadstore_chunk, MemOperand::offset_minus_one)); |
| 310 __ addu(a1, a1, a3); |
| 311 __ swl(v1, MemOperand(a0)); |
| 312 __ addu(a0, a0, a3); |
| 313 } |
306 | 314 |
307 // Now the dst (but not the source) is aligned. Set a2 to count how many | 315 // Now the dst (but not the source) is aligned. Set a2 to count how many |
308 // bytes we have to copy after all the 64 byte chunks are copied and a3 to | 316 // bytes we have to copy after all the 64 byte chunks are copied and a3 to |
309 // the dst pointer after all the 64 byte chunks have been copied. We will | 317 // the dst pointer after all the 64 byte chunks have been copied. We will |
310 // loop, incrementing a0 and a1 until a0 equals a3. | 318 // loop, incrementing a0 and a1 until a0 equals a3. |
311 __ bind(&ua_chk16w); | 319 __ bind(&ua_chk16w); |
312 __ andi(t8, a2, 0x3f); | 320 __ andi(t8, a2, 0x3f); |
313 __ beq(a2, t8, &ua_chkw); | 321 __ beq(a2, t8, &ua_chkw); |
314 __ subu(a3, a2, t8); // In delay slot. | 322 __ subu(a3, a2, t8); // In delay slot. |
315 __ addu(a3, a0, a3); | 323 __ addu(a3, a0, a3); |
316 | 324 |
317 if (pref_hint_store == kPrefHintPrepareForStore) { | 325 if (pref_hint_store == kPrefHintPrepareForStore) { |
318 __ addu(a4, a0, a2); | 326 __ addu(a4, a0, a2); |
319 __ Subu(t9, a4, pref_limit); | 327 __ Subu(t9, a4, pref_limit); |
320 } | 328 } |
321 | 329 |
322 __ Pref(pref_hint_load, MemOperand(a1, 0 * pref_chunk)); | 330 __ Pref(pref_hint_load, MemOperand(a1, 0 * pref_chunk)); |
323 __ Pref(pref_hint_load, MemOperand(a1, 1 * pref_chunk)); | 331 __ Pref(pref_hint_load, MemOperand(a1, 1 * pref_chunk)); |
324 __ Pref(pref_hint_load, MemOperand(a1, 2 * pref_chunk)); | 332 __ Pref(pref_hint_load, MemOperand(a1, 2 * pref_chunk)); |
325 | 333 |
326 if (pref_hint_store != kPrefHintPrepareForStore) { | 334 if (pref_hint_store != kPrefHintPrepareForStore) { |
327 __ Pref(pref_hint_store, MemOperand(a0, 1 * pref_chunk)); | 335 __ Pref(pref_hint_store, MemOperand(a0, 1 * pref_chunk)); |
328 __ Pref(pref_hint_store, MemOperand(a0, 2 * pref_chunk)); | 336 __ Pref(pref_hint_store, MemOperand(a0, 2 * pref_chunk)); |
329 __ Pref(pref_hint_store, MemOperand(a0, 3 * pref_chunk)); | 337 __ Pref(pref_hint_store, MemOperand(a0, 3 * pref_chunk)); |
330 } | 338 } |
331 | 339 |
332 __ bind(&ua_loop16w); | 340 __ bind(&ua_loop16w); |
333 __ Pref(pref_hint_load, MemOperand(a1, 3 * pref_chunk)); | 341 if (kArchEndian == kLittle) { |
334 __ lwr(a4, MemOperand(a1)); | 342 __ Pref(pref_hint_load, MemOperand(a1, 3 * pref_chunk)); |
335 __ lwr(a5, MemOperand(a1, 1, loadstore_chunk)); | 343 __ lwr(a4, MemOperand(a1)); |
336 __ lwr(a6, MemOperand(a1, 2, loadstore_chunk)); | 344 __ lwr(a5, MemOperand(a1, 1, loadstore_chunk)); |
| 345 __ lwr(a6, MemOperand(a1, 2, loadstore_chunk)); |
337 | 346 |
338 if (pref_hint_store == kPrefHintPrepareForStore) { | 347 if (pref_hint_store == kPrefHintPrepareForStore) { |
339 __ sltu(v1, t9, a0); | 348 __ sltu(v1, t9, a0); |
340 __ Branch(USE_DELAY_SLOT, &ua_skip_pref, gt, v1, Operand(zero_reg)); | 349 __ Branch(USE_DELAY_SLOT, &ua_skip_pref, gt, v1, Operand(zero_reg)); |
| 350 } |
| 351 __ lwr(a7, MemOperand(a1, 3, loadstore_chunk)); // Maybe in delay slot. |
| 352 |
| 353 __ Pref(pref_hint_store, MemOperand(a0, 4 * pref_chunk)); |
| 354 __ Pref(pref_hint_store, MemOperand(a0, 5 * pref_chunk)); |
| 355 |
| 356 __ bind(&ua_skip_pref); |
| 357 __ lwr(t0, MemOperand(a1, 4, loadstore_chunk)); |
| 358 __ lwr(t1, MemOperand(a1, 5, loadstore_chunk)); |
| 359 __ lwr(t2, MemOperand(a1, 6, loadstore_chunk)); |
| 360 __ lwr(t3, MemOperand(a1, 7, loadstore_chunk)); |
| 361 __ lwl(a4, |
| 362 MemOperand(a1, 1, loadstore_chunk, MemOperand::offset_minus_one)); |
| 363 __ lwl(a5, |
| 364 MemOperand(a1, 2, loadstore_chunk, MemOperand::offset_minus_one)); |
| 365 __ lwl(a6, |
| 366 MemOperand(a1, 3, loadstore_chunk, MemOperand::offset_minus_one)); |
| 367 __ lwl(a7, |
| 368 MemOperand(a1, 4, loadstore_chunk, MemOperand::offset_minus_one)); |
| 369 __ lwl(t0, |
| 370 MemOperand(a1, 5, loadstore_chunk, MemOperand::offset_minus_one)); |
| 371 __ lwl(t1, |
| 372 MemOperand(a1, 6, loadstore_chunk, MemOperand::offset_minus_one)); |
| 373 __ lwl(t2, |
| 374 MemOperand(a1, 7, loadstore_chunk, MemOperand::offset_minus_one)); |
| 375 __ lwl(t3, |
| 376 MemOperand(a1, 8, loadstore_chunk, MemOperand::offset_minus_one)); |
| 377 } else { |
| 378 __ Pref(pref_hint_load, MemOperand(a1, 3 * pref_chunk)); |
| 379 __ lwl(a4, MemOperand(a1)); |
| 380 __ lwl(a5, MemOperand(a1, 1, loadstore_chunk)); |
| 381 __ lwl(a6, MemOperand(a1, 2, loadstore_chunk)); |
| 382 |
| 383 if (pref_hint_store == kPrefHintPrepareForStore) { |
| 384 __ sltu(v1, t9, a0); |
| 385 __ Branch(USE_DELAY_SLOT, &ua_skip_pref, gt, v1, Operand(zero_reg)); |
| 386 } |
| 387 __ lwl(a7, MemOperand(a1, 3, loadstore_chunk)); // Maybe in delay slot. |
| 388 |
| 389 __ Pref(pref_hint_store, MemOperand(a0, 4 * pref_chunk)); |
| 390 __ Pref(pref_hint_store, MemOperand(a0, 5 * pref_chunk)); |
| 391 |
| 392 __ bind(&ua_skip_pref); |
| 393 __ lwl(t0, MemOperand(a1, 4, loadstore_chunk)); |
| 394 __ lwl(t1, MemOperand(a1, 5, loadstore_chunk)); |
| 395 __ lwl(t2, MemOperand(a1, 6, loadstore_chunk)); |
| 396 __ lwl(t3, MemOperand(a1, 7, loadstore_chunk)); |
| 397 __ lwr(a4, |
| 398 MemOperand(a1, 1, loadstore_chunk, MemOperand::offset_minus_one)); |
| 399 __ lwr(a5, |
| 400 MemOperand(a1, 2, loadstore_chunk, MemOperand::offset_minus_one)); |
| 401 __ lwr(a6, |
| 402 MemOperand(a1, 3, loadstore_chunk, MemOperand::offset_minus_one)); |
| 403 __ lwr(a7, |
| 404 MemOperand(a1, 4, loadstore_chunk, MemOperand::offset_minus_one)); |
| 405 __ lwr(t0, |
| 406 MemOperand(a1, 5, loadstore_chunk, MemOperand::offset_minus_one)); |
| 407 __ lwr(t1, |
| 408 MemOperand(a1, 6, loadstore_chunk, MemOperand::offset_minus_one)); |
| 409 __ lwr(t2, |
| 410 MemOperand(a1, 7, loadstore_chunk, MemOperand::offset_minus_one)); |
| 411 __ lwr(t3, |
| 412 MemOperand(a1, 8, loadstore_chunk, MemOperand::offset_minus_one)); |
341 } | 413 } |
342 __ lwr(a7, MemOperand(a1, 3, loadstore_chunk)); // Maybe in delay slot. | |
343 | |
344 __ Pref(pref_hint_store, MemOperand(a0, 4 * pref_chunk)); | |
345 __ Pref(pref_hint_store, MemOperand(a0, 5 * pref_chunk)); | |
346 | |
347 __ bind(&ua_skip_pref); | |
348 __ lwr(t0, MemOperand(a1, 4, loadstore_chunk)); | |
349 __ lwr(t1, MemOperand(a1, 5, loadstore_chunk)); | |
350 __ lwr(t2, MemOperand(a1, 6, loadstore_chunk)); | |
351 __ lwr(t3, MemOperand(a1, 7, loadstore_chunk)); | |
352 __ lwl(a4, | |
353 MemOperand(a1, 1, loadstore_chunk, MemOperand::offset_minus_one)); | |
354 __ lwl(a5, | |
355 MemOperand(a1, 2, loadstore_chunk, MemOperand::offset_minus_one)); | |
356 __ lwl(a6, | |
357 MemOperand(a1, 3, loadstore_chunk, MemOperand::offset_minus_one)); | |
358 __ lwl(a7, | |
359 MemOperand(a1, 4, loadstore_chunk, MemOperand::offset_minus_one)); | |
360 __ lwl(t0, | |
361 MemOperand(a1, 5, loadstore_chunk, MemOperand::offset_minus_one)); | |
362 __ lwl(t1, | |
363 MemOperand(a1, 6, loadstore_chunk, MemOperand::offset_minus_one)); | |
364 __ lwl(t2, | |
365 MemOperand(a1, 7, loadstore_chunk, MemOperand::offset_minus_one)); | |
366 __ lwl(t3, | |
367 MemOperand(a1, 8, loadstore_chunk, MemOperand::offset_minus_one)); | |
368 __ Pref(pref_hint_load, MemOperand(a1, 4 * pref_chunk)); | 414 __ Pref(pref_hint_load, MemOperand(a1, 4 * pref_chunk)); |
369 __ sw(a4, MemOperand(a0)); | 415 __ sw(a4, MemOperand(a0)); |
370 __ sw(a5, MemOperand(a0, 1, loadstore_chunk)); | 416 __ sw(a5, MemOperand(a0, 1, loadstore_chunk)); |
371 __ sw(a6, MemOperand(a0, 2, loadstore_chunk)); | 417 __ sw(a6, MemOperand(a0, 2, loadstore_chunk)); |
372 __ sw(a7, MemOperand(a0, 3, loadstore_chunk)); | 418 __ sw(a7, MemOperand(a0, 3, loadstore_chunk)); |
373 __ sw(t0, MemOperand(a0, 4, loadstore_chunk)); | 419 __ sw(t0, MemOperand(a0, 4, loadstore_chunk)); |
374 __ sw(t1, MemOperand(a0, 5, loadstore_chunk)); | 420 __ sw(t1, MemOperand(a0, 5, loadstore_chunk)); |
375 __ sw(t2, MemOperand(a0, 6, loadstore_chunk)); | 421 __ sw(t2, MemOperand(a0, 6, loadstore_chunk)); |
376 __ sw(t3, MemOperand(a0, 7, loadstore_chunk)); | 422 __ sw(t3, MemOperand(a0, 7, loadstore_chunk)); |
377 __ lwr(a4, MemOperand(a1, 8, loadstore_chunk)); | 423 if (kArchEndian == kLittle) { |
378 __ lwr(a5, MemOperand(a1, 9, loadstore_chunk)); | 424 __ lwr(a4, MemOperand(a1, 8, loadstore_chunk)); |
379 __ lwr(a6, MemOperand(a1, 10, loadstore_chunk)); | 425 __ lwr(a5, MemOperand(a1, 9, loadstore_chunk)); |
380 __ lwr(a7, MemOperand(a1, 11, loadstore_chunk)); | 426 __ lwr(a6, MemOperand(a1, 10, loadstore_chunk)); |
381 __ lwr(t0, MemOperand(a1, 12, loadstore_chunk)); | 427 __ lwr(a7, MemOperand(a1, 11, loadstore_chunk)); |
382 __ lwr(t1, MemOperand(a1, 13, loadstore_chunk)); | 428 __ lwr(t0, MemOperand(a1, 12, loadstore_chunk)); |
383 __ lwr(t2, MemOperand(a1, 14, loadstore_chunk)); | 429 __ lwr(t1, MemOperand(a1, 13, loadstore_chunk)); |
384 __ lwr(t3, MemOperand(a1, 15, loadstore_chunk)); | 430 __ lwr(t2, MemOperand(a1, 14, loadstore_chunk)); |
385 __ lwl(a4, | 431 __ lwr(t3, MemOperand(a1, 15, loadstore_chunk)); |
386 MemOperand(a1, 9, loadstore_chunk, MemOperand::offset_minus_one)); | 432 __ lwl(a4, |
387 __ lwl(a5, | 433 MemOperand(a1, 9, loadstore_chunk, MemOperand::offset_minus_one)); |
388 MemOperand(a1, 10, loadstore_chunk, MemOperand::offset_minus_one)); | 434 __ lwl(a5, |
389 __ lwl(a6, | 435 MemOperand(a1, 10, loadstore_chunk, MemOperand::offset_minus_one)); |
390 MemOperand(a1, 11, loadstore_chunk, MemOperand::offset_minus_one)); | 436 __ lwl(a6, |
391 __ lwl(a7, | 437 MemOperand(a1, 11, loadstore_chunk, MemOperand::offset_minus_one)); |
392 MemOperand(a1, 12, loadstore_chunk, MemOperand::offset_minus_one)); | 438 __ lwl(a7, |
393 __ lwl(t0, | 439 MemOperand(a1, 12, loadstore_chunk, MemOperand::offset_minus_one)); |
394 MemOperand(a1, 13, loadstore_chunk, MemOperand::offset_minus_one)); | 440 __ lwl(t0, |
395 __ lwl(t1, | 441 MemOperand(a1, 13, loadstore_chunk, MemOperand::offset_minus_one)); |
396 MemOperand(a1, 14, loadstore_chunk, MemOperand::offset_minus_one)); | 442 __ lwl(t1, |
397 __ lwl(t2, | 443 MemOperand(a1, 14, loadstore_chunk, MemOperand::offset_minus_one)); |
398 MemOperand(a1, 15, loadstore_chunk, MemOperand::offset_minus_one)); | 444 __ lwl(t2, |
399 __ lwl(t3, | 445 MemOperand(a1, 15, loadstore_chunk, MemOperand::offset_minus_one)); |
400 MemOperand(a1, 16, loadstore_chunk, MemOperand::offset_minus_one)); | 446 __ lwl(t3, |
| 447 MemOperand(a1, 16, loadstore_chunk, MemOperand::offset_minus_one)); |
| 448 } else { |
| 449 __ lwl(a4, MemOperand(a1, 8, loadstore_chunk)); |
| 450 __ lwl(a5, MemOperand(a1, 9, loadstore_chunk)); |
| 451 __ lwl(a6, MemOperand(a1, 10, loadstore_chunk)); |
| 452 __ lwl(a7, MemOperand(a1, 11, loadstore_chunk)); |
| 453 __ lwl(t0, MemOperand(a1, 12, loadstore_chunk)); |
| 454 __ lwl(t1, MemOperand(a1, 13, loadstore_chunk)); |
| 455 __ lwl(t2, MemOperand(a1, 14, loadstore_chunk)); |
| 456 __ lwl(t3, MemOperand(a1, 15, loadstore_chunk)); |
| 457 __ lwr(a4, |
| 458 MemOperand(a1, 9, loadstore_chunk, MemOperand::offset_minus_one)); |
| 459 __ lwr(a5, |
| 460 MemOperand(a1, 10, loadstore_chunk, MemOperand::offset_minus_one)); |
| 461 __ lwr(a6, |
| 462 MemOperand(a1, 11, loadstore_chunk, MemOperand::offset_minus_one)); |
| 463 __ lwr(a7, |
| 464 MemOperand(a1, 12, loadstore_chunk, MemOperand::offset_minus_one)); |
| 465 __ lwr(t0, |
| 466 MemOperand(a1, 13, loadstore_chunk, MemOperand::offset_minus_one)); |
| 467 __ lwr(t1, |
| 468 MemOperand(a1, 14, loadstore_chunk, MemOperand::offset_minus_one)); |
| 469 __ lwr(t2, |
| 470 MemOperand(a1, 15, loadstore_chunk, MemOperand::offset_minus_one)); |
| 471 __ lwr(t3, |
| 472 MemOperand(a1, 16, loadstore_chunk, MemOperand::offset_minus_one)); |
| 473 } |
401 __ Pref(pref_hint_load, MemOperand(a1, 5 * pref_chunk)); | 474 __ Pref(pref_hint_load, MemOperand(a1, 5 * pref_chunk)); |
402 __ sw(a4, MemOperand(a0, 8, loadstore_chunk)); | 475 __ sw(a4, MemOperand(a0, 8, loadstore_chunk)); |
403 __ sw(a5, MemOperand(a0, 9, loadstore_chunk)); | 476 __ sw(a5, MemOperand(a0, 9, loadstore_chunk)); |
404 __ sw(a6, MemOperand(a0, 10, loadstore_chunk)); | 477 __ sw(a6, MemOperand(a0, 10, loadstore_chunk)); |
405 __ sw(a7, MemOperand(a0, 11, loadstore_chunk)); | 478 __ sw(a7, MemOperand(a0, 11, loadstore_chunk)); |
406 __ sw(t0, MemOperand(a0, 12, loadstore_chunk)); | 479 __ sw(t0, MemOperand(a0, 12, loadstore_chunk)); |
407 __ sw(t1, MemOperand(a0, 13, loadstore_chunk)); | 480 __ sw(t1, MemOperand(a0, 13, loadstore_chunk)); |
408 __ sw(t2, MemOperand(a0, 14, loadstore_chunk)); | 481 __ sw(t2, MemOperand(a0, 14, loadstore_chunk)); |
409 __ sw(t3, MemOperand(a0, 15, loadstore_chunk)); | 482 __ sw(t3, MemOperand(a0, 15, loadstore_chunk)); |
410 __ addiu(a0, a0, 16 * loadstore_chunk); | 483 __ addiu(a0, a0, 16 * loadstore_chunk); |
411 __ bne(a0, a3, &ua_loop16w); | 484 __ bne(a0, a3, &ua_loop16w); |
412 __ addiu(a1, a1, 16 * loadstore_chunk); // In delay slot. | 485 __ addiu(a1, a1, 16 * loadstore_chunk); // In delay slot. |
413 __ mov(a2, t8); | 486 __ mov(a2, t8); |
414 | 487 |
415 // Here less than 64-bytes. Check for | 488 // Here less than 64-bytes. Check for |
416 // a 32 byte chunk and copy if there is one. Otherwise jump down to | 489 // a 32 byte chunk and copy if there is one. Otherwise jump down to |
417 // ua_chk1w to handle the tail end of the copy. | 490 // ua_chk1w to handle the tail end of the copy. |
418 __ bind(&ua_chkw); | 491 __ bind(&ua_chkw); |
419 __ Pref(pref_hint_load, MemOperand(a1)); | 492 __ Pref(pref_hint_load, MemOperand(a1)); |
420 __ andi(t8, a2, 0x1f); | 493 __ andi(t8, a2, 0x1f); |
421 | 494 |
422 __ beq(a2, t8, &ua_chk1w); | 495 __ beq(a2, t8, &ua_chk1w); |
423 __ nop(); // In delay slot. | 496 __ nop(); // In delay slot. |
424 __ lwr(a4, MemOperand(a1)); | 497 if (kArchEndian == kLittle) { |
425 __ lwr(a5, MemOperand(a1, 1, loadstore_chunk)); | 498 __ lwr(a4, MemOperand(a1)); |
426 __ lwr(a6, MemOperand(a1, 2, loadstore_chunk)); | 499 __ lwr(a5, MemOperand(a1, 1, loadstore_chunk)); |
427 __ lwr(a7, MemOperand(a1, 3, loadstore_chunk)); | 500 __ lwr(a6, MemOperand(a1, 2, loadstore_chunk)); |
428 __ lwr(t0, MemOperand(a1, 4, loadstore_chunk)); | 501 __ lwr(a7, MemOperand(a1, 3, loadstore_chunk)); |
429 __ lwr(t1, MemOperand(a1, 5, loadstore_chunk)); | 502 __ lwr(t0, MemOperand(a1, 4, loadstore_chunk)); |
430 __ lwr(t2, MemOperand(a1, 6, loadstore_chunk)); | 503 __ lwr(t1, MemOperand(a1, 5, loadstore_chunk)); |
431 __ lwr(t3, MemOperand(a1, 7, loadstore_chunk)); | 504 __ lwr(t2, MemOperand(a1, 6, loadstore_chunk)); |
432 __ lwl(a4, | 505 __ lwr(t3, MemOperand(a1, 7, loadstore_chunk)); |
433 MemOperand(a1, 1, loadstore_chunk, MemOperand::offset_minus_one)); | 506 __ lwl(a4, |
434 __ lwl(a5, | 507 MemOperand(a1, 1, loadstore_chunk, MemOperand::offset_minus_one)); |
435 MemOperand(a1, 2, loadstore_chunk, MemOperand::offset_minus_one)); | 508 __ lwl(a5, |
436 __ lwl(a6, | 509 MemOperand(a1, 2, loadstore_chunk, MemOperand::offset_minus_one)); |
437 MemOperand(a1, 3, loadstore_chunk, MemOperand::offset_minus_one)); | 510 __ lwl(a6, |
438 __ lwl(a7, | 511 MemOperand(a1, 3, loadstore_chunk, MemOperand::offset_minus_one)); |
439 MemOperand(a1, 4, loadstore_chunk, MemOperand::offset_minus_one)); | 512 __ lwl(a7, |
440 __ lwl(t0, | 513 MemOperand(a1, 4, loadstore_chunk, MemOperand::offset_minus_one)); |
441 MemOperand(a1, 5, loadstore_chunk, MemOperand::offset_minus_one)); | 514 __ lwl(t0, |
442 __ lwl(t1, | 515 MemOperand(a1, 5, loadstore_chunk, MemOperand::offset_minus_one)); |
443 MemOperand(a1, 6, loadstore_chunk, MemOperand::offset_minus_one)); | 516 __ lwl(t1, |
444 __ lwl(t2, | 517 MemOperand(a1, 6, loadstore_chunk, MemOperand::offset_minus_one)); |
445 MemOperand(a1, 7, loadstore_chunk, MemOperand::offset_minus_one)); | 518 __ lwl(t2, |
446 __ lwl(t3, | 519 MemOperand(a1, 7, loadstore_chunk, MemOperand::offset_minus_one)); |
447 MemOperand(a1, 8, loadstore_chunk, MemOperand::offset_minus_one)); | 520 __ lwl(t3, |
| 521 MemOperand(a1, 8, loadstore_chunk, MemOperand::offset_minus_one)); |
| 522 } else { |
| 523 __ lwl(a4, MemOperand(a1)); |
| 524 __ lwl(a5, MemOperand(a1, 1, loadstore_chunk)); |
| 525 __ lwl(a6, MemOperand(a1, 2, loadstore_chunk)); |
| 526 __ lwl(a7, MemOperand(a1, 3, loadstore_chunk)); |
| 527 __ lwl(t0, MemOperand(a1, 4, loadstore_chunk)); |
| 528 __ lwl(t1, MemOperand(a1, 5, loadstore_chunk)); |
| 529 __ lwl(t2, MemOperand(a1, 6, loadstore_chunk)); |
| 530 __ lwl(t3, MemOperand(a1, 7, loadstore_chunk)); |
| 531 __ lwr(a4, |
| 532 MemOperand(a1, 1, loadstore_chunk, MemOperand::offset_minus_one)); |
| 533 __ lwr(a5, |
| 534 MemOperand(a1, 2, loadstore_chunk, MemOperand::offset_minus_one)); |
| 535 __ lwr(a6, |
| 536 MemOperand(a1, 3, loadstore_chunk, MemOperand::offset_minus_one)); |
| 537 __ lwr(a7, |
| 538 MemOperand(a1, 4, loadstore_chunk, MemOperand::offset_minus_one)); |
| 539 __ lwr(t0, |
| 540 MemOperand(a1, 5, loadstore_chunk, MemOperand::offset_minus_one)); |
| 541 __ lwr(t1, |
| 542 MemOperand(a1, 6, loadstore_chunk, MemOperand::offset_minus_one)); |
| 543 __ lwr(t2, |
| 544 MemOperand(a1, 7, loadstore_chunk, MemOperand::offset_minus_one)); |
| 545 __ lwr(t3, |
| 546 MemOperand(a1, 8, loadstore_chunk, MemOperand::offset_minus_one)); |
| 547 } |
448 __ addiu(a1, a1, 8 * loadstore_chunk); | 548 __ addiu(a1, a1, 8 * loadstore_chunk); |
449 __ sw(a4, MemOperand(a0)); | 549 __ sw(a4, MemOperand(a0)); |
450 __ sw(a5, MemOperand(a0, 1, loadstore_chunk)); | 550 __ sw(a5, MemOperand(a0, 1, loadstore_chunk)); |
451 __ sw(a6, MemOperand(a0, 2, loadstore_chunk)); | 551 __ sw(a6, MemOperand(a0, 2, loadstore_chunk)); |
452 __ sw(a7, MemOperand(a0, 3, loadstore_chunk)); | 552 __ sw(a7, MemOperand(a0, 3, loadstore_chunk)); |
453 __ sw(t0, MemOperand(a0, 4, loadstore_chunk)); | 553 __ sw(t0, MemOperand(a0, 4, loadstore_chunk)); |
454 __ sw(t1, MemOperand(a0, 5, loadstore_chunk)); | 554 __ sw(t1, MemOperand(a0, 5, loadstore_chunk)); |
455 __ sw(t2, MemOperand(a0, 6, loadstore_chunk)); | 555 __ sw(t2, MemOperand(a0, 6, loadstore_chunk)); |
456 __ sw(t3, MemOperand(a0, 7, loadstore_chunk)); | 556 __ sw(t3, MemOperand(a0, 7, loadstore_chunk)); |
457 __ addiu(a0, a0, 8 * loadstore_chunk); | 557 __ addiu(a0, a0, 8 * loadstore_chunk); |
458 | 558 |
459 // Less than 32 bytes to copy. Set up for a loop to | 559 // Less than 32 bytes to copy. Set up for a loop to |
460 // copy one word at a time. | 560 // copy one word at a time. |
461 __ bind(&ua_chk1w); | 561 __ bind(&ua_chk1w); |
462 __ andi(a2, t8, loadstore_chunk - 1); | 562 __ andi(a2, t8, loadstore_chunk - 1); |
463 __ beq(a2, t8, &ua_smallCopy); | 563 __ beq(a2, t8, &ua_smallCopy); |
464 __ subu(a3, t8, a2); // In delay slot. | 564 __ subu(a3, t8, a2); // In delay slot. |
465 __ addu(a3, a0, a3); | 565 __ addu(a3, a0, a3); |
466 | 566 |
467 __ bind(&ua_wordCopy_loop); | 567 __ bind(&ua_wordCopy_loop); |
468 __ lwr(v1, MemOperand(a1)); | 568 if (kArchEndian == kLittle) { |
469 __ lwl(v1, | 569 __ lwr(v1, MemOperand(a1)); |
470 MemOperand(a1, 1, loadstore_chunk, MemOperand::offset_minus_one)); | 570 __ lwl(v1, |
| 571 MemOperand(a1, 1, loadstore_chunk, MemOperand::offset_minus_one)); |
| 572 } else { |
| 573 __ lwl(v1, MemOperand(a1)); |
| 574 __ lwr(v1, |
| 575 MemOperand(a1, 1, loadstore_chunk, MemOperand::offset_minus_one)); |
| 576 } |
471 __ addiu(a0, a0, loadstore_chunk); | 577 __ addiu(a0, a0, loadstore_chunk); |
472 __ addiu(a1, a1, loadstore_chunk); | 578 __ addiu(a1, a1, loadstore_chunk); |
473 __ bne(a0, a3, &ua_wordCopy_loop); | 579 __ bne(a0, a3, &ua_wordCopy_loop); |
474 __ sw(v1, MemOperand(a0, -1, loadstore_chunk)); // In delay slot. | 580 __ sw(v1, MemOperand(a0, -1, loadstore_chunk)); // In delay slot. |
475 | 581 |
476 // Copy the last 8 bytes. | 582 // Copy the last 8 bytes. |
477 __ bind(&ua_smallCopy); | 583 __ bind(&ua_smallCopy); |
478 __ beq(a2, zero_reg, &leave); | 584 __ beq(a2, zero_reg, &leave); |
479 __ addu(a3, a0, a2); // In delay slot. | 585 __ addu(a3, a0, a2); // In delay slot. |
480 | 586 |
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
689 | 795 |
690 // Call into runtime if GC is required. | 796 // Call into runtime if GC is required. |
691 __ bind(&gc_required); | 797 __ bind(&gc_required); |
692 __ ld(ra, MemOperand(sp, 0)); | 798 __ ld(ra, MemOperand(sp, 0)); |
693 __ Branch(USE_DELAY_SLOT, fail); | 799 __ Branch(USE_DELAY_SLOT, fail); |
694 __ daddiu(sp, sp, kPointerSize); // In delay slot. | 800 __ daddiu(sp, sp, kPointerSize); // In delay slot. |
695 | 801 |
696 // Convert and copy elements. | 802 // Convert and copy elements. |
697 __ bind(&loop); | 803 __ bind(&loop); |
698 __ ld(scratch2, MemOperand(scratch1)); | 804 __ ld(scratch2, MemOperand(scratch1)); |
699 __ Daddu(scratch1, scratch1, kIntSize); | 805 __ Daddu(scratch1, scratch1, kPointerSize); |
700 // scratch2: current element | 806 // scratch2: current element |
701 __ JumpIfNotSmi(scratch2, &convert_hole); | 807 __ JumpIfNotSmi(scratch2, &convert_hole); |
702 __ SmiUntag(scratch2); | 808 __ SmiUntag(scratch2); |
703 | 809 |
704 // Normal smi, convert to double and store. | 810 // Normal smi, convert to double and store. |
705 __ mtc1(scratch2, f0); | 811 __ mtc1(scratch2, f0); |
706 __ cvt_d_w(f0, f0); | 812 __ cvt_d_w(f0, f0); |
707 __ sdc1(f0, MemOperand(scratch3)); | 813 __ sdc1(f0, MemOperand(scratch3)); |
708 __ Branch(USE_DELAY_SLOT, &entry); | 814 __ Branch(USE_DELAY_SLOT, &entry); |
709 __ daddiu(scratch3, scratch3, kDoubleSize); // In delay slot. | 815 __ daddiu(scratch3, scratch3, kDoubleSize); // In delay slot. |
710 | 816 |
711 // Hole found, store the-hole NaN. | 817 // Hole found, store the-hole NaN. |
712 __ bind(&convert_hole); | 818 __ bind(&convert_hole); |
713 if (FLAG_debug_code) { | 819 if (FLAG_debug_code) { |
714 // Restore a "smi-untagged" heap object. | 820 // Restore a "smi-untagged" heap object. |
715 __ Or(scratch2, scratch2, Operand(1)); | 821 __ Or(scratch2, scratch2, Operand(1)); |
716 __ LoadRoot(at, Heap::kTheHoleValueRootIndex); | 822 __ LoadRoot(at, Heap::kTheHoleValueRootIndex); |
717 __ Assert(eq, kObjectFoundInSmiOnlyArray, at, Operand(scratch2)); | 823 __ Assert(eq, kObjectFoundInSmiOnlyArray, at, Operand(scratch2)); |
718 } | 824 } |
719 // mantissa | 825 // mantissa |
720 __ sw(hole_lower, MemOperand(scratch3)); | 826 __ sw(hole_lower, MemOperand(scratch3, Register::kMantissaOffset)); |
721 // exponent | 827 // exponent |
722 __ sw(hole_upper, MemOperand(scratch3, kIntSize)); | 828 __ sw(hole_upper, MemOperand(scratch3, Register::kExponentOffset)); |
723 __ Daddu(scratch3, scratch3, kDoubleSize); | 829 __ Daddu(scratch3, scratch3, kDoubleSize); |
724 | 830 |
725 __ bind(&entry); | 831 __ bind(&entry); |
726 __ Branch(&loop, lt, scratch3, Operand(array_end)); | 832 __ Branch(&loop, lt, scratch3, Operand(array_end)); |
727 | 833 |
728 __ bind(&done); | 834 __ bind(&done); |
729 __ pop(ra); | 835 __ pop(ra); |
730 } | 836 } |
731 | 837 |
732 | 838 |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
779 __ LoadRoot(scratch, Heap::kFixedArrayMapRootIndex); | 885 __ LoadRoot(scratch, Heap::kFixedArrayMapRootIndex); |
780 __ sd(length, MemOperand(array, FixedDoubleArray::kLengthOffset)); | 886 __ sd(length, MemOperand(array, FixedDoubleArray::kLengthOffset)); |
781 __ sd(scratch, MemOperand(array, HeapObject::kMapOffset)); | 887 __ sd(scratch, MemOperand(array, HeapObject::kMapOffset)); |
782 | 888 |
783 // Prepare for conversion loop. | 889 // Prepare for conversion loop. |
784 Register src_elements = elements; | 890 Register src_elements = elements; |
785 Register dst_elements = target_map; | 891 Register dst_elements = target_map; |
786 Register dst_end = length; | 892 Register dst_end = length; |
787 Register heap_number_map = scratch; | 893 Register heap_number_map = scratch; |
788 __ Daddu(src_elements, src_elements, | 894 __ Daddu(src_elements, src_elements, |
789 Operand(FixedDoubleArray::kHeaderSize - kHeapObjectTag + 4)); | 895 Operand(FixedDoubleArray::kHeaderSize - kHeapObjectTag)); |
790 __ Daddu(dst_elements, array, Operand(FixedArray::kHeaderSize)); | 896 __ Daddu(dst_elements, array, Operand(FixedArray::kHeaderSize)); |
791 __ SmiScale(dst_end, dst_end, kPointerSizeLog2); | 897 __ SmiScale(dst_end, dst_end, kPointerSizeLog2); |
792 __ Daddu(dst_end, dst_elements, dst_end); | 898 __ Daddu(dst_end, dst_elements, dst_end); |
793 | 899 |
794 // Allocating heap numbers in the loop below can fail and cause a jump to | 900 // Allocating heap numbers in the loop below can fail and cause a jump to |
795 // gc_required. We can't leave a partly initialized FixedArray behind, | 901 // gc_required. We can't leave a partly initialized FixedArray behind, |
796 // so pessimistically fill it with holes now. | 902 // so pessimistically fill it with holes now. |
797 Label initialization_loop, initialization_loop_entry; | 903 Label initialization_loop, initialization_loop_entry; |
798 __ LoadRoot(scratch, Heap::kTheHoleValueRootIndex); | 904 __ LoadRoot(scratch, Heap::kTheHoleValueRootIndex); |
799 __ Branch(&initialization_loop_entry); | 905 __ Branch(&initialization_loop_entry); |
(...skipping 17 matching lines...) Expand all Loading... |
817 | 923 |
818 // Call into runtime if GC is required. | 924 // Call into runtime if GC is required. |
819 __ bind(&gc_required); | 925 __ bind(&gc_required); |
820 __ MultiPop( | 926 __ MultiPop( |
821 value.bit() | key.bit() | receiver.bit() | target_map.bit() | ra.bit()); | 927 value.bit() | key.bit() | receiver.bit() | target_map.bit() | ra.bit()); |
822 | 928 |
823 __ Branch(fail); | 929 __ Branch(fail); |
824 | 930 |
825 __ bind(&loop); | 931 __ bind(&loop); |
826 Register upper_bits = key; | 932 Register upper_bits = key; |
827 __ lw(upper_bits, MemOperand(src_elements)); | 933 __ lw(upper_bits, MemOperand(src_elements, Register::kExponentOffset)); |
828 __ Daddu(src_elements, src_elements, kDoubleSize); | 934 __ Daddu(src_elements, src_elements, kDoubleSize); |
829 // upper_bits: current element's upper 32 bit | 935 // upper_bits: current element's upper 32 bit |
830 // src_elements: address of next element's upper 32 bit | 936 // src_elements: address of next element |
831 __ Branch(&convert_hole, eq, a1, Operand(kHoleNanUpper32)); | 937 __ Branch(&convert_hole, eq, a1, Operand(kHoleNanUpper32)); |
832 | 938 |
833 // Non-hole double, copy value into a heap number. | 939 // Non-hole double, copy value into a heap number. |
834 Register heap_number = receiver; | 940 Register heap_number = receiver; |
835 Register scratch2 = value; | 941 Register scratch2 = value; |
836 Register scratch3 = t2; | 942 Register scratch3 = t2; |
837 __ AllocateHeapNumber(heap_number, scratch2, scratch3, heap_number_map, | 943 __ AllocateHeapNumber(heap_number, scratch2, scratch3, heap_number_map, |
838 &gc_required); | 944 &gc_required); |
839 // heap_number: new heap number | 945 // heap_number: new heap number |
840 // Load mantissa of current element, src_elements | 946 // Load current element, src_elements point to next element. |
841 // point to exponent of next element. | 947 |
842 __ lw(scratch2, MemOperand(heap_number, -12)); | 948 __ ld(scratch2, MemOperand(src_elements, -kDoubleSize)); |
843 __ sw(scratch2, FieldMemOperand(heap_number, HeapNumber::kMantissaOffset)); | 949 __ sd(scratch2, FieldMemOperand(heap_number, HeapNumber::kValueOffset)); |
844 __ sw(upper_bits, FieldMemOperand(heap_number, HeapNumber::kExponentOffset)); | 950 |
845 __ mov(scratch2, dst_elements); | 951 __ mov(scratch2, dst_elements); |
846 __ sd(heap_number, MemOperand(dst_elements)); | 952 __ sd(heap_number, MemOperand(dst_elements)); |
847 __ Daddu(dst_elements, dst_elements, kPointerSize); | 953 __ Daddu(dst_elements, dst_elements, kPointerSize); |
848 __ RecordWrite(array, | 954 __ RecordWrite(array, |
849 scratch2, | 955 scratch2, |
850 heap_number, | 956 heap_number, |
851 kRAHasBeenSaved, | 957 kRAHasBeenSaved, |
852 kDontSaveFPRegs, | 958 kDontSaveFPRegs, |
853 EMIT_REMEMBERED_SET, | 959 EMIT_REMEMBERED_SET, |
854 OMIT_SMI_CHECK); | 960 OMIT_SMI_CHECK); |
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1038 __ Move(double_scratch2, 1.); | 1144 __ Move(double_scratch2, 1.); |
1039 __ add_d(result, result, double_scratch2); | 1145 __ add_d(result, result, double_scratch2); |
1040 __ dsrl(temp1, temp2, 11); | 1146 __ dsrl(temp1, temp2, 11); |
1041 __ Ext(temp2, temp2, 0, 11); | 1147 __ Ext(temp2, temp2, 0, 11); |
1042 __ Daddu(temp1, temp1, Operand(0x3ff)); | 1148 __ Daddu(temp1, temp1, Operand(0x3ff)); |
1043 | 1149 |
1044 // Must not call ExpConstant() after overwriting temp3! | 1150 // Must not call ExpConstant() after overwriting temp3! |
1045 __ li(temp3, Operand(ExternalReference::math_exp_log_table())); | 1151 __ li(temp3, Operand(ExternalReference::math_exp_log_table())); |
1046 __ dsll(at, temp2, 3); | 1152 __ dsll(at, temp2, 3); |
1047 __ Daddu(temp3, temp3, Operand(at)); | 1153 __ Daddu(temp3, temp3, Operand(at)); |
1048 __ lwu(temp2, MemOperand(temp3, 0)); | 1154 __ lwu(temp2, MemOperand(temp3, Register::kMantissaOffset)); |
1049 __ lwu(temp3, MemOperand(temp3, kIntSize)); | 1155 __ lwu(temp3, MemOperand(temp3, Register::kExponentOffset)); |
1050 // The first word is loaded is the lower number register. | 1156 // The first word is loaded is the lower number register. |
1051 if (temp2.code() < temp3.code()) { | 1157 if (temp2.code() < temp3.code()) { |
1052 __ dsll(at, temp1, 20); | 1158 __ dsll(at, temp1, 20); |
1053 __ Or(temp1, temp3, at); | 1159 __ Or(temp1, temp3, at); |
1054 __ Move(double_scratch1, temp2, temp1); | 1160 __ Move(double_scratch1, temp2, temp1); |
1055 } else { | 1161 } else { |
1056 __ dsll(at, temp1, 20); | 1162 __ dsll(at, temp1, 20); |
1057 __ Or(temp1, temp2, at); | 1163 __ Or(temp1, temp2, at); |
1058 __ Move(double_scratch1, temp3, temp1); | 1164 __ Move(double_scratch1, temp3, temp1); |
1059 } | 1165 } |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1149 } | 1255 } |
1150 } | 1256 } |
1151 | 1257 |
1152 | 1258 |
1153 #undef __ | 1259 #undef __ |
1154 | 1260 |
1155 } // namespace internal | 1261 } // namespace internal |
1156 } // namespace v8 | 1262 } // namespace v8 |
1157 | 1263 |
1158 #endif // V8_TARGET_ARCH_MIPS64 | 1264 #endif // V8_TARGET_ARCH_MIPS64 |
OLD | NEW |