- 论坛徽章:
- 15
|
本帖最后由 yulihua49 于 2011-11-08 17:05 编辑
回复 yulihua49 cl -FA -O2 -cgcc -S -O2 -fomit-frame-pointercl -FA -O2 -cgcc -S -O2 -fomit-frame-poi ...
OwnWaterloo 发表于 2011-06-15 20:19 ![]()
再给你个128位/64位=64位 余64位的汇编,看你用C怎么玩,不慢几十倍有鬼。
在64位机上,long是64位的。
真正的指令就是8-13行。- /*
- unsigned long diva(unsigned long a[2],unsigned long c,unsigned long *rem);
- */
- .globl diva64
- .type diva64, @function
- diva64:
- .LFB2:
- movq (%rdi), %rax
- movq %rdx, %r8
- movq 8(%rdi), %rdx
- divq %rsi
- movq %rdx, (%r8)
- ret
- .LFE2:
- .size diva64, .-diva64
- .section .eh_frame,"a",@progbits
- .Lframe1:
- .long .LECIE1-.LSCIE1
- .LSCIE1:
- .long 0x0
- .byte 0x1
- .string "zR"
- .uleb128 0x1
- .sleb128 -8
- .byte 0x10
- .uleb128 0x1
- .byte 0x3
- .byte 0xc
- .uleb128 0x7
- .uleb128 0x8
- .byte 0x90
- .uleb128 0x1
- .align 8
- .LECIE1:
- .LSFDE1:
- .long .LEFDE1-.LASFDE1
- .LASFDE1:
- .long .LASFDE1-.Lframe1
- .long .LFB2
- .long .LFE2-.LFB2
- .uleb128 0x0
- .align 8
- .LEFDE1:
- .ident "GCC: (GNU) 4.1.2 20070115 (prerelease) (SUSE Linux)"
- .section .note.GNU-stack,"",@progbits
复制代码 大数除法,第一步试商,就是这个。除数c必须是规格化的。 |
|