OLD | NEW |
1 //===- subzero/unittest/AssemblerX8632/Locked.cpp -------------------------===// | 1 //===- subzero/unittest/AssemblerX8632/Locked.cpp -------------------------===// |
2 // | 2 // |
3 // The Subzero Code Generator | 3 // The Subzero Code Generator |
4 // | 4 // |
5 // This file is distributed under the University of Illinois Open Source | 5 // This file is distributed under the University of Illinois Open Source |
6 // License. See LICENSE.TXT for details. | 6 // License. See LICENSE.TXT for details. |
7 // | 7 // |
8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
9 #include "AssemblerX8632/TestUtil.h" | 9 #include "AssemblerX8632/TestUtil.h" |
10 | 10 |
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
190 TestImpl(edi); | 190 TestImpl(edi); |
191 | 191 |
192 #undef TestImpl | 192 #undef TestImpl |
193 #undef TestImplSize | 193 #undef TestImplSize |
194 #undef TestImplAddrReg | 194 #undef TestImplAddrReg |
195 } | 195 } |
196 | 196 |
197 TEST_F(AssemblerX8632LowLevelTest, Xadd) { | 197 TEST_F(AssemblerX8632LowLevelTest, Xadd) { |
198 static constexpr bool NotLocked = false; | 198 static constexpr bool NotLocked = false; |
199 static constexpr bool Locked = true; | 199 static constexpr bool Locked = true; |
| 200 static constexpr AssemblerFixup *Fixup = nullptr; |
200 | 201 |
201 // Ensures that xadd emits a lock prefix accordingly. | 202 // Ensures that xadd emits a lock prefix accordingly. |
202 { | 203 { |
203 __ xadd(IceType_i8, Address::Absolute(0x1FF00), | 204 __ xadd(IceType_i8, Address(0x1FF00, Fixup), GPRRegister::Encoded_Reg_esi, |
204 GPRRegister::Encoded_Reg_esi, NotLocked); | 205 NotLocked); |
205 static constexpr uint8_t ByteCountNotLocked8 = 7; | 206 static constexpr uint8_t ByteCountNotLocked8 = 7; |
206 ASSERT_EQ(ByteCountNotLocked8, codeBytesSize()); | 207 ASSERT_EQ(ByteCountNotLocked8, codeBytesSize()); |
207 verifyBytes<ByteCountNotLocked8>(codeBytes(), 0x0F, 0xC0, 0x35, 0x00, 0xFF, | 208 verifyBytes<ByteCountNotLocked8>(codeBytes(), 0x0F, 0xC0, 0x35, 0x00, 0xFF, |
208 0x01, 0x00); | 209 0x01, 0x00); |
209 reset(); | 210 reset(); |
210 | 211 |
211 __ xadd(IceType_i8, Address::Absolute(0x1FF00), | 212 __ xadd(IceType_i8, Address(0x1FF00, Fixup), GPRRegister::Encoded_Reg_esi, |
212 GPRRegister::Encoded_Reg_esi, Locked); | 213 Locked); |
213 static constexpr uint8_t ByteCountLocked8 = 1 + ByteCountNotLocked8; | 214 static constexpr uint8_t ByteCountLocked8 = 1 + ByteCountNotLocked8; |
214 ASSERT_EQ(ByteCountLocked8, codeBytesSize()); | 215 ASSERT_EQ(ByteCountLocked8, codeBytesSize()); |
215 verifyBytes<ByteCountLocked8>(codeBytes(), 0xF0, 0x0F, 0xC0, 0x35, 0x00, | 216 verifyBytes<ByteCountLocked8>(codeBytes(), 0xF0, 0x0F, 0xC0, 0x35, 0x00, |
216 0xFF, 0x01, 0x00); | 217 0xFF, 0x01, 0x00); |
217 reset(); | 218 reset(); |
218 } | 219 } |
219 | 220 |
220 { | 221 { |
221 __ xadd(IceType_i16, Address::Absolute(0x1FF00), | 222 __ xadd(IceType_i16, Address(0x1FF00, Fixup), GPRRegister::Encoded_Reg_esi, |
222 GPRRegister::Encoded_Reg_esi, NotLocked); | 223 NotLocked); |
223 static constexpr uint8_t ByteCountNotLocked16 = 8; | 224 static constexpr uint8_t ByteCountNotLocked16 = 8; |
224 ASSERT_EQ(ByteCountNotLocked16, codeBytesSize()); | 225 ASSERT_EQ(ByteCountNotLocked16, codeBytesSize()); |
225 verifyBytes<ByteCountNotLocked16>(codeBytes(), 0x66, 0x0F, 0xC1, 0x35, 0x00, | 226 verifyBytes<ByteCountNotLocked16>(codeBytes(), 0x66, 0x0F, 0xC1, 0x35, 0x00, |
226 0xFF, 0x01, 0x00); | 227 0xFF, 0x01, 0x00); |
227 reset(); | 228 reset(); |
228 | 229 |
229 __ xadd(IceType_i16, Address::Absolute(0x1FF00), | 230 __ xadd(IceType_i16, Address(0x1FF00, Fixup), GPRRegister::Encoded_Reg_esi, |
230 GPRRegister::Encoded_Reg_esi, Locked); | 231 Locked); |
231 static constexpr uint8_t ByteCountLocked16 = 1 + ByteCountNotLocked16; | 232 static constexpr uint8_t ByteCountLocked16 = 1 + ByteCountNotLocked16; |
232 ASSERT_EQ(ByteCountLocked16, codeBytesSize()); | 233 ASSERT_EQ(ByteCountLocked16, codeBytesSize()); |
233 verifyBytes<ByteCountLocked16>(codeBytes(), 0x66, 0xF0, 0x0F, 0xC1, 0x35, | 234 verifyBytes<ByteCountLocked16>(codeBytes(), 0x66, 0xF0, 0x0F, 0xC1, 0x35, |
234 0x00, 0xFF, 0x01, 0x00); | 235 0x00, 0xFF, 0x01, 0x00); |
235 reset(); | 236 reset(); |
236 } | 237 } |
237 | 238 |
238 { | 239 { |
239 __ xadd(IceType_i32, Address::Absolute(0x1FF00), | 240 __ xadd(IceType_i32, Address(0x1FF00, Fixup), GPRRegister::Encoded_Reg_esi, |
240 GPRRegister::Encoded_Reg_esi, NotLocked); | 241 NotLocked); |
241 static constexpr uint8_t ByteCountNotLocked32 = 7; | 242 static constexpr uint8_t ByteCountNotLocked32 = 7; |
242 ASSERT_EQ(ByteCountNotLocked32, codeBytesSize()); | 243 ASSERT_EQ(ByteCountNotLocked32, codeBytesSize()); |
243 verifyBytes<ByteCountNotLocked32>(codeBytes(), 0x0F, 0xC1, 0x35, 0x00, 0xFF, | 244 verifyBytes<ByteCountNotLocked32>(codeBytes(), 0x0F, 0xC1, 0x35, 0x00, 0xFF, |
244 0x01, 0x00); | 245 0x01, 0x00); |
245 reset(); | 246 reset(); |
246 | 247 |
247 __ xadd(IceType_i32, Address::Absolute(0x1FF00), | 248 __ xadd(IceType_i32, Address(0x1FF00, Fixup), GPRRegister::Encoded_Reg_esi, |
248 GPRRegister::Encoded_Reg_esi, Locked); | 249 Locked); |
249 static constexpr uint8_t ByteCountLocked32 = 1 + ByteCountNotLocked32; | 250 static constexpr uint8_t ByteCountLocked32 = 1 + ByteCountNotLocked32; |
250 ASSERT_EQ(ByteCountLocked32, codeBytesSize()); | 251 ASSERT_EQ(ByteCountLocked32, codeBytesSize()); |
251 verifyBytes<ByteCountLocked32>(codeBytes(), 0xF0, 0x0F, 0xC1, 0x35, 0x00, | 252 verifyBytes<ByteCountLocked32>(codeBytes(), 0xF0, 0x0F, 0xC1, 0x35, 0x00, |
252 0xFF, 0x01, 0x00); | 253 0xFF, 0x01, 0x00); |
253 reset(); | 254 reset(); |
254 } | 255 } |
255 } | 256 } |
256 | 257 |
257 TEST_F(AssemblerX8632Test, Cmpxchg8b) { | 258 TEST_F(AssemblerX8632Test, Cmpxchg8b) { |
258 static constexpr bool NotLocked = false; | 259 static constexpr bool NotLocked = false; |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
298 TestImpl(0x98987676543210ull, 0x1, 0x98987676543210ull, Locked); | 299 TestImpl(0x98987676543210ull, 0x1, 0x98987676543210ull, Locked); |
299 TestImpl(0x98987676543210ull, 0x1, 0x98987676543211ull, NotLocked); | 300 TestImpl(0x98987676543210ull, 0x1, 0x98987676543211ull, NotLocked); |
300 TestImpl(0x98987676543210ull, 0x1, 0x98987676543211ull, Locked); | 301 TestImpl(0x98987676543210ull, 0x1, 0x98987676543211ull, Locked); |
301 | 302 |
302 #undef TestImpl | 303 #undef TestImpl |
303 } | 304 } |
304 | 305 |
305 TEST_F(AssemblerX8632LowLevelTest, Cmpxchg8b) { | 306 TEST_F(AssemblerX8632LowLevelTest, Cmpxchg8b) { |
306 static constexpr bool NotLocked = false; | 307 static constexpr bool NotLocked = false; |
307 static constexpr bool Locked = true; | 308 static constexpr bool Locked = true; |
| 309 static constexpr AssemblerFixup *Fixup = nullptr; |
308 | 310 |
309 // Ensures that cmpxchg8b emits a lock prefix accordingly. | 311 // Ensures that cmpxchg8b emits a lock prefix accordingly. |
310 __ cmpxchg8b(Address::Absolute(0x1FF00), NotLocked); | 312 __ cmpxchg8b(Address(0x1FF00, Fixup), NotLocked); |
311 static constexpr uint8_t ByteCountNotLocked = 7; | 313 static constexpr uint8_t ByteCountNotLocked = 7; |
312 ASSERT_EQ(ByteCountNotLocked, codeBytesSize()); | 314 ASSERT_EQ(ByteCountNotLocked, codeBytesSize()); |
313 verifyBytes<ByteCountNotLocked>(codeBytes(), 0x0F, 0xC7, 0x0D, 0x00, 0xFF, | 315 verifyBytes<ByteCountNotLocked>(codeBytes(), 0x0F, 0xC7, 0x0D, 0x00, 0xFF, |
314 0x01, 0x00); | 316 0x01, 0x00); |
315 reset(); | 317 reset(); |
316 | 318 |
317 __ cmpxchg8b(Address::Absolute(0x1FF00), Locked); | 319 __ cmpxchg8b(Address(0x1FF00, Fixup), Locked); |
318 static constexpr uint8_t ByteCountLocked = 1 + ByteCountNotLocked; | 320 static constexpr uint8_t ByteCountLocked = 1 + ByteCountNotLocked; |
319 ASSERT_EQ(ByteCountLocked, codeBytesSize()); | 321 ASSERT_EQ(ByteCountLocked, codeBytesSize()); |
320 verifyBytes<ByteCountLocked>(codeBytes(), 0xF0, 0x0F, 0xC7, 0x0D, 0x00, 0xFF, | 322 verifyBytes<ByteCountLocked>(codeBytes(), 0xF0, 0x0F, 0xC7, 0x0D, 0x00, 0xFF, |
321 0x01, 0x00); | 323 0x01, 0x00); |
322 reset(); | 324 reset(); |
323 } | 325 } |
324 | 326 |
325 TEST_F(AssemblerX8632Test, Cmpxchg) { | 327 TEST_F(AssemblerX8632Test, Cmpxchg) { |
326 static constexpr bool NotLocked = false; | 328 static constexpr bool NotLocked = false; |
327 static constexpr bool Locked = true; | 329 static constexpr bool Locked = true; |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
390 TestImpl(edi, NotLocked); | 392 TestImpl(edi, NotLocked); |
391 | 393 |
392 #undef TestImpl | 394 #undef TestImpl |
393 #undef TestImplValue | 395 #undef TestImplValue |
394 #undef TestImplAddrReg | 396 #undef TestImplAddrReg |
395 } | 397 } |
396 | 398 |
397 TEST_F(AssemblerX8632LowLevelTest, Cmpxchg) { | 399 TEST_F(AssemblerX8632LowLevelTest, Cmpxchg) { |
398 static constexpr bool NotLocked = false; | 400 static constexpr bool NotLocked = false; |
399 static constexpr bool Locked = true; | 401 static constexpr bool Locked = true; |
| 402 static constexpr AssemblerFixup *Fixup = nullptr; |
400 | 403 |
401 // Ensures that cmpxchg emits a lock prefix accordingly. | 404 // Ensures that cmpxchg emits a lock prefix accordingly. |
402 { | 405 { |
403 __ cmpxchg(IceType_i8, Address::Absolute(0x1FF00), | 406 __ cmpxchg(IceType_i8, Address(0x1FF00, Fixup), |
404 GPRRegister::Encoded_Reg_esi, NotLocked); | 407 GPRRegister::Encoded_Reg_esi, NotLocked); |
405 static constexpr uint8_t ByteCountNotLocked8 = 7; | 408 static constexpr uint8_t ByteCountNotLocked8 = 7; |
406 ASSERT_EQ(ByteCountNotLocked8, codeBytesSize()); | 409 ASSERT_EQ(ByteCountNotLocked8, codeBytesSize()); |
407 verifyBytes<ByteCountNotLocked8>(codeBytes(), 0x0F, 0xB0, 0x35, 0x00, 0xFF, | 410 verifyBytes<ByteCountNotLocked8>(codeBytes(), 0x0F, 0xB0, 0x35, 0x00, 0xFF, |
408 0x01, 0x00); | 411 0x01, 0x00); |
409 reset(); | 412 reset(); |
410 | 413 |
411 __ cmpxchg(IceType_i8, Address::Absolute(0x1FF00), | 414 __ cmpxchg(IceType_i8, Address(0x1FF00, Fixup), |
412 GPRRegister::Encoded_Reg_esi, Locked); | 415 GPRRegister::Encoded_Reg_esi, Locked); |
413 static constexpr uint8_t ByteCountLocked8 = 1 + ByteCountNotLocked8; | 416 static constexpr uint8_t ByteCountLocked8 = 1 + ByteCountNotLocked8; |
414 ASSERT_EQ(ByteCountLocked8, codeBytesSize()); | 417 ASSERT_EQ(ByteCountLocked8, codeBytesSize()); |
415 verifyBytes<ByteCountLocked8>(codeBytes(), 0xF0, 0x0F, 0xB0, 0x35, 0x00, | 418 verifyBytes<ByteCountLocked8>(codeBytes(), 0xF0, 0x0F, 0xB0, 0x35, 0x00, |
416 0xFF, 0x01, 0x00); | 419 0xFF, 0x01, 0x00); |
417 reset(); | 420 reset(); |
418 } | 421 } |
419 | 422 |
420 { | 423 { |
421 __ cmpxchg(IceType_i16, Address::Absolute(0x1FF00), | 424 __ cmpxchg(IceType_i16, Address(0x1FF00, Fixup), |
422 GPRRegister::Encoded_Reg_esi, NotLocked); | 425 GPRRegister::Encoded_Reg_esi, NotLocked); |
423 static constexpr uint8_t ByteCountNotLocked16 = 8; | 426 static constexpr uint8_t ByteCountNotLocked16 = 8; |
424 ASSERT_EQ(ByteCountNotLocked16, codeBytesSize()); | 427 ASSERT_EQ(ByteCountNotLocked16, codeBytesSize()); |
425 verifyBytes<ByteCountNotLocked16>(codeBytes(), 0x66, 0x0F, 0xB1, 0x35, 0x00, | 428 verifyBytes<ByteCountNotLocked16>(codeBytes(), 0x66, 0x0F, 0xB1, 0x35, 0x00, |
426 0xFF, 0x01, 0x00); | 429 0xFF, 0x01, 0x00); |
427 reset(); | 430 reset(); |
428 | 431 |
429 __ cmpxchg(IceType_i16, Address::Absolute(0x1FF00), | 432 __ cmpxchg(IceType_i16, Address(0x1FF00, Fixup), |
430 GPRRegister::Encoded_Reg_esi, Locked); | 433 GPRRegister::Encoded_Reg_esi, Locked); |
431 static constexpr uint8_t ByteCountLocked16 = 1 + ByteCountNotLocked16; | 434 static constexpr uint8_t ByteCountLocked16 = 1 + ByteCountNotLocked16; |
432 ASSERT_EQ(ByteCountLocked16, codeBytesSize()); | 435 ASSERT_EQ(ByteCountLocked16, codeBytesSize()); |
433 verifyBytes<ByteCountLocked16>(codeBytes(), 0x66, 0xF0, 0x0F, 0xB1, 0x35, | 436 verifyBytes<ByteCountLocked16>(codeBytes(), 0x66, 0xF0, 0x0F, 0xB1, 0x35, |
434 0x00, 0xFF, 0x01, 0x00); | 437 0x00, 0xFF, 0x01, 0x00); |
435 reset(); | 438 reset(); |
436 } | 439 } |
437 | 440 |
438 { | 441 { |
439 __ cmpxchg(IceType_i32, Address::Absolute(0x1FF00), | 442 __ cmpxchg(IceType_i32, Address(0x1FF00, Fixup), |
440 GPRRegister::Encoded_Reg_esi, NotLocked); | 443 GPRRegister::Encoded_Reg_esi, NotLocked); |
441 static constexpr uint8_t ByteCountNotLocked32 = 7; | 444 static constexpr uint8_t ByteCountNotLocked32 = 7; |
442 ASSERT_EQ(ByteCountNotLocked32, codeBytesSize()); | 445 ASSERT_EQ(ByteCountNotLocked32, codeBytesSize()); |
443 verifyBytes<ByteCountNotLocked32>(codeBytes(), 0x0F, 0xB1, 0x35, 0x00, 0xFF, | 446 verifyBytes<ByteCountNotLocked32>(codeBytes(), 0x0F, 0xB1, 0x35, 0x00, 0xFF, |
444 0x01, 0x00); | 447 0x01, 0x00); |
445 reset(); | 448 reset(); |
446 | 449 |
447 __ cmpxchg(IceType_i32, Address::Absolute(0x1FF00), | 450 __ cmpxchg(IceType_i32, Address(0x1FF00, Fixup), |
448 GPRRegister::Encoded_Reg_esi, Locked); | 451 GPRRegister::Encoded_Reg_esi, Locked); |
449 static constexpr uint8_t ByteCountLocked32 = 1 + ByteCountNotLocked32; | 452 static constexpr uint8_t ByteCountLocked32 = 1 + ByteCountNotLocked32; |
450 ASSERT_EQ(ByteCountLocked32, codeBytesSize()); | 453 ASSERT_EQ(ByteCountLocked32, codeBytesSize()); |
451 verifyBytes<ByteCountLocked32>(codeBytes(), 0xF0, 0x0F, 0xB1, 0x35, 0x00, | 454 verifyBytes<ByteCountLocked32>(codeBytes(), 0xF0, 0x0F, 0xB1, 0x35, 0x00, |
452 0xFF, 0x01, 0x00); | 455 0xFF, 0x01, 0x00); |
453 reset(); | 456 reset(); |
454 } | 457 } |
455 } | 458 } |
456 | 459 |
457 } // end of anonymous namespace | 460 } // end of anonymous namespace |
458 } // end of namespace Test | 461 } // end of namespace Test |
459 } // end of namespace X8632 | 462 } // end of namespace X8632 |
460 } // end of namespace Ice | 463 } // end of namespace Ice |
OLD | NEW |