找回密码
 欢迎注册
查看: 15917|回复: 21

[讨论] 64位平台的256位乘法测试

[复制链接]
发表于 2014-11-5 11:26:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?欢迎注册

×
先贴上我测试通过的代码

  1. __declspec(naked)
  2. void UInt256x256To512(uint64_t* result, const uint64_t* left, const uint64_t* right)
  3. {
  4.         __asm
  5.         {
  6.                 push rbx
  7.                
  8.                 mov r9, rdx
  9.                 mov r10, [r8+0*8]
  10.                 mov r11, [r9+0*8]
  11.                 mov r12, [r9+1*8]
  12.                 mov r13, [r9+2*8]
  13.                 mov r14, [r9+3*8]

  14.                 mov rax, r10
  15.                 mul r11
  16.                 mov [rcx+0*8], rax
  17.                 mov r15, rdx

  18.                 mov rax, r10
  19.                 mul r12
  20.                 add rax, r15
  21.                 adc rdx, 0
  22.                 mov r15, rdx
  23.                 movq xmm1, rax

  24.                 mov rax, r10
  25.                 mul r13
  26.                 add rax, r15
  27.                 adc rdx, 0
  28.                 mov r15, rdx
  29.                 movq xmm2, rax

  30.                 mov rax, r10
  31.                 mul r14
  32.                 add rax, r15
  33.                 adc rdx, 0
  34.                 mov r15, rdx
  35.                 movq xmm3, rax

  36.                 movq xmm4, rdx
  37.                 mov r10, [r8+1*8]
  38.                
  39.                 movq r15, xmm1
  40.                 mov rax, r10
  41.                 mul r11
  42.                 add rax, r15
  43.                 adc rdx, 0
  44.                 mov [rcx+1*8], rax
  45.                 mov rbx, rdx

  46.                 movq r15, xmm2
  47.                 mov rax, r10
  48.                 mul r12
  49.                 add rax, r15
  50.                 adc rdx, 0
  51.                 add rax, rbx
  52.                 adc rdx, 0
  53.                 movq xmm2, rax
  54.                 mov rbx, rdx

  55.                 movq r15, xmm3
  56.                 mov rax, r10
  57.                 mul r13
  58.                 add rax, r15
  59.                 adc rdx, 0
  60.                 add rax, rbx
  61.                 adc rdx, 0
  62.                 movq xmm3, rax
  63.                 mov rbx, rdx

  64.                 movq r15, xmm4
  65.                 mov rax, r10
  66.                 mul r14
  67.                 add rax, r15
  68.                 adc rdx, 0
  69.                 add rax, rbx
  70.                 adc rdx, 0
  71.                 movq xmm4, rax

  72.                 movq xmm5, rdx
  73.                 mov r10, [r8+2*8]

  74.                 movq r15, xmm2
  75.                 mov rax, r10
  76.                 mul r11
  77.                 add rax, r15
  78.                 adc rdx, 0
  79.                 mov [rcx+2*8], rax
  80.                 mov rbx, rdx

  81.                 movq r15, xmm3
  82.                 mov rax, r10
  83.                 mul r12
  84.                 add rax, r15
  85.                 adc rdx, 0
  86.                 add rax, rbx
  87.                 adc rdx, 0
  88.                 movq xmm3, rax
  89.                 mov rbx, rdx

  90.                 movq r15, xmm4
  91.                 mov rax, r10
  92.                 mul r13
  93.                 add rax, r15
  94.                 adc rdx, 0
  95.                 add rax, rbx
  96.                 adc rdx, 0
  97.                 movq xmm4, rax
  98.                 mov rbx, rdx

  99.                 movq r15, xmm5
  100.                 mov rax, r10
  101.                 mul r14
  102.                 add rax, r15
  103.                 adc rdx, 0
  104.                 add rax, rbx
  105.                 adc rdx, 0
  106.                 movq xmm5, rax

  107.                 movq xmm6, rdx
  108.                 mov r10, [r8+3*8]

  109.                 movq r15, xmm3
  110.                 mov rax, r10
  111.                 mul r11
  112.                 add rax, r15
  113.                 adc rdx, 0
  114.                 mov [rcx+3*8], rax
  115.                 mov rbx, rdx

  116.                 movq r15, xmm4
  117.                 mov rax, r10
  118.                 mul r12
  119.                 add rax, r15
  120.                 adc rdx, 0
  121.                 add rax, rbx
  122.                 adc rdx, 0
  123.                 mov [rcx+4*8], rax
  124.                 mov rbx, rdx

  125.                 movq r15, xmm5
  126.                 mov rax, r10
  127.                 mul r13
  128.                 add rax, r15
  129.                 adc rdx, 0
  130.                 add rax, rbx
  131.                 adc rdx, 0
  132.                 mov [rcx+5*8], rax
  133.                 mov rbx, rdx

  134.                 movq r15, xmm6
  135.                 mov rax, r10
  136.                 mul r14
  137.                 add rax, r15
  138.                 adc rdx, 0
  139.                 add rax, rbx
  140.                 adc rdx, 0
  141.                 mov [rcx+6*8], rax

  142.                 mov [rcx+7*8], rdx
  143.                 pop rbx
  144.                 ret
  145.         }
  146. }
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2014-11-5 12:31:15 | 显示全部楼层
晕,发这些汇编代码上来干什么?一点注释都没有,谁有兴趣去看呀?

