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

Side by Side Diff: src/x64/lithium-codegen-x64.cc

Issue 6410112: Implement crankshaft support for pixel array loads. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: review feedback, x64 and arm impl Created 9 years, 10 months 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 | Annotate | Revision Log
OLDNEW
1 // Copyright 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 779 matching lines...) Expand 10 before | Expand all | Expand 10 after
790 } 790 }
791 791
792 792
793 void LCodeGen::DoFixedArrayLength(LFixedArrayLength* instr) { 793 void LCodeGen::DoFixedArrayLength(LFixedArrayLength* instr) {
794 Register result = ToRegister(instr->result()); 794 Register result = ToRegister(instr->result());
795 Register array = ToRegister(instr->InputAt(0)); 795 Register array = ToRegister(instr->InputAt(0));
796 __ movq(result, FieldOperand(array, FixedArray::kLengthOffset)); 796 __ movq(result, FieldOperand(array, FixedArray::kLengthOffset));
797 } 797 }
798 798
799 799
800 void LCodeGen::DoPixelArrayLength(LPixelArrayLength* instr) {
801 Register result = ToRegister(instr->result());
802 Register array = ToRegister(instr->InputAt(0));
803 __ movq(result, FieldOperand(array, PixelArray::kLengthOffset));
804 }
805
806
800 void LCodeGen::DoValueOf(LValueOf* instr) { 807 void LCodeGen::DoValueOf(LValueOf* instr) {
801 Abort("Unimplemented: %s", "DoValueOf"); 808 Abort("Unimplemented: %s", "DoValueOf");
802 } 809 }
803 810
804 811
805 void LCodeGen::DoBitNotI(LBitNotI* instr) { 812 void LCodeGen::DoBitNotI(LBitNotI* instr) {
806 LOperand* input = instr->InputAt(0); 813 LOperand* input = instr->InputAt(0);
807 ASSERT(input->Equals(instr->result())); 814 ASSERT(input->Equals(instr->result()));
808 __ not_(ToRegister(input)); 815 __ not_(ToRegister(input));
809 } 816 }
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
956 __ jmp(deferred_stack_check->entry()); 963 __ jmp(deferred_stack_check->entry());
957 deferred_stack_check->SetExit(chunk_->GetAssemblyLabel(block)); 964 deferred_stack_check->SetExit(chunk_->GetAssemblyLabel(block));
958 } else { 965 } else {
959 __ jmp(chunk_->GetAssemblyLabel(block)); 966 __ jmp(chunk_->GetAssemblyLabel(block));
960 } 967 }
961 } 968 }
962 } 969 }
963 970
964 971
965 void LCodeGen::DoDeferredStackCheck(LGoto* instr) { 972 void LCodeGen::DoDeferredStackCheck(LGoto* instr) {
966 Abort("Unimplemented: %s", "DoDeferredStackCheck"); 973 __ Pushad();
974 __ CallRuntimeSaveDoubles(Runtime::kStackGuard);
975 RecordSafepointWithRegisters(
976 instr->pointer_map(), 0, Safepoint::kNoDeoptimizationIndex);
977 __ Popad();
967 } 978 }
968 979
969 980
970 void LCodeGen::DoGoto(LGoto* instr) { 981 void LCodeGen::DoGoto(LGoto* instr) {
971 class DeferredStackCheck: public LDeferredCode { 982 class DeferredStackCheck: public LDeferredCode {
972 public: 983 public:
973 DeferredStackCheck(LCodeGen* codegen, LGoto* instr) 984 DeferredStackCheck(LCodeGen* codegen, LGoto* instr)
974 : LDeferredCode(codegen), instr_(instr) { } 985 : LDeferredCode(codegen), instr_(instr) { }
975 virtual void Generate() { codegen()->DoDeferredStackCheck(instr_); } 986 virtual void Generate() { codegen()->DoDeferredStackCheck(instr_); }
976 private: 987 private:
(...skipping 589 matching lines...) Expand 10 before | Expand all | Expand 10 after
1566 Abort("Unimplemented: %s", "DoLoadNamedGeneric"); 1577 Abort("Unimplemented: %s", "DoLoadNamedGeneric");
1567 } 1578 }
1568 1579
1569 1580
1570 void LCodeGen::DoLoadFunctionPrototype(LLoadFunctionPrototype* instr) { 1581 void LCodeGen::DoLoadFunctionPrototype(LLoadFunctionPrototype* instr) {
1571 Abort("Unimplemented: %s", "DoLoadFunctionPrototype"); 1582 Abort("Unimplemented: %s", "DoLoadFunctionPrototype");
1572 } 1583 }
1573 1584
1574 1585
1575 void LCodeGen::DoLoadElements(LLoadElements* instr) { 1586 void LCodeGen::DoLoadElements(LLoadElements* instr) {
1576 ASSERT(instr->result()->Equals(instr->InputAt(0))); 1587 Register result = ToRegister(instr->result());
1577 Register reg = ToRegister(instr->InputAt(0)); 1588 Register input = ToRegister(instr->InputAt(0));
1578 __ movq(reg, FieldOperand(reg, JSObject::kElementsOffset)); 1589 __ movq(result, FieldOperand(input, JSObject::kElementsOffset));
1579 if (FLAG_debug_code) { 1590 if (FLAG_debug_code) {
1580 NearLabel done; 1591 NearLabel done;
1581 __ Cmp(FieldOperand(reg, HeapObject::kMapOffset), 1592 __ Cmp(FieldOperand(result, HeapObject::kMapOffset),
1582 Factory::fixed_array_map()); 1593 Factory::fixed_array_map());
1583 __ j(equal, &done); 1594 __ j(equal, &done);
1584 __ Cmp(FieldOperand(reg, HeapObject::kMapOffset), 1595 __ Cmp(FieldOperand(result, HeapObject::kMapOffset),
1596 Factory::pixel_array_map());
1597 __ j(equal, &done);
1598 __ Cmp(FieldOperand(result, HeapObject::kMapOffset),
1585 Factory::fixed_cow_array_map()); 1599 Factory::fixed_cow_array_map());
1586 __ Check(equal, "Check for fast elements failed."); 1600 __ Check(equal, "Check for fast elements failed.");
1587 __ bind(&done); 1601 __ bind(&done);
1588 } 1602 }
1589 } 1603 }
1590 1604
1591 1605
1606 void LCodeGen::DoLoadPixelArrayExternalPointer(
1607 LLoadPixelArrayExternalPointer* instr) {
1608 Register result = ToRegister(instr->result());
1609 Register input = ToRegister(instr->InputAt(0));
1610 __ movq(result, FieldOperand(input, PixelArray::kExternalPointerOffset));
1611 }
1612
1613
1592 void LCodeGen::DoAccessArgumentsAt(LAccessArgumentsAt* instr) { 1614 void LCodeGen::DoAccessArgumentsAt(LAccessArgumentsAt* instr) {
1593 Abort("Unimplemented: %s", "DoAccessArgumentsAt"); 1615 Abort("Unimplemented: %s", "DoAccessArgumentsAt");
1594 } 1616 }
1595 1617
1596 1618
1597 void LCodeGen::DoLoadKeyedFastElement(LLoadKeyedFastElement* instr) { 1619 void LCodeGen::DoLoadKeyedFastElement(LLoadKeyedFastElement* instr) {
1598 Register elements = ToRegister(instr->elements()); 1620 Register elements = ToRegister(instr->elements());
1599 Register key = ToRegister(instr->key()); 1621 Register key = ToRegister(instr->key());
1600 Register result = ToRegister(instr->result()); 1622 Register result = ToRegister(instr->result());
1601 ASSERT(result.is(elements)); 1623 ASSERT(result.is(elements));
1602 1624
1603 // Load the result. 1625 // Load the result.
1604 __ movq(result, FieldOperand(elements, 1626 __ movq(result, FieldOperand(elements,
1605 key, 1627 key,
1606 times_pointer_size, 1628 times_pointer_size,
1607 FixedArray::kHeaderSize)); 1629 FixedArray::kHeaderSize));
1608 1630
1609 // Check for the hole value. 1631 // Check for the hole value.
1610 __ Cmp(result, Factory::the_hole_value()); 1632 __ Cmp(result, Factory::the_hole_value());
1611 DeoptimizeIf(equal, instr->environment()); 1633 DeoptimizeIf(equal, instr->environment());
1612 } 1634 }
1613 1635
1614 1636
1637 void LCodeGen::DoLoadPixelArrayElement(LLoadPixelArrayElement* instr) {
1638 Register external_elements = ToRegister(instr->external_pointer());
1639 Register key = ToRegister(instr->key());
1640 Register result = ToRegister(instr->result());
1641 ASSERT(result.is(external_elements));
1642
1643 // Load the result.
1644 __ movzxbq(result, Operand(external_elements, key, times_1, 0));
1645 }
1646
1647
1615 void LCodeGen::DoLoadKeyedGeneric(LLoadKeyedGeneric* instr) { 1648 void LCodeGen::DoLoadKeyedGeneric(LLoadKeyedGeneric* instr) {
1616 Abort("Unimplemented: %s", "DoLoadKeyedGeneric"); 1649 Abort("Unimplemented: %s", "DoLoadKeyedGeneric");
1617 } 1650 }
1618 1651
1619 1652
1620 void LCodeGen::DoArgumentsElements(LArgumentsElements* instr) { 1653 void LCodeGen::DoArgumentsElements(LArgumentsElements* instr) {
1621 Abort("Unimplemented: %s", "DoArgumentsElements"); 1654 Abort("Unimplemented: %s", "DoArgumentsElements");
1622 } 1655 }
1623 1656
1624 1657
(...skipping 294 matching lines...) Expand 10 before | Expand all | Expand 10 after
1919 RecordSafepointWithRegisters( 1952 RecordSafepointWithRegisters(
1920 instr->pointer_map(), 0, Safepoint::kNoDeoptimizationIndex); 1953 instr->pointer_map(), 0, Safepoint::kNoDeoptimizationIndex);
1921 // Ensure that value in rax survives popping registers. 1954 // Ensure that value in rax survives popping registers.
1922 __ movq(kScratchRegister, rax); 1955 __ movq(kScratchRegister, rax);
1923 __ PopSafepointRegisters(); 1956 __ PopSafepointRegisters();
1924 __ movq(reg, kScratchRegister); 1957 __ movq(reg, kScratchRegister);
1925 } 1958 }
1926 1959
1927 1960
1928 void LCodeGen::DoSmiTag(LSmiTag* instr) { 1961 void LCodeGen::DoSmiTag(LSmiTag* instr) {
1929 Abort("Unimplemented: %s", "DoSmiTag"); 1962 Register to_reg = ToRegister(instr->result());
1963 Register from_reg = ToRegister(instr->InputAt(0));
1964 __ Integer32ToSmi(to_reg, from_reg);
1930 } 1965 }
1931 1966
1932 1967
1933 void LCodeGen::DoSmiUntag(LSmiUntag* instr) { 1968 void LCodeGen::DoSmiUntag(LSmiUntag* instr) {
1934 Abort("Unimplemented: %s", "DoSmiUntag"); 1969 Abort("Unimplemented: %s", "DoSmiUntag");
1935 } 1970 }
1936 1971
1937 1972
1938 void LCodeGen::EmitNumberUntagD(Register input_reg, 1973 void LCodeGen::EmitNumberUntagD(Register input_reg,
1939 XMMRegister result_reg, 1974 XMMRegister result_reg,
(...skipping 389 matching lines...) Expand 10 before | Expand all | Expand 10 after
2329 2364
2330 void LCodeGen::DoOsrEntry(LOsrEntry* instr) { 2365 void LCodeGen::DoOsrEntry(LOsrEntry* instr) {
2331 Abort("Unimplemented: %s", "DoOsrEntry"); 2366 Abort("Unimplemented: %s", "DoOsrEntry");
2332 } 2367 }
2333 2368
2334 #undef __ 2369 #undef __
2335 2370
2336 } } // namespace v8::internal 2371 } } // namespace v8::internal
2337 2372
2338 #endif // V8_TARGET_ARCH_X64 2373 #endif // V8_TARGET_ARCH_X64
OLDNEW
« src/hydrogen-instructions.h ('K') | « src/v8-counters.h ('k') | src/x64/lithium-x64.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698