xref: /llvm-project/llvm/unittests/Target/AArch64/SMEAttributesTest.cpp (revision d313614b60ff1194f48e5f0b1bb8d63d2b7eb52d)
1cf72dddaSSander de Smalen #include "Utils/AArch64SMEAttributes.h"
2cf72dddaSSander de Smalen #include "llvm/AsmParser/Parser.h"
3cf72dddaSSander de Smalen #include "llvm/IR/Function.h"
4cf72dddaSSander de Smalen #include "llvm/IR/Module.h"
5cf72dddaSSander de Smalen #include "llvm/Support/SourceMgr.h"
6cf72dddaSSander de Smalen 
7cf72dddaSSander de Smalen #include "gtest/gtest.h"
8cf72dddaSSander de Smalen 
9cf72dddaSSander de Smalen using namespace llvm;
10cf72dddaSSander de Smalen using SA = SMEAttrs;
11cf72dddaSSander de Smalen 
parseIR(const char * IR)12cf72dddaSSander de Smalen std::unique_ptr<Module> parseIR(const char *IR) {
13cf72dddaSSander de Smalen   static LLVMContext C;
14cf72dddaSSander de Smalen   SMDiagnostic Err;
15cf72dddaSSander de Smalen   return parseAssemblyString(IR, Err, C);
16cf72dddaSSander de Smalen }
17cf72dddaSSander de Smalen 
TEST(SMEAttributes,Constructors)18cf72dddaSSander de Smalen TEST(SMEAttributes, Constructors) {
19cf72dddaSSander de Smalen   LLVMContext Context;
20cf72dddaSSander de Smalen 
21cf72dddaSSander de Smalen   ASSERT_TRUE(SA(*parseIR("declare void @foo()")->getFunction("foo"))
22cf72dddaSSander de Smalen                   .hasNonStreamingInterfaceAndBody());
23cf72dddaSSander de Smalen 
24cf72dddaSSander de Smalen   ASSERT_TRUE(SA(*parseIR("declare void @foo() \"aarch64_pstate_sm_body\"")
25cf72dddaSSander de Smalen                       ->getFunction("foo"))
26cf72dddaSSander de Smalen                   .hasNonStreamingInterface());
27cf72dddaSSander de Smalen 
28cf72dddaSSander de Smalen   ASSERT_TRUE(SA(*parseIR("declare void @foo() \"aarch64_pstate_sm_enabled\"")
29cf72dddaSSander de Smalen                       ->getFunction("foo"))
30cf72dddaSSander de Smalen                   .hasStreamingInterface());
31cf72dddaSSander de Smalen 
32cf72dddaSSander de Smalen   ASSERT_TRUE(SA(*parseIR("declare void @foo() \"aarch64_pstate_sm_body\"")
33cf72dddaSSander de Smalen                       ->getFunction("foo"))
34cf72dddaSSander de Smalen                   .hasStreamingBody());
35cf72dddaSSander de Smalen 
36cf72dddaSSander de Smalen   ASSERT_TRUE(
37cf72dddaSSander de Smalen       SA(*parseIR("declare void @foo() \"aarch64_pstate_sm_compatible\"")
38cf72dddaSSander de Smalen               ->getFunction("foo"))
39cf72dddaSSander de Smalen           .hasStreamingCompatibleInterface());
40cf72dddaSSander de Smalen 
41*d313614bSSander de Smalen   ASSERT_TRUE(
42*d313614bSSander de Smalen       SA(*parseIR("declare void @foo() \"aarch64_in_za\"")->getFunction("foo"))
43*d313614bSSander de Smalen           .isInZA());
44*d313614bSSander de Smalen   ASSERT_TRUE(
45*d313614bSSander de Smalen       SA(*parseIR("declare void @foo() \"aarch64_out_za\"")->getFunction("foo"))
46*d313614bSSander de Smalen           .isOutZA());
47*d313614bSSander de Smalen   ASSERT_TRUE(SA(*parseIR("declare void @foo() \"aarch64_inout_za\"")
48cf72dddaSSander de Smalen                       ->getFunction("foo"))
49*d313614bSSander de Smalen                   .isInOutZA());
50*d313614bSSander de Smalen   ASSERT_TRUE(SA(*parseIR("declare void @foo() \"aarch64_preserves_za\"")
51a4ec04eaSKerry McLaughlin                       ->getFunction("foo"))
52*d313614bSSander de Smalen                   .isPreservesZA());
53*d313614bSSander de Smalen   ASSERT_TRUE(
54*d313614bSSander de Smalen       SA(*parseIR("declare void @foo() \"aarch64_new_za\"")->getFunction("foo"))
55*d313614bSSander de Smalen           .isNewZA());
56cf72dddaSSander de Smalen 
57a4ec04eaSKerry McLaughlin   ASSERT_TRUE(
58a4ec04eaSKerry McLaughlin       SA(*parseIR("declare void @foo() \"aarch64_in_zt0\"")->getFunction("foo"))
59a4ec04eaSKerry McLaughlin           .isInZT0());
60a4ec04eaSKerry McLaughlin   ASSERT_TRUE(SA(*parseIR("declare void @foo() \"aarch64_out_zt0\"")
61a4ec04eaSKerry McLaughlin                       ->getFunction("foo"))
62a4ec04eaSKerry McLaughlin                   .isOutZT0());
63a4ec04eaSKerry McLaughlin   ASSERT_TRUE(SA(*parseIR("declare void @foo() \"aarch64_inout_zt0\"")
64a4ec04eaSKerry McLaughlin                       ->getFunction("foo"))
65a4ec04eaSKerry McLaughlin                   .isInOutZT0());
66a4ec04eaSKerry McLaughlin   ASSERT_TRUE(SA(*parseIR("declare void @foo() \"aarch64_preserves_zt0\"")
67a4ec04eaSKerry McLaughlin                       ->getFunction("foo"))
68a4ec04eaSKerry McLaughlin                   .isPreservesZT0());
69a4ec04eaSKerry McLaughlin   ASSERT_TRUE(SA(*parseIR("declare void @foo() \"aarch64_new_zt0\"")
70a4ec04eaSKerry McLaughlin                       ->getFunction("foo"))
71a4ec04eaSKerry McLaughlin                   .isNewZT0());
72a4ec04eaSKerry McLaughlin 
73cf72dddaSSander de Smalen   // Invalid combinations.
74cf72dddaSSander de Smalen   EXPECT_DEBUG_DEATH(SA(SA::SM_Enabled | SA::SM_Compatible),
75cf72dddaSSander de Smalen                      "SM_Enabled and SM_Compatible are mutually exclusive");
76cf72dddaSSander de Smalen 
77cf72dddaSSander de Smalen   // Test that the set() methods equally check validity.
78cf72dddaSSander de Smalen   EXPECT_DEBUG_DEATH(SA(SA::SM_Enabled).set(SA::SM_Compatible),
79cf72dddaSSander de Smalen                      "SM_Enabled and SM_Compatible are mutually exclusive");
80cf72dddaSSander de Smalen   EXPECT_DEBUG_DEATH(SA(SA::SM_Compatible).set(SA::SM_Enabled),
81cf72dddaSSander de Smalen                      "SM_Enabled and SM_Compatible are mutually exclusive");
82cf72dddaSSander de Smalen }
83cf72dddaSSander de Smalen 
TEST(SMEAttributes,Basics)84cf72dddaSSander de Smalen TEST(SMEAttributes, Basics) {
85cf72dddaSSander de Smalen   // Test PSTATE.SM interfaces.
86cf72dddaSSander de Smalen   ASSERT_TRUE(SA(SA::Normal).hasNonStreamingInterfaceAndBody());
87cf72dddaSSander de Smalen   ASSERT_TRUE(SA(SA::SM_Enabled).hasStreamingInterface());
88cf72dddaSSander de Smalen   ASSERT_TRUE(SA(SA::SM_Body).hasStreamingBody());
89cf72dddaSSander de Smalen   ASSERT_TRUE(SA(SA::SM_Body).hasNonStreamingInterface());
90cf72dddaSSander de Smalen   ASSERT_FALSE(SA(SA::SM_Body).hasNonStreamingInterfaceAndBody());
91cf72dddaSSander de Smalen   ASSERT_FALSE(SA(SA::SM_Body).hasStreamingInterface());
92cf72dddaSSander de Smalen   ASSERT_TRUE(SA(SA::SM_Compatible).hasStreamingCompatibleInterface());
93cf72dddaSSander de Smalen   ASSERT_TRUE(
94cf72dddaSSander de Smalen       SA(SA::SM_Compatible | SA::SM_Body).hasStreamingCompatibleInterface());
95cf72dddaSSander de Smalen   ASSERT_TRUE(SA(SA::SM_Compatible | SA::SM_Body).hasStreamingBody());
96cf72dddaSSander de Smalen   ASSERT_FALSE(SA(SA::SM_Compatible | SA::SM_Body).hasNonStreamingInterface());
97cf72dddaSSander de Smalen 
98*d313614bSSander de Smalen   // Test ZA State interfaces
99*d313614bSSander de Smalen   SA ZA_In = SA(SA::encodeZAState(SA::StateValue::In));
100*d313614bSSander de Smalen   ASSERT_TRUE(ZA_In.isInZA());
101*d313614bSSander de Smalen   ASSERT_FALSE(ZA_In.isOutZA());
102*d313614bSSander de Smalen   ASSERT_FALSE(ZA_In.isInOutZA());
103*d313614bSSander de Smalen   ASSERT_FALSE(ZA_In.isPreservesZA());
104*d313614bSSander de Smalen   ASSERT_FALSE(ZA_In.isNewZA());
105*d313614bSSander de Smalen   ASSERT_TRUE(ZA_In.sharesZA());
106*d313614bSSander de Smalen   ASSERT_TRUE(ZA_In.hasZAState());
107*d313614bSSander de Smalen   ASSERT_TRUE(ZA_In.hasSharedZAInterface());
108*d313614bSSander de Smalen   ASSERT_FALSE(ZA_In.hasPrivateZAInterface());
109cf72dddaSSander de Smalen 
110*d313614bSSander de Smalen   SA ZA_Out = SA(SA::encodeZAState(SA::StateValue::Out));
111*d313614bSSander de Smalen   ASSERT_TRUE(ZA_Out.isOutZA());
112*d313614bSSander de Smalen   ASSERT_FALSE(ZA_Out.isInZA());
113*d313614bSSander de Smalen   ASSERT_FALSE(ZA_Out.isInOutZA());
114*d313614bSSander de Smalen   ASSERT_FALSE(ZA_Out.isPreservesZA());
115*d313614bSSander de Smalen   ASSERT_FALSE(ZA_Out.isNewZA());
116*d313614bSSander de Smalen   ASSERT_TRUE(ZA_Out.sharesZA());
117*d313614bSSander de Smalen   ASSERT_TRUE(ZA_Out.hasZAState());
118*d313614bSSander de Smalen   ASSERT_TRUE(ZA_Out.hasSharedZAInterface());
119*d313614bSSander de Smalen   ASSERT_FALSE(ZA_Out.hasPrivateZAInterface());
120cf72dddaSSander de Smalen 
121*d313614bSSander de Smalen   SA ZA_InOut = SA(SA::encodeZAState(SA::StateValue::InOut));
122*d313614bSSander de Smalen   ASSERT_TRUE(ZA_InOut.isInOutZA());
123*d313614bSSander de Smalen   ASSERT_FALSE(ZA_InOut.isInZA());
124*d313614bSSander de Smalen   ASSERT_FALSE(ZA_InOut.isOutZA());
125*d313614bSSander de Smalen   ASSERT_FALSE(ZA_InOut.isPreservesZA());
126*d313614bSSander de Smalen   ASSERT_FALSE(ZA_InOut.isNewZA());
127*d313614bSSander de Smalen   ASSERT_TRUE(ZA_InOut.sharesZA());
128*d313614bSSander de Smalen   ASSERT_TRUE(ZA_InOut.hasZAState());
129*d313614bSSander de Smalen   ASSERT_TRUE(ZA_InOut.hasSharedZAInterface());
130*d313614bSSander de Smalen   ASSERT_FALSE(ZA_InOut.hasPrivateZAInterface());
131*d313614bSSander de Smalen 
132*d313614bSSander de Smalen   SA ZA_Preserved = SA(SA::encodeZAState(SA::StateValue::Preserved));
133*d313614bSSander de Smalen   ASSERT_TRUE(ZA_Preserved.isPreservesZA());
134*d313614bSSander de Smalen   ASSERT_FALSE(ZA_Preserved.isInZA());
135*d313614bSSander de Smalen   ASSERT_FALSE(ZA_Preserved.isOutZA());
136*d313614bSSander de Smalen   ASSERT_FALSE(ZA_Preserved.isInOutZA());
137*d313614bSSander de Smalen   ASSERT_FALSE(ZA_Preserved.isNewZA());
138*d313614bSSander de Smalen   ASSERT_TRUE(ZA_Preserved.sharesZA());
139*d313614bSSander de Smalen   ASSERT_TRUE(ZA_Preserved.hasZAState());
140*d313614bSSander de Smalen   ASSERT_TRUE(ZA_Preserved.hasSharedZAInterface());
141*d313614bSSander de Smalen   ASSERT_FALSE(ZA_Preserved.hasPrivateZAInterface());
142*d313614bSSander de Smalen 
143*d313614bSSander de Smalen   SA ZA_New = SA(SA::encodeZAState(SA::StateValue::New));
144*d313614bSSander de Smalen   ASSERT_TRUE(ZA_New.isNewZA());
145*d313614bSSander de Smalen   ASSERT_FALSE(ZA_New.isInZA());
146*d313614bSSander de Smalen   ASSERT_FALSE(ZA_New.isOutZA());
147*d313614bSSander de Smalen   ASSERT_FALSE(ZA_New.isInOutZA());
148*d313614bSSander de Smalen   ASSERT_FALSE(ZA_New.isPreservesZA());
149*d313614bSSander de Smalen   ASSERT_FALSE(ZA_New.sharesZA());
150*d313614bSSander de Smalen   ASSERT_TRUE(ZA_New.hasZAState());
151*d313614bSSander de Smalen   ASSERT_FALSE(ZA_New.hasSharedZAInterface());
152*d313614bSSander de Smalen   ASSERT_TRUE(ZA_New.hasPrivateZAInterface());
153*d313614bSSander de Smalen 
154*d313614bSSander de Smalen   ASSERT_FALSE(SA(SA::Normal).isInZA());
155*d313614bSSander de Smalen   ASSERT_FALSE(SA(SA::Normal).isOutZA());
156*d313614bSSander de Smalen   ASSERT_FALSE(SA(SA::Normal).isInOutZA());
157*d313614bSSander de Smalen   ASSERT_FALSE(SA(SA::Normal).isPreservesZA());
158*d313614bSSander de Smalen   ASSERT_FALSE(SA(SA::Normal).isNewZA());
159*d313614bSSander de Smalen   ASSERT_FALSE(SA(SA::Normal).sharesZA());
160cf72dddaSSander de Smalen   ASSERT_FALSE(SA(SA::Normal).hasZAState());
161a4ec04eaSKerry McLaughlin 
162a4ec04eaSKerry McLaughlin   // Test ZT0 State interfaces
163a4ec04eaSKerry McLaughlin   SA ZT0_In = SA(SA::encodeZT0State(SA::StateValue::In));
164a4ec04eaSKerry McLaughlin   ASSERT_TRUE(ZT0_In.isInZT0());
165a4ec04eaSKerry McLaughlin   ASSERT_FALSE(ZT0_In.isOutZT0());
166a4ec04eaSKerry McLaughlin   ASSERT_FALSE(ZT0_In.isInOutZT0());
167a4ec04eaSKerry McLaughlin   ASSERT_FALSE(ZT0_In.isPreservesZT0());
168a4ec04eaSKerry McLaughlin   ASSERT_FALSE(ZT0_In.isNewZT0());
169a4ec04eaSKerry McLaughlin   ASSERT_TRUE(ZT0_In.sharesZT0());
170a4ec04eaSKerry McLaughlin   ASSERT_TRUE(ZT0_In.hasZT0State());
171a4ec04eaSKerry McLaughlin   ASSERT_TRUE(ZT0_In.hasSharedZAInterface());
172a4ec04eaSKerry McLaughlin   ASSERT_FALSE(ZT0_In.hasPrivateZAInterface());
173a4ec04eaSKerry McLaughlin 
174a4ec04eaSKerry McLaughlin   SA ZT0_Out = SA(SA::encodeZT0State(SA::StateValue::Out));
175a4ec04eaSKerry McLaughlin   ASSERT_TRUE(ZT0_Out.isOutZT0());
176a4ec04eaSKerry McLaughlin   ASSERT_FALSE(ZT0_Out.isInZT0());
177a4ec04eaSKerry McLaughlin   ASSERT_FALSE(ZT0_Out.isInOutZT0());
178a4ec04eaSKerry McLaughlin   ASSERT_FALSE(ZT0_Out.isPreservesZT0());
179a4ec04eaSKerry McLaughlin   ASSERT_FALSE(ZT0_Out.isNewZT0());
180a4ec04eaSKerry McLaughlin   ASSERT_TRUE(ZT0_Out.sharesZT0());
181a4ec04eaSKerry McLaughlin   ASSERT_TRUE(ZT0_Out.hasZT0State());
182a4ec04eaSKerry McLaughlin   ASSERT_TRUE(ZT0_Out.hasSharedZAInterface());
183a4ec04eaSKerry McLaughlin   ASSERT_FALSE(ZT0_Out.hasPrivateZAInterface());
184a4ec04eaSKerry McLaughlin 
185a4ec04eaSKerry McLaughlin   SA ZT0_InOut = SA(SA::encodeZT0State(SA::StateValue::InOut));
186a4ec04eaSKerry McLaughlin   ASSERT_TRUE(ZT0_InOut.isInOutZT0());
187a4ec04eaSKerry McLaughlin   ASSERT_FALSE(ZT0_InOut.isInZT0());
188a4ec04eaSKerry McLaughlin   ASSERT_FALSE(ZT0_InOut.isOutZT0());
189a4ec04eaSKerry McLaughlin   ASSERT_FALSE(ZT0_InOut.isPreservesZT0());
190a4ec04eaSKerry McLaughlin   ASSERT_FALSE(ZT0_InOut.isNewZT0());
191a4ec04eaSKerry McLaughlin   ASSERT_TRUE(ZT0_InOut.sharesZT0());
192a4ec04eaSKerry McLaughlin   ASSERT_TRUE(ZT0_InOut.hasZT0State());
193a4ec04eaSKerry McLaughlin   ASSERT_TRUE(ZT0_InOut.hasSharedZAInterface());
194a4ec04eaSKerry McLaughlin   ASSERT_FALSE(ZT0_InOut.hasPrivateZAInterface());
195a4ec04eaSKerry McLaughlin 
196a4ec04eaSKerry McLaughlin   SA ZT0_Preserved = SA(SA::encodeZT0State(SA::StateValue::Preserved));
197a4ec04eaSKerry McLaughlin   ASSERT_TRUE(ZT0_Preserved.isPreservesZT0());
198a4ec04eaSKerry McLaughlin   ASSERT_FALSE(ZT0_Preserved.isInZT0());
199a4ec04eaSKerry McLaughlin   ASSERT_FALSE(ZT0_Preserved.isOutZT0());
200a4ec04eaSKerry McLaughlin   ASSERT_FALSE(ZT0_Preserved.isInOutZT0());
201a4ec04eaSKerry McLaughlin   ASSERT_FALSE(ZT0_Preserved.isNewZT0());
202a4ec04eaSKerry McLaughlin   ASSERT_TRUE(ZT0_Preserved.sharesZT0());
203a4ec04eaSKerry McLaughlin   ASSERT_TRUE(ZT0_Preserved.hasZT0State());
204a4ec04eaSKerry McLaughlin   ASSERT_TRUE(ZT0_Preserved.hasSharedZAInterface());
205a4ec04eaSKerry McLaughlin   ASSERT_FALSE(ZT0_Preserved.hasPrivateZAInterface());
206a4ec04eaSKerry McLaughlin 
207a4ec04eaSKerry McLaughlin   SA ZT0_New = SA(SA::encodeZT0State(SA::StateValue::New));
208a4ec04eaSKerry McLaughlin   ASSERT_TRUE(ZT0_New.isNewZT0());
209a4ec04eaSKerry McLaughlin   ASSERT_FALSE(ZT0_New.isInZT0());
210a4ec04eaSKerry McLaughlin   ASSERT_FALSE(ZT0_New.isOutZT0());
211a4ec04eaSKerry McLaughlin   ASSERT_FALSE(ZT0_New.isInOutZT0());
212a4ec04eaSKerry McLaughlin   ASSERT_FALSE(ZT0_New.isPreservesZT0());
213a4ec04eaSKerry McLaughlin   ASSERT_FALSE(ZT0_New.sharesZT0());
214a4ec04eaSKerry McLaughlin   ASSERT_TRUE(ZT0_New.hasZT0State());
215a4ec04eaSKerry McLaughlin   ASSERT_FALSE(ZT0_New.hasSharedZAInterface());
216a4ec04eaSKerry McLaughlin   ASSERT_TRUE(ZT0_New.hasPrivateZAInterface());
217a4ec04eaSKerry McLaughlin 
218a4ec04eaSKerry McLaughlin   ASSERT_FALSE(SA(SA::Normal).isInZT0());
219a4ec04eaSKerry McLaughlin   ASSERT_FALSE(SA(SA::Normal).isOutZT0());
220a4ec04eaSKerry McLaughlin   ASSERT_FALSE(SA(SA::Normal).isInOutZT0());
221a4ec04eaSKerry McLaughlin   ASSERT_FALSE(SA(SA::Normal).isPreservesZT0());
222a4ec04eaSKerry McLaughlin   ASSERT_FALSE(SA(SA::Normal).isNewZT0());
223a4ec04eaSKerry McLaughlin   ASSERT_FALSE(SA(SA::Normal).sharesZT0());
224a4ec04eaSKerry McLaughlin   ASSERT_FALSE(SA(SA::Normal).hasZT0State());
225cf72dddaSSander de Smalen }
226cf72dddaSSander de Smalen 
TEST(SMEAttributes,Transitions)227cf72dddaSSander de Smalen TEST(SMEAttributes, Transitions) {
228cf72dddaSSander de Smalen   // Normal -> Normal
229cf72dddaSSander de Smalen   ASSERT_FALSE(SA(SA::Normal).requiresSMChange(SA(SA::Normal)));
230a8a3711eSKerry McLaughlin   ASSERT_FALSE(SA(SA::Normal).requiresPreservingZT0(SA(SA::Normal)));
231a8a3711eSKerry McLaughlin   ASSERT_FALSE(SA(SA::Normal).requiresDisablingZABeforeCall(SA(SA::Normal)));
232a8a3711eSKerry McLaughlin   ASSERT_FALSE(SA(SA::Normal).requiresEnablingZAAfterCall(SA(SA::Normal)));
233cf72dddaSSander de Smalen   // Normal -> Normal + LocallyStreaming
234cf72dddaSSander de Smalen   ASSERT_FALSE(SA(SA::Normal).requiresSMChange(SA(SA::Normal | SA::SM_Body)));
235cf72dddaSSander de Smalen 
236cf72dddaSSander de Smalen   // Normal -> Streaming
2375f41cef5SSander de Smalen   ASSERT_TRUE(SA(SA::Normal).requiresSMChange(SA(SA::SM_Enabled)));
238cf72dddaSSander de Smalen   // Normal -> Streaming + LocallyStreaming
2395f41cef5SSander de Smalen   ASSERT_TRUE(
2405f41cef5SSander de Smalen       SA(SA::Normal).requiresSMChange(SA(SA::SM_Enabled | SA::SM_Body)));
241cf72dddaSSander de Smalen 
242cf72dddaSSander de Smalen   // Normal -> Streaming-compatible
243cf72dddaSSander de Smalen   ASSERT_FALSE(SA(SA::Normal).requiresSMChange(SA(SA::SM_Compatible)));
244cf72dddaSSander de Smalen   // Normal -> Streaming-compatible + LocallyStreaming
245cf72dddaSSander de Smalen   ASSERT_FALSE(
246cf72dddaSSander de Smalen       SA(SA::Normal).requiresSMChange(SA(SA::SM_Compatible | SA::SM_Body)));
247cf72dddaSSander de Smalen 
248cf72dddaSSander de Smalen   // Streaming -> Normal
2495f41cef5SSander de Smalen   ASSERT_TRUE(SA(SA::SM_Enabled).requiresSMChange(SA(SA::Normal)));
250cf72dddaSSander de Smalen   // Streaming -> Normal + LocallyStreaming
2515f41cef5SSander de Smalen   ASSERT_TRUE(
2525f41cef5SSander de Smalen       SA(SA::SM_Enabled).requiresSMChange(SA(SA::Normal | SA::SM_Body)));
253cf72dddaSSander de Smalen 
254cf72dddaSSander de Smalen   // Streaming -> Streaming
255cf72dddaSSander de Smalen   ASSERT_FALSE(SA(SA::SM_Enabled).requiresSMChange(SA(SA::SM_Enabled)));
256cf72dddaSSander de Smalen   // Streaming -> Streaming + LocallyStreaming
257cf72dddaSSander de Smalen   ASSERT_FALSE(
258cf72dddaSSander de Smalen       SA(SA::SM_Enabled).requiresSMChange(SA(SA::SM_Enabled | SA::SM_Body)));
259cf72dddaSSander de Smalen 
260cf72dddaSSander de Smalen   // Streaming -> Streaming-compatible
261cf72dddaSSander de Smalen   ASSERT_FALSE(SA(SA::SM_Enabled).requiresSMChange(SA(SA::SM_Compatible)));
262cf72dddaSSander de Smalen   // Streaming -> Streaming-compatible + LocallyStreaming
263cf72dddaSSander de Smalen   ASSERT_FALSE(
264cf72dddaSSander de Smalen       SA(SA::SM_Enabled).requiresSMChange(SA(SA::SM_Compatible | SA::SM_Body)));
265cf72dddaSSander de Smalen 
266cf72dddaSSander de Smalen   // Streaming-compatible -> Normal
2675f41cef5SSander de Smalen   ASSERT_TRUE(SA(SA::SM_Compatible).requiresSMChange(SA(SA::Normal)));
2685f41cef5SSander de Smalen   ASSERT_TRUE(
2695f41cef5SSander de Smalen       SA(SA::SM_Compatible).requiresSMChange(SA(SA::Normal | SA::SM_Body)));
270cf72dddaSSander de Smalen 
271cf72dddaSSander de Smalen   // Streaming-compatible -> Streaming
2725f41cef5SSander de Smalen   ASSERT_TRUE(SA(SA::SM_Compatible).requiresSMChange(SA(SA::SM_Enabled)));
273cf72dddaSSander de Smalen   // Streaming-compatible -> Streaming + LocallyStreaming
2745f41cef5SSander de Smalen   ASSERT_TRUE(
2755f41cef5SSander de Smalen       SA(SA::SM_Compatible).requiresSMChange(SA(SA::SM_Enabled | SA::SM_Body)));
276cf72dddaSSander de Smalen 
277cf72dddaSSander de Smalen   // Streaming-compatible -> Streaming-compatible
278cf72dddaSSander de Smalen   ASSERT_FALSE(SA(SA::SM_Compatible).requiresSMChange(SA(SA::SM_Compatible)));
279cf72dddaSSander de Smalen   // Streaming-compatible -> Streaming-compatible + LocallyStreaming
280cf72dddaSSander de Smalen   ASSERT_FALSE(SA(SA::SM_Compatible)
281cf72dddaSSander de Smalen                    .requiresSMChange(SA(SA::SM_Compatible | SA::SM_Body)));
282a8a3711eSKerry McLaughlin 
283a8a3711eSKerry McLaughlin   SA Private_ZA = SA(SA::Normal);
284*d313614bSSander de Smalen   SA ZA_Shared = SA(SA::encodeZAState(SA::StateValue::In));
285a8a3711eSKerry McLaughlin   SA ZT0_Shared = SA(SA::encodeZT0State(SA::StateValue::In));
286*d313614bSSander de Smalen   SA ZA_ZT0_Shared = SA(SA::encodeZAState(SA::StateValue::In) |
287*d313614bSSander de Smalen                         SA::encodeZT0State(SA::StateValue::In));
288a8a3711eSKerry McLaughlin 
289a8a3711eSKerry McLaughlin   // Shared ZA -> Private ZA Interface
290a8a3711eSKerry McLaughlin   ASSERT_FALSE(ZA_Shared.requiresDisablingZABeforeCall(Private_ZA));
291a8a3711eSKerry McLaughlin   ASSERT_TRUE(ZA_Shared.requiresEnablingZAAfterCall(Private_ZA));
292a8a3711eSKerry McLaughlin 
293a8a3711eSKerry McLaughlin   // Shared ZT0 -> Private ZA Interface
294a8a3711eSKerry McLaughlin   ASSERT_TRUE(ZT0_Shared.requiresDisablingZABeforeCall(Private_ZA));
295a8a3711eSKerry McLaughlin   ASSERT_TRUE(ZT0_Shared.requiresPreservingZT0(Private_ZA));
296a8a3711eSKerry McLaughlin   ASSERT_TRUE(ZT0_Shared.requiresEnablingZAAfterCall(Private_ZA));
297a8a3711eSKerry McLaughlin 
298a8a3711eSKerry McLaughlin   // Shared ZA & ZT0 -> Private ZA Interface
299a8a3711eSKerry McLaughlin   ASSERT_FALSE(ZA_ZT0_Shared.requiresDisablingZABeforeCall(Private_ZA));
300a8a3711eSKerry McLaughlin   ASSERT_TRUE(ZA_ZT0_Shared.requiresPreservingZT0(Private_ZA));
301a8a3711eSKerry McLaughlin   ASSERT_TRUE(ZA_ZT0_Shared.requiresEnablingZAAfterCall(Private_ZA));
302a8a3711eSKerry McLaughlin 
303a8a3711eSKerry McLaughlin   // Shared ZA -> Shared ZA Interface
304a8a3711eSKerry McLaughlin   ASSERT_FALSE(ZA_Shared.requiresDisablingZABeforeCall(ZT0_Shared));
305a8a3711eSKerry McLaughlin   ASSERT_FALSE(ZA_Shared.requiresEnablingZAAfterCall(ZT0_Shared));
306a8a3711eSKerry McLaughlin 
307a8a3711eSKerry McLaughlin   // Shared ZT0 -> Shared ZA Interface
308a8a3711eSKerry McLaughlin   ASSERT_FALSE(ZT0_Shared.requiresDisablingZABeforeCall(ZT0_Shared));
309a8a3711eSKerry McLaughlin   ASSERT_FALSE(ZT0_Shared.requiresPreservingZT0(ZT0_Shared));
310a8a3711eSKerry McLaughlin   ASSERT_FALSE(ZT0_Shared.requiresEnablingZAAfterCall(ZT0_Shared));
311a8a3711eSKerry McLaughlin 
312a8a3711eSKerry McLaughlin   // Shared ZA & ZT0 -> Shared ZA Interface
313a8a3711eSKerry McLaughlin   ASSERT_FALSE(ZA_ZT0_Shared.requiresDisablingZABeforeCall(ZT0_Shared));
314a8a3711eSKerry McLaughlin   ASSERT_FALSE(ZA_ZT0_Shared.requiresPreservingZT0(ZT0_Shared));
315a8a3711eSKerry McLaughlin   ASSERT_FALSE(ZA_ZT0_Shared.requiresEnablingZAAfterCall(ZT0_Shared));
316cf72dddaSSander de Smalen }
317