点评

https://gcc.godbolt.org/z/hn51M818b 41.45的RTP  发表于 2023-5-8 11:16
反正应该不是给你看的  发表于 2014-11-5 17:59
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2014-11-5 17:14:07 | 显示全部楼层
为什么用xmmi?是寄存器不够用吗?这些寄存器不需要保存原先的初值吗?

点评

我还是不清楚保存XMM初值的规则,常规寄存器几乎都用光了  发表于 2014-11-17 16:33
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2014-11-11 08:05:28 | 显示全部楼层
为什么不用 YMM 寄存器?

点评

有区别么?XMM足够了,何必用YMM,毕竟没有128位加指令情况下,XMM, YMM都不过是存储临时值罢了  发表于 2014-11-17 16:34
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2023-5-2 20:50:08 | 显示全部楼层
63行汇编,含IO占10个寄存器,读写内存。
llvm-mca表示运行时间43cycle,但mca可能有bug,实际时间没那么长
  1. Timeline view:
  2.                     0123456789          0123456789   
  3. Index     0123456789          0123456789          012

  4. [0,0]     DeeeeeER  .    .    .    .    .    .    . .   movq        (%rsi), %rdx
  5. [0,1]     DeeeeeeeeeER   .    .    .    .    .    . .   mulxq        (%rbx), %rax, %r8
  6. [0,2]     D========eER   .    .    .    .    .    . .   movq        %rax, (%rdi)
  7. [0,3]     .DeeeeeeeeeER  .    .    .    .    .    . .   mulxq        8(%rbx), %rax, %r9
  8. [0,4]     .D========eER  .    .    .    .    .    . .   addq        %rax, %r8
  9. [0,5]     . DeeeeeeeeeER .    .    .    .    .    . .   mulxq        16(%rbx), %rax, %r10
  10. [0,6]     . D========eER .    .    .    .    .    . .   adcq        %rax, %r9
  11. [0,7]     .  DeeeeeeeeeER.    .    .    .    .    . .   mulxq        24(%rbx), %rax, %r11
  12. [0,8]     .  D========eER.    .    .    .    .    . .   adcq        %rax, %r10
  13. [0,9]     .  D=========eER    .    .    .    .    . .   adcq        $0, %r11
  14. [0,10]    .   D----------R    .    .    .    .    . .   xorl        %ecx, %ecx
  15. [0,11]    .   DeeeeeE----R    .    .    .    .    . .   movq        8(%rsi), %rdx
  16. [0,12]    .   DeeeeeeeeeER    .    .    .    .    . .   mulxq        (%rbx), %rax, %rcx
  17. [0,13]    .    D=======eER    .    .    .    .    . .   adoxq        %rax, %r8
  18. [0,14]    .    D========eER   .    .    .    .    . .   adcxq        %rcx, %r9
  19. [0,15]    .    D========eER   .    .    .    .    . .   movq        %r8, 8(%rdi)
  20. [0,16]    .    .DeeeeeeeeeER  .    .    .    .    . .   mulxq        8(%rbx), %rax, %rcx
  21. [0,17]    .    .D========eER  .    .    .    .    . .   adoxq        %rax, %r9
  22. [0,18]    .    .D=========eER .    .    .    .    . .   adcxq        %rcx, %r10
  23. [0,19]    .    . DeeeeeeeeeER .    .    .    .    . .   mulxq        16(%rbx), %rax, %rcx
  24. [0,20]    .    . D=========eER.    .    .    .    . .   adoxq        %rax, %r10
  25. [0,21]    .    . D==========eER    .    .    .    . .   adcxq        %rcx, %r11
  26. [0,22]    .    .  DeeeeeeeeeE-R    .    .    .    . .   mulxq        24(%rbx), %rax, %rcx
  27. [0,23]    .    .  D==========eER   .    .    .    . .   adoxq        %rax, %r11
  28. [0,24]    .    .  DeE----------R   .    .    .    . .   movl        $0, %r8d
  29. [0,25]    .    .   D==========eER  .    .    .    . .   adoxq        %r8, %r8
  30. [0,26]    .    .   D===========eER .    .    .    . .   adcxq        %rcx, %r8
  31. [0,27]    .    .   DeeeeeE-------R .    .    .    . .   movq        16(%rsi), %rdx
  32. [0,28]    .    .    DeeeeeeeeeE--R .    .    .    . .   mulxq        (%rbx), %rax, %rcx
  33. [0,29]    .    .    D===========eER.    .    .    . .   adoxq        %rax, %r9
  34. [0,30]    .    .    D============eER    .    .    . .   adcxq        %rcx, %r10
  35. [0,31]    .    .    .D===========eER    .    .    . .   movq        %r9, 16(%rdi)
  36. [0,32]    .    .    .DeeeeeeeeeE---R    .    .    . .   mulxq        8(%rbx), %rax, %rcx
  37. [0,33]    .    .    .D============eER   .    .    . .   adoxq        %rax, %r10
  38. [0,34]    .    .    . D============eER  .    .    . .   adcxq        %rcx, %r11
  39. [0,35]    .    .    . DeeeeeeeeeE----R  .    .    . .   mulxq        16(%rbx), %rax, %rcx
  40. [0,36]    .    .    . D=============eER .    .    . .   adoxq        %rax, %r11
  41. [0,37]    .    .    .  D=============eER.    .    . .   adcxq        %rcx, %r8
  42. [0,38]    .    .    .  DeeeeeeeeeE-----R.    .    . .   mulxq        24(%rbx), %rax, %rcx
  43. [0,39]    .    .    .  D==============eER    .    . .   adoxq        %rax, %r8
  44. [0,40]    .    .    .   DeE-------------R    .    . .   movl        $0, %r9d
  45. [0,41]    .    .    .   D==============eER   .    . .   adoxq        %r9, %r9
  46. [0,42]    .    .    .   D===============eER  .    . .   adcxq        %rcx, %r9
  47. [0,43]    .    .    .   DeeeeeE-----------R  .    . .   movq        24(%rsi), %rdx
  48. [0,44]    .    .    .    DeeeeeeeeeE------R  .    . .   mulxq        (%rbx), %rax, %rcx
  49. [0,45]    .    .    .    D===============eER .    . .   adoxq        %rax, %r10
  50. [0,46]    .    .    .    D================eER.    . .   adcxq        %rcx, %r11
  51. [0,47]    .    .    .    .D===============eER.    . .   movq        %r10, 24(%rdi)
  52. [0,48]    .    .    .    .DeeeeeeeeeE-------R.    . .   mulxq        8(%rbx), %rax, %rcx
  53. [0,49]    .    .    .    .D================eER    . .   adoxq        %rax, %r11
  54. [0,50]    .    .    .    . D================eER   . .   adcxq        %rcx, %r8
  55. [0,51]    .    .    .    . D================eER   . .   movq        %r11, 32(%rdi)
  56. [0,52]    .    .    .    . DeeeeeeeeeE--------R   . .   mulxq        16(%rbx), %rax, %rcx
  57. [0,53]    .    .    .    .  D================eER  . .   adoxq        %rax, %r8
  58. [0,54]    .    .    .    .  D=================eER . .   adcxq        %rcx, %r9
  59. [0,55]    .    .    .    .  D=================eER . .   movq        %r8, 40(%rdi)
  60. [0,56]    .    .    .    .   DeeeeeeeeeE--------R . .   mulxq        24(%rbx), %rax, %rcx
  61. [0,57]    .    .    .    .   D=================eER. .   adoxq        %rax, %r9
  62. [0,58]    .    .    .    .   DeE-----------------R. .   movl        $0, %r10d
  63. [0,59]    .    .    .    .    D=================eER .   movq        %r9, 48(%rdi)
  64. [0,60]    .    .    .    .    D=================eER .   adoxq        %r10, %r10
  65. [0,61]    .    .    .    .    D==================eER.   adcxq        %rcx, %r10
  66. [0,62]    .    .    .    .    D===================eER   movq        %r10, 56(%rdi)
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2023-5-2 23:42:13 | 显示全部楼层
運行崩潰:r8未初始化,在
  1. mov r10, [r8+0*8]
