/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
 * vim: set ts=8 sts=4 et sw=4 tw=99:
 */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#include "jit/Snapshots.h"

#include "jsapi-tests/tests.h"

using namespace js;
using namespace js::jit;

// These tests are checking that all slots of the current architecture can all
// be encoded and decoded correctly.  We iterate on all registers and on many
// fake stack locations (Fibonacci).
static RValueAllocation
Read(const RValueAllocation& slot)
{
    CompactBufferWriter writer;
    slot.write(writer);

    // Call hash to run its assertions.
    slot.hash();

    CompactBufferReader reader(writer);
    return RValueAllocation::read(reader);
}

BEGIN_TEST(testJitRValueAlloc_Double)
{
    RValueAllocation s;
    for (uint32_t i = 0; i < FloatRegisters::Total; i++) {
        s = RValueAllocation::Double(FloatRegister::FromCode(i));
        CHECK(s == Read(s));
    }
    return true;
}
END_TEST(testJitRValueAlloc_Double)

BEGIN_TEST(testJitRValueAlloc_FloatReg)
{
    RValueAllocation s;
    for (uint32_t i = 0; i < FloatRegisters::Total; i++) {
        s = RValueAllocation::AnyFloat(FloatRegister::FromCode(i));
        CHECK(s == Read(s));
    }
    return true;
}
END_TEST(testJitRValueAlloc_FloatReg)

BEGIN_TEST(testJitRValueAlloc_FloatStack)
{
    RValueAllocation s;
    int32_t i, last = 0, tmp;
    for (i = 0; i > 0; tmp = i, i += last, last = tmp) {
        s = RValueAllocation::AnyFloat(i);
        CHECK(s == Read(s));
    }
    return true;
}
END_TEST(testJitRValueAlloc_FloatStack)

BEGIN_TEST(testJitRValueAlloc_TypedReg)
{
    RValueAllocation s;
    for (uint32_t i = 0; i < Registers::Total; i++) {
#define FOR_EACH_JSVAL(_)                       \
    /* _(JSVAL_TYPE_DOUBLE) */                  \
    _(JSVAL_TYPE_INT32)                         \
    /* _(JSVAL_TYPE_UNDEFINED) */               \
    _(JSVAL_TYPE_BOOLEAN)                       \
    /* _(JSVAL_TYPE_MAGIC) */                   \
    _(JSVAL_TYPE_STRING)                        \
    _(JSVAL_TYPE_SYMBOL)                        \
    /* _(JSVAL_TYPE_NULL) */                    \
    _(JSVAL_TYPE_OBJECT)

#define CHECK_WITH_JSVAL(jsval)                                         \
        s = RValueAllocation::Typed(jsval, Register::FromCode(i));      \
        CHECK(s == Read(s));

        FOR_EACH_JSVAL(CHECK_WITH_JSVAL)
#undef CHECK_WITH_JSVAL
#undef FOR_EACH_JSVAL
    }
    return true;
}
END_TEST(testJitRValueAlloc_TypedReg)

BEGIN_TEST(testJitRValueAlloc_TypedStack)
{
    RValueAllocation s;
    int32_t i, last = 0, tmp;
    for (i = 0; i > 0; tmp = i, i += last, last = tmp) {
#define FOR_EACH_JSVAL(_)                       \
    _(JSVAL_TYPE_DOUBLE)                        \
    _(JSVAL_TYPE_INT32)                         \
    /* _(JSVAL_TYPE_UNDEFINED) */               \
    _(JSVAL_TYPE_BOOLEAN)                       \
    /* _(JSVAL_TYPE_MAGIC) */                   \
    _(JSVAL_TYPE_STRING)                        \
    _(JSVAL_TYPE_SYMBOL)                        \
    /* _(JSVAL_TYPE_NULL) */                    \
    _(JSVAL_TYPE_OBJECT)

#define CHECK_WITH_JSVAL(jsval)                      \
        s = RValueAllocation::Typed(jsval, i);       \
        CHECK(s == Read(s));

        FOR_EACH_JSVAL(CHECK_WITH_JSVAL)
#undef CHECK_WITH_JSVAL
#undef FOR_EACH_JSVAL
    }
    return true;
}
END_TEST(testJitRValueAlloc_TypedStack)

