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