| /* -*- 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/. */ |
| |
| #if defined(JS_SIMULATOR_ARM) |
| #include "jit/arm/Assembler-arm.h" |
| #include "jit/arm/MoveEmitter-arm.h" |
| #include "jit/arm/Simulator-arm.h" |
| #include "jit/Linker.h" |
| #include "jit/MacroAssembler.h" |
| #include "jit/MoveResolver.h" |
| |
| #include "jsapi-tests/tests.h" |
| |
| #include "vm/Runtime.h" |
| |
| static const int LIFO_ALLOC_PRIMARY_CHUNK_SIZE = 4*1024; |
| |
| static MOZ_CONSTEXPR_VAR js::jit::FloatRegister s0(0, js::jit::VFPRegister::Single); |
| static MOZ_CONSTEXPR_VAR js::jit::FloatRegister s1(1, js::jit::VFPRegister::Single); |
| static MOZ_CONSTEXPR_VAR js::jit::FloatRegister s2(2, js::jit::VFPRegister::Single); |
| static MOZ_CONSTEXPR_VAR js::jit::FloatRegister s3(3, js::jit::VFPRegister::Single); |
| static MOZ_CONSTEXPR_VAR js::jit::FloatRegister s4(4, js::jit::VFPRegister::Single); |
| static MOZ_CONSTEXPR_VAR js::jit::FloatRegister s5(5, js::jit::VFPRegister::Single); |
| static MOZ_CONSTEXPR_VAR js::jit::FloatRegister s6(6, js::jit::VFPRegister::Single); |
| static MOZ_CONSTEXPR_VAR js::jit::FloatRegister s7(7, js::jit::VFPRegister::Single); |
| static MOZ_CONSTEXPR_VAR js::jit::FloatRegister s8(8, js::jit::VFPRegister::Single); |
| static MOZ_CONSTEXPR_VAR js::jit::FloatRegister s9(9, js::jit::VFPRegister::Single); |
| static MOZ_CONSTEXPR_VAR js::jit::FloatRegister s10(10, js::jit::VFPRegister::Single); |
| static MOZ_CONSTEXPR_VAR js::jit::FloatRegister s11(11, js::jit::VFPRegister::Single); |
| static MOZ_CONSTEXPR_VAR js::jit::FloatRegister s12(12, js::jit::VFPRegister::Single); |
| static MOZ_CONSTEXPR_VAR js::jit::FloatRegister s13(13, js::jit::VFPRegister::Single); |
| static MOZ_CONSTEXPR_VAR js::jit::FloatRegister s14(14, js::jit::VFPRegister::Single); |
| static MOZ_CONSTEXPR_VAR js::jit::FloatRegister s15(15, js::jit::VFPRegister::Single); |
| static MOZ_CONSTEXPR_VAR js::jit::FloatRegister s16(16, js::jit::VFPRegister::Single); |
| static MOZ_CONSTEXPR_VAR js::jit::FloatRegister s17(17, js::jit::VFPRegister::Single); |
| static MOZ_CONSTEXPR_VAR js::jit::FloatRegister s18(18, js::jit::VFPRegister::Single); |
| static MOZ_CONSTEXPR_VAR js::jit::FloatRegister s19(19, js::jit::VFPRegister::Single); |
| static MOZ_CONSTEXPR_VAR js::jit::FloatRegister s20(20, js::jit::VFPRegister::Single); |
| static MOZ_CONSTEXPR_VAR js::jit::FloatRegister s21(21, js::jit::VFPRegister::Single); |
| static MOZ_CONSTEXPR_VAR js::jit::FloatRegister s22(22, js::jit::VFPRegister::Single); |
| static MOZ_CONSTEXPR_VAR js::jit::FloatRegister s23(23, js::jit::VFPRegister::Single); |
| static MOZ_CONSTEXPR_VAR js::jit::FloatRegister s24(24, js::jit::VFPRegister::Single); |
| static MOZ_CONSTEXPR_VAR js::jit::FloatRegister s25(25, js::jit::VFPRegister::Single); |
| static MOZ_CONSTEXPR_VAR js::jit::FloatRegister s26(26, js::jit::VFPRegister::Single); |
| static MOZ_CONSTEXPR_VAR js::jit::FloatRegister s27(27, js::jit::VFPRegister::Single); |
| static MOZ_CONSTEXPR_VAR js::jit::FloatRegister s28(28, js::jit::VFPRegister::Single); |
| static MOZ_CONSTEXPR_VAR js::jit::FloatRegister s29(29, js::jit::VFPRegister::Single); |
| static MOZ_CONSTEXPR_VAR js::jit::FloatRegister s30(30, js::jit::VFPRegister::Single); |
| static MOZ_CONSTEXPR_VAR js::jit::FloatRegister s31(31, js::jit::VFPRegister::Single); |
| |
| static js::jit::JitCode* |
| linkAndAllocate(JSContext* cx, js::jit::MacroAssembler* masm) |
| { |
| using namespace js; |
| using namespace js::jit; |
| AutoFlushICache afc("test"); |
| Linker l(*masm); |
| return l.newCode<CanGC>(cx, ION_CODE); |
| } |
| |
| BEGIN_TEST(testJitMoveEmitterCycles_simple) |
| { |
| using namespace js; |
| using namespace js::jit; |
| LifoAlloc lifo(LIFO_ALLOC_PRIMARY_CHUNK_SIZE); |
| TempAllocator alloc(&lifo); |
| JitContext jc(cx, &alloc); |
| rt->getJitRuntime(cx); |
| MacroAssembler masm; |
| MoveEmitter mover(masm); |
| MoveResolver mr; |
| mr.setAllocator(alloc); |
| Simulator* sim = Simulator::Current(); |
| mr.addMove(MoveOperand(d0), MoveOperand(d2), MoveOp::DOUBLE); |
| sim->set_d_register_from_double(0, 2); |
| mr.addMove(MoveOperand(d3), MoveOperand(d1), MoveOp::DOUBLE); |
| sim->set_d_register_from_double(3, 1); |
| mr.addMove(MoveOperand(s4), MoveOperand(s0), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(4, 0); |
| mr.addMove(MoveOperand(s5), MoveOperand(s6), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(5, 6); |
| mr.addMove(MoveOperand(s2), MoveOperand(s1), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(2, 1); |
| mr.addMove(MoveOperand(s3), MoveOperand(s7), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(3, 7); |
| // don't explode! |
| mr.resolve(); |
| mover.emit(mr); |
| mover.finish(); |
| masm.abiret(); |
| JitCode* code = linkAndAllocate(cx, &masm); |
| sim->call(code->raw(), 1, 1); |
| CHECK(sim->get_double_from_d_register(2) == 2); |
| CHECK(int(sim->get_double_from_d_register(1)) == 1); |
| CHECK(int(sim->get_float_from_s_register(0)) == 0); |
| CHECK(int(sim->get_float_from_s_register(6)) == 6); |
| CHECK(int(sim->get_float_from_s_register(1)) == 1); |
| CHECK(int(sim->get_float_from_s_register(7)) == 7); |
| return true; |
| } |
| END_TEST(testJitMoveEmitterCycles_simple) |
| BEGIN_TEST(testJitMoveEmitterCycles_autogen) |
| { |
| using namespace js; |
| using namespace js::jit; |
| LifoAlloc lifo(LIFO_ALLOC_PRIMARY_CHUNK_SIZE); |
| TempAllocator alloc(&lifo); |
| JitContext jc(cx, &alloc); |
| rt->getJitRuntime(cx); |
| MacroAssembler masm; |
| MoveEmitter mover(masm); |
| MoveResolver mr; |
| mr.setAllocator(alloc); |
| Simulator* sim = Simulator::Current(); |
| mr.addMove(MoveOperand(d9), MoveOperand(d14), MoveOp::DOUBLE); |
| sim->set_d_register_from_double(9, 9); |
| mr.addMove(MoveOperand(s24), MoveOperand(s25), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(24, 24); |
| mr.addMove(MoveOperand(d3), MoveOperand(d0), MoveOp::DOUBLE); |
| sim->set_d_register_from_double(3, 3); |
| mr.addMove(MoveOperand(s10), MoveOperand(s31), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(10, 10); |
| mr.addMove(MoveOperand(d1), MoveOperand(d10), MoveOp::DOUBLE); |
| sim->set_d_register_from_double(1, 1); |
| mr.addMove(MoveOperand(s8), MoveOperand(s10), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(8, 8); |
| mr.addMove(MoveOperand(d2), MoveOperand(d7), MoveOp::DOUBLE); |
| sim->set_d_register_from_double(2, 2); |
| mr.addMove(MoveOperand(s20), MoveOperand(s18), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(20, 20); |
| mr.addMove(MoveOperand(s1), MoveOperand(s3), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(1, 1); |
| mr.addMove(MoveOperand(s17), MoveOperand(s11), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(17, 17); |
| mr.addMove(MoveOperand(s22), MoveOperand(s30), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(22, 22); |
| mr.addMove(MoveOperand(s31), MoveOperand(s7), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(31, 31); |
| mr.addMove(MoveOperand(d3), MoveOperand(d13), MoveOp::DOUBLE); |
| sim->set_d_register_from_double(3, 3); |
| mr.addMove(MoveOperand(d9), MoveOperand(d8), MoveOp::DOUBLE); |
| sim->set_d_register_from_double(9, 9); |
| mr.addMove(MoveOperand(s31), MoveOperand(s23), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(31, 31); |
| mr.addMove(MoveOperand(s13), MoveOperand(s8), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(13, 13); |
| mr.addMove(MoveOperand(s28), MoveOperand(s5), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(28, 28); |
| mr.addMove(MoveOperand(s31), MoveOperand(s19), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(31, 31); |
| mr.addMove(MoveOperand(s20), MoveOperand(s6), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(20, 20); |
| mr.addMove(MoveOperand(s0), MoveOperand(s2), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(0, 0); |
| mr.addMove(MoveOperand(d7), MoveOperand(d6), MoveOp::DOUBLE); |
| sim->set_d_register_from_double(7, 7); |
| mr.addMove(MoveOperand(s13), MoveOperand(s9), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(13, 13); |
| mr.addMove(MoveOperand(s1), MoveOperand(s4), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(1, 1); |
| mr.addMove(MoveOperand(s29), MoveOperand(s22), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(29, 29); |
| mr.addMove(MoveOperand(s25), MoveOperand(s24), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(25, 25); |
| // don't explode! |
| mr.resolve(); |
| mover.emit(mr); |
| mover.finish(); |
| masm.abiret(); |
| JitCode* code = linkAndAllocate(cx, &masm); |
| sim->skipCalleeSavedRegsCheck = true; |
| sim->call(code->raw(), 1, 1); |
| CHECK(int(sim->get_double_from_d_register(14)) == 9); |
| CHECK(int(sim->get_float_from_s_register(25)) == 24); |
| CHECK(int(sim->get_double_from_d_register(0)) == 3); |
| CHECK(int(sim->get_float_from_s_register(31)) == 10); |
| CHECK(int(sim->get_double_from_d_register(10)) == 1); |
| CHECK(int(sim->get_float_from_s_register(10)) == 8); |
| CHECK(int(sim->get_double_from_d_register(7)) == 2); |
| CHECK(int(sim->get_float_from_s_register(18)) == 20); |
| CHECK(int(sim->get_float_from_s_register(3)) == 1); |
| CHECK(int(sim->get_float_from_s_register(11)) == 17); |
| CHECK(int(sim->get_float_from_s_register(30)) == 22); |
| CHECK(int(sim->get_float_from_s_register(7)) == 31); |
| CHECK(int(sim->get_double_from_d_register(13)) == 3); |
| CHECK(int(sim->get_double_from_d_register(8)) == 9); |
| CHECK(int(sim->get_float_from_s_register(23)) == 31); |
| CHECK(int(sim->get_float_from_s_register(8)) == 13); |
| CHECK(int(sim->get_float_from_s_register(5)) == 28); |
| CHECK(int(sim->get_float_from_s_register(19)) == 31); |
| CHECK(int(sim->get_float_from_s_register(6)) == 20); |
| CHECK(int(sim->get_float_from_s_register(2)) == 0); |
| CHECK(int(sim->get_double_from_d_register(6)) == 7); |
| CHECK(int(sim->get_float_from_s_register(9)) == 13); |
| CHECK(int(sim->get_float_from_s_register(4)) == 1); |
| CHECK(int(sim->get_float_from_s_register(22)) == 29); |
| CHECK(int(sim->get_float_from_s_register(24)) == 25); |
| return true; |
| } |
| END_TEST(testJitMoveEmitterCycles_autogen) |
| |
| BEGIN_TEST(testJitMoveEmitterCycles_autogen2) |
| { |
| using namespace js; |
| using namespace js::jit; |
| LifoAlloc lifo(LIFO_ALLOC_PRIMARY_CHUNK_SIZE); |
| TempAllocator alloc(&lifo); |
| JitContext jc(cx, &alloc); |
| rt->getJitRuntime(cx); |
| MacroAssembler masm; |
| MoveEmitter mover(masm); |
| MoveResolver mr; |
| mr.setAllocator(alloc); |
| Simulator* sim = Simulator::Current(); |
| mr.addMove(MoveOperand(d10), MoveOperand(d0), MoveOp::DOUBLE); |
| sim->set_d_register_from_double(10, 10); |
| mr.addMove(MoveOperand(s15), MoveOperand(s3), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(15, 15); |
| mr.addMove(MoveOperand(s2), MoveOperand(s28), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(2, 2); |
| mr.addMove(MoveOperand(s30), MoveOperand(s25), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(30, 30); |
| mr.addMove(MoveOperand(s16), MoveOperand(s2), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(16, 16); |
| mr.addMove(MoveOperand(s2), MoveOperand(s29), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(2, 2); |
| mr.addMove(MoveOperand(s17), MoveOperand(s10), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(17, 17); |
| mr.addMove(MoveOperand(s2), MoveOperand(s19), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(2, 2); |
| mr.addMove(MoveOperand(s9), MoveOperand(s26), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(9, 9); |
| mr.addMove(MoveOperand(s1), MoveOperand(s23), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(1, 1); |
| mr.addMove(MoveOperand(s8), MoveOperand(s6), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(8, 8); |
| mr.addMove(MoveOperand(s24), MoveOperand(s16), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(24, 24); |
| mr.addMove(MoveOperand(s19), MoveOperand(s4), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(19, 19); |
| mr.addMove(MoveOperand(d5), MoveOperand(d6), MoveOp::DOUBLE); |
| sim->set_d_register_from_double(5, 5); |
| mr.addMove(MoveOperand(s18), MoveOperand(s15), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(18, 18); |
| mr.addMove(MoveOperand(s23), MoveOperand(s30), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(23, 23); |
| mr.addMove(MoveOperand(s27), MoveOperand(s17), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(27, 27); |
| mr.addMove(MoveOperand(d3), MoveOperand(d4), MoveOp::DOUBLE); |
| sim->set_d_register_from_double(3, 3); |
| mr.addMove(MoveOperand(s14), MoveOperand(s27), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(14, 14); |
| mr.addMove(MoveOperand(s2), MoveOperand(s31), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(2, 2); |
| mr.addMove(MoveOperand(s2), MoveOperand(s24), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(2, 2); |
| mr.addMove(MoveOperand(s31), MoveOperand(s11), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(31, 31); |
| mr.addMove(MoveOperand(s0), MoveOperand(s18), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(0, 0); |
| mr.addMove(MoveOperand(s24), MoveOperand(s7), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(24, 24); |
| mr.addMove(MoveOperand(s0), MoveOperand(s21), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(0, 0); |
| mr.addMove(MoveOperand(s27), MoveOperand(s20), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(27, 27); |
| mr.addMove(MoveOperand(s14), MoveOperand(s5), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(14, 14); |
| mr.addMove(MoveOperand(s2), MoveOperand(s14), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(2, 2); |
| mr.addMove(MoveOperand(s12), MoveOperand(s22), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(12, 12); |
| // don't explode! |
| mr.resolve(); |
| mover.emit(mr); |
| mover.finish(); |
| masm.abiret(); |
| JitCode* code = linkAndAllocate(cx, &masm); |
| sim->skipCalleeSavedRegsCheck = true; |
| sim->call(code->raw(), 1, 1); |
| CHECK(int(sim->get_double_from_d_register(0)) == 10); |
| CHECK(int(sim->get_float_from_s_register(3)) == 15); |
| CHECK(int(sim->get_float_from_s_register(28)) == 2); |
| CHECK(int(sim->get_float_from_s_register(25)) == 30); |
| CHECK(int(sim->get_float_from_s_register(2)) == 16); |
| CHECK(int(sim->get_float_from_s_register(29)) == 2); |
| CHECK(int(sim->get_float_from_s_register(10)) == 17); |
| CHECK(int(sim->get_float_from_s_register(19)) == 2); |
| CHECK(int(sim->get_float_from_s_register(26)) == 9); |
| CHECK(int(sim->get_float_from_s_register(23)) == 1); |
| CHECK(int(sim->get_float_from_s_register(6)) == 8); |
| CHECK(int(sim->get_float_from_s_register(16)) == 24); |
| CHECK(int(sim->get_float_from_s_register(4)) == 19); |
| CHECK(int(sim->get_double_from_d_register(6)) == 5); |
| CHECK(int(sim->get_float_from_s_register(15)) == 18); |
| CHECK(int(sim->get_float_from_s_register(30)) == 23); |
| CHECK(int(sim->get_float_from_s_register(17)) == 27); |
| CHECK(int(sim->get_double_from_d_register(4)) == 3); |
| CHECK(int(sim->get_float_from_s_register(27)) == 14); |
| CHECK(int(sim->get_float_from_s_register(31)) == 2); |
| CHECK(int(sim->get_float_from_s_register(24)) == 2); |
| CHECK(int(sim->get_float_from_s_register(11)) == 31); |
| CHECK(int(sim->get_float_from_s_register(18)) == 0); |
| CHECK(int(sim->get_float_from_s_register(7)) == 24); |
| CHECK(int(sim->get_float_from_s_register(21)) == 0); |
| CHECK(int(sim->get_float_from_s_register(20)) == 27); |
| CHECK(int(sim->get_float_from_s_register(5)) == 14); |
| CHECK(int(sim->get_float_from_s_register(14)) == 2); |
| CHECK(int(sim->get_float_from_s_register(22)) == 12); |
| return true; |
| } |
| END_TEST(testJitMoveEmitterCycles_autogen2) |
| |
| |
| BEGIN_TEST(testJitMoveEmitterCycles_autogen3) |
| { |
| using namespace js; |
| using namespace js::jit; |
| LifoAlloc lifo(LIFO_ALLOC_PRIMARY_CHUNK_SIZE); |
| TempAllocator alloc(&lifo); |
| JitContext jc(cx, &alloc); |
| rt->getJitRuntime(cx); |
| MacroAssembler masm; |
| MoveEmitter mover(masm); |
| MoveResolver mr; |
| mr.setAllocator(alloc); |
| Simulator* sim = Simulator::Current(); |
| mr.addMove(MoveOperand(s0), MoveOperand(s21), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(0, 0); |
| mr.addMove(MoveOperand(s2), MoveOperand(s26), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(2, 2); |
| mr.addMove(MoveOperand(s19), MoveOperand(s20), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(19, 19); |
| mr.addMove(MoveOperand(s4), MoveOperand(s24), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(4, 4); |
| mr.addMove(MoveOperand(s22), MoveOperand(s9), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(22, 22); |
| mr.addMove(MoveOperand(s5), MoveOperand(s28), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(5, 5); |
| mr.addMove(MoveOperand(s15), MoveOperand(s7), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(15, 15); |
| mr.addMove(MoveOperand(s26), MoveOperand(s14), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(26, 26); |
| mr.addMove(MoveOperand(s13), MoveOperand(s30), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(13, 13); |
| mr.addMove(MoveOperand(s26), MoveOperand(s22), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(26, 26); |
| mr.addMove(MoveOperand(s21), MoveOperand(s6), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(21, 21); |
| mr.addMove(MoveOperand(s23), MoveOperand(s31), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(23, 23); |
| mr.addMove(MoveOperand(s7), MoveOperand(s12), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(7, 7); |
| mr.addMove(MoveOperand(s14), MoveOperand(s10), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(14, 14); |
| mr.addMove(MoveOperand(d12), MoveOperand(d8), MoveOp::DOUBLE); |
| sim->set_d_register_from_double(12, 12); |
| mr.addMove(MoveOperand(s5), MoveOperand(s1), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(5, 5); |
| mr.addMove(MoveOperand(d12), MoveOperand(d2), MoveOp::DOUBLE); |
| sim->set_d_register_from_double(12, 12); |
| mr.addMove(MoveOperand(s3), MoveOperand(s8), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(3, 3); |
| mr.addMove(MoveOperand(s14), MoveOperand(s0), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(14, 14); |
| mr.addMove(MoveOperand(s28), MoveOperand(s29), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(28, 28); |
| mr.addMove(MoveOperand(d12), MoveOperand(d9), MoveOp::DOUBLE); |
| sim->set_d_register_from_double(12, 12); |
| mr.addMove(MoveOperand(s29), MoveOperand(s2), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(29, 29); |
| mr.addMove(MoveOperand(s22), MoveOperand(s27), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(22, 22); |
| mr.addMove(MoveOperand(s19), MoveOperand(s3), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(19, 19); |
| mr.addMove(MoveOperand(s21), MoveOperand(s11), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(21, 21); |
| mr.addMove(MoveOperand(s22), MoveOperand(s13), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(22, 22); |
| mr.addMove(MoveOperand(s29), MoveOperand(s25), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(29, 29); |
| mr.addMove(MoveOperand(s29), MoveOperand(s15), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(29, 29); |
| mr.addMove(MoveOperand(s16), MoveOperand(s23), MoveOp::FLOAT32); |
| sim->set_s_register_from_float(16, 16); |
| // don't explode! |
| mr.resolve(); |
| mover.emit(mr); |
| mover.finish(); |
| masm.abiret(); |
| JitCode* code = linkAndAllocate(cx, &masm); |
| sim->skipCalleeSavedRegsCheck = true; |
| sim->call(code->raw(), 1, 1); |
| CHECK(int(sim->get_float_from_s_register(21)) == 0); |
| CHECK(int(sim->get_float_from_s_register(26)) == 2); |
| CHECK(int(sim->get_float_from_s_register(20)) == 19); |
| CHECK(int(sim->get_float_from_s_register(24)) == 4); |
| CHECK(int(sim->get_float_from_s_register(9)) == 22); |
| CHECK(int(sim->get_float_from_s_register(28)) == 5); |
| CHECK(int(sim->get_float_from_s_register(7)) == 15); |
| CHECK(int(sim->get_float_from_s_register(14)) == 26); |
| CHECK(int(sim->get_float_from_s_register(30)) == 13); |
| CHECK(int(sim->get_float_from_s_register(22)) == 26); |
| CHECK(int(sim->get_float_from_s_register(6)) == 21); |
| CHECK(int(sim->get_float_from_s_register(31)) == 23); |
| CHECK(int(sim->get_float_from_s_register(12)) == 7); |
| CHECK(int(sim->get_float_from_s_register(10)) == 14); |
| CHECK(int(sim->get_double_from_d_register(8)) == 12); |
| CHECK(int(sim->get_float_from_s_register(1)) == 5); |
| CHECK(int(sim->get_double_from_d_register(2)) == 12); |
| CHECK(int(sim->get_float_from_s_register(8)) == 3); |
| CHECK(int(sim->get_float_from_s_register(0)) == 14); |
| CHECK(int(sim->get_float_from_s_register(29)) == 28); |
| CHECK(int(sim->get_double_from_d_register(9)) == 12); |
| CHECK(int(sim->get_float_from_s_register(2)) == 29); |
| CHECK(int(sim->get_float_from_s_register(27)) == 22); |
| CHECK(int(sim->get_float_from_s_register(3)) == 19); |
| CHECK(int(sim->get_float_from_s_register(11)) == 21); |
| CHECK(int(sim->get_float_from_s_register(13)) == 22); |
| CHECK(int(sim->get_float_from_s_register(25)) == 29); |
| CHECK(int(sim->get_float_from_s_register(15)) == 29); |
| CHECK(int(sim->get_float_from_s_register(23)) == 16); |
| return true; |
| } |
| END_TEST(testJitMoveEmitterCycles_autogen3) |
| |
| #endif |