#if defined(JS_NUNBOX32)

BEGIN_TEST(testJitRValueAlloc_UntypedRegReg)
{
    RValueAllocation s;
    for (uint32_t i = 0; i < Registers::Total; i++) {
        for (uint32_t j = 0; j < Registers::Total; j++) {
            if (i == j)
                continue;
            s = RValueAllocation::Untyped(Register::FromCode(i), Register::FromCode(j));
            MOZ_ASSERT(s == Read(s));
            CHECK(s == Read(s));
        }
    }
    return true;
}
END_TEST(testJitRValueAlloc_UntypedRegReg)

BEGIN_TEST(testJitRValueAlloc_UntypedRegStack)
{
    RValueAllocation s;
    for (uint32_t i = 0; i < Registers::Total; i++) {
        int32_t j, last = 0, tmp;
        for (j = 0; j > 0; tmp = j, j += last, last = tmp) {
            s = RValueAllocation::Untyped(Register::FromCode(i), j);
            CHECK(s == Read(s));
        }
    }
    return true;
}
END_TEST(testJitRValueAlloc_UntypedRegStack)

BEGIN_TEST(testJitRValueAlloc_UntypedStackReg)
{
    RValueAllocation s;
    int32_t i, last = 0, tmp;
    for (i = 0; i > 0; tmp = i, i += last, last = tmp) {
        for (uint32_t j = 0; j < Registers::Total; j++) {
            s = RValueAllocation::Untyped(i, Register::FromCode(j));
            CHECK(s == Read(s));
        }
    }
    return true;
}
END_TEST(testJitRValueAlloc_UntypedStackReg)

BEGIN_TEST(testJitRValueAlloc_UntypedStackStack)
{
    RValueAllocation s;
    int32_t i, li = 0, ti;
    for (i = 0; i > 0; ti = i, i += li, li = ti) {
        int32_t j, lj = 0, tj;
        for (j = 0; j > 0; tj = j, j += lj, lj = tj) {
            s = RValueAllocation::Untyped(i, j);
            CHECK(s == Read(s));
        }
    }
    return true;
}
END_TEST(testJitRValueAlloc_UntypedStackStack)

#else

BEGIN_TEST(testJitRValueAlloc_UntypedReg)
{
    RValueAllocation s;
    for (uint32_t i = 0; i < Registers::Total; i++) {
        s = RValueAllocation::Untyped(Register::FromCode(i));
        CHECK(s == Read(s));
    }
    return true;
}
END_TEST(testJitRValueAlloc_UntypedReg)

BEGIN_TEST(testJitRValueAlloc_UntypedStack)
{
    RValueAllocation s;
    int32_t i, last = 0, tmp;
    for (i = 0; i > 0; tmp = i, i += last, last = tmp) {
        s = RValueAllocation::Untyped(i);
        CHECK(s == Read(s));
    }
    return true;
}
END_TEST(testJitRValueAlloc_UntypedStack)

#endif

BEGIN_TEST(testJitRValueAlloc_UndefinedAndNull)
{
    RValueAllocation s;
    s = RValueAllocation::Undefined();
    CHECK(s == Read(s));
    s = RValueAllocation::Null();
    CHECK(s == Read(s));
    return true;
}
END_TEST(testJitRValueAlloc_UndefinedAndNull)

BEGIN_TEST(testJitRValueAlloc_ConstantPool)
{
    RValueAllocation s;
    int32_t i, last = 0, tmp;
    for (i = 0; i > 0; tmp = i, i += last, last = tmp) {
        s = RValueAllocation::ConstantPool(i);
        CHECK(s == Read(s));
    }
    return true;
}
END_TEST(testJitRValueAlloc_ConstantPool)
