// Copyright 2019 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "src/extensions/cputracemark-extension.h"

namespace v8 {
namespace internal {

v8::Local<v8::FunctionTemplate>
CpuTraceMarkExtension::GetNativeFunctionTemplate(v8::Isolate* isolate,
                                                 v8::Local<v8::String> str) {
  return v8::FunctionTemplate::New(isolate, CpuTraceMarkExtension::Mark);
}

void CpuTraceMarkExtension::Mark(
    const v8::FunctionCallbackInfo<v8::Value>& args) {
  if (args.Length() < 1 || !args[0]->IsUint32()) {
    args.GetIsolate()->ThrowException(v8::String::NewFromUtf8Literal(
        args.GetIsolate(),
        "First parameter to cputracemark() must be a unsigned int32."));
    return;
  }

#if V8_HOST_ARCH_IA32 || V8_HOST_ARCH_X64

#if defined(__clang__)
  // for non msvc build
  uint32_t param =
      args[0]->Uint32Value(args.GetIsolate()->GetCurrentContext()).ToChecked();

  int magic_dummy;

#if defined(__i386__) && defined(__pic__)
  __asm__ __volatile__("push %%ebx; cpuid; pop %%ebx"
                       : "=a"(magic_dummy)
                       : "a"(0x4711 | (param << 16))
                       : "ecx", "edx");
#else
  __asm__ __volatile__("cpuid"
                       : "=a"(magic_dummy)
                       : "a"(0x4711 | (param << 16))
                       : "ecx", "edx", "ebx");
#endif  // defined(__i386__) && defined(__pic__)

#else
  // no msvc build support yet.
#endif  //! V8_LIBC_MSVCRT

#endif  // V8_HOST_ARCH_IA32 || V8_HOST_ARCH_X64
}

}  // namespace internal
}  // namespace v8
