1381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org// Copyright 2008-2009 the V8 project authors. All rights reserved. 23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be 33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file. 49a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 5a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// A light-weight assembler for the Irregexp byte code. 6a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 7a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 8196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/v8.h" 94b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org 10196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/ast.h" 11196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/bytecodes-irregexp.h" 12a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 135ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org#ifndef V8_REGEXP_MACRO_ASSEMBLER_IRREGEXP_INL_H_ 145ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org#define V8_REGEXP_MACRO_ASSEMBLER_IRREGEXP_INL_H_ 15a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 1671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace v8 { 1771affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace internal { 18a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 19c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org#ifdef V8_INTERPRETED_REGEXP 20a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 21ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgvoid RegExpMacroAssemblerIrregexp::Emit(uint32_t byte, 22ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org uint32_t twenty_four_bits) { 23ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org uint32_t word = ((twenty_four_bits << BYTECODE_SHIFT) | byte); 24e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(pc_ <= buffer_.length()); 25ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org if (pc_ + 3 >= buffer_.length()) { 26a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org Expand(); 27a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 28ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org *reinterpret_cast<uint32_t*>(buffer_.start() + pc_) = word; 29ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org pc_ += 4; 30a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 31a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 32a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 33a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid RegExpMacroAssemblerIrregexp::Emit16(uint32_t word) { 34e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(pc_ <= buffer_.length()); 35a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org if (pc_ + 1 >= buffer_.length()) { 36a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org Expand(); 37a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 38ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org *reinterpret_cast<uint16_t*>(buffer_.start() + pc_) = word; 39a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org pc_ += 2; 40a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 41a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 42a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 431456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.orgvoid RegExpMacroAssemblerIrregexp::Emit8(uint32_t word) { 44e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(pc_ <= buffer_.length()); 451456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org if (pc_ == buffer_.length()) { 461456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org Expand(); 471456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org } 481456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org *reinterpret_cast<unsigned char*>(buffer_.start() + pc_) = word; 491456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org pc_ += 1; 501456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org} 511456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org 521456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org 53a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid RegExpMacroAssemblerIrregexp::Emit32(uint32_t word) { 54e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(pc_ <= buffer_.length()); 55a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org if (pc_ + 3 >= buffer_.length()) { 56a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org Expand(); 57a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 58ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org *reinterpret_cast<uint32_t*>(buffer_.start() + pc_) = word; 59a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org pc_ += 4; 60a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 61a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 62c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org#endif // V8_INTERPRETED_REGEXP 63a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 64a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} } // namespace v8::internal 655ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org 665ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org#endif // V8_REGEXP_MACRO_ASSEMBLER_IRREGEXP_INL_H_ 67