[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: установка Debian



On Tue, May 25, 2010 at 02:47:06PM +0300, Oleksandr Gavenko wrote:
> Intel C compiler, MSVC, Sun Studio compiler, C for AIX,
> cc из zOS к сожалению на уровне синтаксиса не поддерживают
> встроеный 128-бытный тип. Нужно каверкать исходные тексты на Си
> различными ухищрениями, такая красота не получится
> 
> prod(uint64_t *a, uint64_t *b, uint64_t *r, int len)
> {
> ...
>     uint128_t prod =
>         (uint128_t) a[i] * (uint128_t) b[i]  /* это только в GCC */
>                        + r[i+j] + carry;
>     r[i+j] = (uint64_t) prod;
>     carry = (uint64_t) (prod >> 64);
> ...
> } 

Интересно, что без -O gcc генерирует страшненький код для 128-битного
умножения (cross-compiling on i386):

---------- multiplication.c ----------
#include <inttypes.h>

typedef __int128_t int128_t;

int128_t prod(int64_t a, int64_t b)
{
   return (int128_t)a * (int128_t)b;
}
--------------------------------------

$ gcc -m64 -c multiplication.c && objdump -d multiplication.o

multiplication.o:     file format elf64-x86-64


Disassembly of section .text:

0000000000000000 <prod>:
   0:	55                   	push   %rbp
   1:	48 89 e5             	mov    %rsp,%rbp
   4:	53                   	push   %rbx
   5:	48 89 7d f0          	mov    %rdi,-0x10(%rbp)
   9:	48 89 75 e8          	mov    %rsi,-0x18(%rbp)
   d:	48 8b 4d f0          	mov    -0x10(%rbp),%rcx
  11:	48 8b 75 f0          	mov    -0x10(%rbp),%rsi
  15:	48 c1 fe 3f          	sar    $0x3f,%rsi
  19:	48 89 f3             	mov    %rsi,%rbx
  1c:	48 8b 45 e8          	mov    -0x18(%rbp),%rax
  20:	48 8b 75 e8          	mov    -0x18(%rbp),%rsi
  24:	48 c1 fe 3f          	sar    $0x3f,%rsi
  28:	48 89 f2             	mov    %rsi,%rdx
  2b:	48 89 de             	mov    %rbx,%rsi
  2e:	48 0f af f0          	imul   %rax,%rsi
  32:	48 89 d7             	mov    %rdx,%rdi
  35:	48 0f af f9          	imul   %rcx,%rdi
  39:	48 01 fe             	add    %rdi,%rsi
  3c:	48 f7 e1             	mul    %rcx
  3f:	48 01 d6             	add    %rdx,%rsi
  42:	48 89 f2             	mov    %rsi,%rdx
  45:	5b                   	pop    %rbx
  46:	c9                   	leaveq 
  47:	c3                   	retq   

А с оптимизацией - вполне нормальный:

$ gcc -O2 -m64 -c multiplication.c && objdump -d multiplication.o

multiplication.o:     file format elf64-x86-64


Disassembly of section .text:

0000000000000000 <prod>:
   0:	48 89 f0             	mov    %rsi,%rax
   3:	48 f7 ef             	imul   %rdi
   6:	c3                   	retq   

Причем, налицо передача параметров через регистры (вход: %rdi, %rsi,
выход: %rax, %rdx). А вот аналогичная функция 64-х битного
умножения на i386 передает параметры через стек.

-- 
Stanislav


Reply to: