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

Side by Side Diff: src/arm/lithium-arm.h

Issue 104663004: Preview of a first step towards unification of hydrogen calls (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Merge fix Created 6 years, 11 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/arm/code-stubs-arm.cc ('k') | src/arm/lithium-arm.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 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
45 V(AddI) \ 45 V(AddI) \
46 V(Allocate) \ 46 V(Allocate) \
47 V(ApplyArguments) \ 47 V(ApplyArguments) \
48 V(ArgumentsElements) \ 48 V(ArgumentsElements) \
49 V(ArgumentsLength) \ 49 V(ArgumentsLength) \
50 V(ArithmeticD) \ 50 V(ArithmeticD) \
51 V(ArithmeticT) \ 51 V(ArithmeticT) \
52 V(BitI) \ 52 V(BitI) \
53 V(BoundsCheck) \ 53 V(BoundsCheck) \
54 V(Branch) \ 54 V(Branch) \
55 V(CallConstantFunction) \ 55 V(CallJSFunction) \
56 V(CallWithDescriptor) \
56 V(CallFunction) \ 57 V(CallFunction) \
57 V(CallKeyed) \
58 V(CallKnownGlobal) \
59 V(CallNamed) \
60 V(CallNew) \ 58 V(CallNew) \
61 V(CallNewArray) \ 59 V(CallNewArray) \
62 V(CallRuntime) \ 60 V(CallRuntime) \
63 V(CallStub) \ 61 V(CallStub) \
64 V(CheckInstanceType) \ 62 V(CheckInstanceType) \
65 V(CheckNonSmi) \ 63 V(CheckNonSmi) \
66 V(CheckMaps) \ 64 V(CheckMaps) \
67 V(CheckMapValue) \ 65 V(CheckMapValue) \
68 V(CheckSmi) \ 66 V(CheckSmi) \
69 V(CheckValue) \ 67 V(CheckValue) \
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after
295 class IsCallBits: public BitField<bool, 0, 1> {}; 293 class IsCallBits: public BitField<bool, 0, 1> {};
296 294
297 LEnvironment* environment_; 295 LEnvironment* environment_;
298 SetOncePointer<LPointerMap> pointer_map_; 296 SetOncePointer<LPointerMap> pointer_map_;
299 HValue* hydrogen_value_; 297 HValue* hydrogen_value_;
300 int bit_field_; 298 int bit_field_;
301 }; 299 };
302 300
303 301
304 // R = number of result operands (0 or 1). 302 // R = number of result operands (0 or 1).
305 // I = number of input operands. 303 template<int R>
306 // T = number of temporary operands. 304 class LTemplateResultInstruction : public LInstruction {
307 template<int R, int I, int T>
308 class LTemplateInstruction : public LInstruction {
309 public: 305 public:
310 // Allow 0 or 1 output operands. 306 // Allow 0 or 1 output operands.
311 STATIC_ASSERT(R == 0 || R == 1); 307 STATIC_ASSERT(R == 0 || R == 1);
312 virtual bool HasResult() const V8_FINAL V8_OVERRIDE { 308 virtual bool HasResult() const V8_FINAL V8_OVERRIDE {
313 return R != 0 && result() != NULL; 309 return R != 0 && result() != NULL;
314 } 310 }
315 void set_result(LOperand* operand) { results_[0] = operand; } 311 void set_result(LOperand* operand) { results_[0] = operand; }
316 LOperand* result() const { return results_[0]; } 312 LOperand* result() const { return results_[0]; }
317 313
318 protected: 314 protected:
319 EmbeddedContainer<LOperand*, R> results_; 315 EmbeddedContainer<LOperand*, R> results_;
316 };
317
318
319 // R = number of result operands (0 or 1).
320 // I = number of input operands.
321 // T = number of temporary operands.
322 template<int R, int I, int T>
323 class LTemplateInstruction : public LTemplateResultInstruction<R> {
324 protected:
320 EmbeddedContainer<LOperand*, I> inputs_; 325 EmbeddedContainer<LOperand*, I> inputs_;
321 EmbeddedContainer<LOperand*, T> temps_; 326 EmbeddedContainer<LOperand*, T> temps_;
322 327
323 private: 328 private:
329 // Iterator support.
324 virtual int InputCount() V8_FINAL V8_OVERRIDE { return I; } 330 virtual int InputCount() V8_FINAL V8_OVERRIDE { return I; }
325 virtual LOperand* InputAt(int i) V8_FINAL V8_OVERRIDE { return inputs_[i]; } 331 virtual LOperand* InputAt(int i) V8_FINAL V8_OVERRIDE { return inputs_[i]; }
326 332
327 virtual int TempCount() V8_FINAL V8_OVERRIDE { return T; } 333 virtual int TempCount() V8_FINAL V8_OVERRIDE { return T; }
328 virtual LOperand* TempAt(int i) V8_FINAL V8_OVERRIDE { return temps_[i]; } 334 virtual LOperand* TempAt(int i) V8_FINAL V8_OVERRIDE { return temps_[i]; }
329 }; 335 };
330 336
331 337
332 class LGap : public LTemplateInstruction<0, 0, 0> { 338 class LGap : public LTemplateInstruction<0, 0, 0> {
333 public: 339 public:
(...skipping 1492 matching lines...) Expand 10 before | Expand all | Expand 10 after
1826 explicit LGlobalReceiver(LOperand* global_object) { 1832 explicit LGlobalReceiver(LOperand* global_object) {
1827 inputs_[0] = global_object; 1833 inputs_[0] = global_object;
1828 } 1834 }
1829 1835
1830 LOperand* global_object() { return inputs_[0]; } 1836 LOperand* global_object() { return inputs_[0]; }
1831 1837
1832 DECLARE_CONCRETE_INSTRUCTION(GlobalReceiver, "global-receiver") 1838 DECLARE_CONCRETE_INSTRUCTION(GlobalReceiver, "global-receiver")
1833 }; 1839 };
1834 1840
1835 1841
1836 class LCallConstantFunction V8_FINAL : public LTemplateInstruction<1, 0, 0> { 1842 class LCallJSFunction V8_FINAL : public LTemplateInstruction<1, 1, 0> {
1837 public: 1843 public:
1838 DECLARE_CONCRETE_INSTRUCTION(CallConstantFunction, "call-constant-function") 1844 explicit LCallJSFunction(LOperand* function) {
1839 DECLARE_HYDROGEN_ACCESSOR(CallConstantFunction) 1845 inputs_[0] = function;
1846 }
1847
1848 LOperand* function() { return inputs_[0]; }
1849
1850 DECLARE_CONCRETE_INSTRUCTION(CallJSFunction, "call-js-function")
1851 DECLARE_HYDROGEN_ACCESSOR(CallJSFunction)
1840 1852
1841 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 1853 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE;
1842 1854
1843 Handle<JSFunction> function() { return hydrogen()->function(); }
1844 int arity() const { return hydrogen()->argument_count() - 1; } 1855 int arity() const { return hydrogen()->argument_count() - 1; }
1845 }; 1856 };
1846 1857
1847 1858
1859 class LCallWithDescriptor V8_FINAL : public LTemplateResultInstruction<1> {
1860 public:
1861 LCallWithDescriptor(const CallInterfaceDescriptor* descriptor,
1862 ZoneList<LOperand*>& operands,
1863 Zone* zone)
1864 : descriptor_(descriptor),
1865 inputs_(descriptor->environment_length() + 1, zone) {
1866 ASSERT(descriptor->environment_length() + 1 == operands.length());
1867 inputs_.AddAll(operands, zone);
1868 }
1869
1870 LOperand* target() const { return inputs_[0]; }
1871
1872 const CallInterfaceDescriptor* descriptor() { return descriptor_; }
1873
1874 private:
1875 DECLARE_CONCRETE_INSTRUCTION(CallWithDescriptor, "call-with-descriptor")
1876 DECLARE_HYDROGEN_ACCESSOR(CallWithDescriptor)
1877
1878 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE;
1879
1880 int arity() const { return hydrogen()->argument_count() - 1; }
1881
1882 const CallInterfaceDescriptor* descriptor_;
1883 ZoneList<LOperand*> inputs_;
1884
1885 virtual void InternalSetOperandAt(int index,
1886 LOperand* value) V8_FINAL V8_OVERRIDE {
1887 inputs_[index] = value;
1888 }
1889
1890 // Iterator support.
1891 virtual int InputCount() V8_FINAL V8_OVERRIDE { return inputs_.length(); }
1892 virtual LOperand* InputAt(int i) V8_FINAL V8_OVERRIDE { return inputs_[i]; }
1893
1894 virtual int TempCount() V8_FINAL V8_OVERRIDE { return 0; }
1895 virtual LOperand* TempAt(int i) V8_FINAL V8_OVERRIDE { return NULL; }
1896 };
1897
1898
1848 class LInvokeFunction V8_FINAL : public LTemplateInstruction<1, 2, 0> { 1899 class LInvokeFunction V8_FINAL : public LTemplateInstruction<1, 2, 0> {
1849 public: 1900 public:
1850 LInvokeFunction(LOperand* context, LOperand* function) { 1901 LInvokeFunction(LOperand* context, LOperand* function) {
1851 inputs_[0] = context; 1902 inputs_[0] = context;
1852 inputs_[1] = function; 1903 inputs_[1] = function;
1853 } 1904 }
1854 1905
1855 LOperand* context() { return inputs_[0]; } 1906 LOperand* context() { return inputs_[0]; }
1856 LOperand* function() { return inputs_[1]; } 1907 LOperand* function() { return inputs_[1]; }
1857 1908
1858 DECLARE_CONCRETE_INSTRUCTION(InvokeFunction, "invoke-function") 1909 DECLARE_CONCRETE_INSTRUCTION(InvokeFunction, "invoke-function")
1859 DECLARE_HYDROGEN_ACCESSOR(InvokeFunction) 1910 DECLARE_HYDROGEN_ACCESSOR(InvokeFunction)
1860 1911
1861 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 1912 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE;
1862 1913
1863 int arity() const { return hydrogen()->argument_count() - 1; } 1914 int arity() const { return hydrogen()->argument_count() - 1; }
1864 }; 1915 };
1865 1916
1866
1867 class LCallKeyed V8_FINAL : public LTemplateInstruction<1, 2, 0> {
1868 public:
1869 LCallKeyed(LOperand* context, LOperand* key) {
1870 inputs_[0] = context;
1871 inputs_[1] = key;
1872 }
1873
1874 LOperand* context() { return inputs_[0]; }
1875 LOperand* key() { return inputs_[1]; }
1876
1877 DECLARE_CONCRETE_INSTRUCTION(CallKeyed, "call-keyed")
1878 DECLARE_HYDROGEN_ACCESSOR(CallKeyed)
1879
1880 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE;
1881
1882 int arity() const { return hydrogen()->argument_count() - 1; }
1883 };
1884
1885
1886
1887 class LCallNamed V8_FINAL : public LTemplateInstruction<1, 1, 0> {
1888 public:
1889 explicit LCallNamed(LOperand* context) {
1890 inputs_[0] = context;
1891 }
1892
1893 LOperand* context() { return inputs_[0]; }
1894
1895 DECLARE_CONCRETE_INSTRUCTION(CallNamed, "call-named")
1896 DECLARE_HYDROGEN_ACCESSOR(CallNamed)
1897
1898 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE;
1899
1900 Handle<String> name() const { return hydrogen()->name(); }
1901 int arity() const { return hydrogen()->argument_count() - 1; }
1902 };
1903
1904 1917
1905 class LCallFunction V8_FINAL : public LTemplateInstruction<1, 2, 0> { 1918 class LCallFunction V8_FINAL : public LTemplateInstruction<1, 2, 0> {
1906 public: 1919 public:
1907 LCallFunction(LOperand* context, LOperand* function) { 1920 LCallFunction(LOperand* context, LOperand* function) {
1908 inputs_[0] = context; 1921 inputs_[0] = context;
1909 inputs_[1] = function; 1922 inputs_[1] = function;
1910 } 1923 }
1911 1924
1912 LOperand* context() { return inputs_[0]; } 1925 LOperand* context() { return inputs_[0]; }
1913 LOperand* function() { return inputs_[1]; } 1926 LOperand* function() { return inputs_[1]; }
1914 1927
1915 DECLARE_CONCRETE_INSTRUCTION(CallFunction, "call-function") 1928 DECLARE_CONCRETE_INSTRUCTION(CallFunction, "call-function")
1916 DECLARE_HYDROGEN_ACCESSOR(CallFunction) 1929 DECLARE_HYDROGEN_ACCESSOR(CallFunction)
1917 1930
1918 int arity() const { return hydrogen()->argument_count() - 1; } 1931 int arity() const { return hydrogen()->argument_count() - 1; }
1919 }; 1932 };
1920 1933
1921 1934
1922 class LCallKnownGlobal V8_FINAL : public LTemplateInstruction<1, 0, 0> {
1923 public:
1924 DECLARE_CONCRETE_INSTRUCTION(CallKnownGlobal, "call-known-global")
1925 DECLARE_HYDROGEN_ACCESSOR(CallKnownGlobal)
1926
1927 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE;
1928
1929 int arity() const { return hydrogen()->argument_count() - 1; }
1930 };
1931
1932
1933 class LCallNew V8_FINAL : public LTemplateInstruction<1, 2, 0> { 1935 class LCallNew V8_FINAL : public LTemplateInstruction<1, 2, 0> {
1934 public: 1936 public:
1935 LCallNew(LOperand* context, LOperand* constructor) { 1937 LCallNew(LOperand* context, LOperand* constructor) {
1936 inputs_[0] = context; 1938 inputs_[0] = context;
1937 inputs_[1] = constructor; 1939 inputs_[1] = constructor;
1938 } 1940 }
1939 1941
1940 LOperand* context() { return inputs_[0]; } 1942 LOperand* context() { return inputs_[0]; }
1941 LOperand* constructor() { return inputs_[1]; } 1943 LOperand* constructor() { return inputs_[1]; }
1942 1944
(...skipping 838 matching lines...) Expand 10 before | Expand all | Expand 10 after
2781 // Will not be moved to a register even if one is freely available. 2783 // Will not be moved to a register even if one is freely available.
2782 virtual MUST_USE_RESULT LOperand* UseAny(HValue* value) V8_OVERRIDE; 2784 virtual MUST_USE_RESULT LOperand* UseAny(HValue* value) V8_OVERRIDE;
2783 2785
2784 // Temporary operand that must be in a register. 2786 // Temporary operand that must be in a register.
2785 MUST_USE_RESULT LUnallocated* TempRegister(); 2787 MUST_USE_RESULT LUnallocated* TempRegister();
2786 MUST_USE_RESULT LOperand* FixedTemp(Register reg); 2788 MUST_USE_RESULT LOperand* FixedTemp(Register reg);
2787 MUST_USE_RESULT LOperand* FixedTemp(DoubleRegister reg); 2789 MUST_USE_RESULT LOperand* FixedTemp(DoubleRegister reg);
2788 2790
2789 // Methods for setting up define-use relationships. 2791 // Methods for setting up define-use relationships.
2790 // Return the same instruction that they are passed. 2792 // Return the same instruction that they are passed.
2791 template<int I, int T> 2793 LInstruction* Define(LTemplateResultInstruction<1>* instr,
2792 LInstruction* Define(LTemplateInstruction<1, I, T>* instr, 2794 LUnallocated* result);
2793 LUnallocated* result); 2795 LInstruction* DefineAsRegister(LTemplateResultInstruction<1>* instr);
2794 template<int I, int T> 2796 LInstruction* DefineAsSpilled(LTemplateResultInstruction<1>* instr,
2795 LInstruction* DefineAsRegister(LTemplateInstruction<1, I, T>* instr); 2797 int index);
2796 template<int I, int T> 2798 LInstruction* DefineSameAsFirst(LTemplateResultInstruction<1>* instr);
2797 LInstruction* DefineAsSpilled(LTemplateInstruction<1, I, T>* instr, 2799 LInstruction* DefineFixed(LTemplateResultInstruction<1>* instr,
2798 int index); 2800 Register reg);
2799 template<int I, int T> 2801 LInstruction* DefineFixedDouble(LTemplateResultInstruction<1>* instr,
2800 LInstruction* DefineSameAsFirst(LTemplateInstruction<1, I, T>* instr); 2802 DoubleRegister reg);
2801 template<int I, int T>
2802 LInstruction* DefineFixed(LTemplateInstruction<1, I, T>* instr,
2803 Register reg);
2804 template<int I, int T>
2805 LInstruction* DefineFixedDouble(LTemplateInstruction<1, I, T>* instr,
2806 DoubleRegister reg);
2807 LInstruction* AssignEnvironment(LInstruction* instr); 2803 LInstruction* AssignEnvironment(LInstruction* instr);
2808 LInstruction* AssignPointerMap(LInstruction* instr); 2804 LInstruction* AssignPointerMap(LInstruction* instr);
2809 2805
2810 enum CanDeoptimize { CAN_DEOPTIMIZE_EAGERLY, CANNOT_DEOPTIMIZE_EAGERLY }; 2806 enum CanDeoptimize { CAN_DEOPTIMIZE_EAGERLY, CANNOT_DEOPTIMIZE_EAGERLY };
2811 2807
2812 // By default we assume that instruction sequences generated for calls 2808 // By default we assume that instruction sequences generated for calls
2813 // cannot deoptimize eagerly and we do not attach environment to this 2809 // cannot deoptimize eagerly and we do not attach environment to this
2814 // instruction. 2810 // instruction.
2815 LInstruction* MarkAsCall( 2811 LInstruction* MarkAsCall(
2816 LInstruction* instr, 2812 LInstruction* instr,
(...skipping 23 matching lines...) Expand all
2840 2836
2841 DISALLOW_COPY_AND_ASSIGN(LChunkBuilder); 2837 DISALLOW_COPY_AND_ASSIGN(LChunkBuilder);
2842 }; 2838 };
2843 2839
2844 #undef DECLARE_HYDROGEN_ACCESSOR 2840 #undef DECLARE_HYDROGEN_ACCESSOR
2845 #undef DECLARE_CONCRETE_INSTRUCTION 2841 #undef DECLARE_CONCRETE_INSTRUCTION
2846 2842
2847 } } // namespace v8::internal 2843 } } // namespace v8::internal
2848 2844
2849 #endif // V8_ARM_LITHIUM_ARM_H_ 2845 #endif // V8_ARM_LITHIUM_ARM_H_
OLDNEW
« no previous file with comments | « src/arm/code-stubs-arm.cc ('k') | src/arm/lithium-arm.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698