github.com/chenzhuoyu/iasm@v0.9.1/repl/asm_amd64.s (about)

     1  #include "go_asm.h"
     2  #include "funcdata.h"
     3  #include "textflag.h"
     4  
     5  TEXT ·dumpregs(SB), (NOSPLIT | NOFRAME), $0
     6      NO_LOCAL_POINTERS
     7      PUSHFQ
     8      PUSHFQ
     9      PUSHQ AX
    10      MOVQ  0x20(SP), AX
    11      POPQ  (AX)
    12      MOVQ  BX, 0x08(AX)
    13      MOVQ  CX, 0x10(AX)
    14      MOVQ  DX, 0x18(AX)
    15      MOVQ  DI, 0x20(AX)
    16      MOVQ  SI, 0x28(AX)
    17      MOVQ  BP, 0x30(AX)
    18      MOVQ  SP, 0x38(AX)
    19      ADDQ  $16, 0x38(AX)
    20      MOVQ  R8, 0x40(AX)
    21      MOVQ  R9, 0x48(AX)
    22      MOVQ  R10, 0x50(AX)
    23      MOVQ  R11, 0x58(AX)
    24      MOVQ  R12, 0x60(AX)
    25      MOVQ  R13, 0x68(AX)
    26      MOVQ  R14, 0x70(AX)
    27      MOVQ  R15, 0x78(AX)
    28      MOVQ  16(SP), CX
    29      MOVQ  CX, 0x80(AX)
    30      POPQ  0x88(AX)
    31      MOVW  CS, 0x90(AX)
    32      MOVW  FS, 0x98(AX)
    33      MOVW  GS, 0xa0(AX)
    34  
    35      // SSE xmm0 ~ xmm15 registers
    36      MOVOU X0, 0xc0(AX)
    37      MOVOU X1, 0xd0(AX)
    38      MOVOU X2, 0xe0(AX)
    39      MOVOU X3, 0xf0(AX)
    40      MOVOU X4, 0x100(AX)
    41      MOVOU X5, 0x110(AX)
    42      MOVOU X6, 0x120(AX)
    43      MOVOU X7, 0x130(AX)
    44      MOVOU X8, 0x140(AX)
    45      MOVOU X9, 0x150(AX)
    46      MOVOU X10, 0x160(AX)
    47      MOVOU X11, 0x170(AX)
    48      MOVOU X12, 0x180(AX)
    49      MOVOU X13, 0x190(AX)
    50      MOVOU X14, 0x1a0(AX)
    51      MOVOU X15, 0x1b0(AX)
    52  
    53      // check for AVX
    54      CMPB ·hasAVX(SB), $0
    55      JE   _no_avx
    56  
    57      // AVX ymm0 ~ ymm15 registers
    58      VMOVDQU Y0, 0x2c0(AX)
    59      VMOVDQU Y1, 0x2e0(AX)
    60      VMOVDQU Y2, 0x300(AX)
    61      VMOVDQU Y3, 0x320(AX)
    62      VMOVDQU Y4, 0x340(AX)
    63      VMOVDQU Y5, 0x360(AX)
    64      VMOVDQU Y6, 0x380(AX)
    65      VMOVDQU Y7, 0x3a0(AX)
    66      VMOVDQU Y8, 0x3c0(AX)
    67      VMOVDQU Y9, 0x3e0(AX)
    68      VMOVDQU Y10, 0x400(AX)
    69      VMOVDQU Y11, 0x420(AX)
    70      VMOVDQU Y12, 0x440(AX)
    71      VMOVDQU Y13, 0x460(AX)
    72      VMOVDQU Y14, 0x480(AX)
    73      VMOVDQU Y15, 0x4a0(AX)
    74  
    75      // check for AVX512VL
    76      CMPB ·hasAVX512VL(SB), $0
    77      JE   _no_avx512vl
    78  
    79      // AVX512VL xmm16 ~ xmm31 registers
    80      LONG $0x087fe162; WORD $0x407f; BYTE $0x1c  // vmovdqu8 %xmm16, 0x1c0(%rax)
    81      LONG $0x087fe162; WORD $0x487f; BYTE $0x1d  // vmovdqu8 %xmm17, 0x1d0(%rax)
    82      LONG $0x087fe162; WORD $0x507f; BYTE $0x1e  // vmovdqu8 %xmm18, 0x1e0(%rax)
    83      LONG $0x087fe162; WORD $0x587f; BYTE $0x1f  // vmovdqu8 %xmm19, 0x1f0(%rax)
    84      LONG $0x087fe162; WORD $0x607f; BYTE $0x20  // vmovdqu8 %xmm20, 0x200(%rax)
    85      LONG $0x087fe162; WORD $0x687f; BYTE $0x21  // vmovdqu8 %xmm21, 0x210(%rax)
    86      LONG $0x087fe162; WORD $0x707f; BYTE $0x22  // vmovdqu8 %xmm22, 0x220(%rax)
    87      LONG $0x087fe162; WORD $0x787f; BYTE $0x23  // vmovdqu8 %xmm23, 0x230(%rax)
    88      LONG $0x087f6162; WORD $0x407f; BYTE $0x24  // vmovdqu8 %xmm24, 0x240(%rax)
    89      LONG $0x087f6162; WORD $0x487f; BYTE $0x25  // vmovdqu8 %xmm25, 0x250(%rax)
    90      LONG $0x087f6162; WORD $0x507f; BYTE $0x26  // vmovdqu8 %xmm26, 0x260(%rax)
    91      LONG $0x087f6162; WORD $0x587f; BYTE $0x27  // vmovdqu8 %xmm27, 0x270(%rax)
    92      LONG $0x087f6162; WORD $0x607f; BYTE $0x28  // vmovdqu8 %xmm28, 0x280(%rax)
    93      LONG $0x087f6162; WORD $0x687f; BYTE $0x29  // vmovdqu8 %xmm29, 0x290(%rax)
    94      LONG $0x087f6162; WORD $0x707f; BYTE $0x2a  // vmovdqu8 %xmm30, 0x2a0(%rax)
    95      LONG $0x087f6162; WORD $0x787f; BYTE $0x2b  // vmovdqu8 %xmm31, 0x2b0(%rax)
    96  
    97      // AVX512VL ymm16 ~ ymm31 registers
    98      LONG $0x28ffe162; WORD $0x407f; BYTE $0x26  // vmovdqu16 %ymm16, 0x4c0(%rax)
    99      LONG $0x28ffe162; WORD $0x487f; BYTE $0x27  // vmovdqu16 %ymm17, 0x4e0(%rax)
   100      LONG $0x28ffe162; WORD $0x507f; BYTE $0x28  // vmovdqu16 %ymm18, 0x500(%rax)
   101      LONG $0x28ffe162; WORD $0x587f; BYTE $0x29  // vmovdqu16 %ymm19, 0x520(%rax)
   102      LONG $0x28ffe162; WORD $0x607f; BYTE $0x2a  // vmovdqu16 %ymm20, 0x540(%rax)
   103      LONG $0x28ffe162; WORD $0x687f; BYTE $0x2b  // vmovdqu16 %ymm21, 0x560(%rax)
   104      LONG $0x28ffe162; WORD $0x707f; BYTE $0x2c  // vmovdqu16 %ymm22, 0x580(%rax)
   105      LONG $0x28ffe162; WORD $0x787f; BYTE $0x2d  // vmovdqu16 %ymm23, 0x5a0(%rax)
   106      LONG $0x28ff6162; WORD $0x407f; BYTE $0x2e  // vmovdqu16 %ymm24, 0x5c0(%rax)
   107      LONG $0x28ff6162; WORD $0x487f; BYTE $0x2f  // vmovdqu16 %ymm25, 0x5e0(%rax)
   108      LONG $0x28ff6162; WORD $0x507f; BYTE $0x30  // vmovdqu16 %ymm26, 0x600(%rax)
   109      LONG $0x28ff6162; WORD $0x587f; BYTE $0x31  // vmovdqu16 %ymm27, 0x620(%rax)
   110      LONG $0x28ff6162; WORD $0x607f; BYTE $0x32  // vmovdqu16 %ymm28, 0x640(%rax)
   111      LONG $0x28ff6162; WORD $0x687f; BYTE $0x33  // vmovdqu16 %ymm29, 0x660(%rax)
   112      LONG $0x28ff6162; WORD $0x707f; BYTE $0x34  // vmovdqu16 %ymm30, 0x680(%rax)
   113      LONG $0x28ff6162; WORD $0x787f; BYTE $0x35  // vmovdqu16 %ymm31, 0x6a0(%rax)
   114  
   115  _no_avx512vl:
   116      CMPB ·hasAVX512F(SB), $0
   117      JE   _no_avx512f
   118  
   119      // AVX512F zmm0 ~ zmm31 registers
   120      LONG $0x487ef162; WORD $0x407f; BYTE $0x1b  // vmovdqu32 %zmm0, 0x6c0(%rax)
   121      LONG $0x487ef162; WORD $0x487f; BYTE $0x1c  // vmovdqu32 %zmm1, 0x700(%rax)
   122      LONG $0x487ef162; WORD $0x507f; BYTE $0x1d  // vmovdqu32 %zmm2, 0x740(%rax)
   123      LONG $0x487ef162; WORD $0x587f; BYTE $0x1e  // vmovdqu32 %zmm3, 0x780(%rax)
   124      LONG $0x487ef162; WORD $0x607f; BYTE $0x1f  // vmovdqu32 %zmm4, 0x7c0(%rax)
   125      LONG $0x487ef162; WORD $0x687f; BYTE $0x20  // vmovdqu32 %zmm5, 0x800(%rax)
   126      LONG $0x487ef162; WORD $0x707f; BYTE $0x21  // vmovdqu32 %zmm6, 0x840(%rax)
   127      LONG $0x487ef162; WORD $0x787f; BYTE $0x22  // vmovdqu32 %zmm7, 0x880(%rax)
   128      LONG $0x487e7162; WORD $0x407f; BYTE $0x23  // vmovdqu32 %zmm8, 0x8c0(%rax)
   129      LONG $0x487e7162; WORD $0x487f; BYTE $0x24  // vmovdqu32 %zmm9, 0x900(%rax)
   130      LONG $0x487e7162; WORD $0x507f; BYTE $0x25  // vmovdqu32 %zmm10, 0x940(%rax)
   131      LONG $0x487e7162; WORD $0x587f; BYTE $0x26  // vmovdqu32 %zmm11, 0x980(%rax)
   132      LONG $0x487e7162; WORD $0x607f; BYTE $0x27  // vmovdqu32 %zmm12, 0x9c0(%rax)
   133      LONG $0x487e7162; WORD $0x687f; BYTE $0x28  // vmovdqu32 %zmm13, 0xa00(%rax)
   134      LONG $0x487e7162; WORD $0x707f; BYTE $0x29  // vmovdqu32 %zmm14, 0xa40(%rax)
   135      LONG $0x487e7162; WORD $0x787f; BYTE $0x2a  // vmovdqu32 %zmm15, 0xa80(%rax)
   136      LONG $0x487ee162; WORD $0x407f; BYTE $0x2b  // vmovdqu32 %zmm16, 0xac0(%rax)
   137      LONG $0x487ee162; WORD $0x487f; BYTE $0x2c  // vmovdqu32 %zmm17, 0xb00(%rax)
   138      LONG $0x487ee162; WORD $0x507f; BYTE $0x2d  // vmovdqu32 %zmm18, 0xb40(%rax)
   139      LONG $0x487ee162; WORD $0x587f; BYTE $0x2e  // vmovdqu32 %zmm19, 0xb80(%rax)
   140      LONG $0x487ee162; WORD $0x607f; BYTE $0x2f  // vmovdqu32 %zmm20, 0xbc0(%rax)
   141      LONG $0x487ee162; WORD $0x687f; BYTE $0x30  // vmovdqu32 %zmm21, 0xc00(%rax)
   142      LONG $0x487ee162; WORD $0x707f; BYTE $0x31  // vmovdqu32 %zmm22, 0xc40(%rax)
   143      LONG $0x487ee162; WORD $0x787f; BYTE $0x32  // vmovdqu32 %zmm23, 0xc80(%rax)
   144      LONG $0x487e6162; WORD $0x407f; BYTE $0x33  // vmovdqu32 %zmm24, 0xcc0(%rax)
   145      LONG $0x487e6162; WORD $0x487f; BYTE $0x34  // vmovdqu32 %zmm25, 0xd00(%rax)
   146      LONG $0x487e6162; WORD $0x507f; BYTE $0x35  // vmovdqu32 %zmm26, 0xd40(%rax)
   147      LONG $0x487e6162; WORD $0x587f; BYTE $0x36  // vmovdqu32 %zmm27, 0xd80(%rax)
   148      LONG $0x487e6162; WORD $0x607f; BYTE $0x37  // vmovdqu32 %zmm28, 0xdc0(%rax)
   149      LONG $0x487e6162; WORD $0x687f; BYTE $0x38  // vmovdqu32 %zmm29, 0xe00(%rax)
   150      LONG $0x487e6162; WORD $0x707f; BYTE $0x39  // vmovdqu32 %zmm30, 0xe40(%rax)
   151      LONG $0x487e6162; WORD $0x787f; BYTE $0x3a  // vmovdqu32 %zmm31, 0xe80(%rax)
   152  
   153      // check for AVX512BW
   154      CMPB ·hasAVX512BW(SB), $0
   155      JE   _no_avx512bw
   156  
   157      // AVX512BW 64-bit K registers
   158      QUAD $0x000ec08091f8e1c4; BYTE $0x00    // kmovq %k0, 0xec0(%rax)
   159      QUAD $0x000ec88891f8e1c4; BYTE $0x00    // kmovq %k1, 0xec8(%rax)
   160      QUAD $0x000ed09091f8e1c4; BYTE $0x00    // kmovq %k2, 0xed0(%rax)
   161      QUAD $0x000ed89891f8e1c4; BYTE $0x00    // kmovq %k3, 0xed8(%rax)
   162      QUAD $0x000ee0a091f8e1c4; BYTE $0x00    // kmovq %k4, 0xee0(%rax)
   163      QUAD $0x000ee8a891f8e1c4; BYTE $0x00    // kmovq %k5, 0xee8(%rax)
   164      QUAD $0x000ef0b091f8e1c4; BYTE $0x00    // kmovq %k6, 0xef0(%rax)
   165      QUAD $0x000ef8b891f8e1c4; BYTE $0x00    // kmovq %k7, 0xef8(%rax)
   166      JMP  _avx512bw_done
   167  
   168  _no_avx512bw:
   169      QUAD $0x00000ec08091f8c5    // kmovw %k0, 0xec0(%rax)
   170      QUAD $0x00000ec88891f8c5    // kmovw %k1, 0xec8(%rax)
   171      QUAD $0x00000ed09091f8c5    // kmovw %k2, 0xed0(%rax)
   172      QUAD $0x00000ed89891f8c5    // kmovw %k3, 0xed8(%rax)
   173      QUAD $0x00000ee0a091f8c5    // kmovw %k4, 0xee0(%rax)
   174      QUAD $0x00000ee8a891f8c5    // kmovw %k5, 0xee8(%rax)
   175      QUAD $0x00000ef0b091f8c5    // kmovw %k6, 0xef0(%rax)
   176      QUAD $0x00000ef8b891f8c5    // kmovw %k7, 0xef8(%rax)
   177  
   178  _avx512bw_done:
   179  _no_avx512f:
   180  _no_avx:
   181      MOVQ 0x10(AX), CX
   182      MOVQ (AX), AX
   183      POPFQ
   184      RET
   185  
   186  TEXT ·execaddr(SB), (NOSPLIT | NOFRAME), $0
   187      NO_LOCAL_POINTERS
   188      LONG  $0x102474ff       // pushq 0x10(%rsp)
   189      CALL  ·dumpregs(SB)
   190      LEAQ  8(SP), SP
   191      CALL  exectrampoline(SB)
   192      LONG  $0x182474ff       // pushq 0x18(%rsp)
   193      CALL  ·dumpregs(SB)
   194      LEAQ  8(SP), SP
   195      RET
   196  
   197  TEXT exectrampoline(SB), (NOSPLIT | NOFRAME), $0
   198      NO_LOCAL_POINTERS
   199      JMP 0x10(SP)