📄 amd64.mcs
字号:
; MCS file for Gnu GCC AMD64 compiler;; Sorry about all the %'s! Each % must be input here as %%; Hybrid x2 step;; "Triple" register is now rcx|r11|r10|r9|r8; registers bh and bl are employed as "carry catchers";;MACRO H2_MUL_START; ASM (; "movq %%0,%%%%r15\n"; "movq %%1,%%%%rsi\n"; "movq %%2,%%%%rdi\n"; "xorq %%%%rcx,%%%%rcx\n"; "xorq %%%%r8,%%%%r8\n"; "xorq %%%%r9,%%%%r9\n"; "xorq %%%%r10,%%%%r10\n"; "xorq %%%%r11,%%%%r11\n"; "xorq %%%%rbx,%%%%rbx\n" ;ENDM;MACRO H2_STEP; "movq 8*%d(%%%%r15),%%%%r12\n"; "movq 8*(%d+1)(%%%%r15),%%%%r13\n"; "movq 8*%d(%%%%rsi),%%%%r14\n"; "movq %%%%r14,%%%%rax\n"; "mulq %%%%r12\n"; "addq %%%%rax,%%%%r8\n"; "adcq %%%%rdx,%%%%r9\n"; "adc %%%%ch,%%%%bl\n"; "movq %%%%r14,%%%%rax\n"; "mulq %%%%r13\n"; "addq %%%%rax,%%%%r9\n"; "adcq %%%%rdx,%%%%r10\n"; "adc %%%%ch,%%%%bh\n"; "movq 8*(%d+1)(%%%%rsi),%%%%r14\n"; "movq %%%%r14,%%%%rax\n"; "mulq %%%%r12\n"; "addq %%%%rax,%%%%r9\n"; "adcq %%%%rdx,%%%%r10\n"; "adc %%%%ch,%%%%bh\n"; "movq %%%%r14,%%%%rax\n"; "mulq %%%%r13\n"; "addq %%%%rax,%%%%r10\n"; "adcq %%%%rdx,%%%%r11\n"; "adc %%%%ch,%%%%cl\n";ENDM;MACRO H2_MFIN; "movq %%%%r8,8*%d(%%%%rdi)\n"; "movq %%%%r9,8*%d(%%%%rdi)\n"; "movzbq %%%%bl,%%%%rax\n"; "addq %%%%rax,%%%%r10\n"; "mov %%%%bh,%%%%al\n"; "movzbq %%%%al,%%%%rax\n"; "adcq %%%%rax,%%%%r11\n"; "adc %%%%ch,%%%%cl\n"; "movq %%%%r10,%%%%r8\n"; "movq %%%%r11,%%%%r9\n"; "xorq %%%%rbx,%%%%rbx\n"; "mov %%%%cl,%%%%bl\n"; "xorq %%%%rcx,%%%%rcx\n"; "xorq %%%%r10,%%%%r10\n"; "xorq %%%%r11,%%%%r11\n";ENDM;MACRO H2_MUL_END; "movq %%%%r8,8*%d(%%%%rdi)\n"; "movq %%%%r9,8*%d(%%%%rdi)\n"; :; :"m"(a),"m"(b),"m"(c); :"rax","rdi","rsi","rbx","rcx","rdx","r8","r9","r10","r11","r12","r13","r14","r15","memory"; );;ENDM;MACRO H2_SQR_START; ASM (; "movq %%0,%%%%rsi\n"; "movq %%1,%%%%rdi\n"; "xorq %%%%rcx,%%%%rcx\n"; "xorq %%%%r8,%%%%r8\n"; "xorq %%%%r9,%%%%r9\n"; "xorq %%%%r10,%%%%r10\n"; "xorq %%%%r11,%%%%r11\n"; "xorq %%%%rbx,%%%%rbx\n" ;ENDM;MACRO H2_DSTEP; "movq 8*%d(%%%%rsi),%%%%r12\n"; "movq 8*(%d+1)(%%%%rsi),%%%%r13\n"; "movq 8*%d(%%%%rsi),%%%%r14\n"; "movq %%%%r14,%%%%rax\n"; "mulq %%%%r12\n"; "addq %%%%rax,%%%%r8\n"; "adcq %%%%rdx,%%%%r9\n"; "adc %%%%ch,%%%%bl\n"; "addq %%%%rax,%%%%r8\n"; "adcq %%%%rdx,%%%%r9\n"; "adc %%%%ch,%%%%bl\n"; "movq %%%%r14,%%%%rax\n"; "mulq %%%%r13\n"; "addq %%%%rax,%%%%r9\n"; "adcq %%%%rdx,%%%%r10\n"; "adc %%%%ch,%%%%bh\n"; "addq %%%%rax,%%%%r9\n"; "adcq %%%%rdx,%%%%r10\n"; "adc %%%%ch,%%%%bh\n"; "movq 8*(%d+1)(%%%%rsi),%%%%r14\n"; "movq %%%%r14,%%%%rax\n"; "mulq %%%%r12\n"; "addq %%%%rax,%%%%r9\n"; "adcq %%%%rdx,%%%%r10\n"; "adc %%%%ch,%%%%bh\n"; "addq %%%%rax,%%%%r9\n"; "adcq %%%%rdx,%%%%r10\n"; "adc %%%%ch,%%%%bh\n"; "movq %%%%r14,%%%%rax\n"; "mulq %%%%r13\n"; "addq %%%%rax,%%%%r10\n"; "adcq %%%%rdx,%%%%r11\n"; "adc %%%%ch,%%%%cl\n"; "addq %%%%rax,%%%%r10\n"; "adcq %%%%rdx,%%%%r11\n"; "adc %%%%ch,%%%%cl\n";ENDM;MACRO H2_SELF; "movq 8*%d(%%%%rsi),%%%%r12\n"; "movq 8*(%d+1)(%%%%rsi),%%%%r13\n"; "movq %%%%r12,%%%%rax\n"; "mulq %%%%rax\n"; "addq %%%%rax,%%%%r8\n"; "adcq %%%%rdx,%%%%r9\n"; "adc %%%%ch,%%%%bl\n"; "movq %%%%r13,%%%%rax\n"; "mulq %%%%r12\n"; "addq %%%%rax,%%%%r9\n"; "adcq %%%%rdx,%%%%r10\n"; "adc %%%%ch,%%%%bh\n"; "addq %%%%rax,%%%%r9\n"; "adcq %%%%rdx,%%%%r10\n"; "adc %%%%ch,%%%%bh\n"; "movq %%%%r13,%%%%rax\n"; "mulq %%%%rax\n"; "addq %%%%rax,%%%%r10\n"; "adcq %%%%rdx,%%%%r11\n"; "adc %%%%ch,%%%%cl\n";ENDM;MACRO H2_SFIN; "movq %%%%r8,8*%d(%%%%rdi)\n"; "movq %%%%r9,8*%d(%%%%rdi)\n"; "movzbq %%%%bl,%%%%rax\n"; "addq %%%%rax,%%%%r10\n"; "mov %%%%bh,%%%%al\n"; "movzbq %%%%al,%%%%rax\n"; "adcq %%%%rax,%%%%r11\n"; "adc %%%%ch,%%%%cl\n"; "movq %%%%r10,%%%%r8\n"; "movq %%%%r11,%%%%r9\n"; "xorq %%%%rbx,%%%%rbx\n"; "mov %%%%cl,%%%%bl\n"; "xorq %%%%rcx,%%%%rcx\n"; "xorq %%%%r10,%%%%r10\n"; "xorq %%%%r11,%%%%r11\n";ENDM;MACRO H2_SQR_END; "movq %%%%r8,8*%d(%%%%rdi)\n"; "movq %%%%r9,8*%d(%%%%rdi)\n"; :; :"m"(a),"m"(c); :"rax","rdi","rsi","rbx","rcx","rdx","r8","r9","r10","r11","r12","r13","r14","memory"; );;ENDMMACRO PMUL_START ASM ( "movq %%0,%%%%rbx\n" "movq %%1,%%%%rsi\n" "movq %%2,%%%%rdi\n" "xorq %%%%rcx,%%%%rcx\n" "xorq %%%%r9,%%%%r9\n" "movq %%3,%%%%r8\n"ENDMMACRO PMUL "movq %%%%r8,%%%%rax\n" "mulq 8*%d(%%%%rbx)\n" "addq %%%%rcx,%%%%rax\n" "adcq %%%%r9,%%%%rdx\n" "movq %%%%rdx,%%%%rcx\n" "movq %%%%r9,8*%d(%%%%rsi)\n" "movq %%%%rax,8*%d(%%%%rdi)\n"ENDMMACRO PMUL_END "movq %%%%r8,%%%%rax\n" "mulq %%%%rcx\n" "movq %%%%rax,(%%%%rsi)\n" "movq %%%%rdx,8(%%%%rsi)\n" : :"m"(a),"m"(b),"m"(c),"m"(sn) :"rax","rdi","rsi","rbx","rcx","rdx","r8","r9","memory" );ENDM; Triple register is cl|r9|r8; MUL_START. Initialise registers. Make rbx and rsi point to multipliers a ; and b. rdi points at result c. ; Initialise Triple register to 0; See makemcs.txt for more information about this file; MACRO MUL_START ASM ( "movq %%0,%%%%rbx\n" "movq %%1,%%%%rsi\n" "movq %%2,%%%%rdi\n" "xorq %%%%rcx,%%%%rcx\n" "xorq %%%%r9,%%%%r9\n" "xorq %%%%r8,%%%%r8\n"ENDM;; STEP macro. Calculates a double-register partial product; and adds it to the triple register total; Parameters 1 & 2: Indices i and j for partial product multipliers a[i] ; and b[j]MACRO STEP "movq 8*%d(%%%%rbx),%%%%rax\n" "mulq 8*%d(%%%%rsi)\n" "addq %%%%rax,%%%%r8\n" "adcq %%%%rdx,%%%%r9\n" "adc %%%%ch,%%%%cl\n"ENDM;; LAST;MACRO LAST "movq 8*%d(%%%%rbx),%%%%rax\n" "mulq 8*%d(%%%%rsi)\n" "addq %%%%rax,%%%%r8\n"ENDM;; MFIN macro. Finish column calculation. Store Sum for this column; and get Carry for next; Parameter 1: Index k for Column Sum c[k]MACRO MFIN "movq %%%%r8,8*%d(%%%%rdi)\n" "movq %%%%r9,%%%%r8\n" "movq %%%%rcx,%%%%r9\n" "xor %%%%cl,%%%%cl\n"ENDM;; MUL_END; Parameter 1: Index for final carry c[.]MACRO MUL_END "movq %%%%r8,8*%d(%%%%rdi)\n" : :"m"(a),"m"(b),"m"(c) :"rax","rdi","rsi","rbx","rcx","rdx","r8","r9","memory" );ENDM;; SQR_START; MACRO SQR_START ASM ( "movq %%0,%%%%rbx\n" "movq %%1,%%%%rsi\n" "xorq %%%%rcx,%%%%rcx\n" "xorq %%%%r9,%%%%r9\n" "xorq %%%%r8,%%%%r8\n"ENDM;; DSTEP macro. Calculates a double-register partial product; and add it twice to a triple register total; Parameters 1 & 2 : Indices of partial product multipliersMACRO DSTEP "movq 8*%d(%%%%rbx),%%%%rax\n" "mulq 8*%d(%%%%rbx)\n" "addq %%%%rax,%%%%r8\n" "adcq %%%%rdx,%%%%r9\n" "adc %%%%ch,%%%%cl\n" "addq %%%%rax,%%%%r8\n" "adcq %%%%rdx,%%%%r9\n" "adc %%%%ch,%%%%cl\n"ENDM;; SELF macro. Calculate the double-register square and; add it to a triple register total; Parameter 1 : Index of diagonal elementMACRO SELF "movq 8*%d(%%%%rbx),%%%%rax\n" "mulq %%%%rax\n" "addq %%%%rax,%%%%r8\n" "adcq %%%%rdx,%%%%r9\n" "adc %%%%ch,%%%%cl\n"ENDM;; SFIN macro. Finish column calculation for squaring. Store Sum; and get Carry for next column.; Parameter 1: Index of Column SumMACRO SFIN "movq %%%%r8,8*%d(%%%%rsi)\n" "movq %%%%r9,%%%%r8\n" "movq %%%%rcx,%%%%r9\n" "xor %%%%cl,%%%%cl\n"ENDM;; SQR_END; Parameter 1: Index for final carryMACRO SQR_END "movq %%%%r8,8*%d(%%%%rsi)\n" : :"m"(a),"m"(c) :"rax","rdi","rsi","rbx","rcx","rdx","r8","r9","memory" );ENDM;; REDC_START;MACRO REDC_START ASM ( "movq %%0,%%%%rbx\n" "movq %%1,%%%%rsi\n" "movq %%2,%%%%rdi\n" "xorq %%%%r9,%%%%r9\n" "xorq %%%%rcx,%%%%rcx\n" "movq (%%%%rbx),%%%%r8\n" "movq (%%%%rsi),%%%%r10\n"ENDM;; RFINU macro;MACRO RFINU "movq %%%%r8,%%%%rax\n" "mulq %%%%rdi\n" "movq %%%%rax,8*%d(%%%%rbx)\n" "mulq %%%%r10\n" "addq %%%%rax,%%%%r8\n" "adcq %%%%rdx,%%%%r9\n" "adc %%%%ch,%%%%cl\n" "movq %%%%r9,%%%%r8\n" "movq %%%%rcx,%%%%r9\n" "xorq %%%%rcx,%%%%rcx\n" "addq 8*(%d+1)(%%%%rbx),%%%%r8\n" "adcq %%%%rcx,%%%%r9\n"ENDM;; RFIND macro;MACRO RFIND "movq %%%%r8,8*%d(%%%%rbx)\n" "movq %%%%r9,%%%%r8\n" "movq %%%%rcx,%%%%r9\n" "xorq %%%%rcx,%%%%rcx\n" "addq 8*(%d+1)(%%%%rbx),%%%%r8\n" "adcq %%%%rcx,%%%%r9\n"ENDM;; REDC_END;MACRO REDC_END "movq %%%%r8,8*%d(%%%%rbx)\n" "movq %%%%r9,8*(%d+1)(%%%%rbx)\n" : :"m"(a),"m"(b),"m"(ndash) :"rax","rdi","rsi","rbx","rcx","rdx","r8","r9","r10","memory" );ENDM;; ADD_START macro - initialise for add. Do first one;MACRO ADD_START ASM ( "movq %%0,%%%%rsi\n" "movq %%1,%%%%rbx\n" "movq %%3,%%%%rdi\n" "movq (%%%%rsi),%%%%rax\n" "addq (%%%%rbx),%%%%rax\n" "movq %%%%rax,(%%%%rdi)\n"ENDM;; ADD macro. Add two numbers from memory and store result in memory.; Don't forget carry bit;MACRO ADD "movq 8*%d(%%%%rsi),%%%%rax\n" "adcq 8*%d(%%%%rbx),%%%%rax\n" "movq %%%%rax,8*%d(%%%%rdi)\n"ENDM;; ADD_END macro. Catch Carry;MACRO ADD_END "movq $0,%%%%rax\n" "adcq %%%%rax,%%%%rax\n" "movq %%%%rax,%%2\n" : :"m"(a),"m"(b),"m"(carry),"m"(c) :"rax","rdi","rsi","rbx","memory" );ENDM;; INC_START macro;MACRO INC_START ASM ( "movq %%0,%%%%rdi\n" "movq %%1,%%%%rbx\n" "movq (%%%%rbx),%%%%rax\n" "addq %%%%rax,(%%%%rdi)\n"ENDM;; INC macro. Increment number in memory. Don't forget carry;MACRO INC "movq 8*%d(%%%%rbx),%%%%rax\n" "adcq %%%%rax,8*%d(%%%%rdi)\n"ENDM;; INC_END macro. Catch Carry;MACRO INC_END "movq $0,%%%%rax\n" "adcq %%%%rax,%%%%rax\n" "movq %%%%rax,%%2\n" : :"m"(a),"m"(b),"m"(carry) :"rax","rdi","rbx","memory" );ENDM;; SUB_START macro. Do first one.;MACRO SUB_START ASM ( "movq %%0,%%%%rsi\n" "movq %%1,%%%%rbx\n" "movq %%3,%%%%rdi\n" "movq (%%%%rsi),%%%%rax\n" "subq (%%%%rbx),%%%%rax\n" "movq %%%%rax,(%%%%rdi)\n"ENDM;; SUB macro. Subtract two numbers in memory and store result in memory.;MACRO SUB "movq 8*%d(%%%%rsi),%%%%rax\n" "sbbq 8*%d(%%%%rbx),%%%%rax\n" "movq %%%%rax,8*%d(%%%%rdi)\n"ENDM;; SUB_END macro. Catch Carry;MACRO SUB_END "movq $0,%%%%rax\n" "adcq %%%%rax,%%%%rax\n" "movq %%%%rax,%%2\n" : :"m"(a),"m"(b),"m"(carry),"m"(c) :"rax","rdi","rsi","rbx","memory" );ENDM;; DEC_START macro. Do first one.;MACRO DEC_START ASM ( "movq %%0,%%%%rdi\n" "movq %%1,%%%%rbx\n" "movq (%%%%rbx),%%%%rax\n" "subq %%%%rax,(%%%%rdi)\n"ENDM;; DEC macro. Decrement from number in memory. Don't forget borrow.;MACRO DEC "movq 8*%d(%%%%rbx),%%%%rax\n" "sbbq %%%%rax,8*%d(%%%%rdi)\n"ENDM;; DEC_END macro;MACRO DEC_END "movq $0,%%%%rax\n" "adcq %%%%rax,%%%%rax\n" "movq %%%%rax,%%2\n" : :"m"(a),"m"(b),"m"(carry) :"rax","rdi","rbx","memory" );ENDM;; KADD_START macro;MACRO KADD_START ASM ( "movq %%0,%%%%rsi\n" "movq %%1,%%%%rbx\n" "movq %%3,%%%%rdi\n" "movl %%4,%%%%ecx\n" "xorq %%%%rax,%%%%rax\n" "k%d:\n"ENDM;; KASL macro;MACRO KASL "decl %%%%ecx\n" "je k%d\n" "leaq 8*%d(%%%%rsi),%%%%rsi\n" "leaq 8*%d(%%%%rbx),%%%%rbx\n" "leaq 8*%d(%%%%rdi),%%%%rdi\n" "jmp k%d\n" "k%d:\n"ENDM;; KADD_END macro;MACRO KADD_END "movq $0,%%%%rax\n" "adcq %%%%rax,%%%%rax\n" "movq %%%%rax,%%2\n" : :"m"(a),"m"(b),"m"(carry),"m"(c),"m"(n) :"rax","rdi","rsi","rbx","ecx","memory" );ENDM;; KINC_START macro. Zero carry flag. ;MACRO KINC_START ASM ( "movq %%0,%%%%rdi\n" "movq %%1,%%%%rbx\n" "movl %%3,%%%%ecx\n" "xorq %%%%rax,%%%%rax\n" "k%d:\n"ENDM;; KIDL macro;MACRO KIDL "decl %%%%ecx\n" "je k%d\n" "leaq 8*%d(%%%%rbx),%%%%rbx\n" "leaq 8*%d(%%%%rdi),%%%%rdi\n" "jmp k%d\n" "k%d:\n"ENDM;; KINC_END macro;MACRO KINC_END "movq $0,%%%%rax\n" "adcq %%%%rax,%%%%rax\n" "movq %%%%rax,%%2\n" : :"m"(a),"m"(b),"m"(carry),"m"(n) :"rax","rdi","rbx","ecx","memory" );ENDM;; KDEC_START macro;MACRO KDEC_START ASM ( "movq %%0,%%%%rdi\n" "movq %%1,%%%%rbx\n" "movl %%3,%%%%ecx\n" "xorq %%%%rax,%%%%rax\n" "k%d:\n"ENDM;; KDEC_END macro;MACRO KDEC_END "movq $0,%%%%rax\n" "adcq %%%%rax,%%%%rax\n" "movq %%%%rax,%%2\n" : :"m"(a),"m"(b),"m"(carry),"m"(n) :"rax","rdi","rbx","ecx","memory" );ENDM
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -