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