复制代码

点评

@.·.·. https://learn.microsoft.com/en-us/cpp/cpp/naked-cpp?view=msvc-170 naked就不是個調用約定  发表于 2023-5-3 17:34
__declspec(naked)好像有特殊的约定,这个东西要求函数要合适地初始化这些寄存器  发表于 2023-5-3 12:49
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2023-5-3 12:47:20 | 显示全部楼层
(把之前的错误代码删除了)
(进位的时候应该按BASE进位,我进成了DOUBLE,不出错就见鬼了)
  1. use std::ops::Mul;
  2. type BASE=u64;
  3. type DOUBLE=u128;
  4. const _:()=assert!(std::mem::size_of::<BASE>() * 2==std::mem::size_of::<DOUBLE>());
  5. const BASE:u32=8*std::mem::size_of::<BASE>() as u32;

  6. const BASE_LEN:usize=256/BASE as usize;
  7. #[derive(Clone, Copy)]
  8. struct U256([BASE;BASE_LEN]);
  9. // impl Mul for U256 {
  10. //     type Output = [BASE;BASE_LEN*2];
  11. //     fn mul(self, rhs: Self) -> Self::Output {
  12. //         let mut out0=[0 as DOUBLE;BASE_LEN*2];
  13. //         for i in 0..BASE_LEN {
  14. //             let mut carry=false;
  15. //             for j in 0..BASE_LEN {
  16. //                 (out0[i+j],carry)=out0[i+j].overflowing_add(self.0[i] as DOUBLE*rhs.0[j] as DOUBLE+carry as DOUBLE)
  17. //             }
  18. //             let mut j=BASE_LEN;
  19. //             while carry {
  20. //                 (out0[i+j],carry)=out0[i+j].overflowing_add(carry as DOUBLE);
  21. //                 j+=1;
  22. //             }
  23. //         }
  24. //         let mut out=[0 as BASE;BASE_LEN*2];
  25. //         let mut carry=0 as DOUBLE;
  26. //         for i in 0..BASE_LEN*2 {
  27. //             out[i]=(out0[i]+carry) as BASE;
  28. //             carry=(carry>>BASE)+(out0[i]>>BASE);
  29. //         }
  30. //         out
  31. //     }
  32. // }
  33. impl Mul for U256 {
  34.     type Output = [BASE;BASE_LEN*2];
  35.     fn mul(self, rhs: Self) -> Self::Output {
  36.         let mut out0=[0 as DOUBLE;BASE_LEN*2];
  37.         for i in 0..BASE_LEN {
  38.             let mut carry=false;
  39.             for j in 0..BASE_LEN {
  40.                 (out0[i+j],carry)=out0[i+j].overflowing_add(self.0[i] as DOUBLE*rhs.0[j] as DOUBLE+((carry as DOUBLE)<<BASE))
  41.             }
  42.             let mut j=BASE_LEN;
  43.             while carry {
  44.                 (out0[i+j],carry)=out0[i+j].overflowing_add((carry as DOUBLE)<<BASE);
  45.                 j+=1;
  46.             }
  47.         }
  48.         let mut out=[0 as BASE;BASE_LEN*2];
  49.         let mut carry=0 as DOUBLE;
  50.         for i in 0..BASE_LEN*2 {
  51.             let (res,of)=out0[i].overflowing_add(carry);
  52.             out[i]=res as BASE;
  53.             carry=(res>>BASE)+((of as DOUBLE)<<BASE);
  54.         }
  55.         out
  56.     }
  57. }
