2 +----------------------------------------------------------------------+
4 +----------------------------------------------------------------------+
5 | Copyright (c) 2010-present Facebook, Inc. (http://www.facebook.com) |
6 +----------------------------------------------------------------------+
7 | This source file is subject to version 3.01 of the PHP license, |
8 | that is bundled with this package in the file LICENSE, and is |
9 | available through the world-wide-web at the following url: |
10 | http://www.php.net/license/3_01.txt |
11 | If you did not receive a copy of the PHP license and are unable to |
12 | obtain it through the world-wide-web, please send a note to |
13 | license@php.net so we can mail you a copy immediately. |
14 +----------------------------------------------------------------------+
17 #include "hphp/runtime/vm/jit/reg-algorithms.h"
18 #include "hphp/runtime/vm/jit/phys-reg.h"
20 #include "hphp/util/asm-x64.h"
22 #include <gtest/gtest.h>
24 namespace HPHP
{ namespace jit
{ namespace x64
{
26 TEST(RegAlgorithms
, twoCycle
) {
27 PhysReg::Map
<PhysReg
> moves
;
33 auto howTo
= doRegMoves(moves
, r10
);
34 EXPECT_EQ(howTo
.size(), 1);
35 EXPECT_EQ(howTo
[0].m_kind
, MoveInfo::Kind::Xchg
);
36 EXPECT_TRUE((howTo
[0].m_src
== rax
&& howTo
[0].m_dst
== rdx
) ||
37 (howTo
[0].m_src
== rdx
&& howTo
[0].m_dst
== rax
));
40 TEST(RegAlgorithms
, threeCycle
) {
41 PhysReg::Map
<PhysReg
> moves
;
48 auto howTo
= doRegMoves(moves
, r10
);
49 EXPECT_EQ(howTo
.size(), 2);
50 EXPECT_EQ(howTo
[0].m_kind
, MoveInfo::Kind::Xchg
);
51 EXPECT_TRUE((howTo
[0].m_src
== rax
&& howTo
[0].m_dst
== rdx
) ||
52 (howTo
[0].m_src
== rdx
&& howTo
[0].m_dst
== rax
));
53 EXPECT_TRUE((howTo
[1].m_src
== rdx
&& howTo
[1].m_dst
== rcx
) ||
54 (howTo
[1].m_src
== rcx
&& howTo
[1].m_dst
== rdx
));
56 // another test involving a 3-cycle plus one leaf. pass as long as
57 // it doesn't blow up.
60 moves
[rdx
] = rcx
; // leaf
62 auto howTo2
= doRegMoves(moves
, r10
);
65 TEST(RegAlgorithms
, noCycle
) {
66 PhysReg::Map
<PhysReg
> moves
;
73 auto howTo
= doRegMoves(moves
, r11
);
74 EXPECT_EQ(howTo
.size(), 3);
75 EXPECT_EQ(howTo
[0].m_kind
, MoveInfo::Kind::Move
);
76 EXPECT_EQ(howTo
[0].m_src
, rdx
);
77 EXPECT_EQ(howTo
[0].m_dst
, rax
);
78 EXPECT_EQ(howTo
[1].m_kind
, MoveInfo::Kind::Move
);
79 EXPECT_EQ(howTo
[1].m_src
, r13
);
80 EXPECT_EQ(howTo
[1].m_dst
, rdx
);
81 EXPECT_EQ(howTo
[2].m_kind
, MoveInfo::Kind::Move
);
82 EXPECT_EQ(howTo
[2].m_src
, r10
);
83 EXPECT_EQ(howTo
[2].m_dst
, r13
);
86 TEST(RegAlgorithms
, outdegTwo
) {
87 PhysReg::Map
<PhysReg
> moves
;
93 auto howTo
= doRegMoves(moves
, r11
);
94 EXPECT_EQ(howTo
.size(), 2);
95 EXPECT_EQ(howTo
[0].m_src
, rcx
);
96 EXPECT_EQ(howTo
[1].m_src
, rcx
);
97 EXPECT_TRUE((howTo
[0].m_dst
== rax
&& howTo
[1].m_dst
== rdx
) ||
98 (howTo
[0].m_dst
== rdx
&& howTo
[1].m_dst
== rax
));
101 TEST(RegAlgorithms
, simdCycle
) {
102 PhysReg::Map
<PhysReg
> moves
;
108 auto howTo
= doRegMoves(moves
, r11
);
109 EXPECT_EQ(howTo
.size(), 3);
110 EXPECT_EQ(howTo
[0].m_kind
, MoveInfo::Kind::Move
);
111 EXPECT_EQ(howTo
[0].m_src
, rax
);
112 EXPECT_EQ(howTo
[0].m_dst
, r11
);
113 EXPECT_EQ(howTo
[1].m_kind
, MoveInfo::Kind::Move
);
114 EXPECT_EQ(howTo
[1].m_src
, xmm0
);
115 EXPECT_EQ(howTo
[1].m_dst
, rax
);
116 EXPECT_EQ(howTo
[2].m_kind
, MoveInfo::Kind::Move
);
117 EXPECT_EQ(howTo
[2].m_src
, r11
);
118 EXPECT_EQ(howTo
[2].m_dst
, xmm0
);