LEFT | RIGHT |
(no file at all) | |
1 // Copyright 2009 The Go Authors. All rights reserved. | 1 // Copyright 2009 The Go Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style | 2 // Use of this source code is governed by a BSD-style |
3 // license that can be found in the LICENSE file. | 3 // license that can be found in the LICENSE file. |
4 | 4 |
5 #include "zasm_GOOS_GOARCH.h" | 5 #include "zasm_GOOS_GOARCH.h" |
6 | 6 |
7 TEXT _rt0_amd64(SB),7,$-8 | 7 TEXT _rt0_amd64(SB),7,$-8 |
8 // copy arguments forward on an even stack | 8 // copy arguments forward on an even stack |
9 MOVQ 0(DI), AX // argc | 9 MOVQ 0(DI), AX // argc |
10 LEAQ 8(DI), BX // argv | 10 LEAQ 8(DI), BX // argv |
(...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
337 MOVL 16(SP), AX | 337 MOVL 16(SP), AX |
338 MOVL 20(SP), CX | 338 MOVL 20(SP), CX |
339 LOCK | 339 LOCK |
340 CMPXCHGL CX, 0(BX) | 340 CMPXCHGL CX, 0(BX) |
341 JZ 3(PC) | 341 JZ 3(PC) |
342 MOVL $0, AX | 342 MOVL $0, AX |
343 RET | 343 RET |
344 MOVL $1, AX | 344 MOVL $1, AX |
345 RET | 345 RET |
346 | 346 |
| 347 // bool runtime·cas64(uint64 *val, uint64 *old, uint64 new) |
| 348 // Atomically: |
| 349 // if(*val == *old){ |
| 350 // *val = new; |
| 351 // return 1; |
| 352 // } else { |
| 353 // *old = *val |
| 354 // return 0; |
| 355 // } |
| 356 TEXT runtime·cas64(SB), 7, $0 |
| 357 MOVQ 8(SP), BX |
| 358 MOVQ 16(SP), BP |
| 359 MOVQ 0(BP), AX |
| 360 MOVQ 24(SP), CX |
| 361 LOCK |
| 362 CMPXCHGQ CX, 0(BX) |
| 363 JNZ cas64_fail |
| 364 MOVL $1, AX |
| 365 RET |
| 366 cas64_fail: |
| 367 MOVQ AX, 0(BP) |
| 368 XORL AX, AX |
| 369 RET |
| 370 |
347 // bool casp(void **val, void *old, void *new) | 371 // bool casp(void **val, void *old, void *new) |
348 // Atomically: | 372 // Atomically: |
349 // if(*val == old){ | 373 // if(*val == old){ |
350 // *val = new; | 374 // *val = new; |
351 // return 1; | 375 // return 1; |
352 // } else | 376 // } else |
353 // return 0; | 377 // return 0; |
354 TEXT runtime·casp(SB), 7, $0 | 378 TEXT runtime·casp(SB), 7, $0 |
355 MOVQ 8(SP), BX | 379 MOVQ 8(SP), BX |
356 MOVQ 16(SP), AX | 380 MOVQ 16(SP), AX |
(...skipping 12 matching lines...) Expand all Loading... |
369 // return *val; | 393 // return *val; |
370 TEXT runtime·xadd(SB), 7, $0 | 394 TEXT runtime·xadd(SB), 7, $0 |
371 MOVQ 8(SP), BX | 395 MOVQ 8(SP), BX |
372 MOVL 16(SP), AX | 396 MOVL 16(SP), AX |
373 MOVL AX, CX | 397 MOVL AX, CX |
374 LOCK | 398 LOCK |
375 XADDL AX, 0(BX) | 399 XADDL AX, 0(BX) |
376 ADDL CX, AX | 400 ADDL CX, AX |
377 RET | 401 RET |
378 | 402 |
| 403 TEXT runtime·xadd64(SB), 7, $0 |
| 404 MOVQ 8(SP), BX |
| 405 MOVQ 16(SP), AX |
| 406 MOVQ AX, CX |
| 407 LOCK |
| 408 XADDQ AX, 0(BX) |
| 409 ADDQ CX, AX |
| 410 RET |
| 411 |
379 TEXT runtime·xchg(SB), 7, $0 | 412 TEXT runtime·xchg(SB), 7, $0 |
380 MOVQ 8(SP), BX | 413 MOVQ 8(SP), BX |
381 MOVL 16(SP), AX | 414 MOVL 16(SP), AX |
382 XCHGL AX, 0(BX) | 415 XCHGL AX, 0(BX) |
383 RET | 416 RET |
384 | 417 |
385 TEXT runtime·procyield(SB),7,$0 | 418 TEXT runtime·procyield(SB),7,$0 |
386 MOVL 8(SP), AX | 419 MOVL 8(SP), AX |
387 again: | 420 again: |
388 PAUSE | 421 PAUSE |
389 SUBL $1, AX | 422 SUBL $1, AX |
390 JNZ again | 423 JNZ again |
391 RET | 424 RET |
392 | 425 |
393 TEXT runtime·atomicstorep(SB), 7, $0 | 426 TEXT runtime·atomicstorep(SB), 7, $0 |
394 MOVQ 8(SP), BX | 427 MOVQ 8(SP), BX |
395 MOVQ 16(SP), AX | 428 MOVQ 16(SP), AX |
396 XCHGQ AX, 0(BX) | 429 XCHGQ AX, 0(BX) |
397 RET | 430 RET |
398 | 431 |
399 TEXT runtime·atomicstore(SB), 7, $0 | 432 TEXT runtime·atomicstore(SB), 7, $0 |
400 MOVQ 8(SP), BX | 433 MOVQ 8(SP), BX |
401 MOVL 16(SP), AX | 434 MOVL 16(SP), AX |
402 XCHGL AX, 0(BX) | 435 XCHGL AX, 0(BX) |
| 436 RET |
| 437 |
| 438 TEXT runtime·atomicstore64(SB), 7, $0 |
| 439 MOVQ 8(SP), BX |
| 440 MOVQ 16(SP), AX |
| 441 XCHGQ AX, 0(BX) |
| 442 RET |
| 443 |
| 444 TEXT runtime·prefetch(SB), 7, $0 |
| 445 MOVQ 8(SP), AX |
| 446 // PREFETCHNTA (AX) |
| 447 BYTE $0x0f; BYTE $0x18; BYTE $0x00 |
403 RET | 448 RET |
404 | 449 |
405 // void jmpdefer(fn, sp); | 450 // void jmpdefer(fn, sp); |
406 // called from deferreturn. | 451 // called from deferreturn. |
407 // 1. pop the caller | 452 // 1. pop the caller |
408 // 2. sub 5 bytes from the callers return | 453 // 2. sub 5 bytes from the callers return |
409 // 3. jmp to the argument | 454 // 3. jmp to the argument |
410 TEXT runtime·jmpdefer(SB), 7, $0 | 455 TEXT runtime·jmpdefer(SB), 7, $0 |
411 MOVQ 8(SP), AX // fn | 456 MOVQ 8(SP), AX // fn |
412 MOVQ 16(SP), BX // caller sp | 457 MOVQ 16(SP), BX // caller sp |
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
590 TEXT runtime·stackguard(SB),7,$0 | 635 TEXT runtime·stackguard(SB),7,$0 |
591 MOVQ SP, DX | 636 MOVQ SP, DX |
592 MOVQ DX, sp+0(FP) | 637 MOVQ DX, sp+0(FP) |
593 get_tls(CX) | 638 get_tls(CX) |
594 MOVQ g(CX), BX | 639 MOVQ g(CX), BX |
595 MOVQ g_stackguard(BX), DX | 640 MOVQ g_stackguard(BX), DX |
596 MOVQ DX, guard+8(FP) | 641 MOVQ DX, guard+8(FP) |
597 RET | 642 RET |
598 | 643 |
599 GLOBL runtime·tls0(SB), $64 | 644 GLOBL runtime·tls0(SB), $64 |
LEFT | RIGHT |