复制代码

对应汇编
  1.         .text
  2.         .file        "lib.9a6cb7ee-cgu.0"
  3.         .section        ".text._ZN51_$LT$lib..U256$u20$as$u20$core..ops..arith..Mul$GT$3mul17h5eee3b70e1af20c7E","ax",@progbits
  4.         .globl        _ZN51_$LT$lib..U256$u20$as$u20$core..ops..arith..Mul$GT$3mul17h5eee3b70e1af20c7E
  5.         .p2align        4, 0x90
  6.         .type        _ZN51_$LT$lib..U256$u20$as$u20$core..ops..arith..Mul$GT$3mul17h5eee3b70e1af20c7E,@function
  7. _ZN51_$LT$lib..U256$u20$as$u20$core..ops..arith..Mul$GT$3mul17h5eee3b70e1af20c7E:
  8.         .cfi_startproc
  9.         pushq        %rbp
  10.         .cfi_def_cfa_offset 16
  11.         pushq        %r15
  12.         .cfi_def_cfa_offset 24
  13.         pushq        %r14
  14.         .cfi_def_cfa_offset 32
  15.         pushq        %r13
  16.         .cfi_def_cfa_offset 40
  17.         pushq        %r12
  18.         .cfi_def_cfa_offset 48
  19.         pushq        %rbx
  20.         .cfi_def_cfa_offset 56
  21.         subq        $80, %rsp
  22.         .cfi_def_cfa_offset 136
  23.         .cfi_offset %rbx, -56
  24.         .cfi_offset %r12, -48
  25.         .cfi_offset %r13, -40
  26.         .cfi_offset %r14, -32
  27.         .cfi_offset %r15, -24
  28.         .cfi_offset %rbp, -16
  29.         movq        %rdx, %rcx
  30.         movq        8(%rdx), %r10
  31.         movq        (%rsi), %rbx
  32.         movq        %rbx, 72(%rsp)
  33.         movq        %r10, %rdx
  34.         mulxq        %rbx, %r11, %r13
  35.         movq        16(%rcx), %r9
  36.         movq        %r9, %rdx
  37.         mulxq        %rbx, %r15, %r14
  38.         movq        %rdi, %rax
  39.         movq        (%rcx), %r12
  40.         movq        24(%rcx), %r8
  41.         movq        %r8, %rdx
  42.         mulxq        %rbx, %rdx, %rcx
  43.         movq        %rdx, 16(%rsp)
  44.         movq        %rcx, (%rsp)
  45.         movq        8(%rsi), %rdi
  46.         movq        %rsi, 32(%rsp)
  47.         movq        %r12, %rdx
  48.         mulxq        %rdi, %rdx, %rcx
  49.         addq        %r11, %rdx
  50.         movq        %rdx, 56(%rsp)
  51.         adcq        %r13, %rcx
  52.         movq        %rcx, 64(%rsp)
  53.         movq        %r10, %rdx
  54.         mulxq        %rdi, %rbp, %r13
  55.         adcq        $0, %r13
  56.         addq        %r15, %rbp
  57.         adcq        %r14, %r13
  58.         movq        %r9, %rdx
  59.         movq        %r9, 40(%rsp)
  60.         mulxq        %rdi, %rbx, %rcx
  61.         movq        %r8, %r15
  62.         movq        %r8, 48(%rsp)
  63.         movq        %r8, %rdx
  64.         mulxq        %rdi, %rdx, %r14
  65.         movq        %rdx, 8(%rsp)
  66.         adcq        $0, %rcx
  67.         addq        16(%rsp), %rbx
  68.         movq        16(%rsi), %rdi
  69.         movq        %r12, %rdx
  70.         movq        %r12, %rsi
  71.         movq        %r12, 24(%rsp)
  72.         mulxq        %rdi, %r11, %r8
  73.         adcq        (%rsp), %rcx
  74.         adcq        $0, %r14
  75.         addq        %rbp, %r11
  76.         movq        %r10, %rdx
  77.         mulxq        %rdi, %rbp, %r12
  78.         adcq        %r13, %r8
  79.         adcq        $0, %r12
  80.         addq        %rbx, %rbp
  81.         movq        %r9, %rdx
  82.         mulxq        %rdi, %rbx, %r9
  83.         adcq        %rcx, %r12
  84.         adcq        $0, %r9
  85.         addq        8(%rsp), %rbx
  86.         movq        %r15, %rdx
  87.         mulxq        %rdi, %rcx, %r15
  88.         movq        %rcx, (%rsp)
  89.         adcq        %r14, %r9
  90.         adcq        $0, %r15
  91.         movq        32(%rsp), %rcx
  92.         movq        24(%rcx), %rcx
  93.         movq        %rsi, %rdx
  94.         mulxq        %rcx, %r14, %r13
  95.         addq        %rbp, %r14
  96.         adcq        %r12, %r13
  97.         movq        %r10, %rdx
  98.         mulxq        %rcx, %r10, %rsi
  99.         adcq        $0, %rsi
  100.         addq        %rbx, %r10
  101.         adcq        %r9, %rsi
  102.         movq        40(%rsp), %rdx
  103.         mulxq        %rcx, %rbp, %rdi
  104.         adcq        $0, %rdi
  105.         movq        48(%rsp), %rdx
  106.         mulxq        %rcx, %r12, %r9
  107.         movq        24(%rsp), %rdx
  108.         mulxq        72(%rsp), %rcx, %rdx
  109.         addq        (%rsp), %rbp
  110.         adcq        %r15, %rdi
  111.         movq        %rcx, (%rax)
  112.         adcq        $0, %r9
  113.         addq        56(%rsp), %rdx
  114.         movq        %rdx, 8(%rax)
  115.         adcq        64(%rsp), %r11
  116.         movq        %r11, 16(%rax)
  117.         adcq        $0, %r8
  118.         setb        %cl
  119.         addq        %r14, %r8
  120.         movzbl        %cl, %ecx
  121.         adcq        %r13, %rcx
  122.         movq        %r8, 24(%rax)
  123.         setb        %dl
  124.         addq        %r10, %rcx
  125.         movzbl        %dl, %edx
  126.         adcq        %rsi, %rdx
  127.         movq        %rcx, 32(%rax)
  128.         setb        %cl
  129.         addq        %rbp, %rdx
  130.         movzbl        %cl, %ecx
  131.         adcq        %rdi, %rcx
  132.         movq        %rdx, 40(%rax)
  133.         setb        %dl
  134.         addq        %r12, %rcx
  135.         movzbl        %dl, %edx
  136.         adcq        %r9, %rdx
  137.         movq        %rcx, 48(%rax)
  138.         movq        %rdx, 56(%rax)
  139.         addq        $80, %rsp
  140.         .cfi_def_cfa_offset 56
  141.         popq        %rbx
  142.         .cfi_def_cfa_offset 48
  143.         popq        %r12
  144.         .cfi_def_cfa_offset 40
  145.         popq        %r13
  146.         .cfi_def_cfa_offset 32
  147.         popq        %r14
  148.         .cfi_def_cfa_offset 24
  149.         popq        %r15
  150.         .cfi_def_cfa_offset 16
  151.         popq        %rbp
  152.         .cfi_def_cfa_offset 8
  153.         retq
  154. .Lfunc_end0:
  155.         .size        _ZN51_$LT$lib..U256$u20$as$u20$core..ops..arith..Mul$GT$3mul17h5eee3b70e1af20c7E, .Lfunc_end0-_ZN51_$LT$lib..U256$u20$as$u20$core..ops..arith..Mul$GT$3mul17h5eee3b70e1af20c7E
  156.         .cfi_endproc

  157.         .section        ".note.GNU-stack","",@progbits
