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: