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

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

Issue 13007003: MIPS: ES6 symbols: turn symbols into a proper primitive type (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 7 years, 9 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
« no previous file with comments | « src/mips/full-codegen-mips.cc ('k') | src/mips/stub-cache-mips.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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 1883 matching lines...) Expand 10 before | Expand all | Expand 10 after
1894 // String value -> false iff empty. 1894 // String value -> false iff empty.
1895 Label not_string; 1895 Label not_string;
1896 __ lbu(at, FieldMemOperand(map, Map::kInstanceTypeOffset)); 1896 __ lbu(at, FieldMemOperand(map, Map::kInstanceTypeOffset));
1897 __ Branch(&not_string, ge , at, Operand(FIRST_NONSTRING_TYPE)); 1897 __ Branch(&not_string, ge , at, Operand(FIRST_NONSTRING_TYPE));
1898 __ lw(at, FieldMemOperand(reg, String::kLengthOffset)); 1898 __ lw(at, FieldMemOperand(reg, String::kLengthOffset));
1899 __ Branch(true_label, ne, at, Operand(zero_reg)); 1899 __ Branch(true_label, ne, at, Operand(zero_reg));
1900 __ Branch(false_label); 1900 __ Branch(false_label);
1901 __ bind(&not_string); 1901 __ bind(&not_string);
1902 } 1902 }
1903 1903
1904 if (expected.Contains(ToBooleanStub::SYMBOL)) {
1905 // Symbol value -> true.
1906 __ lbu(at, FieldMemOperand(map, Map::kInstanceTypeOffset));
1907 __ Branch(true_label, eq, at, Operand(SYMBOL_TYPE));
Paul Lind 2013/03/23 01:23:40 We cannot use 'at' register in this Branch(), as '
palfia 2013/03/23 01:49:45 Thanks for fixing this! It escaped my attention, t
1908 }
1909
1904 if (expected.Contains(ToBooleanStub::HEAP_NUMBER)) { 1910 if (expected.Contains(ToBooleanStub::HEAP_NUMBER)) {
1905 CpuFeatureScope scope(masm(), FPU); 1911 CpuFeatureScope scope(masm(), FPU);
1906 // heap number -> false iff +0, -0, or NaN. 1912 // heap number -> false iff +0, -0, or NaN.
1907 DoubleRegister dbl_scratch = double_scratch0(); 1913 DoubleRegister dbl_scratch = double_scratch0();
1908 Label not_heap_number; 1914 Label not_heap_number;
1909 __ LoadRoot(at, Heap::kHeapNumberMapRootIndex); 1915 __ LoadRoot(at, Heap::kHeapNumberMapRootIndex);
1910 __ Branch(&not_heap_number, ne, map, Operand(at)); 1916 __ Branch(&not_heap_number, ne, map, Operand(at));
1911 __ ldc1(dbl_scratch, FieldMemOperand(reg, HeapNumber::kValueOffset)); 1917 __ ldc1(dbl_scratch, FieldMemOperand(reg, HeapNumber::kValueOffset));
1912 __ BranchF(true_label, false_label, ne, dbl_scratch, kDoubleRegZero); 1918 __ BranchF(true_label, false_label, ne, dbl_scratch, kDoubleRegZero);
1913 // Falls through if dbl_scratch == 0. 1919 // Falls through if dbl_scratch == 0.
(...skipping 3850 matching lines...) Expand 10 before | Expand all | Expand 10 after
5764 __ Branch(USE_DELAY_SLOT, false_label, 5770 __ Branch(USE_DELAY_SLOT, false_label,
5765 ge, scratch, Operand(FIRST_NONSTRING_TYPE)); 5771 ge, scratch, Operand(FIRST_NONSTRING_TYPE));
5766 // input is an object so we can load the BitFieldOffset even if we take the 5772 // input is an object so we can load the BitFieldOffset even if we take the
5767 // other branch. 5773 // other branch.
5768 __ lbu(at, FieldMemOperand(input, Map::kBitFieldOffset)); 5774 __ lbu(at, FieldMemOperand(input, Map::kBitFieldOffset));
5769 __ And(at, at, 1 << Map::kIsUndetectable); 5775 __ And(at, at, 1 << Map::kIsUndetectable);
5770 cmp1 = at; 5776 cmp1 = at;
5771 cmp2 = Operand(zero_reg); 5777 cmp2 = Operand(zero_reg);
5772 final_branch_condition = eq; 5778 final_branch_condition = eq;
5773 5779
5780 } else if (type_name->Equals(heap()->symbol_string())) {
5781 __ JumpIfSmi(input, false_label);
5782 __ GetObjectType(input, input, scratch);
5783 cmp1 = scratch;
5784 cmp2 = Operand(SYMBOL_TYPE);
5785 final_branch_condition = eq;
5786
5774 } else if (type_name->Equals(heap()->boolean_string())) { 5787 } else if (type_name->Equals(heap()->boolean_string())) {
5775 __ LoadRoot(at, Heap::kTrueValueRootIndex); 5788 __ LoadRoot(at, Heap::kTrueValueRootIndex);
5776 __ Branch(USE_DELAY_SLOT, true_label, eq, at, Operand(input)); 5789 __ Branch(USE_DELAY_SLOT, true_label, eq, at, Operand(input));
5777 __ LoadRoot(at, Heap::kFalseValueRootIndex); 5790 __ LoadRoot(at, Heap::kFalseValueRootIndex);
5778 cmp1 = at; 5791 cmp1 = at;
5779 cmp2 = Operand(input); 5792 cmp2 = Operand(input);
5780 final_branch_condition = eq; 5793 final_branch_condition = eq;
5781 5794
5782 } else if (FLAG_harmony_typeof && type_name->Equals(heap()->null_string())) { 5795 } else if (FLAG_harmony_typeof && type_name->Equals(heap()->null_string())) {
5783 __ LoadRoot(at, Heap::kNullValueRootIndex); 5796 __ LoadRoot(at, Heap::kNullValueRootIndex);
(...skipping 23 matching lines...) Expand all
5807 cmp1 = input; 5820 cmp1 = input;
5808 cmp2 = Operand(JS_FUNCTION_PROXY_TYPE); 5821 cmp2 = Operand(JS_FUNCTION_PROXY_TYPE);
5809 final_branch_condition = eq; 5822 final_branch_condition = eq;
5810 5823
5811 } else if (type_name->Equals(heap()->object_string())) { 5824 } else if (type_name->Equals(heap()->object_string())) {
5812 __ JumpIfSmi(input, false_label); 5825 __ JumpIfSmi(input, false_label);
5813 if (!FLAG_harmony_typeof) { 5826 if (!FLAG_harmony_typeof) {
5814 __ LoadRoot(at, Heap::kNullValueRootIndex); 5827 __ LoadRoot(at, Heap::kNullValueRootIndex);
5815 __ Branch(USE_DELAY_SLOT, true_label, eq, at, Operand(input)); 5828 __ Branch(USE_DELAY_SLOT, true_label, eq, at, Operand(input));
5816 } 5829 }
5817 if (FLAG_harmony_symbols) { 5830 // input is an object, it is safe to use GetObjectType in the delay slot.
5818 // input is an object, it is safe to use GetObjectType in the delay slot. 5831 __ GetObjectType(input, input, scratch);
Paul Lind 2013/03/22 22:15:20 There is some tricky stuff with delay slots here t
5819 __ GetObjectType(input, input, scratch); 5832 __ Branch(USE_DELAY_SLOT, false_label,
5820 __ Branch(USE_DELAY_SLOT, true_label, eq, scratch, Operand(SYMBOL_TYPE)); 5833 lt, scratch, Operand(FIRST_NONCALLABLE_SPEC_OBJECT_TYPE));
5821 // Still an object, so the InstanceType can be loaded.
5822 __ lbu(scratch, FieldMemOperand(input, Map::kInstanceTypeOffset));
5823 __ Branch(USE_DELAY_SLOT, false_label,
5824 lt, scratch, Operand(FIRST_NONCALLABLE_SPEC_OBJECT_TYPE));
5825 } else {
5826 // input is an object, it is safe to use GetObjectType in the delay slot.
5827 __ GetObjectType(input, input, scratch);
5828 __ Branch(USE_DELAY_SLOT, false_label,
5829 lt, scratch, Operand(FIRST_NONCALLABLE_SPEC_OBJECT_TYPE));
5830 }
5831 // Still an object, so the InstanceType can be loaded. 5834 // Still an object, so the InstanceType can be loaded.
5832 __ lbu(scratch, FieldMemOperand(input, Map::kInstanceTypeOffset)); 5835 __ lbu(scratch, FieldMemOperand(input, Map::kInstanceTypeOffset));
5833 __ Branch(USE_DELAY_SLOT, false_label, 5836 __ Branch(USE_DELAY_SLOT, false_label,
5834 gt, scratch, Operand(LAST_NONCALLABLE_SPEC_OBJECT_TYPE)); 5837 gt, scratch, Operand(LAST_NONCALLABLE_SPEC_OBJECT_TYPE));
5835 // Still an object, so the BitField can be loaded. 5838 // Still an object, so the BitField can be loaded.
5836 // Check for undetectable objects => false. 5839 // Check for undetectable objects => false.
5837 __ lbu(at, FieldMemOperand(input, Map::kBitFieldOffset)); 5840 __ lbu(at, FieldMemOperand(input, Map::kBitFieldOffset));
5838 __ And(at, at, 1 << Map::kIsUndetectable); 5841 __ And(at, at, 1 << Map::kIsUndetectable);
5839 cmp1 = at; 5842 cmp1 = at;
5840 cmp2 = Operand(zero_reg); 5843 cmp2 = Operand(zero_reg);
(...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after
6104 __ Subu(scratch, result, scratch); 6107 __ Subu(scratch, result, scratch);
6105 __ lw(result, FieldMemOperand(scratch, 6108 __ lw(result, FieldMemOperand(scratch,
6106 FixedArray::kHeaderSize - kPointerSize)); 6109 FixedArray::kHeaderSize - kPointerSize));
6107 __ bind(&done); 6110 __ bind(&done);
6108 } 6111 }
6109 6112
6110 6113
6111 #undef __ 6114 #undef __
6112 6115
6113 } } // namespace v8::internal 6116 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/mips/full-codegen-mips.cc ('k') | src/mips/stub-cache-mips.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698