复制代码

测试
  1. fn main(){
  2.     let r=U256([BASE::MAX;BASE_LEN]);
  3.     (r*r).into_iter().for_each(|x|println!("{x:x}"))
  4. }
复制代码

输出
  1. 1
  2. 0
  3. 0
  4. 0
  5. fffffffffffffffe
  6. ffffffffffffffff
  7. ffffffffffffffff
  8. ffffffffffffffff
复制代码

点评

結果正確,llvm表示50cycle https://pastebin.com/s8YwpFPV  发表于 2023-5-3 13:17
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2023-5-4 00:01:02 | 显示全部楼层
本帖最后由 l4m2 于 2023-5-4 00:02 编辑

不使用adx指令,多用幾個寄存器,效率接近

  1. .section .text
  2. .globl main
  3. main:
  4. addq $-128, %rsp
  5. movq %rsp, %rdi
  6. leaq 64(%rsp), %rcx
  7. leaq 128(%rsp), %rsi
  8. xorl %ebx, %ebx

  9. lp:
  10. // mul256 start
  11. movq (%rcx), %rdx
  12. mulxq (%rsi), %r8, %r12
  13. movq %r8, (%rdi)
  14. mulxq 8(%rsi), %r9, %r13
  15. addq %r12, %r9
  16. mulxq 16(%rsi), %r10, %r14
  17. adcq %r13, %r10
  18. mulxq 24(%rsi), %r11, %r8
  19. adcq %r14, %r11
  20. adcq $0, %r8


  21. movq 8(%rcx), %rdx
  22. mulxq (%rsi), %rax, %r12
  23. addq %rax, %r9
  24. movq %r9, 8(%rdi)
  25. mulxq 8(%rsi), %rax, %r13
  26. adcq %rax, %r10
  27. mulxq 16(%rsi), %rax, %r14
  28. adcq %rax, %r11
  29. mulxq 24(%rsi), %rax, %r9
  30. adcq %rax, %r8
  31. adcq $0, %r9

  32. addq %r12, %r10
  33. adcq %r13, %r11
  34. adcq %r14, %r8
  35. adcq $0, %r9


  36. movq 16(%rcx), %rdx
  37. mulxq (%rsi), %rax, %r12
  38. addq %rax, %r10
  39. movq %r10, 16(%rdi)
  40. mulxq 8(%rsi), %rax, %r13
  41. adcq %rax, %r11
  42. mulxq 16(%rsi), %rax, %r14
  43. adcq %rax, %r8
  44. mulxq 24(%rsi), %rax, %r9
  45. adcq %rax, %r9
  46. adcq $0, %r10

  47. addq %r12, %r11
  48. adcq %r13, %r8
  49. adcq %r14, %r9
  50. adcq $0, %r10


  51. movq 24(%rcx), %rdx
  52. mulxq (%rsi), %rax, %r12
  53. addq %rax, %r11
  54. movq %r11, 24(%rdi)
  55. mulxq 8(%rsi), %rax, %r13
  56. adcq %rax, %r8
  57. mulxq 16(%rsi), %rax, %r14
  58. adcq %rax, %r9
  59. mulxq 24(%rsi), %rax, %r9
  60. adcq %rax, %r10
  61. adcq $0, %r10

  62. addq %r12, %r8
  63. movq %r8, 32(%rsi)
  64. adcq %r13, %r9
  65. movq %r9, 40(%rsi)
  66. adcq %r14, %r10
  67. movq %r10, 48(%rsi)
  68. adcq $0, %r11
  69. movq %r11, 56(%rsi)


  70. //  mul256 end
  71. subl $1, %ebx
  72. jnz lp


  73. subq $-128, %rsp
  74. ret

  75. // rdi(dst) rsi(A) rdx=>rcx(B)
  76. // r8-r11 current considered 4 bytes
  77. // r12-r14 himul high
  78. // rax(tmp) rdx(mulx reg)

  79. /*
  80. mul256:
  81. movq %rdx, %rcx

  82. movq (%rdx), %rdx
  83. movq %r12, -8(%rsp)
  84. mulxq (%rsi), %r8, %r12
  85. movq %r8, (%rdi)
  86. movq %r13, -16(%rsp)
  87. mulxq 8(%rsi), %r9, %r13
  88. addq %r12, %r9
  89. movq %r14, -24(%rsp)
  90. mulxq 16(%rsi), %r10, %r14
  91. adcq %r13, %r10
  92. mulxq 24(%rsi), %r11, %r8
  93. adcq %r14, %r11
  94. adcq $0, %r8


  95. movq 8(%rcx), %rdx
  96. mulxq (%rsi), %rax, %r12
  97. addq %rax, %r9
  98. movq %r9, 8(%rdi)
  99. mulxq 8(%rsi), %rax, %r13
  100. adcq %rax, %r10
  101. mulxq 16(%rsi), %rax, %r14
  102. adcq %rax, %r11
  103. mulxq 24(%rsi), %rax, %r9
  104. adcq %rax, %r8
  105. adcq $0, %r9

  106. addq %r12, %r10
  107. adcq %r13, %r11
  108. adcq %r14, %r8
  109. adcq $0, %r9


  110. movq 16(%rcx), %rdx
  111. mulxq (%rsi), %rax, %r12
  112. addq %rax, %r10
  113. movq %r10, 16(%rdi)
  114. mulxq 8(%rsi), %rax, %r13
  115. adcq %rax, %r11
  116. mulxq 16(%rsi), %rax, %r14
  117. adcq %rax, %r8
  118. mulxq 24(%rsi), %rax, %r9
  119. adcq %rax, %r9
  120. adcq $0, %r10

  121. addq %r12, %r11
  122. adcq %r13, %r8
  123. adcq %r14, %r9
  124. adcq $0, %r10


  125. movq 24(%rcx), %rdx
  126. mulxq (%rsi), %rax, %r12
  127. addq %rax, %r11
  128. movq %r11, 24(%rdi)
  129. mulxq 8(%rsi), %rax, %r13
  130. adcq %rax, %r8
  131. mulxq 16(%rsi), %rax, %r14
  132. adcq %rax, %r9
  133. mulxq 24(%rsi), %rax, %r9
  134. adcq %rax, %r10
  135. adcq $0, %r10

  136. addq %r12, %r8
  137. movq %r8, 32(%rsi)
  138. adcq %r13, %r9
  139. movq %r9, 40(%rsi)
  140. adcq %r14, %r10
  141. movq %r10, 48(%rsi)
  142. adcq $0, %r11
  143. movq %r11, 56(%rsi)


  144. movq -8(%rsp), %r12
  145. movq -16(%rsp), %r13
  146. movq -24(%rsp), %r14

  147. ret

  148. */
