1014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Copyright 2014 the V8 project authors. All rights reserved. Use of this 2014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// source code is governed by a BSD-style license that can be found in the 3014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// LICENSE file. 4b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include <cmath> 6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include <functional> 7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include <limits> 8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/base/bits.h" 10014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/base/utils/random-number-generator.h" 11958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include "src/codegen.h" 12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "test/cctest/cctest.h" 13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "test/cctest/compiler/codegen-tester.h" 14014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "test/cctest/compiler/graph-builder-tester.h" 15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "test/cctest/compiler/value-helper.h" 16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochusing namespace v8::base; 18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 19014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace v8 { 20014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace internal { 21014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace compiler { 22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunInt32Add) { 25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* add = m.Int32Add(m.Int32Constant(0), m.Int32Constant(1)); 27b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(add); 28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(1, m.Call()); 29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 32014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunWord32Ctz) { 33014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BufferedRawMachineAssemblerTester<int32_t> m(MachineType::Uint32()); 34014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!m.machine()->Word32Ctz().IsSupported()) { 35014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // We can only test the operator if it exists on the testing platform. 36014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return; 37014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 38014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.AddNode(m.machine()->Word32Ctz().op(), m.Parameter(0))); 39014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 40014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(32, m.Call(uint32_t(0x00000000))); 41014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(31, m.Call(uint32_t(0x80000000))); 42014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(30, m.Call(uint32_t(0x40000000))); 43014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(29, m.Call(uint32_t(0x20000000))); 44014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(28, m.Call(uint32_t(0x10000000))); 45014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(27, m.Call(uint32_t(0xa8000000))); 46014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(26, m.Call(uint32_t(0xf4000000))); 47014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(25, m.Call(uint32_t(0x62000000))); 48014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(24, m.Call(uint32_t(0x91000000))); 49014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(23, m.Call(uint32_t(0xcd800000))); 50014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(22, m.Call(uint32_t(0x09400000))); 51014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(21, m.Call(uint32_t(0xaf200000))); 52014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(20, m.Call(uint32_t(0xac100000))); 53014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(19, m.Call(uint32_t(0xe0b80000))); 54014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(18, m.Call(uint32_t(0x9ce40000))); 55014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(17, m.Call(uint32_t(0xc7920000))); 56014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(16, m.Call(uint32_t(0xb8f10000))); 57014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(15, m.Call(uint32_t(0x3b9f8000))); 58014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(14, m.Call(uint32_t(0xdb4c4000))); 59014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(13, m.Call(uint32_t(0xe9a32000))); 60014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(12, m.Call(uint32_t(0xfca61000))); 61014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(11, m.Call(uint32_t(0x6c8a7800))); 62014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(10, m.Call(uint32_t(0x8ce5a400))); 63014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(9, m.Call(uint32_t(0xcb7d0200))); 64014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(8, m.Call(uint32_t(0xcb4dc100))); 65014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(7, m.Call(uint32_t(0xdfbec580))); 66014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(6, m.Call(uint32_t(0x27a9db40))); 67014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(5, m.Call(uint32_t(0xde3bcb20))); 68014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(4, m.Call(uint32_t(0xd7e8a610))); 69014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(3, m.Call(uint32_t(0x9afdbc88))); 70014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(2, m.Call(uint32_t(0x9afdbc84))); 71014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(1, m.Call(uint32_t(0x9afdbc82))); 72014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(0, m.Call(uint32_t(0x9afdbc81))); 73014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 74014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 75014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 76014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunWord32Clz) { 77014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BufferedRawMachineAssemblerTester<int32_t> m(MachineType::Uint32()); 78014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.Word32Clz(m.Parameter(0))); 79014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 80014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(0, m.Call(uint32_t(0x80001000))); 81014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(1, m.Call(uint32_t(0x40000500))); 82014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(2, m.Call(uint32_t(0x20000300))); 83014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(3, m.Call(uint32_t(0x10000003))); 84014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(4, m.Call(uint32_t(0x08050000))); 85014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(5, m.Call(uint32_t(0x04006000))); 86014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(6, m.Call(uint32_t(0x02000000))); 87014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(7, m.Call(uint32_t(0x010000a0))); 88014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(8, m.Call(uint32_t(0x00800c00))); 89014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(9, m.Call(uint32_t(0x00400000))); 90014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(10, m.Call(uint32_t(0x0020000d))); 91014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(11, m.Call(uint32_t(0x00100f00))); 92014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(12, m.Call(uint32_t(0x00080000))); 93014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(13, m.Call(uint32_t(0x00041000))); 94014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(14, m.Call(uint32_t(0x00020020))); 95014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(15, m.Call(uint32_t(0x00010300))); 96014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(16, m.Call(uint32_t(0x00008040))); 97014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(17, m.Call(uint32_t(0x00004005))); 98014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(18, m.Call(uint32_t(0x00002050))); 99014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(19, m.Call(uint32_t(0x00001700))); 100014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(20, m.Call(uint32_t(0x00000870))); 101014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(21, m.Call(uint32_t(0x00000405))); 102014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(22, m.Call(uint32_t(0x00000203))); 103014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(23, m.Call(uint32_t(0x00000101))); 104014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(24, m.Call(uint32_t(0x00000089))); 105014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(25, m.Call(uint32_t(0x00000041))); 106014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(26, m.Call(uint32_t(0x00000022))); 107014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(27, m.Call(uint32_t(0x00000013))); 108014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(28, m.Call(uint32_t(0x00000008))); 109014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(29, m.Call(uint32_t(0x00000004))); 110014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(30, m.Call(uint32_t(0x00000002))); 111014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(31, m.Call(uint32_t(0x00000001))); 112014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(32, m.Call(uint32_t(0x00000000))); 113014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 114014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 115014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 116014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunWord32Popcnt) { 117014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BufferedRawMachineAssemblerTester<int32_t> m(MachineType::Uint32()); 118014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!m.machine()->Word32Popcnt().IsSupported()) { 119014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // We can only test the operator if it exists on the testing platform. 120014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return; 121014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 122014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.AddNode(m.machine()->Word32Popcnt().op(), m.Parameter(0))); 123014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 124014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(0, m.Call(uint32_t(0x00000000))); 125014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(1, m.Call(uint32_t(0x00000001))); 126014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(1, m.Call(uint32_t(0x80000000))); 127014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(32, m.Call(uint32_t(0xffffffff))); 128014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(6, m.Call(uint32_t(0x000dc100))); 129014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(9, m.Call(uint32_t(0xe00dc100))); 130014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(11, m.Call(uint32_t(0xe00dc103))); 131014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(9, m.Call(uint32_t(0x000dc107))); 132014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 133014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 134014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 135014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#if V8_TARGET_ARCH_64_BIT 136014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunWord64Clz) { 137014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BufferedRawMachineAssemblerTester<int32_t> m(MachineType::Uint64()); 138014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.Word64Clz(m.Parameter(0))); 139014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 140014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(0, m.Call(uint64_t(0x8000100000000000))); 141014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(1, m.Call(uint64_t(0x4000050000000000))); 142014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(2, m.Call(uint64_t(0x2000030000000000))); 143014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(3, m.Call(uint64_t(0x1000000300000000))); 144014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(4, m.Call(uint64_t(0x0805000000000000))); 145014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(5, m.Call(uint64_t(0x0400600000000000))); 146014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(6, m.Call(uint64_t(0x0200000000000000))); 147014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(7, m.Call(uint64_t(0x010000a000000000))); 148014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(8, m.Call(uint64_t(0x00800c0000000000))); 149014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(9, m.Call(uint64_t(0x0040000000000000))); 150014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(10, m.Call(uint64_t(0x0020000d00000000))); 151014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(11, m.Call(uint64_t(0x00100f0000000000))); 152014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(12, m.Call(uint64_t(0x0008000000000000))); 153014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(13, m.Call(uint64_t(0x0004100000000000))); 154014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(14, m.Call(uint64_t(0x0002002000000000))); 155014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(15, m.Call(uint64_t(0x0001030000000000))); 156014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(16, m.Call(uint64_t(0x0000804000000000))); 157014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(17, m.Call(uint64_t(0x0000400500000000))); 158014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(18, m.Call(uint64_t(0x0000205000000000))); 159014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(19, m.Call(uint64_t(0x0000170000000000))); 160014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(20, m.Call(uint64_t(0x0000087000000000))); 161014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(21, m.Call(uint64_t(0x0000040500000000))); 162014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(22, m.Call(uint64_t(0x0000020300000000))); 163014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(23, m.Call(uint64_t(0x0000010100000000))); 164014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(24, m.Call(uint64_t(0x0000008900000000))); 165014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(25, m.Call(uint64_t(0x0000004100000000))); 166014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(26, m.Call(uint64_t(0x0000002200000000))); 167014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(27, m.Call(uint64_t(0x0000001300000000))); 168014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(28, m.Call(uint64_t(0x0000000800000000))); 169014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(29, m.Call(uint64_t(0x0000000400000000))); 170014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(30, m.Call(uint64_t(0x0000000200000000))); 171014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(31, m.Call(uint64_t(0x0000000100000000))); 172014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(32, m.Call(uint64_t(0x0000000080001000))); 173014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(33, m.Call(uint64_t(0x0000000040000500))); 174014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(34, m.Call(uint64_t(0x0000000020000300))); 175014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(35, m.Call(uint64_t(0x0000000010000003))); 176014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(36, m.Call(uint64_t(0x0000000008050000))); 177014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(37, m.Call(uint64_t(0x0000000004006000))); 178014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(38, m.Call(uint64_t(0x0000000002000000))); 179014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(39, m.Call(uint64_t(0x00000000010000a0))); 180014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(40, m.Call(uint64_t(0x0000000000800c00))); 181014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(41, m.Call(uint64_t(0x0000000000400000))); 182014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(42, m.Call(uint64_t(0x000000000020000d))); 183014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(43, m.Call(uint64_t(0x0000000000100f00))); 184014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(44, m.Call(uint64_t(0x0000000000080000))); 185014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(45, m.Call(uint64_t(0x0000000000041000))); 186014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(46, m.Call(uint64_t(0x0000000000020020))); 187014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(47, m.Call(uint64_t(0x0000000000010300))); 188014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(48, m.Call(uint64_t(0x0000000000008040))); 189014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(49, m.Call(uint64_t(0x0000000000004005))); 190014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(50, m.Call(uint64_t(0x0000000000002050))); 191014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(51, m.Call(uint64_t(0x0000000000001700))); 192014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(52, m.Call(uint64_t(0x0000000000000870))); 193014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(53, m.Call(uint64_t(0x0000000000000405))); 194014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(54, m.Call(uint64_t(0x0000000000000203))); 195014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(55, m.Call(uint64_t(0x0000000000000101))); 196014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(56, m.Call(uint64_t(0x0000000000000089))); 197014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(57, m.Call(uint64_t(0x0000000000000041))); 198014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(58, m.Call(uint64_t(0x0000000000000022))); 199014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(59, m.Call(uint64_t(0x0000000000000013))); 200014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(60, m.Call(uint64_t(0x0000000000000008))); 201014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(61, m.Call(uint64_t(0x0000000000000004))); 202014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(62, m.Call(uint64_t(0x0000000000000002))); 203014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(63, m.Call(uint64_t(0x0000000000000001))); 204014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(64, m.Call(uint64_t(0x0000000000000000))); 205014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 206014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 207014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 208014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunWord64Ctz) { 209014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m(MachineType::Uint64()); 210014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!m.machine()->Word64Ctz().IsSupported()) { 211014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return; 212014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 213014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 214014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.AddNode(m.machine()->Word64Ctz().op(), m.Parameter(0))); 215014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 216014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(64, m.Call(uint64_t(0x0000000000000000))); 217014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(63, m.Call(uint64_t(0x8000000000000000))); 218014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(62, m.Call(uint64_t(0x4000000000000000))); 219014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(61, m.Call(uint64_t(0x2000000000000000))); 220014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(60, m.Call(uint64_t(0x1000000000000000))); 221014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(59, m.Call(uint64_t(0xa800000000000000))); 222014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(58, m.Call(uint64_t(0xf400000000000000))); 223014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(57, m.Call(uint64_t(0x6200000000000000))); 224014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(56, m.Call(uint64_t(0x9100000000000000))); 225014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(55, m.Call(uint64_t(0xcd80000000000000))); 226014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(54, m.Call(uint64_t(0x0940000000000000))); 227014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(53, m.Call(uint64_t(0xaf20000000000000))); 228014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(52, m.Call(uint64_t(0xac10000000000000))); 229014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(51, m.Call(uint64_t(0xe0b8000000000000))); 230014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(50, m.Call(uint64_t(0x9ce4000000000000))); 231014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(49, m.Call(uint64_t(0xc792000000000000))); 232014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(48, m.Call(uint64_t(0xb8f1000000000000))); 233014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(47, m.Call(uint64_t(0x3b9f800000000000))); 234014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(46, m.Call(uint64_t(0xdb4c400000000000))); 235014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(45, m.Call(uint64_t(0xe9a3200000000000))); 236014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(44, m.Call(uint64_t(0xfca6100000000000))); 237014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(43, m.Call(uint64_t(0x6c8a780000000000))); 238014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(42, m.Call(uint64_t(0x8ce5a40000000000))); 239014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(41, m.Call(uint64_t(0xcb7d020000000000))); 240014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(40, m.Call(uint64_t(0xcb4dc10000000000))); 241014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(39, m.Call(uint64_t(0xdfbec58000000000))); 242014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(38, m.Call(uint64_t(0x27a9db4000000000))); 243014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(37, m.Call(uint64_t(0xde3bcb2000000000))); 244014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(36, m.Call(uint64_t(0xd7e8a61000000000))); 245014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(35, m.Call(uint64_t(0x9afdbc8800000000))); 246014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(34, m.Call(uint64_t(0x9afdbc8400000000))); 247014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(33, m.Call(uint64_t(0x9afdbc8200000000))); 248014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(32, m.Call(uint64_t(0x9afdbc8100000000))); 249014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(31, m.Call(uint64_t(0x0000000080000000))); 250014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(30, m.Call(uint64_t(0x0000000040000000))); 251014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(29, m.Call(uint64_t(0x0000000020000000))); 252014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(28, m.Call(uint64_t(0x0000000010000000))); 253014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(27, m.Call(uint64_t(0x00000000a8000000))); 254014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(26, m.Call(uint64_t(0x00000000f4000000))); 255014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(25, m.Call(uint64_t(0x0000000062000000))); 256014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(24, m.Call(uint64_t(0x0000000091000000))); 257014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(23, m.Call(uint64_t(0x00000000cd800000))); 258014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(22, m.Call(uint64_t(0x0000000009400000))); 259014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(21, m.Call(uint64_t(0x00000000af200000))); 260014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(20, m.Call(uint64_t(0x00000000ac100000))); 261014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(19, m.Call(uint64_t(0x00000000e0b80000))); 262014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(18, m.Call(uint64_t(0x000000009ce40000))); 263014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(17, m.Call(uint64_t(0x00000000c7920000))); 264014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(16, m.Call(uint64_t(0x00000000b8f10000))); 265014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(15, m.Call(uint64_t(0x000000003b9f8000))); 266014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(14, m.Call(uint64_t(0x00000000db4c4000))); 267014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(13, m.Call(uint64_t(0x00000000e9a32000))); 268014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(12, m.Call(uint64_t(0x00000000fca61000))); 269014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(11, m.Call(uint64_t(0x000000006c8a7800))); 270014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(10, m.Call(uint64_t(0x000000008ce5a400))); 271014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(9, m.Call(uint64_t(0x00000000cb7d0200))); 272014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(8, m.Call(uint64_t(0x00000000cb4dc100))); 273014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(7, m.Call(uint64_t(0x00000000dfbec580))); 274014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(6, m.Call(uint64_t(0x0000000027a9db40))); 275014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(5, m.Call(uint64_t(0x00000000de3bcb20))); 276014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(4, m.Call(uint64_t(0x00000000d7e8a610))); 277014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(3, m.Call(uint64_t(0x000000009afdbc88))); 278014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(2, m.Call(uint64_t(0x000000009afdbc84))); 279014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(1, m.Call(uint64_t(0x000000009afdbc82))); 280014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(0, m.Call(uint64_t(0x000000009afdbc81))); 281014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 282014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 283014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 284014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunWord64Popcnt) { 285014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BufferedRawMachineAssemblerTester<int32_t> m(MachineType::Uint64()); 286014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!m.machine()->Word64Popcnt().IsSupported()) { 287014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return; 288014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 289014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 290014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.AddNode(m.machine()->Word64Popcnt().op(), m.Parameter(0))); 291014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 292014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(0, m.Call(uint64_t(0x0000000000000000))); 293014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(1, m.Call(uint64_t(0x0000000000000001))); 294014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(1, m.Call(uint64_t(0x8000000000000000))); 295014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(64, m.Call(uint64_t(0xffffffffffffffff))); 296014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(12, m.Call(uint64_t(0x000dc100000dc100))); 297014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(18, m.Call(uint64_t(0xe00dc100e00dc100))); 298014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(22, m.Call(uint64_t(0xe00dc103e00dc103))); 299014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(18, m.Call(uint64_t(0x000dc107000dc107))); 300014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 301014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif // V8_TARGET_ARCH_64_BIT 302014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 303014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic Node* Int32Input(RawMachineAssemblerTester<int32_t>* m, int index) { 305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch switch (index) { 306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 0: 307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return m->Parameter(0); 308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 1: 309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return m->Parameter(1); 310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 2: 311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return m->Int32Constant(0); 312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 3: 313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return m->Int32Constant(1); 314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 4: 315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return m->Int32Constant(-1); 316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 5: 317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return m->Int32Constant(0xff); 318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 6: 319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return m->Int32Constant(0x01234567); 320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 7: 321014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return m->Load(MachineType::Int32(), m->PointerConstant(NULL)); 322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch default: 323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return NULL; 324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(CodeGenInt32Binop) { 329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<void> m; 330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 331958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier const Operator* kOps[] = { 332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.machine()->Word32And(), m.machine()->Word32Or(), 333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.machine()->Word32Xor(), m.machine()->Word32Shl(), 334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.machine()->Word32Shr(), m.machine()->Word32Sar(), 335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.machine()->Word32Equal(), m.machine()->Int32Add(), 336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.machine()->Int32Sub(), m.machine()->Int32Mul(), 337958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier m.machine()->Int32MulHigh(), m.machine()->Int32Div(), 338958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier m.machine()->Uint32Div(), m.machine()->Int32Mod(), 339958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier m.machine()->Uint32Mod(), m.machine()->Uint32MulHigh(), 340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.machine()->Int32LessThan(), m.machine()->Int32LessThanOrEqual(), 341958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier m.machine()->Uint32LessThan(), m.machine()->Uint32LessThanOrEqual()}; 342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 343958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier for (size_t i = 0; i < arraysize(kOps); ++i) { 344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int j = 0; j < 8; j++) { 345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int k = 0; k < 8; k++) { 346014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m(MachineType::Int32(), 347014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType::Int32()); 348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* a = Int32Input(&m, j); 349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* b = Int32Input(&m, k); 350014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.AddNode(kOps[i], a, b)); 351014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.GenerateCode(); 352014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 353014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 354014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 355014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 356014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 357014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 358014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(CodeGenNop) { 359014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<void> m; 360014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.Int32Constant(0)); 361014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.GenerateCode(); 362014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 363014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 364014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 365014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#if V8_TARGET_ARCH_64_BIT 366014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochstatic Node* Int64Input(RawMachineAssemblerTester<int64_t>* m, int index) { 367014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch switch (index) { 368014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case 0: 369014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return m->Parameter(0); 370014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case 1: 371014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return m->Parameter(1); 372014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case 2: 373014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return m->Int64Constant(0); 374014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case 3: 375014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return m->Int64Constant(1); 376014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case 4: 377014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return m->Int64Constant(-1); 378014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case 5: 379014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return m->Int64Constant(0xff); 380014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case 6: 381014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return m->Int64Constant(0x0123456789abcdefLL); 382014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case 7: 383014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return m->Load(MachineType::Int64(), m->PointerConstant(NULL)); 384014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch default: 385014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return NULL; 386014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 387014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 388014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 389014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 390014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(CodeGenInt64Binop) { 391014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<void> m; 392014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 393014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch const Operator* kOps[] = { 394014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.machine()->Word64And(), m.machine()->Word64Or(), 395014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.machine()->Word64Xor(), m.machine()->Word64Shl(), 396014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.machine()->Word64Shr(), m.machine()->Word64Sar(), 397014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.machine()->Word64Equal(), m.machine()->Int64Add(), 398014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.machine()->Int64Sub(), m.machine()->Int64Mul(), m.machine()->Int64Div(), 399014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.machine()->Uint64Div(), m.machine()->Int64Mod(), 400014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.machine()->Uint64Mod(), m.machine()->Int64LessThan(), 401014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.machine()->Int64LessThanOrEqual(), m.machine()->Uint64LessThan(), 402014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.machine()->Uint64LessThanOrEqual()}; 403014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 404014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (size_t i = 0; i < arraysize(kOps); ++i) { 405014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (int j = 0; j < 8; j++) { 406014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (int k = 0; k < 8; k++) { 407014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int64_t> m(MachineType::Int64(), 408014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType::Int64()); 409014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* a = Int64Input(&m, j); 410014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* b = Int64Input(&m, k); 411014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.AddNode(kOps[i], a, b)); 412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.GenerateCode(); 413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 419014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunInt64AddWithOverflowP) { 420014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int64_t actual_val = -1; 421014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m; 422014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Int64BinopTester bt(&m); 423014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* add = m.Int64AddWithOverflow(bt.param0, bt.param1); 424014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* val = m.Projection(0, add); 425014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* ovf = m.Projection(1, add); 426014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.StoreToPointer(&actual_val, MachineRepresentation::kWord64, val); 427014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bt.AddReturn(ovf); 428014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_INT64_INPUTS(i) { 429014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_INT64_INPUTS(j) { 430014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int64_t expected_val; 431014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int expected_ovf = bits::SignedAddOverflow64(*i, *j, &expected_val); 432014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected_ovf, bt.call(*i, *j)); 433014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected_val, actual_val); 434014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 435014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 436014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 437014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 438014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 439014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunInt64AddWithOverflowImm) { 440014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int64_t actual_val = -1, expected_val = 0; 441014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_INT64_INPUTS(i) { 442014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch { 443014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m(MachineType::Int64()); 444014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* add = m.Int64AddWithOverflow(m.Int64Constant(*i), m.Parameter(0)); 445014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* val = m.Projection(0, add); 446014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* ovf = m.Projection(1, add); 447014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.StoreToPointer(&actual_val, MachineRepresentation::kWord64, val); 448014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(ovf); 449014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_INT64_INPUTS(j) { 450014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int expected_ovf = bits::SignedAddOverflow64(*i, *j, &expected_val); 451014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected_ovf, m.Call(*j)); 452014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected_val, actual_val); 453014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 454014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 455014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch { 456014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m(MachineType::Int64()); 457014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* add = m.Int64AddWithOverflow(m.Parameter(0), m.Int64Constant(*i)); 458014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* val = m.Projection(0, add); 459014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* ovf = m.Projection(1, add); 460014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.StoreToPointer(&actual_val, MachineRepresentation::kWord64, val); 461014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(ovf); 462014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_INT64_INPUTS(j) { 463014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int expected_ovf = bits::SignedAddOverflow64(*i, *j, &expected_val); 464014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected_ovf, m.Call(*j)); 465014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected_val, actual_val); 466014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 467014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 468014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_INT64_INPUTS(j) { 469014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m; 470014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* add = 471014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Int64AddWithOverflow(m.Int64Constant(*i), m.Int64Constant(*j)); 472014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* val = m.Projection(0, add); 473014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* ovf = m.Projection(1, add); 474014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.StoreToPointer(&actual_val, MachineRepresentation::kWord64, val); 475014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(ovf); 476014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int expected_ovf = bits::SignedAddOverflow64(*i, *j, &expected_val); 477014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected_ovf, m.Call()); 478014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected_val, actual_val); 479014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 480014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 481014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 482014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 483014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 484014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunInt64AddWithOverflowInBranchP) { 485014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int constant = 911777; 486014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineLabel blocka, blockb; 487014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m; 488014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Int64BinopTester bt(&m); 489014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* add = m.Int64AddWithOverflow(bt.param0, bt.param1); 490014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* ovf = m.Projection(1, add); 491014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Branch(ovf, &blocka, &blockb); 492014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Bind(&blocka); 493014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bt.AddReturn(m.Int64Constant(constant)); 494014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Bind(&blockb); 495014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* val = m.Projection(0, add); 496014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* truncated = m.TruncateInt64ToInt32(val); 497014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bt.AddReturn(truncated); 498014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_INT64_INPUTS(i) { 499014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_INT64_INPUTS(j) { 500014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int32_t expected = constant; 501014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int64_t result; 502014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!bits::SignedAddOverflow64(*i, *j, &result)) { 503014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch expected = static_cast<int32_t>(result); 504014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 505014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected, bt.call(*i, *j)); 506014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 507014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 508014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 509014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 510014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 511014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunInt64SubWithOverflowP) { 512014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int64_t actual_val = -1; 513014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m; 514014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Int64BinopTester bt(&m); 515014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* add = m.Int64SubWithOverflow(bt.param0, bt.param1); 516014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* val = m.Projection(0, add); 517014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* ovf = m.Projection(1, add); 518014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.StoreToPointer(&actual_val, MachineRepresentation::kWord64, val); 519014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bt.AddReturn(ovf); 520014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_INT64_INPUTS(i) { 521014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_INT64_INPUTS(j) { 522014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int64_t expected_val; 523014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int expected_ovf = bits::SignedSubOverflow64(*i, *j, &expected_val); 524014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected_ovf, bt.call(*i, *j)); 525014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected_val, actual_val); 526014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 527014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 528014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 529014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 530014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 531014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunInt64SubWithOverflowImm) { 532014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int64_t actual_val = -1, expected_val = 0; 533014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_INT64_INPUTS(i) { 534014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch { 535014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m(MachineType::Int64()); 536014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* add = m.Int64SubWithOverflow(m.Int64Constant(*i), m.Parameter(0)); 537014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* val = m.Projection(0, add); 538014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* ovf = m.Projection(1, add); 539014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.StoreToPointer(&actual_val, MachineRepresentation::kWord64, val); 540014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(ovf); 541014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_INT64_INPUTS(j) { 542014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int expected_ovf = bits::SignedSubOverflow64(*i, *j, &expected_val); 543014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected_ovf, m.Call(*j)); 544014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected_val, actual_val); 545014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 546014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 547014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch { 548014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m(MachineType::Int64()); 549014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* add = m.Int64SubWithOverflow(m.Parameter(0), m.Int64Constant(*i)); 550014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* val = m.Projection(0, add); 551014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* ovf = m.Projection(1, add); 552014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.StoreToPointer(&actual_val, MachineRepresentation::kWord64, val); 553014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(ovf); 554014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_INT64_INPUTS(j) { 555014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int expected_ovf = bits::SignedSubOverflow64(*j, *i, &expected_val); 556014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected_ovf, m.Call(*j)); 557014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected_val, actual_val); 558014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 559014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 560014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_INT64_INPUTS(j) { 561014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m; 562014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* add = 563014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Int64SubWithOverflow(m.Int64Constant(*i), m.Int64Constant(*j)); 564014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* val = m.Projection(0, add); 565014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* ovf = m.Projection(1, add); 566014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.StoreToPointer(&actual_val, MachineRepresentation::kWord64, val); 567014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(ovf); 568014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int expected_ovf = bits::SignedSubOverflow64(*i, *j, &expected_val); 569014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected_ovf, m.Call()); 570014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected_val, actual_val); 571014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 572014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 573014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 574014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 575014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 576014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunInt64SubWithOverflowInBranchP) { 577014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int constant = 911999; 578014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineLabel blocka, blockb; 579014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m; 580014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Int64BinopTester bt(&m); 581014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* sub = m.Int64SubWithOverflow(bt.param0, bt.param1); 582014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* ovf = m.Projection(1, sub); 583014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Branch(ovf, &blocka, &blockb); 584014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Bind(&blocka); 585014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bt.AddReturn(m.Int64Constant(constant)); 586014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Bind(&blockb); 587014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* val = m.Projection(0, sub); 588014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* truncated = m.TruncateInt64ToInt32(val); 589014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bt.AddReturn(truncated); 590014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_INT64_INPUTS(i) { 591014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_INT64_INPUTS(j) { 592014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int32_t expected = constant; 593014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int64_t result; 594014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!bits::SignedSubOverflow64(*i, *j, &result)) { 595014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch expected = static_cast<int32_t>(result); 596014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 597014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected, static_cast<int32_t>(bt.call(*i, *j))); 598014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 599014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 600014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 601014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 602014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 603014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// TODO(titzer): add tests that run 64-bit integer operations. 604014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif // V8_TARGET_ARCH_64_BIT 605014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 606014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunGoto) { 608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int constant = 99999; 610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 611014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineLabel next; 612b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Goto(&next); 613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&next); 614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Constant(constant)); 615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(constant, m.Call()); 617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunGotoMultiple) { 621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int constant = 9999977; 623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 624014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineLabel labels[10]; 625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (size_t i = 0; i < arraysize(labels); i++) { 626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Goto(&labels[i]); 627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&labels[i]); 628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Constant(constant)); 630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(constant, m.Call()); 632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunBranch) { 636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int constant = 999777; 638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 639014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineLabel blocka, blockb; 640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Branch(m.Int32Constant(0), &blocka, &blockb); 641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blocka); 642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Constant(0 - constant)); 643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blockb); 644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Constant(constant)); 645b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(constant, m.Call()); 647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunDiamond2) { 651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int constant = 995666; 654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 655014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineLabel blocka, blockb, end; 656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Branch(m.Int32Constant(0), &blocka, &blockb); 657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blocka); 658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Goto(&end); 659b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blockb); 660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Goto(&end); 661b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&end); 662b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Constant(constant)); 663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(constant, m.Call()); 665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunLoop) { 669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int constant = 999555; 671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 672014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineLabel header, body, exit; 673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Goto(&header); 674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&header); 675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Branch(m.Int32Constant(0), &body, &exit); 676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&body); 677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Goto(&header); 678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&exit); 679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Constant(constant)); 680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(constant, m.Call()); 682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <typename R> 686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic void BuildDiamondPhi(RawMachineAssemblerTester<R>* m, Node* cond_node, 687014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineRepresentation rep, Node* true_node, 688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* false_node) { 689014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineLabel blocka, blockb, end; 690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m->Branch(cond_node, &blocka, &blockb); 691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m->Bind(&blocka); 692014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m->Goto(&end); 693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m->Bind(&blockb); 694014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m->Goto(&end); 695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 696014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m->Bind(&end); 697014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* phi = m->Phi(rep, true_node, false_node); 698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m->Return(phi); 699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunDiamondPhiConst) { 703014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m(MachineType::Int32()); 704b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int false_val = 0xFF666; 705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int true_val = 0x00DDD; 706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* true_node = m.Int32Constant(true_val); 707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* false_node = m.Int32Constant(false_val); 708014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BuildDiamondPhi(&m, m.Parameter(0), MachineRepresentation::kWord32, true_node, 709014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch false_node); 710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(false_val, m.Call(0)); 711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(true_val, m.Call(1)); 712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 714b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 715b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunDiamondPhiNumber) { 716014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<Object*> m(MachineType::Int32()); 717b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double false_val = -11.1; 718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double true_val = 200.1; 719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* true_node = m.NumberConstant(true_val); 720b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* false_node = m.NumberConstant(false_val); 721014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BuildDiamondPhi(&m, m.Parameter(0), MachineRepresentation::kTagged, true_node, 722014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch false_node); 723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.CheckNumber(false_val, m.Call(0)); 724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.CheckNumber(true_val, m.Call(1)); 725b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 726b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 727b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunDiamondPhiString) { 729014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<Object*> m(MachineType::Int32()); 730b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const char* false_val = "false"; 731b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const char* true_val = "true"; 732b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* true_node = m.StringConstant(true_val); 733b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* false_node = m.StringConstant(false_val); 734014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BuildDiamondPhi(&m, m.Parameter(0), MachineRepresentation::kTagged, true_node, 735014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch false_node); 736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.CheckString(false_val, m.Call(0)); 737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.CheckString(true_val, m.Call(1)); 738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 739b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunDiamondPhiParam) { 742014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m( 743014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType::Int32(), MachineType::Int32(), MachineType::Int32()); 744014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BuildDiamondPhi(&m, m.Parameter(0), MachineRepresentation::kWord32, 745014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Parameter(1), m.Parameter(2)); 746b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t c1 = 0x260cb75a; 747b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t c2 = 0xcd3e9c8b; 748b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int result = m.Call(0, c1, c2); 749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(c2, result); 750b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = m.Call(1, c1, c2); 751b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(c1, result); 752b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunLoopPhiConst) { 756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int true_val = 0x44000; 758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int false_val = 0x00888; 759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* cond_node = m.Int32Constant(0); 761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* true_node = m.Int32Constant(true_val); 762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* false_node = m.Int32Constant(false_val); 763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // x = false_val; while(false) { x = true_val; } return x; 765014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineLabel body, header, end; 766b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 767b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Goto(&header); 768b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&header); 769014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* phi = m.Phi(MachineRepresentation::kWord32, false_node, true_node); 770014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Branch(cond_node, &body, &end); 771b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&body); 772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Goto(&header); 773014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Bind(&end); 774b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(phi); 775b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 776b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(false_val, m.Call()); 777b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 778b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunLoopPhiParam) { 781014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m( 782014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType::Int32(), MachineType::Int32(), MachineType::Int32()); 783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 784014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineLabel blocka, blockb, end; 785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Goto(&blocka); 787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blocka); 789014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* phi = 790014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Phi(MachineRepresentation::kWord32, m.Parameter(1), m.Parameter(2)); 791014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* cond = 792014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Phi(MachineRepresentation::kWord32, m.Parameter(0), m.Int32Constant(0)); 793014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Branch(cond, &blockb, &end); 794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blockb); 796b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Goto(&blocka); 797b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 798014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Bind(&end); 799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(phi); 800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t c1 = 0xa81903b4; 802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t c2 = 0x5a1207da; 803b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int result = m.Call(0, c1, c2); 804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(c1, result); 805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = m.Call(1, c1, c2); 806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(c2, result); 807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 808b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunLoopPhiInduction) { 811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 813b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int false_val = 0x10777; 814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // x = false_val; while(false) { x++; } return x; 816014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineLabel header, body, end; 817b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* false_node = m.Int32Constant(false_val); 818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 819b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Goto(&header); 820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 821b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&header); 822014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* phi = m.Phi(MachineRepresentation::kWord32, false_node, false_node); 823014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Branch(m.Int32Constant(0), &body, &end); 824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&body); 826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* add = m.Int32Add(phi, m.Int32Constant(1)); 827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch phi->ReplaceInput(1, add); 828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Goto(&header); 829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 830014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Bind(&end); 831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(phi); 832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(false_val, m.Call()); 834b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 835b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 836b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 837b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunLoopIncrement) { 838b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 839b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Int32BinopTester bt(&m); 840b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 841b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // x = 0; while(x ^ param) { x++; } return x; 842014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineLabel header, body, end; 843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* zero = m.Int32Constant(0); 844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Goto(&header); 846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&header); 848014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* phi = m.Phi(MachineRepresentation::kWord32, zero, zero); 849014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Branch(m.WordXor(phi, bt.param0), &body, &end); 850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&body); 852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch phi->ReplaceInput(1, m.Int32Add(phi, m.Int32Constant(1))); 853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Goto(&header); 854b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 855014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Bind(&end); 856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn(phi); 857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(11, bt.call(11, 0)); 859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(110, bt.call(110, 0)); 860b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(176, bt.call(176, 0)); 861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunLoopIncrement2) { 865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 866b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Int32BinopTester bt(&m); 867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // x = 0; while(x < param) { x++; } return x; 869014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineLabel header, body, end; 870b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* zero = m.Int32Constant(0); 871b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 872b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Goto(&header); 873b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 874b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&header); 875014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* phi = m.Phi(MachineRepresentation::kWord32, zero, zero); 876014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Branch(m.Int32LessThan(phi, bt.param0), &body, &end); 877b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 878b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&body); 879b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch phi->ReplaceInput(1, m.Int32Add(phi, m.Int32Constant(1))); 880b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Goto(&header); 881b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 882014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Bind(&end); 883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn(phi); 884b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 885b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(11, bt.call(11, 0)); 886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(110, bt.call(110, 0)); 887b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(176, bt.call(176, 0)); 888b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(0, bt.call(-200, 0)); 889b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 890b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 891b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 892b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunLoopIncrement3) { 893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Int32BinopTester bt(&m); 895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // x = 0; while(x < param) { x++; } return x; 897014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineLabel header, body, end; 898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* zero = m.Int32Constant(0); 899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 900b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Goto(&header); 901b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 902b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&header); 903014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* phi = m.Phi(MachineRepresentation::kWord32, zero, zero); 904014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Branch(m.Uint32LessThan(phi, bt.param0), &body, &end); 905b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 906b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&body); 907b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch phi->ReplaceInput(1, m.Int32Add(phi, m.Int32Constant(1))); 908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Goto(&header); 909b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 910014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Bind(&end); 911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn(phi); 912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(11, bt.call(11, 0)); 914b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(110, bt.call(110, 0)); 915b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(176, bt.call(176, 0)); 916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(200, bt.call(200, 0)); 917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 918b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 919b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 920b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunLoopDecrement) { 921b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 922b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Int32BinopTester bt(&m); 923b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 924b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // x = param; while(x) { x--; } return x; 925014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineLabel header, body, end; 926b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 927b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Goto(&header); 928b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 929b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&header); 930014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* phi = 931014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Phi(MachineRepresentation::kWord32, bt.param0, m.Int32Constant(0)); 932014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Branch(phi, &body, &end); 933b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 934b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&body); 935b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch phi->ReplaceInput(1, m.Int32Sub(phi, m.Int32Constant(1))); 936b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Goto(&header); 937b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 938014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Bind(&end); 939b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn(phi); 940b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 941b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(0, bt.call(11, 0)); 942b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(0, bt.call(110, 0)); 943b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(0, bt.call(197, 0)); 944b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 945b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 946b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 947014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunLoopIncrementFloat32) { 948014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m; 949014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 950014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // x = -3.0f; while(x < 10f) { x = x + 0.5f; } return (int) (double) x; 951014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineLabel header, body, end; 952014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* minus_3 = m.Float32Constant(-3.0f); 953014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* ten = m.Float32Constant(10.0f); 954014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 955014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Goto(&header); 956014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 957014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Bind(&header); 958014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* phi = m.Phi(MachineRepresentation::kFloat32, minus_3, ten); 959014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Branch(m.Float32LessThan(phi, ten), &body, &end); 960014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 961014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Bind(&body); 962014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch phi->ReplaceInput(1, m.Float32Add(phi, m.Float32Constant(0.5f))); 963014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Goto(&header); 964014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 965014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Bind(&end); 966014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.ChangeFloat64ToInt32(m.ChangeFloat32ToFloat64(phi))); 967014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 968014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(10, m.Call()); 969014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 970014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 971014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 972b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunLoopIncrementFloat64) { 973b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 974b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 975b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // x = -3.0; while(x < 10) { x = x + 0.5; } return (int) x; 976014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineLabel header, body, end; 977b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* minus_3 = m.Float64Constant(-3.0); 978b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* ten = m.Float64Constant(10.0); 979b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 980b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Goto(&header); 981b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 982b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&header); 983014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* phi = m.Phi(MachineRepresentation::kFloat64, minus_3, ten); 984014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Branch(m.Float64LessThan(phi, ten), &body, &end); 985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&body); 987b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch phi->ReplaceInput(1, m.Float64Add(phi, m.Float64Constant(0.5))); 988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Goto(&header); 989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 990014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Bind(&end); 991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.ChangeFloat64ToInt32(phi)); 992b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(10, m.Call()); 994b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 995b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 996b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 997014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunSwitch1) { 998014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m; 999014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1000014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int constant = 11223344; 1001014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1002014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineLabel block0, block1, def, end; 1003014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineLabel* case_labels[] = {&block0, &block1}; 1004014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int32_t case_values[] = {0, 1}; 1005014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Switch(m.Int32Constant(0), &def, case_values, case_labels, 1006014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch arraysize(case_labels)); 1007014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Bind(&block0); 1008014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Goto(&end); 1009014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Bind(&block1); 1010014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Goto(&end); 1011014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Bind(&def); 1012014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Goto(&end); 1013014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Bind(&end); 1014014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.Int32Constant(constant)); 1015014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1016014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(constant, m.Call()); 1017014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 1018014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1019014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1020014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunSwitch2) { 1021014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m(MachineType::Int32()); 1022014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1023014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineLabel blocka, blockb, blockc; 1024014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineLabel* case_labels[] = {&blocka, &blockb}; 1025014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int32_t case_values[] = {std::numeric_limits<int32_t>::min(), 1026014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch std::numeric_limits<int32_t>::max()}; 1027014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Switch(m.Parameter(0), &blockc, case_values, case_labels, 1028014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch arraysize(case_labels)); 1029014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Bind(&blocka); 1030014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.Int32Constant(-1)); 1031014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Bind(&blockb); 1032014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.Int32Constant(1)); 1033014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Bind(&blockc); 1034014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.Int32Constant(0)); 1035014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1036014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(1, m.Call(std::numeric_limits<int32_t>::max())); 1037014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(-1, m.Call(std::numeric_limits<int32_t>::min())); 1038014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (int i = -100; i < 100; i += 25) { 1039014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(0, m.Call(i)); 1040014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1041014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 1042014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1043014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1044014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunSwitch3) { 1045014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m(MachineType::Int32()); 1046014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1047014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineLabel blocka, blockb, blockc; 1048014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineLabel* case_labels[] = {&blocka, &blockb}; 1049014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int32_t case_values[] = {std::numeric_limits<int32_t>::min() + 0, 1050014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch std::numeric_limits<int32_t>::min() + 1}; 1051014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Switch(m.Parameter(0), &blockc, case_values, case_labels, 1052014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch arraysize(case_labels)); 1053014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Bind(&blocka); 1054014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.Int32Constant(0)); 1055014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Bind(&blockb); 1056014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.Int32Constant(1)); 1057014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Bind(&blockc); 1058014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.Int32Constant(2)); 1059014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1060014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(0, m.Call(std::numeric_limits<int32_t>::min() + 0)); 1061014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(1, m.Call(std::numeric_limits<int32_t>::min() + 1)); 1062014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (int i = -100; i < 100; i += 25) { 1063014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(2, m.Call(i)); 1064014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1065014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 1066014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1067014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1068014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunSwitch4) { 1069014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m(MachineType::Int32()); 1070014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1071014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch const size_t kNumCases = 512; 1072014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch const size_t kNumValues = kNumCases + 1; 1073014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int32_t values[kNumValues]; 1074014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.main_isolate()->random_number_generator()->NextBytes(values, 1075014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch sizeof(values)); 1076014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineLabel end, def; 1077014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int32_t case_values[kNumCases]; 1078014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineLabel* case_labels[kNumCases]; 1079014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* results[kNumValues]; 1080014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (size_t i = 0; i < kNumCases; ++i) { 1081014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case_values[i] = static_cast<int32_t>(i); 1082014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case_labels[i] = 1083014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch new (m.main_zone()->New(sizeof(RawMachineLabel))) RawMachineLabel; 1084014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1085014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Switch(m.Parameter(0), &def, case_values, case_labels, 1086014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch arraysize(case_labels)); 1087014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (size_t i = 0; i < kNumCases; ++i) { 1088014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Bind(case_labels[i]); 1089014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch results[i] = m.Int32Constant(values[i]); 1090014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Goto(&end); 1091014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1092014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Bind(&def); 1093014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch results[kNumCases] = m.Int32Constant(values[kNumCases]); 1094014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Goto(&end); 1095014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Bind(&end); 1096014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch const int num_results = static_cast<int>(arraysize(results)); 1097014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* phi = 1098014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.AddNode(m.common()->Phi(MachineRepresentation::kWord32, num_results), 1099014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch num_results, results); 1100014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(phi); 1101014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1102014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (size_t i = 0; i < kNumValues; ++i) { 1103014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(values[i], m.Call(static_cast<int>(i))); 1104014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1105014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 1106014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1107014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunLoadInt32) { 1109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 1110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t p1 = 0; // loads directly from this location. 1112014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.LoadFromPointer(&p1, MachineType::Int32())); 1113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(i) { 1115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch p1 = *i; 1116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(p1, m.Call()); 1117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunLoadInt32Offset) { 1122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t p1 = 0; // loads directly from this location. 1123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t offsets[] = {-2000000, -100, -101, 1, 3, 1125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7, 120, 2000, 2000000000, 0xff}; 1126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (size_t i = 0; i < arraysize(offsets); i++) { 1128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 1129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t offset = offsets[i]; 1130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch byte* pointer = reinterpret_cast<byte*>(&p1) - offset; 1131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // generate load [#base + #index] 1132014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.LoadFromPointer(pointer, MachineType::Int32(), offset)); 1133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(j) { 1135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch p1 = *j; 1136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(p1, m.Call()); 1137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1142014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunLoadStoreFloat32Offset) { 1143014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch float p1 = 0.0f; // loads directly from this location. 1144014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch float p2 = 0.0f; // and stores directly into this location. 1145014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1146014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_INT32_INPUTS(i) { 1147014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int32_t magic = 0x2342aabb + *i * 3; 1148014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m; 1149014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int32_t offset = *i; 1150014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch byte* from = reinterpret_cast<byte*>(&p1) - offset; 1151014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch byte* to = reinterpret_cast<byte*>(&p2) - offset; 1152014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // generate load [#base + #index] 1153014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* load = m.Load(MachineType::Float32(), m.PointerConstant(from), 1154014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.IntPtrConstant(offset)); 1155014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Store(MachineRepresentation::kFloat32, m.PointerConstant(to), 1156014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.IntPtrConstant(offset), load, kNoWriteBarrier); 1157014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.Int32Constant(magic)); 1158014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1159014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT32_INPUTS(j) { 1160014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch p1 = *j; 1161014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch p2 = *j - 5; 1162014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(magic, m.Call()); 1163014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CheckDoubleEq(p1, p2); 1164014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1165014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1166014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 1167014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1168014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunLoadStoreFloat64Offset) { 1170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double p1 = 0; // loads directly from this location. 1171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double p2 = 0; // and stores directly into this location. 1172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(i) { 1174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t magic = 0x2342aabb + *i * 3; 1175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 1176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t offset = *i; 1177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch byte* from = reinterpret_cast<byte*>(&p1) - offset; 1178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch byte* to = reinterpret_cast<byte*>(&p2) - offset; 1179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // generate load [#base + #index] 1180014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* load = m.Load(MachineType::Float64(), m.PointerConstant(from), 1181014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.IntPtrConstant(offset)); 1182014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Store(MachineRepresentation::kFloat64, m.PointerConstant(to), 1183014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.IntPtrConstant(offset), load, kNoWriteBarrier); 1184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Constant(magic)); 1185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_FLOAT64_INPUTS(j) { 1187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch p1 = *j; 1188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch p2 = *j - 5; 1189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(magic, m.Call()); 1190014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CheckDoubleEq(p1, p2); 1191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunInt32AddP) { 1197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 1198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Int32BinopTester bt(&m); 1199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn(m.Int32Add(bt.param0, bt.param1)); 1201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(i) { 1203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(j) { 1204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Use uint32_t because signed overflow is UB in C. 1205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int expected = static_cast<int32_t>(*i + *j); 1206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, bt.call(*i, *j)); 1207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1212958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierTEST(RunInt32AddAndWord32EqualP) { 1213958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier { 1214014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m( 1215014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType::Int32(), MachineType::Int32(), MachineType::Int32()); 1216958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier m.Return(m.Int32Add(m.Parameter(0), 1217958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier m.Word32Equal(m.Parameter(1), m.Parameter(2)))); 1218958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FOR_INT32_INPUTS(i) { 1219958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FOR_INT32_INPUTS(j) { 1220958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FOR_INT32_INPUTS(k) { 1221958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Use uint32_t because signed overflow is UB in C. 1222958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int32_t const expected = 1223958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier bit_cast<int32_t>(bit_cast<uint32_t>(*i) + (*j == *k)); 1224958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier CHECK_EQ(expected, m.Call(*i, *j, *k)); 1225958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1226958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1227958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1228958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1229958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier { 1230014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m( 1231014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType::Int32(), MachineType::Int32(), MachineType::Int32()); 1232958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier m.Return(m.Int32Add(m.Word32Equal(m.Parameter(0), m.Parameter(1)), 1233958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier m.Parameter(2))); 1234958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FOR_INT32_INPUTS(i) { 1235958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FOR_INT32_INPUTS(j) { 1236958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FOR_INT32_INPUTS(k) { 1237958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Use uint32_t because signed overflow is UB in C. 1238958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int32_t const expected = 1239958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier bit_cast<int32_t>((*i == *j) + bit_cast<uint32_t>(*k)); 1240958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier CHECK_EQ(expected, m.Call(*i, *j, *k)); 1241958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1242958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1243958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1244958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1245958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 1246958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1247958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1248958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierTEST(RunInt32AddAndWord32EqualImm) { 1249958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier { 1250958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FOR_INT32_INPUTS(i) { 1251014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m(MachineType::Int32(), 1252014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType::Int32()); 1253958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier m.Return(m.Int32Add(m.Int32Constant(*i), 1254958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier m.Word32Equal(m.Parameter(0), m.Parameter(1)))); 1255958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FOR_INT32_INPUTS(j) { 1256958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FOR_INT32_INPUTS(k) { 1257958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Use uint32_t because signed overflow is UB in C. 1258958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int32_t const expected = 1259958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier bit_cast<int32_t>(bit_cast<uint32_t>(*i) + (*j == *k)); 1260958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier CHECK_EQ(expected, m.Call(*j, *k)); 1261958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1262958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1263958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1264958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1265958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier { 1266958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FOR_INT32_INPUTS(i) { 1267014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m(MachineType::Int32(), 1268014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType::Int32()); 1269958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier m.Return(m.Int32Add(m.Word32Equal(m.Int32Constant(*i), m.Parameter(0)), 1270958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier m.Parameter(1))); 1271958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FOR_INT32_INPUTS(j) { 1272958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FOR_INT32_INPUTS(k) { 1273958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Use uint32_t because signed overflow is UB in C. 1274958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int32_t const expected = 1275958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier bit_cast<int32_t>((*i == *j) + bit_cast<uint32_t>(*k)); 1276958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier CHECK_EQ(expected, m.Call(*j, *k)); 1277958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1278958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1279958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1280958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1281958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 1282958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1283958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1284958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierTEST(RunInt32AddAndWord32NotEqualP) { 1285958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier { 1286014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m( 1287014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType::Int32(), MachineType::Int32(), MachineType::Int32()); 1288958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier m.Return(m.Int32Add(m.Parameter(0), 1289958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier m.Word32NotEqual(m.Parameter(1), m.Parameter(2)))); 1290958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FOR_INT32_INPUTS(i) { 1291958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FOR_INT32_INPUTS(j) { 1292958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FOR_INT32_INPUTS(k) { 1293958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Use uint32_t because signed overflow is UB in C. 1294958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int32_t const expected = 1295958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier bit_cast<int32_t>(bit_cast<uint32_t>(*i) + (*j != *k)); 1296958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier CHECK_EQ(expected, m.Call(*i, *j, *k)); 1297958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1298958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1299958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1300958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1301958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier { 1302014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m( 1303014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType::Int32(), MachineType::Int32(), MachineType::Int32()); 1304958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier m.Return(m.Int32Add(m.Word32NotEqual(m.Parameter(0), m.Parameter(1)), 1305958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier m.Parameter(2))); 1306958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FOR_INT32_INPUTS(i) { 1307958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FOR_INT32_INPUTS(j) { 1308958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FOR_INT32_INPUTS(k) { 1309958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Use uint32_t because signed overflow is UB in C. 1310958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int32_t const expected = 1311958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier bit_cast<int32_t>((*i != *j) + bit_cast<uint32_t>(*k)); 1312958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier CHECK_EQ(expected, m.Call(*i, *j, *k)); 1313958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1314958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1315958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1316958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1317958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 1318958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1319958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1320958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierTEST(RunInt32AddAndWord32NotEqualImm) { 1321958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier { 1322958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FOR_INT32_INPUTS(i) { 1323014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m(MachineType::Int32(), 1324014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType::Int32()); 1325958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier m.Return(m.Int32Add(m.Int32Constant(*i), 1326958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier m.Word32NotEqual(m.Parameter(0), m.Parameter(1)))); 1327958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FOR_INT32_INPUTS(j) { 1328958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FOR_INT32_INPUTS(k) { 1329958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Use uint32_t because signed overflow is UB in C. 1330958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int32_t const expected = 1331958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier bit_cast<int32_t>(bit_cast<uint32_t>(*i) + (*j != *k)); 1332958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier CHECK_EQ(expected, m.Call(*j, *k)); 1333958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1334958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1335958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1336958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1337958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier { 1338958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FOR_INT32_INPUTS(i) { 1339014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m(MachineType::Int32(), 1340014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType::Int32()); 1341958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier m.Return(m.Int32Add(m.Word32NotEqual(m.Int32Constant(*i), m.Parameter(0)), 1342958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier m.Parameter(1))); 1343958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FOR_INT32_INPUTS(j) { 1344958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FOR_INT32_INPUTS(k) { 1345958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Use uint32_t because signed overflow is UB in C. 1346958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int32_t const expected = 1347958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier bit_cast<int32_t>((*i != *j) + bit_cast<uint32_t>(*k)); 1348958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier CHECK_EQ(expected, m.Call(*j, *k)); 1349958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1350958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1351958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1352958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1353958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 1354958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1355958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunInt32AddAndWord32SarP) { 1357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 1358014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m( 1359014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType::Uint32(), MachineType::Int32(), MachineType::Uint32()); 1360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Add(m.Parameter(0), 1361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Word32Sar(m.Parameter(1), m.Parameter(2)))); 1362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 1363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(j) { 1364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_SHIFTS(shift) { 1365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Use uint32_t because signed overflow is UB in C. 1366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t expected = *i + (*j >> shift); 1367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, m.Call(*i, *j, shift)); 1368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 1373014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m( 1374014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType::Int32(), MachineType::Uint32(), MachineType::Uint32()); 1375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Add(m.Word32Sar(m.Parameter(0), m.Parameter(1)), 1376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Parameter(2))); 1377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(i) { 1378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_SHIFTS(shift) { 1379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(k) { 1380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Use uint32_t because signed overflow is UB in C. 1381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t expected = (*i >> shift) + *k; 1382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, m.Call(*i, shift, *k)); 1383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunInt32AddAndWord32ShlP) { 1391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 1392014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m( 1393014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType::Uint32(), MachineType::Int32(), MachineType::Uint32()); 1394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Add(m.Parameter(0), 1395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Word32Shl(m.Parameter(1), m.Parameter(2)))); 1396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 1397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(j) { 1398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_SHIFTS(shift) { 1399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Use uint32_t because signed overflow is UB in C. 1400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t expected = *i + (*j << shift); 1401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, m.Call(*i, *j, shift)); 1402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 1407014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m( 1408014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType::Int32(), MachineType::Uint32(), MachineType::Uint32()); 1409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Add(m.Word32Shl(m.Parameter(0), m.Parameter(1)), 1410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Parameter(2))); 1411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(i) { 1412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_SHIFTS(shift) { 1413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(k) { 1414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Use uint32_t because signed overflow is UB in C. 1415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t expected = (*i << shift) + *k; 1416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, m.Call(*i, shift, *k)); 1417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunInt32AddAndWord32ShrP) { 1425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 1426014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m( 1427014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType::Uint32(), MachineType::Uint32(), MachineType::Uint32()); 1428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Add(m.Parameter(0), 1429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Word32Shr(m.Parameter(1), m.Parameter(2)))); 1430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 1431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(j) { 1432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_SHIFTS(shift) { 1433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Use uint32_t because signed overflow is UB in C. 1434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t expected = *i + (*j >> shift); 1435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, m.Call(*i, *j, shift)); 1436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 1441014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m( 1442014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType::Uint32(), MachineType::Uint32(), MachineType::Uint32()); 1443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Add(m.Word32Shr(m.Parameter(0), m.Parameter(1)), 1444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Parameter(2))); 1445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 1446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_SHIFTS(shift) { 1447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(k) { 1448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Use uint32_t because signed overflow is UB in C. 1449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t expected = (*i >> shift) + *k; 1450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, m.Call(*i, shift, *k)); 1451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunInt32AddInBranch) { 1459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int32_t constant = 987654321; 1460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 1461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 1462014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Int32BinopTester bt(&m); 1463014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineLabel blocka, blockb; 1464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Branch( 1465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Word32Equal(m.Int32Add(bt.param0, bt.param1), m.Int32Constant(0)), 1466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch &blocka, &blockb); 1467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blocka); 1468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn(m.Int32Constant(constant)); 1469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blockb); 1470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn(m.Int32Constant(0 - constant)); 1471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 1472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(j) { 1473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t expected = (*i + *j) == 0 ? constant : 0 - constant; 1474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, bt.call(*i, *j)); 1475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 1479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 1480014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Int32BinopTester bt(&m); 1481014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineLabel blocka, blockb; 1482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Branch( 1483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Word32NotEqual(m.Int32Add(bt.param0, bt.param1), m.Int32Constant(0)), 1484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch &blocka, &blockb); 1485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blocka); 1486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn(m.Int32Constant(constant)); 1487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blockb); 1488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn(m.Int32Constant(0 - constant)); 1489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 1490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(j) { 1491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t expected = (*i + *j) != 0 ? constant : 0 - constant; 1492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, bt.call(*i, *j)); 1493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 1497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 1498014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32()); 1499014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineLabel blocka, blockb; 1500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Branch(m.Word32Equal(m.Int32Add(m.Int32Constant(*i), m.Parameter(0)), 1501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Int32Constant(0)), 1502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch &blocka, &blockb); 1503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blocka); 1504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Constant(constant)); 1505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blockb); 1506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Constant(0 - constant)); 1507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(j) { 1508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t expected = (*i + *j) == 0 ? constant : 0 - constant; 1509014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected, m.Call(*j)); 1510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 1514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 1515014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32()); 1516014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineLabel blocka, blockb; 1517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Branch(m.Word32NotEqual(m.Int32Add(m.Int32Constant(*i), m.Parameter(0)), 1518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Int32Constant(0)), 1519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch &blocka, &blockb); 1520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blocka); 1521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Constant(constant)); 1522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blockb); 1523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Constant(0 - constant)); 1524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(j) { 1525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t expected = (*i + *j) != 0 ? constant : 0 - constant; 1526014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected, m.Call(*j)); 1527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 1531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<void> m; 1532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const Operator* shops[] = {m.machine()->Word32Sar(), 1533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.machine()->Word32Shl(), 1534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.machine()->Word32Shr()}; 1535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (size_t n = 0; n < arraysize(shops); n++) { 1536014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m( 1537014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType::Uint32(), MachineType::Int32(), MachineType::Uint32()); 1538014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineLabel blocka, blockb; 1539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Branch(m.Word32Equal(m.Int32Add(m.Parameter(0), 1540014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.AddNode(shops[n], m.Parameter(1), 1541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Parameter(2))), 1542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Int32Constant(0)), 1543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch &blocka, &blockb); 1544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blocka); 1545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Constant(constant)); 1546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blockb); 1547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Constant(0 - constant)); 1548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 1549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(j) { 1550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_SHIFTS(shift) { 1551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t right; 1552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch switch (shops[n]->opcode()) { 1553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch default: 1554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UNREACHABLE(); 1555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case IrOpcode::kWord32Sar: 1556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch right = *j >> shift; 1557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 1558b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case IrOpcode::kWord32Shl: 1559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch right = *j << shift; 1560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 1561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case IrOpcode::kWord32Shr: 1562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch right = static_cast<uint32_t>(*j) >> shift; 1563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 1564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t expected = ((*i + right) == 0) ? constant : 0 - constant; 1566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, m.Call(*i, *j, shift)); 1567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunInt32AddInComparison) { 1576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 1577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 1578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Uint32BinopTester bt(&m); 1579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn( 1580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Word32Equal(m.Int32Add(bt.param0, bt.param1), m.Int32Constant(0))); 1581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 1582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(j) { 1583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t expected = (*i + *j) == 0; 1584014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected, bt.call(*i, *j)); 1585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 1589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 1590b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Uint32BinopTester bt(&m); 1591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn( 1592b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Word32Equal(m.Int32Constant(0), m.Int32Add(bt.param0, bt.param1))); 1593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 1594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(j) { 1595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t expected = (*i + *j) == 0; 1596014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected, bt.call(*i, *j)); 1597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1599b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1600b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 1601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 1602014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32()); 1603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Word32Equal(m.Int32Add(m.Int32Constant(*i), m.Parameter(0)), 1604b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Int32Constant(0))); 1605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(j) { 1606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t expected = (*i + *j) == 0; 1607014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected, m.Call(*j)); 1608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 1612b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 1613014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32()); 1614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Word32Equal(m.Int32Add(m.Parameter(0), m.Int32Constant(*i)), 1615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Int32Constant(0))); 1616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(j) { 1617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t expected = (*j + *i) == 0; 1618014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected, m.Call(*j)); 1619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 1623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<void> m; 1624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const Operator* shops[] = {m.machine()->Word32Sar(), 1625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.machine()->Word32Shl(), 1626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.machine()->Word32Shr()}; 1627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (size_t n = 0; n < arraysize(shops); n++) { 1628014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m( 1629014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType::Uint32(), MachineType::Int32(), MachineType::Uint32()); 1630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Word32Equal( 1631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Int32Add(m.Parameter(0), 1632014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.AddNode(shops[n], m.Parameter(1), m.Parameter(2))), 1633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Int32Constant(0))); 1634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 1635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(j) { 1636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_SHIFTS(shift) { 1637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t right; 1638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch switch (shops[n]->opcode()) { 1639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch default: 1640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UNREACHABLE(); 1641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case IrOpcode::kWord32Sar: 1642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch right = *j >> shift; 1643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 1644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case IrOpcode::kWord32Shl: 1645b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch right = *j << shift; 1646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 1647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case IrOpcode::kWord32Shr: 1648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch right = static_cast<uint32_t>(*j) >> shift; 1649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 1650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t expected = (*i + right) == 0; 1652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, m.Call(*i, *j, shift)); 1653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1659b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1661b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunInt32SubP) { 1662b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 1663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Uint32BinopTester bt(&m); 1664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Sub(bt.param0, bt.param1)); 1666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 1668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(j) { 1669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t expected = static_cast<int32_t>(*i - *j); 1670014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected, bt.call(*i, *j)); 1671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunInt32SubImm) { 1677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 1678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 1679014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32()); 1680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Sub(m.Int32Constant(*i), m.Parameter(0))); 1681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(j) { 1682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t expected = *i - *j; 1683014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected, m.Call(*j)); 1684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 1688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 1689014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32()); 1690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Sub(m.Parameter(0), m.Int32Constant(*i))); 1691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(j) { 1692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t expected = *j - *i; 1693014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected, m.Call(*j)); 1694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunInt32SubAndWord32SarP) { 1701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 1702014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m( 1703014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType::Uint32(), MachineType::Int32(), MachineType::Uint32()); 1704b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Sub(m.Parameter(0), 1705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Word32Sar(m.Parameter(1), m.Parameter(2)))); 1706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 1707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(j) { 1708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_SHIFTS(shift) { 1709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t expected = *i - (*j >> shift); 1710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, m.Call(*i, *j, shift)); 1711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1714b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1715b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 1716014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m( 1717014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType::Int32(), MachineType::Uint32(), MachineType::Uint32()); 1718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Sub(m.Word32Sar(m.Parameter(0), m.Parameter(1)), 1719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Parameter(2))); 1720b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(i) { 1721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_SHIFTS(shift) { 1722b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(k) { 1723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t expected = (*i >> shift) - *k; 1724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, m.Call(*i, shift, *k)); 1725b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1726b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1727b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1729b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1730b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1731b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1732b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunInt32SubAndWord32ShlP) { 1733b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 1734014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m( 1735014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType::Uint32(), MachineType::Int32(), MachineType::Uint32()); 1736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Sub(m.Parameter(0), 1737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Word32Shl(m.Parameter(1), m.Parameter(2)))); 1738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 1739b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(j) { 1740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_SHIFTS(shift) { 1741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t expected = *i - (*j << shift); 1742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, m.Call(*i, *j, shift)); 1743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1745b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1746b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1747b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 1748014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m( 1749014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType::Int32(), MachineType::Uint32(), MachineType::Uint32()); 1750b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Sub(m.Word32Shl(m.Parameter(0), m.Parameter(1)), 1751b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Parameter(2))); 1752b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(i) { 1753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_SHIFTS(shift) { 1754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(k) { 1755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Use uint32_t because signed overflow is UB in C. 1756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t expected = (*i << shift) - *k; 1757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, m.Call(*i, shift, *k)); 1758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1765b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunInt32SubAndWord32ShrP) { 1766b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 1767014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<uint32_t> m( 1768014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType::Uint32(), MachineType::Uint32(), MachineType::Uint32()); 1769b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Sub(m.Parameter(0), 1770b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Word32Shr(m.Parameter(1), m.Parameter(2)))); 1771b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 1772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(j) { 1773b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_SHIFTS(shift) { 1774b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Use uint32_t because signed overflow is UB in C. 1775014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch uint32_t expected = *i - (*j >> shift); 1776014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected, m.Call(*i, *j, shift)); 1777b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1778b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1781b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 1782014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<uint32_t> m( 1783014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType::Uint32(), MachineType::Uint32(), MachineType::Uint32()); 1784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Sub(m.Word32Shr(m.Parameter(0), m.Parameter(1)), 1785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Parameter(2))); 1786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 1787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_SHIFTS(shift) { 1788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(k) { 1789b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Use uint32_t because signed overflow is UB in C. 1790014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch uint32_t expected = (*i >> shift) - *k; 1791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, m.Call(*i, shift, *k)); 1792b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1796b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1797b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunInt32SubInBranch) { 1800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int constant = 987654321; 1801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 1802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 1803014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Int32BinopTester bt(&m); 1804014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineLabel blocka, blockb; 1805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Branch( 1806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Word32Equal(m.Int32Sub(bt.param0, bt.param1), m.Int32Constant(0)), 1807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch &blocka, &blockb); 1808b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blocka); 1809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn(m.Int32Constant(constant)); 1810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blockb); 1811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn(m.Int32Constant(0 - constant)); 1812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 1813b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(j) { 1814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t expected = (*i - *j) == 0 ? constant : 0 - constant; 1815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, bt.call(*i, *j)); 1816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1817b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1819b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 1820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 1821014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Int32BinopTester bt(&m); 1822014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineLabel blocka, blockb; 1823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Branch( 1824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Word32NotEqual(m.Int32Sub(bt.param0, bt.param1), m.Int32Constant(0)), 1825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch &blocka, &blockb); 1826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blocka); 1827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn(m.Int32Constant(constant)); 1828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blockb); 1829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn(m.Int32Constant(0 - constant)); 1830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 1831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(j) { 1832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t expected = (*i - *j) != 0 ? constant : 0 - constant; 1833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, bt.call(*i, *j)); 1834b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1835b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1836b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1837b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 1838b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 1839014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32()); 1840014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineLabel blocka, blockb; 1841b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Branch(m.Word32Equal(m.Int32Sub(m.Int32Constant(*i), m.Parameter(0)), 1842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Int32Constant(0)), 1843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch &blocka, &blockb); 1844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blocka); 1845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Constant(constant)); 1846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blockb); 1847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Constant(0 - constant)); 1848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(j) { 1849014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch uint32_t expected = (*i - *j) == 0 ? constant : 0 - constant; 1850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, m.Call(*j)); 1851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1854b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 1855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 1856014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m(MachineType::Uint32()); 1857014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineLabel blocka, blockb; 1858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Branch(m.Word32NotEqual(m.Int32Sub(m.Int32Constant(*i), m.Parameter(0)), 1859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Int32Constant(0)), 1860b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch &blocka, &blockb); 1861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blocka); 1862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Constant(constant)); 1863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blockb); 1864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Constant(0 - constant)); 1865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(j) { 1866b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t expected = (*i - *j) != 0 ? constant : 0 - constant; 1867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, m.Call(*j)); 1868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1869b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1870b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1871b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 1872b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<void> m; 1873b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const Operator* shops[] = {m.machine()->Word32Sar(), 1874b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.machine()->Word32Shl(), 1875b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.machine()->Word32Shr()}; 1876b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (size_t n = 0; n < arraysize(shops); n++) { 1877014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m( 1878014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType::Uint32(), MachineType::Int32(), MachineType::Uint32()); 1879014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineLabel blocka, blockb; 1880b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Branch(m.Word32Equal(m.Int32Sub(m.Parameter(0), 1881014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.AddNode(shops[n], m.Parameter(1), 1882b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Parameter(2))), 1883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Int32Constant(0)), 1884b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch &blocka, &blockb); 1885b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blocka); 1886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Constant(constant)); 1887b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blockb); 1888b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Constant(0 - constant)); 1889b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 1890b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(j) { 1891b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_SHIFTS(shift) { 1892b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t right; 1893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch switch (shops[n]->opcode()) { 1894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch default: 1895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UNREACHABLE(); 1896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case IrOpcode::kWord32Sar: 1897b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch right = *j >> shift; 1898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 1899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case IrOpcode::kWord32Shl: 1900b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch right = *j << shift; 1901b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 1902b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case IrOpcode::kWord32Shr: 1903b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch right = static_cast<uint32_t>(*j) >> shift; 1904b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 1905b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1906b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t expected = ((*i - right) == 0) ? constant : 0 - constant; 1907b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, m.Call(*i, *j, shift)); 1908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1909b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1910b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1914b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1915b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunInt32SubInComparison) { 1917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 1918b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 1919b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Uint32BinopTester bt(&m); 1920b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn( 1921b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Word32Equal(m.Int32Sub(bt.param0, bt.param1), m.Int32Constant(0))); 1922b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 1923b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(j) { 1924b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t expected = (*i - *j) == 0; 1925014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected, bt.call(*i, *j)); 1926b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1927b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1928b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1929b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 1930b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 1931b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Uint32BinopTester bt(&m); 1932b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn( 1933b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Word32Equal(m.Int32Constant(0), m.Int32Sub(bt.param0, bt.param1))); 1934b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 1935b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(j) { 1936b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t expected = (*i - *j) == 0; 1937014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected, bt.call(*i, *j)); 1938b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1939b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1940b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1941b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 1942b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 1943014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32()); 1944b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Word32Equal(m.Int32Sub(m.Int32Constant(*i), m.Parameter(0)), 1945b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Int32Constant(0))); 1946b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(j) { 1947b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t expected = (*i - *j) == 0; 1948014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected, m.Call(*j)); 1949b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1950b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1951b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1952b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 1953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 1954014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32()); 1955b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Word32Equal(m.Int32Sub(m.Parameter(0), m.Int32Constant(*i)), 1956b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Int32Constant(0))); 1957b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(j) { 1958b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t expected = (*j - *i) == 0; 1959014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected, m.Call(*j)); 1960b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1961b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1962b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1963b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 1964b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<void> m; 1965b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const Operator* shops[] = {m.machine()->Word32Sar(), 1966b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.machine()->Word32Shl(), 1967b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.machine()->Word32Shr()}; 1968b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (size_t n = 0; n < arraysize(shops); n++) { 1969014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m( 1970014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType::Uint32(), MachineType::Int32(), MachineType::Uint32()); 1971b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Word32Equal( 1972b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Int32Sub(m.Parameter(0), 1973014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.AddNode(shops[n], m.Parameter(1), m.Parameter(2))), 1974b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Int32Constant(0))); 1975b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 1976b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(j) { 1977b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_SHIFTS(shift) { 1978b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t right; 1979b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch switch (shops[n]->opcode()) { 1980b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch default: 1981b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UNREACHABLE(); 1982b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case IrOpcode::kWord32Sar: 1983b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch right = *j >> shift; 1984b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 1985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case IrOpcode::kWord32Shl: 1986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch right = *j << shift; 1987b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 1988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case IrOpcode::kWord32Shr: 1989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch right = static_cast<uint32_t>(*j) >> shift; 1990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 1991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1992b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t expected = (*i - right) == 0; 1993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, m.Call(*i, *j, shift)); 1994b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1995b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1996b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1997b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1998b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1999b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2000b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2001b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2002b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunInt32MulP) { 2003b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 2004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 2005b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Int32BinopTester bt(&m); 2006b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn(m.Int32Mul(bt.param0, bt.param1)); 2007b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(i) { 2008b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(j) { 2009b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int expected = static_cast<int32_t>(*i * *j); 2010b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, bt.call(*i, *j)); 2011b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2012b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2013b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2014b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 2015b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 2016b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Uint32BinopTester bt(&m); 2017b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn(m.Int32Mul(bt.param0, bt.param1)); 2018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 2019b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(j) { 2020b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t expected = *i * *j; 2021014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected, bt.call(*i, *j)); 2022b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2023b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2024b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2025b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2028958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierTEST(RunInt32MulHighP) { 2029958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier RawMachineAssemblerTester<int32_t> m; 2030958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Int32BinopTester bt(&m); 2031958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier bt.AddReturn(m.Int32MulHigh(bt.param0, bt.param1)); 2032958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FOR_INT32_INPUTS(i) { 2033958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FOR_INT32_INPUTS(j) { 2034958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int32_t expected = static_cast<int32_t>( 2035958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier (static_cast<int64_t>(*i) * static_cast<int64_t>(*j)) >> 32); 2036958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier CHECK_EQ(expected, bt.call(*i, *j)); 2037958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2038958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2039958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 2040958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2041958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunInt32MulImm) { 2043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 2044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 2045014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32()); 2046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Mul(m.Int32Constant(*i), m.Parameter(0))); 2047b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(j) { 2048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t expected = *i * *j; 2049014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected, m.Call(*j)); 2050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2052b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 2054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 2055014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32()); 2056b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Mul(m.Parameter(0), m.Int32Constant(*i))); 2057b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(j) { 2058b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t expected = *j * *i; 2059014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected, m.Call(*j)); 2060b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2061b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2062b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2063b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2064b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2066b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunInt32MulAndInt32AddP) { 2067b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 2068958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FOR_INT32_INPUTS(i) { 2069958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FOR_INT32_INPUTS(j) { 2070014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m(MachineType::Int32()); 2071958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int32_t p0 = *i; 2072958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int32_t p1 = *j; 2073958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier m.Return(m.Int32Add(m.Int32Constant(p0), 2074958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier m.Int32Mul(m.Parameter(0), m.Int32Constant(p1)))); 2075958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FOR_INT32_INPUTS(k) { 2076958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int32_t p2 = *k; 2077958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int expected = p0 + static_cast<int32_t>(p1 * p2); 2078958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier CHECK_EQ(expected, m.Call(p2)); 2079958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2080958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2081958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2082958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2083958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier { 2084014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m( 2085014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType::Int32(), MachineType::Int32(), MachineType::Int32()); 2086b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return( 2087b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Int32Add(m.Parameter(0), m.Int32Mul(m.Parameter(1), m.Parameter(2)))); 2088b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(i) { 2089b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(j) { 2090b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(k) { 2091b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t p0 = *i; 2092b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t p1 = *j; 2093b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t p2 = *k; 2094b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int expected = p0 + static_cast<int32_t>(p1 * p2); 2095b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, m.Call(p0, p1, p2)); 2096b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2097b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2098b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2099b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 2101014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m( 2102014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType::Int32(), MachineType::Int32(), MachineType::Int32()); 2103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return( 2104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Int32Add(m.Int32Mul(m.Parameter(0), m.Parameter(1)), m.Parameter(2))); 2105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(i) { 2106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(j) { 2107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(k) { 2108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t p0 = *i; 2109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t p1 = *j; 2110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t p2 = *k; 2111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int expected = static_cast<int32_t>(p0 * p1) + p2; 2112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, m.Call(p0, p1, p2)); 2113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 2118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(i) { 2119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 2120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Int32BinopTester bt(&m); 2121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn( 2122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Int32Add(m.Int32Constant(*i), m.Int32Mul(bt.param0, bt.param1))); 2123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(j) { 2124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(k) { 2125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t p0 = *j; 2126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t p1 = *k; 2127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int expected = *i + static_cast<int32_t>(p0 * p1); 2128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, bt.call(p0, p1)); 2129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunInt32MulAndInt32SubP) { 2137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 2138014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m( 2139014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType::Uint32(), MachineType::Int32(), MachineType::Int32()); 2140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return( 2141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Int32Sub(m.Parameter(0), m.Int32Mul(m.Parameter(1), m.Parameter(2)))); 2142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 2143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(j) { 2144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(k) { 2145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t p0 = *i; 2146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t p1 = *j; 2147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t p2 = *k; 2148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Use uint32_t because signed overflow is UB in C. 2149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int expected = p0 - static_cast<uint32_t>(p1 * p2); 2150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, m.Call(p0, p1, p2)); 2151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 2156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 2157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 2158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Int32BinopTester bt(&m); 2159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn( 2160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Int32Sub(m.Int32Constant(*i), m.Int32Mul(bt.param0, bt.param1))); 2161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(j) { 2162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(k) { 2163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t p0 = *j; 2164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t p1 = *k; 2165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Use uint32_t because signed overflow is UB in C. 2166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int expected = *i - static_cast<uint32_t>(p0 * p1); 2167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, bt.call(p0, p1)); 2168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2175958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierTEST(RunUint32MulHighP) { 2176958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier RawMachineAssemblerTester<int32_t> m; 2177958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Int32BinopTester bt(&m); 2178958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier bt.AddReturn(m.Uint32MulHigh(bt.param0, bt.param1)); 2179958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FOR_UINT32_INPUTS(i) { 2180958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FOR_UINT32_INPUTS(j) { 2181958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int32_t expected = bit_cast<int32_t>(static_cast<uint32_t>( 2182958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier (static_cast<uint64_t>(*i) * static_cast<uint64_t>(*j)) >> 32)); 2183958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier CHECK_EQ(expected, bt.call(bit_cast<int32_t>(*i), bit_cast<int32_t>(*j))); 2184958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2185958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2186958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 2187958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2188958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunInt32DivP) { 2190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 2191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 2192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Int32BinopTester bt(&m); 2193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn(m.Int32Div(bt.param0, bt.param1)); 2194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(i) { 2195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(j) { 2196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int p0 = *i; 2197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int p1 = *j; 2198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (p1 != 0 && (static_cast<uint32_t>(p0) != 0x80000000 || p1 != -1)) { 2199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int expected = static_cast<int32_t>(p0 / p1); 2200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, bt.call(p0, p1)); 2201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 2206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 2207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Int32BinopTester bt(&m); 2208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn(m.Int32Add(bt.param0, m.Int32Div(bt.param0, bt.param1))); 2209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(i) { 2210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(j) { 2211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int p0 = *i; 2212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int p1 = *j; 2213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (p1 != 0 && (static_cast<uint32_t>(p0) != 0x80000000 || p1 != -1)) { 2214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int expected = static_cast<int32_t>(p0 + (p0 / p1)); 2215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, bt.call(p0, p1)); 2216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2223958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierTEST(RunUint32DivP) { 2224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 2225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 2226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Int32BinopTester bt(&m); 2227958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier bt.AddReturn(m.Uint32Div(bt.param0, bt.param1)); 2228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 2229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(j) { 2230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t p0 = *i; 2231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t p1 = *j; 2232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (p1 != 0) { 2233014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int32_t expected = bit_cast<int32_t>(p0 / p1); 2234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, bt.call(p0, p1)); 2235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 2240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 2241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Int32BinopTester bt(&m); 2242958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier bt.AddReturn(m.Int32Add(bt.param0, m.Uint32Div(bt.param0, bt.param1))); 2243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 2244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(j) { 2245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t p0 = *i; 2246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t p1 = *j; 2247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (p1 != 0) { 2248014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int32_t expected = bit_cast<int32_t>(p0 + (p0 / p1)); 2249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, bt.call(p0, p1)); 2250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunInt32ModP) { 2258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 2259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 2260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Int32BinopTester bt(&m); 2261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn(m.Int32Mod(bt.param0, bt.param1)); 2262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(i) { 2263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(j) { 2264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int p0 = *i; 2265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int p1 = *j; 2266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (p1 != 0 && (static_cast<uint32_t>(p0) != 0x80000000 || p1 != -1)) { 2267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int expected = static_cast<int32_t>(p0 % p1); 2268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, bt.call(p0, p1)); 2269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 2274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 2275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Int32BinopTester bt(&m); 2276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn(m.Int32Add(bt.param0, m.Int32Mod(bt.param0, bt.param1))); 2277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(i) { 2278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(j) { 2279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int p0 = *i; 2280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int p1 = *j; 2281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (p1 != 0 && (static_cast<uint32_t>(p0) != 0x80000000 || p1 != -1)) { 2282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int expected = static_cast<int32_t>(p0 + (p0 % p1)); 2283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, bt.call(p0, p1)); 2284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2291958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierTEST(RunUint32ModP) { 2292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 2293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 2294014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Uint32BinopTester bt(&m); 2295958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier bt.AddReturn(m.Uint32Mod(bt.param0, bt.param1)); 2296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 2297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(j) { 2298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t p0 = *i; 2299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t p1 = *j; 2300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (p1 != 0) { 2301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t expected = static_cast<uint32_t>(p0 % p1); 2302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, bt.call(p0, p1)); 2303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 2308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 2309014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Uint32BinopTester bt(&m); 2310958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier bt.AddReturn(m.Int32Add(bt.param0, m.Uint32Mod(bt.param0, bt.param1))); 2311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 2312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(j) { 2313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t p0 = *i; 2314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t p1 = *j; 2315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (p1 != 0) { 2316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t expected = static_cast<uint32_t>(p0 + (p0 % p1)); 2317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, bt.call(p0, p1)); 2318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunWord32AndP) { 2326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 2327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 2328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Int32BinopTester bt(&m); 2329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn(m.Word32And(bt.param0, bt.param1)); 2330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 2331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(j) { 2332014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int32_t expected = *i & *j; 2333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, bt.call(*i, *j)); 2334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 2338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 2339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Int32BinopTester bt(&m); 2340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn(m.Word32And(bt.param0, m.Word32Not(bt.param1))); 2341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 2342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(j) { 2343014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int32_t expected = *i & ~(*j); 2344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, bt.call(*i, *j)); 2345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 2349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 2350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Int32BinopTester bt(&m); 2351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn(m.Word32And(m.Word32Not(bt.param0), bt.param1)); 2352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 2353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(j) { 2354014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int32_t expected = ~(*i) & *j; 2355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, bt.call(*i, *j)); 2356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunWord32AndAndWord32ShlP) { 2363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 2364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 2365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Uint32BinopTester bt(&m); 2366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn( 2367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Word32Shl(bt.param0, m.Word32And(bt.param1, m.Int32Constant(0x1f)))); 2368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 2369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(j) { 2370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t expected = *i << (*j & 0x1f); 2371014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected, bt.call(*i, *j)); 2372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 2376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 2377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Uint32BinopTester bt(&m); 2378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn( 2379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Word32Shl(bt.param0, m.Word32And(m.Int32Constant(0x1f), bt.param1))); 2380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 2381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(j) { 2382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t expected = *i << (0x1f & *j); 2383014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected, bt.call(*i, *j)); 2384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunWord32AndAndWord32ShrP) { 2391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 2392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 2393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Uint32BinopTester bt(&m); 2394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn( 2395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Word32Shr(bt.param0, m.Word32And(bt.param1, m.Int32Constant(0x1f)))); 2396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 2397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(j) { 2398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t expected = *i >> (*j & 0x1f); 2399014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected, bt.call(*i, *j)); 2400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 2404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 2405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Uint32BinopTester bt(&m); 2406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn( 2407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Word32Shr(bt.param0, m.Word32And(m.Int32Constant(0x1f), bt.param1))); 2408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 2409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(j) { 2410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t expected = *i >> (0x1f & *j); 2411014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected, bt.call(*i, *j)); 2412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunWord32AndAndWord32SarP) { 2419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 2420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 2421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Int32BinopTester bt(&m); 2422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn( 2423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Word32Sar(bt.param0, m.Word32And(bt.param1, m.Int32Constant(0x1f)))); 2424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(i) { 2425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(j) { 2426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t expected = *i >> (*j & 0x1f); 2427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, bt.call(*i, *j)); 2428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 2432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 2433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Int32BinopTester bt(&m); 2434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn( 2435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Word32Sar(bt.param0, m.Word32And(m.Int32Constant(0x1f), bt.param1))); 2436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(i) { 2437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(j) { 2438014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int32_t expected = *i >> (0x1f & *j); 2439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, bt.call(*i, *j)); 2440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunWord32AndImm) { 2447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 2448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 2449014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32()); 2450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Word32And(m.Int32Constant(*i), m.Parameter(0))); 2451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(j) { 2452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t expected = *i & *j; 2453014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected, m.Call(*j)); 2454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 2458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 2459014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32()); 2460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Word32And(m.Int32Constant(*i), m.Word32Not(m.Parameter(0)))); 2461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(j) { 2462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t expected = *i & ~(*j); 2463014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected, m.Call(*j)); 2464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunWord32AndInBranch) { 2471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int constant = 987654321; 2472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 2473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 2474014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Int32BinopTester bt(&m); 2475014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineLabel blocka, blockb; 2476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Branch( 2477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Word32Equal(m.Word32And(bt.param0, bt.param1), m.Int32Constant(0)), 2478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch &blocka, &blockb); 2479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blocka); 2480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn(m.Int32Constant(constant)); 2481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blockb); 2482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn(m.Int32Constant(0 - constant)); 2483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 2484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(j) { 2485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t expected = (*i & *j) == 0 ? constant : 0 - constant; 2486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, bt.call(*i, *j)); 2487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 2491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 2492014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Int32BinopTester bt(&m); 2493014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineLabel blocka, blockb; 2494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Branch( 2495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Word32NotEqual(m.Word32And(bt.param0, bt.param1), m.Int32Constant(0)), 2496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch &blocka, &blockb); 2497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blocka); 2498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn(m.Int32Constant(constant)); 2499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blockb); 2500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn(m.Int32Constant(0 - constant)); 2501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 2502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(j) { 2503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t expected = (*i & *j) != 0 ? constant : 0 - constant; 2504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, bt.call(*i, *j)); 2505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 2509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 2510014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m(MachineType::Uint32()); 2511014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineLabel blocka, blockb; 2512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Branch(m.Word32Equal(m.Word32And(m.Int32Constant(*i), m.Parameter(0)), 2513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Int32Constant(0)), 2514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch &blocka, &blockb); 2515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blocka); 2516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Constant(constant)); 2517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blockb); 2518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Constant(0 - constant)); 2519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(j) { 2520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t expected = (*i & *j) == 0 ? constant : 0 - constant; 2521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, m.Call(*j)); 2522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 2526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 2527014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m(MachineType::Uint32()); 2528014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineLabel blocka, blockb; 2529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Branch( 2530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Word32NotEqual(m.Word32And(m.Int32Constant(*i), m.Parameter(0)), 2531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Int32Constant(0)), 2532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch &blocka, &blockb); 2533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blocka); 2534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Constant(constant)); 2535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blockb); 2536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Constant(0 - constant)); 2537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(j) { 2538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t expected = (*i & *j) != 0 ? constant : 0 - constant; 2539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, m.Call(*j)); 2540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 2544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<void> m; 2545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const Operator* shops[] = {m.machine()->Word32Sar(), 2546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.machine()->Word32Shl(), 2547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.machine()->Word32Shr()}; 2548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (size_t n = 0; n < arraysize(shops); n++) { 2549014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m( 2550014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType::Uint32(), MachineType::Int32(), MachineType::Uint32()); 2551014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineLabel blocka, blockb; 2552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Branch(m.Word32Equal(m.Word32And(m.Parameter(0), 2553014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.AddNode(shops[n], m.Parameter(1), 2554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Parameter(2))), 2555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Int32Constant(0)), 2556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch &blocka, &blockb); 2557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blocka); 2558b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Constant(constant)); 2559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blockb); 2560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Constant(0 - constant)); 2561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 2562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(j) { 2563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_SHIFTS(shift) { 2564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t right; 2565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch switch (shops[n]->opcode()) { 2566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch default: 2567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UNREACHABLE(); 2568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case IrOpcode::kWord32Sar: 2569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch right = *j >> shift; 2570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 2571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case IrOpcode::kWord32Shl: 2572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch right = *j << shift; 2573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 2574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case IrOpcode::kWord32Shr: 2575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch right = static_cast<uint32_t>(*j) >> shift; 2576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 2577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t expected = ((*i & right) == 0) ? constant : 0 - constant; 2579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, m.Call(*i, *j, shift)); 2580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunWord32AndInComparison) { 2589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 2590b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 2591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Uint32BinopTester bt(&m); 2592b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn( 2593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Word32Equal(m.Word32And(bt.param0, bt.param1), m.Int32Constant(0))); 2594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 2595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(j) { 2596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t expected = (*i & *j) == 0; 2597014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected, bt.call(*i, *j)); 2598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2599b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2600b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 2602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 2603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Uint32BinopTester bt(&m); 2604b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn( 2605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Word32Equal(m.Int32Constant(0), m.Word32And(bt.param0, bt.param1))); 2606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 2607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(j) { 2608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t expected = (*i & *j) == 0; 2609014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected, bt.call(*i, *j)); 2610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2612b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 2614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 2615014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32()); 2616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Word32Equal(m.Word32And(m.Int32Constant(*i), m.Parameter(0)), 2617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Int32Constant(0))); 2618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(j) { 2619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t expected = (*i & *j) == 0; 2620014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected, m.Call(*j)); 2621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 2625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 2626014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32()); 2627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Word32Equal(m.Word32And(m.Parameter(0), m.Int32Constant(*i)), 2628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Int32Constant(0))); 2629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(j) { 2630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t expected = (*j & *i) == 0; 2631014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected, m.Call(*j)); 2632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunWord32OrP) { 2639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 2640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 2641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Uint32BinopTester bt(&m); 2642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn(m.Word32Or(bt.param0, bt.param1)); 2643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 2644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(j) { 2645b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t expected = *i | *j; 2646014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected, bt.call(*i, *j)); 2647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 2651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 2652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Uint32BinopTester bt(&m); 2653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn(m.Word32Or(bt.param0, m.Word32Not(bt.param1))); 2654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 2655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(j) { 2656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t expected = *i | ~(*j); 2657014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected, bt.call(*i, *j)); 2658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2659b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2661b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 2662b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 2663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Uint32BinopTester bt(&m); 2664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn(m.Word32Or(m.Word32Not(bt.param0), bt.param1)); 2665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 2666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(j) { 2667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t expected = ~(*i) | *j; 2668014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected, bt.call(*i, *j)); 2669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunWord32OrImm) { 2676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 2677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 2678014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32()); 2679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Word32Or(m.Int32Constant(*i), m.Parameter(0))); 2680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(j) { 2681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t expected = *i | *j; 2682014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected, m.Call(*j)); 2683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 2687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 2688014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32()); 2689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Word32Or(m.Int32Constant(*i), m.Word32Not(m.Parameter(0)))); 2690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(j) { 2691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t expected = *i | ~(*j); 2692014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected, m.Call(*j)); 2693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunWord32OrInBranch) { 2700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int constant = 987654321; 2701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 2702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 2703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Int32BinopTester bt(&m); 2704014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineLabel blocka, blockb; 2705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Branch( 2706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Word32Equal(m.Word32Or(bt.param0, bt.param1), m.Int32Constant(0)), 2707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch &blocka, &blockb); 2708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blocka); 2709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn(m.Int32Constant(constant)); 2710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blockb); 2711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn(m.Int32Constant(0 - constant)); 2712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(i) { 2713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(j) { 2714b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t expected = (*i | *j) == 0 ? constant : 0 - constant; 2715b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, bt.call(*i, *j)); 2716b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2717b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 2720b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 2721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Int32BinopTester bt(&m); 2722014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineLabel blocka, blockb; 2723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Branch( 2724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Word32NotEqual(m.Word32Or(bt.param0, bt.param1), m.Int32Constant(0)), 2725b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch &blocka, &blockb); 2726b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blocka); 2727b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn(m.Int32Constant(constant)); 2728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blockb); 2729b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn(m.Int32Constant(0 - constant)); 2730b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(i) { 2731b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(j) { 2732b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t expected = (*i | *j) != 0 ? constant : 0 - constant; 2733b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, bt.call(*i, *j)); 2734b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 2738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(i) { 2739014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m(MachineType::Int32()); 2740014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineLabel blocka, blockb; 2741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Branch(m.Word32Equal(m.Word32Or(m.Int32Constant(*i), m.Parameter(0)), 2742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Int32Constant(0)), 2743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch &blocka, &blockb); 2744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blocka); 2745b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Constant(constant)); 2746b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blockb); 2747b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Constant(0 - constant)); 2748b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(j) { 2749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t expected = (*i | *j) == 0 ? constant : 0 - constant; 2750b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, m.Call(*j)); 2751b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2752b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 2755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(i) { 2756014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m(MachineType::Int32()); 2757014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineLabel blocka, blockb; 2758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Branch(m.Word32NotEqual(m.Word32Or(m.Int32Constant(*i), m.Parameter(0)), 2759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Int32Constant(0)), 2760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch &blocka, &blockb); 2761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blocka); 2762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Constant(constant)); 2763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blockb); 2764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Constant(0 - constant)); 2765b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(j) { 2766b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t expected = (*i | *j) != 0 ? constant : 0 - constant; 2767b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, m.Call(*j)); 2768b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2769b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2770b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2771b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 2772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<void> m; 2773b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const Operator* shops[] = {m.machine()->Word32Sar(), 2774b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.machine()->Word32Shl(), 2775b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.machine()->Word32Shr()}; 2776b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (size_t n = 0; n < arraysize(shops); n++) { 2777014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m( 2778014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType::Uint32(), MachineType::Int32(), MachineType::Uint32()); 2779014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineLabel blocka, blockb; 2780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Branch(m.Word32Equal(m.Word32Or(m.Parameter(0), 2781014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.AddNode(shops[n], m.Parameter(1), 2782b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Parameter(2))), 2783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Int32Constant(0)), 2784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch &blocka, &blockb); 2785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blocka); 2786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Constant(constant)); 2787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blockb); 2788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Constant(0 - constant)); 2789b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 2790b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(j) { 2791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_SHIFTS(shift) { 2792b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t right; 2793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch switch (shops[n]->opcode()) { 2794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch default: 2795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UNREACHABLE(); 2796b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case IrOpcode::kWord32Sar: 2797b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch right = *j >> shift; 2798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 2799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case IrOpcode::kWord32Shl: 2800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch right = *j << shift; 2801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 2802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case IrOpcode::kWord32Shr: 2803b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch right = static_cast<uint32_t>(*j) >> shift; 2804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 2805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t expected = ((*i | right) == 0) ? constant : 0 - constant; 2807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, m.Call(*i, *j, shift)); 2808b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2813b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunWord32OrInComparison) { 2817b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 2818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 2819014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Int32BinopTester bt(&m); 2820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn( 2821b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Word32Equal(m.Word32Or(bt.param0, bt.param1), m.Int32Constant(0))); 2822b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 2823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(j) { 2824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t expected = (*i | *j) == 0; 2825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, bt.call(*i, *j)); 2826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 2830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 2831014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Int32BinopTester bt(&m); 2832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn( 2833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Word32Equal(m.Int32Constant(0), m.Word32Or(bt.param0, bt.param1))); 2834b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 2835b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(j) { 2836b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t expected = (*i | *j) == 0; 2837b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, bt.call(*i, *j)); 2838b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2839b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2840b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2841b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 2842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 2843014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32()); 2844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Word32Equal(m.Word32Or(m.Int32Constant(*i), m.Parameter(0)), 2845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Int32Constant(0))); 2846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(j) { 2847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t expected = (*i | *j) == 0; 2848014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected, m.Call(*j)); 2849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 2853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 2854014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32()); 2855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Word32Equal(m.Word32Or(m.Parameter(0), m.Int32Constant(*i)), 2856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Int32Constant(0))); 2857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(j) { 2858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t expected = (*j | *i) == 0; 2859014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected, m.Call(*j)); 2860b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2866b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunWord32XorP) { 2867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 2868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 2869014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32()); 2870b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Word32Xor(m.Int32Constant(*i), m.Parameter(0))); 2871b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(j) { 2872b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t expected = *i ^ *j; 2873014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected, m.Call(*j)); 2874b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2875b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2876b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2877b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 2878b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 2879b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Uint32BinopTester bt(&m); 2880b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn(m.Word32Xor(bt.param0, bt.param1)); 2881b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 2882b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(j) { 2883014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch uint32_t expected = *i ^ *j; 2884014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected, bt.call(*i, *j)); 2885b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2887b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2888b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 2889b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 2890b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Int32BinopTester bt(&m); 2891b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn(m.Word32Xor(bt.param0, m.Word32Not(bt.param1))); 2892b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(i) { 2893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(j) { 2894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t expected = *i ^ ~(*j); 2895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, bt.call(*i, *j)); 2896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2897b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 2900b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 2901b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Int32BinopTester bt(&m); 2902b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn(m.Word32Xor(m.Word32Not(bt.param0), bt.param1)); 2903b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(i) { 2904b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(j) { 2905b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t expected = ~(*i) ^ *j; 2906b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, bt.call(*i, *j)); 2907b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2909b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2910b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 2911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 2912014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32()); 2913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Word32Xor(m.Int32Constant(*i), m.Word32Not(m.Parameter(0)))); 2914b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(j) { 2915b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t expected = *i ^ ~(*j); 2916014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected, m.Call(*j)); 2917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2918b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2919b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2920b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2921b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2922b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2923b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunWord32XorInBranch) { 2924b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const uint32_t constant = 987654321; 2925b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 2926b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 2927b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Uint32BinopTester bt(&m); 2928014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineLabel blocka, blockb; 2929b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Branch( 2930b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Word32Equal(m.Word32Xor(bt.param0, bt.param1), m.Int32Constant(0)), 2931b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch &blocka, &blockb); 2932b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blocka); 2933b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn(m.Int32Constant(constant)); 2934b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blockb); 2935b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn(m.Int32Constant(0 - constant)); 2936b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 2937b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(j) { 2938b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t expected = (*i ^ *j) == 0 ? constant : 0 - constant; 2939014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected, bt.call(*i, *j)); 2940b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2941b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2942b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2943b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 2944b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 2945b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Uint32BinopTester bt(&m); 2946014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineLabel blocka, blockb; 2947b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Branch( 2948b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Word32NotEqual(m.Word32Xor(bt.param0, bt.param1), m.Int32Constant(0)), 2949b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch &blocka, &blockb); 2950b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blocka); 2951b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn(m.Int32Constant(constant)); 2952b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blockb); 2953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn(m.Int32Constant(0 - constant)); 2954b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 2955b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(j) { 2956b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t expected = (*i ^ *j) != 0 ? constant : 0 - constant; 2957014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected, bt.call(*i, *j)); 2958b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2959b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2960b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2961b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 2962b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 2963014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32()); 2964014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineLabel blocka, blockb; 2965b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Branch(m.Word32Equal(m.Word32Xor(m.Int32Constant(*i), m.Parameter(0)), 2966b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Int32Constant(0)), 2967b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch &blocka, &blockb); 2968b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blocka); 2969b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Constant(constant)); 2970b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blockb); 2971b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Constant(0 - constant)); 2972b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(j) { 2973b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t expected = (*i ^ *j) == 0 ? constant : 0 - constant; 2974014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected, m.Call(*j)); 2975b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2976b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2977b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2978b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 2979b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 2980014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32()); 2981014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineLabel blocka, blockb; 2982b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Branch( 2983b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Word32NotEqual(m.Word32Xor(m.Int32Constant(*i), m.Parameter(0)), 2984b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Int32Constant(0)), 2985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch &blocka, &blockb); 2986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blocka); 2987b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Constant(constant)); 2988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blockb); 2989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Constant(0 - constant)); 2990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(j) { 2991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t expected = (*i ^ *j) != 0 ? constant : 0 - constant; 2992014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected, m.Call(*j)); 2993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2994b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2995b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2996b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 2997b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<void> m; 2998b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const Operator* shops[] = {m.machine()->Word32Sar(), 2999b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.machine()->Word32Shl(), 3000b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.machine()->Word32Shr()}; 3001b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (size_t n = 0; n < arraysize(shops); n++) { 3002014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m( 3003014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType::Uint32(), MachineType::Int32(), MachineType::Uint32()); 3004014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineLabel blocka, blockb; 3005b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Branch(m.Word32Equal(m.Word32Xor(m.Parameter(0), 3006014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.AddNode(shops[n], m.Parameter(1), 3007b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Parameter(2))), 3008b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Int32Constant(0)), 3009b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch &blocka, &blockb); 3010b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blocka); 3011b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Constant(constant)); 3012b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blockb); 3013b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Constant(0 - constant)); 3014b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 3015b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(j) { 3016b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_SHIFTS(shift) { 3017b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t right; 3018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch switch (shops[n]->opcode()) { 3019b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch default: 3020b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UNREACHABLE(); 3021b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case IrOpcode::kWord32Sar: 3022b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch right = *j >> shift; 3023b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 3024b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case IrOpcode::kWord32Shl: 3025b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch right = *j << shift; 3026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 3027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case IrOpcode::kWord32Shr: 3028b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch right = static_cast<uint32_t>(*j) >> shift; 3029b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 3030b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3031b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t expected = ((*i ^ right) == 0) ? constant : 0 - constant; 3032b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, m.Call(*i, *j, shift)); 3033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3035b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3038b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3040b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunWord32ShlP) { 3042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 3043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_SHIFTS(shift) { 3044014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32()); 3045b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Word32Shl(m.Parameter(0), m.Int32Constant(shift))); 3046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(j) { 3047b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t expected = *j << shift; 3048014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected, m.Call(*j)); 3049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3052b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 3053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 3054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Uint32BinopTester bt(&m); 3055b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn(m.Word32Shl(bt.param0, bt.param1)); 3056b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 3057b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_SHIFTS(shift) { 3058b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t expected = *i << shift; 3059014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected, bt.call(*i, shift)); 3060b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3061b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3062b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3063b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3064b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3066b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunWord32ShlInComparison) { 3067b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 3068b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 3069b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Uint32BinopTester bt(&m); 3070b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn( 3071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Word32Equal(m.Word32Shl(bt.param0, bt.param1), m.Int32Constant(0))); 3072b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 3073b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_SHIFTS(shift) { 3074b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t expected = 0 == (*i << shift); 3075014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected, bt.call(*i, shift)); 3076b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3077b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3078b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3079b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 3080b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 3081b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Uint32BinopTester bt(&m); 3082b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn( 3083b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Word32Equal(m.Int32Constant(0), m.Word32Shl(bt.param0, bt.param1))); 3084b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 3085b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_SHIFTS(shift) { 3086b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t expected = 0 == (*i << shift); 3087014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected, bt.call(*i, shift)); 3088b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3089b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3090b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3091b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 3092b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_SHIFTS(shift) { 3093014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32()); 3094b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return( 3095b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Word32Equal(m.Int32Constant(0), 3096b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Word32Shl(m.Parameter(0), m.Int32Constant(shift)))); 3097b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 3098b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t expected = 0 == (*i << shift); 3099014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected, m.Call(*i)); 3100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 3104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_SHIFTS(shift) { 3105014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32()); 3106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return( 3107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Word32Equal(m.Word32Shl(m.Parameter(0), m.Int32Constant(shift)), 3108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Int32Constant(0))); 3109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 3110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t expected = 0 == (*i << shift); 3111014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected, m.Call(*i)); 3112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunWord32ShrP) { 3119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 3120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_SHIFTS(shift) { 3121014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32()); 3122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Word32Shr(m.Parameter(0), m.Int32Constant(shift))); 3123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(j) { 3124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t expected = *j >> shift; 3125014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected, m.Call(*j)); 3126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 3130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 3131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Uint32BinopTester bt(&m); 3132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn(m.Word32Shr(bt.param0, bt.param1)); 3133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 3134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_SHIFTS(shift) { 3135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t expected = *i >> shift; 3136014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected, bt.call(*i, shift)); 3137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3139014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(0x00010000u, bt.call(0x80000000, 15)); 3140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunWord32ShrInComparison) { 3145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 3146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 3147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Uint32BinopTester bt(&m); 3148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn( 3149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Word32Equal(m.Word32Shr(bt.param0, bt.param1), m.Int32Constant(0))); 3150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 3151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_SHIFTS(shift) { 3152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t expected = 0 == (*i >> shift); 3153014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected, bt.call(*i, shift)); 3154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 3158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 3159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Uint32BinopTester bt(&m); 3160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn( 3161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Word32Equal(m.Int32Constant(0), m.Word32Shr(bt.param0, bt.param1))); 3162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 3163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_SHIFTS(shift) { 3164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t expected = 0 == (*i >> shift); 3165014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected, bt.call(*i, shift)); 3166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 3170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_SHIFTS(shift) { 3171014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32()); 3172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return( 3173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Word32Equal(m.Int32Constant(0), 3174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Word32Shr(m.Parameter(0), m.Int32Constant(shift)))); 3175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 3176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t expected = 0 == (*i >> shift); 3177014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected, m.Call(*i)); 3178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 3182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_SHIFTS(shift) { 3183014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32()); 3184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return( 3185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Word32Equal(m.Word32Shr(m.Parameter(0), m.Int32Constant(shift)), 3186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Int32Constant(0))); 3187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 3188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t expected = 0 == (*i >> shift); 3189014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected, m.Call(*i)); 3190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunWord32SarP) { 3197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 3198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_SHIFTS(shift) { 3199014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m(MachineType::Int32()); 3200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Word32Sar(m.Parameter(0), m.Int32Constant(shift))); 3201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(j) { 3202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t expected = *j >> shift; 3203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, m.Call(*j)); 3204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 3208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 3209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Int32BinopTester bt(&m); 3210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn(m.Word32Sar(bt.param0, bt.param1)); 3211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(i) { 3212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_SHIFTS(shift) { 3213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t expected = *i >> shift; 3214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, bt.call(*i, shift)); 3215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3217014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(bit_cast<int32_t>(0xFFFF0000), bt.call(0x80000000, 15)); 3218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunWord32SarInComparison) { 3223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 3224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 3225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Int32BinopTester bt(&m); 3226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn( 3227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Word32Equal(m.Word32Sar(bt.param0, bt.param1), m.Int32Constant(0))); 3228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(i) { 3229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_SHIFTS(shift) { 3230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t expected = 0 == (*i >> shift); 3231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, bt.call(*i, shift)); 3232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 3236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 3237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Int32BinopTester bt(&m); 3238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn( 3239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Word32Equal(m.Int32Constant(0), m.Word32Sar(bt.param0, bt.param1))); 3240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(i) { 3241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_SHIFTS(shift) { 3242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t expected = 0 == (*i >> shift); 3243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, bt.call(*i, shift)); 3244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 3248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_SHIFTS(shift) { 3249014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m(MachineType::Int32()); 3250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return( 3251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Word32Equal(m.Int32Constant(0), 3252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Word32Sar(m.Parameter(0), m.Int32Constant(shift)))); 3253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(i) { 3254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t expected = 0 == (*i >> shift); 3255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, m.Call(*i)); 3256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 3260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_SHIFTS(shift) { 3261014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m(MachineType::Int32()); 3262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return( 3263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Word32Equal(m.Word32Sar(m.Parameter(0), m.Int32Constant(shift)), 3264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Int32Constant(0))); 3265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(i) { 3266014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int32_t expected = 0 == (*i >> shift); 3267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, m.Call(*i)); 3268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunWord32RorP) { 3275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 3276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_SHIFTS(shift) { 3277014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m(MachineType::Uint32()); 3278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Word32Ror(m.Parameter(0), m.Int32Constant(shift))); 3279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(j) { 3280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t expected = bits::RotateRight32(*j, shift); 3281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, m.Call(*j)); 3282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 3286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 3287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Uint32BinopTester bt(&m); 3288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn(m.Word32Ror(bt.param0, bt.param1)); 3289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 3290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_SHIFTS(shift) { 3291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t expected = bits::RotateRight32(*i, shift); 3292014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected, bt.call(*i, shift)); 3293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunWord32RorInComparison) { 3300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 3301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 3302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Uint32BinopTester bt(&m); 3303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn( 3304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Word32Equal(m.Word32Ror(bt.param0, bt.param1), m.Int32Constant(0))); 3305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 3306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_SHIFTS(shift) { 3307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t expected = 0 == bits::RotateRight32(*i, shift); 3308014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected, bt.call(*i, shift)); 3309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 3313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 3314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Uint32BinopTester bt(&m); 3315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn( 3316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Word32Equal(m.Int32Constant(0), m.Word32Ror(bt.param0, bt.param1))); 3317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 3318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_SHIFTS(shift) { 3319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t expected = 0 == bits::RotateRight32(*i, shift); 3320014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected, bt.call(*i, shift)); 3321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 3325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_SHIFTS(shift) { 3326014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32()); 3327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return( 3328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Word32Equal(m.Int32Constant(0), 3329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Word32Ror(m.Parameter(0), m.Int32Constant(shift)))); 3330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 3331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t expected = 0 == bits::RotateRight32(*i, shift); 3332014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected, m.Call(*i)); 3333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 3337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_SHIFTS(shift) { 3338014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32()); 3339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return( 3340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Word32Equal(m.Word32Ror(m.Parameter(0), m.Int32Constant(shift)), 3341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Int32Constant(0))); 3342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 3343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t expected = 0 == bits::RotateRight32(*i, shift); 3344014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected, m.Call(*i)); 3345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunWord32NotP) { 3352014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m(MachineType::Int32()); 3353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Word32Not(m.Parameter(0))); 3354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(i) { 3355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int expected = ~(*i); 3356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, m.Call(*i)); 3357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunInt32NegP) { 3362014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m(MachineType::Int32()); 3363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Neg(m.Parameter(0))); 3364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(i) { 3365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int expected = -*i; 3366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, m.Call(*i)); 3367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunWord32EqualAndWord32SarP) { 3372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 3373014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m( 3374014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType::Int32(), MachineType::Int32(), MachineType::Uint32()); 3375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Word32Equal(m.Parameter(0), 3376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Word32Sar(m.Parameter(1), m.Parameter(2)))); 3377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(i) { 3378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(j) { 3379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_SHIFTS(shift) { 3380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t expected = (*i == (*j >> shift)); 3381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, m.Call(*i, *j, shift)); 3382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 3387014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m( 3388014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType::Int32(), MachineType::Uint32(), MachineType::Int32()); 3389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Word32Equal(m.Word32Sar(m.Parameter(0), m.Parameter(1)), 3390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Parameter(2))); 3391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(i) { 3392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_SHIFTS(shift) { 3393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(k) { 3394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t expected = ((*i >> shift) == *k); 3395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, m.Call(*i, shift, *k)); 3396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunWord32EqualAndWord32ShlP) { 3404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 3405014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m( 3406014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType::Uint32(), MachineType::Uint32(), MachineType::Uint32()); 3407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Word32Equal(m.Parameter(0), 3408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Word32Shl(m.Parameter(1), m.Parameter(2)))); 3409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 3410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(j) { 3411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_SHIFTS(shift) { 3412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t expected = (*i == (*j << shift)); 3413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, m.Call(*i, *j, shift)); 3414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 3419014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m( 3420014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType::Uint32(), MachineType::Uint32(), MachineType::Uint32()); 3421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Word32Equal(m.Word32Shl(m.Parameter(0), m.Parameter(1)), 3422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Parameter(2))); 3423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 3424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_SHIFTS(shift) { 3425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(k) { 3426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t expected = ((*i << shift) == *k); 3427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, m.Call(*i, shift, *k)); 3428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunWord32EqualAndWord32ShrP) { 3436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 3437014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m( 3438014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType::Uint32(), MachineType::Uint32(), MachineType::Uint32()); 3439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Word32Equal(m.Parameter(0), 3440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Word32Shr(m.Parameter(1), m.Parameter(2)))); 3441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 3442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(j) { 3443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_SHIFTS(shift) { 3444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t expected = (*i == (*j >> shift)); 3445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, m.Call(*i, *j, shift)); 3446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 3451014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m( 3452014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType::Uint32(), MachineType::Uint32(), MachineType::Uint32()); 3453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Word32Equal(m.Word32Shr(m.Parameter(0), m.Parameter(1)), 3454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Parameter(2))); 3455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 3456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_SHIFTS(shift) { 3457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(k) { 3458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t expected = ((*i >> shift) == *k); 3459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, m.Call(*i, shift, *k)); 3460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunDeadNodes) { 3468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; true; i++) { 3469014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m(i == 5 ? MachineType::Int32() 3470014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch : MachineType::None()); 3471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int constant = 0x55 + i; 3472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch switch (i) { 3473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 0: 3474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Int32Constant(44); 3475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 3476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 1: 3477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.StringConstant("unused"); 3478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 3479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 2: 3480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.NumberConstant(11.1); 3481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 3482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 3: 3483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.PointerConstant(&constant); 3484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 3485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 4: 3486014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.LoadFromPointer(&constant, MachineType::Int32()); 3487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 3488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 5: 3489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Parameter(0); 3490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 3491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch default: 3492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return; 3493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Constant(constant)); 3495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (i != 5) { 3496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(constant, m.Call()); 3497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 3498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(constant, m.Call(0)); 3499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunDeadInt32Binops) { 3505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 3506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3507958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier const Operator* kOps[] = { 3508958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier m.machine()->Word32And(), m.machine()->Word32Or(), 3509958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier m.machine()->Word32Xor(), m.machine()->Word32Shl(), 3510958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier m.machine()->Word32Shr(), m.machine()->Word32Sar(), 3511958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier m.machine()->Word32Ror(), m.machine()->Word32Equal(), 3512958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier m.machine()->Int32Add(), m.machine()->Int32Sub(), 3513958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier m.machine()->Int32Mul(), m.machine()->Int32MulHigh(), 3514958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier m.machine()->Int32Div(), m.machine()->Uint32Div(), 3515958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier m.machine()->Int32Mod(), m.machine()->Uint32Mod(), 3516958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier m.machine()->Uint32MulHigh(), m.machine()->Int32LessThan(), 3517958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier m.machine()->Int32LessThanOrEqual(), m.machine()->Uint32LessThan(), 3518958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier m.machine()->Uint32LessThanOrEqual()}; 3519958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3520958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier for (size_t i = 0; i < arraysize(kOps); ++i) { 3521014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m(MachineType::Int32(), 3522014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType::Int32()); 3523958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int32_t constant = static_cast<int32_t>(0x55555 + i); 3524014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.AddNode(kOps[i], m.Parameter(0), m.Parameter(1)); 3525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Constant(constant)); 3526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(constant, m.Call(1, 1)); 3528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <typename Type> 3533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic void RunLoadImmIndex(MachineType rep) { 3534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const int kNumElems = 3; 3535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Type buffer[kNumElems]; 3536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // initialize the buffer with raw data. 3538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch byte* raw = reinterpret_cast<byte*>(buffer); 3539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (size_t i = 0; i < sizeof(buffer); i++) { 3540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch raw[i] = static_cast<byte>((i + sizeof(buffer)) ^ 0xAA); 3541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Test with various large and small offsets. 3544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int offset = -1; offset <= 200000; offset *= -5) { 3545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < kNumElems; i++) { 3546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<Type> m; 3547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* base = m.PointerConstant(buffer - offset); 3548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* index = m.Int32Constant((offset + i) * sizeof(buffer[0])); 3549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Load(rep, base, index)); 3550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Type expected = buffer[i]; 3552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Type actual = m.Call(); 3553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(expected == actual); 3554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3558b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunLoadImmIndex) { 3560014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RunLoadImmIndex<int8_t>(MachineType::Int8()); 3561014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RunLoadImmIndex<uint8_t>(MachineType::Uint8()); 3562014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RunLoadImmIndex<int16_t>(MachineType::Int16()); 3563014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RunLoadImmIndex<uint16_t>(MachineType::Uint16()); 3564014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RunLoadImmIndex<int32_t>(MachineType::Int32()); 3565014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RunLoadImmIndex<uint32_t>(MachineType::Uint32()); 3566014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RunLoadImmIndex<int32_t*>(MachineType::AnyTagged()); 3567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // TODO(titzer): test kRepBit loads 3569014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // TODO(titzer): test MachineType::Float64() loads 3570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // TODO(titzer): test various indexing modes. 3571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <typename CType> 3575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic void RunLoadStore(MachineType rep) { 3576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const int kNumElems = 4; 3577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CType buffer[kNumElems]; 3578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int32_t x = 0; x < kNumElems; x++) { 3580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t y = kNumElems - x - 1; 3581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // initialize the buffer with raw data. 3582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch byte* raw = reinterpret_cast<byte*>(buffer); 3583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (size_t i = 0; i < sizeof(buffer); i++) { 3584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch raw[i] = static_cast<byte>((i + sizeof(buffer)) ^ 0xAA); 3585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 3588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t OK = 0x29000 + x; 3589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* base = m.PointerConstant(buffer); 3590014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* index0 = m.IntPtrConstant(x * sizeof(buffer[0])); 3591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* load = m.Load(rep, base, index0); 3592014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* index1 = m.IntPtrConstant(y * sizeof(buffer[0])); 3593014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Store(rep.representation(), base, index1, load, kNoWriteBarrier); 3594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Constant(OK)); 3595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(buffer[x] != buffer[y]); 3597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(OK, m.Call()); 3598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(buffer[x] == buffer[y]); 3599b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3600b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunLoadStore) { 3604014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RunLoadStore<int8_t>(MachineType::Int8()); 3605014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RunLoadStore<uint8_t>(MachineType::Uint8()); 3606014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RunLoadStore<int16_t>(MachineType::Int16()); 3607014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RunLoadStore<uint16_t>(MachineType::Uint16()); 3608014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RunLoadStore<int32_t>(MachineType::Int32()); 3609014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RunLoadStore<uint32_t>(MachineType::Uint32()); 3610014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RunLoadStore<void*>(MachineType::AnyTagged()); 3611014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RunLoadStore<float>(MachineType::Float32()); 3612014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RunLoadStore<double>(MachineType::Float64()); 3613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3616014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat32Add) { 3617014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BufferedRawMachineAssemblerTester<float> m(MachineType::Float32(), 3618014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType::Float32()); 3619014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.Float32Add(m.Parameter(0), m.Parameter(1))); 3620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3621014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT32_INPUTS(i) { 3622014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT32_INPUTS(j) { 3623014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch volatile float expected = *i + *j; 3624014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CheckFloatEq(expected, m.Call(*i, *j)); 3625014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 3626014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 3627014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 3628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3630014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat32Sub) { 3631014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BufferedRawMachineAssemblerTester<float> m(MachineType::Float32(), 3632014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType::Float32()); 3633014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.Float32Sub(m.Parameter(0), m.Parameter(1))); 3634014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3635014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT32_INPUTS(i) { 3636014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT32_INPUTS(j) { 3637014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch volatile float expected = *i - *j; 3638014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CheckFloatEq(expected, m.Call(*i, *j)); 3639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3644014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat32Mul) { 3645014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BufferedRawMachineAssemblerTester<float> m(MachineType::Float32(), 3646014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType::Float32()); 3647014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.Float32Mul(m.Parameter(0), m.Parameter(1))); 3648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3649014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT32_INPUTS(i) { 3650014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT32_INPUTS(j) { 3651014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch volatile float expected = *i * *j; 3652014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CheckFloatEq(expected, m.Call(*i, *j)); 3653014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 3654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3658014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat32Div) { 3659014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BufferedRawMachineAssemblerTester<float> m(MachineType::Float32(), 3660014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType::Float32()); 3661014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.Float32Div(m.Parameter(0), m.Parameter(1))); 3662b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3663014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT32_INPUTS(i) { 3664014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT32_INPUTS(j) { 3665014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch volatile float expected = *i / *j; 3666014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CheckFloatEq(expected, m.Call(*i, *j)); 3667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3672014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat64Add) { 3673014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BufferedRawMachineAssemblerTester<double> m(MachineType::Float64(), 3674014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType::Float64()); 3675014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.Float64Add(m.Parameter(0), m.Parameter(1))); 3676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3677014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT64_INPUTS(i) { 3678014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT64_INPUTS(j) { 3679014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch volatile double expected = *i + *j; 3680014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CheckDoubleEq(expected, m.Call(*i, *j)); 3681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3686014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat64Sub) { 3687014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BufferedRawMachineAssemblerTester<double> m(MachineType::Float64(), 3688014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType::Float64()); 3689014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.Float64Sub(m.Parameter(0), m.Parameter(1))); 3690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_FLOAT64_INPUTS(i) { 3692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_FLOAT64_INPUTS(j) { 3693014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch volatile double expected = *i - *j; 3694014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CheckDoubleEq(expected, m.Call(*i, *j)); 3695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3700014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat64Mul) { 3701014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BufferedRawMachineAssemblerTester<double> m(MachineType::Float64(), 3702014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType::Float64()); 3703014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.Float64Mul(m.Parameter(0), m.Parameter(1))); 3704b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_FLOAT64_INPUTS(i) { 3706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_FLOAT64_INPUTS(j) { 3707014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch volatile double expected = *i * *j; 3708014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CheckDoubleEq(expected, m.Call(*i, *j)); 3709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3714014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat64Div) { 3715014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BufferedRawMachineAssemblerTester<double> m(MachineType::Float64(), 3716014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType::Float64()); 3717014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.Float64Div(m.Parameter(0), m.Parameter(1))); 3718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3719014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT64_INPUTS(i) { 3720014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT64_INPUTS(j) { 3721014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch volatile double expected = *i / *j; 3722014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CheckDoubleEq(expected, m.Call(*i, *j)); 3723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3725b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3726b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3727b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3728014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat64Mod) { 3729014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BufferedRawMachineAssemblerTester<double> m(MachineType::Float64(), 3730014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType::Float64()); 3731014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.Float64Mod(m.Parameter(0), m.Parameter(1))); 3732b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3733014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT64_INPUTS(i) { 3734014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT64_INPUTS(j) { CheckDoubleEq(modulo(*i, *j), m.Call(*i, *j)); } 3735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3736014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 3737014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3738014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3739014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunDeadFloat32Binops) { 3740014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m; 3741014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3742014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch const Operator* ops[] = {m.machine()->Float32Add(), m.machine()->Float32Sub(), 3743014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.machine()->Float32Mul(), m.machine()->Float32Div(), 3744014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch NULL}; 3745014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3746014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (int i = 0; ops[i] != NULL; i++) { 3747b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 3748014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int constant = 0x53355 + i; 3749014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.AddNode(ops[i], m.Float32Constant(0.1f), m.Float32Constant(1.11f)); 3750014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.Int32Constant(constant)); 3751014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(constant, m.Call()); 3752b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3756014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunDeadFloat64Binops) { 3757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 3758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3759014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch const Operator* ops[] = {m.machine()->Float64Add(), m.machine()->Float64Sub(), 3760014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.machine()->Float64Mul(), m.machine()->Float64Div(), 3761014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.machine()->Float64Mod(), NULL}; 3762014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3763014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (int i = 0; ops[i] != NULL; i++) { 3764014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m; 3765014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int constant = 0x53355 + i; 3766014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.AddNode(ops[i], m.Float64Constant(0.1), m.Float64Constant(1.11)); 3767014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.Int32Constant(constant)); 3768014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(constant, m.Call()); 3769b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3770b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3771b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3773014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat32AddP) { 3774014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m; 3775014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Float32BinopTester bt(&m); 3776b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3777014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bt.AddReturn(m.Float32Add(bt.param0, bt.param1)); 3778014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3779014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT32_INPUTS(pl) { 3780014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT32_INPUTS(pr) { 3781014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch float expected = *pl + *pr; 3782014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CheckFloatEq(expected, bt.call(*pl, *pr)); 3783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3788014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat64AddP) { 3789b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 3790b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Float64BinopTester bt(&m); 3791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3792014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bt.AddReturn(m.Float64Add(bt.param0, bt.param1)); 3793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_FLOAT64_INPUTS(pl) { 3795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_FLOAT64_INPUTS(pr) { 3796014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch double expected = *pl + *pr; 3797014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CheckDoubleEq(expected, bt.call(*pl, *pr)); 3798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3803014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloa32MaxP) { 3804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 3805014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Float32BinopTester bt(&m); 3806014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!m.machine()->Float32Max().IsSupported()) return; 3807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3808014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bt.AddReturn(m.Float32Max(bt.param0, bt.param1)); 3809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3810014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT32_INPUTS(pl) { 3811014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT32_INPUTS(pr) { 3812014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch double expected = *pl > *pr ? *pl : *pr; 3813014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CheckDoubleEq(expected, bt.call(*pl, *pr)); 3814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3817b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3819014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat64MaxP) { 3820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 3821014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Float64BinopTester bt(&m); 3822014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!m.machine()->Float64Max().IsSupported()) return; 3823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3824014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bt.AddReturn(m.Float64Max(bt.param0, bt.param1)); 3825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3826014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT64_INPUTS(pl) { 3827014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT64_INPUTS(pr) { 3828014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch double expected = *pl > *pr ? *pl : *pr; 3829014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CheckDoubleEq(expected, bt.call(*pl, *pr)); 3830014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 3831014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 3832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3834b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3835014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat32MinP) { 3836014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m; 3837014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Float32BinopTester bt(&m); 3838014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!m.machine()->Float32Min().IsSupported()) return; 3839b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3840014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bt.AddReturn(m.Float32Min(bt.param0, bt.param1)); 3841b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3842014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT32_INPUTS(pl) { 3843014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT32_INPUTS(pr) { 3844014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch double expected = *pl < *pr ? *pl : *pr; 3845014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CheckDoubleEq(expected, bt.call(*pl, *pr)); 3846014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 3847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3851014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat64MinP) { 3852014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m; 3853014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Float64BinopTester bt(&m); 3854014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!m.machine()->Float64Min().IsSupported()) return; 3855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3856014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bt.AddReturn(m.Float64Min(bt.param0, bt.param1)); 3857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3858014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT64_INPUTS(pl) { 3859014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT64_INPUTS(pr) { 3860014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch double expected = *pl < *pr ? *pl : *pr; 3861014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CheckDoubleEq(expected, bt.call(*pl, *pr)); 3862014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 3863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3866b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3867014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat32SubP) { 3868958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier RawMachineAssemblerTester<int32_t> m; 3869014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Float32BinopTester bt(&m); 3870958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3871014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bt.AddReturn(m.Float32Sub(bt.param0, bt.param1)); 3872958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3873014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT32_INPUTS(pl) { 3874014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT32_INPUTS(pr) { 3875014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch float expected = *pl - *pr; 3876014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CheckFloatEq(expected, bt.call(*pl, *pr)); 3877014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 3878958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3879014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 3880958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3881958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3882014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat32SubImm1) { 3883014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT32_INPUTS(i) { 3884014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BufferedRawMachineAssemblerTester<float> m(MachineType::Float32()); 3885014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.Float32Sub(m.Float32Constant(*i), m.Parameter(0))); 3886014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3887014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT32_INPUTS(j) { 3888014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch volatile float expected = *i - *j; 3889014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CheckFloatEq(expected, m.Call(*j)); 3890014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 3891958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3892014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 3893958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3894958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3895014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat32SubImm2) { 3896014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT32_INPUTS(i) { 3897014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BufferedRawMachineAssemblerTester<float> m(MachineType::Float32()); 3898014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.Float32Sub(m.Parameter(0), m.Float32Constant(*i))); 3899014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3900014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT32_INPUTS(j) { 3901014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch volatile float expected = *j - *i; 3902014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CheckFloatEq(expected, m.Call(*j)); 3903014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 3904958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3905958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 3906958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3907958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3908014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat64SubImm1) { 3909014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT64_INPUTS(i) { 3910014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BufferedRawMachineAssemblerTester<double> m(MachineType::Float64()); 3911014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.Float64Sub(m.Float64Constant(*i), m.Parameter(0))); 3912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3913014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT64_INPUTS(j) { CheckFloatEq(*i - *j, m.Call(*j)); } 3914014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 3915014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 3916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3917014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3918014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat64SubImm2) { 3919014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT64_INPUTS(i) { 3920014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BufferedRawMachineAssemblerTester<double> m(MachineType::Float64()); 3921014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.Float64Sub(m.Parameter(0), m.Float64Constant(*i))); 3922014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3923014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT64_INPUTS(j) { CheckFloatEq(*j - *i, m.Call(*j)); } 3924014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 3925b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3926b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3927b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3928014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat64SubP) { 3929b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 3930014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Float64BinopTester bt(&m); 3931b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3932014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bt.AddReturn(m.Float64Sub(bt.param0, bt.param1)); 3933b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3934014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT64_INPUTS(pl) { 3935014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT64_INPUTS(pr) { 3936014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch double expected = *pl - *pr; 3937014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CheckDoubleEq(expected, bt.call(*pl, *pr)); 3938b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3939b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3940014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 3941b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3942b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3943014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat32MulP) { 3944014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m; 3945014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Float32BinopTester bt(&m); 3946014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3947014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bt.AddReturn(m.Float32Mul(bt.param0, bt.param1)); 3948014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3949014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT32_INPUTS(pl) { 3950014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT32_INPUTS(pr) { 3951014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch float expected = *pl * *pr; 3952014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CheckFloatEq(expected, bt.call(*pl, *pr)); 3953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3954b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3955b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3956b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3957b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3958014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat64MulP) { 3959b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 3960014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Float64BinopTester bt(&m); 3961b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3962014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bt.AddReturn(m.Float64Mul(bt.param0, bt.param1)); 3963b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3964014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT64_INPUTS(pl) { 3965014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT64_INPUTS(pr) { 3966014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch double expected = *pl * *pr; 3967014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CheckDoubleEq(expected, bt.call(*pl, *pr)); 3968014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 3969b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3970014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 3971b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3972b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3973014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat64MulAndFloat64Add1) { 3974014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BufferedRawMachineAssemblerTester<double> m( 3975014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType::Float64(), MachineType::Float64(), MachineType::Float64()); 3976014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.Float64Add(m.Float64Mul(m.Parameter(0), m.Parameter(1)), 3977014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Parameter(2))); 3978014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3979014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT64_INPUTS(i) { 3980014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT64_INPUTS(j) { 3981014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT64_INPUTS(k) { 3982014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CheckDoubleEq((*i * *j) + *k, m.Call(*i, *j, *k)); 3983014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 3984b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3987b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3989014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat64MulAndFloat64Add2) { 3990014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BufferedRawMachineAssemblerTester<double> m( 3991014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType::Float64(), MachineType::Float64(), MachineType::Float64()); 3992014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.Float64Add(m.Parameter(0), 3993014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Float64Mul(m.Parameter(1), m.Parameter(2)))); 3994b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3995014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT64_INPUTS(i) { 3996014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT64_INPUTS(j) { 3997014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT64_INPUTS(k) { 3998014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CheckDoubleEq(*i + (*j * *k), m.Call(*i, *j, *k)); 3999014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 4000014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 4001b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4002014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 4003014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4005014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat64MulAndFloat64Sub1) { 4006014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BufferedRawMachineAssemblerTester<double> m( 4007014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType::Float64(), MachineType::Float64(), MachineType::Float64()); 4008014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.Float64Sub(m.Float64Mul(m.Parameter(0), m.Parameter(1)), 4009014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Parameter(2))); 4010014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4011014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT64_INPUTS(i) { 4012014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT64_INPUTS(j) { 4013014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT64_INPUTS(k) { 4014014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CheckDoubleEq((*i * *j) - *k, m.Call(*i, *j, *k)); 4015014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 4016014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 4017b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4018014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 4019b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4020b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4021014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat64MulAndFloat64Sub2) { 4022014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BufferedRawMachineAssemblerTester<double> m( 4023014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType::Float64(), MachineType::Float64(), MachineType::Float64()); 4024014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.Float64Sub(m.Parameter(0), 4025014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Float64Mul(m.Parameter(1), m.Parameter(2)))); 4026014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4027014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT64_INPUTS(i) { 4028014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT64_INPUTS(j) { 4029014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT64_INPUTS(k) { 4030014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CheckDoubleEq(*i - (*j * *k), m.Call(*i, *j, *k)); 4031014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 4032014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 4033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4034014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 4035b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4037014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat64MulImm1) { 4038014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT64_INPUTS(i) { 4039014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BufferedRawMachineAssemblerTester<double> m(MachineType::Float64()); 4040014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.Float64Mul(m.Float64Constant(*i), m.Parameter(0))); 4041014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4042014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT64_INPUTS(j) { CheckFloatEq(*i * *j, m.Call(*j)); } 4043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 4045b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4047014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat64MulImm2) { 4048014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT64_INPUTS(i) { 4049014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BufferedRawMachineAssemblerTester<double> m(MachineType::Float64()); 4050014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.Float64Mul(m.Parameter(0), m.Float64Constant(*i))); 4051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4052014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT64_INPUTS(j) { CheckFloatEq(*j * *i, m.Call(*j)); } 4053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4054014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 4055014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4056014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4057014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat32DivP) { 4058014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m; 4059014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Float32BinopTester bt(&m); 4060014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4061014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bt.AddReturn(m.Float32Div(bt.param0, bt.param1)); 4062b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4063014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT32_INPUTS(pl) { 4064014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT32_INPUTS(pr) { 4065014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch float expected = *pl / *pr; 4066014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CheckFloatEq(expected, bt.call(*pl, *pr)); 4067014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 4068b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4069014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 4070b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4072014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat64DivP) { 4073014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m; 4074014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Float64BinopTester bt(&m); 4075014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4076014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bt.AddReturn(m.Float64Div(bt.param0, bt.param1)); 4077014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4078014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT64_INPUTS(pl) { 4079014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT64_INPUTS(pr) { 4080014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch double expected = *pl / *pr; 4081014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CheckDoubleEq(expected, bt.call(*pl, *pr)); 4082b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4083b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4084014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 4085b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4086b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4087014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat64ModP) { 4088014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m; 4089014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Float64BinopTester bt(&m); 4090014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4091014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bt.AddReturn(m.Float64Mod(bt.param0, bt.param1)); 4092014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4093014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT64_INPUTS(i) { 4094014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT64_INPUTS(j) { 4095014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch double expected = modulo(*i, *j); 4096014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch double found = bt.call(*i, *j); 4097014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CheckDoubleEq(expected, found); 4098b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4099b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 4101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4103014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunChangeInt32ToFloat64_A) { 4104014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int32_t magic = 0x986234; 4105014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BufferedRawMachineAssemblerTester<double> m; 4106014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.ChangeInt32ToFloat64(m.Int32Constant(magic))); 4107014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CheckDoubleEq(static_cast<double>(magic), m.Call()); 4108014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 4109014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4110014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4111014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunChangeInt32ToFloat64_B) { 4112014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BufferedRawMachineAssemblerTester<double> m(MachineType::Int32()); 4113014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.ChangeInt32ToFloat64(m.Parameter(0))); 4114014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4115014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_INT32_INPUTS(i) { CheckDoubleEq(static_cast<double>(*i), m.Call(*i)); } 4116014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 4117014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4118014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4119014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunChangeUint32ToFloat64) { 4120014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BufferedRawMachineAssemblerTester<double> m(MachineType::Uint32()); 4121014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.ChangeUint32ToFloat64(m.Parameter(0))); 4122014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4123014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_UINT32_INPUTS(i) { CheckDoubleEq(static_cast<double>(*i), m.Call(*i)); } 4124014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 4125014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4126014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4127014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunChangeFloat64ToInt32_A) { 4128014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BufferedRawMachineAssemblerTester<int32_t> m; 4129014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch double magic = 11.1; 4130014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.ChangeFloat64ToInt32(m.Float64Constant(magic))); 4131014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(static_cast<int32_t>(magic), m.Call()); 4132014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 4133014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4134014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4135014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunChangeFloat64ToInt32_B) { 4136014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BufferedRawMachineAssemblerTester<int32_t> m(MachineType::Float64()); 4137014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.ChangeFloat64ToInt32(m.Parameter(0))); 4138014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4139014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Note we don't check fractional inputs, or inputs outside the range of 4140014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // int32, because these Convert operators really should be Change operators. 4141014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_INT32_INPUTS(i) { CHECK_EQ(*i, m.Call(static_cast<double>(*i))); } 4142958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4143014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (int32_t n = 1; n < 31; ++n) { 4144014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(1 << n, m.Call(static_cast<double>(1 << n))); 4145958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4146958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4147014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (int32_t n = 1; n < 31; ++n) { 4148014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(3 << n, m.Call(static_cast<double>(3 << n))); 4149958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4150014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 4151958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4152958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4153014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunChangeFloat64ToUint32) { 4154014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BufferedRawMachineAssemblerTester<uint32_t> m(MachineType::Float64()); 4155014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.ChangeFloat64ToUint32(m.Parameter(0))); 4156014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4157014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch { 4158014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_UINT32_INPUTS(i) { CHECK_EQ(*i, m.Call(static_cast<double>(*i))); } 4159958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4160958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4161014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Check various powers of 2. 4162014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (int32_t n = 1; n < 31; ++n) { 4163014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch { CHECK_EQ(1u << n, m.Call(static_cast<double>(1u << n))); } 4164958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4165014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch { CHECK_EQ(3u << n, m.Call(static_cast<double>(3u << n))); } 4166958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4167014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Note we don't check fractional inputs, because these Convert operators 4168014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // really should be Change operators. 4169014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 4170014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4171014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4172014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunTruncateFloat64ToFloat32) { 4173014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BufferedRawMachineAssemblerTester<float> m(MachineType::Float64()); 4174014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4175014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.TruncateFloat64ToFloat32(m.Parameter(0))); 4176014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4177014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT64_INPUTS(i) { CheckFloatEq(DoubleToFloat32(*i), m.Call(*i)); } 4178958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 4179958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4180958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunDeadChangeFloat64ToInt32) { 4182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 4183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const int magic = 0x88abcda4; 4184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.ChangeFloat64ToInt32(m.Float64Constant(999.78)); 4185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Constant(magic)); 4186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(magic, m.Call()); 4187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 4188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunDeadChangeInt32ToFloat64) { 4191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 4192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const int magic = 0x8834abcd; 4193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.ChangeInt32ToFloat64(m.Int32Constant(magic - 6888)); 4194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Constant(magic)); 4195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(magic, m.Call()); 4196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 4197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunLoopPhiInduction2) { 4200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 4201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int false_val = 0x10777; 4203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // x = false_val; while(false) { x++; } return x; 4205014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineLabel header, body, end; 4206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* false_node = m.Int32Constant(false_val); 4207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Goto(&header); 4208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&header); 4209014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* phi = m.Phi(MachineRepresentation::kWord32, false_node, false_node); 4210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Branch(m.Int32Constant(0), &body, &end); 4211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&body); 4212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* add = m.Int32Add(phi, m.Int32Constant(1)); 4213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch phi->ReplaceInput(1, add); 4214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Goto(&header); 4215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&end); 4216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(phi); 4217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(false_val, m.Call()); 4219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 4220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4222014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloatDiamond) { 4223014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m; 4224014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4225014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch const int magic = 99645; 4226014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch float buffer = 0.1f; 4227014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch float constant = 99.99f; 4228014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4229014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineLabel blocka, blockb, end; 4230014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* k1 = m.Float32Constant(constant); 4231014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* k2 = m.Float32Constant(0 - constant); 4232014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Branch(m.Int32Constant(0), &blocka, &blockb); 4233014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Bind(&blocka); 4234014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Goto(&end); 4235014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Bind(&blockb); 4236014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Goto(&end); 4237014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Bind(&end); 4238014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* phi = m.Phi(MachineRepresentation::kFloat32, k2, k1); 4239014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Store(MachineRepresentation::kFloat32, m.PointerConstant(&buffer), 4240014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.IntPtrConstant(0), phi, kNoWriteBarrier); 4241014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.Int32Constant(magic)); 4242014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4243014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(magic, m.Call()); 4244014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK(constant == buffer); 4245014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 4246014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4247014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunDoubleDiamond) { 4249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 4250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const int magic = 99645; 4252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double buffer = 0.1; 4253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double constant = 99.99; 4254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4255014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineLabel blocka, blockb, end; 4256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* k1 = m.Float64Constant(constant); 4257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* k2 = m.Float64Constant(0 - constant); 4258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Branch(m.Int32Constant(0), &blocka, &blockb); 4259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blocka); 4260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Goto(&end); 4261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blockb); 4262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Goto(&end); 4263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&end); 4264014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* phi = m.Phi(MachineRepresentation::kFloat64, k2, k1); 4265014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Store(MachineRepresentation::kFloat64, m.PointerConstant(&buffer), 4266014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Int32Constant(0), phi, kNoWriteBarrier); 4267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Constant(magic)); 4268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(magic, m.Call()); 4270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(constant, buffer); 4271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 4272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunRefDiamond) { 4275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 4276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const int magic = 99644; 4278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<String> rexpected = 4279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CcTest::i_isolate()->factory()->InternalizeUtf8String("A"); 4280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch String* buffer; 4281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4282014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineLabel blocka, blockb, end; 4283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* k1 = m.StringConstant("A"); 4284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* k2 = m.StringConstant("B"); 4285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Branch(m.Int32Constant(0), &blocka, &blockb); 4286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blocka); 4287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Goto(&end); 4288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blockb); 4289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Goto(&end); 4290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&end); 4291014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* phi = m.Phi(MachineRepresentation::kTagged, k2, k1); 4292014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Store(MachineRepresentation::kTagged, m.PointerConstant(&buffer), 4293014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Int32Constant(0), phi, kNoWriteBarrier); 4294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Constant(magic)); 4295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(magic, m.Call()); 4297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(rexpected->SameValue(buffer)); 4298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 4299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunDoubleRefDiamond) { 4302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 4303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const int magic = 99648; 4305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double dbuffer = 0.1; 4306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double dconstant = 99.99; 4307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<String> rexpected = 4308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CcTest::i_isolate()->factory()->InternalizeUtf8String("AX"); 4309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch String* rbuffer; 4310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4311014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineLabel blocka, blockb, end; 4312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* d1 = m.Float64Constant(dconstant); 4313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* d2 = m.Float64Constant(0 - dconstant); 4314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* r1 = m.StringConstant("AX"); 4315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* r2 = m.StringConstant("BX"); 4316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Branch(m.Int32Constant(0), &blocka, &blockb); 4317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blocka); 4318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Goto(&end); 4319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blockb); 4320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Goto(&end); 4321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&end); 4322014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* dphi = m.Phi(MachineRepresentation::kFloat64, d2, d1); 4323014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* rphi = m.Phi(MachineRepresentation::kTagged, r2, r1); 4324014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Store(MachineRepresentation::kFloat64, m.PointerConstant(&dbuffer), 4325014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Int32Constant(0), dphi, kNoWriteBarrier); 4326014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Store(MachineRepresentation::kTagged, m.PointerConstant(&rbuffer), 4327014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Int32Constant(0), rphi, kNoWriteBarrier); 4328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Constant(magic)); 4329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(magic, m.Call()); 4331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(dconstant, dbuffer); 4332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(rexpected->SameValue(rbuffer)); 4333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 4334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunDoubleRefDoubleDiamond) { 4337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 4338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const int magic = 99649; 4340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double dbuffer = 0.1; 4341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double dconstant = 99.997; 4342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<String> rexpected = 4343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CcTest::i_isolate()->factory()->InternalizeUtf8String("AD"); 4344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch String* rbuffer; 4345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4346014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineLabel blocka, blockb, mid, blockd, blocke, end; 4347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* d1 = m.Float64Constant(dconstant); 4348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* d2 = m.Float64Constant(0 - dconstant); 4349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* r1 = m.StringConstant("AD"); 4350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* r2 = m.StringConstant("BD"); 4351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Branch(m.Int32Constant(0), &blocka, &blockb); 4352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blocka); 4353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Goto(&mid); 4354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blockb); 4355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Goto(&mid); 4356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&mid); 4357014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* dphi1 = m.Phi(MachineRepresentation::kFloat64, d2, d1); 4358014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* rphi1 = m.Phi(MachineRepresentation::kTagged, r2, r1); 4359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Branch(m.Int32Constant(0), &blockd, &blocke); 4360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blockd); 4362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Goto(&end); 4363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blocke); 4364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Goto(&end); 4365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&end); 4366014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* dphi2 = m.Phi(MachineRepresentation::kFloat64, d1, dphi1); 4367014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* rphi2 = m.Phi(MachineRepresentation::kTagged, r1, rphi1); 4368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4369014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Store(MachineRepresentation::kFloat64, m.PointerConstant(&dbuffer), 4370014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Int32Constant(0), dphi2, kNoWriteBarrier); 4371014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Store(MachineRepresentation::kTagged, m.PointerConstant(&rbuffer), 4372014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Int32Constant(0), rphi2, kNoWriteBarrier); 4373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Constant(magic)); 4374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(magic, m.Call()); 4376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(dconstant, dbuffer); 4377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(rexpected->SameValue(rbuffer)); 4378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 4379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunDoubleLoopPhi) { 4382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 4383014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineLabel header, body, end; 4384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int magic = 99773; 4386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double buffer = 0.99; 4387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double dconstant = 777.1; 4388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* zero = m.Int32Constant(0); 4390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* dk = m.Float64Constant(dconstant); 4391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Goto(&header); 4393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&header); 4394014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* phi = m.Phi(MachineRepresentation::kFloat64, dk, dk); 4395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch phi->ReplaceInput(1, phi); 4396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Branch(zero, &body, &end); 4397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&body); 4398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Goto(&header); 4399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&end); 4400014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Store(MachineRepresentation::kFloat64, m.PointerConstant(&buffer), 4401014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Int32Constant(0), phi, kNoWriteBarrier); 4402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Constant(magic)); 4403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(magic, m.Call()); 4405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 4406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunCountToTenAccRaw) { 4409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 4410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* zero = m.Int32Constant(0); 4412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* ten = m.Int32Constant(10); 4413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* one = m.Int32Constant(1); 4414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4415014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineLabel header, body, body_cont, end; 4416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Goto(&header); 4418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&header); 4420014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* i = m.Phi(MachineRepresentation::kWord32, zero, zero); 4421014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* j = m.Phi(MachineRepresentation::kWord32, zero, zero); 4422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Goto(&body); 4423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&body); 4425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* next_i = m.Int32Add(i, one); 4426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* next_j = m.Int32Add(j, one); 4427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Branch(m.Word32Equal(next_i, ten), &end, &body_cont); 4428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&body_cont); 4430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch i->ReplaceInput(1, next_i); 4431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch j->ReplaceInput(1, next_j); 4432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Goto(&header); 4433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&end); 4435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(ten); 4436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(10, m.Call()); 4438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 4439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunCountToTenAccRaw2) { 4442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 4443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* zero = m.Int32Constant(0); 4445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* ten = m.Int32Constant(10); 4446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* one = m.Int32Constant(1); 4447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4448014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineLabel header, body, body_cont, end; 4449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Goto(&header); 4451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&header); 4453014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* i = m.Phi(MachineRepresentation::kWord32, zero, zero); 4454014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* j = m.Phi(MachineRepresentation::kWord32, zero, zero); 4455014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* k = m.Phi(MachineRepresentation::kWord32, zero, zero); 4456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Goto(&body); 4457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&body); 4459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* next_i = m.Int32Add(i, one); 4460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* next_j = m.Int32Add(j, one); 4461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* next_k = m.Int32Add(j, one); 4462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Branch(m.Word32Equal(next_i, ten), &end, &body_cont); 4463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&body_cont); 4465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch i->ReplaceInput(1, next_i); 4466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch j->ReplaceInput(1, next_j); 4467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch k->ReplaceInput(1, next_k); 4468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Goto(&header); 4469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&end); 4471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(ten); 4472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(10, m.Call()); 4474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 4475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunAddTree) { 4478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 4479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t inputs[] = {11, 12, 13, 14, 15, 16, 17, 18}; 4480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* base = m.PointerConstant(inputs); 4482014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* n0 = 4483014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Load(MachineType::Int32(), base, m.Int32Constant(0 * sizeof(int32_t))); 4484014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* n1 = 4485014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Load(MachineType::Int32(), base, m.Int32Constant(1 * sizeof(int32_t))); 4486014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* n2 = 4487014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Load(MachineType::Int32(), base, m.Int32Constant(2 * sizeof(int32_t))); 4488014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* n3 = 4489014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Load(MachineType::Int32(), base, m.Int32Constant(3 * sizeof(int32_t))); 4490014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* n4 = 4491014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Load(MachineType::Int32(), base, m.Int32Constant(4 * sizeof(int32_t))); 4492014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* n5 = 4493014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Load(MachineType::Int32(), base, m.Int32Constant(5 * sizeof(int32_t))); 4494014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* n6 = 4495014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Load(MachineType::Int32(), base, m.Int32Constant(6 * sizeof(int32_t))); 4496014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* n7 = 4497014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Load(MachineType::Int32(), base, m.Int32Constant(7 * sizeof(int32_t))); 4498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* i1 = m.Int32Add(n0, n1); 4500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* i2 = m.Int32Add(n2, n3); 4501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* i3 = m.Int32Add(n4, n5); 4502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* i4 = m.Int32Add(n6, n7); 4503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* i5 = m.Int32Add(i1, i2); 4505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* i6 = m.Int32Add(i3, i4); 4506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* i7 = m.Int32Add(i5, i6); 4508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(i7); 4510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(116, m.Call()); 4512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 4513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic const int kFloat64CompareHelperTestCases = 15; 4516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic const int kFloat64CompareHelperNodeType = 4; 4517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic int Float64CompareHelper(RawMachineAssemblerTester<int32_t>* m, 4519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int test_case, int node_type, double x, 4520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double y) { 4521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static double buffer[2]; 4522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch buffer[0] = x; 4523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch buffer[1] = y; 4524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(0 <= test_case && test_case < kFloat64CompareHelperTestCases); 4525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(0 <= node_type && node_type < kFloat64CompareHelperNodeType); 4526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(x < y); 4527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool load_a = node_type / 2 == 1; 4528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool load_b = node_type % 2 == 1; 4529014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* a = 4530014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch load_a ? m->Load(MachineType::Float64(), m->PointerConstant(&buffer[0])) 4531014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch : m->Float64Constant(x); 4532014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* b = 4533014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch load_b ? m->Load(MachineType::Float64(), m->PointerConstant(&buffer[1])) 4534014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch : m->Float64Constant(y); 4535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* cmp = NULL; 4536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool expected = false; 4537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch switch (test_case) { 4538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Equal tests. 4539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 0: 4540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch cmp = m->Float64Equal(a, b); 4541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch expected = false; 4542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 4543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 1: 4544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch cmp = m->Float64Equal(a, a); 4545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch expected = true; 4546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 4547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // LessThan tests. 4548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 2: 4549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch cmp = m->Float64LessThan(a, b); 4550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch expected = true; 4551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 4552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 3: 4553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch cmp = m->Float64LessThan(b, a); 4554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch expected = false; 4555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 4556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 4: 4557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch cmp = m->Float64LessThan(a, a); 4558b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch expected = false; 4559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 4560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // LessThanOrEqual tests. 4561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 5: 4562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch cmp = m->Float64LessThanOrEqual(a, b); 4563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch expected = true; 4564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 4565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 6: 4566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch cmp = m->Float64LessThanOrEqual(b, a); 4567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch expected = false; 4568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 4569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 7: 4570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch cmp = m->Float64LessThanOrEqual(a, a); 4571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch expected = true; 4572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 4573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // NotEqual tests. 4574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 8: 4575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch cmp = m->Float64NotEqual(a, b); 4576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch expected = true; 4577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 4578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 9: 4579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch cmp = m->Float64NotEqual(b, a); 4580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch expected = true; 4581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 4582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 10: 4583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch cmp = m->Float64NotEqual(a, a); 4584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch expected = false; 4585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 4586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // GreaterThan tests. 4587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 11: 4588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch cmp = m->Float64GreaterThan(a, a); 4589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch expected = false; 4590b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 4591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 12: 4592b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch cmp = m->Float64GreaterThan(a, b); 4593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch expected = false; 4594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 4595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // GreaterThanOrEqual tests. 4596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 13: 4597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch cmp = m->Float64GreaterThanOrEqual(a, a); 4598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch expected = true; 4599b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 4600b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 14: 4601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch cmp = m->Float64GreaterThanOrEqual(b, a); 4602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch expected = true; 4603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 4604b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch default: 4605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UNREACHABLE(); 4606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m->Return(cmp); 4608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return expected; 4609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 4610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4612b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunFloat64Compare) { 4613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double inf = V8_INFINITY; 4614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // All pairs (a1, a2) are of the form a1 < a2. 4615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double inputs[] = {0.0, 1.0, -1.0, 0.22, -1.22, 0.22, 4616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch -inf, 0.22, 0.22, inf, -inf, inf}; 4617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int test = 0; test < kFloat64CompareHelperTestCases; test++) { 4619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int node_type = 0; node_type < kFloat64CompareHelperNodeType; 4620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch node_type++) { 4621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (size_t input = 0; input < arraysize(inputs); input += 2) { 4622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 4623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int expected = Float64CompareHelper(&m, test, node_type, inputs[input], 4624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inputs[input + 1]); 4625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, m.Call()); 4626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 4630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunFloat64UnorderedCompare) { 4633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 4634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const Operator* operators[] = {m.machine()->Float64Equal(), 4636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.machine()->Float64LessThan(), 4637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.machine()->Float64LessThanOrEqual()}; 4638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4639014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch double nan = std::numeric_limits<double>::quiet_NaN(); 4640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_FLOAT64_INPUTS(i) { 4642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (size_t o = 0; o < arraysize(operators); ++o) { 4643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int j = 0; j < 2; j++) { 4644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 4645b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* a = m.Float64Constant(*i); 4646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* b = m.Float64Constant(nan); 4647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (j == 1) std::swap(a, b); 4648014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.AddNode(operators[o], a, b)); 4649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(0, m.Call()); 4650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 4654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunFloat64Equal) { 4657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double input_a = 0.0; 4658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double input_b = 0.0; 4659b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 4661014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* a = m.LoadFromPointer(&input_a, MachineType::Float64()); 4662014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* b = m.LoadFromPointer(&input_b, MachineType::Float64()); 4663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Float64Equal(a, b)); 4664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CompareWrapper cmp(IrOpcode::kFloat64Equal); 4666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_FLOAT64_INPUTS(pl) { 4667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_FLOAT64_INPUTS(pr) { 4668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch input_a = *pl; 4669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch input_b = *pr; 4670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t expected = cmp.Float64Compare(input_a, input_b) ? 1 : 0; 4671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, m.Call()); 4672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 4675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunFloat64LessThan) { 4678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double input_a = 0.0; 4679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double input_b = 0.0; 4680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 4682014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* a = m.LoadFromPointer(&input_a, MachineType::Float64()); 4683014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* b = m.LoadFromPointer(&input_b, MachineType::Float64()); 4684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Float64LessThan(a, b)); 4685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CompareWrapper cmp(IrOpcode::kFloat64LessThan); 4687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_FLOAT64_INPUTS(pl) { 4688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_FLOAT64_INPUTS(pr) { 4689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch input_a = *pl; 4690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch input_b = *pr; 4691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t expected = cmp.Float64Compare(input_a, input_b) ? 1 : 0; 4692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, m.Call()); 4693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 4696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4698014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate <typename IntType> 4699014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochstatic void LoadStoreTruncation(MachineType kRepresentation) { 4700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch IntType input; 4701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 4703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* a = m.LoadFromPointer(&input, kRepresentation); 4704b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* ap1 = m.Int32Add(a, m.Int32Constant(1)); 4705014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.StoreToPointer(&input, kRepresentation.representation(), ap1); 4706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(ap1); 4707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const IntType max = std::numeric_limits<IntType>::max(); 4709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const IntType min = std::numeric_limits<IntType>::min(); 4710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Test upper bound. 4712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch input = max; 4713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(max + 1, m.Call()); 4714b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(min, input); 4715b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4716b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Test lower bound. 4717b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch input = min; 4718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(static_cast<IntType>(max + 2), m.Call()); 4719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(min + 1, input); 4720b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Test all one byte values that are not one byte bounds. 4722b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = -127; i < 127; i++) { 4723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch input = i; 4724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int expected = i >= 0 ? i + 1 : max + (i - min) + 2; 4725b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(static_cast<IntType>(expected), m.Call()); 4726b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(static_cast<IntType>(i + 1), input); 4727b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 4729b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4730b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4731b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunLoadStoreTruncation) { 4732014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LoadStoreTruncation<int8_t>(MachineType::Int8()); 4733014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LoadStoreTruncation<int16_t>(MachineType::Int16()); 4734b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 4735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic void IntPtrCompare(intptr_t left, intptr_t right) { 4738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int test = 0; test < 7; test++) { 4739014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<bool> m(MachineType::Pointer(), 4740014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType::Pointer()); 4741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* p0 = m.Parameter(0); 4742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* p1 = m.Parameter(1); 4743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* res = NULL; 4744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool expected = false; 4745b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch switch (test) { 4746b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 0: 4747b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch res = m.IntPtrLessThan(p0, p1); 4748b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch expected = true; 4749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 4750b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 1: 4751b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch res = m.IntPtrLessThanOrEqual(p0, p1); 4752b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch expected = true; 4753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 4754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 2: 4755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch res = m.IntPtrEqual(p0, p1); 4756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch expected = false; 4757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 4758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 3: 4759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch res = m.IntPtrGreaterThanOrEqual(p0, p1); 4760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch expected = false; 4761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 4762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 4: 4763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch res = m.IntPtrGreaterThan(p0, p1); 4764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch expected = false; 4765b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 4766b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 5: 4767b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch res = m.IntPtrEqual(p0, p0); 4768b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch expected = true; 4769b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 4770b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 6: 4771b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch res = m.IntPtrNotEqual(p0, p1); 4772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch expected = true; 4773b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 4774b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch default: 4775b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UNREACHABLE(); 4776b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 4777b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4778b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(res); 4779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, m.Call(reinterpret_cast<int32_t*>(left), 4780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch reinterpret_cast<int32_t*>(right))); 4781b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4782b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 4783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunIntPtrCompare) { 4786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch intptr_t min = std::numeric_limits<intptr_t>::min(); 4787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch intptr_t max = std::numeric_limits<intptr_t>::max(); 4788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // An ascending chain of intptr_t 4789b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch intptr_t inputs[] = {min, min / 2, -1, 0, 1, max / 2, max}; 4790b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (size_t i = 0; i < arraysize(inputs) - 1; i++) { 4791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch IntPtrCompare(inputs[i], inputs[i + 1]); 4792b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 4794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4796b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunTestIntPtrArithmetic) { 4797b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kInputSize = 10; 4798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t inputs[kInputSize]; 4799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t outputs[kInputSize]; 4800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < kInputSize; i++) { 4801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inputs[i] = i; 4802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch outputs[i] = -1; 4803b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t*> m; 4805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* input = m.PointerConstant(&inputs[0]); 4806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* output = m.PointerConstant(&outputs[kInputSize - 1]); 4807014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* elem_size = m.IntPtrConstant(sizeof(inputs[0])); 4808b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < kInputSize; i++) { 4809014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Store(MachineRepresentation::kWord32, output, 4810014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Load(MachineType::Int32(), input), kNoWriteBarrier); 4811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch input = m.IntPtrAdd(input, elem_size); 4812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch output = m.IntPtrSub(output, elem_size); 4813b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(input); 4815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(&inputs[kInputSize], m.Call()); 4816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < kInputSize; i++) { 4817b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(i, inputs[i]); 4818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(kInputSize - i - 1, outputs[i]); 4819b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 4821b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4822b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunSpillLotsOfThings) { 4824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kInputSize = 1000; 4825014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m; 4826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* accs[kInputSize]; 4827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t outputs[kInputSize]; 4828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* one = m.Int32Constant(1); 4829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* acc = one; 4830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < kInputSize; i++) { 4831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch acc = m.Int32Add(acc, one); 4832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch accs[i] = acc; 4833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4834b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < kInputSize; i++) { 4835014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.StoreToPointer(&outputs[i], MachineRepresentation::kWord32, accs[i]); 4836b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4837b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(one); 4838b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Call(); 4839b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < kInputSize; i++) { 4840b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(outputs[i], i + 2); 4841b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 4843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunSpillConstantsAndParameters) { 4846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kInputSize = 1000; 4847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int32_t kBase = 987; 4848014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m(MachineType::Int32(), 4849014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType::Int32()); 4850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t outputs[kInputSize]; 4851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* csts[kInputSize]; 4852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* accs[kInputSize]; 4853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* acc = m.Int32Constant(0); 4854b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < kInputSize; i++) { 4855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch csts[i] = m.Int32Constant(static_cast<int32_t>(kBase + i)); 4856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < kInputSize; i++) { 4858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch acc = m.Int32Add(acc, csts[i]); 4859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch accs[i] = acc; 4860b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < kInputSize; i++) { 4862014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.StoreToPointer(&outputs[i], MachineRepresentation::kWord32, accs[i]); 4863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Add(acc, m.Int32Add(m.Parameter(0), m.Parameter(1)))); 4865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(i) { 4866b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(j) { 4867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t expected = *i + *j; 4868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int k = 0; k < kInputSize; k++) { 4869b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch expected += kBase + k; 4870b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4871b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, m.Call(*i, *j)); 4872b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch expected = 0; 4873b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int k = 0; k < kInputSize; k++) { 4874b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch expected += kBase + k; 4875b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, outputs[k]); 4876b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4877b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4878b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4879b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 4880b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4881b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4882b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunNewSpaceConstantsInPhi) { 4883014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<Object*> m(MachineType::Int32()); 4884b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4885b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Isolate* isolate = CcTest::i_isolate(); 4886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<HeapNumber> true_val = isolate->factory()->NewHeapNumber(11.2); 4887b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<HeapNumber> false_val = isolate->factory()->NewHeapNumber(11.3); 4888b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* true_node = m.HeapConstant(true_val); 4889b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* false_node = m.HeapConstant(false_val); 4890b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4891014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineLabel blocka, blockb, end; 4892b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Branch(m.Parameter(0), &blocka, &blockb); 4893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blocka); 4894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Goto(&end); 4895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blockb); 4896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Goto(&end); 4897b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&end); 4899014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* phi = m.Phi(MachineRepresentation::kTagged, true_node, false_node); 4900b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(phi); 4901b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4902b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(*false_val, m.Call(0)); 4903b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(*true_val, m.Call(1)); 4904b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 4905b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4906b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4907b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunInt32AddWithOverflowP) { 4908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t actual_val = -1; 4909b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 4910b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Int32BinopTester bt(&m); 4911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* add = m.Int32AddWithOverflow(bt.param0, bt.param1); 4912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* val = m.Projection(0, add); 4913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* ovf = m.Projection(1, add); 4914014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.StoreToPointer(&actual_val, MachineRepresentation::kWord32, val); 4915b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn(ovf); 4916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(i) { 4917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(j) { 4918b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t expected_val; 4919b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int expected_ovf = bits::SignedAddOverflow32(*i, *j, &expected_val); 4920b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected_ovf, bt.call(*i, *j)); 4921b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected_val, actual_val); 4922b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4923b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4924b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 4925b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4926b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4927b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunInt32AddWithOverflowImm) { 4928b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t actual_val = -1, expected_val = 0; 4929b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(i) { 4930b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 4931014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m(MachineType::Int32()); 4932b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* add = m.Int32AddWithOverflow(m.Int32Constant(*i), m.Parameter(0)); 4933b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* val = m.Projection(0, add); 4934b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* ovf = m.Projection(1, add); 4935014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.StoreToPointer(&actual_val, MachineRepresentation::kWord32, val); 4936b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(ovf); 4937b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(j) { 4938b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int expected_ovf = bits::SignedAddOverflow32(*i, *j, &expected_val); 4939b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected_ovf, m.Call(*j)); 4940b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected_val, actual_val); 4941b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4942b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4943b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 4944014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m(MachineType::Int32()); 4945b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* add = m.Int32AddWithOverflow(m.Parameter(0), m.Int32Constant(*i)); 4946b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* val = m.Projection(0, add); 4947b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* ovf = m.Projection(1, add); 4948014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.StoreToPointer(&actual_val, MachineRepresentation::kWord32, val); 4949b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(ovf); 4950b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(j) { 4951b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int expected_ovf = bits::SignedAddOverflow32(*i, *j, &expected_val); 4952b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected_ovf, m.Call(*j)); 4953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected_val, actual_val); 4954b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4955b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4956b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(j) { 4957b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 4958b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* add = 4959b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Int32AddWithOverflow(m.Int32Constant(*i), m.Int32Constant(*j)); 4960b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* val = m.Projection(0, add); 4961b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* ovf = m.Projection(1, add); 4962014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.StoreToPointer(&actual_val, MachineRepresentation::kWord32, val); 4963b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(ovf); 4964b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int expected_ovf = bits::SignedAddOverflow32(*i, *j, &expected_val); 4965b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected_ovf, m.Call()); 4966b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected_val, actual_val); 4967b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4968b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4969b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 4970b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4971b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4972b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunInt32AddWithOverflowInBranchP) { 4973b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int constant = 911777; 4974014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineLabel blocka, blockb; 4975b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 4976b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Int32BinopTester bt(&m); 4977b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* add = m.Int32AddWithOverflow(bt.param0, bt.param1); 4978b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* ovf = m.Projection(1, add); 4979b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Branch(ovf, &blocka, &blockb); 4980b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blocka); 4981b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn(m.Int32Constant(constant)); 4982b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blockb); 4983b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* val = m.Projection(0, add); 4984b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn(val); 4985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(i) { 4986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(j) { 4987b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t expected; 4988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (bits::SignedAddOverflow32(*i, *j, &expected)) expected = constant; 4989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, bt.call(*i, *j)); 4990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4992b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 4993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4994b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4995b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunInt32SubWithOverflowP) { 4996b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t actual_val = -1; 4997b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 4998b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Int32BinopTester bt(&m); 4999b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* add = m.Int32SubWithOverflow(bt.param0, bt.param1); 5000b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* val = m.Projection(0, add); 5001b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* ovf = m.Projection(1, add); 5002014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.StoreToPointer(&actual_val, MachineRepresentation::kWord32, val); 5003b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn(ovf); 5004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(i) { 5005b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(j) { 5006b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t expected_val; 5007b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int expected_ovf = bits::SignedSubOverflow32(*i, *j, &expected_val); 5008b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected_ovf, bt.call(*i, *j)); 5009b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected_val, actual_val); 5010b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5011b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5012b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 5013b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5014b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5015b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunInt32SubWithOverflowImm) { 5016b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t actual_val = -1, expected_val = 0; 5017b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(i) { 5018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 5019014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m(MachineType::Int32()); 5020b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* add = m.Int32SubWithOverflow(m.Int32Constant(*i), m.Parameter(0)); 5021b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* val = m.Projection(0, add); 5022b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* ovf = m.Projection(1, add); 5023014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.StoreToPointer(&actual_val, MachineRepresentation::kWord32, val); 5024b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(ovf); 5025b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(j) { 5026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int expected_ovf = bits::SignedSubOverflow32(*i, *j, &expected_val); 5027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected_ovf, m.Call(*j)); 5028b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected_val, actual_val); 5029b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5030b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5031b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 5032014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m(MachineType::Int32()); 5033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* add = m.Int32SubWithOverflow(m.Parameter(0), m.Int32Constant(*i)); 5034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* val = m.Projection(0, add); 5035b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* ovf = m.Projection(1, add); 5036014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.StoreToPointer(&actual_val, MachineRepresentation::kWord32, val); 5037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(ovf); 5038b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(j) { 5039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int expected_ovf = bits::SignedSubOverflow32(*j, *i, &expected_val); 5040b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected_ovf, m.Call(*j)); 5041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected_val, actual_val); 5042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(j) { 5045b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 5046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* add = 5047b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Int32SubWithOverflow(m.Int32Constant(*i), m.Int32Constant(*j)); 5048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* val = m.Projection(0, add); 5049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* ovf = m.Projection(1, add); 5050014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.StoreToPointer(&actual_val, MachineRepresentation::kWord32, val); 5051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(ovf); 5052b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int expected_ovf = bits::SignedSubOverflow32(*i, *j, &expected_val); 5053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected_ovf, m.Call()); 5054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected_val, actual_val); 5055b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5056b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5057b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 5058b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5059b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5060b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunInt32SubWithOverflowInBranchP) { 5061b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int constant = 911999; 5062014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineLabel blocka, blockb; 5063b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 5064b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Int32BinopTester bt(&m); 5065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* sub = m.Int32SubWithOverflow(bt.param0, bt.param1); 5066b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* ovf = m.Projection(1, sub); 5067b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Branch(ovf, &blocka, &blockb); 5068b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blocka); 5069b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn(m.Int32Constant(constant)); 5070b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Bind(&blockb); 5071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* val = m.Projection(0, sub); 5072b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bt.AddReturn(val); 5073b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(i) { 5074b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(j) { 5075b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t expected; 5076b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (bits::SignedSubOverflow32(*i, *j, &expected)) expected = constant; 5077b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, bt.call(*i, *j)); 5078b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5079b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5080b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 5081b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5082b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5083014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunWord64EqualInBranchP) { 5084014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int64_t input; 5085014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineLabel blocka, blockb; 5086014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int64_t> m; 5087014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!m.machine()->Is64()) return; 5088014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* value = m.LoadFromPointer(&input, MachineType::Int64()); 5089014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Branch(m.Word64Equal(value, m.Int64Constant(0)), &blocka, &blockb); 5090014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Bind(&blocka); 5091014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.Int32Constant(1)); 5092014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Bind(&blockb); 5093014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.Int32Constant(2)); 5094014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch input = V8_INT64_C(0); 5095014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(1, m.Call()); 5096014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch input = V8_INT64_C(1); 5097014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(2, m.Call()); 5098014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch input = V8_INT64_C(0x100000000); 5099014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(2, m.Call()); 5100014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 5101014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5102014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunChangeInt32ToInt64P) { 5104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (kPointerSize < 8) return; 5105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int64_t actual = -1; 5106014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m(MachineType::Int32()); 5107014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.StoreToPointer(&actual, MachineRepresentation::kWord64, 5108014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.ChangeInt32ToInt64(m.Parameter(0))); 5109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Constant(0)); 5110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_INT32_INPUTS(i) { 5111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int64_t expected = *i; 5112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(0, m.Call(*i)); 5113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, actual); 5114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 5116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunChangeUint32ToUint64P) { 5119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (kPointerSize < 8) return; 5120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int64_t actual = -1; 5121014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m(MachineType::Uint32()); 5122014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.StoreToPointer(&actual, MachineRepresentation::kWord64, 5123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.ChangeUint32ToUint64(m.Parameter(0))); 5124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.Return(m.Int32Constant(0)); 5125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 5126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int64_t expected = static_cast<uint64_t>(*i); 5127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(0, m.Call(*i)); 5128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(expected, actual); 5129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 5131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunTruncateInt64ToInt32P) { 5134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (kPointerSize < 8) return; 5135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int64_t expected = -1; 5136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 5137014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.TruncateInt64ToInt32( 5138014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.LoadFromPointer(&expected, MachineType::Int64()))); 5139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(i) { 5140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FOR_UINT32_INPUTS(j) { 5141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch expected = (static_cast<uint64_t>(*j) << 32) | *i; 5142014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(static_cast<int32_t>(expected), m.Call()); 5143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 5146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunTruncateFloat64ToInt32P) { 5149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch struct { 5150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double from; 5151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double raw; 5152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } kValues[] = {{0, 0}, 5153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {0.5, 0}, 5154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {-0.5, 0}, 5155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {1.5, 1}, 5156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {-1.5, -1}, 5157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {5.5, 5}, 5158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {-5.0, -5}, 5159014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {std::numeric_limits<double>::quiet_NaN(), 0}, 5160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {std::numeric_limits<double>::infinity(), 0}, 5161014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {-std::numeric_limits<double>::quiet_NaN(), 0}, 5162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {-std::numeric_limits<double>::infinity(), 0}, 5163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {4.94065645841e-324, 0}, 5164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {-4.94065645841e-324, 0}, 5165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {0.9999999999999999, 0}, 5166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {-0.9999999999999999, 0}, 5167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {4294967296.0, 0}, 5168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {-4294967296.0, 0}, 5169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {9223372036854775000.0, 4294966272.0}, 5170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {-9223372036854775000.0, -4294966272.0}, 5171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {4.5036e+15, 372629504}, 5172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {-4.5036e+15, -372629504}, 5173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {287524199.5377777, 0x11234567}, 5174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {-287524199.5377777, -0x11234567}, 5175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {2300193596.302222, 2300193596.0}, 5176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {-2300193596.302222, -2300193596.0}, 5177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {4600387192.604444, 305419896}, 5178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {-4600387192.604444, -305419896}, 5179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {4823855600872397.0, 1737075661}, 5180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {-4823855600872397.0, -1737075661}, 5181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {4503603922337791.0, -1}, 5182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {-4503603922337791.0, 1}, 5183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {4503601774854143.0, 2147483647}, 5184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {-4503601774854143.0, -2147483647}, 5185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {9007207844675582.0, -2}, 5186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {-9007207844675582.0, 2}, 5187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {2.4178527921507624e+24, -536870912}, 5188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {-2.4178527921507624e+24, 536870912}, 5189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {2.417853945072267e+24, -536870912}, 5190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {-2.417853945072267e+24, 536870912}, 5191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {4.8357055843015248e+24, -1073741824}, 5192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {-4.8357055843015248e+24, 1073741824}, 5193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {4.8357078901445341e+24, -1073741824}, 5194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {-4.8357078901445341e+24, 1073741824}, 5195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {2147483647.0, 2147483647.0}, 5196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {-2147483648.0, -2147483648.0}, 5197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {9.6714111686030497e+24, -2147483648.0}, 5198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {-9.6714111686030497e+24, -2147483648.0}, 5199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {9.6714157802890681e+24, -2147483648.0}, 5200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {-9.6714157802890681e+24, -2147483648.0}, 5201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {1.9342813113834065e+25, 2147483648.0}, 5202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {-1.9342813113834065e+25, 2147483648.0}, 5203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {3.868562622766813e+25, 0}, 5204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {-3.868562622766813e+25, 0}, 5205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {1.7976931348623157e+308, 0}, 5206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {-1.7976931348623157e+308, 0}}; 5207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double input = -1.0; 5208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RawMachineAssemblerTester<int32_t> m; 5209014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.TruncateFloat64ToInt32( 5210014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch TruncationMode::kJavaScript, 5211014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.LoadFromPointer(&input, MachineType::Float64()))); 5212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (size_t i = 0; i < arraysize(kValues); ++i) { 5213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch input = kValues[i].from; 5214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint64_t expected = static_cast<int64_t>(kValues[i].raw); 5215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(static_cast<int>(expected), m.Call()); 5216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 5218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5219958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5220958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierTEST(RunChangeFloat32ToFloat64) { 5221014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BufferedRawMachineAssemblerTester<double> m(MachineType::Float32()); 5222958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5223014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.ChangeFloat32ToFloat64(m.Parameter(0))); 5224958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5225014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT32_INPUTS(i) { CheckDoubleEq(static_cast<double>(*i), m.Call(*i)); } 5226014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 5227958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5228958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5229014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat32Constant) { 5230014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT32_INPUTS(i) { 5231014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BufferedRawMachineAssemblerTester<float> m; 5232014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.Float32Constant(*i)); 5233014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CheckFloatEq(*i, m.Call()); 5234958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5235014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 5236958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5237958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5238014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat64ExtractLowWord32) { 5239014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BufferedRawMachineAssemblerTester<uint32_t> m(MachineType::Float64()); 5240014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.Float64ExtractLowWord32(m.Parameter(0))); 5241014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT64_INPUTS(i) { 5242014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch uint32_t expected = static_cast<uint32_t>(bit_cast<uint64_t>(*i)); 5243014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected, m.Call(*i)); 5244958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5245014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 5246958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5247958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5248014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat64ExtractHighWord32) { 5249014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BufferedRawMachineAssemblerTester<uint32_t> m(MachineType::Float64()); 5250014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.Float64ExtractHighWord32(m.Parameter(0))); 5251014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT64_INPUTS(i) { 5252014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch uint32_t expected = static_cast<uint32_t>(bit_cast<uint64_t>(*i) >> 32); 5253014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected, m.Call(*i)); 5254958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5255958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 5256958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5257958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5258014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat64InsertLowWord32) { 5259014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BufferedRawMachineAssemblerTester<double> m(MachineType::Float64(), 5260014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType::Int32()); 5261014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.Float64InsertLowWord32(m.Parameter(0), m.Parameter(1))); 5262958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FOR_FLOAT64_INPUTS(i) { 5263014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_INT32_INPUTS(j) { 5264014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch double expected = bit_cast<double>( 5265014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch (bit_cast<uint64_t>(*i) & ~(V8_UINT64_C(0xFFFFFFFF))) | 5266014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch (static_cast<uint64_t>(bit_cast<uint32_t>(*j)))); 5267014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CheckDoubleEq(expected, m.Call(*i, *j)); 5268014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 5269958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5270958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 5271958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5272958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5273014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat64InsertHighWord32) { 5274014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BufferedRawMachineAssemblerTester<double> m(MachineType::Float64(), 5275014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType::Uint32()); 5276014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.Float64InsertHighWord32(m.Parameter(0), m.Parameter(1))); 5277014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT64_INPUTS(i) { 5278014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_UINT32_INPUTS(j) { 5279014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch uint64_t expected = (bit_cast<uint64_t>(*i) & 0xFFFFFFFF) | 5280014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch (static_cast<uint64_t>(*j) << 32); 5281014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5282014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CheckDoubleEq(bit_cast<double>(expected), m.Call(*i, *j)); 5283014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 5284958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5285958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 5286958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5287958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5288014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat32Abs) { 5289014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BufferedRawMachineAssemblerTester<float> m(MachineType::Float32()); 5290014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.Float32Abs(m.Parameter(0))); 5291014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT32_INPUTS(i) { CheckFloatEq(std::abs(*i), m.Call(*i)); } 5292014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 5293014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5294014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5295014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat64Abs) { 5296014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BufferedRawMachineAssemblerTester<double> m(MachineType::Float64()); 5297014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.Float64Abs(m.Parameter(0))); 5298014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT64_INPUTS(i) { CheckDoubleEq(std::abs(*i), m.Call(*i)); } 5299014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 5300014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5301014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5302958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierstatic double two_30 = 1 << 30; // 2^30 is a smi boundary. 5303958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierstatic double two_52 = two_30 * (1 << 22); // 2^52 is a precision boundary. 5304958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierstatic double kValues[] = {0.1, 5305958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 0.2, 5306958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 0.49999999999999994, 5307958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 0.5, 5308958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 0.7, 5309958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1.0 - std::numeric_limits<double>::epsilon(), 5310958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier -0.1, 5311958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier -0.49999999999999994, 5312958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier -0.5, 5313958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier -0.7, 5314958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1.1, 5315958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1.0 + std::numeric_limits<double>::epsilon(), 5316958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1.5, 5317958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1.7, 5318958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier -1, 5319958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier -1 + std::numeric_limits<double>::epsilon(), 5320958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier -1 - std::numeric_limits<double>::epsilon(), 5321958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier -1.1, 5322958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier -1.5, 5323958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier -1.7, 5324958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier std::numeric_limits<double>::min(), 5325958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier -std::numeric_limits<double>::min(), 5326958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier std::numeric_limits<double>::max(), 5327958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier -std::numeric_limits<double>::max(), 5328958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier std::numeric_limits<double>::infinity(), 5329958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier -std::numeric_limits<double>::infinity(), 5330958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier two_30, 5331958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier two_30 + 0.1, 5332958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier two_30 + 0.5, 5333958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier two_30 + 0.7, 5334958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier two_30 - 1, 5335958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier two_30 - 1 + 0.1, 5336958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier two_30 - 1 + 0.5, 5337958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier two_30 - 1 + 0.7, 5338958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier -two_30, 5339958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier -two_30 + 0.1, 5340958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier -two_30 + 0.5, 5341958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier -two_30 + 0.7, 5342958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier -two_30 + 1, 5343958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier -two_30 + 1 + 0.1, 5344958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier -two_30 + 1 + 0.5, 5345958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier -two_30 + 1 + 0.7, 5346958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier two_52, 5347958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier two_52 + 0.1, 5348958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier two_52 + 0.5, 5349958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier two_52 + 0.5, 5350958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier two_52 + 0.7, 5351958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier two_52 + 0.7, 5352958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier two_52 - 1, 5353958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier two_52 - 1 + 0.1, 5354958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier two_52 - 1 + 0.5, 5355958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier two_52 - 1 + 0.7, 5356958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier -two_52, 5357958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier -two_52 + 0.1, 5358958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier -two_52 + 0.5, 5359958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier -two_52 + 0.7, 5360958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier -two_52 + 1, 5361958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier -two_52 + 1 + 0.1, 5362958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier -two_52 + 1 + 0.5, 5363958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier -two_52 + 1 + 0.7, 5364958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier two_30, 5365958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier two_30 - 0.1, 5366958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier two_30 - 0.5, 5367958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier two_30 - 0.7, 5368958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier two_30 - 1, 5369958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier two_30 - 1 - 0.1, 5370958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier two_30 - 1 - 0.5, 5371958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier two_30 - 1 - 0.7, 5372958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier -two_30, 5373958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier -two_30 - 0.1, 5374958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier -two_30 - 0.5, 5375958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier -two_30 - 0.7, 5376958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier -two_30 + 1, 5377958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier -two_30 + 1 - 0.1, 5378958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier -two_30 + 1 - 0.5, 5379958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier -two_30 + 1 - 0.7, 5380958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier two_52, 5381958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier two_52 - 0.1, 5382958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier two_52 - 0.5, 5383958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier two_52 - 0.5, 5384958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier two_52 - 0.7, 5385958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier two_52 - 0.7, 5386958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier two_52 - 1, 5387958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier two_52 - 1 - 0.1, 5388958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier two_52 - 1 - 0.5, 5389958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier two_52 - 1 - 0.7, 5390958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier -two_52, 5391958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier -two_52 - 0.1, 5392958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier -two_52 - 0.5, 5393958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier -two_52 - 0.7, 5394958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier -two_52 + 1, 5395958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier -two_52 + 1 - 0.1, 5396958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier -two_52 + 1 - 0.5, 5397958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier -two_52 + 1 - 0.7}; 5398958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5399958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5400014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat32RoundDown) { 5401014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BufferedRawMachineAssemblerTester<float> m(MachineType::Float32()); 5402014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!m.machine()->Float32RoundDown().IsSupported()) return; 5403014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5404014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.Float32RoundDown(m.Parameter(0))); 5405014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5406014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT32_INPUTS(i) { CheckFloatEq(floorf(*i), m.Call(*i)); } 5407958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 5408958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5409958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5410014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat64RoundDown1) { 5411014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BufferedRawMachineAssemblerTester<double> m(MachineType::Float64()); 5412014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!m.machine()->Float64RoundDown().IsSupported()) return; 5413014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5414014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.Float64RoundDown(m.Parameter(0))); 5415014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5416014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT64_INPUTS(i) { CheckDoubleEq(floor(*i), m.Call(*i)); } 5417014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 5418014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5419014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5420014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat64RoundDown2) { 5421014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BufferedRawMachineAssemblerTester<double> m(MachineType::Float64()); 5422014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!m.machine()->Float64RoundDown().IsSupported()) return; 5423014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.Float64Sub(m.Float64Constant(-0.0), 5424014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Float64RoundDown(m.Float64Sub(m.Float64Constant(-0.0), 5425014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Parameter(0))))); 5426014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5427958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier for (size_t i = 0; i < arraysize(kValues); ++i) { 5428014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(ceil(kValues[i]), m.Call(kValues[i])); 5429958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5430958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 5431958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5432958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5433014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat32RoundUp) { 5434014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BufferedRawMachineAssemblerTester<float> m(MachineType::Float32()); 5435014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!m.machine()->Float32RoundUp().IsSupported()) return; 5436014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.Float32RoundUp(m.Parameter(0))); 5437014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5438014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT32_INPUTS(i) { CheckFloatEq(ceilf(*i), m.Call(*i)); } 5439014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 5440014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5441014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5442014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat64RoundUp) { 5443014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BufferedRawMachineAssemblerTester<double> m(MachineType::Float64()); 5444014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!m.machine()->Float64RoundUp().IsSupported()) return; 5445014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.Float64RoundUp(m.Parameter(0))); 5446014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5447014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT64_INPUTS(i) { CheckDoubleEq(ceil(*i), m.Call(*i)); } 5448014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 5449014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5450014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5451014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat32RoundTiesEven) { 5452014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BufferedRawMachineAssemblerTester<float> m(MachineType::Float32()); 5453014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!m.machine()->Float32RoundTiesEven().IsSupported()) return; 5454014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.Float32RoundTiesEven(m.Parameter(0))); 5455014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5456014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT32_INPUTS(i) { CheckFloatEq(nearbyint(*i), m.Call(*i)); } 5457014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 5458014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5459014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5460014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat64RoundTiesEven) { 5461014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BufferedRawMachineAssemblerTester<double> m(MachineType::Float64()); 5462014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!m.machine()->Float64RoundTiesEven().IsSupported()) return; 5463014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.Float64RoundTiesEven(m.Parameter(0))); 5464014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5465014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT64_INPUTS(i) { CheckDoubleEq(nearbyint(*i), m.Call(*i)); } 5466014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 5467014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5468014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5469014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat32RoundTruncate) { 5470014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BufferedRawMachineAssemblerTester<float> m(MachineType::Float32()); 5471014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!m.machine()->Float32RoundTruncate().IsSupported()) return; 5472014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5473014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.Float32RoundTruncate(m.Parameter(0))); 5474014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5475014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT32_INPUTS(i) { CheckFloatEq(truncf(*i), m.Call(*i)); } 5476014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 5477014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5478014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5479958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierTEST(RunFloat64RoundTruncate) { 5480014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BufferedRawMachineAssemblerTester<double> m(MachineType::Float64()); 5481014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!m.machine()->Float64RoundTruncate().IsSupported()) return; 5482014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.Float64RoundTruncate(m.Parameter(0))); 5483958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier for (size_t i = 0; i < arraysize(kValues); ++i) { 5484014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(trunc(kValues[i]), m.Call(kValues[i])); 5485958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5486958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 5487958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5488958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5489958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierTEST(RunFloat64RoundTiesAway) { 5490014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BufferedRawMachineAssemblerTester<double> m(MachineType::Float64()); 5491014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!m.machine()->Float64RoundTiesAway().IsSupported()) return; 5492014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.Float64RoundTiesAway(m.Parameter(0))); 5493014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (size_t i = 0; i < arraysize(kValues); ++i) { 5494014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(round(kValues[i]), m.Call(kValues[i])); 5495014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 5496014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 5497014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5498014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5499014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#if !USE_SIMULATOR 5500014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5501014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace { 5502014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5503014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochint32_t const kMagicFoo0 = 0xdeadbeef; 5504014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5505014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5506014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochint32_t foo0() { return kMagicFoo0; } 5507014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5508014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5509014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochint32_t foo1(int32_t x) { return x; } 5510014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5511014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5512014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochint32_t foo2(int32_t x, int32_t y) { return x - y; } 5513014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5514014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5515014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochint32_t foo8(int32_t a, int32_t b, int32_t c, int32_t d, int32_t e, int32_t f, 5516014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int32_t g, int32_t h) { 5517014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return a + b + c + d + e + f + g + h; 5518014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 5519014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5520014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace 5521014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5522014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5523014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunCallCFunction0) { 5524014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch auto* foo0_ptr = &foo0; 5525014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m; 5526014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* function = m.LoadFromPointer(&foo0_ptr, MachineType::Pointer()); 5527014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.CallCFunction0(MachineType::Int32(), function)); 5528014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(kMagicFoo0, m.Call()); 5529014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 5530014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5531014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5532014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunCallCFunction1) { 5533014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch auto* foo1_ptr = &foo1; 5534014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m(MachineType::Int32()); 5535014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* function = m.LoadFromPointer(&foo1_ptr, MachineType::Pointer()); 5536014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.CallCFunction1(MachineType::Int32(), MachineType::Int32(), 5537014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch function, m.Parameter(0))); 5538014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_INT32_INPUTS(i) { 5539014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int32_t const expected = *i; 5540014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected, m.Call(expected)); 5541014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 5542014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 5543014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5544014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5545014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunCallCFunction2) { 5546014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch auto* foo2_ptr = &foo2; 5547014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m(MachineType::Int32(), 5548014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType::Int32()); 5549014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* function = m.LoadFromPointer(&foo2_ptr, MachineType::Pointer()); 5550014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.CallCFunction2(MachineType::Int32(), MachineType::Int32(), 5551014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType::Int32(), function, m.Parameter(0), 5552014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Parameter(1))); 5553014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_INT32_INPUTS(i) { 5554014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int32_t const x = *i; 5555014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_INT32_INPUTS(j) { 5556014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int32_t const y = *j; 5557014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(x - y, m.Call(x, y)); 5558014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 5559014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 5560014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 5561014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5562014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5563014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunCallCFunction8) { 5564014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch auto* foo8_ptr = &foo8; 5565014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m(MachineType::Int32()); 5566014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* function = m.LoadFromPointer(&foo8_ptr, MachineType::Pointer()); 5567014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* param = m.Parameter(0); 5568014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.CallCFunction8( 5569014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType::Int32(), MachineType::Int32(), MachineType::Int32(), 5570014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType::Int32(), MachineType::Int32(), MachineType::Int32(), 5571014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType::Int32(), MachineType::Int32(), MachineType::Int32(), 5572014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch function, param, param, param, param, param, param, param, param)); 5573014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_INT32_INPUTS(i) { 5574014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int32_t const x = *i; 5575014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(x * 8, m.Call(x)); 5576014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 5577014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 5578014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif // USE_SIMULATOR 5579014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5580014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#if V8_TARGET_ARCH_64_BIT 5581014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// TODO(titzer): run int64 tests on all platforms when supported. 5582014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunCheckedLoadInt64) { 5583014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int64_t buffer[] = {0x66bbccddeeff0011LL, 0x1122334455667788LL}; 5584014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int64_t> m(MachineType::Int32()); 5585014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* base = m.PointerConstant(buffer); 5586014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* index = m.Parameter(0); 5587014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* length = m.Int32Constant(16); 5588014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* load = m.AddNode(m.machine()->CheckedLoad(MachineType::Int64()), base, 5589014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch index, length); 5590014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(load); 5591014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5592014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(buffer[0], m.Call(0)); 5593014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(buffer[1], m.Call(8)); 5594014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(0, m.Call(16)); 5595014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 5596014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5597014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5598014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunCheckedStoreInt64) { 5599014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch const int64_t write = 0x5566778899aabbLL; 5600014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch const int64_t before = 0x33bbccddeeff0011LL; 5601014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int64_t buffer[] = {before, before}; 5602014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m(MachineType::Int32()); 5603014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* base = m.PointerConstant(buffer); 5604014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* index = m.Parameter(0); 5605014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* length = m.Int32Constant(16); 5606014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* value = m.Int64Constant(write); 5607014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* store = 5608014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.AddNode(m.machine()->CheckedStore(MachineRepresentation::kWord64), base, 5609014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch index, length, value); 5610014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch USE(store); 5611014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.Int32Constant(11)); 5612014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5613014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(11, m.Call(16)); 5614014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(before, buffer[0]); 5615014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(before, buffer[1]); 5616014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5617014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(11, m.Call(0)); 5618014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(write, buffer[0]); 5619014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(before, buffer[1]); 5620014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5621014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(11, m.Call(8)); 5622014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(write, buffer[0]); 5623014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(write, buffer[1]); 5624014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 5625014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5626014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5627014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunBitcastInt64ToFloat64) { 5628014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int64_t input = 1; 5629014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch double output = 0.0; 5630958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier RawMachineAssemblerTester<int32_t> m; 5631958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier m.StoreToPointer( 5632014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch &output, MachineRepresentation::kFloat64, 5633014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.BitcastInt64ToFloat64(m.LoadFromPointer(&input, MachineType::Int64()))); 5634014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.Int32Constant(11)); 5635014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_INT64_INPUTS(i) { 5636014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch input = *i; 5637014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(11, m.Call()); 5638014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch double expected = bit_cast<double>(input); 5639014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(bit_cast<int64_t>(expected), bit_cast<int64_t>(output)); 5640014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 5641014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 5642014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5643014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5644014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunBitcastFloat64ToInt64) { 5645014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BufferedRawMachineAssemblerTester<int64_t> m(MachineType::Float64()); 5646014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5647014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.BitcastFloat64ToInt64(m.Parameter(0))); 5648014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT64_INPUTS(i) { CHECK_EQ(bit_cast<int64_t>(*i), m.Call(*i)); } 5649014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 5650014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5651014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5652014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunTryTruncateFloat32ToInt64WithoutCheck) { 5653014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BufferedRawMachineAssemblerTester<int64_t> m(MachineType::Float32()); 5654014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.TryTruncateFloat32ToInt64(m.Parameter(0))); 5655014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5656014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_INT64_INPUTS(i) { 5657014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch float input = static_cast<float>(*i); 5658014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (input < static_cast<float>(INT64_MAX) && 5659014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch input >= static_cast<float>(INT64_MIN)) { 5660014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(static_cast<int64_t>(input), m.Call(input)); 5661014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 5662014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 5663014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 5664014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5665014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5666014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunTryTruncateFloat32ToInt64WithCheck) { 5667014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int64_t success = 0; 5668014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BufferedRawMachineAssemblerTester<int64_t> m(MachineType::Float32()); 5669014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* trunc = m.TryTruncateFloat32ToInt64(m.Parameter(0)); 5670014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* val = m.Projection(0, trunc); 5671014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* check = m.Projection(1, trunc); 5672014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.StoreToPointer(&success, MachineRepresentation::kWord64, check); 5673014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(val); 5674014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5675014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT32_INPUTS(i) { 5676014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (*i < static_cast<float>(INT64_MAX) && 5677014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch *i >= static_cast<float>(INT64_MIN)) { 5678014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(static_cast<int64_t>(*i), m.Call(*i)); 5679014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_NE(0, success); 5680014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { 5681014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Call(*i); 5682014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(0, success); 5683014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 5684014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 5685014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 5686014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5687014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5688014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunTryTruncateFloat64ToInt64WithoutCheck) { 5689014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BufferedRawMachineAssemblerTester<int64_t> m(MachineType::Float64()); 5690014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.TryTruncateFloat64ToInt64(m.Parameter(0))); 5691014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5692014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_INT64_INPUTS(i) { 5693014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch double input = static_cast<double>(*i); 5694014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(static_cast<int64_t>(input), m.Call(input)); 5695014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 5696014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 5697014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5698014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5699014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunTryTruncateFloat64ToInt64WithCheck) { 5700014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int64_t success = 0; 5701014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BufferedRawMachineAssemblerTester<int64_t> m(MachineType::Float64()); 5702014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* trunc = m.TryTruncateFloat64ToInt64(m.Parameter(0)); 5703014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* val = m.Projection(0, trunc); 5704014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* check = m.Projection(1, trunc); 5705014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.StoreToPointer(&success, MachineRepresentation::kWord64, check); 5706014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(val); 5707014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5708014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT64_INPUTS(i) { 5709014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (*i < static_cast<double>(INT64_MAX) && 5710014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch *i >= static_cast<double>(INT64_MIN)) { 5711014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Conversions within this range should succeed. 5712014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(static_cast<int64_t>(*i), m.Call(*i)); 5713014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_NE(0, success); 5714014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { 5715014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Call(*i); 5716014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(0, success); 5717014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 5718014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 5719014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 5720014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5721014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5722014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunTryTruncateFloat32ToUint64WithoutCheck) { 5723014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BufferedRawMachineAssemblerTester<uint64_t> m(MachineType::Float32()); 5724014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.TryTruncateFloat32ToUint64(m.Parameter(0))); 5725014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5726014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_UINT64_INPUTS(i) { 5727014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch float input = static_cast<float>(*i); 5728014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // This condition on 'input' is required because 5729014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // static_cast<float>(UINT64_MAX) results in a value outside uint64 range. 5730014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (input < static_cast<float>(UINT64_MAX)) { 5731014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(static_cast<uint64_t>(input), m.Call(input)); 5732014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 5733958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5734958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 5735014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5736014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5737014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunTryTruncateFloat32ToUint64WithCheck) { 5738014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int64_t success = 0; 5739014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BufferedRawMachineAssemblerTester<uint64_t> m(MachineType::Float32()); 5740014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* trunc = m.TryTruncateFloat32ToUint64(m.Parameter(0)); 5741014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* val = m.Projection(0, trunc); 5742014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* check = m.Projection(1, trunc); 5743014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.StoreToPointer(&success, MachineRepresentation::kWord64, check); 5744014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(val); 5745014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5746014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT32_INPUTS(i) { 5747014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (*i < static_cast<float>(UINT64_MAX) && *i > -1.0) { 5748014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Conversions within this range should succeed. 5749014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(static_cast<uint64_t>(*i), m.Call(*i)); 5750014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_NE(0, success); 5751014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { 5752014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Call(*i); 5753014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(0, success); 5754014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 5755014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 5756014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 5757014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5758014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5759014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunTryTruncateFloat64ToUint64WithoutCheck) { 5760014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BufferedRawMachineAssemblerTester<uint64_t> m(MachineType::Float64()); 5761014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.TruncateFloat64ToUint64(m.Parameter(0))); 5762014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5763014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_UINT64_INPUTS(j) { 5764014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch double input = static_cast<double>(*j); 5765014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5766014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (input < static_cast<float>(UINT64_MAX)) { 5767014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(static_cast<uint64_t>(input), m.Call(input)); 5768014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 5769014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 5770014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 5771014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5772014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5773014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunTryTruncateFloat64ToUint64WithCheck) { 5774014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int64_t success = 0; 5775014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BufferedRawMachineAssemblerTester<int64_t> m(MachineType::Float64()); 5776014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* trunc = m.TryTruncateFloat64ToUint64(m.Parameter(0)); 5777014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* val = m.Projection(0, trunc); 5778014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* check = m.Projection(1, trunc); 5779014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.StoreToPointer(&success, MachineRepresentation::kWord64, check); 5780014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(val); 5781014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5782014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT64_INPUTS(i) { 5783014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (*i < 18446744073709551616.0 && *i > -1) { 5784014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Conversions within this range should succeed. 5785014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(static_cast<uint64_t>(*i), m.Call(*i)); 5786014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_NE(0, success); 5787014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { 5788014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Call(*i); 5789014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(0, success); 5790014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 5791014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 5792014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 5793014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5794014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5795014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunRoundInt64ToFloat32) { 5796014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BufferedRawMachineAssemblerTester<float> m(MachineType::Int64()); 5797014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.RoundInt64ToFloat32(m.Parameter(0))); 5798014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_INT64_INPUTS(i) { CHECK_EQ(static_cast<float>(*i), m.Call(*i)); } 5799014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 5800014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5801014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5802014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunRoundInt64ToFloat64) { 5803014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BufferedRawMachineAssemblerTester<double> m(MachineType::Int64()); 5804014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.RoundInt64ToFloat64(m.Parameter(0))); 5805014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_INT64_INPUTS(i) { CHECK_EQ(static_cast<double>(*i), m.Call(*i)); } 5806014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 5807014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5808014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5809014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunRoundUint64ToFloat64) { 5810014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch struct { 5811014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch uint64_t input; 5812014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch uint64_t expected; 5813014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } values[] = {{0x0, 0x0}, 5814014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x1, 0x3ff0000000000000}, 5815014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0xffffffff, 0x41efffffffe00000}, 5816014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x1b09788b, 0x41bb09788b000000}, 5817014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x4c5fce8, 0x419317f3a0000000}, 5818014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0xcc0de5bf, 0x41e981bcb7e00000}, 5819014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x2, 0x4000000000000000}, 5820014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x3, 0x4008000000000000}, 5821014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x4, 0x4010000000000000}, 5822014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x5, 0x4014000000000000}, 5823014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x8, 0x4020000000000000}, 5824014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x9, 0x4022000000000000}, 5825014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0xffffffffffffffff, 0x43f0000000000000}, 5826014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0xfffffffffffffffe, 0x43f0000000000000}, 5827014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0xfffffffffffffffd, 0x43f0000000000000}, 5828014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x100000000, 0x41f0000000000000}, 5829014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0xffffffff00000000, 0x43efffffffe00000}, 5830014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x1b09788b00000000, 0x43bb09788b000000}, 5831014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x4c5fce800000000, 0x439317f3a0000000}, 5832014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0xcc0de5bf00000000, 0x43e981bcb7e00000}, 5833014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x200000000, 0x4200000000000000}, 5834014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x300000000, 0x4208000000000000}, 5835014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x400000000, 0x4210000000000000}, 5836014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x500000000, 0x4214000000000000}, 5837014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x800000000, 0x4220000000000000}, 5838014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x900000000, 0x4222000000000000}, 5839014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x273a798e187937a3, 0x43c39d3cc70c3c9c}, 5840014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0xece3af835495a16b, 0x43ed9c75f06a92b4}, 5841014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0xb668ecc11223344, 0x43a6cd1d98224467}, 5842014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x9e, 0x4063c00000000000}, 5843014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x43, 0x4050c00000000000}, 5844014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0xaf73, 0x40e5ee6000000000}, 5845014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x116b, 0x40b16b0000000000}, 5846014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x658ecc, 0x415963b300000000}, 5847014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x2b3b4c, 0x41459da600000000}, 5848014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x88776655, 0x41e10eeccaa00000}, 5849014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x70000000, 0x41dc000000000000}, 5850014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x7200000, 0x419c800000000000}, 5851014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x7fffffff, 0x41dfffffffc00000}, 5852014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x56123761, 0x41d5848dd8400000}, 5853014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x7fffff00, 0x41dfffffc0000000}, 5854014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x761c4761eeeeeeee, 0x43dd8711d87bbbbc}, 5855014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x80000000eeeeeeee, 0x43e00000001dddde}, 5856014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x88888888dddddddd, 0x43e11111111bbbbc}, 5857014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0xa0000000dddddddd, 0x43e40000001bbbbc}, 5858014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0xddddddddaaaaaaaa, 0x43ebbbbbbbb55555}, 5859014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0xe0000000aaaaaaaa, 0x43ec000000155555}, 5860014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0xeeeeeeeeeeeeeeee, 0x43edddddddddddde}, 5861014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0xfffffffdeeeeeeee, 0x43efffffffbdddde}, 5862014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0xf0000000dddddddd, 0x43ee0000001bbbbc}, 5863014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x7fffffdddddddd, 0x435ffffff7777777}, 5864014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x3fffffaaaaaaaa, 0x434fffffd5555555}, 5865014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x1fffffaaaaaaaa, 0x433fffffaaaaaaaa}, 5866014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0xfffff, 0x412ffffe00000000}, 5867014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x7ffff, 0x411ffffc00000000}, 5868014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x3ffff, 0x410ffff800000000}, 5869014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x1ffff, 0x40fffff000000000}, 5870014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0xffff, 0x40efffe000000000}, 5871014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x7fff, 0x40dfffc000000000}, 5872014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x3fff, 0x40cfff8000000000}, 5873014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x1fff, 0x40bfff0000000000}, 5874014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0xfff, 0x40affe0000000000}, 5875014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x7ff, 0x409ffc0000000000}, 5876014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x3ff, 0x408ff80000000000}, 5877014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x1ff, 0x407ff00000000000}, 5878014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x3fffffffffff, 0x42cfffffffffff80}, 5879014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x1fffffffffff, 0x42bfffffffffff00}, 5880014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0xfffffffffff, 0x42affffffffffe00}, 5881014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x7ffffffffff, 0x429ffffffffffc00}, 5882014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x3ffffffffff, 0x428ffffffffff800}, 5883014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x1ffffffffff, 0x427ffffffffff000}, 5884014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x8000008000000000, 0x43e0000010000000}, 5885014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x8000008000000001, 0x43e0000010000000}, 5886014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x8000000000000400, 0x43e0000000000000}, 5887014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x8000000000000401, 0x43e0000000000001}}; 5888014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5889014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BufferedRawMachineAssemblerTester<double> m(MachineType::Uint64()); 5890014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.RoundUint64ToFloat64(m.Parameter(0))); 5891014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5892014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (size_t i = 0; i < arraysize(values); i++) { 5893014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(bit_cast<double>(values[i].expected), m.Call(values[i].input)); 5894014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 5895014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 5896014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5897014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5898014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunRoundUint64ToFloat32) { 5899014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch struct { 5900014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch uint64_t input; 5901014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch uint32_t expected; 5902014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } values[] = {{0x0, 0x0}, 5903014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x1, 0x3f800000}, 5904014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0xffffffff, 0x4f800000}, 5905014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x1b09788b, 0x4dd84bc4}, 5906014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x4c5fce8, 0x4c98bf9d}, 5907014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0xcc0de5bf, 0x4f4c0de6}, 5908014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x2, 0x40000000}, 5909014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x3, 0x40400000}, 5910014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x4, 0x40800000}, 5911014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x5, 0x40a00000}, 5912014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x8, 0x41000000}, 5913014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x9, 0x41100000}, 5914014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0xffffffffffffffff, 0x5f800000}, 5915014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0xfffffffffffffffe, 0x5f800000}, 5916014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0xfffffffffffffffd, 0x5f800000}, 5917014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x0, 0x0}, 5918014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x100000000, 0x4f800000}, 5919014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0xffffffff00000000, 0x5f800000}, 5920014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x1b09788b00000000, 0x5dd84bc4}, 5921014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x4c5fce800000000, 0x5c98bf9d}, 5922014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0xcc0de5bf00000000, 0x5f4c0de6}, 5923014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x200000000, 0x50000000}, 5924014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x300000000, 0x50400000}, 5925014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x400000000, 0x50800000}, 5926014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x500000000, 0x50a00000}, 5927014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x800000000, 0x51000000}, 5928014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x900000000, 0x51100000}, 5929014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x273a798e187937a3, 0x5e1ce9e6}, 5930014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0xece3af835495a16b, 0x5f6ce3b0}, 5931014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0xb668ecc11223344, 0x5d3668ed}, 5932014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x9e, 0x431e0000}, 5933014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x43, 0x42860000}, 5934014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0xaf73, 0x472f7300}, 5935014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x116b, 0x458b5800}, 5936014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x658ecc, 0x4acb1d98}, 5937014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x2b3b4c, 0x4a2ced30}, 5938014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x88776655, 0x4f087766}, 5939014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x70000000, 0x4ee00000}, 5940014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x7200000, 0x4ce40000}, 5941014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x7fffffff, 0x4f000000}, 5942014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x56123761, 0x4eac246f}, 5943014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x7fffff00, 0x4efffffe}, 5944014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x761c4761eeeeeeee, 0x5eec388f}, 5945014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x80000000eeeeeeee, 0x5f000000}, 5946014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x88888888dddddddd, 0x5f088889}, 5947014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0xa0000000dddddddd, 0x5f200000}, 5948014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0xddddddddaaaaaaaa, 0x5f5dddde}, 5949014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0xe0000000aaaaaaaa, 0x5f600000}, 5950014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0xeeeeeeeeeeeeeeee, 0x5f6eeeef}, 5951014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0xfffffffdeeeeeeee, 0x5f800000}, 5952014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0xf0000000dddddddd, 0x5f700000}, 5953014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x7fffffdddddddd, 0x5b000000}, 5954014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x3fffffaaaaaaaa, 0x5a7fffff}, 5955014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x1fffffaaaaaaaa, 0x59fffffd}, 5956014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0xfffff, 0x497ffff0}, 5957014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x7ffff, 0x48ffffe0}, 5958014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x3ffff, 0x487fffc0}, 5959014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x1ffff, 0x47ffff80}, 5960014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0xffff, 0x477fff00}, 5961014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x7fff, 0x46fffe00}, 5962014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x3fff, 0x467ffc00}, 5963014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x1fff, 0x45fff800}, 5964014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0xfff, 0x457ff000}, 5965014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x7ff, 0x44ffe000}, 5966014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x3ff, 0x447fc000}, 5967014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x1ff, 0x43ff8000}, 5968014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x3fffffffffff, 0x56800000}, 5969014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x1fffffffffff, 0x56000000}, 5970014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0xfffffffffff, 0x55800000}, 5971014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x7ffffffffff, 0x55000000}, 5972014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x3ffffffffff, 0x54800000}, 5973014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x1ffffffffff, 0x54000000}, 5974014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x8000008000000000, 0x5f000000}, 5975014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x8000008000000001, 0x5f000001}, 5976014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x8000000000000400, 0x5f000000}, 5977014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch {0x8000000000000401, 0x5f000000}}; 5978014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5979014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BufferedRawMachineAssemblerTester<float> m(MachineType::Uint64()); 5980014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.RoundUint64ToFloat32(m.Parameter(0))); 5981014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5982014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (size_t i = 0; i < arraysize(values); i++) { 5983014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(bit_cast<float>(values[i].expected), m.Call(values[i].input)); 5984014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 5985014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 5986014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5987014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5988014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif 5989014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5990014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5991014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunBitcastFloat32ToInt32) { 5992014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch float input = 32.25; 5993014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m; 5994014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.BitcastFloat32ToInt32( 5995014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.LoadFromPointer(&input, MachineType::Float32()))); 5996014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_FLOAT32_INPUTS(i) { 5997014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch input = *i; 5998014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int32_t expected = bit_cast<int32_t>(input); 5999014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(expected, m.Call()); 6000014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 6001014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 6002014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6003014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6004014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunBitcastInt32ToFloat32) { 6005014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int32_t input = 1; 6006014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch float output = 0.0; 6007014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> m; 6008014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.StoreToPointer( 6009014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch &output, MachineRepresentation::kFloat32, 6010014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.BitcastInt32ToFloat32(m.LoadFromPointer(&input, MachineType::Int32()))); 6011014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch m.Return(m.Int32Constant(11)); 6012014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_INT32_INPUTS(i) { 6013014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch input = *i; 6014014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(11, m.Call()); 6015014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch float expected = bit_cast<float>(input); 6016014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(bit_cast<int32_t>(expected), bit_cast<int32_t>(output)); 6017014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 6018014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 6019014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6020014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6021014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunComputedCodeObject) { 6022014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GraphBuilderTester<int32_t> a; 6023014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch a.Return(a.Int32Constant(33)); 6024014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch a.End(); 6025014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Code> code_a = a.GetCode(); 6026014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6027014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GraphBuilderTester<int32_t> b; 6028014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch b.Return(b.Int32Constant(44)); 6029014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch b.End(); 6030014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Code> code_b = b.GetCode(); 6031014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6032014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssemblerTester<int32_t> r(MachineType::Int32()); 6033014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineLabel tlabel; 6034014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineLabel flabel; 6035014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineLabel merge; 6036014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch r.Branch(r.Parameter(0), &tlabel, &flabel); 6037014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch r.Bind(&tlabel); 6038014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* fa = r.HeapConstant(code_a); 6039014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch r.Goto(&merge); 6040014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch r.Bind(&flabel); 6041014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* fb = r.HeapConstant(code_b); 6042014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch r.Goto(&merge); 6043014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch r.Bind(&merge); 6044014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* phi = r.Phi(MachineRepresentation::kWord32, fa, fb); 6045014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6046014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // TODO(titzer): all this descriptor hackery is just to call the above 6047014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // functions as code objects instead of direct addresses. 6048014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CSignature0<int32_t> sig; 6049014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CallDescriptor* c = Linkage::GetSimplifiedCDescriptor(r.zone(), &sig); 6050014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LinkageLocation ret[] = {c->GetReturnLocation(0)}; 6051014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Signature<LinkageLocation> loc(1, 0, ret); 6052014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CallDescriptor* desc = new (r.zone()) CallDescriptor( // -- 6053014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CallDescriptor::kCallCodeObject, // kind 6054014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType::AnyTagged(), // target_type 6055014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch c->GetInputLocation(0), // target_loc 6056014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch &sig, // machine_sig 6057014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch &loc, // location_sig 6058014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 0, // stack count 6059014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Operator::kNoProperties, // properties 6060014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch c->CalleeSavedRegisters(), // callee saved 6061014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch c->CalleeSavedFPRegisters(), // callee saved FP 6062014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CallDescriptor::kNoFlags, // flags 6063014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch "c-call-as-code"); 6064014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* call = r.AddNode(r.common()->Call(desc), phi); 6065014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch r.Return(call); 6066014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6067014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(33, r.Call(1)); 6068014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(44, r.Call(0)); 6069014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 6070014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6071014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace compiler 6072014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace internal 6073014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace v8 6074