| OLD | NEW |
| 1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 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 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 141 | 141 |
| 142 | 142 |
| 143 void FastCodeGenerator::EmitBitOr() { | 143 void FastCodeGenerator::EmitBitOr() { |
| 144 if (is_smi(accumulator0()) && is_smi(accumulator1())) { | 144 if (is_smi(accumulator0()) && is_smi(accumulator1())) { |
| 145 // If both operands are known to be a smi then there is no need to check | 145 // If both operands are known to be a smi then there is no need to check |
| 146 // the operands or result. There is no need to perform the operation in | 146 // the operands or result. There is no need to perform the operation in |
| 147 // an effect context. | 147 // an effect context. |
| 148 if (!destination().is(no_reg)) { | 148 if (!destination().is(no_reg)) { |
| 149 __ orr(destination(), accumulator1(), Operand(accumulator0())); | 149 __ orr(destination(), accumulator1(), Operand(accumulator0())); |
| 150 } | 150 } |
| 151 } else if (destination().is(no_reg)) { | |
| 152 // Result is not needed but do not clobber the operands in case of | |
| 153 // bailout. | |
| 154 __ orr(scratch0(), accumulator1(), Operand(accumulator0())); | |
| 155 __ BranchOnNotSmi(scratch0(), bailout()); | |
| 156 } else { | 151 } else { |
| 157 // Preserve the destination operand in a scratch register in case of | 152 // Left is in accumulator1, right in accumulator0. |
| 158 // bailout. | 153 if (destination().is(accumulator0())) { |
| 159 __ mov(scratch0(), destination()); | 154 __ mov(scratch0(), accumulator0()); |
| 160 __ orr(destination(), accumulator1(), Operand(accumulator0())); | 155 __ orr(destination(), accumulator1(), Operand(accumulator1())); |
| 161 __ BranchOnNotSmi(destination(), bailout()); | 156 Label* bailout = |
| 157 info()->AddBailout(accumulator1(), scratch0()); // Left, right. |
| 158 __ BranchOnNotSmi(destination(), bailout); |
| 159 } else if (destination().is(accumulator1())) { |
| 160 __ mov(scratch0(), accumulator1()); |
| 161 __ orr(destination(), accumulator1(), Operand(accumulator0())); |
| 162 Label* bailout = info()->AddBailout(scratch0(), accumulator0()); |
| 163 __ BranchOnNotSmi(destination(), bailout); |
| 164 } else { |
| 165 ASSERT(destination().is(no_reg)); |
| 166 __ orr(scratch0(), accumulator1(), Operand(accumulator0())); |
| 167 Label* bailout = info()->AddBailout(accumulator1(), accumulator0()); |
| 168 __ BranchOnNotSmi(scratch0(), bailout); |
| 169 } |
| 162 } | 170 } |
| 163 | 171 |
| 164 // If we didn't bailout, the result (in fact, both inputs too) is known to | 172 // If we didn't bailout, the result (in fact, both inputs too) is known to |
| 165 // be a smi. | 173 // be a smi. |
| 166 set_as_smi(accumulator0()); | 174 set_as_smi(accumulator0()); |
| 167 set_as_smi(accumulator1()); | 175 set_as_smi(accumulator1()); |
| 168 } | 176 } |
| 169 | 177 |
| 170 | 178 |
| 171 void FastCodeGenerator::Generate(CompilationInfo* compilation_info) { | 179 void FastCodeGenerator::Generate(CompilationInfo* compilation_info) { |
| 172 ASSERT(info_ == NULL); | 180 ASSERT(info_ == NULL); |
| 173 info_ = compilation_info; | 181 info_ = compilation_info; |
| 174 | 182 |
| 175 // Save the caller's frame pointer and set up our own. | 183 // Save the caller's frame pointer and set up our own. |
| 176 Comment prologue_cmnt(masm(), ";; Prologue"); | 184 Comment prologue_cmnt(masm(), ";; Prologue"); |
| 177 __ stm(db_w, sp, r1.bit() | cp.bit() | fp.bit() | lr.bit()); | 185 __ stm(db_w, sp, r1.bit() | cp.bit() | fp.bit() | lr.bit()); |
| 178 __ add(fp, sp, Operand(2 * kPointerSize)); | 186 __ add(fp, sp, Operand(2 * kPointerSize)); |
| 179 // Note that we keep a live register reference to cp (context) at | 187 // Note that we keep a live register reference to cp (context) at |
| 180 // this point. | 188 // this point. |
| 181 | 189 |
| 190 Label* bailout_to_beginning = info()->AddBailout(); |
| 182 // Receiver (this) is allocated to a fixed register. | 191 // Receiver (this) is allocated to a fixed register. |
| 183 if (info()->has_this_properties()) { | 192 if (info()->has_this_properties()) { |
| 184 Comment cmnt(masm(), ";; MapCheck(this)"); | 193 Comment cmnt(masm(), ";; MapCheck(this)"); |
| 185 if (FLAG_print_ir) { | 194 if (FLAG_print_ir) { |
| 186 PrintF("MapCheck(this)\n"); | 195 PrintF("MapCheck(this)\n"); |
| 187 } | 196 } |
| 188 ASSERT(info()->has_receiver() && info()->receiver()->IsHeapObject()); | 197 ASSERT(info()->has_receiver() && info()->receiver()->IsHeapObject()); |
| 189 Handle<HeapObject> object = Handle<HeapObject>::cast(info()->receiver()); | 198 Handle<HeapObject> object = Handle<HeapObject>::cast(info()->receiver()); |
| 190 Handle<Map> map(object->map()); | 199 Handle<Map> map(object->map()); |
| 191 EmitLoadReceiver(); | 200 EmitLoadReceiver(); |
| 192 __ CheckMap(receiver_reg(), scratch0(), map, bailout(), false); | 201 __ CheckMap(receiver_reg(), scratch0(), map, bailout_to_beginning, false); |
| 193 } | 202 } |
| 194 | 203 |
| 195 // If there is a global variable access check if the global object is the | 204 // If there is a global variable access check if the global object is the |
| 196 // same as at lazy-compilation time. | 205 // same as at lazy-compilation time. |
| 197 if (info()->has_globals()) { | 206 if (info()->has_globals()) { |
| 198 Comment cmnt(masm(), ";; MapCheck(GLOBAL)"); | 207 Comment cmnt(masm(), ";; MapCheck(GLOBAL)"); |
| 199 if (FLAG_print_ir) { | 208 if (FLAG_print_ir) { |
| 200 PrintF("MapCheck(GLOBAL)\n"); | 209 PrintF("MapCheck(GLOBAL)\n"); |
| 201 } | 210 } |
| 202 ASSERT(info()->has_global_object()); | 211 ASSERT(info()->has_global_object()); |
| 203 Handle<Map> map(info()->global_object()->map()); | 212 Handle<Map> map(info()->global_object()->map()); |
| 204 __ ldr(scratch0(), CodeGenerator::GlobalObject()); | 213 __ ldr(scratch0(), CodeGenerator::GlobalObject()); |
| 205 __ CheckMap(scratch0(), scratch1(), map, bailout(), true); | 214 __ CheckMap(scratch0(), scratch1(), map, bailout_to_beginning, true); |
| 206 } | 215 } |
| 207 | 216 |
| 208 VisitStatements(function()->body()); | 217 VisitStatements(function()->body()); |
| 209 | 218 |
| 210 Comment return_cmnt(masm(), ";; Return(<undefined>)"); | 219 Comment return_cmnt(masm(), ";; Return(<undefined>)"); |
| 211 if (FLAG_print_ir) { | 220 if (FLAG_print_ir) { |
| 212 PrintF("Return(<undefined>)\n"); | 221 PrintF("Return(<undefined>)\n"); |
| 213 } | 222 } |
| 214 __ LoadRoot(r0, Heap::kUndefinedValueRootIndex); | 223 __ LoadRoot(r0, Heap::kUndefinedValueRootIndex); |
| 215 __ mov(sp, fp); | 224 __ mov(sp, fp); |
| 216 __ ldm(ia_w, sp, fp.bit() | lr.bit()); | 225 __ ldm(ia_w, sp, fp.bit() | lr.bit()); |
| 217 int32_t sp_delta = (scope()->num_parameters() + 1) * kPointerSize; | 226 int32_t sp_delta = (scope()->num_parameters() + 1) * kPointerSize; |
| 218 __ add(sp, sp, Operand(sp_delta)); | 227 __ add(sp, sp, Operand(sp_delta)); |
| 219 __ Jump(lr); | 228 __ Jump(lr); |
| 220 | |
| 221 __ bind(&bailout_); | |
| 222 } | 229 } |
| 223 | 230 |
| 224 | 231 |
| 225 #undef __ | 232 #undef __ |
| 226 | 233 |
| 227 | 234 |
| 228 } } // namespace v8::internal | 235 } } // namespace v8::internal |
| OLD | NEW |