复制代码
  1. Performance counter stats for './a.out':

  2.          25,636.00 msec task-clock                #    0.999 CPUs utilized         
  3.              4,351      context-switches          #  169.722 /sec                  
  4.                283      cpu-migrations            #   11.039 /sec                  
  5.                 47      page-faults               #    1.833 /sec                  
  6.    100,564,298,132      cycles                    #    3.923 GHz                      (83.32%)
  7.        304,933,814      stalled-cycles-frontend   #    0.30% frontend cycles idle     (83.33%)
  8.     77,948,700,897      stalled-cycles-backend    #   77.51% backend cycles idle      (83.34%)
  9.    262,154,531,908      instructions              #    2.61  insn per cycle         
  10.                                                   #    0.30  stalled cycles per insn  (83.33%)
  11.      4,334,044,774      branches                  #  169.061 M/sec                    (83.34%)
  12.          1,346,833      branch-misses             #    0.03% of all branches          (83.34%)

  13.       25.669427577 seconds time elapsed

  14.       25.625846000 seconds user
  15.        0.011995000 seconds sys
复制代码
  1. Timeline view:
  2.                     0123456789          0123
  3. Index     0123456789          0123456789   

  4. [0,0]     DeER .    .    .    .    .    .  .   movq        %rdx, %rcx
  5. [0,1]     DeeeeeER  .    .    .    .    .  .   movq        (%rdx), %rdx
  6. [0,2]     DeE----R  .    .    .    .    .  .   movq        %r12, -8(%rsp)
  7. [0,3]     .DeeeeeeeeeER  .    .    .    .  .   mulxq        (%rsi), %r8, %r12
  8. [0,4]     .D========eER  .    .    .    .  .   movq        %r8, (%rdi)
  9. [0,5]     .D=========eER .    .    .    .  .   movq        %r13, -16(%rsp)
  10. [0,6]     . DeeeeeeeeeER .    .    .    .  .   mulxq        8(%rsi), %r9, %r13
  11. [0,7]     . D========eER .    .    .    .  .   addq        %r12, %r9
  12. [0,8]     . D=========eER.    .    .    .  .   movq        %r14, -24(%rsp)
  13. [0,9]     .  DeeeeeeeeeER.    .    .    .  .   mulxq        16(%rsi), %r10, %r14
  14. [0,10]    .  D========eER.    .    .    .  .   adcq        %r13, %r10
  15. [0,11]    .   DeeeeeeeeeER    .    .    .  .   mulxq        24(%rsi), %r11, %r8
  16. [0,12]    .   D========eER    .    .    .  .   adcq        %r14, %r11
  17. [0,13]    .   D=========eER   .    .    .  .   adcq        $0, %r8
  18. [0,14]    .    DeeeeeE----R   .    .    .  .   movq        8(%rcx), %rdx
  19. [0,15]    .    DeeeeeeeeeER   .    .    .  .   mulxq        (%rsi), %rax, %r12
  20. [0,16]    .    D========eER   .    .    .  .   addq        %rax, %r9
  21. [0,17]    .    .D========eER  .    .    .  .   movq        %r9, 8(%rdi)
  22. [0,18]    .    .DeeeeeeeeeER  .    .    .  .   mulxq        8(%rsi), %rax, %r13
  23. [0,19]    .    .D========eER  .    .    .  .   adcq        %rax, %r10
  24. [0,20]    .    . DeeeeeeeeeER .    .    .  .   mulxq        16(%rsi), %rax, %r14
  25. [0,21]    .    . D========eER .    .    .  .   adcq        %rax, %r11
  26. [0,22]    .    .  DeeeeeeeeeER.    .    .  .   mulxq        24(%rsi), %rax, %r9
  27. [0,23]    .    .  D========eER.    .    .  .   adcq        %rax, %r8
  28. [0,24]    .    .  D=========eER    .    .  .   adcq        $0, %r9
  29. [0,25]    .    .   D======eE--R    .    .  .   addq        %r12, %r10
  30. [0,26]    .    .   D=======eE-R    .    .  .   adcq        %r13, %r11
  31. [0,27]    .    .   D========eER    .    .  .   adcq        %r14, %r8
  32. [0,28]    .    .   D=========eER   .    .  .   adcq        $0, %r9
  33. [0,29]    .    .   DeeeeeE-----R   .    .  .   movq        16(%rcx), %rdx
  34. [0,30]    .    .    DeeeeeeeeeER   .    .  .   mulxq        (%rsi), %rax, %r12
  35. [0,31]    .    .    D========eER   .    .  .   addq        %rax, %r10
  36. [0,32]    .    .    D=========eER  .    .  .   movq        %r10, 16(%rdi)
  37. [0,33]    .    .    .DeeeeeeeeeER  .    .  .   mulxq        8(%rsi), %rax, %r13
  38. [0,34]    .    .    .D========eER  .    .  .   adcq        %rax, %r11
  39. [0,35]    .    .    . DeeeeeeeeeER .    .  .   mulxq        16(%rsi), %rax, %r14
  40. [0,36]    .    .    . D========eER .    .  .   adcq        %rax, %r8
  41. [0,37]    .    .    .  DeeeeeeeeeER.    .  .   mulxq        24(%rsi), %rax, %r9
  42. [0,38]    .    .    .  D=========eER    .  .   adcq        %rax, %r9
  43. [0,39]    .    .    .  D==========eER   .  .   adcq        $0, %r10
  44. [0,40]    .    .    .   D======eE---R   .  .   addq        %r12, %r11
  45. [0,41]    .    .    .   D=======eE--R   .  .   adcq        %r13, %r8
  46. [0,42]    .    .    .   D=========eER   .  .   adcq        %r14, %r9
  47. [0,43]    .    .    .   D==========eER  .  .   adcq        $0, %r10
  48. [0,44]    .    .    .   DeeeeeE------R  .  .   movq        24(%rcx), %rdx
  49. [0,45]    .    .    .    DeeeeeeeeeE-R  .  .   mulxq        (%rsi), %rax, %r12
  50. [0,46]    .    .    .    D========eE-R  .  .   addq        %rax, %r11
  51. [0,47]    .    .    .    D=========eER  .  .   movq        %r11, 24(%rdi)
  52. [0,48]    .    .    .    .DeeeeeeeeeER  .  .   mulxq        8(%rsi), %rax, %r13
  53. [0,49]    .    .    .    .D========eER  .  .   adcq        %rax, %r8
  54. [0,50]    .    .    .    . DeeeeeeeeeER .  .   mulxq        16(%rsi), %rax, %r14
  55. [0,51]    .    .    .    . D========eER .  .   adcq        %rax, %r9
  56. [0,52]    .    .    .    .  DeeeeeeeeeER.  .   mulxq        24(%rsi), %rax, %r9
  57. [0,53]    .    .    .    .  D========eER.  .   adcq        %rax, %r10
  58. [0,54]    .    .    .    .  D=========eER  .   adcq        $0, %r10
  59. [0,55]    .    .    .    .   D======eE--R  .   addq        %r12, %r8
  60. [0,56]    .    .    .    .   D=======eE-R  .   movq        %r8, 32(%rsi)
  61. [0,57]    .    .    .    .   D========eER  .   adcq        %r13, %r9
  62. [0,58]    .    .    .    .   D=========eER .   movq        %r9, 40(%rsi)
  63. [0,59]    .    .    .    .   D=========eER .   adcq        %r14, %r10
  64. [0,60]    .    .    .    .   D==========eER.   movq        %r10, 48(%rsi)
  65. [0,61]    .    .    .    .    D=========eER.   adcq        $0, %r11
  66. [0,62]    .    .    .    .    D==========eER   movq        %r11, 56(%rsi)
  67. [0,63]    .    .    .    .    DeeeeeE------R   movq        -8(%rsp), %r12
  68. [0,64]    .    .    .    .    DeeeeeE------R   movq        -16(%rsp), %r13
  69. [0,65]    .    .    .    .    D=eeeeeE-----R   movq        -24(%rsp), %r14
  70. [0,66]    .    .    .    .    .DeeeeeeeE---R   retq
复制代码

补充内容 (2023-5-5 09:32):
程序修復後測試了正確性及效率 https://pastebin.com/nu1xu5jE

点评

程序不正確  发表于 2023-5-5 08:50
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2023-5-4 08:59:41 | 显示全部楼层
汇编是怎么写怎么调试的?

点评

用调试工具,或者拿眼盯着看  发表于 2023-5-4 09:51
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2023-5-6 02:24:32 | 显示全部楼层
https://pastebin.com/gktPUxJY
這個要40s但是我不知道瓶頸在哪。B讀進寄存器也差不多40
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-11-21 17:52 , Processed in 0.029601 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表