@@ -38,6 +38,10 @@ TEST(SMEAttributes, Constructors) {
38
38
->getFunction (" foo" ))
39
39
.hasStreamingCompatibleInterface ());
40
40
41
+ ASSERT_TRUE (SA (*parseIR (" declare void @foo() \" aarch64_pstate_za_shared\" " )
42
+ ->getFunction (" foo" ))
43
+ .sharesZA ());
44
+
41
45
ASSERT_TRUE (SA (*parseIR (" declare void @foo() \" aarch64_pstate_za_shared\" " )
42
46
->getFunction (" foo" ))
43
47
.hasSharedZAInterface ());
@@ -50,6 +54,22 @@ TEST(SMEAttributes, Constructors) {
50
54
->getFunction (" foo" ))
51
55
.preservesZA ());
52
56
57
+ ASSERT_TRUE (
58
+ SA (*parseIR (" declare void @foo() \" aarch64_in_zt0\" " )->getFunction (" foo" ))
59
+ .isInZT0 ());
60
+ ASSERT_TRUE (SA (*parseIR (" declare void @foo() \" aarch64_out_zt0\" " )
61
+ ->getFunction (" foo" ))
62
+ .isOutZT0 ());
63
+ ASSERT_TRUE (SA (*parseIR (" declare void @foo() \" aarch64_inout_zt0\" " )
64
+ ->getFunction (" foo" ))
65
+ .isInOutZT0 ());
66
+ ASSERT_TRUE (SA (*parseIR (" declare void @foo() \" aarch64_preserves_zt0\" " )
67
+ ->getFunction (" foo" ))
68
+ .isPreservesZT0 ());
69
+ ASSERT_TRUE (SA (*parseIR (" declare void @foo() \" aarch64_new_zt0\" " )
70
+ ->getFunction (" foo" ))
71
+ .isNewZT0 ());
72
+
53
73
// Invalid combinations.
54
74
EXPECT_DEBUG_DEATH (SA (SA::SM_Enabled | SA::SM_Compatible),
55
75
" SM_Enabled and SM_Compatible are mutually exclusive" );
@@ -82,19 +102,90 @@ TEST(SMEAttributes, Basics) {
82
102
// Test PSTATE.ZA interfaces.
83
103
ASSERT_FALSE (SA (SA::ZA_Shared).hasPrivateZAInterface ());
84
104
ASSERT_TRUE (SA (SA::ZA_Shared).hasSharedZAInterface ());
105
+ ASSERT_TRUE (SA (SA::ZA_Shared).sharesZA ());
85
106
ASSERT_TRUE (SA (SA::ZA_Shared).hasZAState ());
86
107
ASSERT_FALSE (SA (SA::ZA_Shared).preservesZA ());
87
108
ASSERT_TRUE (SA (SA::ZA_Shared | SA::ZA_Preserved).preservesZA ());
109
+ ASSERT_FALSE (SA (SA::ZA_Shared).sharesZT0 ());
110
+ ASSERT_FALSE (SA (SA::ZA_Shared).hasZT0State ());
88
111
89
112
ASSERT_TRUE (SA (SA::ZA_New).hasPrivateZAInterface ());
113
+ ASSERT_FALSE (SA (SA::ZA_New).hasSharedZAInterface ());
90
114
ASSERT_TRUE (SA (SA::ZA_New).hasNewZABody ());
91
115
ASSERT_TRUE (SA (SA::ZA_New).hasZAState ());
92
116
ASSERT_FALSE (SA (SA::ZA_New).preservesZA ());
117
+ ASSERT_FALSE (SA (SA::ZA_New).sharesZT0 ());
118
+ ASSERT_FALSE (SA (SA::ZA_New).hasZT0State ());
93
119
94
120
ASSERT_TRUE (SA (SA::Normal).hasPrivateZAInterface ());
121
+ ASSERT_FALSE (SA (SA::Normal).hasSharedZAInterface ());
95
122
ASSERT_FALSE (SA (SA::Normal).hasNewZABody ());
96
123
ASSERT_FALSE (SA (SA::Normal).hasZAState ());
97
124
ASSERT_FALSE (SA (SA::Normal).preservesZA ());
125
+
126
+ // Test ZT0 State interfaces
127
+ SA ZT0_In = SA (SA::encodeZT0State (SA::StateValue::In));
128
+ ASSERT_TRUE (ZT0_In.isInZT0 ());
129
+ ASSERT_FALSE (ZT0_In.isOutZT0 ());
130
+ ASSERT_FALSE (ZT0_In.isInOutZT0 ());
131
+ ASSERT_FALSE (ZT0_In.isPreservesZT0 ());
132
+ ASSERT_FALSE (ZT0_In.isNewZT0 ());
133
+ ASSERT_TRUE (ZT0_In.sharesZT0 ());
134
+ ASSERT_TRUE (ZT0_In.hasZT0State ());
135
+ ASSERT_TRUE (ZT0_In.hasSharedZAInterface ());
136
+ ASSERT_FALSE (ZT0_In.hasPrivateZAInterface ());
137
+
138
+ SA ZT0_Out = SA (SA::encodeZT0State (SA::StateValue::Out));
139
+ ASSERT_TRUE (ZT0_Out.isOutZT0 ());
140
+ ASSERT_FALSE (ZT0_Out.isInZT0 ());
141
+ ASSERT_FALSE (ZT0_Out.isInOutZT0 ());
142
+ ASSERT_FALSE (ZT0_Out.isPreservesZT0 ());
143
+ ASSERT_FALSE (ZT0_Out.isNewZT0 ());
144
+ ASSERT_TRUE (ZT0_Out.sharesZT0 ());
145
+ ASSERT_TRUE (ZT0_Out.hasZT0State ());
146
+ ASSERT_TRUE (ZT0_Out.hasSharedZAInterface ());
147
+ ASSERT_FALSE (ZT0_Out.hasPrivateZAInterface ());
148
+
149
+ SA ZT0_InOut = SA (SA::encodeZT0State (SA::StateValue::InOut));
150
+ ASSERT_TRUE (ZT0_InOut.isInOutZT0 ());
151
+ ASSERT_FALSE (ZT0_InOut.isInZT0 ());
152
+ ASSERT_FALSE (ZT0_InOut.isOutZT0 ());
153
+ ASSERT_FALSE (ZT0_InOut.isPreservesZT0 ());
154
+ ASSERT_FALSE (ZT0_InOut.isNewZT0 ());
155
+ ASSERT_TRUE (ZT0_InOut.sharesZT0 ());
156
+ ASSERT_TRUE (ZT0_InOut.hasZT0State ());
157
+ ASSERT_TRUE (ZT0_InOut.hasSharedZAInterface ());
158
+ ASSERT_FALSE (ZT0_InOut.hasPrivateZAInterface ());
159
+
160
+ SA ZT0_Preserved = SA (SA::encodeZT0State (SA::StateValue::Preserved));
161
+ ASSERT_TRUE (ZT0_Preserved.isPreservesZT0 ());
162
+ ASSERT_FALSE (ZT0_Preserved.isInZT0 ());
163
+ ASSERT_FALSE (ZT0_Preserved.isOutZT0 ());
164
+ ASSERT_FALSE (ZT0_Preserved.isInOutZT0 ());
165
+ ASSERT_FALSE (ZT0_Preserved.isNewZT0 ());
166
+ ASSERT_TRUE (ZT0_Preserved.sharesZT0 ());
167
+ ASSERT_TRUE (ZT0_Preserved.hasZT0State ());
168
+ ASSERT_TRUE (ZT0_Preserved.hasSharedZAInterface ());
169
+ ASSERT_FALSE (ZT0_Preserved.hasPrivateZAInterface ());
170
+
171
+ SA ZT0_New = SA (SA::encodeZT0State (SA::StateValue::New));
172
+ ASSERT_TRUE (ZT0_New.isNewZT0 ());
173
+ ASSERT_FALSE (ZT0_New.isInZT0 ());
174
+ ASSERT_FALSE (ZT0_New.isOutZT0 ());
175
+ ASSERT_FALSE (ZT0_New.isInOutZT0 ());
176
+ ASSERT_FALSE (ZT0_New.isPreservesZT0 ());
177
+ ASSERT_FALSE (ZT0_New.sharesZT0 ());
178
+ ASSERT_TRUE (ZT0_New.hasZT0State ());
179
+ ASSERT_FALSE (ZT0_New.hasSharedZAInterface ());
180
+ ASSERT_TRUE (ZT0_New.hasPrivateZAInterface ());
181
+
182
+ ASSERT_FALSE (SA (SA::Normal).isInZT0 ());
183
+ ASSERT_FALSE (SA (SA::Normal).isOutZT0 ());
184
+ ASSERT_FALSE (SA (SA::Normal).isInOutZT0 ());
185
+ ASSERT_FALSE (SA (SA::Normal).isPreservesZT0 ());
186
+ ASSERT_FALSE (SA (SA::Normal).isNewZT0 ());
187
+ ASSERT_FALSE (SA (SA::Normal).sharesZT0 ());
188
+ ASSERT_FALSE (SA (SA::Normal).hasZT0State ());
98
189
}
99
190
100
191
TEST (SMEAttributes, Transitions) {
0 commit comments