1b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Copyright 2013 the V8 project authors. All rights reserved. 2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Redistribution and use in source and binary forms, with or without 3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// modification, are permitted provided that the following conditions are 4b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// met: 5b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// 6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// * Redistributions of source code must retain the above copyright 7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// notice, this list of conditions and the following disclaimer. 8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// * Redistributions in binary form must reproduce the above 9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// copyright notice, this list of conditions and the following 10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// disclaimer in the documentation and/or other materials provided 11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// with the distribution. 12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// * Neither the name of Google Inc. nor the names of its 13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// contributors may be used to endorse or promote products derived 14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// from this software without specific prior written permission. 15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// 16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include <stdio.h> 29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include <stdlib.h> 30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include <string.h> 31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include <cmath> 32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include <limits> 33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/v8.h" 35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/arm64/decoder-arm64-inl.h" 37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/arm64/disasm-arm64.h" 38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/arm64/simulator-arm64.h" 39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/arm64/utils-arm64.h" 40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/macro-assembler.h" 41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "test/cctest/cctest.h" 42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "test/cctest/test-utils-arm64.h" 43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochusing namespace v8::internal; 45b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Test infrastructure. 47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// 48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Tests are functions which accept no parameters and have no return values. 49b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// The testing code should not perform an explicit return once completed. For 50b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// example to test the mov immediate instruction a very simple test would be: 51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// 52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// TEST(mov_x0_one) { 53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// SETUP(); 54b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// 55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// START(); 56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// __ mov(x0, Operand(1)); 57b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// END(); 58b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// 59b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// RUN(); 60b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// 61b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// CHECK_EQUAL_64(1, x0); 62b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// 63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// TEARDOWN(); 64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// } 65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// 66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Within a START ... END block all registers but sp can be modified. sp has to 67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// be explicitly saved/restored. The END() macro replaces the function return 68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// so it may appear multiple times in a test if the test has multiple exit 69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// points. 70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// 71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Once the test has been run all integer and floating point registers as well 72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// as flags are accessible through a RegisterDump instance, see 73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// utils-arm64.cc for more info on RegisterDump. 74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// 75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// We provide some helper assert to handle common cases: 76b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// 77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// CHECK_EQUAL_32(int32_t, int_32t) 78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// CHECK_EQUAL_FP32(float, float) 79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// CHECK_EQUAL_32(int32_t, W register) 80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// CHECK_EQUAL_FP32(float, S register) 81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// CHECK_EQUAL_64(int64_t, int_64t) 82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// CHECK_EQUAL_FP64(double, double) 83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// CHECK_EQUAL_64(int64_t, X register) 84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// CHECK_EQUAL_64(X register, X register) 85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// CHECK_EQUAL_FP64(double, D register) 86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// 87b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// e.g. CHECK_EQUAL_64(0.5, d30); 88b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// 89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// If more advance computation is required before the assert then access the 90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// RegisterDump named core directly: 91b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// 92b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// CHECK_EQUAL_64(0x1234, core.xreg(0) & 0xffff); 93b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 94b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 95b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#if 0 // TODO(all): enable. 96b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic v8::Persistent<v8::Context> env; 97b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 98b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic void InitializeVM() { 99b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (env.IsEmpty()) { 100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch env = v8::Context::New(); 101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define __ masm. 106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define BUF_SIZE 8192 108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define SETUP() SETUP_SIZE(BUF_SIZE) 109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define INIT_V8() \ 111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CcTest::InitializeVM(); \ 112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef USE_SIMULATOR 114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Run tests with the simulator. 116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define SETUP_SIZE(buf_size) \ 117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Isolate* isolate = Isolate::Current(); \ 118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HandleScope scope(isolate); \ 119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(isolate != NULL); \ 120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch byte* buf = new byte[buf_size]; \ 121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MacroAssembler masm(isolate, buf, buf_size); \ 122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Decoder<DispatchingDecoderVisitor>* decoder = \ 123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new Decoder<DispatchingDecoderVisitor>(); \ 124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Simulator simulator(decoder); \ 125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PrintDisassembler* pdis = NULL; \ 126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RegisterDump core; 127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch/* if (Cctest::trace_sim()) { \ 129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch pdis = new PrintDisassembler(stdout); \ 130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch decoder.PrependVisitor(pdis); \ 131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } \ 132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Reset the assembler and simulator, so that instructions can be generated, 135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// but don't actually emit any code. This can be used by tests that need to 136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// emit instructions at the start of the buffer. Note that START_AFTER_RESET 137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// must be called before any callee-saved register is modified, and before an 138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// END is encountered. 139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// 140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Most tests should call START, rather than call RESET directly. 141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define RESET() \ 142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Reset(); \ 143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch simulator.ResetState(); 144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define START_AFTER_RESET() \ 146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ SetStackPointer(csp); \ 147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ PushCalleeSavedRegisters(); \ 148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Debug("Start test.", __LINE__, TRACE_ENABLE | LOG_ALL); 149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define START() \ 151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RESET(); \ 152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START_AFTER_RESET(); 153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define RUN() \ 155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch simulator.RunFrom(reinterpret_cast<Instruction*>(buf)) 156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define END() \ 158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Debug("End test.", __LINE__, TRACE_DISABLE | LOG_ALL); \ 159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch core.Dump(&masm); \ 160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ PopCalleeSavedRegisters(); \ 161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ret(); \ 162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ GetCode(NULL); 163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define TEARDOWN() \ 165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch delete pdis; \ 166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch delete[] buf; 167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#else // ifdef USE_SIMULATOR. 169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Run the test on real hardware or models. 170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define SETUP_SIZE(buf_size) \ 171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Isolate* isolate = Isolate::Current(); \ 172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HandleScope scope(isolate); \ 173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(isolate != NULL); \ 174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch byte* buf = new byte[buf_size]; \ 175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MacroAssembler masm(isolate, buf, buf_size); \ 176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RegisterDump core; 177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define RESET() \ 179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Reset(); \ 180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /* Reset the machine state (like simulator.ResetState()). */ \ 181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Msr(NZCV, xzr); \ 182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Msr(FPCR, xzr); 183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define START_AFTER_RESET() \ 186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ SetStackPointer(csp); \ 187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ PushCalleeSavedRegisters(); 188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define START() \ 190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RESET(); \ 191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START_AFTER_RESET(); 192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define RUN() \ 194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CpuFeatures::FlushICache(buf, masm.SizeOfGeneratedCode()); \ 195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { \ 196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void (*test_function)(void); \ 197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch memcpy(&test_function, &buf, sizeof(buf)); \ 198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch test_function(); \ 199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define END() \ 202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch core.Dump(&masm); \ 203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ PopCalleeSavedRegisters(); \ 204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ret(); \ 205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ GetCode(NULL); 206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define TEARDOWN() \ 208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch delete[] buf; 209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif // ifdef USE_SIMULATOR. 211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define CHECK_EQUAL_NZCV(expected) \ 213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(EqualNzcv(expected, core.flags_nzcv())) 214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define CHECK_EQUAL_REGISTERS(expected) \ 216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(EqualRegisters(&expected, &core)) 217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define CHECK_EQUAL_32(expected, result) \ 219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(Equal32(static_cast<uint32_t>(expected), &core, result)) 220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define CHECK_EQUAL_FP32(expected, result) \ 222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(EqualFP32(expected, &core, result)) 223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define CHECK_EQUAL_64(expected, result) \ 225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(Equal64(expected, &core, result)) 226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define CHECK_EQUAL_FP64(expected, result) \ 228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(EqualFP64(expected, &core, result)) 229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef DEBUG 231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define DCHECK_LITERAL_POOL_SIZE(expected) \ 232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK((expected) == (__ LiteralPoolSize())) 233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#else 234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define DCHECK_LITERAL_POOL_SIZE(expected) \ 235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ((void) 0) 236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(stack_ops) { 240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // save csp. 245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x29, csp); 246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Set the csp to a known value. 248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x16, 0x1000); 249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(csp, x16); 250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, csp); 251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Add immediate to the csp, and move the result to a normal register. 253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(csp, csp, Operand(0x50)); 254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, csp); 255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Add extended to the csp, and move the result to a normal register. 257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x17, 0xfff); 258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(csp, csp, Operand(x17, SXTB)); 259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x2, csp); 260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Create an csp using a logical instruction, and move to normal register. 262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Orr(csp, xzr, Operand(0x1fff)); 263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x3, csp); 264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Write wcsp using a logical instruction. 266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Orr(wcsp, wzr, Operand(0xfffffff8L)); 267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x4, csp); 268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Write csp, and read back wcsp. 270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Orr(csp, xzr, Operand(0xfffffff8L)); 271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w5, wcsp); 272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // restore csp. 274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(csp, x29); 275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x1000, x0); 280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x1050, x1); 281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x104f, x2); 282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x1fff, x3); 283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfffffff8, x4); 284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfffffff8, x5); 285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(mvn) { 291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mvn(w0, 0xfff); 296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mvn(x1, 0xfff); 297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mvn(w2, Operand(w0, LSL, 1)); 298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mvn(x3, Operand(x1, LSL, 2)); 299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mvn(w4, Operand(w0, LSR, 3)); 300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mvn(x5, Operand(x1, LSR, 4)); 301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mvn(w6, Operand(w0, ASR, 11)); 302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mvn(x7, Operand(x1, ASR, 12)); 303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mvn(w8, Operand(w0, ROR, 13)); 304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mvn(x9, Operand(x1, ROR, 14)); 305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mvn(w10, Operand(w2, UXTB)); 306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mvn(x11, Operand(x2, SXTB, 1)); 307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mvn(w12, Operand(w2, UXTH, 2)); 308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mvn(x13, Operand(x2, SXTH, 3)); 309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mvn(x14, Operand(w2, UXTW, 4)); 310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mvn(x15, Operand(w2, SXTW, 4)); 311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfffff000, x0); 316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfffffffffffff000UL, x1); 317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x00001fff, x2); 318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0000000000003fffUL, x3); 319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xe00001ff, x4); 320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xf0000000000000ffUL, x5); 321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x00000001, x6); 322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0, x7); 323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x7ff80000, x8); 324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x3ffc000000000000UL, x9); 325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffff00, x10); 326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0000000000000001UL, x11); 327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffff8003, x12); 328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffffffff0007UL, x13); 329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfffffffffffe000fUL, x14); 330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfffffffffffe000fUL, x15); 331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(mov) { 337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0xffffffffffffffffL); 342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 0xffffffffffffffffL); 343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x2, 0xffffffffffffffffL); 344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x3, 0xffffffffffffffffL); 345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0x0123456789abcdefL); 347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ movz(x1, 0xabcdL << 16); 349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ movk(x2, 0xabcdL << 32); 350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ movn(x3, 0xabcdL << 48); 351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x4, 0x0123456789abcdefL); 353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x5, x4); 354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w6, -1); 356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Test that moves back to the same register have the desired effect. This 358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // is a no-op for X registers, and a truncation for W registers. 359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x7, 0x0123456789abcdefL); 360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x7, x7); 361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x8, 0x0123456789abcdefL); 362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w8, w8); 363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x9, 0x0123456789abcdefL); 364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x9, Operand(x9)); 365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x10, 0x0123456789abcdefL); 366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w10, Operand(w10)); 367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w11, 0xfff); 369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x12, 0xfff); 370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w13, Operand(w11, LSL, 1)); 371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x14, Operand(x12, LSL, 2)); 372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w15, Operand(w11, LSR, 3)); 373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x18, Operand(x12, LSR, 4)); 374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w19, Operand(w11, ASR, 11)); 375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x20, Operand(x12, ASR, 12)); 376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w21, Operand(w11, ROR, 13)); 377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x22, Operand(x12, ROR, 14)); 378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w23, Operand(w13, UXTB)); 379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x24, Operand(x13, SXTB, 1)); 380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w25, Operand(w13, UXTH, 2)); 381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x26, Operand(x13, SXTH, 3)); 382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x27, Operand(w13, UXTW, 4)); 383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0123456789abcdefL, x0); 388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x00000000abcd0000L, x1); 389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffabcdffffffffL, x2); 390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x5432ffffffffffffL, x3); 391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(x4, x5); 392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(-1, w6); 393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0123456789abcdefL, x7); 394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0x89abcdefL, w8); 395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0123456789abcdefL, x9); 396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0x89abcdefL, w10); 397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x00000fff, x11); 398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0000000000000fffUL, x12); 399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x00001ffe, x13); 400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0000000000003ffcUL, x14); 401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x000001ff, x15); 402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x00000000000000ffUL, x18); 403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x00000001, x19); 404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0, x20); 405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x7ff80000, x21); 406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x3ffc000000000000UL, x22); 407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x000000fe, x23); 408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfffffffffffffffcUL, x24); 409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x00007ff8, x25); 410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x000000000000fff0UL, x26); 411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x000000000001ffe0UL, x27); 412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(mov_imm_w) { 418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w0, 0xffffffffL); 423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w1, 0xffff1234L); 424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w2, 0x1234ffffL); 425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w3, 0x00000000L); 426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w4, 0x00001234L); 427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w5, 0x12340000L); 428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w6, 0x12345678L); 429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w7, (int32_t)0x80000000); 430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w8, (int32_t)0xffff0000); 431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w9, kWMinInt); 432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffffL, x0); 437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffff1234L, x1); 438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x1234ffffL, x2); 439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x00000000L, x3); 440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x00001234L, x4); 441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x12340000L, x5); 442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x12345678L, x6); 443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x80000000L, x7); 444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffff0000L, x8); 445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(kWMinInt, w9); 446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(mov_imm_x) { 452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0xffffffffffffffffL); 457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 0xffffffffffff1234L); 458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x2, 0xffffffff12345678L); 459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x3, 0xffff1234ffff5678L); 460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x4, 0x1234ffffffff5678L); 461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x5, 0x1234ffff5678ffffL); 462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x6, 0x12345678ffffffffL); 463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x7, 0x1234ffffffffffffL); 464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x8, 0x123456789abcffffL); 465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x9, 0x12345678ffff9abcL); 466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x10, 0x1234ffff56789abcL); 467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x11, 0xffff123456789abcL); 468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x12, 0x0000000000000000L); 469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x13, 0x0000000000001234L); 470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x14, 0x0000000012345678L); 471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x15, 0x0000123400005678L); 472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x18, 0x1234000000005678L); 473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x19, 0x1234000056780000L); 474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x20, 0x1234567800000000L); 475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x21, 0x1234000000000000L); 476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x22, 0x123456789abc0000L); 477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x23, 0x1234567800009abcL); 478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x24, 0x1234000056789abcL); 479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x25, 0x0000123456789abcL); 480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x26, 0x123456789abcdef0L); 481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x27, 0xffff000000000001L); 482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x28, 0x8000ffff00000000L); 483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffffffff1234L, x1); 488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffff12345678L, x2); 489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffff1234ffff5678L, x3); 490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x1234ffffffff5678L, x4); 491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x1234ffff5678ffffL, x5); 492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x12345678ffffffffL, x6); 493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x1234ffffffffffffL, x7); 494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x123456789abcffffL, x8); 495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x12345678ffff9abcL, x9); 496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x1234ffff56789abcL, x10); 497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffff123456789abcL, x11); 498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0000000000000000L, x12); 499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0000000000001234L, x13); 500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0000000012345678L, x14); 501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0000123400005678L, x15); 502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x1234000000005678L, x18); 503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x1234000056780000L, x19); 504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x1234567800000000L, x20); 505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x1234000000000000L, x21); 506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x123456789abc0000L, x22); 507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x1234567800009abcL, x23); 508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x1234000056789abcL, x24); 509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0000123456789abcL, x25); 510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x123456789abcdef0L, x26); 511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffff000000000001L, x27); 512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x8000ffff00000000L, x28); 513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(orr) { 519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0xf0f0); 524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 0xf00000ff); 525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Orr(x2, x0, Operand(x1)); 527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Orr(w3, w0, Operand(w1, LSL, 28)); 528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Orr(x4, x0, Operand(x1, LSL, 32)); 529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Orr(x5, x0, Operand(x1, LSR, 4)); 530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Orr(w6, w0, Operand(w1, ASR, 4)); 531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Orr(x7, x0, Operand(x1, ASR, 4)); 532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Orr(w8, w0, Operand(w1, ROR, 12)); 533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Orr(x9, x0, Operand(x1, ROR, 12)); 534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Orr(w10, w0, Operand(0xf)); 535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Orr(x11, x0, Operand(0xf0000000f0000000L)); 536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xf000f0ff, x2); 541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xf000f0f0, x3); 542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xf00000ff0000f0f0L, x4); 543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0f00f0ff, x5); 544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xff00f0ff, x6); 545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0f00f0ff, x7); 546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0ffff0f0, x8); 547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0ff00000000ff0f0L, x9); 548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xf0ff, x10); 549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xf0000000f000f0f0L, x11); 550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(orr_extend) { 556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 558b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 1); 561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 0x8000000080008080UL); 562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Orr(w6, w0, Operand(w1, UXTB)); 563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Orr(x7, x0, Operand(x1, UXTH, 1)); 564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Orr(w8, w0, Operand(w1, UXTW, 2)); 565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Orr(x9, x0, Operand(x1, UXTX, 3)); 566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Orr(w10, w0, Operand(w1, SXTB)); 567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Orr(x11, x0, Operand(x1, SXTH, 1)); 568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Orr(x12, x0, Operand(x1, SXTW, 2)); 569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Orr(x13, x0, Operand(x1, SXTX, 3)); 570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x00000081, x6); 575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x00010101, x7); 576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x00020201, x8); 577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0000000400040401UL, x9); 578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x00000000ffffff81UL, x10); 579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffffffff0101UL, x11); 580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfffffffe00020201UL, x12); 581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0000000400040401UL, x13); 582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(bitwise_wide_imm) { 588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 590b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 592b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0); 593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 0xf0f0f0f0f0f0f0f0UL); 594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Orr(x10, x0, Operand(0x1234567890abcdefUL)); 596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Orr(w11, w1, Operand(0x90abcdef)); 597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Orr(w12, w0, kWMinInt); 599b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Eor(w13, w0, kWMinInt); 600b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 604b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x0); 605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xf0f0f0f0f0f0f0f0UL, x1); 606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x1234567890abcdefUL, x10); 607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xf0fbfdffUL, x11); 608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(kWMinInt, w12); 609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(kWMinInt, w13); 610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 612b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(orn) { 616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0xf0f0); 621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 0xf00000ff); 622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Orn(x2, x0, Operand(x1)); 624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Orn(w3, w0, Operand(w1, LSL, 4)); 625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Orn(x4, x0, Operand(x1, LSL, 4)); 626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Orn(x5, x0, Operand(x1, LSR, 1)); 627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Orn(w6, w0, Operand(w1, ASR, 1)); 628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Orn(x7, x0, Operand(x1, ASR, 1)); 629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Orn(w8, w0, Operand(w1, ROR, 16)); 630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Orn(x9, x0, Operand(x1, ROR, 16)); 631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Orn(w10, w0, Operand(0xffff)); 632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Orn(x11, x0, Operand(0xffff0000ffffL)); 633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffff0ffffff0L, x2); 638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfffff0ff, x3); 639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfffffff0fffff0ffL, x4); 640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffff87fffff0L, x5); 641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x07fffff0, x6); 642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffff87fffff0L, x7); 643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xff00ffff, x8); 644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xff00ffffffffffffL, x9); 645b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfffff0f0, x10); 646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffff0000fffff0f0L, x11); 647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(orn_extend) { 653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 1); 658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 0x8000000080008081UL); 659b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Orn(w6, w0, Operand(w1, UXTB)); 660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Orn(x7, x0, Operand(x1, UXTH, 1)); 661b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Orn(w8, w0, Operand(w1, UXTW, 2)); 662b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Orn(x9, x0, Operand(x1, UXTX, 3)); 663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Orn(w10, w0, Operand(w1, SXTB)); 664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Orn(x11, x0, Operand(x1, SXTH, 1)); 665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Orn(x12, x0, Operand(x1, SXTW, 2)); 666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Orn(x13, x0, Operand(x1, SXTX, 3)); 667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffff7f, x6); 672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfffffffffffefefdUL, x7); 673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfffdfdfb, x8); 674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfffffffbfffbfbf7UL, x9); 675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0000007f, x10); 676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0000fefd, x11); 677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x00000001fffdfdfbUL, x12); 678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfffffffbfffbfbf7UL, x13); 679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(and_) { 685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0xfff0); 690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 0xf00000ff); 691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ And(x2, x0, Operand(x1)); 693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ And(w3, w0, Operand(w1, LSL, 4)); 694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ And(x4, x0, Operand(x1, LSL, 4)); 695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ And(x5, x0, Operand(x1, LSR, 1)); 696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ And(w6, w0, Operand(w1, ASR, 20)); 697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ And(x7, x0, Operand(x1, ASR, 20)); 698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ And(w8, w0, Operand(w1, ROR, 28)); 699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ And(x9, x0, Operand(x1, ROR, 28)); 700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ And(w10, w0, Operand(0xff00)); 701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ And(x11, x0, Operand(0xff)); 702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 704b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x000000f0, x2); 707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x00000ff0, x3); 708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x00000ff0, x4); 709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x00000070, x5); 710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0000ff00, x6); 711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x00000f00, x7); 712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x00000ff0, x8); 713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x00000000, x9); 714b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0000ff00, x10); 715b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x000000f0, x11); 716b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 717b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 720b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(and_extend) { 722b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 725b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 726b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0xffffffffffffffffUL); 727b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 0x8000000080008081UL); 728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ And(w6, w0, Operand(w1, UXTB)); 729b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ And(x7, x0, Operand(x1, UXTH, 1)); 730b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ And(w8, w0, Operand(w1, UXTW, 2)); 731b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ And(x9, x0, Operand(x1, UXTX, 3)); 732b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ And(w10, w0, Operand(w1, SXTB)); 733b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ And(x11, x0, Operand(x1, SXTH, 1)); 734b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ And(x12, x0, Operand(x1, SXTW, 2)); 735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ And(x13, x0, Operand(x1, SXTX, 3)); 736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 739b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x00000081, x6); 741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x00010102, x7); 742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x00020204, x8); 743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0000000400040408UL, x9); 744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffff81, x10); 745b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffffffff0102UL, x11); 746b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfffffffe00020204UL, x12); 747b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0000000400040408UL, x13); 748b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 750b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 751b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 752b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(ands) { 754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 0xf00000ff); 759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ands(w0, w1, Operand(w1)); 760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_NZCV(NFlag); 765b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xf00000ff, x0); 766b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 767b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 768b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0xfff0); 769b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 0xf00000ff); 770b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ands(w0, w0, Operand(w1, LSR, 4)); 771b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 773b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 774b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 775b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_NZCV(ZFlag); 776b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x00000000, x0); 777b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 778b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0x8000000000000000L); 780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 0x00000001); 781b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ands(x0, x0, Operand(x1, ROR, 1)); 782b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_NZCV(NFlag); 787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x8000000000000000L, x0); 788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 789b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 790b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0xfff0); 791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ands(w0, w0, Operand(0xf)); 792b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 796b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_NZCV(ZFlag); 797b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x00000000, x0); 798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0xff000000); 801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ands(w0, w0, Operand(0x80000000)); 802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 803b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_NZCV(NFlag); 807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x80000000, x0); 808b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 813b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(bic) { 814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 817b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0xfff0); 819b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 0xf00000ff); 820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 821b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bic(x2, x0, Operand(x1)); 822b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bic(w3, w0, Operand(w1, LSL, 4)); 823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bic(x4, x0, Operand(x1, LSL, 4)); 824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bic(x5, x0, Operand(x1, LSR, 1)); 825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bic(w6, w0, Operand(w1, ASR, 20)); 826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bic(x7, x0, Operand(x1, ASR, 20)); 827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bic(w8, w0, Operand(w1, ROR, 28)); 828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bic(x9, x0, Operand(x1, ROR, 24)); 829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bic(x10, x0, Operand(0x1f)); 830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bic(x11, x0, Operand(0x100)); 831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Test bic into csp when the constant cannot be encoded in the immediate 833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // field. 834b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Use x20 to preserve csp. We check for the result via x21 because the 835b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // test infrastructure requires that csp be restored to its original value. 836b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x20, csp); 837b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0xffffff); 838b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bic(csp, x0, Operand(0xabcdef)); 839b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x21, csp); 840b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(csp, x20); 841b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0000ff00, x2); 846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0000f000, x3); 847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0000f000, x4); 848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0000ff80, x5); 849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x000000f0, x6); 850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0000f0f0, x7); 851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0000f000, x8); 852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0000ff00, x9); 853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0000ffe0, x10); 854b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0000fef0, x11); 855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x543210, x21); 857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 860b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(bic_extend) { 863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 866b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0xffffffffffffffffUL); 868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 0x8000000080008081UL); 869b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bic(w6, w0, Operand(w1, UXTB)); 870b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bic(x7, x0, Operand(x1, UXTH, 1)); 871b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bic(w8, w0, Operand(w1, UXTW, 2)); 872b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bic(x9, x0, Operand(x1, UXTX, 3)); 873b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bic(w10, w0, Operand(w1, SXTB)); 874b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bic(x11, x0, Operand(x1, SXTH, 1)); 875b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bic(x12, x0, Operand(x1, SXTW, 2)); 876b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bic(x13, x0, Operand(x1, SXTX, 3)); 877b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 878b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 879b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 880b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 881b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffff7e, x6); 882b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfffffffffffefefdUL, x7); 883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfffdfdfb, x8); 884b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfffffffbfffbfbf7UL, x9); 885b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0000007e, x10); 886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0000fefd, x11); 887b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x00000001fffdfdfbUL, x12); 888b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfffffffbfffbfbf7UL, x13); 889b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 890b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 891b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 892b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(bics) { 895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 897b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 0xffff); 900b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bics(w0, w1, Operand(w1)); 901b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 902b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 903b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 904b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 905b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_NZCV(ZFlag); 906b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x00000000, x0); 907b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 909b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0xffffffff); 910b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bics(w0, w0, Operand(w0, LSR, 1)); 911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 914b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 915b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_NZCV(NFlag); 916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x80000000, x0); 917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 918b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 919b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0x8000000000000000L); 920b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 0x00000001); 921b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bics(x0, x0, Operand(x1, ROR, 1)); 922b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 923b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 924b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 925b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 926b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_NZCV(ZFlag); 927b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x00000000, x0); 928b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 929b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 930b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0xffffffffffffffffL); 931b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bics(x0, x0, Operand(0x7fffffffffffffffL)); 932b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 933b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 934b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 935b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 936b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_NZCV(NFlag); 937b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x8000000000000000L, x0); 938b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 939b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 940b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w0, 0xffff0000); 941b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bics(w0, w0, Operand(0xfffffff0)); 942b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 943b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 944b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 945b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 946b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_NZCV(ZFlag); 947b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x00000000, x0); 948b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 949b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 950b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 951b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 952b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(eor) { 954b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 955b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 956b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 957b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 958b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0xfff0); 959b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 0xf00000ff); 960b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 961b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Eor(x2, x0, Operand(x1)); 962b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Eor(w3, w0, Operand(w1, LSL, 4)); 963b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Eor(x4, x0, Operand(x1, LSL, 4)); 964b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Eor(x5, x0, Operand(x1, LSR, 1)); 965b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Eor(w6, w0, Operand(w1, ASR, 20)); 966b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Eor(x7, x0, Operand(x1, ASR, 20)); 967b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Eor(w8, w0, Operand(w1, ROR, 28)); 968b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Eor(x9, x0, Operand(x1, ROR, 28)); 969b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Eor(w10, w0, Operand(0xff00ff00)); 970b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Eor(x11, x0, Operand(0xff00ff00ff00ff00L)); 971b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 972b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 973b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 974b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 975b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xf000ff0f, x2); 976b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0000f000, x3); 977b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0000000f0000f000L, x4); 978b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x7800ff8f, x5); 979b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffff00f0, x6); 980b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0000f0f0, x7); 981b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0000f00f, x8); 982b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x00000ff00000ffffL, x9); 983b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xff0000f0, x10); 984b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xff00ff00ff0000f0L, x11); 985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 987b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(eor_extend) { 991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 992b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 994b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 995b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0x1111111111111111UL); 996b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 0x8000000080008081UL); 997b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Eor(w6, w0, Operand(w1, UXTB)); 998b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Eor(x7, x0, Operand(x1, UXTH, 1)); 999b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Eor(w8, w0, Operand(w1, UXTW, 2)); 1000b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Eor(x9, x0, Operand(x1, UXTX, 3)); 1001b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Eor(w10, w0, Operand(w1, SXTB)); 1002b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Eor(x11, x0, Operand(x1, SXTH, 1)); 1003b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Eor(x12, x0, Operand(x1, SXTW, 2)); 1004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Eor(x13, x0, Operand(x1, SXTX, 3)); 1005b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 1006b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1007b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 1008b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1009b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x11111190, x6); 1010b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x1111111111101013UL, x7); 1011b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x11131315, x8); 1012b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x1111111511151519UL, x9); 1013b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xeeeeee90, x10); 1014b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xeeeeeeeeeeee1013UL, x11); 1015b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xeeeeeeef11131315UL, x12); 1016b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x1111111511151519UL, x13); 1017b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 1019b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1020b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1021b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1022b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(eon) { 1023b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 1024b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 1025b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 1027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0xfff0); 1028b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 0xf00000ff); 1029b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1030b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Eon(x2, x0, Operand(x1)); 1031b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Eon(w3, w0, Operand(w1, LSL, 4)); 1032b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Eon(x4, x0, Operand(x1, LSL, 4)); 1033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Eon(x5, x0, Operand(x1, LSR, 1)); 1034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Eon(w6, w0, Operand(w1, ASR, 20)); 1035b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Eon(x7, x0, Operand(x1, ASR, 20)); 1036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Eon(w8, w0, Operand(w1, ROR, 28)); 1037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Eon(x9, x0, Operand(x1, ROR, 28)); 1038b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Eon(w10, w0, Operand(0x03c003c0)); 1039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Eon(x11, x0, Operand(0x0000100000001000L)); 1040b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 1041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 1043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffff0fff00f0L, x2); 1045b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffff0fff, x3); 1046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfffffff0ffff0fffL, x4); 1047b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffff87ff0070L, x5); 1048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0000ff0f, x6); 1049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffffffff0f0fL, x7); 1050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffff0ff0, x8); 1051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfffff00fffff0000L, x9); 1052b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfc3f03cf, x10); 1053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffefffffff100fL, x11); 1054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1055b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 1056b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1057b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1058b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1059b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(eon_extend) { 1060b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 1061b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 1062b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1063b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 1064b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0x1111111111111111UL); 1065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 0x8000000080008081UL); 1066b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Eon(w6, w0, Operand(w1, UXTB)); 1067b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Eon(x7, x0, Operand(x1, UXTH, 1)); 1068b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Eon(w8, w0, Operand(w1, UXTW, 2)); 1069b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Eon(x9, x0, Operand(x1, UXTX, 3)); 1070b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Eon(w10, w0, Operand(w1, SXTB)); 1071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Eon(x11, x0, Operand(x1, SXTH, 1)); 1072b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Eon(x12, x0, Operand(x1, SXTW, 2)); 1073b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Eon(x13, x0, Operand(x1, SXTX, 3)); 1074b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 1075b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1076b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 1077b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1078b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xeeeeee6f, x6); 1079b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xeeeeeeeeeeefefecUL, x7); 1080b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xeeececea, x8); 1081b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xeeeeeeeaeeeaeae6UL, x9); 1082b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x1111116f, x10); 1083b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x111111111111efecUL, x11); 1084b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x11111110eeececeaUL, x12); 1085b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xeeeeeeeaeeeaeae6UL, x13); 1086b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1087b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 1088b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1089b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1090b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1091b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(mul) { 1092b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 1093b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 1094b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1095b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 1096b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x16, 0); 1097b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x17, 1); 1098b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x18, 0xffffffff); 1099b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x19, 0xffffffffffffffffUL); 1100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mul(w0, w16, w16); 1102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mul(w1, w16, w17); 1103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mul(w2, w17, w18); 1104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mul(w3, w18, w19); 1105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mul(x4, x16, x16); 1106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mul(x5, x17, x18); 1107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mul(x6, x18, x19); 1108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mul(x7, x19, x19); 1109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Smull(x8, w17, w18); 1110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Smull(x9, w18, w18); 1111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Smull(x10, w19, w19); 1112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mneg(w11, w16, w16); 1113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mneg(w12, w16, w17); 1114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mneg(w13, w17, w18); 1115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mneg(w14, w18, w19); 1116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mneg(x20, x16, x16); 1117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mneg(x21, x17, x18); 1118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mneg(x22, x18, x19); 1119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mneg(x23, x19, x19); 1120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 1121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 1123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x0); 1125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x1); 1126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffff, x2); 1127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x3); 1128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x4); 1129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffff, x5); 1130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffff00000001UL, x6); 1131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x7); 1132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffffffffffffUL, x8); 1133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x9); 1134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x10); 1135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x11); 1136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x12); 1137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x13); 1138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffff, x14); 1139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x20); 1140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffff00000001UL, x21); 1141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffff, x22); 1142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffffffffffffUL, x23); 1143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 1145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic void SmullHelper(int64_t expected, int64_t a, int64_t b) { 1149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 1150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 1151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w0, a); 1152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w1, b); 1153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Smull(x2, w0, w1); 1154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 1155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 1156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(expected, x2); 1157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 1158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(smull) { 1162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 1163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SmullHelper(0, 0, 0); 1164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SmullHelper(1, 1, 1); 1165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SmullHelper(-1, -1, 1); 1166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SmullHelper(1, -1, -1); 1167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SmullHelper(0xffffffff80000000, 0x80000000, 1); 1168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SmullHelper(0x0000000080000000, 0x00010000, 0x00008000); 1169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(madd) { 1173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 1174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 1175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 1177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x16, 0); 1178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x17, 1); 1179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x18, 0xffffffff); 1180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x19, 0xffffffffffffffffUL); 1181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Madd(w0, w16, w16, w16); 1183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Madd(w1, w16, w16, w17); 1184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Madd(w2, w16, w16, w18); 1185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Madd(w3, w16, w16, w19); 1186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Madd(w4, w16, w17, w17); 1187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Madd(w5, w17, w17, w18); 1188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Madd(w6, w17, w17, w19); 1189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Madd(w7, w17, w18, w16); 1190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Madd(w8, w17, w18, w18); 1191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Madd(w9, w18, w18, w17); 1192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Madd(w10, w18, w19, w18); 1193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Madd(w11, w19, w19, w19); 1194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Madd(x12, x16, x16, x16); 1196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Madd(x13, x16, x16, x17); 1197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Madd(x14, x16, x16, x18); 1198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Madd(x15, x16, x16, x19); 1199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Madd(x20, x16, x17, x17); 1200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Madd(x21, x17, x17, x18); 1201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Madd(x22, x17, x17, x19); 1202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Madd(x23, x17, x18, x16); 1203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Madd(x24, x17, x18, x18); 1204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Madd(x25, x18, x18, x17); 1205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Madd(x26, x18, x19, x18); 1206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Madd(x27, x19, x19, x19); 1207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 1209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 1211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x0); 1213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x1); 1214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffff, x2); 1215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffff, x3); 1216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x4); 1217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x5); 1218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x6); 1219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffff, x7); 1220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfffffffe, x8); 1221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(2, x9); 1222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x10); 1223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x11); 1224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x12); 1226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x13); 1227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffff, x14); 1228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffffffffffff, x15); 1229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x20); 1230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x100000000UL, x21); 1231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x22); 1232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffff, x23); 1233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x1fffffffe, x24); 1234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfffffffe00000002UL, x25); 1235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x26); 1236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x27); 1237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 1239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(msub) { 1243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 1244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 1245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 1247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x16, 0); 1248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x17, 1); 1249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x18, 0xffffffff); 1250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x19, 0xffffffffffffffffUL); 1251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Msub(w0, w16, w16, w16); 1253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Msub(w1, w16, w16, w17); 1254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Msub(w2, w16, w16, w18); 1255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Msub(w3, w16, w16, w19); 1256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Msub(w4, w16, w17, w17); 1257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Msub(w5, w17, w17, w18); 1258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Msub(w6, w17, w17, w19); 1259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Msub(w7, w17, w18, w16); 1260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Msub(w8, w17, w18, w18); 1261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Msub(w9, w18, w18, w17); 1262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Msub(w10, w18, w19, w18); 1263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Msub(w11, w19, w19, w19); 1264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Msub(x12, x16, x16, x16); 1266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Msub(x13, x16, x16, x17); 1267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Msub(x14, x16, x16, x18); 1268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Msub(x15, x16, x16, x19); 1269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Msub(x20, x16, x17, x17); 1270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Msub(x21, x17, x17, x18); 1271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Msub(x22, x17, x17, x19); 1272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Msub(x23, x17, x18, x16); 1273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Msub(x24, x17, x18, x18); 1274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Msub(x25, x18, x18, x17); 1275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Msub(x26, x18, x19, x18); 1276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Msub(x27, x19, x19, x19); 1277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 1279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 1281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x0); 1283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x1); 1284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffff, x2); 1285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffff, x3); 1286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x4); 1287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfffffffe, x5); 1288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfffffffe, x6); 1289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x7); 1290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x8); 1291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x9); 1292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfffffffe, x10); 1293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfffffffe, x11); 1294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x12); 1296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x13); 1297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffff, x14); 1298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffffffffffffUL, x15); 1299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x20); 1300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfffffffeUL, x21); 1301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfffffffffffffffeUL, x22); 1302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffff00000001UL, x23); 1303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x24); 1304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x200000000UL, x25); 1305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x1fffffffeUL, x26); 1306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfffffffffffffffeUL, x27); 1307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 1309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(smulh) { 1313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 1314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 1315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 1317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x20, 0); 1318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x21, 1); 1319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x22, 0x0000000100000000L); 1320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x23, 0x12345678); 1321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x24, 0x0123456789abcdefL); 1322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x25, 0x0000000200000000L); 1323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x26, 0x8000000000000000UL); 1324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x27, 0xffffffffffffffffUL); 1325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x28, 0x5555555555555555UL); 1326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x29, 0xaaaaaaaaaaaaaaaaUL); 1327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Smulh(x0, x20, x24); 1329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Smulh(x1, x21, x24); 1330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Smulh(x2, x22, x23); 1331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Smulh(x3, x22, x24); 1332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Smulh(x4, x24, x25); 1333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Smulh(x5, x23, x27); 1334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Smulh(x6, x26, x26); 1335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Smulh(x7, x26, x27); 1336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Smulh(x8, x27, x27); 1337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Smulh(x9, x28, x28); 1338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Smulh(x10, x28, x29); 1339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Smulh(x11, x29, x29); 1340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 1341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 1343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x0); 1345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x1); 1346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x2); 1347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x01234567, x3); 1348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x02468acf, x4); 1349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffffffffffffUL, x5); 1350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x4000000000000000UL, x6); 1351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x7); 1352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x8); 1353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x1c71c71c71c71c71UL, x9); 1354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xe38e38e38e38e38eUL, x10); 1355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x1c71c71c71c71c72UL, x11); 1356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 1358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(smaddl_umaddl) { 1362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 1363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 1364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 1366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x17, 1); 1367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x18, 0xffffffff); 1368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x19, 0xffffffffffffffffUL); 1369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x20, 4); 1370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x21, 0x200000000UL); 1371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Smaddl(x9, w17, w18, x20); 1373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Smaddl(x10, w18, w18, x20); 1374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Smaddl(x11, w19, w19, x20); 1375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Smaddl(x12, w19, w19, x21); 1376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Umaddl(x13, w17, w18, x20); 1377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Umaddl(x14, w18, w18, x20); 1378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Umaddl(x15, w19, w19, x20); 1379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Umaddl(x22, w19, w19, x21); 1380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 1381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 1383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(3, x9); 1385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(5, x10); 1386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(5, x11); 1387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x200000001UL, x12); 1388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x100000003UL, x13); 1389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfffffffe00000005UL, x14); 1390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfffffffe00000005UL, x15); 1391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x1, x22); 1392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 1394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(smsubl_umsubl) { 1398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 1399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 1400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 1402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x17, 1); 1403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x18, 0xffffffff); 1404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x19, 0xffffffffffffffffUL); 1405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x20, 4); 1406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x21, 0x200000000UL); 1407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Smsubl(x9, w17, w18, x20); 1409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Smsubl(x10, w18, w18, x20); 1410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Smsubl(x11, w19, w19, x20); 1411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Smsubl(x12, w19, w19, x21); 1412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Umsubl(x13, w17, w18, x20); 1413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Umsubl(x14, w18, w18, x20); 1414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Umsubl(x15, w19, w19, x20); 1415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Umsubl(x22, w19, w19, x21); 1416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 1417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 1419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(5, x9); 1421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(3, x10); 1422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(3, x11); 1423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x1ffffffffUL, x12); 1424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffff00000005UL, x13); 1425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x200000003UL, x14); 1426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x200000003UL, x15); 1427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x3ffffffffUL, x22); 1428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 1430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(div) { 1434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 1435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 1436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 1438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x16, 1); 1439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x17, 0xffffffff); 1440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x18, 0xffffffffffffffffUL); 1441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x19, 0x80000000); 1442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x20, 0x8000000000000000UL); 1443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x21, 2); 1444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Udiv(w0, w16, w16); 1446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Udiv(w1, w17, w16); 1447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sdiv(w2, w16, w16); 1448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sdiv(w3, w16, w17); 1449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sdiv(w4, w17, w18); 1450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Udiv(x5, x16, x16); 1452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Udiv(x6, x17, x18); 1453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sdiv(x7, x16, x16); 1454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sdiv(x8, x16, x17); 1455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sdiv(x9, x17, x18); 1456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Udiv(w10, w19, w21); 1458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sdiv(w11, w19, w21); 1459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Udiv(x12, x19, x21); 1460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sdiv(x13, x19, x21); 1461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Udiv(x14, x20, x21); 1462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sdiv(x15, x20, x21); 1463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Udiv(w22, w19, w17); 1465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sdiv(w23, w19, w17); 1466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Udiv(x24, x20, x18); 1467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sdiv(x25, x20, x18); 1468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Udiv(x26, x16, x21); 1470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sdiv(x27, x16, x21); 1471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Udiv(x28, x18, x21); 1472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sdiv(x29, x18, x21); 1473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x17, 0); 1475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Udiv(w18, w16, w17); 1476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sdiv(w19, w16, w17); 1477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Udiv(x20, x16, x17); 1478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sdiv(x21, x16, x17); 1479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 1480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 1482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x0); 1484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffff, x1); 1485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x2); 1486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffff, x3); 1487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x4); 1488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x5); 1489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x6); 1490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x7); 1491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x8); 1492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffff00000001UL, x9); 1493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x40000000, x10); 1494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xC0000000, x11); 1495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x40000000, x12); 1496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x40000000, x13); 1497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x4000000000000000UL, x14); 1498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xC000000000000000UL, x15); 1499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x22); 1500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x80000000, x23); 1501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x24); 1502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x8000000000000000UL, x25); 1503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x26); 1504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x27); 1505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x7fffffffffffffffUL, x28); 1506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x29); 1507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x18); 1508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x19); 1509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x20); 1510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x21); 1511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 1513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(rbit_rev) { 1517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 1518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 1519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 1521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x24, 0xfedcba9876543210UL); 1522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Rbit(w0, w24); 1523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Rbit(x1, x24); 1524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Rev16(w2, w24); 1525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Rev16(x3, x24); 1526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Rev(w4, w24); 1527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Rev32(x5, x24); 1528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Rev(x6, x24); 1529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 1530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 1532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x084c2a6e, x0); 1534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x084c2a6e195d3b7fUL, x1); 1535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x54761032, x2); 1536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xdcfe98ba54761032UL, x3); 1537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x10325476, x4); 1538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x98badcfe10325476UL, x5); 1539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x1032547698badcfeUL, x6); 1540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 1542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(clz_cls) { 1546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 1547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 1548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 1550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x24, 0x0008000000800000UL); 1551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x25, 0xff800000fff80000UL); 1552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x26, 0); 1553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Clz(w0, w24); 1554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Clz(x1, x24); 1555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Clz(w2, w25); 1556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Clz(x3, x25); 1557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Clz(w4, w26); 1558b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Clz(x5, x26); 1559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cls(w6, w24); 1560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cls(x7, x24); 1561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cls(w8, w25); 1562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cls(x9, x25); 1563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cls(w10, w26); 1564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cls(x11, x26); 1565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 1566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 1568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(8, x0); 1570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(12, x1); 1571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x2); 1572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x3); 1573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(32, x4); 1574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(64, x5); 1575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(7, x6); 1576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(11, x7); 1577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(12, x8); 1578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(8, x9); 1579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(31, x10); 1580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(63, x11); 1581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 1583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(label) { 1587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 1588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 1589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1590b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Label label_1, label_2, label_3, label_4; 1591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1592b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 1593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0x1); 1594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 0x0); 1595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x22, lr); // Save lr. 1596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&label_1); 1598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&label_1); 1599b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&label_1); // Multiple branches to the same label. 1600b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0x0); 1601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&label_2); 1602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&label_3); // Forward branch. 1603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0x0); 1604b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&label_1); 1605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&label_2); // Backward branch. 1606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0x0); 1607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&label_3); 1608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bl(&label_4); 1609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 1610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&label_4); 1612b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 0x1); 1613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(lr, x22); 1614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 1615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 1617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x1, x0); 1619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x1, x1); 1620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 1622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(branch_at_start) { 1626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 1627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 1628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Label good, exit; 1630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Test that branches can exist at the start of the buffer. (This is a 1632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // boundary condition in the label-handling code.) To achieve this, we have 1633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // to work around the code generated by START. 1634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RESET(); 1635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&good); 1636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START_AFTER_RESET(); 1638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0x0); 1639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 1640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&exit); 1642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START_AFTER_RESET(); 1643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0x1); 1644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 1645b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&good); 1647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&exit); 1648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 1649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 1651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x1, x0); 1653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 1654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(adr) { 1658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 1659b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 1660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1661b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Label label_1, label_2, label_3, label_4; 1662b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 1664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0x0); // Set to non-zero to indicate failure. 1665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adr(x1, &label_3); // Set to zero to indicate success. 1666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adr(x2, &label_1); // Multiple forward references to the same label. 1668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adr(x3, &label_1); 1669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adr(x4, &label_1); 1670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&label_2); 1672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Eor(x5, x2, Operand(x3)); // Ensure that x2,x3 and x4 are identical. 1673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Eor(x6, x2, Operand(x4)); 1674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Orr(x0, x0, Operand(x5)); 1675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Orr(x0, x0, Operand(x6)); 1676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Br(x2); // label_1, label_3 1677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&label_3); 1679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adr(x2, &label_3); // Self-reference (offset 0). 1680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Eor(x1, x1, Operand(x2)); 1681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adr(x2, &label_4); // Simple forward reference. 1682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Br(x2); // label_4 1683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&label_1); 1685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adr(x2, &label_3); // Multiple reverse references to the same label. 1686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adr(x3, &label_3); 1687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adr(x4, &label_3); 1688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adr(x5, &label_2); // Simple reverse reference. 1689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Br(x5); // label_2 1690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&label_4); 1692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 1693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 1695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0, x0); 1697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0, x1); 1698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 1700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(adr_far) { 1704b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 1705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int max_range = 1 << (Instruction::ImmPCRelRangeBitwidth - 1); 1707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP_SIZE(max_range + 1000 * kInstructionSize); 1708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Label done, fail; 1710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Label test_near, near_forward, near_backward; 1711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Label test_far, far_forward, far_backward; 1712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 1714b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0x0); 1715b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1716b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&test_near); 1717b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adr(x10, &near_forward, MacroAssembler::kAdrFar); 1718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Br(x10); 1719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&fail); 1720b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&near_backward); 1721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Orr(x0, x0, 1 << 1); 1722b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&test_far); 1723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&near_forward); 1725b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Orr(x0, x0, 1 << 0); 1726b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adr(x10, &near_backward, MacroAssembler::kAdrFar); 1727b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Br(x10); 1728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1729b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&test_far); 1730b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adr(x10, &far_forward, MacroAssembler::kAdrFar); 1731b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Br(x10); 1732b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&fail); 1733b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&far_backward); 1734b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Orr(x0, x0, 1 << 3); 1735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&done); 1736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (unsigned i = 0; i < max_range / kInstructionSize + 1; ++i) { 1738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (i % 100 == 0) { 1739b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // If we do land in this code, we do not want to execute so many nops 1740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // before reaching the end of test (especially if tracing is activated). 1741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ b(&fail); 1742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 1743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ nop(); 1744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1745b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1746b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1747b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1748b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&far_forward); 1749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Orr(x0, x0, 1 << 2); 1750b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adr(x10, &far_backward, MacroAssembler::kAdrFar); 1751b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Br(x10); 1752b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&done); 1754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&fail); 1755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Orr(x0, x0, 1 << 4); 1756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&done); 1757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 1759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 1761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xf, x0); 1763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 1765b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1766b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1767b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1768b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(branch_cond) { 1769b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 1770b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 1771b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Label wrong; 1773b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1774b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 1775b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0x1); 1776b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 0x1); 1777b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x2, 0x8000000000000000L); 1778b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // For each 'cmp' instruction below, condition codes other than the ones 1780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // following it would branch. 1781b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1782b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmp(x1, 0); 1783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&wrong, eq); 1784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&wrong, lo); 1785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&wrong, mi); 1786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&wrong, vs); 1787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&wrong, ls); 1788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&wrong, lt); 1789b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&wrong, le); 1790b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Label ok_1; 1791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&ok_1, ne); 1792b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0x0); 1793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&ok_1); 1794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmp(x1, 1); 1796b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&wrong, ne); 1797b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&wrong, lo); 1798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&wrong, mi); 1799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&wrong, vs); 1800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&wrong, hi); 1801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&wrong, lt); 1802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&wrong, gt); 1803b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Label ok_2; 1804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&ok_2, pl); 1805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0x0); 1806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&ok_2); 1807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1808b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmp(x1, 2); 1809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&wrong, eq); 1810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&wrong, hs); 1811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&wrong, pl); 1812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&wrong, vs); 1813b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&wrong, hi); 1814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&wrong, ge); 1815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&wrong, gt); 1816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Label ok_3; 1817b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&ok_3, vc); 1818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0x0); 1819b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&ok_3); 1820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1821b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmp(x2, 1); 1822b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&wrong, eq); 1823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&wrong, lo); 1824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&wrong, mi); 1825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&wrong, vc); 1826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&wrong, ls); 1827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&wrong, ge); 1828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&wrong, gt); 1829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Label ok_4; 1830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&ok_4, le); 1831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0x0); 1832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&ok_4); 1833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1834b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Label ok_5; 1835b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ b(&ok_5, al); 1836b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0x0); 1837b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&ok_5); 1838b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1839b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Label ok_6; 1840b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ b(&ok_6, nv); 1841b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0x0); 1842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&ok_6); 1843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 1845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&wrong); 1847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0x0); 1848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 1849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 1851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x1, x0); 1853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1854b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 1855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(branch_to_reg) { 1859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 1860b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 1861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Test br. 1863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Label fn1, after_fn1; 1864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 1866b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x29, lr); 1867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 0); 1869b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&after_fn1); 1870b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1871b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&fn1); 1872b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, lr); 1873b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 42); 1874b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Br(x0); 1875b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1876b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&after_fn1); 1877b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bl(&fn1); 1878b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1879b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Test blr. 1880b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Label fn2, after_fn2; 1881b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1882b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x2, 0); 1883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&after_fn2); 1884b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1885b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&fn2); 1886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, lr); 1887b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x2, 84); 1888b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Blr(x0); 1889b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1890b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&after_fn2); 1891b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bl(&fn2); 1892b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x3, lr); 1893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(lr, x29); 1895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 1896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1897b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 1898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(core.xreg(3) + kInstructionSize, x0); 1900b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(42, x1); 1901b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(84, x2); 1902b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1903b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 1904b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1905b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1906b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1907b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(compare_branch) { 1908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 1909b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 1910b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 1912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0); 1913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 0); 1914b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x2, 0); 1915b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x3, 0); 1916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x4, 0); 1917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x5, 0); 1918b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x16, 0); 1919b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x17, 42); 1920b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1921b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Label zt, zt_end; 1922b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cbz(w16, &zt); 1923b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&zt_end); 1924b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&zt); 1925b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 1); 1926b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&zt_end); 1927b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1928b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Label zf, zf_end; 1929b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cbz(x17, &zf); 1930b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&zf_end); 1931b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&zf); 1932b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 1); 1933b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&zf_end); 1934b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1935b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Label nzt, nzt_end; 1936b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cbnz(w17, &nzt); 1937b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&nzt_end); 1938b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&nzt); 1939b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x2, 1); 1940b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&nzt_end); 1941b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1942b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Label nzf, nzf_end; 1943b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cbnz(x16, &nzf); 1944b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&nzf_end); 1945b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&nzf); 1946b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x3, 1); 1947b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&nzf_end); 1948b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1949b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x18, 0xffffffff00000000UL); 1950b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1951b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Label a, a_end; 1952b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cbz(w18, &a); 1953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&a_end); 1954b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&a); 1955b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x4, 1); 1956b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&a_end); 1957b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1958b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Label b, b_end; 1959b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cbnz(w18, &b); 1960b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&b_end); 1961b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&b); 1962b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x5, 1); 1963b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&b_end); 1964b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1965b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 1966b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1967b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 1968b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1969b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x0); 1970b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x1); 1971b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x2); 1972b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x3); 1973b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x4); 1974b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x5); 1975b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1976b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 1977b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1978b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1979b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1980b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(test_branch) { 1981b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 1982b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 1983b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1984b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 1985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0); 1986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 0); 1987b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x2, 0); 1988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x3, 0); 1989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x16, 0xaaaaaaaaaaaaaaaaUL); 1990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Label bz, bz_end; 1992b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Tbz(w16, 0, &bz); 1993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&bz_end); 1994b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&bz); 1995b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 1); 1996b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&bz_end); 1997b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1998b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Label bo, bo_end; 1999b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Tbz(x16, 63, &bo); 2000b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&bo_end); 2001b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&bo); 2002b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 1); 2003b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&bo_end); 2004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2005b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Label nbz, nbz_end; 2006b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Tbnz(x16, 61, &nbz); 2007b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&nbz_end); 2008b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&nbz); 2009b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x2, 1); 2010b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&nbz_end); 2011b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2012b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Label nbo, nbo_end; 2013b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Tbnz(w16, 2, &nbo); 2014b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&nbo_end); 2015b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&nbo); 2016b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x3, 1); 2017b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&nbo_end); 2018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 2019b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2020b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 2021b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2022b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x0); 2023b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x1); 2024b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x2); 2025b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x3); 2026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 2028b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2029b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2030b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2031b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(far_branch_backward) { 2032b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 2033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Test that the MacroAssembler correctly resolves backward branches to labels 2035b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // that are outside the immediate range of branch instructions. 2036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int max_range = 2037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch std::max(Instruction::ImmBranchRange(TestBranchType), 2038b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch std::max(Instruction::ImmBranchRange(CompareBranchType), 2039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Instruction::ImmBranchRange(CondBranchType))); 2040b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP_SIZE(max_range + 1000 * kInstructionSize); 2042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 2044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2045b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Label done, fail; 2046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Label test_tbz, test_cbz, test_bcond; 2047b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Label success_tbz, success_cbz, success_bcond; 2048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0); 2050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 1); 2051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x10, 0); 2052b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&test_tbz); 2054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&success_tbz); 2055b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Orr(x0, x0, 1 << 0); 2056b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&test_cbz); 2057b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&success_cbz); 2058b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Orr(x0, x0, 1 << 1); 2059b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&test_bcond); 2060b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&success_bcond); 2061b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Orr(x0, x0, 1 << 2); 2062b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2063b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&done); 2064b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Generate enough code to overflow the immediate range of the three types of 2066b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // branches below. 2067b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (unsigned i = 0; i < max_range / kInstructionSize + 1; ++i) { 2068b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (i % 100 == 0) { 2069b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // If we do land in this code, we do not want to execute so many nops 2070b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // before reaching the end of test (especially if tracing is activated). 2071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&fail); 2072b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 2073b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Nop(); 2074b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2075b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2076b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&fail); 2077b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2078b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&test_tbz); 2079b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Tbz(x10, 7, &success_tbz); 2080b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&test_cbz); 2081b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cbz(x10, &success_cbz); 2082b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&test_bcond); 2083b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmp(x10, 0); 2084b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(eq, &success_bcond); 2085b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2086b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // For each out-of-range branch instructions, at least two instructions should 2087b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // have been generated. 2088b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_GE(7 * kInstructionSize, __ SizeOfCodeGeneratedSince(&test_tbz)); 2089b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2090b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&fail); 2091b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 0); 2092b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&done); 2093b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2094b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 2095b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2096b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 2097b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2098b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x7, x0); 2099b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x1, x1); 2100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 2102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(far_branch_simple_veneer) { 2106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 2107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Test that the MacroAssembler correctly emits veneers for forward branches 2109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // to labels that are outside the immediate range of branch instructions. 2110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int max_range = 2111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch std::max(Instruction::ImmBranchRange(TestBranchType), 2112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch std::max(Instruction::ImmBranchRange(CompareBranchType), 2113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Instruction::ImmBranchRange(CondBranchType))); 2114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP_SIZE(max_range + 1000 * kInstructionSize); 2116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 2118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Label done, fail; 2120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Label test_tbz, test_cbz, test_bcond; 2121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Label success_tbz, success_cbz, success_bcond; 2122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0); 2124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 1); 2125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x10, 0); 2126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&test_tbz); 2128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Tbz(x10, 7, &success_tbz); 2129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&test_cbz); 2130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cbz(x10, &success_cbz); 2131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&test_bcond); 2132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmp(x10, 0); 2133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(eq, &success_bcond); 2134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Generate enough code to overflow the immediate range of the three types of 2136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // branches below. 2137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (unsigned i = 0; i < max_range / kInstructionSize + 1; ++i) { 2138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (i % 100 == 0) { 2139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // If we do land in this code, we do not want to execute so many nops 2140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // before reaching the end of test (especially if tracing is activated). 2141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Also, the branches give the MacroAssembler the opportunity to emit the 2142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // veneers. 2143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&fail); 2144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 2145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Nop(); 2146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&fail); 2149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&success_tbz); 2151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Orr(x0, x0, 1 << 0); 2152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&test_cbz); 2153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&success_cbz); 2154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Orr(x0, x0, 1 << 1); 2155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&test_bcond); 2156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&success_bcond); 2157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Orr(x0, x0, 1 << 2); 2158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&done); 2160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&fail); 2161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 0); 2162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&done); 2163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 2165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 2167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x7, x0); 2169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x1, x1); 2170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 2172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(far_branch_veneer_link_chain) { 2176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 2177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Test that the MacroAssembler correctly emits veneers for forward branches 2179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // that target out-of-range labels and are part of multiple instructions 2180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // jumping to that label. 2181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // 2182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // We test the three situations with the different types of instruction: 2183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // (1)- When the branch is at the start of the chain with tbz. 2184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // (2)- When the branch is in the middle of the chain with cbz. 2185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // (3)- When the branch is at the end of the chain with bcond. 2186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int max_range = 2187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch std::max(Instruction::ImmBranchRange(TestBranchType), 2188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch std::max(Instruction::ImmBranchRange(CompareBranchType), 2189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Instruction::ImmBranchRange(CondBranchType))); 2190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP_SIZE(max_range + 1000 * kInstructionSize); 2192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 2194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Label skip, fail, done; 2196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Label test_tbz, test_cbz, test_bcond; 2197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Label success_tbz, success_cbz, success_bcond; 2198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0); 2200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 1); 2201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x10, 0); 2202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&skip); 2204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Branches at the start of the chain for situations (2) and (3). 2205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&success_cbz); 2206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&success_bcond); 2207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Nop(); 2208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&success_bcond); 2209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&success_cbz); 2210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&skip); 2211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&test_tbz); 2213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Tbz(x10, 7, &success_tbz); 2214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&test_cbz); 2215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cbz(x10, &success_cbz); 2216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&test_bcond); 2217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmp(x10, 0); 2218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(eq, &success_bcond); 2219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch skip.Unuse(); 2221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&skip); 2222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Branches at the end of the chain for situations (1) and (2). 2223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&success_cbz); 2224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&success_tbz); 2225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Nop(); 2226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&success_tbz); 2227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&success_cbz); 2228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&skip); 2229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Generate enough code to overflow the immediate range of the three types of 2231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // branches below. 2232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (unsigned i = 0; i < max_range / kInstructionSize + 1; ++i) { 2233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (i % 100 == 0) { 2234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // If we do land in this code, we do not want to execute so many nops 2235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // before reaching the end of test (especially if tracing is activated). 2236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Also, the branches give the MacroAssembler the opportunity to emit the 2237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // veneers. 2238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&fail); 2239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 2240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Nop(); 2241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&fail); 2244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&success_tbz); 2246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Orr(x0, x0, 1 << 0); 2247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&test_cbz); 2248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&success_cbz); 2249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Orr(x0, x0, 1 << 1); 2250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&test_bcond); 2251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&success_bcond); 2252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Orr(x0, x0, 1 << 2); 2253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&done); 2255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&fail); 2256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 0); 2257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&done); 2258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 2260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 2262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x7, x0); 2264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x1, x1); 2265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 2267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(far_branch_veneer_broken_link_chain) { 2271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 2272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Check that the MacroAssembler correctly handles the situation when removing 2274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // a branch from the link chain of a label and the two links on each side of 2275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // the removed branch cannot be linked together (out of range). 2276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // 2277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // We test with tbz because it has a small range. 2278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int max_range = Instruction::ImmBranchRange(TestBranchType); 2279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int inter_range = max_range / 2 + max_range / 10; 2280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP_SIZE(3 * inter_range + 1000 * kInstructionSize); 2282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 2284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Label skip, fail, done; 2286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Label test_1, test_2, test_3; 2287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Label far_target; 2288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0); // Indicates the origin of the branch. 2290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 1); 2291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x10, 0); 2292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // First instruction in the label chain. 2294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&test_1); 2295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 1); 2296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&far_target); 2297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (unsigned i = 0; i < inter_range / kInstructionSize; ++i) { 2299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (i % 100 == 0) { 2300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Do not allow generating veneers. They should not be needed. 2301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ b(&fail); 2302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 2303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Nop(); 2304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Will need a veneer to point to reach the target. 2308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&test_2); 2309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 2); 2310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Tbz(x10, 7, &far_target); 2311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (unsigned i = 0; i < inter_range / kInstructionSize; ++i) { 2313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (i % 100 == 0) { 2314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Do not allow generating veneers. They should not be needed. 2315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ b(&fail); 2316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 2317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Nop(); 2318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Does not need a veneer to reach the target, but the initial branch 2322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // instruction is out of range. 2323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&test_3); 2324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 3); 2325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Tbz(x10, 7, &far_target); 2326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (unsigned i = 0; i < inter_range / kInstructionSize; ++i) { 2328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (i % 100 == 0) { 2329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Allow generating veneers. 2330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&fail); 2331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 2332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Nop(); 2333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&fail); 2337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&far_target); 2339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmp(x0, 1); 2340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(eq, &test_2); 2341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmp(x0, 2); 2342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(eq, &test_3); 2343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&done); 2345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&fail); 2346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 0); 2347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&done); 2348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 2350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 2352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x3, x0); 2354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x1, x1); 2355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 2357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(branch_type) { 2361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 2362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 2364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Label fail, done; 2366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 2368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0x0); 2369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x10, 0x7); 2370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x11, 0x0); 2371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Test non taken branches. 2373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmp(x10, 0x7); 2374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&fail, ne); 2375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&fail, never); 2376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&fail, reg_zero, x10); 2377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&fail, reg_not_zero, x11); 2378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&fail, reg_bit_clear, x10, 0); 2379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&fail, reg_bit_set, x10, 3); 2380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Test taken branches. 2382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Label l1, l2, l3, l4, l5; 2383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmp(x10, 0x7); 2384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&l1, eq); 2385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&fail); 2386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&l1); 2387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&l2, always); 2388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&fail); 2389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&l2); 2390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&l3, reg_not_zero, x10); 2391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&fail); 2392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&l3); 2393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&l4, reg_bit_clear, x10, 15); 2394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&fail); 2395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&l4); 2396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&l5, reg_bit_set, x10, 1); 2397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&fail); 2398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&l5); 2399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&done); 2401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&fail); 2403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0x1); 2404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&done); 2406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 2408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 2410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0, x0); 2412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 2414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(ldr_str_offset) { 2418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 2419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 2420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint64_t src[2] = {0xfedcba9876543210UL, 0x0123456789abcdefUL}; 2422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint64_t dst[5] = {0, 0, 0, 0, 0}; 2423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uintptr_t src_base = reinterpret_cast<uintptr_t>(src); 2424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst); 2425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 2427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x17, src_base); 2428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x18, dst_base); 2429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldr(w0, MemOperand(x17)); 2430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Str(w0, MemOperand(x18)); 2431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldr(w1, MemOperand(x17, 4)); 2432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Str(w1, MemOperand(x18, 12)); 2433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldr(x2, MemOperand(x17, 8)); 2434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Str(x2, MemOperand(x18, 16)); 2435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldrb(w3, MemOperand(x17, 1)); 2436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Strb(w3, MemOperand(x18, 25)); 2437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldrh(w4, MemOperand(x17, 2)); 2438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Strh(w4, MemOperand(x18, 33)); 2439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 2440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 2442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x76543210, x0); 2444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x76543210, dst[0]); 2445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfedcba98, x1); 2446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfedcba9800000000UL, dst[1]); 2447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0123456789abcdefUL, x2); 2448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0123456789abcdefUL, dst[2]); 2449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x32, x3); 2450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x3200, dst[3]); 2451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x7654, x4); 2452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x765400, dst[4]); 2453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(src_base, x17); 2454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(dst_base, x18); 2455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 2457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(ldr_str_wide) { 2461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 2462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 2463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t src[8192]; 2465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t dst[8192]; 2466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uintptr_t src_base = reinterpret_cast<uintptr_t>(src); 2467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst); 2468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch memset(src, 0xaa, 8192 * sizeof(src[0])); 2469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch memset(dst, 0xaa, 8192 * sizeof(dst[0])); 2470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch src[0] = 0; 2471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch src[6144] = 6144; 2472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch src[8191] = 8191; 2473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 2475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x22, src_base); 2476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x23, dst_base); 2477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x24, src_base); 2478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x25, dst_base); 2479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x26, src_base); 2480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x27, dst_base); 2481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldr(w0, MemOperand(x22, 8191 * sizeof(src[0]))); 2483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Str(w0, MemOperand(x23, 8191 * sizeof(dst[0]))); 2484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldr(w1, MemOperand(x24, 4096 * sizeof(src[0]), PostIndex)); 2485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Str(w1, MemOperand(x25, 4096 * sizeof(dst[0]), PostIndex)); 2486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldr(w2, MemOperand(x26, 6144 * sizeof(src[0]), PreIndex)); 2487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Str(w2, MemOperand(x27, 6144 * sizeof(dst[0]), PreIndex)); 2488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 2489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 2491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(8191, w0); 2493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(8191, dst[8191]); 2494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(src_base, x22); 2495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(dst_base, x23); 2496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0, w1); 2497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0, dst[0]); 2498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(src_base + 4096 * sizeof(src[0]), x24); 2499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(dst_base + 4096 * sizeof(dst[0]), x25); 2500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(6144, w2); 2501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(6144, dst[6144]); 2502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(src_base + 6144 * sizeof(src[0]), x26); 2503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(dst_base + 6144 * sizeof(dst[0]), x27); 2504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 2506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(ldr_str_preindex) { 2510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 2511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 2512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint64_t src[2] = {0xfedcba9876543210UL, 0x0123456789abcdefUL}; 2514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint64_t dst[6] = {0, 0, 0, 0, 0, 0}; 2515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uintptr_t src_base = reinterpret_cast<uintptr_t>(src); 2516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst); 2517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 2519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x17, src_base); 2520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x18, dst_base); 2521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x19, src_base); 2522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x20, dst_base); 2523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x21, src_base + 16); 2524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x22, dst_base + 40); 2525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x23, src_base); 2526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x24, dst_base); 2527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x25, src_base); 2528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x26, dst_base); 2529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldr(w0, MemOperand(x17, 4, PreIndex)); 2530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Str(w0, MemOperand(x18, 12, PreIndex)); 2531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldr(x1, MemOperand(x19, 8, PreIndex)); 2532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Str(x1, MemOperand(x20, 16, PreIndex)); 2533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldr(w2, MemOperand(x21, -4, PreIndex)); 2534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Str(w2, MemOperand(x22, -4, PreIndex)); 2535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldrb(w3, MemOperand(x23, 1, PreIndex)); 2536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Strb(w3, MemOperand(x24, 25, PreIndex)); 2537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldrh(w4, MemOperand(x25, 3, PreIndex)); 2538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Strh(w4, MemOperand(x26, 41, PreIndex)); 2539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 2540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 2542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfedcba98, x0); 2544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfedcba9800000000UL, dst[1]); 2545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0123456789abcdefUL, x1); 2546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0123456789abcdefUL, dst[2]); 2547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x01234567, x2); 2548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0123456700000000UL, dst[4]); 2549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x32, x3); 2550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x3200, dst[3]); 2551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x9876, x4); 2552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x987600, dst[5]); 2553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(src_base + 4, x17); 2554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(dst_base + 12, x18); 2555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(src_base + 8, x19); 2556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(dst_base + 16, x20); 2557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(src_base + 12, x21); 2558b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(dst_base + 36, x22); 2559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(src_base + 1, x23); 2560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(dst_base + 25, x24); 2561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(src_base + 3, x25); 2562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(dst_base + 41, x26); 2563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 2565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(ldr_str_postindex) { 2569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 2570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 2571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint64_t src[2] = {0xfedcba9876543210UL, 0x0123456789abcdefUL}; 2573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint64_t dst[6] = {0, 0, 0, 0, 0, 0}; 2574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uintptr_t src_base = reinterpret_cast<uintptr_t>(src); 2575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst); 2576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 2578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x17, src_base + 4); 2579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x18, dst_base + 12); 2580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x19, src_base + 8); 2581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x20, dst_base + 16); 2582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x21, src_base + 8); 2583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x22, dst_base + 32); 2584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x23, src_base + 1); 2585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x24, dst_base + 25); 2586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x25, src_base + 3); 2587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x26, dst_base + 41); 2588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldr(w0, MemOperand(x17, 4, PostIndex)); 2589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Str(w0, MemOperand(x18, 12, PostIndex)); 2590b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldr(x1, MemOperand(x19, 8, PostIndex)); 2591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Str(x1, MemOperand(x20, 16, PostIndex)); 2592b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldr(x2, MemOperand(x21, -8, PostIndex)); 2593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Str(x2, MemOperand(x22, -32, PostIndex)); 2594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldrb(w3, MemOperand(x23, 1, PostIndex)); 2595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Strb(w3, MemOperand(x24, 5, PostIndex)); 2596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldrh(w4, MemOperand(x25, -3, PostIndex)); 2597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Strh(w4, MemOperand(x26, -41, PostIndex)); 2598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 2599b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2600b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 2601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfedcba98, x0); 2603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfedcba9800000000UL, dst[1]); 2604b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0123456789abcdefUL, x1); 2605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0123456789abcdefUL, dst[2]); 2606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0123456789abcdefUL, x2); 2607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0123456789abcdefUL, dst[4]); 2608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x32, x3); 2609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x3200, dst[3]); 2610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x9876, x4); 2611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x987600, dst[5]); 2612b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(src_base + 8, x17); 2613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(dst_base + 24, x18); 2614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(src_base + 16, x19); 2615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(dst_base + 32, x20); 2616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(src_base, x21); 2617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(dst_base, x22); 2618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(src_base + 2, x23); 2619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(dst_base + 30, x24); 2620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(src_base, x25); 2621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(dst_base, x26); 2622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 2624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(load_signed) { 2628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 2629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 2630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t src[2] = {0x80008080, 0x7fff7f7f}; 2632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uintptr_t src_base = reinterpret_cast<uintptr_t>(src); 2633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 2635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x24, src_base); 2636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldrsb(w0, MemOperand(x24)); 2637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldrsb(w1, MemOperand(x24, 4)); 2638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldrsh(w2, MemOperand(x24)); 2639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldrsh(w3, MemOperand(x24, 4)); 2640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldrsb(x4, MemOperand(x24)); 2641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldrsb(x5, MemOperand(x24, 4)); 2642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldrsh(x6, MemOperand(x24)); 2643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldrsh(x7, MemOperand(x24, 4)); 2644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldrsw(x8, MemOperand(x24)); 2645b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldrsw(x9, MemOperand(x24, 4)); 2646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 2647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 2649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffff80, x0); 2651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0000007f, x1); 2652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffff8080, x2); 2653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x00007f7f, x3); 2654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffffffffff80UL, x4); 2655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x000000000000007fUL, x5); 2656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffffffff8080UL, x6); 2657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0000000000007f7fUL, x7); 2658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffff80008080UL, x8); 2659b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x000000007fff7f7fUL, x9); 2660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2661b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 2662b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(load_store_regoffset) { 2666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 2667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 2668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t src[3] = {1, 2, 3}; 2670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t dst[4] = {0, 0, 0, 0}; 2671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uintptr_t src_base = reinterpret_cast<uintptr_t>(src); 2672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst); 2673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 2675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x16, src_base); 2676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x17, dst_base); 2677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x18, src_base + 3 * sizeof(src[0])); 2678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x19, dst_base + 3 * sizeof(dst[0])); 2679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x20, dst_base + 4 * sizeof(dst[0])); 2680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x24, 0); 2681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x25, 4); 2682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x26, -4); 2683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x27, 0xfffffffc); // 32-bit -4. 2684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x28, 0xfffffffe); // 32-bit -2. 2685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x29, 0xffffffff); // 32-bit -1. 2686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldr(w0, MemOperand(x16, x24)); 2688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldr(x1, MemOperand(x16, x25)); 2689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldr(w2, MemOperand(x18, x26)); 2690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldr(w3, MemOperand(x18, x27, SXTW)); 2691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldr(w4, MemOperand(x18, x28, SXTW, 2)); 2692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Str(w0, MemOperand(x17, x24)); 2693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Str(x1, MemOperand(x17, x25)); 2694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Str(w2, MemOperand(x20, x29, SXTW, 2)); 2695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 2696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 2698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x0); 2700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0000000300000002UL, x1); 2701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(3, x2); 2702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(3, x3); 2703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(2, x4); 2704b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(1, dst[0]); 2705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(2, dst[1]); 2706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(3, dst[2]); 2707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(3, dst[3]); 2708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 2710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(load_store_float) { 2714b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 2715b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 2716b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2717b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch float src[3] = {1.0, 2.0, 3.0}; 2718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch float dst[3] = {0.0, 0.0, 0.0}; 2719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uintptr_t src_base = reinterpret_cast<uintptr_t>(src); 2720b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst); 2721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2722b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 2723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x17, src_base); 2724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x18, dst_base); 2725b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x19, src_base); 2726b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x20, dst_base); 2727b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x21, src_base); 2728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x22, dst_base); 2729b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldr(s0, MemOperand(x17, sizeof(src[0]))); 2730b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Str(s0, MemOperand(x18, sizeof(dst[0]), PostIndex)); 2731b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldr(s1, MemOperand(x19, sizeof(src[0]), PostIndex)); 2732b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Str(s1, MemOperand(x20, 2 * sizeof(dst[0]), PreIndex)); 2733b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldr(s2, MemOperand(x21, 2 * sizeof(src[0]), PreIndex)); 2734b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Str(s2, MemOperand(x22, sizeof(dst[0]))); 2735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 2736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 2738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2739b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(2.0, s0); 2740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(2.0, dst[0]); 2741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(1.0, s1); 2742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(1.0, dst[2]); 2743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(3.0, s2); 2744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(3.0, dst[1]); 2745b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(src_base, x17); 2746b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(dst_base + sizeof(dst[0]), x18); 2747b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(src_base + sizeof(src[0]), x19); 2748b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(dst_base + 2 * sizeof(dst[0]), x20); 2749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(src_base + 2 * sizeof(src[0]), x21); 2750b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(dst_base, x22); 2751b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2752b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 2753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(load_store_double) { 2757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 2758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 2759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double src[3] = {1.0, 2.0, 3.0}; 2761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double dst[3] = {0.0, 0.0, 0.0}; 2762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uintptr_t src_base = reinterpret_cast<uintptr_t>(src); 2763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst); 2764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2765b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 2766b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x17, src_base); 2767b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x18, dst_base); 2768b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x19, src_base); 2769b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x20, dst_base); 2770b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x21, src_base); 2771b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x22, dst_base); 2772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldr(d0, MemOperand(x17, sizeof(src[0]))); 2773b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Str(d0, MemOperand(x18, sizeof(dst[0]), PostIndex)); 2774b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldr(d1, MemOperand(x19, sizeof(src[0]), PostIndex)); 2775b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Str(d1, MemOperand(x20, 2 * sizeof(dst[0]), PreIndex)); 2776b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldr(d2, MemOperand(x21, 2 * sizeof(src[0]), PreIndex)); 2777b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Str(d2, MemOperand(x22, sizeof(dst[0]))); 2778b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 2779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 2781b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2782b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(2.0, d0); 2783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(2.0, dst[0]); 2784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(1.0, d1); 2785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(1.0, dst[2]); 2786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(3.0, d2); 2787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(3.0, dst[1]); 2788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(src_base, x17); 2789b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(dst_base + sizeof(dst[0]), x18); 2790b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(src_base + sizeof(src[0]), x19); 2791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(dst_base + 2 * sizeof(dst[0]), x20); 2792b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(src_base + 2 * sizeof(src[0]), x21); 2793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(dst_base, x22); 2794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 2796b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2797b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(ldp_stp_float) { 2800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 2801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 2802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2803b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch float src[2] = {1.0, 2.0}; 2804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch float dst[3] = {0.0, 0.0, 0.0}; 2805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uintptr_t src_base = reinterpret_cast<uintptr_t>(src); 2806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst); 2807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2808b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 2809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x16, src_base); 2810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x17, dst_base); 2811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldp(s31, s0, MemOperand(x16, 2 * sizeof(src[0]), PostIndex)); 2812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Stp(s0, s31, MemOperand(x17, sizeof(dst[1]), PreIndex)); 2813b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 2814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 2816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2817b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(1.0, s31); 2818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(2.0, s0); 2819b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(0.0, dst[0]); 2820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(2.0, dst[1]); 2821b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(1.0, dst[2]); 2822b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(src_base + 2 * sizeof(src[0]), x16); 2823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(dst_base + sizeof(dst[1]), x17); 2824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 2826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(ldp_stp_double) { 2830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 2831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 2832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double src[2] = {1.0, 2.0}; 2834b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double dst[3] = {0.0, 0.0, 0.0}; 2835b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uintptr_t src_base = reinterpret_cast<uintptr_t>(src); 2836b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst); 2837b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2838b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 2839b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x16, src_base); 2840b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x17, dst_base); 2841b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldp(d31, d0, MemOperand(x16, 2 * sizeof(src[0]), PostIndex)); 2842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Stp(d0, d31, MemOperand(x17, sizeof(dst[1]), PreIndex)); 2843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 2844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 2846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(1.0, d31); 2848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(2.0, d0); 2849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(0.0, dst[0]); 2850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(2.0, dst[1]); 2851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(1.0, dst[2]); 2852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(src_base + 2 * sizeof(src[0]), x16); 2853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(dst_base + sizeof(dst[1]), x17); 2854b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 2856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(ldp_stp_offset) { 2860b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 2861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 2862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint64_t src[3] = {0x0011223344556677UL, 0x8899aabbccddeeffUL, 2864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 0xffeeddccbbaa9988UL}; 2865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint64_t dst[7] = {0, 0, 0, 0, 0, 0, 0}; 2866b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uintptr_t src_base = reinterpret_cast<uintptr_t>(src); 2867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst); 2868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2869b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 2870b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x16, src_base); 2871b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x17, dst_base); 2872b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x18, src_base + 24); 2873b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x19, dst_base + 56); 2874b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldp(w0, w1, MemOperand(x16)); 2875b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldp(w2, w3, MemOperand(x16, 4)); 2876b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldp(x4, x5, MemOperand(x16, 8)); 2877b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldp(w6, w7, MemOperand(x18, -12)); 2878b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldp(x8, x9, MemOperand(x18, -16)); 2879b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Stp(w0, w1, MemOperand(x17)); 2880b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Stp(w2, w3, MemOperand(x17, 8)); 2881b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Stp(x4, x5, MemOperand(x17, 16)); 2882b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Stp(w6, w7, MemOperand(x19, -24)); 2883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Stp(x8, x9, MemOperand(x19, -16)); 2884b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 2885b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 2887b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2888b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x44556677, x0); 2889b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x00112233, x1); 2890b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0011223344556677UL, dst[0]); 2891b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x00112233, x2); 2892b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xccddeeff, x3); 2893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xccddeeff00112233UL, dst[1]); 2894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x8899aabbccddeeffUL, x4); 2895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x8899aabbccddeeffUL, dst[2]); 2896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffeeddccbbaa9988UL, x5); 2897b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffeeddccbbaa9988UL, dst[3]); 2898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x8899aabb, x6); 2899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xbbaa9988, x7); 2900b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xbbaa99888899aabbUL, dst[4]); 2901b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x8899aabbccddeeffUL, x8); 2902b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x8899aabbccddeeffUL, dst[5]); 2903b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffeeddccbbaa9988UL, x9); 2904b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffeeddccbbaa9988UL, dst[6]); 2905b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(src_base, x16); 2906b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(dst_base, x17); 2907b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(src_base + 24, x18); 2908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(dst_base + 56, x19); 2909b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2910b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 2911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2914b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(ldp_stp_offset_wide) { 2915b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 2916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 2917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2918b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint64_t src[3] = {0x0011223344556677, 0x8899aabbccddeeff, 2919b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 0xffeeddccbbaa9988}; 2920b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint64_t dst[7] = {0, 0, 0, 0, 0, 0, 0}; 2921b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uintptr_t src_base = reinterpret_cast<uintptr_t>(src); 2922b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst); 2923b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Move base too far from the array to force multiple instructions 2924b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // to be emitted. 2925b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const int64_t base_offset = 1024; 2926b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2927b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 2928b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x20, src_base - base_offset); 2929b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x21, dst_base - base_offset); 2930b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x18, src_base + base_offset + 24); 2931b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x19, dst_base + base_offset + 56); 2932b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldp(w0, w1, MemOperand(x20, base_offset)); 2933b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldp(w2, w3, MemOperand(x20, base_offset + 4)); 2934b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldp(x4, x5, MemOperand(x20, base_offset + 8)); 2935b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldp(w6, w7, MemOperand(x18, -12 - base_offset)); 2936b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldp(x8, x9, MemOperand(x18, -16 - base_offset)); 2937b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Stp(w0, w1, MemOperand(x21, base_offset)); 2938b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Stp(w2, w3, MemOperand(x21, base_offset + 8)); 2939b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Stp(x4, x5, MemOperand(x21, base_offset + 16)); 2940b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Stp(w6, w7, MemOperand(x19, -24 - base_offset)); 2941b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Stp(x8, x9, MemOperand(x19, -16 - base_offset)); 2942b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 2943b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2944b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 2945b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2946b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x44556677, x0); 2947b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x00112233, x1); 2948b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0011223344556677UL, dst[0]); 2949b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x00112233, x2); 2950b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xccddeeff, x3); 2951b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xccddeeff00112233UL, dst[1]); 2952b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x8899aabbccddeeffUL, x4); 2953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x8899aabbccddeeffUL, dst[2]); 2954b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffeeddccbbaa9988UL, x5); 2955b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffeeddccbbaa9988UL, dst[3]); 2956b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x8899aabb, x6); 2957b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xbbaa9988, x7); 2958b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xbbaa99888899aabbUL, dst[4]); 2959b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x8899aabbccddeeffUL, x8); 2960b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x8899aabbccddeeffUL, dst[5]); 2961b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffeeddccbbaa9988UL, x9); 2962b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffeeddccbbaa9988UL, dst[6]); 2963b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(src_base - base_offset, x20); 2964b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(dst_base - base_offset, x21); 2965b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(src_base + base_offset + 24, x18); 2966b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(dst_base + base_offset + 56, x19); 2967b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2968b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 2969b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2970b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2971b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2972b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(ldnp_stnp_offset) { 2973b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 2974b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 2975b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2976b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint64_t src[3] = {0x0011223344556677UL, 0x8899aabbccddeeffUL, 2977b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 0xffeeddccbbaa9988UL}; 2978b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint64_t dst[7] = {0, 0, 0, 0, 0, 0, 0}; 2979b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uintptr_t src_base = reinterpret_cast<uintptr_t>(src); 2980b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst); 2981b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2982b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 2983b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x16, src_base); 2984b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x17, dst_base); 2985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x18, src_base + 24); 2986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x19, dst_base + 56); 2987b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldnp(w0, w1, MemOperand(x16)); 2988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldnp(w2, w3, MemOperand(x16, 4)); 2989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldnp(x4, x5, MemOperand(x16, 8)); 2990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldnp(w6, w7, MemOperand(x18, -12)); 2991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldnp(x8, x9, MemOperand(x18, -16)); 2992b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Stnp(w0, w1, MemOperand(x17)); 2993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Stnp(w2, w3, MemOperand(x17, 8)); 2994b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Stnp(x4, x5, MemOperand(x17, 16)); 2995b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Stnp(w6, w7, MemOperand(x19, -24)); 2996b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Stnp(x8, x9, MemOperand(x19, -16)); 2997b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 2998b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2999b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 3000b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3001b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x44556677, x0); 3002b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x00112233, x1); 3003b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0011223344556677UL, dst[0]); 3004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x00112233, x2); 3005b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xccddeeff, x3); 3006b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xccddeeff00112233UL, dst[1]); 3007b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x8899aabbccddeeffUL, x4); 3008b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x8899aabbccddeeffUL, dst[2]); 3009b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffeeddccbbaa9988UL, x5); 3010b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffeeddccbbaa9988UL, dst[3]); 3011b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x8899aabb, x6); 3012b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xbbaa9988, x7); 3013b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xbbaa99888899aabbUL, dst[4]); 3014b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x8899aabbccddeeffUL, x8); 3015b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x8899aabbccddeeffUL, dst[5]); 3016b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffeeddccbbaa9988UL, x9); 3017b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffeeddccbbaa9988UL, dst[6]); 3018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(src_base, x16); 3019b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(dst_base, x17); 3020b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(src_base + 24, x18); 3021b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(dst_base + 56, x19); 3022b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3023b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 3024b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3025b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(ldp_stp_preindex) { 3028b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 3029b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 3030b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3031b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint64_t src[3] = {0x0011223344556677UL, 0x8899aabbccddeeffUL, 3032b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 0xffeeddccbbaa9988UL}; 3033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint64_t dst[5] = {0, 0, 0, 0, 0}; 3034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uintptr_t src_base = reinterpret_cast<uintptr_t>(src); 3035b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst); 3036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 3038b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x16, src_base); 3039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x17, dst_base); 3040b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x18, dst_base + 16); 3041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldp(w0, w1, MemOperand(x16, 4, PreIndex)); 3042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x19, x16); 3043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldp(w2, w3, MemOperand(x16, -4, PreIndex)); 3044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Stp(w2, w3, MemOperand(x17, 4, PreIndex)); 3045b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x20, x17); 3046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Stp(w0, w1, MemOperand(x17, -4, PreIndex)); 3047b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldp(x4, x5, MemOperand(x16, 8, PreIndex)); 3048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x21, x16); 3049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldp(x6, x7, MemOperand(x16, -8, PreIndex)); 3050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Stp(x7, x6, MemOperand(x18, 8, PreIndex)); 3051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x22, x18); 3052b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Stp(x5, x4, MemOperand(x18, -8, PreIndex)); 3053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 3054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3055b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 3056b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3057b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x00112233, x0); 3058b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xccddeeff, x1); 3059b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x44556677, x2); 3060b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x00112233, x3); 3061b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xccddeeff00112233UL, dst[0]); 3062b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0000000000112233UL, dst[1]); 3063b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x8899aabbccddeeffUL, x4); 3064b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffeeddccbbaa9988UL, x5); 3065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0011223344556677UL, x6); 3066b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x8899aabbccddeeffUL, x7); 3067b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffeeddccbbaa9988UL, dst[2]); 3068b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x8899aabbccddeeffUL, dst[3]); 3069b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0011223344556677UL, dst[4]); 3070b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(src_base, x16); 3071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(dst_base, x17); 3072b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(dst_base + 16, x18); 3073b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(src_base + 4, x19); 3074b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(dst_base + 4, x20); 3075b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(src_base + 8, x21); 3076b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(dst_base + 24, x22); 3077b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3078b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 3079b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3080b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3081b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3082b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(ldp_stp_preindex_wide) { 3083b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 3084b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 3085b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3086b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint64_t src[3] = {0x0011223344556677, 0x8899aabbccddeeff, 3087b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 0xffeeddccbbaa9988}; 3088b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint64_t dst[5] = {0, 0, 0, 0, 0}; 3089b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uintptr_t src_base = reinterpret_cast<uintptr_t>(src); 3090b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst); 3091b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Move base too far from the array to force multiple instructions 3092b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // to be emitted. 3093b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const int64_t base_offset = 1024; 3094b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3095b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 3096b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x24, src_base - base_offset); 3097b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x25, dst_base + base_offset); 3098b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x18, dst_base + base_offset + 16); 3099b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldp(w0, w1, MemOperand(x24, base_offset + 4, PreIndex)); 3100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x19, x24); 3101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x24, src_base - base_offset + 4); 3102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldp(w2, w3, MemOperand(x24, base_offset - 4, PreIndex)); 3103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Stp(w2, w3, MemOperand(x25, 4 - base_offset, PreIndex)); 3104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x20, x25); 3105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x25, dst_base + base_offset + 4); 3106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x24, src_base - base_offset); 3107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Stp(w0, w1, MemOperand(x25, -4 - base_offset, PreIndex)); 3108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldp(x4, x5, MemOperand(x24, base_offset + 8, PreIndex)); 3109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x21, x24); 3110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x24, src_base - base_offset + 8); 3111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldp(x6, x7, MemOperand(x24, base_offset - 8, PreIndex)); 3112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Stp(x7, x6, MemOperand(x18, 8 - base_offset, PreIndex)); 3113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x22, x18); 3114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x18, dst_base + base_offset + 16 + 8); 3115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Stp(x5, x4, MemOperand(x18, -8 - base_offset, PreIndex)); 3116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 3117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 3119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x00112233, x0); 3121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xccddeeff, x1); 3122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x44556677, x2); 3123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x00112233, x3); 3124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xccddeeff00112233UL, dst[0]); 3125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0000000000112233UL, dst[1]); 3126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x8899aabbccddeeffUL, x4); 3127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffeeddccbbaa9988UL, x5); 3128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0011223344556677UL, x6); 3129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x8899aabbccddeeffUL, x7); 3130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffeeddccbbaa9988UL, dst[2]); 3131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x8899aabbccddeeffUL, dst[3]); 3132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0011223344556677UL, dst[4]); 3133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(src_base, x24); 3134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(dst_base, x25); 3135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(dst_base + 16, x18); 3136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(src_base + 4, x19); 3137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(dst_base + 4, x20); 3138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(src_base + 8, x21); 3139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(dst_base + 24, x22); 3140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 3142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(ldp_stp_postindex) { 3146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 3147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 3148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint64_t src[4] = {0x0011223344556677UL, 0x8899aabbccddeeffUL, 3150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 0xffeeddccbbaa9988UL, 0x7766554433221100UL}; 3151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint64_t dst[5] = {0, 0, 0, 0, 0}; 3152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uintptr_t src_base = reinterpret_cast<uintptr_t>(src); 3153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst); 3154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 3156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x16, src_base); 3157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x17, dst_base); 3158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x18, dst_base + 16); 3159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldp(w0, w1, MemOperand(x16, 4, PostIndex)); 3160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x19, x16); 3161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldp(w2, w3, MemOperand(x16, -4, PostIndex)); 3162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Stp(w2, w3, MemOperand(x17, 4, PostIndex)); 3163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x20, x17); 3164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Stp(w0, w1, MemOperand(x17, -4, PostIndex)); 3165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldp(x4, x5, MemOperand(x16, 8, PostIndex)); 3166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x21, x16); 3167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldp(x6, x7, MemOperand(x16, -8, PostIndex)); 3168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Stp(x7, x6, MemOperand(x18, 8, PostIndex)); 3169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x22, x18); 3170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Stp(x5, x4, MemOperand(x18, -8, PostIndex)); 3171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 3172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 3174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x44556677, x0); 3176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x00112233, x1); 3177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x00112233, x2); 3178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xccddeeff, x3); 3179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x4455667700112233UL, dst[0]); 3180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0000000000112233UL, dst[1]); 3181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0011223344556677UL, x4); 3182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x8899aabbccddeeffUL, x5); 3183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x8899aabbccddeeffUL, x6); 3184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffeeddccbbaa9988UL, x7); 3185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffeeddccbbaa9988UL, dst[2]); 3186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x8899aabbccddeeffUL, dst[3]); 3187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0011223344556677UL, dst[4]); 3188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(src_base, x16); 3189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(dst_base, x17); 3190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(dst_base + 16, x18); 3191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(src_base + 4, x19); 3192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(dst_base + 4, x20); 3193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(src_base + 8, x21); 3194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(dst_base + 24, x22); 3195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 3197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(ldp_stp_postindex_wide) { 3201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 3202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 3203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint64_t src[4] = {0x0011223344556677, 0x8899aabbccddeeff, 0xffeeddccbbaa9988, 3205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 0x7766554433221100}; 3206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint64_t dst[5] = {0, 0, 0, 0, 0}; 3207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uintptr_t src_base = reinterpret_cast<uintptr_t>(src); 3208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst); 3209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Move base too far from the array to force multiple instructions 3210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // to be emitted. 3211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const int64_t base_offset = 1024; 3212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 3214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x24, src_base); 3215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x25, dst_base); 3216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x18, dst_base + 16); 3217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldp(w0, w1, MemOperand(x24, base_offset + 4, PostIndex)); 3218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x19, x24); 3219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sub(x24, x24, base_offset); 3220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldp(w2, w3, MemOperand(x24, base_offset - 4, PostIndex)); 3221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Stp(w2, w3, MemOperand(x25, 4 - base_offset, PostIndex)); 3222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x20, x25); 3223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sub(x24, x24, base_offset); 3224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(x25, x25, base_offset); 3225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Stp(w0, w1, MemOperand(x25, -4 - base_offset, PostIndex)); 3226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldp(x4, x5, MemOperand(x24, base_offset + 8, PostIndex)); 3227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x21, x24); 3228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sub(x24, x24, base_offset); 3229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldp(x6, x7, MemOperand(x24, base_offset - 8, PostIndex)); 3230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Stp(x7, x6, MemOperand(x18, 8 - base_offset, PostIndex)); 3231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x22, x18); 3232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(x18, x18, base_offset); 3233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Stp(x5, x4, MemOperand(x18, -8 - base_offset, PostIndex)); 3234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 3235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 3237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x44556677, x0); 3239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x00112233, x1); 3240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x00112233, x2); 3241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xccddeeff, x3); 3242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x4455667700112233UL, dst[0]); 3243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0000000000112233UL, dst[1]); 3244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0011223344556677UL, x4); 3245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x8899aabbccddeeffUL, x5); 3246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x8899aabbccddeeffUL, x6); 3247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffeeddccbbaa9988UL, x7); 3248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffeeddccbbaa9988UL, dst[2]); 3249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x8899aabbccddeeffUL, dst[3]); 3250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0011223344556677UL, dst[4]); 3251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(src_base + base_offset, x24); 3252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(dst_base - base_offset, x25); 3253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(dst_base - base_offset + 16, x18); 3254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(src_base + base_offset + 4, x19); 3255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(dst_base - base_offset + 4, x20); 3256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(src_base + base_offset + 8, x21); 3257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(dst_base - base_offset + 24, x22); 3258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 3260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(ldp_sign_extend) { 3264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 3265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 3266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t src[2] = {0x80000000, 0x7fffffff}; 3268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uintptr_t src_base = reinterpret_cast<uintptr_t>(src); 3269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 3271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x24, src_base); 3272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldpsw(x0, x1, MemOperand(x24)); 3273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 3274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 3276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffff80000000UL, x0); 3278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x000000007fffffffUL, x1); 3279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 3281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(ldur_stur) { 3285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 3286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 3287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int64_t src[2] = {0x0123456789abcdefUL, 0x0123456789abcdefUL}; 3289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int64_t dst[5] = {0, 0, 0, 0, 0}; 3290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uintptr_t src_base = reinterpret_cast<uintptr_t>(src); 3291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst); 3292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 3294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x17, src_base); 3295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x18, dst_base); 3296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x19, src_base + 16); 3297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x20, dst_base + 32); 3298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x21, dst_base + 40); 3299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldr(w0, MemOperand(x17, 1)); 3300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Str(w0, MemOperand(x18, 2)); 3301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldr(x1, MemOperand(x17, 3)); 3302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Str(x1, MemOperand(x18, 9)); 3303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldr(w2, MemOperand(x19, -9)); 3304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Str(w2, MemOperand(x20, -5)); 3305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldrb(w3, MemOperand(x19, -1)); 3306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Strb(w3, MemOperand(x21, -1)); 3307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 3308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 3310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x6789abcd, x0); 3312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x6789abcd0000L, dst[0]); 3313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xabcdef0123456789L, x1); 3314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xcdef012345678900L, dst[1]); 3315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x000000ab, dst[2]); 3316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xabcdef01, x2); 3317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x00abcdef01000000L, dst[3]); 3318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x00000001, x3); 3319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0100000000000000L, dst[4]); 3320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(src_base, x17); 3321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(dst_base, x18); 3322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(src_base + 16, x19); 3323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(dst_base + 32, x20); 3324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 3326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#if 0 // TODO(all) enable. 3330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// TODO(rodolph): Adapt w16 Literal tests for RelocInfo. 3331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(ldr_literal) { 3332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 3333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 3334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 3336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldr(x2, 0x1234567890abcdefUL); 3337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldr(w3, 0xfedcba09); 3338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldr(d13, 1.234); 3339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldr(s25, 2.5); 3340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 3341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 3343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x1234567890abcdefUL, x2); 3345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfedcba09, x3); 3346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(1.234, d13); 3347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(2.5, s25); 3348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 3350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic void LdrLiteralRangeHelper(ptrdiff_t range_, 3354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LiteralPoolEmitOption option, 3355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool expect_dump) { 3356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(range_ > 0); 3357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP_SIZE(range_ + 1024); 3358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Label label_1, label_2; 3360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch size_t range = static_cast<size_t>(range_); 3362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch size_t code_size = 0; 3363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch size_t pool_guard_size; 3364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (option == NoJumpRequired) { 3366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Space for an explicit branch. 3367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch pool_guard_size = sizeof(Instr); 3368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 3369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch pool_guard_size = 0; 3370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 3373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Force a pool dump so the pool starts off empty. 3374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ EmitLiteralPool(JumpRequired); 3375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK_LITERAL_POOL_SIZE(0); 3376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldr(x0, 0x1234567890abcdefUL); 3378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldr(w1, 0xfedcba09); 3379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldr(d0, 1.234); 3380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldr(s1, 2.5); 3381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK_LITERAL_POOL_SIZE(4); 3382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch code_size += 4 * sizeof(Instr); 3384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Check that the requested range (allowing space for a branch over the pool) 3386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // can be handled by this test. 3387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK((code_size + pool_guard_size) <= range); 3388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Emit NOPs up to 'range', leaving space for the pool guard. 3390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch while ((code_size + pool_guard_size) < range) { 3391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Nop(); 3392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch code_size += sizeof(Instr); 3393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Emit the guard sequence before the literal pool. 3396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (option == NoJumpRequired) { 3397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&label_1); 3398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch code_size += sizeof(Instr); 3399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(code_size == range); 3402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK_LITERAL_POOL_SIZE(4); 3403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Possibly generate a literal pool. 3405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ CheckLiteralPool(option); 3406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&label_1); 3407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (expect_dump) { 3408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK_LITERAL_POOL_SIZE(0); 3409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 3410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK_LITERAL_POOL_SIZE(4); 3411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Force a pool flush to check that a second pool functions correctly. 3414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ EmitLiteralPool(JumpRequired); 3415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK_LITERAL_POOL_SIZE(0); 3416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // These loads should be after the pool (and will require a new one). 3418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldr(x4, 0x34567890abcdef12UL); 3419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldr(w5, 0xdcba09fe); 3420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldr(d4, 123.4); 3421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ldr(s5, 250.0); 3422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK_LITERAL_POOL_SIZE(4); 3423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 3424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 3426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Check that the literals loaded correctly. 3428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x1234567890abcdefUL, x0); 3429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfedcba09, x1); 3430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(1.234, d0); 3431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(2.5, s1); 3432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x34567890abcdef12UL, x4); 3433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xdcba09fe, x5); 3434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(123.4, d4); 3435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(250.0, s5); 3436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 3438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(ldr_literal_range_1) { 3442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 3443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LdrLiteralRangeHelper(kRecommendedLiteralPoolRange, 3444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch NoJumpRequired, 3445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch true); 3446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(ldr_literal_range_2) { 3450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 3451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LdrLiteralRangeHelper(kRecommendedLiteralPoolRange-sizeof(Instr), 3452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch NoJumpRequired, 3453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch false); 3454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(ldr_literal_range_3) { 3458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 3459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LdrLiteralRangeHelper(2 * kRecommendedLiteralPoolRange, 3460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch JumpRequired, 3461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch true); 3462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(ldr_literal_range_4) { 3466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 3467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LdrLiteralRangeHelper(2 * kRecommendedLiteralPoolRange-sizeof(Instr), 3468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch JumpRequired, 3469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch false); 3470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(ldr_literal_range_5) { 3474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 3475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LdrLiteralRangeHelper(kLiteralPoolCheckInterval, 3476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch JumpRequired, 3477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch false); 3478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(ldr_literal_range_6) { 3482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 3483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LdrLiteralRangeHelper(kLiteralPoolCheckInterval-sizeof(Instr), 3484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch JumpRequired, 3485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch false); 3486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 3488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(add_sub_imm) { 3490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 3491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 3492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 3494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0x0); 3495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 0x1111); 3496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x2, 0xffffffffffffffffL); 3497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x3, 0x8000000000000000L); 3498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(x10, x0, Operand(0x123)); 3500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(x11, x1, Operand(0x122000)); 3501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(x12, x0, Operand(0xabc << 12)); 3502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(x13, x2, Operand(1)); 3503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(w14, w0, Operand(0x123)); 3505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(w15, w1, Operand(0x122000)); 3506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(w16, w0, Operand(0xabc << 12)); 3507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(w17, w2, Operand(1)); 3508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sub(x20, x0, Operand(0x1)); 3510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sub(x21, x1, Operand(0x111)); 3511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sub(x22, x1, Operand(0x1 << 12)); 3512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sub(x23, x3, Operand(1)); 3513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sub(w24, w0, Operand(0x1)); 3515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sub(w25, w1, Operand(0x111)); 3516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sub(w26, w1, Operand(0x1 << 12)); 3517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sub(w27, w3, Operand(1)); 3518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 3519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 3521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x123, x10); 3523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x123111, x11); 3524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xabc000, x12); 3525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0, x13); 3526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0x123, w14); 3528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0x123111, w15); 3529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0xabc000, w16); 3530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0x0, w17); 3531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffffffffffffL, x20); 3533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x1000, x21); 3534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x111, x22); 3535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x7fffffffffffffffL, x23); 3536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0xffffffff, w24); 3538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0x1000, w25); 3539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0x111, w26); 3540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0xffffffff, w27); 3541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 3543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(add_sub_wide_imm) { 3547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 3548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 3549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 3551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0x0); 3552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 0x1); 3553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(x10, x0, Operand(0x1234567890abcdefUL)); 3555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(x11, x1, Operand(0xffffffff)); 3556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(w12, w0, Operand(0x12345678)); 3558b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(w13, w1, Operand(0xffffffff)); 3559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(w18, w0, Operand(kWMinInt)); 3561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sub(w19, w0, Operand(kWMinInt)); 3562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sub(x20, x0, Operand(0x1234567890abcdefUL)); 3564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sub(w21, w0, Operand(0x12345678)); 3565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 3566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 3568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x1234567890abcdefUL, x10); 3570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x100000000UL, x11); 3571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0x12345678, w12); 3573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0, x13); 3574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(kWMinInt, w18); 3576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(kWMinInt, w19); 3577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(-0x1234567890abcdefUL, x20); 3579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(-0x12345678, w21); 3580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 3582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(add_sub_shifted) { 3586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 3587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 3588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 3590b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0); 3591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 0x0123456789abcdefL); 3592b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x2, 0xfedcba9876543210L); 3593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x3, 0xffffffffffffffffL); 3594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(x10, x1, Operand(x2)); 3596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(x11, x0, Operand(x1, LSL, 8)); 3597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(x12, x0, Operand(x1, LSR, 8)); 3598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(x13, x0, Operand(x1, ASR, 8)); 3599b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(x14, x0, Operand(x2, ASR, 8)); 3600b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(w15, w0, Operand(w1, ASR, 8)); 3601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(w18, w3, Operand(w1, ROR, 8)); 3602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(x19, x3, Operand(x1, ROR, 8)); 3603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3604b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sub(x20, x3, Operand(x2)); 3605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sub(x21, x3, Operand(x1, LSL, 8)); 3606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sub(x22, x3, Operand(x1, LSR, 8)); 3607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sub(x23, x3, Operand(x1, ASR, 8)); 3608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sub(x24, x3, Operand(x2, ASR, 8)); 3609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sub(w25, w3, Operand(w1, ASR, 8)); 3610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sub(w26, w3, Operand(w1, ROR, 8)); 3611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sub(x27, x3, Operand(x1, ROR, 8)); 3612b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 3613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 3615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffffffffffffL, x10); 3617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x23456789abcdef00L, x11); 3618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x000123456789abcdL, x12); 3619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x000123456789abcdL, x13); 3620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfffedcba98765432L, x14); 3621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xff89abcd, x15); 3622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xef89abcc, x18); 3623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xef0123456789abccL, x19); 3624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0123456789abcdefL, x20); 3626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xdcba9876543210ffL, x21); 3627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfffedcba98765432L, x22); 3628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfffedcba98765432L, x23); 3629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x000123456789abcdL, x24); 3630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x00765432, x25); 3631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x10765432, x26); 3632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x10fedcba98765432L, x27); 3633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 3635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(add_sub_extended) { 3639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 3640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 3641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 3643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0); 3644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 0x0123456789abcdefL); 3645b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x2, 0xfedcba9876543210L); 3646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w3, 0x80); 3647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(x10, x0, Operand(x1, UXTB, 0)); 3649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(x11, x0, Operand(x1, UXTB, 1)); 3650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(x12, x0, Operand(x1, UXTH, 2)); 3651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(x13, x0, Operand(x1, UXTW, 4)); 3652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(x14, x0, Operand(x1, SXTB, 0)); 3654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(x15, x0, Operand(x1, SXTB, 1)); 3655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(x16, x0, Operand(x1, SXTH, 2)); 3656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(x17, x0, Operand(x1, SXTW, 3)); 3657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(x18, x0, Operand(x2, SXTB, 0)); 3658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(x19, x0, Operand(x2, SXTB, 1)); 3659b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(x20, x0, Operand(x2, SXTH, 2)); 3660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(x21, x0, Operand(x2, SXTW, 3)); 3661b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3662b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(x22, x1, Operand(x2, SXTB, 1)); 3663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sub(x23, x1, Operand(x2, SXTB, 1)); 3664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(w24, w1, Operand(w2, UXTB, 2)); 3666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(w25, w0, Operand(w1, SXTB, 0)); 3667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(w26, w0, Operand(w1, SXTB, 1)); 3668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(w27, w2, Operand(w1, SXTW, 3)); 3669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(w28, w0, Operand(w1, SXTW, 3)); 3671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(x29, x0, Operand(w1, SXTW, 3)); 3672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sub(x30, x0, Operand(w3, SXTB, 1)); 3674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 3675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 3677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xefL, x10); 3679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x1deL, x11); 3680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x337bcL, x12); 3681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x89abcdef0L, x13); 3682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffffffffffefL, x14); 3684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffffffffffdeL, x15); 3685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffffffff37bcL, x16); 3686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfffffffc4d5e6f78L, x17); 3687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x10L, x18); 3688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x20L, x19); 3689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xc840L, x20); 3690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x3b2a19080L, x21); 3691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0123456789abce0fL, x22); 3693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0123456789abcdcfL, x23); 3694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0x89abce2f, w24); 3696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0xffffffef, w25); 3697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0xffffffde, w26); 3698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0xc3b2a188, w27); 3699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0x4d5e6f78, w28); 3701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfffffffc4d5e6f78L, x29); 3702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(256, x30); 3704b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 3706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(add_sub_negative) { 3710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 3711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 3712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 3714b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0); 3715b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 4687); 3716b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x2, 0x1122334455667788); 3717b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w3, 0x11223344); 3718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w4, 400000); 3719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3720b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(x10, x0, -42); 3721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(x11, x1, -687); 3722b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(x12, x2, -0x88); 3723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sub(x13, x0, -600); 3725b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sub(x14, x1, -313); 3726b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sub(x15, x2, -0x555); 3727b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(w19, w3, -0x344); 3729b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(w20, w4, -2000); 3730b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3731b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sub(w21, w3, -0xbc); 3732b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sub(w22, w4, -2000); 3733b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 3734b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 3736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(-42, x10); 3738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(4000, x11); 3739b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x1122334455667700, x12); 3740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(600, x13); 3742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(5000, x14); 3743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x1122334455667cdd, x15); 3744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3745b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0x11223000, w19); 3746b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(398000, w20); 3747b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3748b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0x11223400, w21); 3749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(402000, w22); 3750b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3751b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 3752b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(add_sub_zero) { 3756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 3757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 3758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 3760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0); 3761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 0); 3762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x2, 0); 3763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Label blob1; 3765b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&blob1); 3766b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(x0, x0, 0); 3767b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sub(x1, x1, 0); 3768b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sub(x2, x2, xzr); 3769b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(0, __ SizeOfCodeGeneratedSince(&blob1)); 3770b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3771b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Label blob2; 3772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&blob2); 3773b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(w3, w3, 0); 3774b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_NE(0, __ SizeOfCodeGeneratedSince(&blob2)); 3775b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3776b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Label blob3; 3777b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&blob3); 3778b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sub(w3, w3, wzr); 3779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_NE(0, __ SizeOfCodeGeneratedSince(&blob3)); 3780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3781b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 3782b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 3784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x0); 3786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x1); 3787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x2); 3788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3789b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 3790b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3792b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(claim_drop_zero) { 3794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 3795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 3796b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3797b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 3798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Label start; 3800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&start); 3801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Claim(0); 3802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Drop(0); 3803b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Claim(xzr, 8); 3804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Drop(xzr, 8); 3805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Claim(xzr, 0); 3806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Drop(xzr, 0); 3807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Claim(x7, 0); 3808b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Drop(x7, 0); 3809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ ClaimBySMI(xzr, 8); 3810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ DropBySMI(xzr, 8); 3811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ ClaimBySMI(xzr, 0); 3812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ DropBySMI(xzr, 0); 3813b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(0, __ SizeOfCodeGeneratedSince(&start)); 3814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 3816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3817b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 3818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3819b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 3820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3821b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3822b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(neg) { 3824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 3825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 3826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 3828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0xf123456789abcdefL); 3829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Immediate. 3831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Neg(x1, 0x123); 3832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Neg(w2, 0x123); 3833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3834b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Shifted. 3835b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Neg(x3, Operand(x0, LSL, 1)); 3836b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Neg(w4, Operand(w0, LSL, 2)); 3837b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Neg(x5, Operand(x0, LSR, 3)); 3838b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Neg(w6, Operand(w0, LSR, 4)); 3839b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Neg(x7, Operand(x0, ASR, 5)); 3840b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Neg(w8, Operand(w0, ASR, 6)); 3841b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Extended. 3843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Neg(w9, Operand(w0, UXTB)); 3844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Neg(x10, Operand(x0, SXTB, 1)); 3845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Neg(w11, Operand(w0, UXTH, 2)); 3846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Neg(x12, Operand(x0, SXTH, 3)); 3847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Neg(w13, Operand(w0, UXTW, 4)); 3848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Neg(x14, Operand(x0, SXTW, 4)); 3849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 3850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 3852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfffffffffffffeddUL, x1); 3854b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfffffedd, x2); 3855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x1db97530eca86422UL, x3); 3856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xd950c844, x4); 3857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xe1db97530eca8643UL, x5); 3858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xf7654322, x6); 3859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0076e5d4c3b2a191UL, x7); 3860b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x01d950c9, x8); 3861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffff11, x9); 3862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0000000000000022UL, x10); 3863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfffcc844, x11); 3864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0000000000019088UL, x12); 3865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x65432110, x13); 3866b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0000000765432110UL, x14); 3867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 3869b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3870b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3871b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3872b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(adc_sbc_shift) { 3873b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 3874b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 3875b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3876b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 3877b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0); 3878b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 1); 3879b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x2, 0x0123456789abcdefL); 3880b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x3, 0xfedcba9876543210L); 3881b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x4, 0xffffffffffffffffL); 3882b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Clear the C flag. 3884b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adds(x0, x0, Operand(0)); 3885b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adc(x5, x2, Operand(x3)); 3887b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adc(x6, x0, Operand(x1, LSL, 60)); 3888b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sbc(x7, x4, Operand(x3, LSR, 4)); 3889b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adc(x8, x2, Operand(x3, ASR, 4)); 3890b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adc(x9, x2, Operand(x3, ROR, 8)); 3891b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3892b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adc(w10, w2, Operand(w3)); 3893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adc(w11, w0, Operand(w1, LSL, 30)); 3894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sbc(w12, w4, Operand(w3, LSR, 4)); 3895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adc(w13, w2, Operand(w3, ASR, 4)); 3896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adc(w14, w2, Operand(w3, ROR, 8)); 3897b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Set the C flag. 3899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmp(w0, Operand(w0)); 3900b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3901b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adc(x18, x2, Operand(x3)); 3902b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adc(x19, x0, Operand(x1, LSL, 60)); 3903b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sbc(x20, x4, Operand(x3, LSR, 4)); 3904b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adc(x21, x2, Operand(x3, ASR, 4)); 3905b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adc(x22, x2, Operand(x3, ROR, 8)); 3906b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3907b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adc(w23, w2, Operand(w3)); 3908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adc(w24, w0, Operand(w1, LSL, 30)); 3909b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sbc(w25, w4, Operand(w3, LSR, 4)); 3910b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adc(w26, w2, Operand(w3, ASR, 4)); 3911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adc(w27, w2, Operand(w3, ROR, 8)); 3912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 3913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3914b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 3915b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffffffffffffL, x5); 3917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1L << 60, x6); 3918b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xf0123456789abcddL, x7); 3919b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0111111111111110L, x8); 3920b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x1222222222222221L, x9); 3921b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3922b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0xffffffff, w10); 3923b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(1 << 30, w11); 3924b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0xf89abcdd, w12); 3925b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0x91111110, w13); 3926b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0x9a222221, w14); 3927b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3928b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffffffffffffL + 1, x18); 3929b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64((1L << 60) + 1, x19); 3930b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xf0123456789abcddL + 1, x20); 3931b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0111111111111110L + 1, x21); 3932b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x1222222222222221L + 1, x22); 3933b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3934b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0xffffffff + 1, w23); 3935b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32((1 << 30) + 1, w24); 3936b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0xf89abcdd + 1, w25); 3937b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0x91111110 + 1, w26); 3938b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0x9a222221 + 1, w27); 3939b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3940b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Check that adc correctly sets the condition flags. 3941b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 3942b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 1); 3943b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 0xffffffffffffffffL); 3944b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Clear the C flag. 3945b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adds(x0, x0, Operand(0)); 3946b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adcs(x10, x0, Operand(x1)); 3947b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 3948b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3949b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 3950b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3951b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_NZCV(ZCFlag); 3952b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x10); 3953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3954b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 3955b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 1); 3956b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 0x8000000000000000L); 3957b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Clear the C flag. 3958b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adds(x0, x0, Operand(0)); 3959b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adcs(x10, x0, Operand(x1, ASR, 63)); 3960b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 3961b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3962b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 3963b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3964b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_NZCV(ZCFlag); 3965b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x10); 3966b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3967b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 3968b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0x10); 3969b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 0x07ffffffffffffffL); 3970b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Clear the C flag. 3971b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adds(x0, x0, Operand(0)); 3972b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adcs(x10, x0, Operand(x1, LSL, 4)); 3973b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 3974b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3975b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 3976b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3977b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_NZCV(NVFlag); 3978b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x8000000000000000L, x10); 3979b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3980b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Check that sbc correctly sets the condition flags. 3981b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 3982b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0); 3983b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 0xffffffffffffffffL); 3984b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Clear the C flag. 3985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adds(x0, x0, Operand(0)); 3986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sbcs(x10, x0, Operand(x1)); 3987b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 3988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 3990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_NZCV(ZFlag); 3992b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x10); 3993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3994b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 3995b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 1); 3996b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 0xffffffffffffffffL); 3997b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Clear the C flag. 3998b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adds(x0, x0, Operand(0)); 3999b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sbcs(x10, x0, Operand(x1, LSR, 1)); 4000b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 4001b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4002b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 4003b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_NZCV(NFlag); 4005b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x8000000000000001L, x10); 4006b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4007b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 4008b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0); 4009b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Clear the C flag. 4010b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adds(x0, x0, Operand(0)); 4011b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sbcs(x10, x0, Operand(0xffffffffffffffffL)); 4012b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 4013b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4014b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 4015b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4016b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_NZCV(ZFlag); 4017b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x10); 4018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4019b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START() 4020b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w0, 0x7fffffff); 4021b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Clear the C flag. 4022b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adds(x0, x0, Operand(0)); 4023b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ngcs(w10, w0); 4024b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 4025b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 4027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4028b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_NZCV(NFlag); 4029b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x80000000, x10); 4030b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4031b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 4032b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Clear the C flag. 4033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adds(x0, x0, Operand(0)); 4034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ngcs(x10, 0x7fffffffffffffffL); 4035b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 4036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 4038b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_NZCV(NFlag); 4040b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x8000000000000000L, x10); 4041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START() 4043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0); 4044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Set the C flag. 4045b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmp(x0, Operand(x0)); 4046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sbcs(x10, x0, Operand(1)); 4047b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 4048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 4050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_NZCV(NFlag); 4052b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffffffffffffL, x10); 4053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START() 4055b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0); 4056b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Set the C flag. 4057b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmp(x0, Operand(x0)); 4058b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ngcs(x10, 0x7fffffffffffffffL); 4059b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 4060b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4061b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 4062b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4063b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_NZCV(NFlag); 4064b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x8000000000000001L, x10); 4065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4066b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 4067b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 4068b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4069b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4070b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(adc_sbc_extend) { 4071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 4072b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 4073b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4074b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 4075b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Clear the C flag. 4076b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adds(x0, x0, Operand(0)); 4077b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4078b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0); 4079b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 1); 4080b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x2, 0x0123456789abcdefL); 4081b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4082b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adc(x10, x1, Operand(w2, UXTB, 1)); 4083b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adc(x11, x1, Operand(x2, SXTH, 2)); 4084b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sbc(x12, x1, Operand(w2, UXTW, 4)); 4085b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adc(x13, x1, Operand(x2, UXTX, 4)); 4086b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4087b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adc(w14, w1, Operand(w2, UXTB, 1)); 4088b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adc(w15, w1, Operand(w2, SXTH, 2)); 4089b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adc(w9, w1, Operand(w2, UXTW, 4)); 4090b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4091b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Set the C flag. 4092b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmp(w0, Operand(w0)); 4093b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4094b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adc(x20, x1, Operand(w2, UXTB, 1)); 4095b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adc(x21, x1, Operand(x2, SXTH, 2)); 4096b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sbc(x22, x1, Operand(w2, UXTW, 4)); 4097b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adc(x23, x1, Operand(x2, UXTX, 4)); 4098b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4099b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adc(w24, w1, Operand(w2, UXTB, 1)); 4100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adc(w25, w1, Operand(w2, SXTH, 2)); 4101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adc(w26, w1, Operand(w2, UXTW, 4)); 4102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 4103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 4105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x1df, x10); 4107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffffffff37bdL, x11); 4108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfffffff765432110L, x12); 4109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x123456789abcdef1L, x13); 4110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0x1df, w14); 4112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0xffff37bd, w15); 4113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0x9abcdef1, w9); 4114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x1df + 1, x20); 4116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffffffff37bdL + 1, x21); 4117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfffffff765432110L + 1, x22); 4118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x123456789abcdef1L + 1, x23); 4119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0x1df + 1, w24); 4121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0xffff37bd + 1, w25); 4122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0x9abcdef1 + 1, w26); 4123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Check that adc correctly sets the condition flags. 4125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 4126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0xff); 4127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 0xffffffffffffffffL); 4128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Clear the C flag. 4129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adds(x0, x0, Operand(0)); 4130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adcs(x10, x0, Operand(x1, SXTX, 1)); 4131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 4132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 4134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_NZCV(CFlag); 4136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 4138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0x7fffffffffffffffL); 4139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 1); 4140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Clear the C flag. 4141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adds(x0, x0, Operand(0)); 4142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adcs(x10, x0, Operand(x1, UXTB, 2)); 4143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 4144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 4146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_NZCV(NVFlag); 4148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 4150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0x7fffffffffffffffL); 4151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Clear the C flag. 4152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adds(x0, x0, Operand(0)); 4153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adcs(x10, x0, Operand(1)); 4154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 4155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 4157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_NZCV(NVFlag); 4159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 4161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 4162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(adc_sbc_wide_imm) { 4165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 4166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 4167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 4169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0); 4170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Clear the C flag. 4172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adds(x0, x0, Operand(0)); 4173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adc(x7, x0, Operand(0x1234567890abcdefUL)); 4175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adc(w8, w0, Operand(0xffffffff)); 4176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sbc(x9, x0, Operand(0x1234567890abcdefUL)); 4177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sbc(w10, w0, Operand(0xffffffff)); 4178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ngc(x11, Operand(0xffffffff00000000UL)); 4179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ngc(w12, Operand(0xffff0000)); 4180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Set the C flag. 4182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmp(w0, Operand(w0)); 4183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adc(x18, x0, Operand(0x1234567890abcdefUL)); 4185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adc(w19, w0, Operand(0xffffffff)); 4186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sbc(x20, x0, Operand(0x1234567890abcdefUL)); 4187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sbc(w21, w0, Operand(0xffffffff)); 4188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ngc(x22, Operand(0xffffffff00000000UL)); 4189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ngc(w23, Operand(0xffff0000)); 4190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 4191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 4193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x1234567890abcdefUL, x7); 4195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffff, x8); 4196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xedcba9876f543210UL, x9); 4197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x10); 4198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffff, x11); 4199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffff, x12); 4200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x1234567890abcdefUL + 1, x18); 4202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x19); 4203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xedcba9876f543211UL, x20); 4204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x21); 4205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x100000000UL, x22); 4206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x10000, x23); 4207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 4209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 4210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(flags) { 4213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 4214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 4215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 4217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0); 4218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 0x1111111111111111L); 4219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Neg(x10, Operand(x0)); 4220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Neg(x11, Operand(x1)); 4221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Neg(w12, Operand(w1)); 4222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Clear the C flag. 4223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adds(x0, x0, Operand(0)); 4224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ngc(x13, Operand(x0)); 4225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Set the C flag. 4226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmp(x0, Operand(x0)); 4227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ngc(w14, Operand(w0)); 4228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 4229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 4231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x10); 4233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(-0x1111111111111111L, x11); 4234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(-0x11111111, w12); 4235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(-1L, x13); 4236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0, w14); 4237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 4239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0); 4240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmp(x0, Operand(x0)); 4241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 4242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 4244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_NZCV(ZCFlag); 4246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 4248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w0, 0); 4249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmp(w0, Operand(w0)); 4250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 4251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 4253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_NZCV(ZCFlag); 4255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 4257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0); 4258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 0x1111111111111111L); 4259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmp(x0, Operand(x1)); 4260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 4261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 4263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_NZCV(NFlag); 4265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 4267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w0, 0); 4268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w1, 0x11111111); 4269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmp(w0, Operand(w1)); 4270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 4271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 4273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_NZCV(NFlag); 4275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 4277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 0x1111111111111111L); 4278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmp(x1, Operand(0)); 4279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 4280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 4282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_NZCV(CFlag); 4284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 4286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w1, 0x11111111); 4287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmp(w1, Operand(0)); 4288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 4289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 4291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_NZCV(CFlag); 4293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 4295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 1); 4296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 0x7fffffffffffffffL); 4297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmn(x1, Operand(x0)); 4298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 4299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 4301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_NZCV(NVFlag); 4303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 4305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w0, 1); 4306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w1, 0x7fffffff); 4307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmn(w1, Operand(w0)); 4308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 4309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 4311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_NZCV(NVFlag); 4313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 4315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 1); 4316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 0xffffffffffffffffL); 4317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmn(x1, Operand(x0)); 4318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 4319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 4321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_NZCV(ZCFlag); 4323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 4325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w0, 1); 4326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w1, 0xffffffff); 4327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmn(w1, Operand(w0)); 4328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 4329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 4331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_NZCV(ZCFlag); 4333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 4335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w0, 0); 4336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w1, 1); 4337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Clear the C flag. 4338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adds(w0, w0, Operand(0)); 4339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ngcs(w0, Operand(w1)); 4340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 4341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 4343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_NZCV(NFlag); 4345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 4347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w0, 0); 4348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w1, 0); 4349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Set the C flag. 4350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmp(w0, Operand(w0)); 4351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ngcs(w0, Operand(w1)); 4352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 4353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 4355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_NZCV(ZCFlag); 4357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 4359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 4360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(cmp_shift) { 4363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 4364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 4365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 4367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x18, 0xf0000000); 4368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x19, 0xf000000010000000UL); 4369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x20, 0xf0000000f0000000UL); 4370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x21, 0x7800000078000000UL); 4371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x22, 0x3c0000003c000000UL); 4372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x23, 0x8000000780000000UL); 4373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x24, 0x0000000f00000000UL); 4374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x25, 0x00000003c0000000UL); 4375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x26, 0x8000000780000000UL); 4376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x27, 0xc0000003); 4377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmp(w20, Operand(w21, LSL, 1)); 4379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mrs(x0, NZCV); 4380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmp(x20, Operand(x22, LSL, 2)); 4382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mrs(x1, NZCV); 4383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmp(w19, Operand(w23, LSR, 3)); 4385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mrs(x2, NZCV); 4386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmp(x18, Operand(x24, LSR, 4)); 4388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mrs(x3, NZCV); 4389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmp(w20, Operand(w25, ASR, 2)); 4391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mrs(x4, NZCV); 4392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmp(x20, Operand(x26, ASR, 3)); 4394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mrs(x5, NZCV); 4395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmp(w27, Operand(w22, ROR, 28)); 4397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mrs(x6, NZCV); 4398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmp(x20, Operand(x21, ROR, 31)); 4400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mrs(x7, NZCV); 4401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 4402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 4404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(ZCFlag, w0); 4406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(ZCFlag, w1); 4407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(ZCFlag, w2); 4408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(ZCFlag, w3); 4409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(ZCFlag, w4); 4410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(ZCFlag, w5); 4411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(ZCFlag, w6); 4412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(ZCFlag, w7); 4413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 4415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 4416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(cmp_extend) { 4419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 4420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 4421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 4423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w20, 0x2); 4424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w21, 0x1); 4425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x22, 0xffffffffffffffffUL); 4426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x23, 0xff); 4427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x24, 0xfffffffffffffffeUL); 4428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x25, 0xffff); 4429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x26, 0xffffffff); 4430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmp(w20, Operand(w21, LSL, 1)); 4432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mrs(x0, NZCV); 4433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmp(x22, Operand(x23, SXTB, 0)); 4435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mrs(x1, NZCV); 4436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmp(x24, Operand(x23, SXTB, 1)); 4438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mrs(x2, NZCV); 4439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmp(x24, Operand(x23, UXTB, 1)); 4441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mrs(x3, NZCV); 4442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmp(w22, Operand(w25, UXTH)); 4444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mrs(x4, NZCV); 4445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmp(x22, Operand(x25, SXTH)); 4447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mrs(x5, NZCV); 4448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmp(x22, Operand(x26, UXTW)); 4450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mrs(x6, NZCV); 4451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmp(x24, Operand(x26, SXTW, 1)); 4453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mrs(x7, NZCV); 4454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 4455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 4457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(ZCFlag, w0); 4459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(ZCFlag, w1); 4460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(ZCFlag, w2); 4461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(NCFlag, w3); 4462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(NCFlag, w4); 4463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(ZCFlag, w5); 4464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(NCFlag, w6); 4465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(ZCFlag, w7); 4466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 4468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 4469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(ccmp) { 4472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 4473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 4474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 4476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w16, 0); 4477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w17, 1); 4478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmp(w16, w16); 4479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ccmp(w16, w17, NCFlag, eq); 4480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mrs(x0, NZCV); 4481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmp(w16, w16); 4483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ccmp(w16, w17, NCFlag, ne); 4484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mrs(x1, NZCV); 4485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmp(x16, x16); 4487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ccmn(x16, 2, NZCVFlag, eq); 4488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mrs(x2, NZCV); 4489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmp(x16, x16); 4491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ccmn(x16, 2, NZCVFlag, ne); 4492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mrs(x3, NZCV); 4493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ ccmp(x16, x16, NZCVFlag, al); 4495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mrs(x4, NZCV); 4496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ ccmp(x16, x16, NZCVFlag, nv); 4498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mrs(x5, NZCV); 4499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 4501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 4503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(NFlag, w0); 4505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(NCFlag, w1); 4506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(NoFlag, w2); 4507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(NZCVFlag, w3); 4508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(ZCFlag, w4); 4509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(ZCFlag, w5); 4510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 4512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 4513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(ccmp_wide_imm) { 4516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 4517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 4518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 4520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w20, 0); 4521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmp(w20, Operand(w20)); 4523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ccmp(w20, Operand(0x12345678), NZCVFlag, eq); 4524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mrs(x0, NZCV); 4525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmp(w20, Operand(w20)); 4527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ccmp(x20, Operand(0xffffffffffffffffUL), NZCVFlag, eq); 4528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mrs(x1, NZCV); 4529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 4530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 4532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(NFlag, w0); 4534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(NoFlag, w1); 4535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 4537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 4538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(ccmp_shift_extend) { 4541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 4542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 4543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 4545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w20, 0x2); 4546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w21, 0x1); 4547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x22, 0xffffffffffffffffUL); 4548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x23, 0xff); 4549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x24, 0xfffffffffffffffeUL); 4550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmp(w20, Operand(w20)); 4552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ccmp(w20, Operand(w21, LSL, 1), NZCVFlag, eq); 4553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mrs(x0, NZCV); 4554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmp(w20, Operand(w20)); 4556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ccmp(x22, Operand(x23, SXTB, 0), NZCVFlag, eq); 4557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mrs(x1, NZCV); 4558b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmp(w20, Operand(w20)); 4560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ccmp(x24, Operand(x23, SXTB, 1), NZCVFlag, eq); 4561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mrs(x2, NZCV); 4562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmp(w20, Operand(w20)); 4564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ccmp(x24, Operand(x23, UXTB, 1), NZCVFlag, eq); 4565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mrs(x3, NZCV); 4566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmp(w20, Operand(w20)); 4568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ccmp(x24, Operand(x23, UXTB, 1), NZCVFlag, ne); 4569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mrs(x4, NZCV); 4570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 4571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 4573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(ZCFlag, w0); 4575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(ZCFlag, w1); 4576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(ZCFlag, w2); 4577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(NCFlag, w3); 4578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(NZCVFlag, w4); 4579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 4581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 4582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(csel) { 4585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 4586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 4587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 4589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x16, 0); 4590b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x24, 0x0000000f0000000fUL); 4591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x25, 0x0000001f0000001fUL); 4592b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x26, 0); 4593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x27, 0); 4594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmp(w16, 0); 4596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Csel(w0, w24, w25, eq); 4597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Csel(w1, w24, w25, ne); 4598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Csinc(w2, w24, w25, mi); 4599b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Csinc(w3, w24, w25, pl); 4600b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ csel(w13, w24, w25, al); 4602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ csel(x14, x24, x25, nv); 4603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4604b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmp(x16, 1); 4605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Csinv(x4, x24, x25, gt); 4606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Csinv(x5, x24, x25, le); 4607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Csneg(x6, x24, x25, hs); 4608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Csneg(x7, x24, x25, lo); 4609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cset(w8, ne); 4611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Csetm(w9, ne); 4612b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cinc(x10, x25, ne); 4613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cinv(x11, x24, ne); 4614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cneg(x12, x24, ne); 4615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ csel(w15, w24, w25, al); 4617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ csel(x18, x24, x25, nv); 4618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ CzeroX(x24, ne); 4620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ CzeroX(x25, eq); 4621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ CmovX(x26, x25, ne); 4623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ CmovX(x27, x25, eq); 4624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 4625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 4627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0000000f, x0); 4629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0000001f, x1); 4630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x00000020, x2); 4631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0000000f, x3); 4632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffe0ffffffe0UL, x4); 4633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0000000f0000000fUL, x5); 4634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffe0ffffffe1UL, x6); 4635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0000000f0000000fUL, x7); 4636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x00000001, x8); 4637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffff, x9); 4638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0000001f00000020UL, x10); 4639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfffffff0fffffff0UL, x11); 4640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfffffff0fffffff1UL, x12); 4641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0000000f, x13); 4642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0000000f0000000fUL, x14); 4643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0000000f, x15); 4644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0000000f0000000fUL, x18); 4645b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x24); 4646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0000001f0000001fUL, x25); 4647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0000001f0000001fUL, x26); 4648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x27); 4649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 4651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 4652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(csel_imm) { 4655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 4656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 4657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 4659b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x18, 0); 4660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x19, 0x80000000); 4661b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x20, 0x8000000000000000UL); 4662b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmp(x18, Operand(0)); 4664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Csel(w0, w19, -2, ne); 4665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Csel(w1, w19, -1, ne); 4666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Csel(w2, w19, 0, ne); 4667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Csel(w3, w19, 1, ne); 4668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Csel(w4, w19, 2, ne); 4669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Csel(w5, w19, Operand(w19, ASR, 31), ne); 4670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Csel(w6, w19, Operand(w19, ROR, 1), ne); 4671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Csel(w7, w19, 3, eq); 4672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Csel(x8, x20, -2, ne); 4674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Csel(x9, x20, -1, ne); 4675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Csel(x10, x20, 0, ne); 4676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Csel(x11, x20, 1, ne); 4677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Csel(x12, x20, 2, ne); 4678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Csel(x13, x20, Operand(x20, ASR, 63), ne); 4679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Csel(x14, x20, Operand(x20, ROR, 1), ne); 4680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Csel(x15, x20, 3, eq); 4681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 4683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 4685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(-2, w0); 4687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(-1, w1); 4688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0, w2); 4689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(1, w3); 4690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(2, w4); 4691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(-1, w5); 4692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0x40000000, w6); 4693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0x80000000, w7); 4694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(-2, x8); 4696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(-1, x9); 4697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x10); 4698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x11); 4699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(2, x12); 4700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(-1, x13); 4701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x4000000000000000UL, x14); 4702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x8000000000000000UL, x15); 4703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4704b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 4705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 4706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(lslv) { 4709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 4710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 4711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint64_t value = 0x0123456789abcdefUL; 4713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int shift[] = {1, 3, 5, 9, 17, 33}; 4714b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4715b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 4716b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, value); 4717b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w1, shift[0]); 4718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w2, shift[1]); 4719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w3, shift[2]); 4720b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w4, shift[3]); 4721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w5, shift[4]); 4722b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w6, shift[5]); 4723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ lslv(x0, x0, xzr); 4725b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4726b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Lsl(x16, x0, x1); 4727b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Lsl(x17, x0, x2); 4728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Lsl(x18, x0, x3); 4729b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Lsl(x19, x0, x4); 4730b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Lsl(x20, x0, x5); 4731b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Lsl(x21, x0, x6); 4732b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4733b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Lsl(w22, w0, w1); 4734b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Lsl(w23, w0, w2); 4735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Lsl(w24, w0, w3); 4736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Lsl(w25, w0, w4); 4737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Lsl(w26, w0, w5); 4738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Lsl(w27, w0, w6); 4739b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 4740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 4742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(value, x0); 4744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(value << (shift[0] & 63), x16); 4745b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(value << (shift[1] & 63), x17); 4746b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(value << (shift[2] & 63), x18); 4747b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(value << (shift[3] & 63), x19); 4748b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(value << (shift[4] & 63), x20); 4749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(value << (shift[5] & 63), x21); 4750b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(value << (shift[0] & 31), w22); 4751b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(value << (shift[1] & 31), w23); 4752b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(value << (shift[2] & 31), w24); 4753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(value << (shift[3] & 31), w25); 4754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(value << (shift[4] & 31), w26); 4755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(value << (shift[5] & 31), w27); 4756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 4758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 4759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(lsrv) { 4762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 4763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 4764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4765b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint64_t value = 0x0123456789abcdefUL; 4766b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int shift[] = {1, 3, 5, 9, 17, 33}; 4767b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4768b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 4769b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, value); 4770b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w1, shift[0]); 4771b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w2, shift[1]); 4772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w3, shift[2]); 4773b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w4, shift[3]); 4774b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w5, shift[4]); 4775b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w6, shift[5]); 4776b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4777b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ lsrv(x0, x0, xzr); 4778b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Lsr(x16, x0, x1); 4780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Lsr(x17, x0, x2); 4781b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Lsr(x18, x0, x3); 4782b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Lsr(x19, x0, x4); 4783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Lsr(x20, x0, x5); 4784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Lsr(x21, x0, x6); 4785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Lsr(w22, w0, w1); 4787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Lsr(w23, w0, w2); 4788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Lsr(w24, w0, w3); 4789b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Lsr(w25, w0, w4); 4790b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Lsr(w26, w0, w5); 4791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Lsr(w27, w0, w6); 4792b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 4793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 4795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4796b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(value, x0); 4797b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(value >> (shift[0] & 63), x16); 4798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(value >> (shift[1] & 63), x17); 4799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(value >> (shift[2] & 63), x18); 4800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(value >> (shift[3] & 63), x19); 4801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(value >> (shift[4] & 63), x20); 4802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(value >> (shift[5] & 63), x21); 4803b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch value &= 0xffffffffUL; 4805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(value >> (shift[0] & 31), w22); 4806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(value >> (shift[1] & 31), w23); 4807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(value >> (shift[2] & 31), w24); 4808b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(value >> (shift[3] & 31), w25); 4809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(value >> (shift[4] & 31), w26); 4810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(value >> (shift[5] & 31), w27); 4811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 4813b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 4814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(asrv) { 4817b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 4818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 4819b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int64_t value = 0xfedcba98fedcba98UL; 4821b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int shift[] = {1, 3, 5, 9, 17, 33}; 4822b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 4824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, value); 4825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w1, shift[0]); 4826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w2, shift[1]); 4827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w3, shift[2]); 4828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w4, shift[3]); 4829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w5, shift[4]); 4830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w6, shift[5]); 4831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ asrv(x0, x0, xzr); 4833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4834b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Asr(x16, x0, x1); 4835b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Asr(x17, x0, x2); 4836b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Asr(x18, x0, x3); 4837b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Asr(x19, x0, x4); 4838b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Asr(x20, x0, x5); 4839b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Asr(x21, x0, x6); 4840b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4841b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Asr(w22, w0, w1); 4842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Asr(w23, w0, w2); 4843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Asr(w24, w0, w3); 4844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Asr(w25, w0, w4); 4845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Asr(w26, w0, w5); 4846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Asr(w27, w0, w6); 4847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 4848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 4850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(value, x0); 4852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(value >> (shift[0] & 63), x16); 4853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(value >> (shift[1] & 63), x17); 4854b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(value >> (shift[2] & 63), x18); 4855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(value >> (shift[3] & 63), x19); 4856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(value >> (shift[4] & 63), x20); 4857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(value >> (shift[5] & 63), x21); 4858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t value32 = static_cast<int32_t>(value & 0xffffffffUL); 4860b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(value32 >> (shift[0] & 31), w22); 4861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(value32 >> (shift[1] & 31), w23); 4862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(value32 >> (shift[2] & 31), w24); 4863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(value32 >> (shift[3] & 31), w25); 4864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(value32 >> (shift[4] & 31), w26); 4865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(value32 >> (shift[5] & 31), w27); 4866b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 4868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 4869b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4870b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4871b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(rorv) { 4872b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 4873b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 4874b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4875b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint64_t value = 0x0123456789abcdefUL; 4876b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int shift[] = {4, 8, 12, 16, 24, 36}; 4877b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4878b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 4879b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, value); 4880b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w1, shift[0]); 4881b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w2, shift[1]); 4882b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w3, shift[2]); 4883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w4, shift[3]); 4884b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w5, shift[4]); 4885b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w6, shift[5]); 4886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4887b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ rorv(x0, x0, xzr); 4888b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4889b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ror(x16, x0, x1); 4890b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ror(x17, x0, x2); 4891b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ror(x18, x0, x3); 4892b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ror(x19, x0, x4); 4893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ror(x20, x0, x5); 4894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ror(x21, x0, x6); 4895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ror(w22, w0, w1); 4897b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ror(w23, w0, w2); 4898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ror(w24, w0, w3); 4899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ror(w25, w0, w4); 4900b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ror(w26, w0, w5); 4901b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ror(w27, w0, w6); 4902b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 4903b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4904b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 4905b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4906b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(value, x0); 4907b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xf0123456789abcdeUL, x16); 4908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xef0123456789abcdUL, x17); 4909b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xdef0123456789abcUL, x18); 4910b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xcdef0123456789abUL, x19); 4911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xabcdef0123456789UL, x20); 4912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x789abcdef0123456UL, x21); 4913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0xf89abcde, w22); 4914b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0xef89abcd, w23); 4915b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0xdef89abc, w24); 4916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0xcdef89ab, w25); 4917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0xabcdef89, w26); 4918b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0xf89abcde, w27); 4919b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4920b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 4921b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 4922b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4923b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4924b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(bfm) { 4925b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 4926b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 4927b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4928b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 4929b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 0x0123456789abcdefL); 4930b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4931b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x10, 0x8888888888888888L); 4932b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x11, 0x8888888888888888L); 4933b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x12, 0x8888888888888888L); 4934b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x13, 0x8888888888888888L); 4935b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w20, 0x88888888); 4936b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w21, 0x88888888); 4937b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4938b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ bfm(x10, x1, 16, 31); 4939b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ bfm(x11, x1, 32, 15); 4940b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4941b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ bfm(w20, w1, 16, 23); 4942b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ bfm(w21, w1, 24, 15); 4943b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4944b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Aliases. 4945b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bfi(x12, x1, 16, 8); 4946b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bfxil(x13, x1, 16, 8); 4947b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 4948b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4949b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 4950b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4951b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4952b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x88888888888889abL, x10); 4953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x8888cdef88888888L, x11); 4954b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4955b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0x888888ab, w20); 4956b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0x88cdef88, w21); 4957b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4958b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x8888888888ef8888L, x12); 4959b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x88888888888888abL, x13); 4960b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4961b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 4962b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 4963b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4964b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4965b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(sbfm) { 4966b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 4967b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 4968b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4969b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 4970b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 0x0123456789abcdefL); 4971b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x2, 0xfedcba9876543210L); 4972b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4973b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ sbfm(x10, x1, 16, 31); 4974b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ sbfm(x11, x1, 32, 15); 4975b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ sbfm(x12, x1, 32, 47); 4976b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ sbfm(x13, x1, 48, 35); 4977b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4978b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ sbfm(w14, w1, 16, 23); 4979b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ sbfm(w15, w1, 24, 15); 4980b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ sbfm(w16, w2, 16, 23); 4981b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ sbfm(w17, w2, 24, 15); 4982b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4983b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Aliases. 4984b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Asr(x18, x1, 32); 4985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Asr(x19, x2, 32); 4986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sbfiz(x20, x1, 8, 16); 4987b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sbfiz(x21, x2, 8, 16); 4988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sbfx(x22, x1, 8, 16); 4989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sbfx(x23, x2, 8, 16); 4990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sxtb(x24, w1); 4991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sxtb(x25, x2); 4992b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sxth(x26, w1); 4993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sxth(x27, x2); 4994b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sxtw(x28, w1); 4995b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Sxtw(x29, x2); 4996b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 4997b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4998b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 4999b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5000b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5001b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffffffff89abL, x10); 5002b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffcdef00000000L, x11); 5003b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x4567L, x12); 5004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x789abcdef0000L, x13); 5005b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5006b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0xffffffab, w14); 5007b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0xffcdef00, w15); 5008b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0x54, w16); 5009b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0x00321000, w17); 5010b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5011b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x01234567L, x18); 5012b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfffffffffedcba98L, x19); 5013b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffffffcdef00L, x20); 5014b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x321000L, x21); 5015b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffffffffabcdL, x22); 5016b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x5432L, x23); 5017b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffffffffffefL, x24); 5018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x10, x25); 5019b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffffffffcdefL, x26); 5020b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x3210, x27); 5021b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffff89abcdefL, x28); 5022b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x76543210, x29); 5023b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5024b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 5025b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 5026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5028b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(ubfm) { 5029b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 5030b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 5031b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5032b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 5033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 0x0123456789abcdefL); 5034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x2, 0xfedcba9876543210L); 5035b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x10, 0x8888888888888888L); 5037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x11, 0x8888888888888888L); 5038b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ ubfm(x10, x1, 16, 31); 5040b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ ubfm(x11, x1, 32, 15); 5041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ ubfm(x12, x1, 32, 47); 5042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ ubfm(x13, x1, 48, 35); 5043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ ubfm(w25, w1, 16, 23); 5045b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ ubfm(w26, w1, 24, 15); 5046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ ubfm(w27, w2, 16, 23); 5047b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ ubfm(w28, w2, 24, 15); 5048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Aliases 5050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Lsl(x15, x1, 63); 5051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Lsl(x16, x1, 0); 5052b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Lsr(x17, x1, 32); 5053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ubfiz(x18, x1, 8, 16); 5054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ubfx(x19, x1, 8, 16); 5055b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Uxtb(x20, x1); 5056b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Uxth(x21, x1); 5057b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Uxtw(x22, x1); 5058b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 5059b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5060b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 5061b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5062b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x00000000000089abL, x10); 5063b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0000cdef00000000L, x11); 5064b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x4567L, x12); 5065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x789abcdef0000L, x13); 5066b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5067b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0x000000ab, w25); 5068b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0x00cdef00, w26); 5069b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0x54, w27); 5070b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0x00321000, w28); 5071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5072b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x8000000000000000L, x15); 5073b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0123456789abcdefL, x16); 5074b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x01234567L, x17); 5075b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xcdef00L, x18); 5076b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xabcdL, x19); 5077b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xefL, x20); 5078b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xcdefL, x21); 5079b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x89abcdefL, x22); 5080b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5081b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 5082b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 5083b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5084b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5085b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(extr) { 5086b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 5087b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 5088b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5089b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 5090b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 0x0123456789abcdefL); 5091b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x2, 0xfedcba9876543210L); 5092b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5093b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Extr(w10, w1, w2, 0); 5094b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Extr(x11, x1, x2, 0); 5095b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Extr(w12, w1, w2, 1); 5096b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Extr(x13, x2, x1, 2); 5097b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5098b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ror(w20, w1, 0); 5099b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ror(x21, x1, 0); 5100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ror(w22, w2, 17); 5101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ror(w23, w1, 31); 5102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ror(x24, x2, 1); 5103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ror(x25, x1, 63); 5104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 5105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 5107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x76543210, x10); 5109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfedcba9876543210L, x11); 5110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xbb2a1908, x12); 5111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0048d159e26af37bUL, x13); 5112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x89abcdef, x20); 5113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0123456789abcdefL, x21); 5114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x19083b2a, x22); 5115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x13579bdf, x23); 5116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x7f6e5d4c3b2a1908UL, x24); 5117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x02468acf13579bdeUL, x25); 5118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 5120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 5121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(fmov_imm) { 5124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 5125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 5126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 5128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s11, 1.0); 5129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d22, -13.0); 5130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s1, 255.0); 5131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d2, 12.34567); 5132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s3, 0.0); 5133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d4, 0.0); 5134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s5, kFP32PositiveInfinity); 5135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d6, kFP64NegativeInfinity); 5136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 5137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 5139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(1.0, s11); 5141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(-13.0, d22); 5142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(255.0, s1); 5143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(12.34567, d2); 5144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(0.0, s3); 5145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(0.0, d4); 5146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(kFP32PositiveInfinity, s5); 5147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(kFP64NegativeInfinity, d6); 5148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 5150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 5151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(fmov_reg) { 5154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 5155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 5156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 5158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s20, 1.0); 5159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(w10, s20); 5160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s30, w10); 5161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s5, s20); 5162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d1, -13.0); 5163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(x1, d1); 5164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d2, x1); 5165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d4, d1); 5166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d6, rawbits_to_double(0x0123456789abcdefL)); 5167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s6, s6); 5168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 5169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 5171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(float_to_rawbits(1.0), w10); 5173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(1.0, s30); 5174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(1.0, s5); 5175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(double_to_rawbits(-13.0), x1); 5176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(-13.0, d2); 5177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(-13.0, d4); 5178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(rawbits_to_float(0x89abcdef), s6); 5179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 5181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 5182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(fadd) { 5185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 5186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 5187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 5189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s14, -0.0f); 5190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s15, kFP32PositiveInfinity); 5191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s16, kFP32NegativeInfinity); 5192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s17, 3.25f); 5193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s18, 1.0f); 5194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s19, 0.0f); 5195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d26, -0.0); 5197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d27, kFP64PositiveInfinity); 5198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d28, kFP64NegativeInfinity); 5199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d29, 0.0); 5200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d30, -2.0); 5201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d31, 2.25); 5202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fadd(s0, s17, s18); 5204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fadd(s1, s18, s19); 5205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fadd(s2, s14, s18); 5206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fadd(s3, s15, s18); 5207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fadd(s4, s16, s18); 5208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fadd(s5, s15, s16); 5209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fadd(s6, s16, s15); 5210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fadd(d7, d30, d31); 5212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fadd(d8, d29, d31); 5213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fadd(d9, d26, d31); 5214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fadd(d10, d27, d31); 5215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fadd(d11, d28, d31); 5216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fadd(d12, d27, d28); 5217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fadd(d13, d28, d27); 5218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 5219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 5221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(4.25, s0); 5223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(1.0, s1); 5224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(1.0, s2); 5225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(kFP32PositiveInfinity, s3); 5226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(kFP32NegativeInfinity, s4); 5227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(kFP32DefaultNaN, s5); 5228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(kFP32DefaultNaN, s6); 5229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(0.25, d7); 5230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(2.25, d8); 5231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(2.25, d9); 5232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(kFP64PositiveInfinity, d10); 5233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(kFP64NegativeInfinity, d11); 5234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(kFP64DefaultNaN, d12); 5235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(kFP64DefaultNaN, d13); 5236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 5238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 5239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(fsub) { 5242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 5243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 5244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 5246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s14, -0.0f); 5247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s15, kFP32PositiveInfinity); 5248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s16, kFP32NegativeInfinity); 5249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s17, 3.25f); 5250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s18, 1.0f); 5251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s19, 0.0f); 5252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d26, -0.0); 5254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d27, kFP64PositiveInfinity); 5255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d28, kFP64NegativeInfinity); 5256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d29, 0.0); 5257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d30, -2.0); 5258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d31, 2.25); 5259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fsub(s0, s17, s18); 5261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fsub(s1, s18, s19); 5262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fsub(s2, s14, s18); 5263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fsub(s3, s18, s15); 5264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fsub(s4, s18, s16); 5265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fsub(s5, s15, s15); 5266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fsub(s6, s16, s16); 5267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fsub(d7, d30, d31); 5269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fsub(d8, d29, d31); 5270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fsub(d9, d26, d31); 5271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fsub(d10, d31, d27); 5272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fsub(d11, d31, d28); 5273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fsub(d12, d27, d27); 5274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fsub(d13, d28, d28); 5275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 5276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 5278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(2.25, s0); 5280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(1.0, s1); 5281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(-1.0, s2); 5282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(kFP32NegativeInfinity, s3); 5283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(kFP32PositiveInfinity, s4); 5284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(kFP32DefaultNaN, s5); 5285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(kFP32DefaultNaN, s6); 5286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(-4.25, d7); 5287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(-2.25, d8); 5288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(-2.25, d9); 5289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(kFP64NegativeInfinity, d10); 5290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(kFP64PositiveInfinity, d11); 5291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(kFP64DefaultNaN, d12); 5292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(kFP64DefaultNaN, d13); 5293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 5295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 5296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(fmul) { 5299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 5300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 5301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 5303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s14, -0.0f); 5304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s15, kFP32PositiveInfinity); 5305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s16, kFP32NegativeInfinity); 5306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s17, 3.25f); 5307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s18, 2.0f); 5308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s19, 0.0f); 5309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s20, -2.0f); 5310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d26, -0.0); 5312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d27, kFP64PositiveInfinity); 5313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d28, kFP64NegativeInfinity); 5314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d29, 0.0); 5315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d30, -2.0); 5316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d31, 2.25); 5317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmul(s0, s17, s18); 5319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmul(s1, s18, s19); 5320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmul(s2, s14, s14); 5321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmul(s3, s15, s20); 5322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmul(s4, s16, s20); 5323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmul(s5, s15, s19); 5324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmul(s6, s19, s16); 5325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmul(d7, d30, d31); 5327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmul(d8, d29, d31); 5328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmul(d9, d26, d26); 5329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmul(d10, d27, d30); 5330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmul(d11, d28, d30); 5331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmul(d12, d27, d29); 5332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmul(d13, d29, d28); 5333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 5334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 5336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(6.5, s0); 5338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(0.0, s1); 5339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(0.0, s2); 5340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(kFP32NegativeInfinity, s3); 5341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(kFP32PositiveInfinity, s4); 5342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(kFP32DefaultNaN, s5); 5343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(kFP32DefaultNaN, s6); 5344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(-4.5, d7); 5345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(0.0, d8); 5346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(0.0, d9); 5347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(kFP64NegativeInfinity, d10); 5348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(kFP64PositiveInfinity, d11); 5349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(kFP64DefaultNaN, d12); 5350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(kFP64DefaultNaN, d13); 5351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 5353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 5354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic void FmaddFmsubHelper(double n, double m, double a, 5357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double fmadd, double fmsub, 5358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double fnmadd, double fnmsub) { 5359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 5360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 5361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d0, n); 5363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d1, m); 5364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d2, a); 5365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmadd(d28, d0, d1, d2); 5366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmsub(d29, d0, d1, d2); 5367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fnmadd(d30, d0, d1, d2); 5368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fnmsub(d31, d0, d1, d2); 5369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 5371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 5372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(fmadd, d28); 5374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(fmsub, d29); 5375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(fnmadd, d30); 5376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(fnmsub, d31); 5377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 5379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 5380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(fmadd_fmsub_double) { 5383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 5384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // It's hard to check the result of fused operations because the only way to 5386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // calculate the result is using fma, which is what the simulator uses anyway. 5387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // TODO(jbramley): Add tests to check behaviour against a hardware trace. 5388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Basic operation. 5390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(1.0, 2.0, 3.0, 5.0, 1.0, -5.0, -1.0); 5391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(-1.0, 2.0, 3.0, 1.0, 5.0, -1.0, -5.0); 5392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Check the sign of exact zeroes. 5394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // n m a fmadd fmsub fnmadd fnmsub 5395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(-0.0, +0.0, -0.0, -0.0, +0.0, +0.0, +0.0); 5396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(+0.0, +0.0, -0.0, +0.0, -0.0, +0.0, +0.0); 5397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(+0.0, +0.0, +0.0, +0.0, +0.0, -0.0, +0.0); 5398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(-0.0, +0.0, +0.0, +0.0, +0.0, +0.0, -0.0); 5399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(+0.0, -0.0, -0.0, -0.0, +0.0, +0.0, +0.0); 5400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(-0.0, -0.0, -0.0, +0.0, -0.0, +0.0, +0.0); 5401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(-0.0, -0.0, +0.0, +0.0, +0.0, -0.0, +0.0); 5402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(+0.0, -0.0, +0.0, +0.0, +0.0, +0.0, -0.0); 5403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Check NaN generation. 5405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(kFP64PositiveInfinity, 0.0, 42.0, 5406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kFP64DefaultNaN, kFP64DefaultNaN, 5407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kFP64DefaultNaN, kFP64DefaultNaN); 5408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(0.0, kFP64PositiveInfinity, 42.0, 5409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kFP64DefaultNaN, kFP64DefaultNaN, 5410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kFP64DefaultNaN, kFP64DefaultNaN); 5411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(kFP64PositiveInfinity, 1.0, kFP64PositiveInfinity, 5412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kFP64PositiveInfinity, // inf + ( inf * 1) = inf 5413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kFP64DefaultNaN, // inf + (-inf * 1) = NaN 5414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kFP64NegativeInfinity, // -inf + (-inf * 1) = -inf 5415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kFP64DefaultNaN); // -inf + ( inf * 1) = NaN 5416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(kFP64NegativeInfinity, 1.0, kFP64PositiveInfinity, 5417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kFP64DefaultNaN, // inf + (-inf * 1) = NaN 5418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kFP64PositiveInfinity, // inf + ( inf * 1) = inf 5419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kFP64DefaultNaN, // -inf + ( inf * 1) = NaN 5420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kFP64NegativeInfinity); // -inf + (-inf * 1) = -inf 5421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 5422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic void FmaddFmsubHelper(float n, float m, float a, 5425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch float fmadd, float fmsub, 5426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch float fnmadd, float fnmsub) { 5427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 5428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 5429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s0, n); 5431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s1, m); 5432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s2, a); 5433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmadd(s28, s0, s1, s2); 5434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmsub(s29, s0, s1, s2); 5435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fnmadd(s30, s0, s1, s2); 5436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fnmsub(s31, s0, s1, s2); 5437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 5439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 5440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(fmadd, s28); 5442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(fmsub, s29); 5443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(fnmadd, s30); 5444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(fnmsub, s31); 5445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 5447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 5448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(fmadd_fmsub_float) { 5451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 5452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // It's hard to check the result of fused operations because the only way to 5453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // calculate the result is using fma, which is what the simulator uses anyway. 5454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // TODO(jbramley): Add tests to check behaviour against a hardware trace. 5455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Basic operation. 5457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(1.0f, 2.0f, 3.0f, 5.0f, 1.0f, -5.0f, -1.0f); 5458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(-1.0f, 2.0f, 3.0f, 1.0f, 5.0f, -1.0f, -5.0f); 5459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Check the sign of exact zeroes. 5461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // n m a fmadd fmsub fnmadd fnmsub 5462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(-0.0f, +0.0f, -0.0f, -0.0f, +0.0f, +0.0f, +0.0f); 5463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(+0.0f, +0.0f, -0.0f, +0.0f, -0.0f, +0.0f, +0.0f); 5464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(+0.0f, +0.0f, +0.0f, +0.0f, +0.0f, -0.0f, +0.0f); 5465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(-0.0f, +0.0f, +0.0f, +0.0f, +0.0f, +0.0f, -0.0f); 5466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(+0.0f, -0.0f, -0.0f, -0.0f, +0.0f, +0.0f, +0.0f); 5467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(-0.0f, -0.0f, -0.0f, +0.0f, -0.0f, +0.0f, +0.0f); 5468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(-0.0f, -0.0f, +0.0f, +0.0f, +0.0f, -0.0f, +0.0f); 5469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(+0.0f, -0.0f, +0.0f, +0.0f, +0.0f, +0.0f, -0.0f); 5470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Check NaN generation. 5472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(kFP32PositiveInfinity, 0.0f, 42.0f, 5473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kFP32DefaultNaN, kFP32DefaultNaN, 5474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kFP32DefaultNaN, kFP32DefaultNaN); 5475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(0.0f, kFP32PositiveInfinity, 42.0f, 5476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kFP32DefaultNaN, kFP32DefaultNaN, 5477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kFP32DefaultNaN, kFP32DefaultNaN); 5478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(kFP32PositiveInfinity, 1.0f, kFP32PositiveInfinity, 5479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kFP32PositiveInfinity, // inf + ( inf * 1) = inf 5480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kFP32DefaultNaN, // inf + (-inf * 1) = NaN 5481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kFP32NegativeInfinity, // -inf + (-inf * 1) = -inf 5482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kFP32DefaultNaN); // -inf + ( inf * 1) = NaN 5483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(kFP32NegativeInfinity, 1.0f, kFP32PositiveInfinity, 5484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kFP32DefaultNaN, // inf + (-inf * 1) = NaN 5485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kFP32PositiveInfinity, // inf + ( inf * 1) = inf 5486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kFP32DefaultNaN, // -inf + ( inf * 1) = NaN 5487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kFP32NegativeInfinity); // -inf + (-inf * 1) = -inf 5488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 5489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(fmadd_fmsub_double_nans) { 5492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 5493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Make sure that NaN propagation works correctly. 5494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double s1 = rawbits_to_double(0x7ff5555511111111); 5495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double s2 = rawbits_to_double(0x7ff5555522222222); 5496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double sa = rawbits_to_double(0x7ff55555aaaaaaaa); 5497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double q1 = rawbits_to_double(0x7ffaaaaa11111111); 5498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double q2 = rawbits_to_double(0x7ffaaaaa22222222); 5499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double qa = rawbits_to_double(0x7ffaaaaaaaaaaaaa); 5500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsSignallingNaN(s1)); 5501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsSignallingNaN(s2)); 5502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsSignallingNaN(sa)); 5503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsQuietNaN(q1)); 5504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsQuietNaN(q2)); 5505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsQuietNaN(qa)); 5506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The input NaNs after passing through ProcessNaN. 5508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double s1_proc = rawbits_to_double(0x7ffd555511111111); 5509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double s2_proc = rawbits_to_double(0x7ffd555522222222); 5510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double sa_proc = rawbits_to_double(0x7ffd5555aaaaaaaa); 5511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double q1_proc = q1; 5512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double q2_proc = q2; 5513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double qa_proc = qa; 5514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsQuietNaN(s1_proc)); 5515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsQuietNaN(s2_proc)); 5516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsQuietNaN(sa_proc)); 5517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsQuietNaN(q1_proc)); 5518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsQuietNaN(q2_proc)); 5519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsQuietNaN(qa_proc)); 5520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Negated NaNs as it would be done on ARMv8 hardware. 5522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double s1_proc_neg = rawbits_to_double(0xfffd555511111111); 5523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double sa_proc_neg = rawbits_to_double(0xfffd5555aaaaaaaa); 5524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double q1_proc_neg = rawbits_to_double(0xfffaaaaa11111111); 5525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double qa_proc_neg = rawbits_to_double(0xfffaaaaaaaaaaaaa); 5526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsQuietNaN(s1_proc_neg)); 5527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsQuietNaN(sa_proc_neg)); 5528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsQuietNaN(q1_proc_neg)); 5529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsQuietNaN(qa_proc_neg)); 5530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Quiet NaNs are propagated. 5532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(q1, 0, 0, q1_proc, q1_proc_neg, q1_proc_neg, q1_proc); 5533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(0, q2, 0, q2_proc, q2_proc, q2_proc, q2_proc); 5534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(0, 0, qa, qa_proc, qa_proc, qa_proc_neg, qa_proc_neg); 5535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(q1, q2, 0, q1_proc, q1_proc_neg, q1_proc_neg, q1_proc); 5536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(0, q2, qa, qa_proc, qa_proc, qa_proc_neg, qa_proc_neg); 5537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(q1, 0, qa, qa_proc, qa_proc, qa_proc_neg, qa_proc_neg); 5538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(q1, q2, qa, qa_proc, qa_proc, qa_proc_neg, qa_proc_neg); 5539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Signalling NaNs are propagated, and made quiet. 5541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(s1, 0, 0, s1_proc, s1_proc_neg, s1_proc_neg, s1_proc); 5542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(0, s2, 0, s2_proc, s2_proc, s2_proc, s2_proc); 5543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(0, 0, sa, sa_proc, sa_proc, sa_proc_neg, sa_proc_neg); 5544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(s1, s2, 0, s1_proc, s1_proc_neg, s1_proc_neg, s1_proc); 5545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(0, s2, sa, sa_proc, sa_proc, sa_proc_neg, sa_proc_neg); 5546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(s1, 0, sa, sa_proc, sa_proc, sa_proc_neg, sa_proc_neg); 5547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(s1, s2, sa, sa_proc, sa_proc, sa_proc_neg, sa_proc_neg); 5548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Signalling NaNs take precedence over quiet NaNs. 5550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(s1, q2, qa, s1_proc, s1_proc_neg, s1_proc_neg, s1_proc); 5551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(q1, s2, qa, s2_proc, s2_proc, s2_proc, s2_proc); 5552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(q1, q2, sa, sa_proc, sa_proc, sa_proc_neg, sa_proc_neg); 5553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(s1, s2, qa, s1_proc, s1_proc_neg, s1_proc_neg, s1_proc); 5554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(q1, s2, sa, sa_proc, sa_proc, sa_proc_neg, sa_proc_neg); 5555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(s1, q2, sa, sa_proc, sa_proc, sa_proc_neg, sa_proc_neg); 5556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(s1, s2, sa, sa_proc, sa_proc, sa_proc_neg, sa_proc_neg); 5557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5558b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // A NaN generated by the intermediate op1 * op2 overrides a quiet NaN in a. 5559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(0, kFP64PositiveInfinity, qa, 5560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kFP64DefaultNaN, kFP64DefaultNaN, 5561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kFP64DefaultNaN, kFP64DefaultNaN); 5562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(kFP64PositiveInfinity, 0, qa, 5563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kFP64DefaultNaN, kFP64DefaultNaN, 5564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kFP64DefaultNaN, kFP64DefaultNaN); 5565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(0, kFP64NegativeInfinity, qa, 5566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kFP64DefaultNaN, kFP64DefaultNaN, 5567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kFP64DefaultNaN, kFP64DefaultNaN); 5568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(kFP64NegativeInfinity, 0, qa, 5569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kFP64DefaultNaN, kFP64DefaultNaN, 5570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kFP64DefaultNaN, kFP64DefaultNaN); 5571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 5572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(fmadd_fmsub_float_nans) { 5575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 5576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Make sure that NaN propagation works correctly. 5577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch float s1 = rawbits_to_float(0x7f951111); 5578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch float s2 = rawbits_to_float(0x7f952222); 5579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch float sa = rawbits_to_float(0x7f95aaaa); 5580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch float q1 = rawbits_to_float(0x7fea1111); 5581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch float q2 = rawbits_to_float(0x7fea2222); 5582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch float qa = rawbits_to_float(0x7feaaaaa); 5583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsSignallingNaN(s1)); 5584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsSignallingNaN(s2)); 5585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsSignallingNaN(sa)); 5586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsQuietNaN(q1)); 5587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsQuietNaN(q2)); 5588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsQuietNaN(qa)); 5589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5590b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The input NaNs after passing through ProcessNaN. 5591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch float s1_proc = rawbits_to_float(0x7fd51111); 5592b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch float s2_proc = rawbits_to_float(0x7fd52222); 5593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch float sa_proc = rawbits_to_float(0x7fd5aaaa); 5594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch float q1_proc = q1; 5595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch float q2_proc = q2; 5596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch float qa_proc = qa; 5597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsQuietNaN(s1_proc)); 5598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsQuietNaN(s2_proc)); 5599b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsQuietNaN(sa_proc)); 5600b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsQuietNaN(q1_proc)); 5601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsQuietNaN(q2_proc)); 5602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsQuietNaN(qa_proc)); 5603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5604b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Negated NaNs as it would be done on ARMv8 hardware. 5605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch float s1_proc_neg = rawbits_to_float(0xffd51111); 5606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch float sa_proc_neg = rawbits_to_float(0xffd5aaaa); 5607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch float q1_proc_neg = rawbits_to_float(0xffea1111); 5608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch float qa_proc_neg = rawbits_to_float(0xffeaaaaa); 5609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsQuietNaN(s1_proc_neg)); 5610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsQuietNaN(sa_proc_neg)); 5611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsQuietNaN(q1_proc_neg)); 5612b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsQuietNaN(qa_proc_neg)); 5613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Quiet NaNs are propagated. 5615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(q1, 0, 0, q1_proc, q1_proc_neg, q1_proc_neg, q1_proc); 5616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(0, q2, 0, q2_proc, q2_proc, q2_proc, q2_proc); 5617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(0, 0, qa, qa_proc, qa_proc, qa_proc_neg, qa_proc_neg); 5618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(q1, q2, 0, q1_proc, q1_proc_neg, q1_proc_neg, q1_proc); 5619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(0, q2, qa, qa_proc, qa_proc, qa_proc_neg, qa_proc_neg); 5620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(q1, 0, qa, qa_proc, qa_proc, qa_proc_neg, qa_proc_neg); 5621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(q1, q2, qa, qa_proc, qa_proc, qa_proc_neg, qa_proc_neg); 5622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Signalling NaNs are propagated, and made quiet. 5624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(s1, 0, 0, s1_proc, s1_proc_neg, s1_proc_neg, s1_proc); 5625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(0, s2, 0, s2_proc, s2_proc, s2_proc, s2_proc); 5626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(0, 0, sa, sa_proc, sa_proc, sa_proc_neg, sa_proc_neg); 5627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(s1, s2, 0, s1_proc, s1_proc_neg, s1_proc_neg, s1_proc); 5628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(0, s2, sa, sa_proc, sa_proc, sa_proc_neg, sa_proc_neg); 5629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(s1, 0, sa, sa_proc, sa_proc, sa_proc_neg, sa_proc_neg); 5630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(s1, s2, sa, sa_proc, sa_proc, sa_proc_neg, sa_proc_neg); 5631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Signalling NaNs take precedence over quiet NaNs. 5633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(s1, q2, qa, s1_proc, s1_proc_neg, s1_proc_neg, s1_proc); 5634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(q1, s2, qa, s2_proc, s2_proc, s2_proc, s2_proc); 5635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(q1, q2, sa, sa_proc, sa_proc, sa_proc_neg, sa_proc_neg); 5636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(s1, s2, qa, s1_proc, s1_proc_neg, s1_proc_neg, s1_proc); 5637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(q1, s2, sa, sa_proc, sa_proc, sa_proc_neg, sa_proc_neg); 5638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(s1, q2, sa, sa_proc, sa_proc, sa_proc_neg, sa_proc_neg); 5639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(s1, s2, sa, sa_proc, sa_proc, sa_proc_neg, sa_proc_neg); 5640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // A NaN generated by the intermediate op1 * op2 overrides a quiet NaN in a. 5642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(0, kFP32PositiveInfinity, qa, 5643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kFP32DefaultNaN, kFP32DefaultNaN, 5644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kFP32DefaultNaN, kFP32DefaultNaN); 5645b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(kFP32PositiveInfinity, 0, qa, 5646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kFP32DefaultNaN, kFP32DefaultNaN, 5647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kFP32DefaultNaN, kFP32DefaultNaN); 5648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(0, kFP32NegativeInfinity, qa, 5649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kFP32DefaultNaN, kFP32DefaultNaN, 5650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kFP32DefaultNaN, kFP32DefaultNaN); 5651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FmaddFmsubHelper(kFP32NegativeInfinity, 0, qa, 5652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kFP32DefaultNaN, kFP32DefaultNaN, 5653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kFP32DefaultNaN, kFP32DefaultNaN); 5654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 5655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(fdiv) { 5658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 5659b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 5660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5661b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 5662b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s14, -0.0f); 5663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s15, kFP32PositiveInfinity); 5664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s16, kFP32NegativeInfinity); 5665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s17, 3.25f); 5666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s18, 2.0f); 5667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s19, 2.0f); 5668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s20, -2.0f); 5669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d26, -0.0); 5671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d27, kFP64PositiveInfinity); 5672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d28, kFP64NegativeInfinity); 5673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d29, 0.0); 5674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d30, -2.0); 5675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d31, 2.25); 5676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fdiv(s0, s17, s18); 5678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fdiv(s1, s18, s19); 5679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fdiv(s2, s14, s18); 5680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fdiv(s3, s18, s15); 5681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fdiv(s4, s18, s16); 5682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fdiv(s5, s15, s16); 5683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fdiv(s6, s14, s14); 5684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fdiv(d7, d31, d30); 5686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fdiv(d8, d29, d31); 5687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fdiv(d9, d26, d31); 5688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fdiv(d10, d31, d27); 5689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fdiv(d11, d31, d28); 5690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fdiv(d12, d28, d27); 5691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fdiv(d13, d29, d29); 5692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 5693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 5695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(1.625f, s0); 5697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(1.0f, s1); 5698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(-0.0f, s2); 5699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(0.0f, s3); 5700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(-0.0f, s4); 5701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(kFP32DefaultNaN, s5); 5702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(kFP32DefaultNaN, s6); 5703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(-1.125, d7); 5704b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(0.0, d8); 5705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(-0.0, d9); 5706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(0.0, d10); 5707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(-0.0, d11); 5708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(kFP64DefaultNaN, d12); 5709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(kFP64DefaultNaN, d13); 5710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 5712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 5713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5714b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5715b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic float MinMaxHelper(float n, 5716b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch float m, 5717b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool min, 5718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch float quiet_nan_substitute = 0.0) { 5719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t raw_n = float_to_rawbits(n); 5720b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t raw_m = float_to_rawbits(m); 5721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5722b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (std::isnan(n) && ((raw_n & kSQuietNanMask) == 0)) { 5723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // n is signalling NaN. 5724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return rawbits_to_float(raw_n | kSQuietNanMask); 5725b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (std::isnan(m) && ((raw_m & kSQuietNanMask) == 0)) { 5726b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // m is signalling NaN. 5727b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return rawbits_to_float(raw_m | kSQuietNanMask); 5728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (quiet_nan_substitute == 0.0) { 5729b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (std::isnan(n)) { 5730b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // n is quiet NaN. 5731b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return n; 5732b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (std::isnan(m)) { 5733b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // m is quiet NaN. 5734b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return m; 5735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 5737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Substitute n or m if one is quiet, but not both. 5738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (std::isnan(n) && !std::isnan(m)) { 5739b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // n is quiet NaN: replace with substitute. 5740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch n = quiet_nan_substitute; 5741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (!std::isnan(n) && std::isnan(m)) { 5742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // m is quiet NaN: replace with substitute. 5743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m = quiet_nan_substitute; 5744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5745b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5746b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5747b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if ((n == 0.0) && (m == 0.0) && 5748b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (copysign(1.0, n) != copysign(1.0, m))) { 5749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return min ? -0.0 : 0.0; 5750b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5751b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5752b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return min ? fminf(n, m) : fmaxf(n, m); 5753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 5754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic double MinMaxHelper(double n, 5757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double m, 5758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool min, 5759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double quiet_nan_substitute = 0.0) { 5760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint64_t raw_n = double_to_rawbits(n); 5761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint64_t raw_m = double_to_rawbits(m); 5762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (std::isnan(n) && ((raw_n & kDQuietNanMask) == 0)) { 5764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // n is signalling NaN. 5765b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return rawbits_to_double(raw_n | kDQuietNanMask); 5766b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (std::isnan(m) && ((raw_m & kDQuietNanMask) == 0)) { 5767b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // m is signalling NaN. 5768b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return rawbits_to_double(raw_m | kDQuietNanMask); 5769b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (quiet_nan_substitute == 0.0) { 5770b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (std::isnan(n)) { 5771b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // n is quiet NaN. 5772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return n; 5773b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (std::isnan(m)) { 5774b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // m is quiet NaN. 5775b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return m; 5776b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5777b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 5778b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Substitute n or m if one is quiet, but not both. 5779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (std::isnan(n) && !std::isnan(m)) { 5780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // n is quiet NaN: replace with substitute. 5781b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch n = quiet_nan_substitute; 5782b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (!std::isnan(n) && std::isnan(m)) { 5783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // m is quiet NaN: replace with substitute. 5784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m = quiet_nan_substitute; 5785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if ((n == 0.0) && (m == 0.0) && 5789b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (copysign(1.0, n) != copysign(1.0, m))) { 5790b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return min ? -0.0 : 0.0; 5791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5792b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return min ? fmin(n, m) : fmax(n, m); 5794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 5795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5796b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5797b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic void FminFmaxDoubleHelper(double n, double m, double min, double max, 5798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double minnm, double maxnm) { 5799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 5800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 5802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d0, n); 5803b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d1, m); 5804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmin(d28, d0, d1); 5805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmax(d29, d0, d1); 5806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fminnm(d30, d0, d1); 5807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmaxnm(d31, d0, d1); 5808b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 5809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 5811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(min, d28); 5813b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(max, d29); 5814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(minnm, d30); 5815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(maxnm, d31); 5816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5817b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 5818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 5819b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5821b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(fmax_fmin_d) { 5822b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 5823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Use non-standard NaNs to check that the payload bits are preserved. 5824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double snan = rawbits_to_double(0x7ff5555512345678); 5825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double qnan = rawbits_to_double(0x7ffaaaaa87654321); 5826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double snan_processed = rawbits_to_double(0x7ffd555512345678); 5828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double qnan_processed = qnan; 5829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsSignallingNaN(snan)); 5831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsQuietNaN(qnan)); 5832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsQuietNaN(snan_processed)); 5833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsQuietNaN(qnan_processed)); 5834b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5835b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Bootstrap tests. 5836b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FminFmaxDoubleHelper(0, 0, 0, 0, 0, 0); 5837b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FminFmaxDoubleHelper(0, 1, 0, 1, 0, 1); 5838b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FminFmaxDoubleHelper(kFP64PositiveInfinity, kFP64NegativeInfinity, 5839b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kFP64NegativeInfinity, kFP64PositiveInfinity, 5840b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kFP64NegativeInfinity, kFP64PositiveInfinity); 5841b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FminFmaxDoubleHelper(snan, 0, 5842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch snan_processed, snan_processed, 5843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch snan_processed, snan_processed); 5844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FminFmaxDoubleHelper(0, snan, 5845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch snan_processed, snan_processed, 5846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch snan_processed, snan_processed); 5847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FminFmaxDoubleHelper(qnan, 0, 5848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch qnan_processed, qnan_processed, 5849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 0, 0); 5850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FminFmaxDoubleHelper(0, qnan, 5851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch qnan_processed, qnan_processed, 5852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 0, 0); 5853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FminFmaxDoubleHelper(qnan, snan, 5854b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch snan_processed, snan_processed, 5855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch snan_processed, snan_processed); 5856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FminFmaxDoubleHelper(snan, qnan, 5857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch snan_processed, snan_processed, 5858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch snan_processed, snan_processed); 5859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5860b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Iterate over all combinations of inputs. 5861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double inputs[] = { DBL_MAX, DBL_MIN, 1.0, 0.0, 5862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch -DBL_MAX, -DBL_MIN, -1.0, -0.0, 5863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kFP64PositiveInfinity, kFP64NegativeInfinity, 5864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kFP64QuietNaN, kFP64SignallingNaN }; 5865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5866b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const int count = sizeof(inputs) / sizeof(inputs[0]); 5867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int in = 0; in < count; in++) { 5869b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double n = inputs[in]; 5870b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int im = 0; im < count; im++) { 5871b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double m = inputs[im]; 5872b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FminFmaxDoubleHelper(n, m, 5873b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MinMaxHelper(n, m, true), 5874b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MinMaxHelper(n, m, false), 5875b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MinMaxHelper(n, m, true, kFP64PositiveInfinity), 5876b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MinMaxHelper(n, m, false, kFP64NegativeInfinity)); 5877b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5878b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5879b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 5880b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5881b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5882b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic void FminFmaxFloatHelper(float n, float m, float min, float max, 5883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch float minnm, float maxnm) { 5884b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 5885b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 5887b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s0, n); 5888b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s1, m); 5889b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmin(s28, s0, s1); 5890b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmax(s29, s0, s1); 5891b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fminnm(s30, s0, s1); 5892b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmaxnm(s31, s0, s1); 5893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 5894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 5896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5897b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(min, s28); 5898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(max, s29); 5899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(minnm, s30); 5900b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(maxnm, s31); 5901b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5902b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 5903b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 5904b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5905b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5906b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(fmax_fmin_s) { 5907b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 5908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Use non-standard NaNs to check that the payload bits are preserved. 5909b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch float snan = rawbits_to_float(0x7f951234); 5910b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch float qnan = rawbits_to_float(0x7fea8765); 5911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch float snan_processed = rawbits_to_float(0x7fd51234); 5913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch float qnan_processed = qnan; 5914b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5915b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsSignallingNaN(snan)); 5916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsQuietNaN(qnan)); 5917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsQuietNaN(snan_processed)); 5918b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsQuietNaN(qnan_processed)); 5919b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5920b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Bootstrap tests. 5921b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FminFmaxFloatHelper(0, 0, 0, 0, 0, 0); 5922b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FminFmaxFloatHelper(0, 1, 0, 1, 0, 1); 5923b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FminFmaxFloatHelper(kFP32PositiveInfinity, kFP32NegativeInfinity, 5924b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kFP32NegativeInfinity, kFP32PositiveInfinity, 5925b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kFP32NegativeInfinity, kFP32PositiveInfinity); 5926b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FminFmaxFloatHelper(snan, 0, 5927b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch snan_processed, snan_processed, 5928b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch snan_processed, snan_processed); 5929b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FminFmaxFloatHelper(0, snan, 5930b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch snan_processed, snan_processed, 5931b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch snan_processed, snan_processed); 5932b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FminFmaxFloatHelper(qnan, 0, 5933b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch qnan_processed, qnan_processed, 5934b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 0, 0); 5935b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FminFmaxFloatHelper(0, qnan, 5936b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch qnan_processed, qnan_processed, 5937b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 0, 0); 5938b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FminFmaxFloatHelper(qnan, snan, 5939b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch snan_processed, snan_processed, 5940b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch snan_processed, snan_processed); 5941b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FminFmaxFloatHelper(snan, qnan, 5942b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch snan_processed, snan_processed, 5943b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch snan_processed, snan_processed); 5944b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5945b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Iterate over all combinations of inputs. 5946b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch float inputs[] = { FLT_MAX, FLT_MIN, 1.0, 0.0, 5947b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch -FLT_MAX, -FLT_MIN, -1.0, -0.0, 5948b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kFP32PositiveInfinity, kFP32NegativeInfinity, 5949b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kFP32QuietNaN, kFP32SignallingNaN }; 5950b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5951b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const int count = sizeof(inputs) / sizeof(inputs[0]); 5952b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int in = 0; in < count; in++) { 5954b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch float n = inputs[in]; 5955b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int im = 0; im < count; im++) { 5956b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch float m = inputs[im]; 5957b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FminFmaxFloatHelper(n, m, 5958b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MinMaxHelper(n, m, true), 5959b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MinMaxHelper(n, m, false), 5960b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MinMaxHelper(n, m, true, kFP32PositiveInfinity), 5961b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MinMaxHelper(n, m, false, kFP32NegativeInfinity)); 5962b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5963b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5964b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 5965b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5966b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5967b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(fccmp) { 5968b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 5969b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 5970b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5971b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 5972b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s16, 0.0); 5973b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s17, 0.5); 5974b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d18, -0.5); 5975b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d19, -1.0); 5976b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x20, 0); 5977b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5978b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmp(x20, 0); 5979b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fccmp(s16, s16, NoFlag, eq); 5980b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mrs(x0, NZCV); 5981b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5982b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmp(x20, 0); 5983b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fccmp(s16, s16, VFlag, ne); 5984b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mrs(x1, NZCV); 5985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmp(x20, 0); 5987b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fccmp(s16, s17, CFlag, ge); 5988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mrs(x2, NZCV); 5989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmp(x20, 0); 5991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fccmp(s16, s17, CVFlag, lt); 5992b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mrs(x3, NZCV); 5993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5994b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmp(x20, 0); 5995b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fccmp(d18, d18, ZFlag, le); 5996b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mrs(x4, NZCV); 5997b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5998b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmp(x20, 0); 5999b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fccmp(d18, d18, ZVFlag, gt); 6000b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mrs(x5, NZCV); 6001b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6002b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmp(x20, 0); 6003b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fccmp(d18, d19, ZCVFlag, ls); 6004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mrs(x6, NZCV); 6005b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6006b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmp(x20, 0); 6007b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fccmp(d18, d19, NFlag, hi); 6008b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mrs(x7, NZCV); 6009b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6010b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ fccmp(s16, s16, NFlag, al); 6011b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mrs(x8, NZCV); 6012b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6013b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ fccmp(d18, d18, NFlag, nv); 6014b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mrs(x9, NZCV); 6015b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6016b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 6017b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 6019b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6020b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(ZCFlag, w0); 6021b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(VFlag, w1); 6022b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(NFlag, w2); 6023b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(CVFlag, w3); 6024b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(ZCFlag, w4); 6025b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(ZVFlag, w5); 6026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(CFlag, w6); 6027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(NFlag, w7); 6028b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(ZCFlag, w8); 6029b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(ZCFlag, w9); 6030b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6031b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 6032b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 6033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6035b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(fcmp) { 6036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 6037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 6038b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 6040b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Some of these tests require a floating-point scratch register assigned to 6042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // the macro assembler, but most do not. 6043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 6044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // We're going to mess around with the available scratch registers in this 6045b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // test. A UseScratchRegisterScope will make sure that they are restored to 6046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // the default values once we're finished. 6047b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UseScratchRegisterScope temps(&masm); 6048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch masm.FPTmpList()->set_list(0); 6049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s8, 0.0); 6051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s9, 0.5); 6052b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w18, 0x7f800001); // Single precision NaN. 6053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s18, w18); 6054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6055b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcmp(s8, s8); 6056b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mrs(x0, NZCV); 6057b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcmp(s8, s9); 6058b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mrs(x1, NZCV); 6059b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcmp(s9, s8); 6060b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mrs(x2, NZCV); 6061b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcmp(s8, s18); 6062b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mrs(x3, NZCV); 6063b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcmp(s18, s18); 6064b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mrs(x4, NZCV); 6065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcmp(s8, 0.0); 6066b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mrs(x5, NZCV); 6067b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch masm.FPTmpList()->set_list(d0.Bit()); 6068b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcmp(s8, 255.0); 6069b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch masm.FPTmpList()->set_list(0); 6070b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mrs(x6, NZCV); 6071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6072b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d19, 0.0); 6073b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d20, 0.5); 6074b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x21, 0x7ff0000000000001UL); // Double precision NaN. 6075b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d21, x21); 6076b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6077b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcmp(d19, d19); 6078b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mrs(x10, NZCV); 6079b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcmp(d19, d20); 6080b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mrs(x11, NZCV); 6081b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcmp(d20, d19); 6082b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mrs(x12, NZCV); 6083b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcmp(d19, d21); 6084b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mrs(x13, NZCV); 6085b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcmp(d21, d21); 6086b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mrs(x14, NZCV); 6087b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcmp(d19, 0.0); 6088b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mrs(x15, NZCV); 6089b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch masm.FPTmpList()->set_list(d0.Bit()); 6090b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcmp(d19, 12.3456); 6091b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch masm.FPTmpList()->set_list(0); 6092b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mrs(x16, NZCV); 6093b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 6094b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6095b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 6096b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6097b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 6098b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6099b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(ZCFlag, w0); 6100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(NFlag, w1); 6101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(CFlag, w2); 6102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(CVFlag, w3); 6103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(CVFlag, w4); 6104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(ZCFlag, w5); 6105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(NFlag, w6); 6106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(ZCFlag, w10); 6107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(NFlag, w11); 6108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(CFlag, w12); 6109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(CVFlag, w13); 6110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(CVFlag, w14); 6111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(ZCFlag, w15); 6112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(NFlag, w16); 6113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 6115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 6116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(fcsel) { 6119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 6120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 6121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 6123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x16, 0); 6124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s16, 1.0); 6125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s17, 2.0); 6126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d18, 3.0); 6127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d19, 4.0); 6128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmp(x16, 0); 6130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcsel(s0, s16, s17, eq); 6131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcsel(s1, s16, s17, ne); 6132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcsel(d2, d18, d19, eq); 6133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcsel(d3, d18, d19, ne); 6134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ fcsel(s4, s16, s17, al); 6135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ fcsel(d5, d18, d19, nv); 6136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 6137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 6139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(1.0, s0); 6141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(2.0, s1); 6142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(3.0, d2); 6143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(4.0, d3); 6144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(1.0, s4); 6145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(3.0, d5); 6146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 6148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 6149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(fneg) { 6152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 6153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 6154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 6156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s16, 1.0); 6157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s17, 0.0); 6158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s18, kFP32PositiveInfinity); 6159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d19, 1.0); 6160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d20, 0.0); 6161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d21, kFP64PositiveInfinity); 6162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fneg(s0, s16); 6164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fneg(s1, s0); 6165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fneg(s2, s17); 6166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fneg(s3, s2); 6167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fneg(s4, s18); 6168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fneg(s5, s4); 6169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fneg(d6, d19); 6170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fneg(d7, d6); 6171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fneg(d8, d20); 6172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fneg(d9, d8); 6173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fneg(d10, d21); 6174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fneg(d11, d10); 6175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 6176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 6178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(-1.0, s0); 6180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(1.0, s1); 6181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(-0.0, s2); 6182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(0.0, s3); 6183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(kFP32NegativeInfinity, s4); 6184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(kFP32PositiveInfinity, s5); 6185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(-1.0, d6); 6186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(1.0, d7); 6187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(-0.0, d8); 6188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(0.0, d9); 6189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(kFP64NegativeInfinity, d10); 6190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(kFP64PositiveInfinity, d11); 6191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 6193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 6194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(fabs) { 6197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 6198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 6199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 6201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s16, -1.0); 6202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s17, -0.0); 6203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s18, kFP32NegativeInfinity); 6204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d19, -1.0); 6205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d20, -0.0); 6206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d21, kFP64NegativeInfinity); 6207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fabs(s0, s16); 6209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fabs(s1, s0); 6210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fabs(s2, s17); 6211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fabs(s3, s18); 6212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fabs(d4, d19); 6213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fabs(d5, d4); 6214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fabs(d6, d20); 6215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fabs(d7, d21); 6216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 6217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 6219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(1.0, s0); 6221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(1.0, s1); 6222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(0.0, s2); 6223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(kFP32PositiveInfinity, s3); 6224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(1.0, d4); 6225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(1.0, d5); 6226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(0.0, d6); 6227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(kFP64PositiveInfinity, d7); 6228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 6230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 6231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(fsqrt) { 6234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 6235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 6236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 6238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s16, 0.0); 6239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s17, 1.0); 6240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s18, 0.25); 6241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s19, 65536.0); 6242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s20, -0.0); 6243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s21, kFP32PositiveInfinity); 6244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s22, -1.0); 6245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d23, 0.0); 6246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d24, 1.0); 6247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d25, 0.25); 6248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d26, 4294967296.0); 6249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d27, -0.0); 6250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d28, kFP64PositiveInfinity); 6251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d29, -1.0); 6252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fsqrt(s0, s16); 6254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fsqrt(s1, s17); 6255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fsqrt(s2, s18); 6256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fsqrt(s3, s19); 6257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fsqrt(s4, s20); 6258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fsqrt(s5, s21); 6259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fsqrt(s6, s22); 6260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fsqrt(d7, d23); 6261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fsqrt(d8, d24); 6262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fsqrt(d9, d25); 6263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fsqrt(d10, d26); 6264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fsqrt(d11, d27); 6265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fsqrt(d12, d28); 6266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fsqrt(d13, d29); 6267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 6268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 6270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(0.0, s0); 6272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(1.0, s1); 6273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(0.5, s2); 6274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(256.0, s3); 6275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(-0.0, s4); 6276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(kFP32PositiveInfinity, s5); 6277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(kFP32DefaultNaN, s6); 6278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(0.0, d7); 6279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(1.0, d8); 6280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(0.5, d9); 6281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(65536.0, d10); 6282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(-0.0, d11); 6283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(kFP32PositiveInfinity, d12); 6284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(kFP64DefaultNaN, d13); 6285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 6287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 6288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(frinta) { 6291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 6292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 6293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 6295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s16, 1.0); 6296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s17, 1.1); 6297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s18, 1.5); 6298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s19, 1.9); 6299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s20, 2.5); 6300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s21, -1.5); 6301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s22, -2.5); 6302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s23, kFP32PositiveInfinity); 6303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s24, kFP32NegativeInfinity); 6304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s25, 0.0); 6305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s26, -0.0); 6306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s27, -0.2); 6307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frinta(s0, s16); 6309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frinta(s1, s17); 6310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frinta(s2, s18); 6311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frinta(s3, s19); 6312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frinta(s4, s20); 6313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frinta(s5, s21); 6314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frinta(s6, s22); 6315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frinta(s7, s23); 6316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frinta(s8, s24); 6317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frinta(s9, s25); 6318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frinta(s10, s26); 6319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frinta(s11, s27); 6320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d16, 1.0); 6322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d17, 1.1); 6323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d18, 1.5); 6324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d19, 1.9); 6325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d20, 2.5); 6326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d21, -1.5); 6327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d22, -2.5); 6328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d23, kFP32PositiveInfinity); 6329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d24, kFP32NegativeInfinity); 6330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d25, 0.0); 6331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d26, -0.0); 6332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d27, -0.2); 6333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frinta(d12, d16); 6335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frinta(d13, d17); 6336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frinta(d14, d18); 6337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frinta(d15, d19); 6338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frinta(d16, d20); 6339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frinta(d17, d21); 6340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frinta(d18, d22); 6341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frinta(d19, d23); 6342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frinta(d20, d24); 6343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frinta(d21, d25); 6344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frinta(d22, d26); 6345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frinta(d23, d27); 6346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 6347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 6349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(1.0, s0); 6351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(1.0, s1); 6352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(2.0, s2); 6353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(2.0, s3); 6354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(3.0, s4); 6355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(-2.0, s5); 6356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(-3.0, s6); 6357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(kFP32PositiveInfinity, s7); 6358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(kFP32NegativeInfinity, s8); 6359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(0.0, s9); 6360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(-0.0, s10); 6361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(-0.0, s11); 6362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(1.0, d12); 6363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(1.0, d13); 6364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(2.0, d14); 6365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(2.0, d15); 6366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(3.0, d16); 6367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(-2.0, d17); 6368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(-3.0, d18); 6369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(kFP64PositiveInfinity, d19); 6370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(kFP64NegativeInfinity, d20); 6371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(0.0, d21); 6372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(-0.0, d22); 6373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(-0.0, d23); 6374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 6376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 6377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(frintm) { 6380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 6381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 6382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 6384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s16, 1.0); 6385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s17, 1.1); 6386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s18, 1.5); 6387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s19, 1.9); 6388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s20, 2.5); 6389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s21, -1.5); 6390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s22, -2.5); 6391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s23, kFP32PositiveInfinity); 6392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s24, kFP32NegativeInfinity); 6393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s25, 0.0); 6394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s26, -0.0); 6395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s27, -0.2); 6396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintm(s0, s16); 6398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintm(s1, s17); 6399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintm(s2, s18); 6400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintm(s3, s19); 6401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintm(s4, s20); 6402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintm(s5, s21); 6403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintm(s6, s22); 6404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintm(s7, s23); 6405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintm(s8, s24); 6406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintm(s9, s25); 6407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintm(s10, s26); 6408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintm(s11, s27); 6409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d16, 1.0); 6411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d17, 1.1); 6412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d18, 1.5); 6413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d19, 1.9); 6414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d20, 2.5); 6415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d21, -1.5); 6416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d22, -2.5); 6417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d23, kFP32PositiveInfinity); 6418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d24, kFP32NegativeInfinity); 6419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d25, 0.0); 6420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d26, -0.0); 6421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d27, -0.2); 6422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintm(d12, d16); 6424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintm(d13, d17); 6425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintm(d14, d18); 6426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintm(d15, d19); 6427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintm(d16, d20); 6428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintm(d17, d21); 6429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintm(d18, d22); 6430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintm(d19, d23); 6431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintm(d20, d24); 6432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintm(d21, d25); 6433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintm(d22, d26); 6434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintm(d23, d27); 6435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 6436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 6438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(1.0, s0); 6440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(1.0, s1); 6441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(1.0, s2); 6442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(1.0, s3); 6443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(2.0, s4); 6444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(-2.0, s5); 6445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(-3.0, s6); 6446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(kFP32PositiveInfinity, s7); 6447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(kFP32NegativeInfinity, s8); 6448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(0.0, s9); 6449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(-0.0, s10); 6450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(-1.0, s11); 6451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(1.0, d12); 6452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(1.0, d13); 6453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(1.0, d14); 6454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(1.0, d15); 6455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(2.0, d16); 6456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(-2.0, d17); 6457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(-3.0, d18); 6458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(kFP64PositiveInfinity, d19); 6459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(kFP64NegativeInfinity, d20); 6460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(0.0, d21); 6461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(-0.0, d22); 6462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(-1.0, d23); 6463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 6465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 6466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(frintn) { 6469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 6470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 6471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 6473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s16, 1.0); 6474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s17, 1.1); 6475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s18, 1.5); 6476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s19, 1.9); 6477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s20, 2.5); 6478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s21, -1.5); 6479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s22, -2.5); 6480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s23, kFP32PositiveInfinity); 6481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s24, kFP32NegativeInfinity); 6482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s25, 0.0); 6483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s26, -0.0); 6484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s27, -0.2); 6485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintn(s0, s16); 6487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintn(s1, s17); 6488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintn(s2, s18); 6489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintn(s3, s19); 6490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintn(s4, s20); 6491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintn(s5, s21); 6492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintn(s6, s22); 6493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintn(s7, s23); 6494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintn(s8, s24); 6495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintn(s9, s25); 6496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintn(s10, s26); 6497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintn(s11, s27); 6498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d16, 1.0); 6500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d17, 1.1); 6501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d18, 1.5); 6502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d19, 1.9); 6503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d20, 2.5); 6504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d21, -1.5); 6505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d22, -2.5); 6506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d23, kFP32PositiveInfinity); 6507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d24, kFP32NegativeInfinity); 6508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d25, 0.0); 6509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d26, -0.0); 6510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d27, -0.2); 6511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintn(d12, d16); 6513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintn(d13, d17); 6514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintn(d14, d18); 6515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintn(d15, d19); 6516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintn(d16, d20); 6517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintn(d17, d21); 6518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintn(d18, d22); 6519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintn(d19, d23); 6520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintn(d20, d24); 6521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintn(d21, d25); 6522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintn(d22, d26); 6523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintn(d23, d27); 6524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 6525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 6527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(1.0, s0); 6529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(1.0, s1); 6530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(2.0, s2); 6531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(2.0, s3); 6532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(2.0, s4); 6533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(-2.0, s5); 6534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(-2.0, s6); 6535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(kFP32PositiveInfinity, s7); 6536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(kFP32NegativeInfinity, s8); 6537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(0.0, s9); 6538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(-0.0, s10); 6539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(-0.0, s11); 6540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(1.0, d12); 6541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(1.0, d13); 6542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(2.0, d14); 6543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(2.0, d15); 6544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(2.0, d16); 6545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(-2.0, d17); 6546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(-2.0, d18); 6547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(kFP64PositiveInfinity, d19); 6548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(kFP64NegativeInfinity, d20); 6549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(0.0, d21); 6550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(-0.0, d22); 6551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(-0.0, d23); 6552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 6554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 6555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(frintz) { 6558b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 6559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 6560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 6562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s16, 1.0); 6563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s17, 1.1); 6564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s18, 1.5); 6565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s19, 1.9); 6566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s20, 2.5); 6567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s21, -1.5); 6568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s22, -2.5); 6569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s23, kFP32PositiveInfinity); 6570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s24, kFP32NegativeInfinity); 6571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s25, 0.0); 6572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s26, -0.0); 6573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintz(s0, s16); 6575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintz(s1, s17); 6576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintz(s2, s18); 6577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintz(s3, s19); 6578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintz(s4, s20); 6579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintz(s5, s21); 6580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintz(s6, s22); 6581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintz(s7, s23); 6582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintz(s8, s24); 6583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintz(s9, s25); 6584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintz(s10, s26); 6585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d16, 1.0); 6587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d17, 1.1); 6588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d18, 1.5); 6589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d19, 1.9); 6590b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d20, 2.5); 6591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d21, -1.5); 6592b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d22, -2.5); 6593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d23, kFP32PositiveInfinity); 6594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d24, kFP32NegativeInfinity); 6595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d25, 0.0); 6596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d26, -0.0); 6597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintz(d11, d16); 6599b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintz(d12, d17); 6600b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintz(d13, d18); 6601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintz(d14, d19); 6602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintz(d15, d20); 6603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintz(d16, d21); 6604b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintz(d17, d22); 6605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintz(d18, d23); 6606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintz(d19, d24); 6607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintz(d20, d25); 6608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintz(d21, d26); 6609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 6610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 6612b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(1.0, s0); 6614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(1.0, s1); 6615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(1.0, s2); 6616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(1.0, s3); 6617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(2.0, s4); 6618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(-1.0, s5); 6619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(-2.0, s6); 6620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(kFP32PositiveInfinity, s7); 6621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(kFP32NegativeInfinity, s8); 6622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(0.0, s9); 6623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(-0.0, s10); 6624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(1.0, d11); 6625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(1.0, d12); 6626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(1.0, d13); 6627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(1.0, d14); 6628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(2.0, d15); 6629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(-1.0, d16); 6630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(-2.0, d17); 6631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(kFP64PositiveInfinity, d18); 6632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(kFP64NegativeInfinity, d19); 6633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(0.0, d20); 6634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(-0.0, d21); 6635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 6637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 6638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(fcvt_ds) { 6641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 6642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 6643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 6645b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s16, 1.0); 6646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s17, 1.1); 6647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s18, 1.5); 6648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s19, 1.9); 6649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s20, 2.5); 6650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s21, -1.5); 6651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s22, -2.5); 6652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s23, kFP32PositiveInfinity); 6653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s24, kFP32NegativeInfinity); 6654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s25, 0.0); 6655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s26, -0.0); 6656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s27, FLT_MAX); 6657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s28, FLT_MIN); 6658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s29, rawbits_to_float(0x7fc12345)); // Quiet NaN. 6659b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s30, rawbits_to_float(0x7f812345)); // Signalling NaN. 6660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6661b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvt(d0, s16); 6662b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvt(d1, s17); 6663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvt(d2, s18); 6664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvt(d3, s19); 6665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvt(d4, s20); 6666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvt(d5, s21); 6667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvt(d6, s22); 6668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvt(d7, s23); 6669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvt(d8, s24); 6670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvt(d9, s25); 6671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvt(d10, s26); 6672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvt(d11, s27); 6673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvt(d12, s28); 6674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvt(d13, s29); 6675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvt(d14, s30); 6676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 6677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 6679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(1.0f, d0); 6681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(1.1f, d1); 6682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(1.5f, d2); 6683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(1.9f, d3); 6684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(2.5f, d4); 6685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(-1.5f, d5); 6686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(-2.5f, d6); 6687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(kFP64PositiveInfinity, d7); 6688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(kFP64NegativeInfinity, d8); 6689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(0.0f, d9); 6690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(-0.0f, d10); 6691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(FLT_MAX, d11); 6692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(FLT_MIN, d12); 6693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Check that the NaN payload is preserved according to ARM64 conversion 6695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // rules: 6696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // - The sign bit is preserved. 6697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // - The top bit of the mantissa is forced to 1 (making it a quiet NaN). 6698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // - The remaining mantissa bits are copied until they run out. 6699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // - The low-order bits that haven't already been assigned are set to 0. 6700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(rawbits_to_double(0x7ff82468a0000000), d13); 6701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(rawbits_to_double(0x7ff82468a0000000), d14); 6702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 6704b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 6705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(fcvt_sd) { 6708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 6709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // There are a huge number of corner-cases to check, so this test iterates 6710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // through a list. The list is then negated and checked again (since the sign 6711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // is irrelevant in ties-to-even rounding), so the list shouldn't include any 6712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // negative values. 6713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // 6714b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Note that this test only checks ties-to-even rounding, because that is all 6715b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // that the simulator supports. 6716b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch struct {double in; float expected;} test[] = { 6717b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Check some simple conversions. 6718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {0.0, 0.0f}, 6719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {1.0, 1.0f}, 6720b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {1.5, 1.5f}, 6721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {2.0, 2.0f}, 6722b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {FLT_MAX, FLT_MAX}, 6723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // - The smallest normalized float. 6724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {pow(2.0, -126), powf(2, -126)}, 6725b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // - Normal floats that need (ties-to-even) rounding. 6726b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // For normalized numbers: 6727b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // bit 29 (0x0000000020000000) is the lowest-order bit which will 6728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // fit in the float's mantissa. 6729b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {rawbits_to_double(0x3ff0000000000000), rawbits_to_float(0x3f800000)}, 6730b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {rawbits_to_double(0x3ff0000000000001), rawbits_to_float(0x3f800000)}, 6731b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {rawbits_to_double(0x3ff0000010000000), rawbits_to_float(0x3f800000)}, 6732b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {rawbits_to_double(0x3ff0000010000001), rawbits_to_float(0x3f800001)}, 6733b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {rawbits_to_double(0x3ff0000020000000), rawbits_to_float(0x3f800001)}, 6734b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {rawbits_to_double(0x3ff0000020000001), rawbits_to_float(0x3f800001)}, 6735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {rawbits_to_double(0x3ff0000030000000), rawbits_to_float(0x3f800002)}, 6736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {rawbits_to_double(0x3ff0000030000001), rawbits_to_float(0x3f800002)}, 6737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {rawbits_to_double(0x3ff0000040000000), rawbits_to_float(0x3f800002)}, 6738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {rawbits_to_double(0x3ff0000040000001), rawbits_to_float(0x3f800002)}, 6739b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {rawbits_to_double(0x3ff0000050000000), rawbits_to_float(0x3f800002)}, 6740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {rawbits_to_double(0x3ff0000050000001), rawbits_to_float(0x3f800003)}, 6741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {rawbits_to_double(0x3ff0000060000000), rawbits_to_float(0x3f800003)}, 6742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // - A mantissa that overflows into the exponent during rounding. 6743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {rawbits_to_double(0x3feffffff0000000), rawbits_to_float(0x3f800000)}, 6744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // - The largest double that rounds to a normal float. 6745b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {rawbits_to_double(0x47efffffefffffff), rawbits_to_float(0x7f7fffff)}, 6746b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6747b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Doubles that are too big for a float. 6748b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {kFP64PositiveInfinity, kFP32PositiveInfinity}, 6749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {DBL_MAX, kFP32PositiveInfinity}, 6750b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // - The smallest exponent that's too big for a float. 6751b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {pow(2.0, 128), kFP32PositiveInfinity}, 6752b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // - This exponent is in range, but the value rounds to infinity. 6753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {rawbits_to_double(0x47effffff0000000), kFP32PositiveInfinity}, 6754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Doubles that are too small for a float. 6756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // - The smallest (subnormal) double. 6757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {DBL_MIN, 0.0}, 6758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // - The largest double which is too small for a subnormal float. 6759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {rawbits_to_double(0x3690000000000000), rawbits_to_float(0x00000000)}, 6760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Normal doubles that become subnormal floats. 6762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // - The largest subnormal float. 6763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {rawbits_to_double(0x380fffffc0000000), rawbits_to_float(0x007fffff)}, 6764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // - The smallest subnormal float. 6765b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {rawbits_to_double(0x36a0000000000000), rawbits_to_float(0x00000001)}, 6766b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // - Subnormal floats that need (ties-to-even) rounding. 6767b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // For these subnormals: 6768b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // bit 34 (0x0000000400000000) is the lowest-order bit which will 6769b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // fit in the float's mantissa. 6770b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {rawbits_to_double(0x37c159e000000000), rawbits_to_float(0x00045678)}, 6771b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {rawbits_to_double(0x37c159e000000001), rawbits_to_float(0x00045678)}, 6772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {rawbits_to_double(0x37c159e200000000), rawbits_to_float(0x00045678)}, 6773b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {rawbits_to_double(0x37c159e200000001), rawbits_to_float(0x00045679)}, 6774b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {rawbits_to_double(0x37c159e400000000), rawbits_to_float(0x00045679)}, 6775b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {rawbits_to_double(0x37c159e400000001), rawbits_to_float(0x00045679)}, 6776b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {rawbits_to_double(0x37c159e600000000), rawbits_to_float(0x0004567a)}, 6777b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {rawbits_to_double(0x37c159e600000001), rawbits_to_float(0x0004567a)}, 6778b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {rawbits_to_double(0x37c159e800000000), rawbits_to_float(0x0004567a)}, 6779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {rawbits_to_double(0x37c159e800000001), rawbits_to_float(0x0004567a)}, 6780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {rawbits_to_double(0x37c159ea00000000), rawbits_to_float(0x0004567a)}, 6781b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {rawbits_to_double(0x37c159ea00000001), rawbits_to_float(0x0004567b)}, 6782b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {rawbits_to_double(0x37c159ec00000000), rawbits_to_float(0x0004567b)}, 6783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // - The smallest double which rounds up to become a subnormal float. 6784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {rawbits_to_double(0x3690000000000001), rawbits_to_float(0x00000001)}, 6785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Check NaN payload preservation. 6787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {rawbits_to_double(0x7ff82468a0000000), rawbits_to_float(0x7fc12345)}, 6788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {rawbits_to_double(0x7ff82468bfffffff), rawbits_to_float(0x7fc12345)}, 6789b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // - Signalling NaNs become quiet NaNs. 6790b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {rawbits_to_double(0x7ff02468a0000000), rawbits_to_float(0x7fc12345)}, 6791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {rawbits_to_double(0x7ff02468bfffffff), rawbits_to_float(0x7fc12345)}, 6792b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {rawbits_to_double(0x7ff000001fffffff), rawbits_to_float(0x7fc00000)}, 6793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; 6794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int count = sizeof(test) / sizeof(test[0]); 6795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6796b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < count; i++) { 6797b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double in = test[i].in; 6798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch float expected = test[i].expected; 6799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // We only expect positive input. 6801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(std::signbit(in) == 0); 6802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(std::signbit(expected) == 0); 6803b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 6805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 6806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d10, in); 6808b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvt(s20, d10); 6809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d11, -in); 6811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvt(s21, d11); 6812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6813b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 6814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 6815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(expected, s20); 6816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(-expected, s21); 6817b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 6818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 6819b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 6820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6821b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6822b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(fcvtas) { 6823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 6824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 6825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 6827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s0, 1.0); 6828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s1, 1.1); 6829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s2, 2.5); 6830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s3, -2.5); 6831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s4, kFP32PositiveInfinity); 6832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s5, kFP32NegativeInfinity); 6833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s6, 0x7fffff80); // Largest float < INT32_MAX. 6834b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fneg(s7, s6); // Smallest float > INT32_MIN. 6835b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d8, 1.0); 6836b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d9, 1.1); 6837b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d10, 2.5); 6838b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d11, -2.5); 6839b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d12, kFP64PositiveInfinity); 6840b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d13, kFP64NegativeInfinity); 6841b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d14, kWMaxInt - 1); 6842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d15, kWMinInt + 1); 6843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s17, 1.1); 6844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s18, 2.5); 6845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s19, -2.5); 6846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s20, kFP32PositiveInfinity); 6847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s21, kFP32NegativeInfinity); 6848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s22, 0x7fffff8000000000UL); // Largest float < INT64_MAX. 6849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fneg(s23, s22); // Smallest float > INT64_MIN. 6850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d24, 1.1); 6851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d25, 2.5); 6852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d26, -2.5); 6853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d27, kFP64PositiveInfinity); 6854b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d28, kFP64NegativeInfinity); 6855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d29, 0x7ffffffffffffc00UL); // Largest double < INT64_MAX. 6856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fneg(d30, d29); // Smallest double > INT64_MIN. 6857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtas(w0, s0); 6859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtas(w1, s1); 6860b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtas(w2, s2); 6861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtas(w3, s3); 6862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtas(w4, s4); 6863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtas(w5, s5); 6864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtas(w6, s6); 6865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtas(w7, s7); 6866b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtas(w8, d8); 6867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtas(w9, d9); 6868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtas(w10, d10); 6869b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtas(w11, d11); 6870b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtas(w12, d12); 6871b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtas(w13, d13); 6872b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtas(w14, d14); 6873b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtas(w15, d15); 6874b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtas(x17, s17); 6875b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtas(x18, s18); 6876b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtas(x19, s19); 6877b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtas(x20, s20); 6878b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtas(x21, s21); 6879b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtas(x22, s22); 6880b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtas(x23, s23); 6881b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtas(x24, d24); 6882b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtas(x25, d25); 6883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtas(x26, d26); 6884b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtas(x27, d27); 6885b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtas(x28, d28); 6886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtas(x29, d29); 6887b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtas(x30, d30); 6888b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 6889b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6890b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 6891b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6892b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x0); 6893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x1); 6894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(3, x2); 6895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfffffffd, x3); 6896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x7fffffff, x4); 6897b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x80000000, x5); 6898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x7fffff80, x6); 6899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x80000080, x7); 6900b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x8); 6901b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x9); 6902b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(3, x10); 6903b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfffffffd, x11); 6904b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x7fffffff, x12); 6905b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x80000000, x13); 6906b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x7ffffffe, x14); 6907b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x80000001, x15); 6908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x17); 6909b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(3, x18); 6910b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfffffffffffffffdUL, x19); 6911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x7fffffffffffffffUL, x20); 6912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x8000000000000000UL, x21); 6913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x7fffff8000000000UL, x22); 6914b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x8000008000000000UL, x23); 6915b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x24); 6916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(3, x25); 6917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfffffffffffffffdUL, x26); 6918b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x7fffffffffffffffUL, x27); 6919b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x8000000000000000UL, x28); 6920b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x7ffffffffffffc00UL, x29); 6921b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x8000000000000400UL, x30); 6922b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6923b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 6924b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 6925b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6926b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6927b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(fcvtau) { 6928b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 6929b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 6930b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6931b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 6932b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s0, 1.0); 6933b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s1, 1.1); 6934b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s2, 2.5); 6935b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s3, -2.5); 6936b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s4, kFP32PositiveInfinity); 6937b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s5, kFP32NegativeInfinity); 6938b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s6, 0xffffff00); // Largest float < UINT32_MAX. 6939b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d8, 1.0); 6940b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d9, 1.1); 6941b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d10, 2.5); 6942b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d11, -2.5); 6943b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d12, kFP64PositiveInfinity); 6944b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d13, kFP64NegativeInfinity); 6945b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d14, 0xfffffffe); 6946b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s16, 1.0); 6947b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s17, 1.1); 6948b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s18, 2.5); 6949b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s19, -2.5); 6950b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s20, kFP32PositiveInfinity); 6951b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s21, kFP32NegativeInfinity); 6952b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s22, 0xffffff0000000000UL); // Largest float < UINT64_MAX. 6953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d24, 1.1); 6954b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d25, 2.5); 6955b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d26, -2.5); 6956b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d27, kFP64PositiveInfinity); 6957b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d28, kFP64NegativeInfinity); 6958b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d29, 0xfffffffffffff800UL); // Largest double < UINT64_MAX. 6959b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s30, 0x100000000UL); 6960b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6961b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtau(w0, s0); 6962b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtau(w1, s1); 6963b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtau(w2, s2); 6964b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtau(w3, s3); 6965b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtau(w4, s4); 6966b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtau(w5, s5); 6967b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtau(w6, s6); 6968b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtau(w8, d8); 6969b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtau(w9, d9); 6970b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtau(w10, d10); 6971b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtau(w11, d11); 6972b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtau(w12, d12); 6973b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtau(w13, d13); 6974b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtau(w14, d14); 6975b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtau(w15, d15); 6976b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtau(x16, s16); 6977b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtau(x17, s17); 6978b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtau(x18, s18); 6979b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtau(x19, s19); 6980b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtau(x20, s20); 6981b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtau(x21, s21); 6982b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtau(x22, s22); 6983b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtau(x24, d24); 6984b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtau(x25, d25); 6985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtau(x26, d26); 6986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtau(x27, d27); 6987b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtau(x28, d28); 6988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtau(x29, d29); 6989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtau(w30, s30); 6990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 6991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6992b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 6993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6994b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x0); 6995b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x1); 6996b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(3, x2); 6997b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x3); 6998b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffff, x4); 6999b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x5); 7000b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffff00, x6); 7001b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x8); 7002b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x9); 7003b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(3, x10); 7004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x11); 7005b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffff, x12); 7006b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x13); 7007b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfffffffe, x14); 7008b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x16); 7009b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x17); 7010b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(3, x18); 7011b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x19); 7012b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffffffffffffUL, x20); 7013b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x21); 7014b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffff0000000000UL, x22); 7015b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x24); 7016b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(3, x25); 7017b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x26); 7018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffffffffffffUL, x27); 7019b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x28); 7020b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfffffffffffff800UL, x29); 7021b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffff, x30); 7022b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7023b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 7024b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 7025b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(fcvtms) { 7028b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 7029b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 7030b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7031b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 7032b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s0, 1.0); 7033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s1, 1.1); 7034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s2, 1.5); 7035b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s3, -1.5); 7036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s4, kFP32PositiveInfinity); 7037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s5, kFP32NegativeInfinity); 7038b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s6, 0x7fffff80); // Largest float < INT32_MAX. 7039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fneg(s7, s6); // Smallest float > INT32_MIN. 7040b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d8, 1.0); 7041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d9, 1.1); 7042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d10, 1.5); 7043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d11, -1.5); 7044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d12, kFP64PositiveInfinity); 7045b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d13, kFP64NegativeInfinity); 7046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d14, kWMaxInt - 1); 7047b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d15, kWMinInt + 1); 7048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s17, 1.1); 7049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s18, 1.5); 7050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s19, -1.5); 7051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s20, kFP32PositiveInfinity); 7052b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s21, kFP32NegativeInfinity); 7053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s22, 0x7fffff8000000000UL); // Largest float < INT64_MAX. 7054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fneg(s23, s22); // Smallest float > INT64_MIN. 7055b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d24, 1.1); 7056b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d25, 1.5); 7057b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d26, -1.5); 7058b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d27, kFP64PositiveInfinity); 7059b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d28, kFP64NegativeInfinity); 7060b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d29, 0x7ffffffffffffc00UL); // Largest double < INT64_MAX. 7061b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fneg(d30, d29); // Smallest double > INT64_MIN. 7062b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7063b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtms(w0, s0); 7064b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtms(w1, s1); 7065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtms(w2, s2); 7066b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtms(w3, s3); 7067b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtms(w4, s4); 7068b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtms(w5, s5); 7069b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtms(w6, s6); 7070b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtms(w7, s7); 7071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtms(w8, d8); 7072b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtms(w9, d9); 7073b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtms(w10, d10); 7074b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtms(w11, d11); 7075b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtms(w12, d12); 7076b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtms(w13, d13); 7077b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtms(w14, d14); 7078b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtms(w15, d15); 7079b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtms(x17, s17); 7080b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtms(x18, s18); 7081b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtms(x19, s19); 7082b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtms(x20, s20); 7083b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtms(x21, s21); 7084b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtms(x22, s22); 7085b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtms(x23, s23); 7086b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtms(x24, d24); 7087b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtms(x25, d25); 7088b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtms(x26, d26); 7089b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtms(x27, d27); 7090b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtms(x28, d28); 7091b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtms(x29, d29); 7092b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtms(x30, d30); 7093b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 7094b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7095b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 7096b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7097b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x0); 7098b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x1); 7099b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x2); 7100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfffffffe, x3); 7101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x7fffffff, x4); 7102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x80000000, x5); 7103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x7fffff80, x6); 7104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x80000080, x7); 7105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x8); 7106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x9); 7107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x10); 7108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfffffffe, x11); 7109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x7fffffff, x12); 7110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x80000000, x13); 7111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x7ffffffe, x14); 7112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x80000001, x15); 7113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x17); 7114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x18); 7115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfffffffffffffffeUL, x19); 7116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x7fffffffffffffffUL, x20); 7117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x8000000000000000UL, x21); 7118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x7fffff8000000000UL, x22); 7119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x8000008000000000UL, x23); 7120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x24); 7121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x25); 7122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfffffffffffffffeUL, x26); 7123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x7fffffffffffffffUL, x27); 7124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x8000000000000000UL, x28); 7125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x7ffffffffffffc00UL, x29); 7126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x8000000000000400UL, x30); 7127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 7129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 7130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(fcvtmu) { 7133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 7134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 7135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 7137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s0, 1.0); 7138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s1, 1.1); 7139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s2, 1.5); 7140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s3, -1.5); 7141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s4, kFP32PositiveInfinity); 7142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s5, kFP32NegativeInfinity); 7143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s6, 0x7fffff80); // Largest float < INT32_MAX. 7144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fneg(s7, s6); // Smallest float > INT32_MIN. 7145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d8, 1.0); 7146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d9, 1.1); 7147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d10, 1.5); 7148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d11, -1.5); 7149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d12, kFP64PositiveInfinity); 7150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d13, kFP64NegativeInfinity); 7151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d14, kWMaxInt - 1); 7152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d15, kWMinInt + 1); 7153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s17, 1.1); 7154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s18, 1.5); 7155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s19, -1.5); 7156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s20, kFP32PositiveInfinity); 7157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s21, kFP32NegativeInfinity); 7158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s22, 0x7fffff8000000000UL); // Largest float < INT64_MAX. 7159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fneg(s23, s22); // Smallest float > INT64_MIN. 7160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d24, 1.1); 7161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d25, 1.5); 7162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d26, -1.5); 7163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d27, kFP64PositiveInfinity); 7164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d28, kFP64NegativeInfinity); 7165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d29, 0x7ffffffffffffc00UL); // Largest double < INT64_MAX. 7166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fneg(d30, d29); // Smallest double > INT64_MIN. 7167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtmu(w0, s0); 7169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtmu(w1, s1); 7170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtmu(w2, s2); 7171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtmu(w3, s3); 7172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtmu(w4, s4); 7173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtmu(w5, s5); 7174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtmu(w6, s6); 7175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtmu(w7, s7); 7176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtmu(w8, d8); 7177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtmu(w9, d9); 7178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtmu(w10, d10); 7179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtmu(w11, d11); 7180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtmu(w12, d12); 7181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtmu(w13, d13); 7182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtmu(w14, d14); 7183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtmu(x17, s17); 7184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtmu(x18, s18); 7185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtmu(x19, s19); 7186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtmu(x20, s20); 7187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtmu(x21, s21); 7188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtmu(x22, s22); 7189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtmu(x23, s23); 7190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtmu(x24, d24); 7191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtmu(x25, d25); 7192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtmu(x26, d26); 7193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtmu(x27, d27); 7194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtmu(x28, d28); 7195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtmu(x29, d29); 7196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtmu(x30, d30); 7197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 7198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 7200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x0); 7202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x1); 7203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x2); 7204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x3); 7205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffff, x4); 7206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x5); 7207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x7fffff80, x6); 7208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x7); 7209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x8); 7210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x9); 7211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x10); 7212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x11); 7213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffff, x12); 7214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x13); 7215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x7ffffffe, x14); 7216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x17); 7217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x18); 7218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0UL, x19); 7219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffffffffffffUL, x20); 7220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0UL, x21); 7221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x7fffff8000000000UL, x22); 7222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0UL, x23); 7223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x24); 7224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x25); 7225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0UL, x26); 7226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffffffffffffUL, x27); 7227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0UL, x28); 7228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x7ffffffffffffc00UL, x29); 7229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0UL, x30); 7230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 7232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 7233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(fcvtns) { 7236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 7237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 7238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 7240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s0, 1.0); 7241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s1, 1.1); 7242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s2, 1.5); 7243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s3, -1.5); 7244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s4, kFP32PositiveInfinity); 7245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s5, kFP32NegativeInfinity); 7246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s6, 0x7fffff80); // Largest float < INT32_MAX. 7247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fneg(s7, s6); // Smallest float > INT32_MIN. 7248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d8, 1.0); 7249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d9, 1.1); 7250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d10, 1.5); 7251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d11, -1.5); 7252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d12, kFP64PositiveInfinity); 7253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d13, kFP64NegativeInfinity); 7254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d14, kWMaxInt - 1); 7255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d15, kWMinInt + 1); 7256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s17, 1.1); 7257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s18, 1.5); 7258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s19, -1.5); 7259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s20, kFP32PositiveInfinity); 7260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s21, kFP32NegativeInfinity); 7261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s22, 0x7fffff8000000000UL); // Largest float < INT64_MAX. 7262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fneg(s23, s22); // Smallest float > INT64_MIN. 7263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d24, 1.1); 7264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d25, 1.5); 7265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d26, -1.5); 7266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d27, kFP64PositiveInfinity); 7267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d28, kFP64NegativeInfinity); 7268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d29, 0x7ffffffffffffc00UL); // Largest double < INT64_MAX. 7269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fneg(d30, d29); // Smallest double > INT64_MIN. 7270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtns(w0, s0); 7272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtns(w1, s1); 7273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtns(w2, s2); 7274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtns(w3, s3); 7275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtns(w4, s4); 7276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtns(w5, s5); 7277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtns(w6, s6); 7278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtns(w7, s7); 7279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtns(w8, d8); 7280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtns(w9, d9); 7281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtns(w10, d10); 7282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtns(w11, d11); 7283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtns(w12, d12); 7284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtns(w13, d13); 7285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtns(w14, d14); 7286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtns(w15, d15); 7287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtns(x17, s17); 7288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtns(x18, s18); 7289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtns(x19, s19); 7290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtns(x20, s20); 7291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtns(x21, s21); 7292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtns(x22, s22); 7293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtns(x23, s23); 7294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtns(x24, d24); 7295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtns(x25, d25); 7296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtns(x26, d26); 7297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtns(x27, d27); 7298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// __ Fcvtns(x28, d28); 7299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtns(x29, d29); 7300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtns(x30, d30); 7301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 7302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 7304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x0); 7306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x1); 7307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(2, x2); 7308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfffffffe, x3); 7309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x7fffffff, x4); 7310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x80000000, x5); 7311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x7fffff80, x6); 7312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x80000080, x7); 7313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x8); 7314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x9); 7315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(2, x10); 7316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfffffffe, x11); 7317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x7fffffff, x12); 7318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x80000000, x13); 7319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x7ffffffe, x14); 7320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x80000001, x15); 7321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x17); 7322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(2, x18); 7323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfffffffffffffffeUL, x19); 7324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x7fffffffffffffffUL, x20); 7325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x8000000000000000UL, x21); 7326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x7fffff8000000000UL, x22); 7327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x8000008000000000UL, x23); 7328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x24); 7329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(2, x25); 7330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfffffffffffffffeUL, x26); 7331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x7fffffffffffffffUL, x27); 7332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// CHECK_EQUAL_64(0x8000000000000000UL, x28); 7333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x7ffffffffffffc00UL, x29); 7334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x8000000000000400UL, x30); 7335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 7337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 7338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(fcvtnu) { 7341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 7342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 7343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 7345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s0, 1.0); 7346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s1, 1.1); 7347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s2, 1.5); 7348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s3, -1.5); 7349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s4, kFP32PositiveInfinity); 7350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s5, kFP32NegativeInfinity); 7351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s6, 0xffffff00); // Largest float < UINT32_MAX. 7352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d8, 1.0); 7353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d9, 1.1); 7354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d10, 1.5); 7355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d11, -1.5); 7356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d12, kFP64PositiveInfinity); 7357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d13, kFP64NegativeInfinity); 7358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d14, 0xfffffffe); 7359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s16, 1.0); 7360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s17, 1.1); 7361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s18, 1.5); 7362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s19, -1.5); 7363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s20, kFP32PositiveInfinity); 7364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s21, kFP32NegativeInfinity); 7365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s22, 0xffffff0000000000UL); // Largest float < UINT64_MAX. 7366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d24, 1.1); 7367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d25, 1.5); 7368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d26, -1.5); 7369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d27, kFP64PositiveInfinity); 7370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d28, kFP64NegativeInfinity); 7371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d29, 0xfffffffffffff800UL); // Largest double < UINT64_MAX. 7372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s30, 0x100000000UL); 7373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtnu(w0, s0); 7375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtnu(w1, s1); 7376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtnu(w2, s2); 7377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtnu(w3, s3); 7378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtnu(w4, s4); 7379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtnu(w5, s5); 7380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtnu(w6, s6); 7381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtnu(w8, d8); 7382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtnu(w9, d9); 7383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtnu(w10, d10); 7384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtnu(w11, d11); 7385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtnu(w12, d12); 7386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtnu(w13, d13); 7387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtnu(w14, d14); 7388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtnu(w15, d15); 7389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtnu(x16, s16); 7390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtnu(x17, s17); 7391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtnu(x18, s18); 7392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtnu(x19, s19); 7393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtnu(x20, s20); 7394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtnu(x21, s21); 7395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtnu(x22, s22); 7396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtnu(x24, d24); 7397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtnu(x25, d25); 7398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtnu(x26, d26); 7399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtnu(x27, d27); 7400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// __ Fcvtnu(x28, d28); 7401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtnu(x29, d29); 7402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtnu(w30, s30); 7403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 7404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 7406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x0); 7408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x1); 7409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(2, x2); 7410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x3); 7411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffff, x4); 7412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x5); 7413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffff00, x6); 7414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x8); 7415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x9); 7416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(2, x10); 7417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x11); 7418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffff, x12); 7419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x13); 7420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfffffffe, x14); 7421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x16); 7422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x17); 7423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(2, x18); 7424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x19); 7425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffffffffffffUL, x20); 7426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x21); 7427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffff0000000000UL, x22); 7428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x24); 7429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(2, x25); 7430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x26); 7431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffffffffffffUL, x27); 7432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// CHECK_EQUAL_64(0, x28); 7433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xfffffffffffff800UL, x29); 7434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffff, x30); 7435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 7437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 7438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(fcvtzs) { 7441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 7442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 7443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 7445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s0, 1.0); 7446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s1, 1.1); 7447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s2, 1.5); 7448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s3, -1.5); 7449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s4, kFP32PositiveInfinity); 7450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s5, kFP32NegativeInfinity); 7451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s6, 0x7fffff80); // Largest float < INT32_MAX. 7452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fneg(s7, s6); // Smallest float > INT32_MIN. 7453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d8, 1.0); 7454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d9, 1.1); 7455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d10, 1.5); 7456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d11, -1.5); 7457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d12, kFP64PositiveInfinity); 7458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d13, kFP64NegativeInfinity); 7459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d14, kWMaxInt - 1); 7460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d15, kWMinInt + 1); 7461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s17, 1.1); 7462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s18, 1.5); 7463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s19, -1.5); 7464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s20, kFP32PositiveInfinity); 7465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s21, kFP32NegativeInfinity); 7466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s22, 0x7fffff8000000000UL); // Largest float < INT64_MAX. 7467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fneg(s23, s22); // Smallest float > INT64_MIN. 7468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d24, 1.1); 7469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d25, 1.5); 7470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d26, -1.5); 7471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d27, kFP64PositiveInfinity); 7472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d28, kFP64NegativeInfinity); 7473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d29, 0x7ffffffffffffc00UL); // Largest double < INT64_MAX. 7474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fneg(d30, d29); // Smallest double > INT64_MIN. 7475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtzs(w0, s0); 7477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtzs(w1, s1); 7478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtzs(w2, s2); 7479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtzs(w3, s3); 7480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtzs(w4, s4); 7481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtzs(w5, s5); 7482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtzs(w6, s6); 7483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtzs(w7, s7); 7484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtzs(w8, d8); 7485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtzs(w9, d9); 7486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtzs(w10, d10); 7487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtzs(w11, d11); 7488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtzs(w12, d12); 7489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtzs(w13, d13); 7490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtzs(w14, d14); 7491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtzs(w15, d15); 7492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtzs(x17, s17); 7493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtzs(x18, s18); 7494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtzs(x19, s19); 7495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtzs(x20, s20); 7496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtzs(x21, s21); 7497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtzs(x22, s22); 7498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtzs(x23, s23); 7499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtzs(x24, d24); 7500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtzs(x25, d25); 7501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtzs(x26, d26); 7502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtzs(x27, d27); 7503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtzs(x28, d28); 7504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtzs(x29, d29); 7505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtzs(x30, d30); 7506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 7507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 7509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x0); 7511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x1); 7512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x2); 7513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffff, x3); 7514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x7fffffff, x4); 7515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x80000000, x5); 7516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x7fffff80, x6); 7517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x80000080, x7); 7518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x8); 7519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x9); 7520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x10); 7521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffff, x11); 7522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x7fffffff, x12); 7523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x80000000, x13); 7524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x7ffffffe, x14); 7525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x80000001, x15); 7526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x17); 7527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x18); 7528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffffffffffffUL, x19); 7529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x7fffffffffffffffUL, x20); 7530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x8000000000000000UL, x21); 7531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x7fffff8000000000UL, x22); 7532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x8000008000000000UL, x23); 7533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x24); 7534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x25); 7535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffffffffffffUL, x26); 7536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x7fffffffffffffffUL, x27); 7537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x8000000000000000UL, x28); 7538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x7ffffffffffffc00UL, x29); 7539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x8000000000000400UL, x30); 7540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 7542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 7543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(fcvtzu) { 7546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 7547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 7548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 7550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s0, 1.0); 7551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s1, 1.1); 7552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s2, 1.5); 7553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s3, -1.5); 7554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s4, kFP32PositiveInfinity); 7555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s5, kFP32NegativeInfinity); 7556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s6, 0x7fffff80); // Largest float < INT32_MAX. 7557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fneg(s7, s6); // Smallest float > INT32_MIN. 7558b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d8, 1.0); 7559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d9, 1.1); 7560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d10, 1.5); 7561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d11, -1.5); 7562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d12, kFP64PositiveInfinity); 7563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d13, kFP64NegativeInfinity); 7564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d14, kWMaxInt - 1); 7565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d15, kWMinInt + 1); 7566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s17, 1.1); 7567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s18, 1.5); 7568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s19, -1.5); 7569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s20, kFP32PositiveInfinity); 7570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s21, kFP32NegativeInfinity); 7571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s22, 0x7fffff8000000000UL); // Largest float < INT64_MAX. 7572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fneg(s23, s22); // Smallest float > INT64_MIN. 7573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d24, 1.1); 7574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d25, 1.5); 7575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d26, -1.5); 7576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d27, kFP64PositiveInfinity); 7577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d28, kFP64NegativeInfinity); 7578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d29, 0x7ffffffffffffc00UL); // Largest double < INT64_MAX. 7579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fneg(d30, d29); // Smallest double > INT64_MIN. 7580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtzu(w0, s0); 7582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtzu(w1, s1); 7583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtzu(w2, s2); 7584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtzu(w3, s3); 7585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtzu(w4, s4); 7586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtzu(w5, s5); 7587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtzu(w6, s6); 7588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtzu(w7, s7); 7589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtzu(w8, d8); 7590b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtzu(w9, d9); 7591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtzu(w10, d10); 7592b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtzu(w11, d11); 7593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtzu(w12, d12); 7594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtzu(w13, d13); 7595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtzu(w14, d14); 7596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtzu(x17, s17); 7597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtzu(x18, s18); 7598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtzu(x19, s19); 7599b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtzu(x20, s20); 7600b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtzu(x21, s21); 7601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtzu(x22, s22); 7602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtzu(x23, s23); 7603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtzu(x24, d24); 7604b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtzu(x25, d25); 7605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtzu(x26, d26); 7606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtzu(x27, d27); 7607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtzu(x28, d28); 7608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtzu(x29, d29); 7609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvtzu(x30, d30); 7610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 7611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7612b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 7613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x0); 7615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x1); 7616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x2); 7617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x3); 7618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffff, x4); 7619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x5); 7620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x7fffff80, x6); 7621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x7); 7622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x8); 7623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x9); 7624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x10); 7625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x11); 7626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffff, x12); 7627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x13); 7628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x7ffffffe, x14); 7629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x17); 7630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x18); 7631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0UL, x19); 7632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffffffffffffUL, x20); 7633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0UL, x21); 7634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x7fffff8000000000UL, x22); 7635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0UL, x23); 7636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x24); 7637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x25); 7638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0UL, x26); 7639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xffffffffffffffffUL, x27); 7640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0UL, x28); 7641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x7ffffffffffffc00UL, x29); 7642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0UL, x30); 7643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 7645b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 7646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Test that scvtf and ucvtf can convert the 64-bit input into the expected 7649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// value. All possible values of 'fbits' are tested. The expected value is 7650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// modified accordingly in each case. 7651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// 7652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// The expected value is specified as the bit encoding of the expected double 7653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// produced by scvtf (expected_scvtf_bits) as well as ucvtf 7654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// (expected_ucvtf_bits). 7655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// 7656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Where the input value is representable by int32_t or uint32_t, conversions 7657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// from W registers will also be tested. 7658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic void TestUScvtfHelper(uint64_t in, 7659b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint64_t expected_scvtf_bits, 7660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint64_t expected_ucvtf_bits) { 7661b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint64_t u64 = in; 7662b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t u32 = u64 & 0xffffffff; 7663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int64_t s64 = static_cast<int64_t>(in); 7664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t s32 = s64 & 0x7fffffff; 7665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool cvtf_s32 = (s64 == s32); 7667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool cvtf_u32 = (u64 == u32); 7668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double results_scvtf_x[65]; 7670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double results_ucvtf_x[65]; 7671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double results_scvtf_w[33]; 7672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double results_ucvtf_w[33]; 7673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 7675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 7676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, reinterpret_cast<int64_t>(results_scvtf_x)); 7678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, reinterpret_cast<int64_t>(results_ucvtf_x)); 7679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x2, reinterpret_cast<int64_t>(results_scvtf_w)); 7680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x3, reinterpret_cast<int64_t>(results_ucvtf_w)); 7681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x10, s64); 7683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Corrupt the top word, in case it is accidentally used during W-register 7685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // conversions. 7686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x11, 0x5555555555555555); 7687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bfi(x11, x10, 0, kWRegSizeInBits); 7688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Test integer conversions. 7690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Scvtf(d0, x10); 7691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ucvtf(d1, x10); 7692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Scvtf(d2, w11); 7693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ucvtf(d3, w11); 7694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Str(d0, MemOperand(x0)); 7695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Str(d1, MemOperand(x1)); 7696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Str(d2, MemOperand(x2)); 7697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Str(d3, MemOperand(x3)); 7698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Test all possible values of fbits. 7700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int fbits = 1; fbits <= 32; fbits++) { 7701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Scvtf(d0, x10, fbits); 7702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ucvtf(d1, x10, fbits); 7703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Scvtf(d2, w11, fbits); 7704b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ucvtf(d3, w11, fbits); 7705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Str(d0, MemOperand(x0, fbits * kDRegSize)); 7706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Str(d1, MemOperand(x1, fbits * kDRegSize)); 7707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Str(d2, MemOperand(x2, fbits * kDRegSize)); 7708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Str(d3, MemOperand(x3, fbits * kDRegSize)); 7709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 7710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Conversions from W registers can only handle fbits values <= 32, so just 7712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // test conversions from X registers for 32 < fbits <= 64. 7713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int fbits = 33; fbits <= 64; fbits++) { 7714b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Scvtf(d0, x10, fbits); 7715b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ucvtf(d1, x10, fbits); 7716b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Str(d0, MemOperand(x0, fbits * kDRegSize)); 7717b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Str(d1, MemOperand(x1, fbits * kDRegSize)); 7718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 7719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7720b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 7721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 7722b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Check the results. 7724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double expected_scvtf_base = rawbits_to_double(expected_scvtf_bits); 7725b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double expected_ucvtf_base = rawbits_to_double(expected_ucvtf_bits); 7726b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7727b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int fbits = 0; fbits <= 32; fbits++) { 7728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double expected_scvtf = expected_scvtf_base / pow(2.0, fbits); 7729b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double expected_ucvtf = expected_ucvtf_base / pow(2.0, fbits); 7730b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(expected_scvtf, results_scvtf_x[fbits]); 7731b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(expected_ucvtf, results_ucvtf_x[fbits]); 7732b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (cvtf_s32) CHECK_EQUAL_FP64(expected_scvtf, results_scvtf_w[fbits]); 7733b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (cvtf_u32) CHECK_EQUAL_FP64(expected_ucvtf, results_ucvtf_w[fbits]); 7734b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 7735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int fbits = 33; fbits <= 64; fbits++) { 7736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double expected_scvtf = expected_scvtf_base / pow(2.0, fbits); 7737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double expected_ucvtf = expected_ucvtf_base / pow(2.0, fbits); 7738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(expected_scvtf, results_scvtf_x[fbits]); 7739b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(expected_ucvtf, results_ucvtf_x[fbits]); 7740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 7741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 7743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 7744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7745b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7746b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(scvtf_ucvtf_double) { 7747b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 7748b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Simple conversions of positive numbers which require no rounding; the 7749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // results should not depened on the rounding mode, and ucvtf and scvtf should 7750b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // produce the same result. 7751b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtfHelper(0x0000000000000000, 0x0000000000000000, 0x0000000000000000); 7752b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtfHelper(0x0000000000000001, 0x3ff0000000000000, 0x3ff0000000000000); 7753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtfHelper(0x0000000040000000, 0x41d0000000000000, 0x41d0000000000000); 7754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtfHelper(0x0000000100000000, 0x41f0000000000000, 0x41f0000000000000); 7755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtfHelper(0x4000000000000000, 0x43d0000000000000, 0x43d0000000000000); 7756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Test mantissa extremities. 7757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtfHelper(0x4000000000000400, 0x43d0000000000001, 0x43d0000000000001); 7758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The largest int32_t that fits in a double. 7759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtfHelper(0x000000007fffffff, 0x41dfffffffc00000, 0x41dfffffffc00000); 7760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Values that would be negative if treated as an int32_t. 7761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtfHelper(0x00000000ffffffff, 0x41efffffffe00000, 0x41efffffffe00000); 7762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtfHelper(0x0000000080000000, 0x41e0000000000000, 0x41e0000000000000); 7763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtfHelper(0x0000000080000001, 0x41e0000000200000, 0x41e0000000200000); 7764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The largest int64_t that fits in a double. 7765b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtfHelper(0x7ffffffffffffc00, 0x43dfffffffffffff, 0x43dfffffffffffff); 7766b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Check for bit pattern reproduction. 7767b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtfHelper(0x0123456789abcde0, 0x43723456789abcde, 0x43723456789abcde); 7768b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtfHelper(0x0000000012345678, 0x41b2345678000000, 0x41b2345678000000); 7769b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7770b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Simple conversions of negative int64_t values. These require no rounding, 7771b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // and the results should not depend on the rounding mode. 7772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtfHelper(0xffffffffc0000000, 0xc1d0000000000000, 0x43effffffff80000); 7773b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtfHelper(0xffffffff00000000, 0xc1f0000000000000, 0x43efffffffe00000); 7774b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtfHelper(0xc000000000000000, 0xc3d0000000000000, 0x43e8000000000000); 7775b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7776b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Conversions which require rounding. 7777b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtfHelper(0x1000000000000000, 0x43b0000000000000, 0x43b0000000000000); 7778b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtfHelper(0x1000000000000001, 0x43b0000000000000, 0x43b0000000000000); 7779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtfHelper(0x1000000000000080, 0x43b0000000000000, 0x43b0000000000000); 7780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtfHelper(0x1000000000000081, 0x43b0000000000001, 0x43b0000000000001); 7781b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtfHelper(0x1000000000000100, 0x43b0000000000001, 0x43b0000000000001); 7782b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtfHelper(0x1000000000000101, 0x43b0000000000001, 0x43b0000000000001); 7783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtfHelper(0x1000000000000180, 0x43b0000000000002, 0x43b0000000000002); 7784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtfHelper(0x1000000000000181, 0x43b0000000000002, 0x43b0000000000002); 7785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtfHelper(0x1000000000000200, 0x43b0000000000002, 0x43b0000000000002); 7786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtfHelper(0x1000000000000201, 0x43b0000000000002, 0x43b0000000000002); 7787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtfHelper(0x1000000000000280, 0x43b0000000000002, 0x43b0000000000002); 7788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtfHelper(0x1000000000000281, 0x43b0000000000003, 0x43b0000000000003); 7789b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtfHelper(0x1000000000000300, 0x43b0000000000003, 0x43b0000000000003); 7790b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Check rounding of negative int64_t values (and large uint64_t values). 7791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtfHelper(0x8000000000000000, 0xc3e0000000000000, 0x43e0000000000000); 7792b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtfHelper(0x8000000000000001, 0xc3e0000000000000, 0x43e0000000000000); 7793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtfHelper(0x8000000000000200, 0xc3e0000000000000, 0x43e0000000000000); 7794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtfHelper(0x8000000000000201, 0xc3dfffffffffffff, 0x43e0000000000000); 7795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtfHelper(0x8000000000000400, 0xc3dfffffffffffff, 0x43e0000000000000); 7796b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtfHelper(0x8000000000000401, 0xc3dfffffffffffff, 0x43e0000000000001); 7797b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtfHelper(0x8000000000000600, 0xc3dffffffffffffe, 0x43e0000000000001); 7798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtfHelper(0x8000000000000601, 0xc3dffffffffffffe, 0x43e0000000000001); 7799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtfHelper(0x8000000000000800, 0xc3dffffffffffffe, 0x43e0000000000001); 7800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtfHelper(0x8000000000000801, 0xc3dffffffffffffe, 0x43e0000000000001); 7801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtfHelper(0x8000000000000a00, 0xc3dffffffffffffe, 0x43e0000000000001); 7802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtfHelper(0x8000000000000a01, 0xc3dffffffffffffd, 0x43e0000000000001); 7803b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtfHelper(0x8000000000000c00, 0xc3dffffffffffffd, 0x43e0000000000002); 7804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Round up to produce a result that's too big for the input to represent. 7805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtfHelper(0x7ffffffffffffe00, 0x43e0000000000000, 0x43e0000000000000); 7806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtfHelper(0x7fffffffffffffff, 0x43e0000000000000, 0x43e0000000000000); 7807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtfHelper(0xfffffffffffffc00, 0xc090000000000000, 0x43f0000000000000); 7808b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtfHelper(0xffffffffffffffff, 0xbff0000000000000, 0x43f0000000000000); 7809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 7810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// The same as TestUScvtfHelper, but convert to floats. 7813b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic void TestUScvtf32Helper(uint64_t in, 7814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t expected_scvtf_bits, 7815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t expected_ucvtf_bits) { 7816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint64_t u64 = in; 7817b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t u32 = u64 & 0xffffffff; 7818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int64_t s64 = static_cast<int64_t>(in); 7819b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t s32 = s64 & 0x7fffffff; 7820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7821b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool cvtf_s32 = (s64 == s32); 7822b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool cvtf_u32 = (u64 == u32); 7823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch float results_scvtf_x[65]; 7825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch float results_ucvtf_x[65]; 7826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch float results_scvtf_w[33]; 7827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch float results_ucvtf_w[33]; 7828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 7830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 7831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, reinterpret_cast<int64_t>(results_scvtf_x)); 7833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, reinterpret_cast<int64_t>(results_ucvtf_x)); 7834b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x2, reinterpret_cast<int64_t>(results_scvtf_w)); 7835b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x3, reinterpret_cast<int64_t>(results_ucvtf_w)); 7836b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7837b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x10, s64); 7838b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7839b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Corrupt the top word, in case it is accidentally used during W-register 7840b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // conversions. 7841b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x11, 0x5555555555555555); 7842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bfi(x11, x10, 0, kWRegSizeInBits); 7843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Test integer conversions. 7845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Scvtf(s0, x10); 7846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ucvtf(s1, x10); 7847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Scvtf(s2, w11); 7848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ucvtf(s3, w11); 7849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Str(s0, MemOperand(x0)); 7850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Str(s1, MemOperand(x1)); 7851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Str(s2, MemOperand(x2)); 7852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Str(s3, MemOperand(x3)); 7853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7854b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Test all possible values of fbits. 7855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int fbits = 1; fbits <= 32; fbits++) { 7856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Scvtf(s0, x10, fbits); 7857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ucvtf(s1, x10, fbits); 7858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Scvtf(s2, w11, fbits); 7859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ucvtf(s3, w11, fbits); 7860b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Str(s0, MemOperand(x0, fbits * kSRegSize)); 7861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Str(s1, MemOperand(x1, fbits * kSRegSize)); 7862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Str(s2, MemOperand(x2, fbits * kSRegSize)); 7863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Str(s3, MemOperand(x3, fbits * kSRegSize)); 7864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 7865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7866b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Conversions from W registers can only handle fbits values <= 32, so just 7867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // test conversions from X registers for 32 < fbits <= 64. 7868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int fbits = 33; fbits <= 64; fbits++) { 7869b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Scvtf(s0, x10, fbits); 7870b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ucvtf(s1, x10, fbits); 7871b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Str(s0, MemOperand(x0, fbits * kSRegSize)); 7872b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Str(s1, MemOperand(x1, fbits * kSRegSize)); 7873b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 7874b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7875b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 7876b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 7877b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7878b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Check the results. 7879b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch float expected_scvtf_base = rawbits_to_float(expected_scvtf_bits); 7880b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch float expected_ucvtf_base = rawbits_to_float(expected_ucvtf_bits); 7881b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7882b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int fbits = 0; fbits <= 32; fbits++) { 7883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch float expected_scvtf = expected_scvtf_base / powf(2, fbits); 7884b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch float expected_ucvtf = expected_ucvtf_base / powf(2, fbits); 7885b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(expected_scvtf, results_scvtf_x[fbits]); 7886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(expected_ucvtf, results_ucvtf_x[fbits]); 7887b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (cvtf_s32) CHECK_EQUAL_FP32(expected_scvtf, results_scvtf_w[fbits]); 7888b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (cvtf_u32) CHECK_EQUAL_FP32(expected_ucvtf, results_ucvtf_w[fbits]); 7889b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 7890b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 7891b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int fbits = 33; fbits <= 64; fbits++) { 7892b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 7893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch float expected_scvtf = expected_scvtf_base / powf(2, fbits); 7894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch float expected_ucvtf = expected_ucvtf_base / powf(2, fbits); 7895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(expected_scvtf, results_scvtf_x[fbits]); 7896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(expected_ucvtf, results_ucvtf_x[fbits]); 7897b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 7898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 7900b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 7901b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7902b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7903b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(scvtf_ucvtf_float) { 7904b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 7905b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Simple conversions of positive numbers which require no rounding; the 7906b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // results should not depened on the rounding mode, and ucvtf and scvtf should 7907b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // produce the same result. 7908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtf32Helper(0x0000000000000000, 0x00000000, 0x00000000); 7909b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtf32Helper(0x0000000000000001, 0x3f800000, 0x3f800000); 7910b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtf32Helper(0x0000000040000000, 0x4e800000, 0x4e800000); 7911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtf32Helper(0x0000000100000000, 0x4f800000, 0x4f800000); 7912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtf32Helper(0x4000000000000000, 0x5e800000, 0x5e800000); 7913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Test mantissa extremities. 7914b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtf32Helper(0x0000000000800001, 0x4b000001, 0x4b000001); 7915b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtf32Helper(0x4000008000000000, 0x5e800001, 0x5e800001); 7916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The largest int32_t that fits in a float. 7917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtf32Helper(0x000000007fffff80, 0x4effffff, 0x4effffff); 7918b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Values that would be negative if treated as an int32_t. 7919b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtf32Helper(0x00000000ffffff00, 0x4f7fffff, 0x4f7fffff); 7920b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtf32Helper(0x0000000080000000, 0x4f000000, 0x4f000000); 7921b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtf32Helper(0x0000000080000100, 0x4f000001, 0x4f000001); 7922b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The largest int64_t that fits in a float. 7923b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtf32Helper(0x7fffff8000000000, 0x5effffff, 0x5effffff); 7924b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Check for bit pattern reproduction. 7925b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtf32Helper(0x0000000000876543, 0x4b076543, 0x4b076543); 7926b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7927b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Simple conversions of negative int64_t values. These require no rounding, 7928b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // and the results should not depend on the rounding mode. 7929b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtf32Helper(0xfffffc0000000000, 0xd4800000, 0x5f7ffffc); 7930b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtf32Helper(0xc000000000000000, 0xde800000, 0x5f400000); 7931b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7932b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Conversions which require rounding. 7933b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtf32Helper(0x0000800000000000, 0x57000000, 0x57000000); 7934b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtf32Helper(0x0000800000000001, 0x57000000, 0x57000000); 7935b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtf32Helper(0x0000800000800000, 0x57000000, 0x57000000); 7936b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtf32Helper(0x0000800000800001, 0x57000001, 0x57000001); 7937b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtf32Helper(0x0000800001000000, 0x57000001, 0x57000001); 7938b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtf32Helper(0x0000800001000001, 0x57000001, 0x57000001); 7939b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtf32Helper(0x0000800001800000, 0x57000002, 0x57000002); 7940b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtf32Helper(0x0000800001800001, 0x57000002, 0x57000002); 7941b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtf32Helper(0x0000800002000000, 0x57000002, 0x57000002); 7942b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtf32Helper(0x0000800002000001, 0x57000002, 0x57000002); 7943b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtf32Helper(0x0000800002800000, 0x57000002, 0x57000002); 7944b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtf32Helper(0x0000800002800001, 0x57000003, 0x57000003); 7945b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtf32Helper(0x0000800003000000, 0x57000003, 0x57000003); 7946b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Check rounding of negative int64_t values (and large uint64_t values). 7947b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtf32Helper(0x8000000000000000, 0xdf000000, 0x5f000000); 7948b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtf32Helper(0x8000000000000001, 0xdf000000, 0x5f000000); 7949b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtf32Helper(0x8000004000000000, 0xdf000000, 0x5f000000); 7950b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtf32Helper(0x8000004000000001, 0xdeffffff, 0x5f000000); 7951b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtf32Helper(0x8000008000000000, 0xdeffffff, 0x5f000000); 7952b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtf32Helper(0x8000008000000001, 0xdeffffff, 0x5f000001); 7953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtf32Helper(0x800000c000000000, 0xdefffffe, 0x5f000001); 7954b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtf32Helper(0x800000c000000001, 0xdefffffe, 0x5f000001); 7955b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtf32Helper(0x8000010000000000, 0xdefffffe, 0x5f000001); 7956b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtf32Helper(0x8000010000000001, 0xdefffffe, 0x5f000001); 7957b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtf32Helper(0x8000014000000000, 0xdefffffe, 0x5f000001); 7958b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtf32Helper(0x8000014000000001, 0xdefffffd, 0x5f000001); 7959b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtf32Helper(0x8000018000000000, 0xdefffffd, 0x5f000002); 7960b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Round up to produce a result that's too big for the input to represent. 7961b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtf32Helper(0x000000007fffffc0, 0x4f000000, 0x4f000000); 7962b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtf32Helper(0x000000007fffffff, 0x4f000000, 0x4f000000); 7963b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtf32Helper(0x00000000ffffff80, 0x4f800000, 0x4f800000); 7964b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtf32Helper(0x00000000ffffffff, 0x4f800000, 0x4f800000); 7965b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtf32Helper(0x7fffffc000000000, 0x5f000000, 0x5f000000); 7966b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtf32Helper(0x7fffffffffffffff, 0x5f000000, 0x5f000000); 7967b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtf32Helper(0xffffff8000000000, 0xd3000000, 0x5f800000); 7968b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestUScvtf32Helper(0xffffffffffffffff, 0xbf800000, 0x5f800000); 7969b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 7970b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7971b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7972b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(system_mrs) { 7973b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 7974b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 7975b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7976b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 7977b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w0, 0); 7978b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w1, 1); 7979b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w2, 0x80000000); 7980b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7981b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Set the Z and C flags. 7982b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmp(w0, w0); 7983b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mrs(x3, NZCV); 7984b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Set the N flag. 7986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmp(w0, w1); 7987b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mrs(x4, NZCV); 7988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Set the Z, C and V flags. 7990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adds(w0, w2, w2); 7991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mrs(x5, NZCV); 7992b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Read the default FPCR. 7994b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mrs(x6, FPCR); 7995b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 7996b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7997b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 7998b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7999b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // NZCV 8000b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(ZCFlag, w3); 8001b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(NFlag, w4); 8002b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(ZCVFlag, w5); 8003b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // FPCR 8005b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The default FPCR on Linux-based platforms is 0. 8006b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0, w6); 8007b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8008b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 8009b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 8010b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8011b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8012b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(system_msr) { 8013b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 8014b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // All FPCR fields that must be implemented: AHP, DN, FZ, RMode 8015b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const uint64_t fpcr_core = 0x07c00000; 8016b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8017b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // All FPCR fields (including fields which may be read-as-zero): 8018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Stride, Len 8019b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // IDE, IXE, UFE, OFE, DZE, IOE 8020b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const uint64_t fpcr_all = fpcr_core | 0x00379f00; 8021b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8022b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 8023b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8024b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 8025b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w0, 0); 8026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w1, 0x7fffffff); 8027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8028b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x7, 0); 8029b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8030b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x10, NVFlag); 8031b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmp(w0, w0); // Set Z and C. 8032b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Msr(NZCV, x10); // Set N and V. 8033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The Msr should have overwritten every flag set by the Cmp. 8034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cinc(x7, x7, mi); // N 8035b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cinc(x7, x7, ne); // !Z 8036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cinc(x7, x7, lo); // !C 8037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cinc(x7, x7, vs); // V 8038b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x10, ZCFlag); 8040b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cmn(w1, w1); // Set N and V. 8041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Msr(NZCV, x10); // Set Z and C. 8042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The Msr should have overwritten every flag set by the Cmn. 8043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cinc(x7, x7, pl); // !N 8044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cinc(x7, x7, eq); // Z 8045b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cinc(x7, x7, hs); // C 8046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Cinc(x7, x7, vc); // !V 8047b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // All core FPCR fields must be writable. 8049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x8, fpcr_core); 8050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Msr(FPCR, x8); 8051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mrs(x8, FPCR); 8052b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // All FPCR fields, including optional ones. This part of the test doesn't 8054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // achieve much other than ensuring that supported fields can be cleared by 8055b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // the next test. 8056b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x9, fpcr_all); 8057b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Msr(FPCR, x9); 8058b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mrs(x9, FPCR); 8059b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ And(x9, x9, fpcr_core); 8060b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8061b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The undefined bits must ignore writes. 8062b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // It's conceivable that a future version of the architecture could use these 8063b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // fields (making this test fail), but in the meantime this is a useful test 8064b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // for the simulator. 8065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x10, ~fpcr_all); 8066b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Msr(FPCR, x10); 8067b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mrs(x10, FPCR); 8068b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8069b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 8070b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 8072b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8073b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // We should have incremented x7 (from 0) exactly 8 times. 8074b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(8, x7); 8075b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8076b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(fpcr_core, x8); 8077b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(fpcr_core, x9); 8078b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x10); 8079b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8080b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 8081b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 8082b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8083b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8084b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(system_nop) { 8085b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 8086b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 8087b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RegisterDump before; 8088b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8089b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 8090b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch before.Dump(&masm); 8091b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Nop(); 8092b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 8093b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8094b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 8095b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8096b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_REGISTERS(before); 8097b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_NZCV(before.flags_nzcv()); 8098b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8099b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 8100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 8101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(zero_dest) { 8104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 8105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 8106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RegisterDump before; 8107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 8109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Preserve the system stack pointer, in case we clobber it. 8110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x30, csp); 8111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Initialize the other registers used in this test. 8112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint64_t literal_base = 0x0100001000100101UL; 8113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0); 8114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, literal_base); 8115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (unsigned i = 2; i < x30.code(); i++) { 8116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(Register::XRegFromCode(i), Register::XRegFromCode(i-1), x1); 8117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 8118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch before.Dump(&masm); 8119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // All of these instructions should be NOPs in these forms, but have 8121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // alternate forms which can write into the stack pointer. 8122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ add(xzr, x0, x1); 8123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ add(xzr, x1, xzr); 8124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ add(xzr, xzr, x1); 8125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ and_(xzr, x0, x2); 8127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ and_(xzr, x2, xzr); 8128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ and_(xzr, xzr, x2); 8129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ bic(xzr, x0, x3); 8131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ bic(xzr, x3, xzr); 8132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ bic(xzr, xzr, x3); 8133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ eon(xzr, x0, x4); 8135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ eon(xzr, x4, xzr); 8136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ eon(xzr, xzr, x4); 8137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ eor(xzr, x0, x5); 8139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ eor(xzr, x5, xzr); 8140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ eor(xzr, xzr, x5); 8141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ orr(xzr, x0, x6); 8143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ orr(xzr, x6, xzr); 8144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ orr(xzr, xzr, x6); 8145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ sub(xzr, x0, x7); 8147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ sub(xzr, x7, xzr); 8148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ sub(xzr, xzr, x7); 8149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Swap the saved system stack pointer with the real one. If csp was written 8151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // during the test, it will show up in x30. This is done because the test 8152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // framework assumes that csp will be valid at the end of the test. 8153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x29, x30); 8154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x30, csp); 8155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(csp, x29); 8156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // We used x29 as a scratch register, so reset it to make sure it doesn't 8157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // trigger a test failure. 8158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(x29, x28, x1); 8159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 8160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 8162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_REGISTERS(before); 8164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_NZCV(before.flags_nzcv()); 8165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 8167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 8168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(zero_dest_setflags) { 8171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 8172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 8173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RegisterDump before; 8174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 8176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Preserve the system stack pointer, in case we clobber it. 8177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x30, csp); 8178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Initialize the other registers used in this test. 8179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint64_t literal_base = 0x0100001000100101UL; 8180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0); 8181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, literal_base); 8182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 2; i < 30; i++) { 8183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(Register::XRegFromCode(i), Register::XRegFromCode(i-1), x1); 8184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 8185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch before.Dump(&masm); 8186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // All of these instructions should only write to the flags in these forms, 8188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // but have alternate forms which can write into the stack pointer. 8189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ adds(xzr, x0, Operand(x1, UXTX)); 8190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ adds(xzr, x1, Operand(xzr, UXTX)); 8191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ adds(xzr, x1, 1234); 8192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ adds(xzr, x0, x1); 8193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ adds(xzr, x1, xzr); 8194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ adds(xzr, xzr, x1); 8195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ ands(xzr, x2, ~0xf); 8197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ ands(xzr, xzr, ~0xf); 8198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ ands(xzr, x0, x2); 8199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ ands(xzr, x2, xzr); 8200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ ands(xzr, xzr, x2); 8201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ bics(xzr, x3, ~0xf); 8203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ bics(xzr, xzr, ~0xf); 8204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ bics(xzr, x0, x3); 8205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ bics(xzr, x3, xzr); 8206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ bics(xzr, xzr, x3); 8207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ subs(xzr, x0, Operand(x3, UXTX)); 8209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ subs(xzr, x3, Operand(xzr, UXTX)); 8210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ subs(xzr, x3, 1234); 8211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ subs(xzr, x0, x3); 8212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ subs(xzr, x3, xzr); 8213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ subs(xzr, xzr, x3); 8214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Swap the saved system stack pointer with the real one. If csp was written 8216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // during the test, it will show up in x30. This is done because the test 8217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // framework assumes that csp will be valid at the end of the test. 8218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x29, x30); 8219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x30, csp); 8220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(csp, x29); 8221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // We used x29 as a scratch register, so reset it to make sure it doesn't 8222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // trigger a test failure. 8223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(x29, x28, x1); 8224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 8225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 8227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_REGISTERS(before); 8229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 8231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 8232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(register_bit) { 8235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // No code generation takes place in this test, so no need to setup and 8236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // teardown. 8237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Simple tests. 8239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(x0.Bit() == (1UL << 0)); 8240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(x1.Bit() == (1UL << 1)); 8241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(x10.Bit() == (1UL << 10)); 8242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // AAPCS64 definitions. 8244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(fp.Bit() == (1UL << kFramePointerRegCode)); 8245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(lr.Bit() == (1UL << kLinkRegCode)); 8246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Fixed (hardware) definitions. 8248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(xzr.Bit() == (1UL << kZeroRegCode)); 8249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Internal ABI definitions. 8251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(jssp.Bit() == (1UL << kJSSPCode)); 8252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(csp.Bit() == (1UL << kSPRegInternalCode)); 8253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(csp.Bit() != xzr.Bit()); 8254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // xn.Bit() == wn.Bit() at all times, for the same n. 8256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(x0.Bit() == w0.Bit()); 8257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(x1.Bit() == w1.Bit()); 8258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(x10.Bit() == w10.Bit()); 8259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(jssp.Bit() == wjssp.Bit()); 8260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(xzr.Bit() == wzr.Bit()); 8261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(csp.Bit() == wcsp.Bit()); 8262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 8263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(stack_pointer_override) { 8266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // This test generates some stack maintenance code, but the test only checks 8267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // the reported state. 8268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 8269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 8270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 8271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The default stack pointer in V8 is jssp, but for compatibility with W16, 8273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // the test framework sets it to csp before calling the test. 8274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(csp.Is(__ StackPointer())); 8275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ SetStackPointer(x0); 8276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(x0.Is(__ StackPointer())); 8277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ SetStackPointer(jssp); 8278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(jssp.Is(__ StackPointer())); 8279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ SetStackPointer(csp); 8280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(csp.Is(__ StackPointer())); 8281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 8283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 8284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 8285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 8286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(peek_poke_simple) { 8289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 8290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 8291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 8292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const RegList x0_to_x3 = x0.Bit() | x1.Bit() | x2.Bit() | x3.Bit(); 8294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const RegList x10_to_x13 = x10.Bit() | x11.Bit() | 8295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch x12.Bit() | x13.Bit(); 8296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The literal base is chosen to have two useful properties: 8298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // * When multiplied by small values (such as a register index), this value 8299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // is clearly readable in the result. 8300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // * The value is not formed from repeating fixed-size smaller values, so it 8301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // can be used to detect endianness-related errors. 8302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint64_t literal_base = 0x0100001000100101UL; 8303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Initialize the registers. 8305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, literal_base); 8306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(x1, x0, x0); 8307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(x2, x1, x0); 8308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(x3, x2, x0); 8309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Claim(4); 8311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Simple exchange. 8313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // After this test: 8314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // x0-x3 should be unchanged. 8315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // w10-w13 should contain the lower words of x0-x3. 8316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Poke(x0, 0); 8317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Poke(x1, 8); 8318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Poke(x2, 16); 8319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Poke(x3, 24); 8320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Clobber(&masm, x0_to_x3); 8321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Peek(x0, 0); 8322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Peek(x1, 8); 8323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Peek(x2, 16); 8324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Peek(x3, 24); 8325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Poke(w0, 0); 8327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Poke(w1, 4); 8328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Poke(w2, 8); 8329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Poke(w3, 12); 8330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Clobber(&masm, x10_to_x13); 8331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Peek(w10, 0); 8332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Peek(w11, 4); 8333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Peek(w12, 8); 8334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Peek(w13, 12); 8335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Drop(4); 8337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 8339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 8340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(literal_base * 1, x0); 8342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(literal_base * 2, x1); 8343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(literal_base * 3, x2); 8344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(literal_base * 4, x3); 8345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64((literal_base * 1) & 0xffffffff, x10); 8347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64((literal_base * 2) & 0xffffffff, x11); 8348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64((literal_base * 3) & 0xffffffff, x12); 8349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64((literal_base * 4) & 0xffffffff, x13); 8350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 8352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 8353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(peek_poke_unaligned) { 8356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 8357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 8358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 8359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The literal base is chosen to have two useful properties: 8361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // * When multiplied by small values (such as a register index), this value 8362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // is clearly readable in the result. 8363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // * The value is not formed from repeating fixed-size smaller values, so it 8364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // can be used to detect endianness-related errors. 8365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint64_t literal_base = 0x0100001000100101UL; 8366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Initialize the registers. 8368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, literal_base); 8369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(x1, x0, x0); 8370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(x2, x1, x0); 8371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(x3, x2, x0); 8372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(x4, x3, x0); 8373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(x5, x4, x0); 8374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(x6, x5, x0); 8375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Claim(4); 8377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Unaligned exchanges. 8379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // After this test: 8380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // x0-x6 should be unchanged. 8381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // w10-w12 should contain the lower words of x0-x2. 8382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Poke(x0, 1); 8383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Clobber(&masm, x0.Bit()); 8384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Peek(x0, 1); 8385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Poke(x1, 2); 8386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Clobber(&masm, x1.Bit()); 8387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Peek(x1, 2); 8388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Poke(x2, 3); 8389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Clobber(&masm, x2.Bit()); 8390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Peek(x2, 3); 8391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Poke(x3, 4); 8392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Clobber(&masm, x3.Bit()); 8393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Peek(x3, 4); 8394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Poke(x4, 5); 8395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Clobber(&masm, x4.Bit()); 8396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Peek(x4, 5); 8397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Poke(x5, 6); 8398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Clobber(&masm, x5.Bit()); 8399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Peek(x5, 6); 8400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Poke(x6, 7); 8401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Clobber(&masm, x6.Bit()); 8402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Peek(x6, 7); 8403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Poke(w0, 1); 8405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Clobber(&masm, w10.Bit()); 8406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Peek(w10, 1); 8407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Poke(w1, 2); 8408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Clobber(&masm, w11.Bit()); 8409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Peek(w11, 2); 8410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Poke(w2, 3); 8411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Clobber(&masm, w12.Bit()); 8412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Peek(w12, 3); 8413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Drop(4); 8415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 8417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 8418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(literal_base * 1, x0); 8420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(literal_base * 2, x1); 8421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(literal_base * 3, x2); 8422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(literal_base * 4, x3); 8423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(literal_base * 5, x4); 8424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(literal_base * 6, x5); 8425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(literal_base * 7, x6); 8426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64((literal_base * 1) & 0xffffffff, x10); 8428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64((literal_base * 2) & 0xffffffff, x11); 8429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64((literal_base * 3) & 0xffffffff, x12); 8430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 8432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 8433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(peek_poke_endianness) { 8436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 8437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 8438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 8439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The literal base is chosen to have two useful properties: 8441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // * When multiplied by small values (such as a register index), this value 8442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // is clearly readable in the result. 8443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // * The value is not formed from repeating fixed-size smaller values, so it 8444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // can be used to detect endianness-related errors. 8445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint64_t literal_base = 0x0100001000100101UL; 8446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Initialize the registers. 8448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, literal_base); 8449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(x1, x0, x0); 8450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Claim(4); 8452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Endianness tests. 8454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // After this section: 8455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // x4 should match x0[31:0]:x0[63:32] 8456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // w5 should match w1[15:0]:w1[31:16] 8457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Poke(x0, 0); 8458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Poke(x0, 8); 8459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Peek(x4, 4); 8460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Poke(w1, 0); 8462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Poke(w1, 4); 8463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Peek(w5, 2); 8464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Drop(4); 8466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 8468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 8469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint64_t x0_expected = literal_base * 1; 8471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint64_t x1_expected = literal_base * 2; 8472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint64_t x4_expected = (x0_expected << 32) | (x0_expected >> 32); 8473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint64_t x5_expected = ((x1_expected << 16) & 0xffff0000) | 8474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ((x1_expected >> 16) & 0x0000ffff); 8475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(x0_expected, x0); 8477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(x1_expected, x1); 8478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(x4_expected, x4); 8479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(x5_expected, x5); 8480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 8482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 8483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(peek_poke_mixed) { 8486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 8487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 8488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 8489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The literal base is chosen to have two useful properties: 8491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // * When multiplied by small values (such as a register index), this value 8492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // is clearly readable in the result. 8493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // * The value is not formed from repeating fixed-size smaller values, so it 8494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // can be used to detect endianness-related errors. 8495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint64_t literal_base = 0x0100001000100101UL; 8496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Initialize the registers. 8498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, literal_base); 8499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(x1, x0, x0); 8500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(x2, x1, x0); 8501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(x3, x2, x0); 8502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Claim(4); 8504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Mix with other stack operations. 8506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // After this section: 8507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // x0-x3 should be unchanged. 8508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // x6 should match x1[31:0]:x0[63:32] 8509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // w7 should match x1[15:0]:x0[63:48] 8510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Poke(x1, 8); 8511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Poke(x0, 0); 8512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 8513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(__ StackPointer().Is(csp)); 8514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x4, __ StackPointer()); 8515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ SetStackPointer(x4); 8516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Poke(wzr, 0); // Clobber the space we're about to drop. 8518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Drop(1, kWRegSize); 8519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Peek(x6, 0); 8520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Claim(1); 8521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Peek(w7, 10); 8522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Poke(x3, 28); 8523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Poke(xzr, 0); // Clobber the space we're about to drop. 8524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Drop(1); 8525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Poke(x2, 12); 8526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Push(w0); 8527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(csp, __ StackPointer()); 8529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ SetStackPointer(csp); 8530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 8531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Pop(x0, x1, x2, x3); 8533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 8535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 8536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint64_t x0_expected = literal_base * 1; 8538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint64_t x1_expected = literal_base * 2; 8539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint64_t x2_expected = literal_base * 3; 8540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint64_t x3_expected = literal_base * 4; 8541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint64_t x6_expected = (x1_expected << 32) | (x0_expected >> 32); 8542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint64_t x7_expected = ((x1_expected << 16) & 0xffff0000) | 8543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ((x0_expected >> 48) & 0x0000ffff); 8544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(x0_expected, x0); 8546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(x1_expected, x1); 8547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(x2_expected, x2); 8548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(x3_expected, x3); 8549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(x6_expected, x6); 8550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(x7_expected, x7); 8551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 8553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 8554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// This enum is used only as an argument to the push-pop test helpers. 8557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum PushPopMethod { 8558b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Push or Pop using the Push and Pop methods, with blocks of up to four 8559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // registers. (Smaller blocks will be used if necessary.) 8560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopByFour, 8561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Use Push<Size>RegList and Pop<Size>RegList to transfer the registers. 8563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopRegList 8564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 8565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// The maximum number of registers that can be used by the PushPopJssp* tests, 8568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// where a reg_count field is provided. 8569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic int const kPushPopJsspMaxRegCount = -1; 8570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Test a simple push-pop pattern: 8572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// * Claim <claim> bytes to set the stack alignment. 8573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// * Push <reg_count> registers with size <reg_size>. 8574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// * Clobber the register contents. 8575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// * Pop <reg_count> registers to restore the original contents. 8576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// * Drop <claim> bytes to restore the original stack pointer. 8577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// 8578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Different push and pop methods can be specified independently to test for 8579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// proper word-endian behaviour. 8580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic void PushPopJsspSimpleHelper(int reg_count, 8581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int claim, 8582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int reg_size, 8583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopMethod push_method, 8584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopMethod pop_method) { 8585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 8586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 8588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Registers in the TmpList can be used by the macro assembler for debug code 8590b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // (for example in 'Pop'), so we can't use them here. We can't use jssp 8591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // because it will be the stack pointer for this test. 8592b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static RegList const allowed = ~(masm.TmpList()->list() | jssp.Bit()); 8593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (reg_count == kPushPopJsspMaxRegCount) { 8594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch reg_count = CountSetBits(allowed, kNumberOfRegisters); 8595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 8596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Work out which registers to use, based on reg_size. 8597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Register r[kNumberOfRegisters]; 8598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Register x[kNumberOfRegisters]; 8599b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RegList list = PopulateRegisterArray(NULL, x, r, reg_size, reg_count, 8600b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch allowed); 8601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The literal base is chosen to have two useful properties: 8603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // * When multiplied by small values (such as a register index), this value 8604b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // is clearly readable in the result. 8605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // * The value is not formed from repeating fixed-size smaller values, so it 8606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // can be used to detect endianness-related errors. 8607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint64_t literal_base = 0x0100001000100101UL; 8608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 8610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(__ StackPointer().Is(csp)); 8611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(jssp, __ StackPointer()); 8612b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ SetStackPointer(jssp); 8613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int i; 8615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Initialize the registers. 8617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (i = 0; i < reg_count; i++) { 8618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Always write into the X register, to ensure that the upper word is 8619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // properly ignored by Push when testing W registers. 8620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!x[i].IsZero()) { 8621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x[i], literal_base * i); 8622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 8623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 8624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Claim memory first, as requested. 8626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Claim(claim, kByteSizeInBytes); 8627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch switch (push_method) { 8629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case PushPopByFour: 8630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Push high-numbered registers first (to the highest addresses). 8631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (i = reg_count; i >= 4; i -= 4) { 8632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Push(r[i-1], r[i-2], r[i-3], r[i-4]); 8633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 8634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Finish off the leftovers. 8635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch switch (i) { 8636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 3: __ Push(r[2], r[1], r[0]); break; 8637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 2: __ Push(r[1], r[0]); break; 8638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 1: __ Push(r[0]); break; 8639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch default: DCHECK(i == 0); break; 8640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 8641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 8642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case PushPopRegList: 8643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ PushSizeRegList(list, reg_size); 8644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 8645b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 8646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Clobber all the registers, to ensure that they get repopulated by Pop. 8648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Clobber(&masm, list); 8649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch switch (pop_method) { 8651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case PushPopByFour: 8652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Pop low-numbered registers first (from the lowest addresses). 8653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (i = 0; i <= (reg_count-4); i += 4) { 8654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Pop(r[i], r[i+1], r[i+2], r[i+3]); 8655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 8656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Finish off the leftovers. 8657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch switch (reg_count - i) { 8658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 3: __ Pop(r[i], r[i+1], r[i+2]); break; 8659b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 2: __ Pop(r[i], r[i+1]); break; 8660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 1: __ Pop(r[i]); break; 8661b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch default: DCHECK(i == reg_count); break; 8662b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 8663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 8664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case PushPopRegList: 8665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ PopSizeRegList(list, reg_size); 8666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 8667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 8668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Drop memory to restore jssp. 8670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Drop(claim, kByteSizeInBytes); 8671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(csp, __ StackPointer()); 8673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ SetStackPointer(csp); 8674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 8675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 8677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 8679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Check that the register contents were preserved. 8681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Always use CHECK_EQUAL_64, even when testing W registers, so we can test 8682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // that the upper word was properly cleared by Pop. 8683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch literal_base &= (0xffffffffffffffffUL >> (64-reg_size)); 8684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < reg_count; i++) { 8685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (x[i].IsZero()) { 8686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x[i]); 8687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 8688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(literal_base * i, x[i]); 8689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 8690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 8691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 8693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 8694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(push_pop_jssp_simple_32) { 8697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 8698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int claim = 0; claim <= 8; claim++) { 8699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int count = 0; count <= 8; count++) { 8700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopJsspSimpleHelper(count, claim, kWRegSizeInBits, 8701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopByFour, PushPopByFour); 8702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopJsspSimpleHelper(count, claim, kWRegSizeInBits, 8703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopByFour, PushPopRegList); 8704b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopJsspSimpleHelper(count, claim, kWRegSizeInBits, 8705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopRegList, PushPopByFour); 8706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopJsspSimpleHelper(count, claim, kWRegSizeInBits, 8707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopRegList, PushPopRegList); 8708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 8709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Test with the maximum number of registers. 8710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopJsspSimpleHelper(kPushPopJsspMaxRegCount, claim, kWRegSizeInBits, 8711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopByFour, PushPopByFour); 8712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopJsspSimpleHelper(kPushPopJsspMaxRegCount, claim, kWRegSizeInBits, 8713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopByFour, PushPopRegList); 8714b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopJsspSimpleHelper(kPushPopJsspMaxRegCount, claim, kWRegSizeInBits, 8715b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopRegList, PushPopByFour); 8716b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopJsspSimpleHelper(kPushPopJsspMaxRegCount, claim, kWRegSizeInBits, 8717b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopRegList, PushPopRegList); 8718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 8719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 8720b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8722b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(push_pop_jssp_simple_64) { 8723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 8724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int claim = 0; claim <= 8; claim++) { 8725b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int count = 0; count <= 8; count++) { 8726b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopJsspSimpleHelper(count, claim, kXRegSizeInBits, 8727b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopByFour, PushPopByFour); 8728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopJsspSimpleHelper(count, claim, kXRegSizeInBits, 8729b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopByFour, PushPopRegList); 8730b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopJsspSimpleHelper(count, claim, kXRegSizeInBits, 8731b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopRegList, PushPopByFour); 8732b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopJsspSimpleHelper(count, claim, kXRegSizeInBits, 8733b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopRegList, PushPopRegList); 8734b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 8735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Test with the maximum number of registers. 8736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopJsspSimpleHelper(kPushPopJsspMaxRegCount, claim, kXRegSizeInBits, 8737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopByFour, PushPopByFour); 8738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopJsspSimpleHelper(kPushPopJsspMaxRegCount, claim, kXRegSizeInBits, 8739b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopByFour, PushPopRegList); 8740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopJsspSimpleHelper(kPushPopJsspMaxRegCount, claim, kXRegSizeInBits, 8741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopRegList, PushPopByFour); 8742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopJsspSimpleHelper(kPushPopJsspMaxRegCount, claim, kXRegSizeInBits, 8743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopRegList, PushPopRegList); 8744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 8745b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 8746b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8747b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8748b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// The maximum number of registers that can be used by the PushPopFPJssp* tests, 8749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// where a reg_count field is provided. 8750b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic int const kPushPopFPJsspMaxRegCount = -1; 8751b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8752b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Test a simple push-pop pattern: 8753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// * Claim <claim> bytes to set the stack alignment. 8754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// * Push <reg_count> FP registers with size <reg_size>. 8755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// * Clobber the register contents. 8756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// * Pop <reg_count> FP registers to restore the original contents. 8757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// * Drop <claim> bytes to restore the original stack pointer. 8758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// 8759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Different push and pop methods can be specified independently to test for 8760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// proper word-endian behaviour. 8761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic void PushPopFPJsspSimpleHelper(int reg_count, 8762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int claim, 8763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int reg_size, 8764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopMethod push_method, 8765b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopMethod pop_method) { 8766b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 8767b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8768b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 8769b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8770b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // We can use any floating-point register. None of them are reserved for 8771b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // debug code, for example. 8772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static RegList const allowed = ~0; 8773b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (reg_count == kPushPopFPJsspMaxRegCount) { 8774b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch reg_count = CountSetBits(allowed, kNumberOfFPRegisters); 8775b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 8776b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Work out which registers to use, based on reg_size. 8777b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FPRegister v[kNumberOfRegisters]; 8778b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FPRegister d[kNumberOfRegisters]; 8779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RegList list = PopulateFPRegisterArray(NULL, d, v, reg_size, reg_count, 8780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch allowed); 8781b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8782b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The literal base is chosen to have two useful properties: 8783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // * When multiplied (using an integer) by small values (such as a register 8784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // index), this value is clearly readable in the result. 8785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // * The value is not formed from repeating fixed-size smaller values, so it 8786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // can be used to detect endianness-related errors. 8787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // * It is never a floating-point NaN, and will therefore always compare 8788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // equal to itself. 8789b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint64_t literal_base = 0x0100001000100101UL; 8790b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 8792b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(__ StackPointer().Is(csp)); 8793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(jssp, __ StackPointer()); 8794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ SetStackPointer(jssp); 8795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8796b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int i; 8797b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Initialize the registers, using X registers to load the literal. 8799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0); 8800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, literal_base); 8801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (i = 0; i < reg_count; i++) { 8802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Always write into the D register, to ensure that the upper word is 8803b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // properly ignored by Push when testing S registers. 8804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d[i], x0); 8805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Calculate the next literal. 8806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Add(x0, x0, x1); 8807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 8808b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Claim memory first, as requested. 8810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Claim(claim, kByteSizeInBytes); 8811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch switch (push_method) { 8813b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case PushPopByFour: 8814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Push high-numbered registers first (to the highest addresses). 8815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (i = reg_count; i >= 4; i -= 4) { 8816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Push(v[i-1], v[i-2], v[i-3], v[i-4]); 8817b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 8818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Finish off the leftovers. 8819b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch switch (i) { 8820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 3: __ Push(v[2], v[1], v[0]); break; 8821b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 2: __ Push(v[1], v[0]); break; 8822b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 1: __ Push(v[0]); break; 8823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch default: DCHECK(i == 0); break; 8824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 8825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 8826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case PushPopRegList: 8827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ PushSizeRegList(list, reg_size, CPURegister::kFPRegister); 8828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 8829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 8830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Clobber all the registers, to ensure that they get repopulated by Pop. 8832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ClobberFP(&masm, list); 8833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8834b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch switch (pop_method) { 8835b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case PushPopByFour: 8836b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Pop low-numbered registers first (from the lowest addresses). 8837b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (i = 0; i <= (reg_count-4); i += 4) { 8838b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Pop(v[i], v[i+1], v[i+2], v[i+3]); 8839b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 8840b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Finish off the leftovers. 8841b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch switch (reg_count - i) { 8842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 3: __ Pop(v[i], v[i+1], v[i+2]); break; 8843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 2: __ Pop(v[i], v[i+1]); break; 8844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 1: __ Pop(v[i]); break; 8845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch default: DCHECK(i == reg_count); break; 8846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 8847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 8848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case PushPopRegList: 8849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ PopSizeRegList(list, reg_size, CPURegister::kFPRegister); 8850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 8851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 8852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Drop memory to restore jssp. 8854b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Drop(claim, kByteSizeInBytes); 8855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(csp, __ StackPointer()); 8857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ SetStackPointer(csp); 8858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 8859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8860b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 8861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 8863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Check that the register contents were preserved. 8865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Always use CHECK_EQUAL_FP64, even when testing S registers, so we can 8866b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // test that the upper word was properly cleared by Pop. 8867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch literal_base &= (0xffffffffffffffffUL >> (64-reg_size)); 8868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < reg_count; i++) { 8869b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint64_t literal = literal_base * i; 8870b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double expected; 8871b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch memcpy(&expected, &literal, sizeof(expected)); 8872b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(expected, d[i]); 8873b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 8874b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8875b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 8876b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 8877b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8878b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8879b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(push_pop_fp_jssp_simple_32) { 8880b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 8881b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int claim = 0; claim <= 8; claim++) { 8882b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int count = 0; count <= 8; count++) { 8883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopFPJsspSimpleHelper(count, claim, kSRegSizeInBits, 8884b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopByFour, PushPopByFour); 8885b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopFPJsspSimpleHelper(count, claim, kSRegSizeInBits, 8886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopByFour, PushPopRegList); 8887b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopFPJsspSimpleHelper(count, claim, kSRegSizeInBits, 8888b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopRegList, PushPopByFour); 8889b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopFPJsspSimpleHelper(count, claim, kSRegSizeInBits, 8890b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopRegList, PushPopRegList); 8891b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 8892b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Test with the maximum number of registers. 8893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopFPJsspSimpleHelper(kPushPopFPJsspMaxRegCount, claim, kSRegSizeInBits, 8894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopByFour, PushPopByFour); 8895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopFPJsspSimpleHelper(kPushPopFPJsspMaxRegCount, claim, kSRegSizeInBits, 8896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopByFour, PushPopRegList); 8897b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopFPJsspSimpleHelper(kPushPopFPJsspMaxRegCount, claim, kSRegSizeInBits, 8898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopRegList, PushPopByFour); 8899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopFPJsspSimpleHelper(kPushPopFPJsspMaxRegCount, claim, kSRegSizeInBits, 8900b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopRegList, PushPopRegList); 8901b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 8902b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 8903b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8904b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8905b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(push_pop_fp_jssp_simple_64) { 8906b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 8907b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int claim = 0; claim <= 8; claim++) { 8908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int count = 0; count <= 8; count++) { 8909b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopFPJsspSimpleHelper(count, claim, kDRegSizeInBits, 8910b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopByFour, PushPopByFour); 8911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopFPJsspSimpleHelper(count, claim, kDRegSizeInBits, 8912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopByFour, PushPopRegList); 8913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopFPJsspSimpleHelper(count, claim, kDRegSizeInBits, 8914b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopRegList, PushPopByFour); 8915b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopFPJsspSimpleHelper(count, claim, kDRegSizeInBits, 8916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopRegList, PushPopRegList); 8917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 8918b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Test with the maximum number of registers. 8919b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopFPJsspSimpleHelper(kPushPopFPJsspMaxRegCount, claim, kDRegSizeInBits, 8920b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopByFour, PushPopByFour); 8921b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopFPJsspSimpleHelper(kPushPopFPJsspMaxRegCount, claim, kDRegSizeInBits, 8922b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopByFour, PushPopRegList); 8923b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopFPJsspSimpleHelper(kPushPopFPJsspMaxRegCount, claim, kDRegSizeInBits, 8924b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopRegList, PushPopByFour); 8925b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopFPJsspSimpleHelper(kPushPopFPJsspMaxRegCount, claim, kDRegSizeInBits, 8926b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopRegList, PushPopRegList); 8927b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 8928b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 8929b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8930b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8931b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Push and pop data using an overlapping combination of Push/Pop and 8932b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// RegList-based methods. 8933b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic void PushPopJsspMixedMethodsHelper(int claim, int reg_size) { 8934b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 8935b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8936b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Registers x8 and x9 are used by the macro assembler for debug code (for 8937b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // example in 'Pop'), so we can't use them here. We can't use jssp because it 8938b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // will be the stack pointer for this test. 8939b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static RegList const allowed = 8940b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ~(x8.Bit() | x9.Bit() | jssp.Bit() | xzr.Bit()); 8941b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Work out which registers to use, based on reg_size. 8942b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Register r[10]; 8943b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Register x[10]; 8944b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PopulateRegisterArray(NULL, x, r, reg_size, 10, allowed); 8945b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8946b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Calculate some handy register lists. 8947b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RegList r0_to_r3 = 0; 8948b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i <= 3; i++) { 8949b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch r0_to_r3 |= x[i].Bit(); 8950b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 8951b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RegList r4_to_r5 = 0; 8952b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 4; i <= 5; i++) { 8953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch r4_to_r5 |= x[i].Bit(); 8954b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 8955b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RegList r6_to_r9 = 0; 8956b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 6; i <= 9; i++) { 8957b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch r6_to_r9 |= x[i].Bit(); 8958b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 8959b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8960b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The literal base is chosen to have two useful properties: 8961b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // * When multiplied by small values (such as a register index), this value 8962b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // is clearly readable in the result. 8963b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // * The value is not formed from repeating fixed-size smaller values, so it 8964b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // can be used to detect endianness-related errors. 8965b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint64_t literal_base = 0x0100001000100101UL; 8966b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8967b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 8968b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 8969b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(__ StackPointer().Is(csp)); 8970b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(jssp, __ StackPointer()); 8971b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ SetStackPointer(jssp); 8972b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8973b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Claim memory first, as requested. 8974b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Claim(claim, kByteSizeInBytes); 8975b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8976b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x[3], literal_base * 3); 8977b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x[2], literal_base * 2); 8978b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x[1], literal_base * 1); 8979b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x[0], literal_base * 0); 8980b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8981b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ PushSizeRegList(r0_to_r3, reg_size); 8982b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Push(r[3], r[2]); 8983b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8984b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Clobber(&masm, r0_to_r3); 8985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ PopSizeRegList(r0_to_r3, reg_size); 8986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8987b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Push(r[2], r[1], r[3], r[0]); 8988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Clobber(&masm, r4_to_r5); 8990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Pop(r[4], r[5]); 8991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Clobber(&masm, r6_to_r9); 8992b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Pop(r[6], r[7], r[8], r[9]); 8993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8994b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Drop memory to restore jssp. 8995b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Drop(claim, kByteSizeInBytes); 8996b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8997b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(csp, __ StackPointer()); 8998b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ SetStackPointer(csp); 8999b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 9000b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9001b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 9002b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9003b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 9004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9005b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Always use CHECK_EQUAL_64, even when testing W registers, so we can test 9006b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // that the upper word was properly cleared by Pop. 9007b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch literal_base &= (0xffffffffffffffffUL >> (64-reg_size)); 9008b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9009b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(literal_base * 3, x[9]); 9010b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(literal_base * 2, x[8]); 9011b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(literal_base * 0, x[7]); 9012b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(literal_base * 3, x[6]); 9013b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(literal_base * 1, x[5]); 9014b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(literal_base * 2, x[4]); 9015b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9016b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 9017b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 9018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9019b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9020b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(push_pop_jssp_mixed_methods_64) { 9021b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 9022b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int claim = 0; claim <= 8; claim++) { 9023b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopJsspMixedMethodsHelper(claim, kXRegSizeInBits); 9024b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 9025b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 9026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9028b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(push_pop_jssp_mixed_methods_32) { 9029b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 9030b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int claim = 0; claim <= 8; claim++) { 9031b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopJsspMixedMethodsHelper(claim, kWRegSizeInBits); 9032b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 9033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 9034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9035b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Push and pop data using overlapping X- and W-sized quantities. 9037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic void PushPopJsspWXOverlapHelper(int reg_count, int claim) { 9038b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // This test emits rather a lot of code. 9039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP_SIZE(BUF_SIZE * 2); 9040b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Work out which registers to use, based on reg_size. 9042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Register tmp = x8; 9043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static RegList const allowed = ~(tmp.Bit() | jssp.Bit()); 9044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (reg_count == kPushPopJsspMaxRegCount) { 9045b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch reg_count = CountSetBits(allowed, kNumberOfRegisters); 9046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 9047b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Register w[kNumberOfRegisters]; 9048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Register x[kNumberOfRegisters]; 9049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RegList list = PopulateRegisterArray(w, x, NULL, 0, reg_count, allowed); 9050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The number of W-sized slots we expect to pop. When we pop, we alternate 9052b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // between W and X registers, so we need reg_count*1.5 W-sized slots. 9053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int const requested_w_slots = reg_count + reg_count / 2; 9054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9055b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Track what _should_ be on the stack, using W-sized slots. 9056b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static int const kMaxWSlots = kNumberOfRegisters + kNumberOfRegisters / 2; 9057b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t stack[kMaxWSlots]; 9058b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < kMaxWSlots; i++) { 9059b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stack[i] = 0xdeadbeef; 9060b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 9061b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9062b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The literal base is chosen to have two useful properties: 9063b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // * When multiplied by small values (such as a register index), this value 9064b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // is clearly readable in the result. 9065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // * The value is not formed from repeating fixed-size smaller values, so it 9066b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // can be used to detect endianness-related errors. 9067b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static uint64_t const literal_base = 0x0100001000100101UL; 9068b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static uint64_t const literal_base_hi = literal_base >> 32; 9069b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static uint64_t const literal_base_lo = literal_base & 0xffffffff; 9070b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static uint64_t const literal_base_w = literal_base & 0xffffffff; 9071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9072b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 9073b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 9074b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(__ StackPointer().Is(csp)); 9075b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(jssp, __ StackPointer()); 9076b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ SetStackPointer(jssp); 9077b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9078b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Initialize the registers. 9079b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < reg_count; i++) { 9080b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Always write into the X register, to ensure that the upper word is 9081b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // properly ignored by Push when testing W registers. 9082b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!x[i].IsZero()) { 9083b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x[i], literal_base * i); 9084b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 9085b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 9086b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9087b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Claim memory first, as requested. 9088b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Claim(claim, kByteSizeInBytes); 9089b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9090b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The push-pop pattern is as follows: 9091b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Push: Pop: 9092b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // x[0](hi) -> w[0] 9093b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // x[0](lo) -> x[1](hi) 9094b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // w[1] -> x[1](lo) 9095b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // w[1] -> w[2] 9096b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // x[2](hi) -> x[2](hi) 9097b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // x[2](lo) -> x[2](lo) 9098b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // x[2](hi) -> w[3] 9099b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // x[2](lo) -> x[4](hi) 9100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // x[2](hi) -> x[4](lo) 9101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // x[2](lo) -> w[5] 9102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // w[3] -> x[5](hi) 9103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // w[3] -> x[6](lo) 9104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // w[3] -> w[7] 9105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // w[3] -> x[8](hi) 9106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // x[4](hi) -> x[8](lo) 9107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // x[4](lo) -> w[9] 9108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // ... pattern continues ... 9109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // 9110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // That is, registers are pushed starting with the lower numbers, 9111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // alternating between x and w registers, and pushing i%4+1 copies of each, 9112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // where i is the register number. 9113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Registers are popped starting with the higher numbers one-by-one, 9114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // alternating between x and w registers, but only popping one at a time. 9115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // 9116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // This pattern provides a wide variety of alignment effects and overlaps. 9117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // ---- Push ---- 9119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int active_w_slots = 0; 9121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; active_w_slots < requested_w_slots; i++) { 9122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(i < reg_count); 9123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // In order to test various arguments to PushMultipleTimes, and to try to 9124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // exercise different alignment and overlap effects, we push each 9125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // register a different number of times. 9126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int times = i % 4 + 1; 9127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (i & 1) { 9128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Push odd-numbered registers as W registers. 9129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (i & 2) { 9130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ PushMultipleTimes(w[i], times); 9131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 9132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Use a register to specify the count. 9133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(tmp.W(), times); 9134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ PushMultipleTimes(w[i], tmp.W()); 9135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 9136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Fill in the expected stack slots. 9137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int j = 0; j < times; j++) { 9138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (w[i].Is(wzr)) { 9139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The zero register always writes zeroes. 9140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stack[active_w_slots++] = 0; 9141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 9142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stack[active_w_slots++] = literal_base_w * i; 9143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 9144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 9145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 9146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Push even-numbered registers as X registers. 9147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (i & 2) { 9148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ PushMultipleTimes(x[i], times); 9149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 9150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Use a register to specify the count. 9151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(tmp, times); 9152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ PushMultipleTimes(x[i], tmp); 9153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 9154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Fill in the expected stack slots. 9155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int j = 0; j < times; j++) { 9156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (x[i].IsZero()) { 9157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The zero register always writes zeroes. 9158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stack[active_w_slots++] = 0; 9159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stack[active_w_slots++] = 0; 9160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 9161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stack[active_w_slots++] = literal_base_hi * i; 9162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stack[active_w_slots++] = literal_base_lo * i; 9163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 9164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 9165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 9166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 9167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Because we were pushing several registers at a time, we probably pushed 9168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // more than we needed to. 9169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (active_w_slots > requested_w_slots) { 9170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Drop(active_w_slots - requested_w_slots, kWRegSize); 9171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Bump the number of active W-sized slots back to where it should be, 9172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // and fill the empty space with a dummy value. 9173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch do { 9174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stack[active_w_slots--] = 0xdeadbeef; 9175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } while (active_w_slots > requested_w_slots); 9176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 9177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // ---- Pop ---- 9179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Clobber(&masm, list); 9181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // If popping an even number of registers, the first one will be X-sized. 9183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Otherwise, the first one will be W-sized. 9184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool next_is_64 = !(reg_count & 1); 9185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = reg_count-1; i >= 0; i--) { 9186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (next_is_64) { 9187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Pop(x[i]); 9188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch active_w_slots -= 2; 9189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 9190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Pop(w[i]); 9191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch active_w_slots -= 1; 9192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 9193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch next_is_64 = !next_is_64; 9194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 9195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(active_w_slots == 0); 9196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Drop memory to restore jssp. 9198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Drop(claim, kByteSizeInBytes); 9199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(csp, __ StackPointer()); 9201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ SetStackPointer(csp); 9202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 9203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 9205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 9207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int slot = 0; 9209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < reg_count; i++) { 9210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Even-numbered registers were written as W registers. 9211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Odd-numbered registers were written as X registers. 9212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool expect_64 = (i & 1); 9213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint64_t expected; 9214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (expect_64) { 9216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint64_t hi = stack[slot++]; 9217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint64_t lo = stack[slot++]; 9218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch expected = (hi << 32) | lo; 9219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 9220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch expected = stack[slot++]; 9221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 9222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Always use CHECK_EQUAL_64, even when testing W registers, so we can 9224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // test that the upper word was properly cleared by Pop. 9225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (x[i].IsZero()) { 9226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x[i]); 9227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 9228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(expected, x[i]); 9229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 9230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 9231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(slot == requested_w_slots); 9232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 9234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 9235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(push_pop_jssp_wx_overlap) { 9238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 9239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int claim = 0; claim <= 8; claim++) { 9240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int count = 1; count <= 8; count++) { 9241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopJsspWXOverlapHelper(count, claim); 9242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopJsspWXOverlapHelper(count, claim); 9243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopJsspWXOverlapHelper(count, claim); 9244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopJsspWXOverlapHelper(count, claim); 9245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 9246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Test with the maximum number of registers. 9247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopJsspWXOverlapHelper(kPushPopJsspMaxRegCount, claim); 9248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopJsspWXOverlapHelper(kPushPopJsspMaxRegCount, claim); 9249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopJsspWXOverlapHelper(kPushPopJsspMaxRegCount, claim); 9250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PushPopJsspWXOverlapHelper(kPushPopJsspMaxRegCount, claim); 9251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 9252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 9253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(push_pop_csp) { 9256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 9257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 9258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 9260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(csp.Is(__ StackPointer())); 9262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x3, 0x3333333333333333UL); 9264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x2, 0x2222222222222222UL); 9265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 0x1111111111111111UL); 9266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0x0000000000000000UL); 9267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Claim(2); 9268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ PushXRegList(x0.Bit() | x1.Bit() | x2.Bit() | x3.Bit()); 9269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Push(x3, x2); 9270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ PopXRegList(x0.Bit() | x1.Bit() | x2.Bit() | x3.Bit()); 9271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Push(x2, x1, x3, x0); 9272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Pop(x4, x5); 9273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Pop(x6, x7, x8, x9); 9274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Claim(2); 9276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ PushWRegList(w0.Bit() | w1.Bit() | w2.Bit() | w3.Bit()); 9277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Push(w3, w1, w2, w0); 9278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ PopWRegList(w10.Bit() | w11.Bit() | w12.Bit() | w13.Bit()); 9279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Pop(w14, w15, w16, w17); 9280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Claim(2); 9282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Push(w2, w2, w1, w1); 9283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Push(x3, x3); 9284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Pop(w18, w19, w20, w21); 9285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Pop(x22, x23); 9286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Claim(2); 9288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ PushXRegList(x1.Bit() | x22.Bit()); 9289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ PopXRegList(x24.Bit() | x26.Bit()); 9290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Claim(2); 9292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ PushWRegList(w1.Bit() | w2.Bit() | w4.Bit() | w22.Bit()); 9293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ PopWRegList(w25.Bit() | w27.Bit() | w28.Bit() | w29.Bit()); 9294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Claim(2); 9296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ PushXRegList(0); 9297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ PopXRegList(0); 9298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ PushXRegList(0xffffffff); 9299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ PopXRegList(0xffffffff); 9300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Drop(12); 9301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 9303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 9305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x1111111111111111UL, x3); 9307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0000000000000000UL, x2); 9308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x3333333333333333UL, x1); 9309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x2222222222222222UL, x0); 9310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x3333333333333333UL, x9); 9311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x2222222222222222UL, x8); 9312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0000000000000000UL, x7); 9313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x3333333333333333UL, x6); 9314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x1111111111111111UL, x5); 9315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x2222222222222222UL, x4); 9316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0x11111111U, w13); 9318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0x33333333U, w12); 9319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0x00000000U, w11); 9320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0x22222222U, w10); 9321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0x11111111U, w17); 9322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0x00000000U, w16); 9323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0x33333333U, w15); 9324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0x22222222U, w14); 9325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0x11111111U, w18); 9327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0x11111111U, w19); 9328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0x11111111U, w20); 9329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0x11111111U, w21); 9330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x3333333333333333UL, x22); 9331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0000000000000000UL, x23); 9332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x3333333333333333UL, x24); 9334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x3333333333333333UL, x26); 9335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0x33333333U, w25); 9337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0x00000000U, w27); 9338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0x22222222U, w28); 9339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0x33333333U, w29); 9340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 9341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 9342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(push_queued) { 9345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 9346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 9347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 9349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(__ StackPointer().Is(csp)); 9351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(jssp, __ StackPointer()); 9352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ SetStackPointer(jssp); 9353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MacroAssembler::PushPopQueue queue(&masm); 9355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Queue up registers. 9357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch queue.Queue(x0); 9358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch queue.Queue(x1); 9359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch queue.Queue(x2); 9360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch queue.Queue(x3); 9361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch queue.Queue(w4); 9363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch queue.Queue(w5); 9364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch queue.Queue(w6); 9365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch queue.Queue(d0); 9367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch queue.Queue(d1); 9368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch queue.Queue(s2); 9370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0x1234000000000000); 9372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 0x1234000100010001); 9373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x2, 0x1234000200020002); 9374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x3, 0x1234000300030003); 9375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w4, 0x12340004); 9376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w5, 0x12340005); 9377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w6, 0x12340006); 9378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d0, 123400.0); 9379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d1, 123401.0); 9380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s2, 123402.0); 9381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Actually push them. 9383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch queue.PushQueued(); 9384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Clobber(&masm, CPURegList(CPURegister::kRegister, kXRegSizeInBits, 0, 6)); 9386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Clobber(&masm, CPURegList(CPURegister::kFPRegister, kDRegSizeInBits, 0, 2)); 9387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Pop them conventionally. 9389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Pop(s2); 9390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Pop(d1, d0); 9391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Pop(w6, w5, w4); 9392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Pop(x3, x2, x1, x0); 9393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(csp, __ StackPointer()); 9395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ SetStackPointer(csp); 9396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 9398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 9400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x1234000000000000, x0); 9402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x1234000100010001, x1); 9403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x1234000200020002, x2); 9404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x1234000300030003, x3); 9405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0x12340004, w4); 9407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0x12340005, w5); 9408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0x12340006, w6); 9409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(123400.0, d0); 9411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(123401.0, d1); 9412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(123402.0, s2); 9414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 9416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 9417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(pop_queued) { 9420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 9421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 9422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 9424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(__ StackPointer().Is(csp)); 9426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(jssp, __ StackPointer()); 9427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ SetStackPointer(jssp); 9428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MacroAssembler::PushPopQueue queue(&masm); 9430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0x1234000000000000); 9432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 0x1234000100010001); 9433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x2, 0x1234000200020002); 9434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x3, 0x1234000300030003); 9435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w4, 0x12340004); 9436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w5, 0x12340005); 9437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w6, 0x12340006); 9438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d0, 123400.0); 9439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d1, 123401.0); 9440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s2, 123402.0); 9441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Push registers conventionally. 9443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Push(x0, x1, x2, x3); 9444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Push(w4, w5, w6); 9445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Push(d0, d1); 9446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Push(s2); 9447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Queue up a pop. 9449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch queue.Queue(s2); 9450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch queue.Queue(d1); 9452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch queue.Queue(d0); 9453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch queue.Queue(w6); 9455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch queue.Queue(w5); 9456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch queue.Queue(w4); 9457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch queue.Queue(x3); 9459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch queue.Queue(x2); 9460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch queue.Queue(x1); 9461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch queue.Queue(x0); 9462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Clobber(&masm, CPURegList(CPURegister::kRegister, kXRegSizeInBits, 0, 6)); 9464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Clobber(&masm, CPURegList(CPURegister::kFPRegister, kDRegSizeInBits, 0, 2)); 9465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Actually pop them. 9467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch queue.PopQueued(); 9468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(csp, __ StackPointer()); 9470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ SetStackPointer(csp); 9471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 9473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 9475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x1234000000000000, x0); 9477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x1234000100010001, x1); 9478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x1234000200020002, x2); 9479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x1234000300030003, x3); 9480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0000000012340004, x4); 9482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0000000012340005, x5); 9483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x0000000012340006, x6); 9484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(123400.0, d0); 9486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(123401.0, d1); 9487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(123402.0, s2); 9489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 9491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 9492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(jump_both_smi) { 9495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 9496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 9497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Label cond_pass_00, cond_pass_01, cond_pass_10, cond_pass_11; 9499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Label cond_fail_00, cond_fail_01, cond_fail_10, cond_fail_11; 9500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Label return1, return2, return3, done; 9501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 9503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0x5555555500000001UL); // A pointer. 9505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 0xaaaaaaaa00000001UL); // A pointer. 9506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x2, 0x1234567800000000UL); // A smi. 9507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x3, 0x8765432100000000UL); // A smi. 9508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x4, 0xdead); 9509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x5, 0xdead); 9510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x6, 0xdead); 9511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x7, 0xdead); 9512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ JumpIfBothSmi(x0, x1, &cond_pass_00, &cond_fail_00); 9514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&return1); 9515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ JumpIfBothSmi(x0, x2, &cond_pass_01, &cond_fail_01); 9516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&return2); 9517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ JumpIfBothSmi(x2, x1, &cond_pass_10, &cond_fail_10); 9518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&return3); 9519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ JumpIfBothSmi(x2, x3, &cond_pass_11, &cond_fail_11); 9520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&cond_fail_00); 9522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x4, 0); 9523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&return1); 9524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&cond_pass_00); 9525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x4, 1); 9526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&return1); 9527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&cond_fail_01); 9529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x5, 0); 9530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&return2); 9531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&cond_pass_01); 9532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x5, 1); 9533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&return2); 9534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&cond_fail_10); 9536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x6, 0); 9537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&return3); 9538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&cond_pass_10); 9539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x6, 1); 9540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&return3); 9541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&cond_fail_11); 9543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x7, 0); 9544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&done); 9545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&cond_pass_11); 9546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x7, 1); 9547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&done); 9549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 9551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 9553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x5555555500000001UL, x0); 9555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xaaaaaaaa00000001UL, x1); 9556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x1234567800000000UL, x2); 9557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x8765432100000000UL, x3); 9558b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x4); 9559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x5); 9560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x6); 9561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x7); 9562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 9564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 9565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(jump_either_smi) { 9568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 9569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 9570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Label cond_pass_00, cond_pass_01, cond_pass_10, cond_pass_11; 9572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Label cond_fail_00, cond_fail_01, cond_fail_10, cond_fail_11; 9573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Label return1, return2, return3, done; 9574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 9576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0x5555555500000001UL); // A pointer. 9578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 0xaaaaaaaa00000001UL); // A pointer. 9579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x2, 0x1234567800000000UL); // A smi. 9580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x3, 0x8765432100000000UL); // A smi. 9581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x4, 0xdead); 9582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x5, 0xdead); 9583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x6, 0xdead); 9584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x7, 0xdead); 9585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ JumpIfEitherSmi(x0, x1, &cond_pass_00, &cond_fail_00); 9587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&return1); 9588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ JumpIfEitherSmi(x0, x2, &cond_pass_01, &cond_fail_01); 9589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&return2); 9590b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ JumpIfEitherSmi(x2, x1, &cond_pass_10, &cond_fail_10); 9591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&return3); 9592b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ JumpIfEitherSmi(x2, x3, &cond_pass_11, &cond_fail_11); 9593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&cond_fail_00); 9595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x4, 0); 9596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&return1); 9597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&cond_pass_00); 9598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x4, 1); 9599b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&return1); 9600b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&cond_fail_01); 9602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x5, 0); 9603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&return2); 9604b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&cond_pass_01); 9605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x5, 1); 9606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&return2); 9607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&cond_fail_10); 9609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x6, 0); 9610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&return3); 9611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&cond_pass_10); 9612b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x6, 1); 9613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&return3); 9614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&cond_fail_11); 9616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x7, 0); 9617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&done); 9618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&cond_pass_11); 9619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x7, 1); 9620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&done); 9622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 9624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 9626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x5555555500000001UL, x0); 9628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xaaaaaaaa00000001UL, x1); 9629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x1234567800000000UL, x2); 9630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0x8765432100000000UL, x3); 9631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x4); 9632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x5); 9633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x6); 9634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x7); 9635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 9637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 9638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(noreg) { 9641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // This test doesn't generate any code, but it verifies some invariants 9642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // related to NoReg. 9643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(NoReg.Is(NoFPReg)); 9644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(NoFPReg.Is(NoReg)); 9645b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(NoReg.Is(NoCPUReg)); 9646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(NoCPUReg.Is(NoReg)); 9647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(NoFPReg.Is(NoCPUReg)); 9648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(NoCPUReg.Is(NoFPReg)); 9649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(NoReg.IsNone()); 9651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(NoFPReg.IsNone()); 9652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(NoCPUReg.IsNone()); 9653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 9654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(isvalid) { 9657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // This test doesn't generate any code, but it verifies some invariants 9658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // related to IsValid(). 9659b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!NoReg.IsValid()); 9660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!NoFPReg.IsValid()); 9661b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!NoCPUReg.IsValid()); 9662b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(x0.IsValid()); 9664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(w0.IsValid()); 9665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(x30.IsValid()); 9666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(w30.IsValid()); 9667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(xzr.IsValid()); 9668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(wzr.IsValid()); 9669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(csp.IsValid()); 9671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(wcsp.IsValid()); 9672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(d0.IsValid()); 9674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(s0.IsValid()); 9675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(d31.IsValid()); 9676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(s31.IsValid()); 9677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(x0.IsValidRegister()); 9679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(w0.IsValidRegister()); 9680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(xzr.IsValidRegister()); 9681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(wzr.IsValidRegister()); 9682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(csp.IsValidRegister()); 9683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(wcsp.IsValidRegister()); 9684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!x0.IsValidFPRegister()); 9685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!w0.IsValidFPRegister()); 9686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!xzr.IsValidFPRegister()); 9687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!wzr.IsValidFPRegister()); 9688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!csp.IsValidFPRegister()); 9689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!wcsp.IsValidFPRegister()); 9690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(d0.IsValidFPRegister()); 9692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(s0.IsValidFPRegister()); 9693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!d0.IsValidRegister()); 9694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!s0.IsValidRegister()); 9695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Test the same as before, but using CPURegister types. This shouldn't make 9697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // any difference. 9698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(static_cast<CPURegister>(x0).IsValid()); 9699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(static_cast<CPURegister>(w0).IsValid()); 9700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(static_cast<CPURegister>(x30).IsValid()); 9701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(static_cast<CPURegister>(w30).IsValid()); 9702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(static_cast<CPURegister>(xzr).IsValid()); 9703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(static_cast<CPURegister>(wzr).IsValid()); 9704b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(static_cast<CPURegister>(csp).IsValid()); 9706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(static_cast<CPURegister>(wcsp).IsValid()); 9707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(static_cast<CPURegister>(d0).IsValid()); 9709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(static_cast<CPURegister>(s0).IsValid()); 9710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(static_cast<CPURegister>(d31).IsValid()); 9711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(static_cast<CPURegister>(s31).IsValid()); 9712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(static_cast<CPURegister>(x0).IsValidRegister()); 9714b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(static_cast<CPURegister>(w0).IsValidRegister()); 9715b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(static_cast<CPURegister>(xzr).IsValidRegister()); 9716b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(static_cast<CPURegister>(wzr).IsValidRegister()); 9717b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(static_cast<CPURegister>(csp).IsValidRegister()); 9718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(static_cast<CPURegister>(wcsp).IsValidRegister()); 9719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!static_cast<CPURegister>(x0).IsValidFPRegister()); 9720b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!static_cast<CPURegister>(w0).IsValidFPRegister()); 9721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!static_cast<CPURegister>(xzr).IsValidFPRegister()); 9722b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!static_cast<CPURegister>(wzr).IsValidFPRegister()); 9723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!static_cast<CPURegister>(csp).IsValidFPRegister()); 9724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!static_cast<CPURegister>(wcsp).IsValidFPRegister()); 9725b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9726b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(static_cast<CPURegister>(d0).IsValidFPRegister()); 9727b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(static_cast<CPURegister>(s0).IsValidFPRegister()); 9728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!static_cast<CPURegister>(d0).IsValidRegister()); 9729b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!static_cast<CPURegister>(s0).IsValidRegister()); 9730b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 9731b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9732b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9733b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(cpureglist_utils_x) { 9734b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // This test doesn't generate any code, but it verifies the behaviour of 9735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // the CPURegList utility methods. 9736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Test a list of X registers. 9738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CPURegList test(x0, x1, x2, x3); 9739b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(test.IncludesAliasOf(x0)); 9741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(test.IncludesAliasOf(x1)); 9742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(test.IncludesAliasOf(x2)); 9743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(test.IncludesAliasOf(x3)); 9744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(test.IncludesAliasOf(w0)); 9745b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(test.IncludesAliasOf(w1)); 9746b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(test.IncludesAliasOf(w2)); 9747b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(test.IncludesAliasOf(w3)); 9748b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(x4)); 9750b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(x30)); 9751b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(xzr)); 9752b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(csp)); 9753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(w4)); 9754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(w30)); 9755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(wzr)); 9756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(wcsp)); 9757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(d0)); 9759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(d1)); 9760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(d2)); 9761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(d3)); 9762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(s0)); 9763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(s1)); 9764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(s2)); 9765b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(s3)); 9766b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9767b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IsEmpty()); 9768b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9769b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(test.type() == x0.type()); 9770b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9771b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(test.PopHighestIndex().Is(x3)); 9772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(test.PopLowestIndex().Is(x0)); 9773b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9774b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(test.IncludesAliasOf(x1)); 9775b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(test.IncludesAliasOf(x2)); 9776b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(test.IncludesAliasOf(w1)); 9777b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(test.IncludesAliasOf(w2)); 9778b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(x0)); 9779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(x3)); 9780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(w0)); 9781b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(w3)); 9782b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(test.PopHighestIndex().Is(x2)); 9784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(test.PopLowestIndex().Is(x1)); 9785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(x1)); 9787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(x2)); 9788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(w1)); 9789b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(w2)); 9790b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(test.IsEmpty()); 9792b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 9793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(cpureglist_utils_w) { 9796b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // This test doesn't generate any code, but it verifies the behaviour of 9797b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // the CPURegList utility methods. 9798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Test a list of W registers. 9800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CPURegList test(w10, w11, w12, w13); 9801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(test.IncludesAliasOf(x10)); 9803b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(test.IncludesAliasOf(x11)); 9804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(test.IncludesAliasOf(x12)); 9805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(test.IncludesAliasOf(x13)); 9806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(test.IncludesAliasOf(w10)); 9807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(test.IncludesAliasOf(w11)); 9808b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(test.IncludesAliasOf(w12)); 9809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(test.IncludesAliasOf(w13)); 9810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(x0)); 9812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(x9)); 9813b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(x14)); 9814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(x30)); 9815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(xzr)); 9816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(csp)); 9817b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(w0)); 9818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(w9)); 9819b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(w14)); 9820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(w30)); 9821b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(wzr)); 9822b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(wcsp)); 9823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(d10)); 9825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(d11)); 9826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(d12)); 9827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(d13)); 9828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(s10)); 9829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(s11)); 9830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(s12)); 9831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(s13)); 9832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IsEmpty()); 9834b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9835b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(test.type() == w10.type()); 9836b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9837b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(test.PopHighestIndex().Is(w13)); 9838b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(test.PopLowestIndex().Is(w10)); 9839b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9840b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(test.IncludesAliasOf(x11)); 9841b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(test.IncludesAliasOf(x12)); 9842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(test.IncludesAliasOf(w11)); 9843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(test.IncludesAliasOf(w12)); 9844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(x10)); 9845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(x13)); 9846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(w10)); 9847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(w13)); 9848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(test.PopHighestIndex().Is(w12)); 9850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(test.PopLowestIndex().Is(w11)); 9851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(x11)); 9853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(x12)); 9854b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(w11)); 9855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(w12)); 9856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(test.IsEmpty()); 9858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 9859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9860b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(cpureglist_utils_d) { 9862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // This test doesn't generate any code, but it verifies the behaviour of 9863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // the CPURegList utility methods. 9864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Test a list of D registers. 9866b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CPURegList test(d20, d21, d22, d23); 9867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(test.IncludesAliasOf(d20)); 9869b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(test.IncludesAliasOf(d21)); 9870b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(test.IncludesAliasOf(d22)); 9871b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(test.IncludesAliasOf(d23)); 9872b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(test.IncludesAliasOf(s20)); 9873b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(test.IncludesAliasOf(s21)); 9874b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(test.IncludesAliasOf(s22)); 9875b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(test.IncludesAliasOf(s23)); 9876b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9877b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(d0)); 9878b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(d19)); 9879b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(d24)); 9880b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(d31)); 9881b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(s0)); 9882b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(s19)); 9883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(s24)); 9884b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(s31)); 9885b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(x20)); 9887b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(x21)); 9888b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(x22)); 9889b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(x23)); 9890b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(w20)); 9891b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(w21)); 9892b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(w22)); 9893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(w23)); 9894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(xzr)); 9896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(wzr)); 9897b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(csp)); 9898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(wcsp)); 9899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9900b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IsEmpty()); 9901b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9902b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(test.type() == d20.type()); 9903b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9904b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(test.PopHighestIndex().Is(d23)); 9905b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(test.PopLowestIndex().Is(d20)); 9906b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9907b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(test.IncludesAliasOf(d21)); 9908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(test.IncludesAliasOf(d22)); 9909b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(test.IncludesAliasOf(s21)); 9910b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(test.IncludesAliasOf(s22)); 9911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(d20)); 9912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(d23)); 9913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(s20)); 9914b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(s23)); 9915b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(test.PopHighestIndex().Is(d22)); 9917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(test.PopLowestIndex().Is(d21)); 9918b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9919b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(d21)); 9920b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(d22)); 9921b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(s21)); 9922b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(!test.IncludesAliasOf(s22)); 9923b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9924b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(test.IsEmpty()); 9925b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 9926b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9927b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9928b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(cpureglist_utils_s) { 9929b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // This test doesn't generate any code, but it verifies the behaviour of 9930b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // the CPURegList utility methods. 9931b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9932b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Test a list of S registers. 9933b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CPURegList test(s20, s21, s22, s23); 9934b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9935b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The type and size mechanisms are already covered, so here we just test 9936b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // that lists of S registers alias individual D registers. 9937b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9938b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(test.IncludesAliasOf(d20)); 9939b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(test.IncludesAliasOf(d21)); 9940b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(test.IncludesAliasOf(d22)); 9941b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(test.IncludesAliasOf(d23)); 9942b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(test.IncludesAliasOf(s20)); 9943b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(test.IncludesAliasOf(s21)); 9944b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(test.IncludesAliasOf(s22)); 9945b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(test.IncludesAliasOf(s23)); 9946b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 9947b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9948b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9949b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(cpureglist_utils_empty) { 9950b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // This test doesn't generate any code, but it verifies the behaviour of 9951b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // the CPURegList utility methods. 9952b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Test an empty list. 9954b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Empty lists can have type and size properties. Check that we can create 9955b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // them, and that they are empty. 9956b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CPURegList reg32(CPURegister::kRegister, kWRegSizeInBits, 0); 9957b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CPURegList reg64(CPURegister::kRegister, kXRegSizeInBits, 0); 9958b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CPURegList fpreg32(CPURegister::kFPRegister, kSRegSizeInBits, 0); 9959b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CPURegList fpreg64(CPURegister::kFPRegister, kDRegSizeInBits, 0); 9960b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9961b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(reg32.IsEmpty()); 9962b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(reg64.IsEmpty()); 9963b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(fpreg32.IsEmpty()); 9964b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(fpreg64.IsEmpty()); 9965b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9966b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(reg32.PopLowestIndex().IsNone()); 9967b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(reg64.PopLowestIndex().IsNone()); 9968b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(fpreg32.PopLowestIndex().IsNone()); 9969b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(fpreg64.PopLowestIndex().IsNone()); 9970b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9971b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(reg32.PopHighestIndex().IsNone()); 9972b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(reg64.PopHighestIndex().IsNone()); 9973b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(fpreg32.PopHighestIndex().IsNone()); 9974b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(fpreg64.PopHighestIndex().IsNone()); 9975b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9976b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(reg32.IsEmpty()); 9977b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(reg64.IsEmpty()); 9978b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(fpreg32.IsEmpty()); 9979b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(fpreg64.IsEmpty()); 9980b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 9981b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9982b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9983b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(printf) { 9984b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 9985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP_SIZE(BUF_SIZE * 2); 9986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 9987b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch char const * test_plain_string = "Printf with no arguments.\n"; 9989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch char const * test_substring = "'This is a substring.'"; 9990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RegisterDump before; 9991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9992b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Initialize x29 to the value of the stack pointer. We will use x29 as a 9993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // temporary stack pointer later, and initializing it in this way allows the 9994b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // RegisterDump check to pass. 9995b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x29, __ StackPointer()); 9996b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9997b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Test simple integer arguments. 9998b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 1234); 9999b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 0x1234); 10000b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10001b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Test simple floating-point arguments. 10002b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d0, 1.234); 10003b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Test pointer (string) arguments. 10005b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x2, reinterpret_cast<uintptr_t>(test_substring)); 10006b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10007b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Test the maximum number of arguments, and sign extension. 10008b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w3, 0xffffffff); 10009b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w4, 0xffffffff); 10010b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x5, 0xffffffffffffffff); 10011b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x6, 0xffffffffffffffff); 10012b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s1, 1.234); 10013b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s2, 2.345); 10014b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d3, 3.456); 10015b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d4, 4.567); 10016b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10017b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Test printing callee-saved registers. 10018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x28, 0x123456789abcdef); 10019b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d10, 42.0); 10020b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10021b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Test with three arguments. 10022b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x10, 3); 10023b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x11, 40); 10024b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x12, 500); 10025b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // A single character. 10027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w13, 'x'); 10028b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10029b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Check that we don't clobber any registers. 10030b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch before.Dump(&masm); 10031b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10032b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Printf(test_plain_string); // NOLINT(runtime/printf) 10033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Printf("x0: %" PRId64 ", x1: 0x%08" PRIx64 "\n", x0, x1); 10034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Printf("w5: %" PRId32 ", x5: %" PRId64"\n", w5, x5); 10035b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Printf("d0: %f\n", d0); 10036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Printf("Test %%s: %s\n", x2); 10037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Printf("w3(uint32): %" PRIu32 "\nw4(int32): %" PRId32 "\n" 10038b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch "x5(uint64): %" PRIu64 "\nx6(int64): %" PRId64 "\n", 10039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch w3, w4, x5, x6); 10040b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Printf("%%f: %f\n%%g: %g\n%%e: %e\n%%E: %E\n", s1, s2, d3, d4); 10041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Printf("0x%" PRIx32 ", 0x%" PRIx64 "\n", w28, x28); 10042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Printf("%g\n", d10); 10043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Printf("%%%%%s%%%c%%\n", x2, w13); 10044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10045b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Print the stack pointer (csp). 10046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(csp.Is(__ StackPointer())); 10047b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Printf("StackPointer(csp): 0x%016" PRIx64 ", 0x%08" PRIx32 "\n", 10048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ StackPointer(), __ StackPointer().W()); 10049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Test with a different stack pointer. 10051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const Register old_stack_pointer = __ StackPointer(); 10052b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x29, old_stack_pointer); 10053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ SetStackPointer(x29); 10054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Print the stack pointer (not csp). 10055b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Printf("StackPointer(not csp): 0x%016" PRIx64 ", 0x%08" PRIx32 "\n", 10056b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ StackPointer(), __ StackPointer().W()); 10057b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(old_stack_pointer, __ StackPointer()); 10058b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ SetStackPointer(old_stack_pointer); 10059b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10060b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Test with three arguments. 10061b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Printf("3=%u, 4=%u, 5=%u\n", x10, x11, x12); 10062b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10063b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Mixed argument types. 10064b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Printf("w3: %" PRIu32 ", s1: %f, x5: %" PRIu64 ", d3: %f\n", 10065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch w3, s1, x5, d3); 10066b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Printf("s1: %f, d3: %f, w3: %" PRId32 ", x5: %" PRId64 "\n", 10067b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch s1, d3, w3, x5); 10068b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10069b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 10070b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 10071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10072b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // We cannot easily test the output of the Printf sequences, and because 10073b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Printf preserves all registers by default, we can't look at the number of 10074b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // bytes that were printed. However, the printf_no_preserve test should check 10075b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // that, and here we just test that we didn't clobber any registers. 10076b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_REGISTERS(before); 10077b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10078b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 10079b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 10080b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10081b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10082b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(printf_no_preserve) { 10083b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 10084b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 10085b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 10086b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10087b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch char const * test_plain_string = "Printf with no arguments.\n"; 10088b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch char const * test_substring = "'This is a substring.'"; 10089b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10090b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ PrintfNoPreserve(test_plain_string); 10091b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x19, x0); 10092b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10093b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Test simple integer arguments. 10094b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 1234); 10095b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 0x1234); 10096b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ PrintfNoPreserve("x0: %" PRId64", x1: 0x%08" PRIx64 "\n", x0, x1); 10097b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x20, x0); 10098b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10099b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Test simple floating-point arguments. 10100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d0, 1.234); 10101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ PrintfNoPreserve("d0: %f\n", d0); 10102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x21, x0); 10103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Test pointer (string) arguments. 10105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x2, reinterpret_cast<uintptr_t>(test_substring)); 10106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ PrintfNoPreserve("Test %%s: %s\n", x2); 10107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x22, x0); 10108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Test the maximum number of arguments, and sign extension. 10110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w3, 0xffffffff); 10111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w4, 0xffffffff); 10112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x5, 0xffffffffffffffff); 10113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x6, 0xffffffffffffffff); 10114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ PrintfNoPreserve("w3(uint32): %" PRIu32 "\nw4(int32): %" PRId32 "\n" 10115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch "x5(uint64): %" PRIu64 "\nx6(int64): %" PRId64 "\n", 10116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch w3, w4, x5, x6); 10117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x23, x0); 10118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s1, 1.234); 10120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s2, 2.345); 10121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d3, 3.456); 10122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d4, 4.567); 10123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ PrintfNoPreserve("%%f: %f\n%%g: %g\n%%e: %e\n%%E: %E\n", s1, s2, d3, d4); 10124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x24, x0); 10125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Test printing callee-saved registers. 10127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x28, 0x123456789abcdef); 10128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ PrintfNoPreserve("0x%" PRIx32 ", 0x%" PRIx64 "\n", w28, x28); 10129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x25, x0); 10130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d10, 42.0); 10132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ PrintfNoPreserve("%g\n", d10); 10133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x26, x0); 10134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Test with a different stack pointer. 10136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const Register old_stack_pointer = __ StackPointer(); 10137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x29, old_stack_pointer); 10138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ SetStackPointer(x29); 10139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Print the stack pointer (not csp). 10140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ PrintfNoPreserve( 10141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch "StackPointer(not csp): 0x%016" PRIx64 ", 0x%08" PRIx32 "\n", 10142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ StackPointer(), __ StackPointer().W()); 10143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x27, x0); 10144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(old_stack_pointer, __ StackPointer()); 10145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ SetStackPointer(old_stack_pointer); 10146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Test with three arguments. 10148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x3, 3); 10149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x4, 40); 10150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x5, 500); 10151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ PrintfNoPreserve("3=%u, 4=%u, 5=%u\n", x3, x4, x5); 10152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x28, x0); 10153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Mixed argument types. 10155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w3, 0xffffffff); 10156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s1, 1.234); 10157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x5, 0xffffffffffffffff); 10158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d3, 3.456); 10159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ PrintfNoPreserve("w3: %" PRIu32 ", s1: %f, x5: %" PRIu64 ", d3: %f\n", 10160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch w3, s1, x5, d3); 10161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x29, x0); 10162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 10164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 10165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // We cannot easily test the exact output of the Printf sequences, but we can 10167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // use the return code to check that the string length was correct. 10168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Printf with no arguments. 10170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(strlen(test_plain_string), x19); 10171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // x0: 1234, x1: 0x00001234 10172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(25, x20); 10173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // d0: 1.234000 10174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(13, x21); 10175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Test %s: 'This is a substring.' 10176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(32, x22); 10177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // w3(uint32): 4294967295 10178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // w4(int32): -1 10179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // x5(uint64): 18446744073709551615 10180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // x6(int64): -1 10181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(23 + 14 + 33 + 14, x23); 10182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // %f: 1.234000 10183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // %g: 2.345 10184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // %e: 3.456000e+00 10185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // %E: 4.567000E+00 10186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(13 + 10 + 17 + 17, x24); 10187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // 0x89abcdef, 0x123456789abcdef 10188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(30, x25); 10189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // 42 10190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(3, x26); 10191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // StackPointer(not csp): 0x00007fb037ae2370, 0x37ae2370 10192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Note: This is an example value, but the field width is fixed here so the 10193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // string length is still predictable. 10194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(54, x27); 10195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // 3=3, 4=40, 5=500 10196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(17, x28); 10197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // w3: 4294967295, s1: 1.234000, x5: 18446744073709551615, d3: 3.456000 10198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(69, x29); 10199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 10201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 10202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// This is a V8-specific test. 10205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic void CopyFieldsHelper(CPURegList temps) { 10206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const uint64_t kLiteralBase = 0x0100001000100101UL; 10207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const uint64_t src[] = {kLiteralBase * 1, 10208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kLiteralBase * 2, 10209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kLiteralBase * 3, 10210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kLiteralBase * 4, 10211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kLiteralBase * 5, 10212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kLiteralBase * 6, 10213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kLiteralBase * 7, 10214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kLiteralBase * 8, 10215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kLiteralBase * 9, 10216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kLiteralBase * 10, 10217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kLiteralBase * 11}; 10218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const uint64_t src_tagged = 10219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch reinterpret_cast<uint64_t>(src) + kHeapObjectTag; 10220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const unsigned kTestCount = sizeof(src) / sizeof(src[0]) + 1; 10222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint64_t* dst[kTestCount]; 10223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint64_t dst_tagged[kTestCount]; 10224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The first test will be to copy 0 fields. The destination (and source) 10226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // should not be accessed in any way. 10227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch dst[0] = NULL; 10228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch dst_tagged[0] = kHeapObjectTag; 10229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Allocate memory for each other test. Each test <n> will have <n> fields. 10231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // This is intended to exercise as many paths in CopyFields as possible. 10232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (unsigned i = 1; i < kTestCount; i++) { 10233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch dst[i] = new uint64_t[i]; 10234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch memset(dst[i], 0, i * sizeof(kLiteralBase)); 10235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch dst_tagged[i] = reinterpret_cast<uint64_t>(dst[i]) + kHeapObjectTag; 10236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 10237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 10239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 10240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, dst_tagged[0]); 10242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, 0); 10243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ CopyFields(x0, x1, temps, 0); 10244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (unsigned i = 1; i < kTestCount; i++) { 10245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, dst_tagged[i]); 10246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, src_tagged); 10247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ CopyFields(x0, x1, temps, i); 10248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 10249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 10251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 10252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 10253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (unsigned i = 1; i < kTestCount; i++) { 10255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (unsigned j = 0; j < i; j++) { 10256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(src[j] == dst[i][j]); 10257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 10258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch delete [] dst[i]; 10259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 10260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 10261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// This is a V8-specific test. 10264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(copyfields) { 10265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 10266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CopyFieldsHelper(CPURegList(x10)); 10267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CopyFieldsHelper(CPURegList(x10, x11)); 10268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CopyFieldsHelper(CPURegList(x10, x11, x12)); 10269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CopyFieldsHelper(CPURegList(x10, x11, x12, x13)); 10270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 10271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(blr_lr) { 10274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // A simple test to check that the simulator correcty handle "blr lr". 10275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 10276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 10277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 10279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Label target; 10280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Label end; 10281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0x0); 10283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Adr(lr, &target); 10284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Blr(lr); 10286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0xdeadbeef); 10287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&end); 10288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&target); 10290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0xc001c0de); 10291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&end); 10293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 10294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 10296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0xc001c0de, x0); 10298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 10300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 10301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(barriers) { 10304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Generate all supported barriers, this is just a smoke test 10305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 10306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 10307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 10309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // DMB 10311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Dmb(FullSystem, BarrierAll); 10312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Dmb(FullSystem, BarrierReads); 10313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Dmb(FullSystem, BarrierWrites); 10314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Dmb(FullSystem, BarrierOther); 10315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Dmb(InnerShareable, BarrierAll); 10317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Dmb(InnerShareable, BarrierReads); 10318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Dmb(InnerShareable, BarrierWrites); 10319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Dmb(InnerShareable, BarrierOther); 10320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Dmb(NonShareable, BarrierAll); 10322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Dmb(NonShareable, BarrierReads); 10323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Dmb(NonShareable, BarrierWrites); 10324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Dmb(NonShareable, BarrierOther); 10325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Dmb(OuterShareable, BarrierAll); 10327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Dmb(OuterShareable, BarrierReads); 10328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Dmb(OuterShareable, BarrierWrites); 10329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Dmb(OuterShareable, BarrierOther); 10330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // DSB 10332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Dsb(FullSystem, BarrierAll); 10333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Dsb(FullSystem, BarrierReads); 10334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Dsb(FullSystem, BarrierWrites); 10335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Dsb(FullSystem, BarrierOther); 10336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Dsb(InnerShareable, BarrierAll); 10338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Dsb(InnerShareable, BarrierReads); 10339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Dsb(InnerShareable, BarrierWrites); 10340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Dsb(InnerShareable, BarrierOther); 10341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Dsb(NonShareable, BarrierAll); 10343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Dsb(NonShareable, BarrierReads); 10344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Dsb(NonShareable, BarrierWrites); 10345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Dsb(NonShareable, BarrierOther); 10346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Dsb(OuterShareable, BarrierAll); 10348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Dsb(OuterShareable, BarrierReads); 10349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Dsb(OuterShareable, BarrierWrites); 10350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Dsb(OuterShareable, BarrierOther); 10351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // ISB 10353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Isb(); 10354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 10356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 10358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 10360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 10361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(process_nan_double) { 10364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 10365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Make sure that NaN propagation works correctly. 10366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double sn = rawbits_to_double(0x7ff5555511111111); 10367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double qn = rawbits_to_double(0x7ffaaaaa11111111); 10368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsSignallingNaN(sn)); 10369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsQuietNaN(qn)); 10370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The input NaNs after passing through ProcessNaN. 10372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double sn_proc = rawbits_to_double(0x7ffd555511111111); 10373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double qn_proc = qn; 10374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsQuietNaN(sn_proc)); 10375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsQuietNaN(qn_proc)); 10376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 10378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 10379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Execute a number of instructions which all use ProcessNaN, and check that 10381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // they all handle the NaN correctly. 10382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d0, sn); 10383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d10, qn); 10384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Operations that always propagate NaNs unchanged, even signalling NaNs. 10386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // - Signalling NaN 10387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d1, d0); 10388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fabs(d2, d0); 10389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fneg(d3, d0); 10390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // - Quiet NaN 10391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d11, d10); 10392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fabs(d12, d10); 10393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fneg(d13, d10); 10394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Operations that use ProcessNaN. 10396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // - Signalling NaN 10397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fsqrt(d4, d0); 10398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frinta(d5, d0); 10399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintn(d6, d0); 10400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintz(d7, d0); 10401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // - Quiet NaN 10402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fsqrt(d14, d10); 10403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frinta(d15, d10); 10404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintn(d16, d10); 10405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintz(d17, d10); 10406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The behaviour of fcvt is checked in TEST(fcvt_sd). 10408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 10410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 10411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint64_t qn_raw = double_to_rawbits(qn); 10413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint64_t sn_raw = double_to_rawbits(sn); 10414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // - Signalling NaN 10416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(sn, d1); 10417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(rawbits_to_double(sn_raw & ~kDSignMask), d2); 10418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(rawbits_to_double(sn_raw ^ kDSignMask), d3); 10419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // - Quiet NaN 10420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(qn, d11); 10421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(rawbits_to_double(qn_raw & ~kDSignMask), d12); 10422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(rawbits_to_double(qn_raw ^ kDSignMask), d13); 10423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // - Signalling NaN 10425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(sn_proc, d4); 10426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(sn_proc, d5); 10427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(sn_proc, d6); 10428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(sn_proc, d7); 10429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // - Quiet NaN 10430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(qn_proc, d14); 10431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(qn_proc, d15); 10432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(qn_proc, d16); 10433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(qn_proc, d17); 10434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 10436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 10437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(process_nan_float) { 10440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 10441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Make sure that NaN propagation works correctly. 10442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch float sn = rawbits_to_float(0x7f951111); 10443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch float qn = rawbits_to_float(0x7fea1111); 10444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsSignallingNaN(sn)); 10445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsQuietNaN(qn)); 10446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The input NaNs after passing through ProcessNaN. 10448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch float sn_proc = rawbits_to_float(0x7fd51111); 10449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch float qn_proc = qn; 10450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsQuietNaN(sn_proc)); 10451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsQuietNaN(qn_proc)); 10452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 10454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 10455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Execute a number of instructions which all use ProcessNaN, and check that 10457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // they all handle the NaN correctly. 10458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s0, sn); 10459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s10, qn); 10460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Operations that always propagate NaNs unchanged, even signalling NaNs. 10462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // - Signalling NaN 10463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s1, s0); 10464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fabs(s2, s0); 10465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fneg(s3, s0); 10466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // - Quiet NaN 10467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s11, s10); 10468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fabs(s12, s10); 10469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fneg(s13, s10); 10470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Operations that use ProcessNaN. 10472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // - Signalling NaN 10473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fsqrt(s4, s0); 10474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frinta(s5, s0); 10475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintn(s6, s0); 10476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintz(s7, s0); 10477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // - Quiet NaN 10478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fsqrt(s14, s10); 10479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frinta(s15, s10); 10480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintn(s16, s10); 10481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintz(s17, s10); 10482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The behaviour of fcvt is checked in TEST(fcvt_sd). 10484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 10486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 10487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t qn_raw = float_to_rawbits(qn); 10489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t sn_raw = float_to_rawbits(sn); 10490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // - Signalling NaN 10492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(sn, s1); 10493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(rawbits_to_float(sn_raw & ~kSSignMask), s2); 10494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(rawbits_to_float(sn_raw ^ kSSignMask), s3); 10495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // - Quiet NaN 10496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(qn, s11); 10497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(rawbits_to_float(qn_raw & ~kSSignMask), s12); 10498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(rawbits_to_float(qn_raw ^ kSSignMask), s13); 10499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // - Signalling NaN 10501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(sn_proc, s4); 10502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(sn_proc, s5); 10503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(sn_proc, s6); 10504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(sn_proc, s7); 10505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // - Quiet NaN 10506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(qn_proc, s14); 10507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(qn_proc, s15); 10508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(qn_proc, s16); 10509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(qn_proc, s17); 10510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 10512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 10513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic void ProcessNaNsHelper(double n, double m, double expected) { 10516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(std::isnan(n) || std::isnan(m)); 10517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(std::isnan(expected)); 10518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 10520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 10521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Execute a number of instructions which all use ProcessNaNs, and check that 10523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // they all propagate NaNs correctly. 10524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d0, n); 10525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d1, m); 10526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fadd(d2, d0, d1); 10528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fsub(d3, d0, d1); 10529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmul(d4, d0, d1); 10530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fdiv(d5, d0, d1); 10531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmax(d6, d0, d1); 10532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmin(d7, d0, d1); 10533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 10535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 10536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(expected, d2); 10538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(expected, d3); 10539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(expected, d4); 10540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(expected, d5); 10541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(expected, d6); 10542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(expected, d7); 10543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 10545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 10546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(process_nans_double) { 10549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 10550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Make sure that NaN propagation works correctly. 10551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double sn = rawbits_to_double(0x7ff5555511111111); 10552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double sm = rawbits_to_double(0x7ff5555522222222); 10553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double qn = rawbits_to_double(0x7ffaaaaa11111111); 10554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double qm = rawbits_to_double(0x7ffaaaaa22222222); 10555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsSignallingNaN(sn)); 10556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsSignallingNaN(sm)); 10557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsQuietNaN(qn)); 10558b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsQuietNaN(qm)); 10559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The input NaNs after passing through ProcessNaN. 10561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double sn_proc = rawbits_to_double(0x7ffd555511111111); 10562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double sm_proc = rawbits_to_double(0x7ffd555522222222); 10563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double qn_proc = qn; 10564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double qm_proc = qm; 10565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsQuietNaN(sn_proc)); 10566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsQuietNaN(sm_proc)); 10567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsQuietNaN(qn_proc)); 10568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsQuietNaN(qm_proc)); 10569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Quiet NaNs are propagated. 10571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ProcessNaNsHelper(qn, 0, qn_proc); 10572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ProcessNaNsHelper(0, qm, qm_proc); 10573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ProcessNaNsHelper(qn, qm, qn_proc); 10574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Signalling NaNs are propagated, and made quiet. 10576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ProcessNaNsHelper(sn, 0, sn_proc); 10577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ProcessNaNsHelper(0, sm, sm_proc); 10578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ProcessNaNsHelper(sn, sm, sn_proc); 10579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Signalling NaNs take precedence over quiet NaNs. 10581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ProcessNaNsHelper(sn, qm, sn_proc); 10582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ProcessNaNsHelper(qn, sm, sm_proc); 10583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ProcessNaNsHelper(sn, sm, sn_proc); 10584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 10585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic void ProcessNaNsHelper(float n, float m, float expected) { 10588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(std::isnan(n) || std::isnan(m)); 10589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(std::isnan(expected)); 10590b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 10592b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 10593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Execute a number of instructions which all use ProcessNaNs, and check that 10595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // they all propagate NaNs correctly. 10596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s0, n); 10597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s1, m); 10598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10599b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fadd(s2, s0, s1); 10600b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fsub(s3, s0, s1); 10601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmul(s4, s0, s1); 10602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fdiv(s5, s0, s1); 10603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmax(s6, s0, s1); 10604b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmin(s7, s0, s1); 10605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 10607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 10608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(expected, s2); 10610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(expected, s3); 10611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(expected, s4); 10612b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(expected, s5); 10613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(expected, s6); 10614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(expected, s7); 10615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 10617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 10618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(process_nans_float) { 10621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 10622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Make sure that NaN propagation works correctly. 10623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch float sn = rawbits_to_float(0x7f951111); 10624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch float sm = rawbits_to_float(0x7f952222); 10625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch float qn = rawbits_to_float(0x7fea1111); 10626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch float qm = rawbits_to_float(0x7fea2222); 10627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsSignallingNaN(sn)); 10628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsSignallingNaN(sm)); 10629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsQuietNaN(qn)); 10630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsQuietNaN(qm)); 10631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The input NaNs after passing through ProcessNaN. 10633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch float sn_proc = rawbits_to_float(0x7fd51111); 10634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch float sm_proc = rawbits_to_float(0x7fd52222); 10635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch float qn_proc = qn; 10636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch float qm_proc = qm; 10637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsQuietNaN(sn_proc)); 10638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsQuietNaN(sm_proc)); 10639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsQuietNaN(qn_proc)); 10640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsQuietNaN(qm_proc)); 10641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Quiet NaNs are propagated. 10643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ProcessNaNsHelper(qn, 0, qn_proc); 10644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ProcessNaNsHelper(0, qm, qm_proc); 10645b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ProcessNaNsHelper(qn, qm, qn_proc); 10646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Signalling NaNs are propagated, and made quiet. 10648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ProcessNaNsHelper(sn, 0, sn_proc); 10649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ProcessNaNsHelper(0, sm, sm_proc); 10650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ProcessNaNsHelper(sn, sm, sn_proc); 10651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Signalling NaNs take precedence over quiet NaNs. 10653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ProcessNaNsHelper(sn, qm, sn_proc); 10654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ProcessNaNsHelper(qn, sm, sm_proc); 10655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ProcessNaNsHelper(sn, sm, sn_proc); 10656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 10657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10659b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic void DefaultNaNHelper(float n, float m, float a) { 10660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(std::isnan(n) || std::isnan(m) || std::isnan(a)); 10661b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10662b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool test_1op = std::isnan(n); 10663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool test_2op = std::isnan(n) || std::isnan(m); 10664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 10666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 10667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Enable Default-NaN mode in the FPCR. 10669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mrs(x0, FPCR); 10670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Orr(x1, x0, DN_mask); 10671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Msr(FPCR, x1); 10672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Execute a number of instructions which all use ProcessNaNs, and check that 10674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // they all produce the default NaN. 10675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s0, n); 10676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s1, m); 10677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s2, a); 10678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (test_1op) { 10680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Operations that always propagate NaNs unchanged, even signalling NaNs. 10681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(s10, s0); 10682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fabs(s11, s0); 10683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fneg(s12, s0); 10684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Operations that use ProcessNaN. 10686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fsqrt(s13, s0); 10687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frinta(s14, s0); 10688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintn(s15, s0); 10689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintz(s16, s0); 10690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Fcvt usually has special NaN handling, but it respects default-NaN mode. 10692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvt(d17, s0); 10693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 10694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (test_2op) { 10696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fadd(s18, s0, s1); 10697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fsub(s19, s0, s1); 10698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmul(s20, s0, s1); 10699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fdiv(s21, s0, s1); 10700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmax(s22, s0, s1); 10701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmin(s23, s0, s1); 10702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 10703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10704b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmadd(s24, s0, s1, s2); 10705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmsub(s25, s0, s1, s2); 10706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fnmadd(s26, s0, s1, s2); 10707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fnmsub(s27, s0, s1, s2); 10708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Restore FPCR. 10710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Msr(FPCR, x0); 10711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 10713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 10714b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10715b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (test_1op) { 10716b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t n_raw = float_to_rawbits(n); 10717b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(n, s10); 10718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(rawbits_to_float(n_raw & ~kSSignMask), s11); 10719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(rawbits_to_float(n_raw ^ kSSignMask), s12); 10720b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(kFP32DefaultNaN, s13); 10721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(kFP32DefaultNaN, s14); 10722b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(kFP32DefaultNaN, s15); 10723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(kFP32DefaultNaN, s16); 10724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(kFP64DefaultNaN, d17); 10725b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 10726b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10727b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (test_2op) { 10728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(kFP32DefaultNaN, s18); 10729b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(kFP32DefaultNaN, s19); 10730b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(kFP32DefaultNaN, s20); 10731b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(kFP32DefaultNaN, s21); 10732b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(kFP32DefaultNaN, s22); 10733b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(kFP32DefaultNaN, s23); 10734b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 10735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(kFP32DefaultNaN, s24); 10737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(kFP32DefaultNaN, s25); 10738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(kFP32DefaultNaN, s26); 10739b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(kFP32DefaultNaN, s27); 10740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 10742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 10743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10745b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(default_nan_float) { 10746b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 10747b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch float sn = rawbits_to_float(0x7f951111); 10748b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch float sm = rawbits_to_float(0x7f952222); 10749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch float sa = rawbits_to_float(0x7f95aaaa); 10750b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch float qn = rawbits_to_float(0x7fea1111); 10751b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch float qm = rawbits_to_float(0x7fea2222); 10752b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch float qa = rawbits_to_float(0x7feaaaaa); 10753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsSignallingNaN(sn)); 10754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsSignallingNaN(sm)); 10755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsSignallingNaN(sa)); 10756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsQuietNaN(qn)); 10757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsQuietNaN(qm)); 10758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsQuietNaN(qa)); 10759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // - Signalling NaNs 10761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefaultNaNHelper(sn, 0.0f, 0.0f); 10762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefaultNaNHelper(0.0f, sm, 0.0f); 10763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefaultNaNHelper(0.0f, 0.0f, sa); 10764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefaultNaNHelper(sn, sm, 0.0f); 10765b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefaultNaNHelper(0.0f, sm, sa); 10766b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefaultNaNHelper(sn, 0.0f, sa); 10767b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefaultNaNHelper(sn, sm, sa); 10768b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // - Quiet NaNs 10769b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefaultNaNHelper(qn, 0.0f, 0.0f); 10770b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefaultNaNHelper(0.0f, qm, 0.0f); 10771b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefaultNaNHelper(0.0f, 0.0f, qa); 10772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefaultNaNHelper(qn, qm, 0.0f); 10773b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefaultNaNHelper(0.0f, qm, qa); 10774b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefaultNaNHelper(qn, 0.0f, qa); 10775b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefaultNaNHelper(qn, qm, qa); 10776b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // - Mixed NaNs 10777b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefaultNaNHelper(qn, sm, sa); 10778b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefaultNaNHelper(sn, qm, sa); 10779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefaultNaNHelper(sn, sm, qa); 10780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefaultNaNHelper(qn, qm, sa); 10781b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefaultNaNHelper(sn, qm, qa); 10782b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefaultNaNHelper(qn, sm, qa); 10783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefaultNaNHelper(qn, qm, qa); 10784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 10785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic void DefaultNaNHelper(double n, double m, double a) { 10788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(std::isnan(n) || std::isnan(m) || std::isnan(a)); 10789b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10790b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool test_1op = std::isnan(n); 10791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool test_2op = std::isnan(n) || std::isnan(m); 10792b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 10794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 10795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10796b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Enable Default-NaN mode in the FPCR. 10797b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mrs(x0, FPCR); 10798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Orr(x1, x0, DN_mask); 10799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Msr(FPCR, x1); 10800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Execute a number of instructions which all use ProcessNaNs, and check that 10802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // they all produce the default NaN. 10803b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d0, n); 10804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d1, m); 10805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d2, a); 10806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (test_1op) { 10808b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Operations that always propagate NaNs unchanged, even signalling NaNs. 10809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmov(d10, d0); 10810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fabs(d11, d0); 10811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fneg(d12, d0); 10812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10813b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Operations that use ProcessNaN. 10814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fsqrt(d13, d0); 10815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frinta(d14, d0); 10816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintn(d15, d0); 10817b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Frintz(d16, d0); 10818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10819b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Fcvt usually has special NaN handling, but it respects default-NaN mode. 10820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fcvt(s17, d0); 10821b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 10822b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (test_2op) { 10824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fadd(d18, d0, d1); 10825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fsub(d19, d0, d1); 10826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmul(d20, d0, d1); 10827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fdiv(d21, d0, d1); 10828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmax(d22, d0, d1); 10829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmin(d23, d0, d1); 10830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 10831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmadd(d24, d0, d1, d2); 10833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fmsub(d25, d0, d1, d2); 10834b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fnmadd(d26, d0, d1, d2); 10835b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Fnmsub(d27, d0, d1, d2); 10836b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10837b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Restore FPCR. 10838b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Msr(FPCR, x0); 10839b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10840b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 10841b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 10842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (test_1op) { 10844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint64_t n_raw = double_to_rawbits(n); 10845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(n, d10); 10846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(rawbits_to_double(n_raw & ~kDSignMask), d11); 10847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(rawbits_to_double(n_raw ^ kDSignMask), d12); 10848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(kFP64DefaultNaN, d13); 10849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(kFP64DefaultNaN, d14); 10850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(kFP64DefaultNaN, d15); 10851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(kFP64DefaultNaN, d16); 10852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP32(kFP32DefaultNaN, s17); 10853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 10854b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (test_2op) { 10856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(kFP64DefaultNaN, d18); 10857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(kFP64DefaultNaN, d19); 10858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(kFP64DefaultNaN, d20); 10859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(kFP64DefaultNaN, d21); 10860b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(kFP64DefaultNaN, d22); 10861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(kFP64DefaultNaN, d23); 10862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 10863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(kFP64DefaultNaN, d24); 10865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(kFP64DefaultNaN, d25); 10866b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(kFP64DefaultNaN, d26); 10867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_FP64(kFP64DefaultNaN, d27); 10868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10869b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 10870b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 10871b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10872b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10873b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(default_nan_double) { 10874b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 10875b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double sn = rawbits_to_double(0x7ff5555511111111); 10876b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double sm = rawbits_to_double(0x7ff5555522222222); 10877b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double sa = rawbits_to_double(0x7ff55555aaaaaaaa); 10878b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double qn = rawbits_to_double(0x7ffaaaaa11111111); 10879b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double qm = rawbits_to_double(0x7ffaaaaa22222222); 10880b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double qa = rawbits_to_double(0x7ffaaaaaaaaaaaaa); 10881b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsSignallingNaN(sn)); 10882b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsSignallingNaN(sm)); 10883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsSignallingNaN(sa)); 10884b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsQuietNaN(qn)); 10885b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsQuietNaN(qm)); 10886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsQuietNaN(qa)); 10887b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10888b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // - Signalling NaNs 10889b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefaultNaNHelper(sn, 0.0, 0.0); 10890b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefaultNaNHelper(0.0, sm, 0.0); 10891b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefaultNaNHelper(0.0, 0.0, sa); 10892b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefaultNaNHelper(sn, sm, 0.0); 10893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefaultNaNHelper(0.0, sm, sa); 10894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefaultNaNHelper(sn, 0.0, sa); 10895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefaultNaNHelper(sn, sm, sa); 10896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // - Quiet NaNs 10897b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefaultNaNHelper(qn, 0.0, 0.0); 10898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefaultNaNHelper(0.0, qm, 0.0); 10899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefaultNaNHelper(0.0, 0.0, qa); 10900b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefaultNaNHelper(qn, qm, 0.0); 10901b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefaultNaNHelper(0.0, qm, qa); 10902b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefaultNaNHelper(qn, 0.0, qa); 10903b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefaultNaNHelper(qn, qm, qa); 10904b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // - Mixed NaNs 10905b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefaultNaNHelper(qn, sm, sa); 10906b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefaultNaNHelper(sn, qm, sa); 10907b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefaultNaNHelper(sn, sm, qa); 10908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefaultNaNHelper(qn, qm, sa); 10909b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefaultNaNHelper(sn, qm, qa); 10910b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefaultNaNHelper(qn, sm, qa); 10911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefaultNaNHelper(qn, qm, qa); 10912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 10913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10914b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10915b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(call_no_relocation) { 10916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Address call_start; 10917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Address return_address; 10918b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10919b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 10920b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 10921b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10922b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 10923b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10924b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Label function; 10925b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Label test; 10926b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10927b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ B(&test); 10928b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10929b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&function); 10930b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0x1); 10931b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Ret(); 10932b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10933b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&test); 10934b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0x0); 10935b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Push(lr, xzr); 10936b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 10937b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Assembler::BlockConstPoolScope scope(&masm); 10938b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch call_start = buf + __ pc_offset(); 10939b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Call(buf + function.pos(), RelocInfo::NONE64); 10940b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return_address = buf + __ pc_offset(); 10941b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 10942b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Pop(xzr, lr); 10943b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 10944b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10945b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 10946b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10947b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(1, x0); 10948b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10949b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The return_address_from_call_start function doesn't currently encounter any 10950b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // non-relocatable sequences, so we check it here to make sure it works. 10951b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // TODO(jbramley): Once Crankshaft is complete, decide if we need to support 10952b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // non-relocatable calls at all. 10953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(return_address == 10954b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Assembler::return_address_from_call_start(call_start)); 10955b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10956b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 10957b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 10958b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10959b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10960b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic void AbsHelperX(int64_t value) { 10961b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int64_t expected; 10962b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10963b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 10964b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 10965b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10966b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Label fail; 10967b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Label done; 10968b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10969b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, 0); 10970b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x1, value); 10971b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10972b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (value != kXMinInt) { 10973b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch expected = labs(value); 10974b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10975b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Label next; 10976b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The result is representable. 10977b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Abs(x10, x1); 10978b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Abs(x11, x1, &fail); 10979b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Abs(x12, x1, &fail, &next); 10980b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&next); 10981b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Abs(x13, x1, NULL, &done); 10982b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 10983b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // labs is undefined for kXMinInt but our implementation in the 10984b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // MacroAssembler will return kXMinInt in such a case. 10985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch expected = kXMinInt; 10986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10987b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Label next; 10988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The result is not representable. 10989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Abs(x10, x1); 10990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Abs(x11, x1, NULL, &fail); 10991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Abs(x12, x1, &next, &fail); 10992b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&next); 10993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Abs(x13, x1, &done); 10994b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 10995b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10996b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&fail); 10997b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(x0, -1); 10998b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10999b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&done); 11000b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11001b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 11002b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 11003b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(0, x0); 11005b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(value, x1); 11006b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(expected, x10); 11007b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(expected, x11); 11008b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(expected, x12); 11009b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_64(expected, x13); 11010b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11011b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 11012b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 11013b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11014b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11015b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic void AbsHelperW(int32_t value) { 11016b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t expected; 11017b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 11019b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch START(); 11020b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11021b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Label fail; 11022b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Label done; 11023b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11024b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w0, 0); 11025b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // TODO(jbramley): The cast is needed to avoid a sign-extension bug in VIXL. 11026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Once it is fixed, we should remove the cast. 11027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w1, static_cast<uint32_t>(value)); 11028b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11029b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (value != kWMinInt) { 11030b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch expected = abs(value); 11031b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11032b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Label next; 11033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The result is representable. 11034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Abs(w10, w1); 11035b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Abs(w11, w1, &fail); 11036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Abs(w12, w1, &fail, &next); 11037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&next); 11038b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Abs(w13, w1, NULL, &done); 11039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 11040b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // abs is undefined for kWMinInt but our implementation in the 11041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // MacroAssembler will return kWMinInt in such a case. 11042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch expected = kWMinInt; 11043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Label next; 11045b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The result is not representable. 11046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Abs(w10, w1); 11047b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Abs(w11, w1, NULL, &fail); 11048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Abs(w12, w1, &next, &fail); 11049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&next); 11050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Abs(w13, w1, &done); 11051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 11052b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&fail); 11054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Mov(w0, -1); 11055b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11056b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ Bind(&done); 11057b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11058b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch END(); 11059b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RUN(); 11060b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11061b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(0, w0); 11062b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(value, w1); 11063b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(expected, w10); 11064b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(expected, w11); 11065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(expected, w12); 11066b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQUAL_32(expected, w13); 11067b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11068b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 11069b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 11070b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11072b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(abs) { 11073b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 11074b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch AbsHelperX(0); 11075b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch AbsHelperX(42); 11076b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch AbsHelperX(-42); 11077b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch AbsHelperX(kXMinInt); 11078b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch AbsHelperX(kXMaxInt); 11079b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11080b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch AbsHelperW(0); 11081b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch AbsHelperW(42); 11082b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch AbsHelperW(-42); 11083b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch AbsHelperW(kWMinInt); 11084b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch AbsHelperW(kWMaxInt); 11085b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 11086b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11087b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11088b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(pool_size) { 11089b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INIT_V8(); 11090b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETUP(); 11091b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11092b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // This test does not execute any code. It only tests that the size of the 11093b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // pools is read correctly from the RelocInfo. 11094b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11095b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Label exit; 11096b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ b(&exit); 11097b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11098b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const unsigned constant_pool_size = 312; 11099b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const unsigned veneer_pool_size = 184; 11100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ RecordConstPool(constant_pool_size); 11102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (unsigned i = 0; i < constant_pool_size / 4; ++i) { 11103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ dc32(0); 11104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 11105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ RecordVeneerPool(masm.pc_offset(), veneer_pool_size); 11107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (unsigned i = 0; i < veneer_pool_size / kInstructionSize; ++i) { 11108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ nop(); 11109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 11110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __ bind(&exit); 11112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HandleScope handle_scope(isolate); 11114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CodeDesc desc; 11115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch masm.GetCode(&desc); 11116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Code> code = isolate->factory()->NewCode(desc, 0, masm.CodeObject()); 11117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch unsigned pool_count = 0; 11119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int pool_mask = RelocInfo::ModeMask(RelocInfo::CONST_POOL) | 11120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RelocInfo::ModeMask(RelocInfo::VENEER_POOL); 11121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (RelocIterator it(*code, pool_mask); !it.done(); it.next()) { 11122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RelocInfo* info = it.rinfo(); 11123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (RelocInfo::IsConstPool(info->rmode())) { 11124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(info->data() == constant_pool_size); 11125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ++pool_count; 11126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 11127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (RelocInfo::IsVeneerPool(info->rmode())) { 11128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(info->data() == veneer_pool_size); 11129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ++pool_count; 11130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 11131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 11132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(pool_count == 2); 11134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TEARDOWN(); 11136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 11137