информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Атака на InternetСетевые кракеры и правда о деле ЛевинаSpanning Tree Protocol: недокументированное применение
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 С наступающим 
 Microsoft обещает радикально усилить... 
 Ядро Linux избавляется от российских... 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Долго, это да... Хотя, разработчики может лучше нашего поймут, в чём там собака, и может, проблема смехотворно легко исправляется... В любом случае, кто-то должен написать, а то так и не исправят… 10.11.04 10:06  Число просмотров: 1499
Автор: HandleX <Александр М.> Статус: The Elderman
<"чистая" ссылка>
<programming>
gcc asm 26.10.04 15:18  
Автор: leo <Леонид Юрьев> Статус: Elderman
Отредактировано 26.10.04 15:25  Количество правок: 2
<"чистая" ссылка>
Что-то меня клинит или bug в gcc:
//--------------------- определяем inline-кусочек:
    #define __hdivu_gnuc(divisor, divident, exp) \
    ({ \
        /* if(divident > divisor) \
        // { \
        //     (result = (divident << 32 + divisor/2) >> 1) / divisor; \
        //     exp++; \
        // } \
        // else \
        //     result = (divident << 32 + divisor/2) / divisor;  */ \
        unsigned long result; \
       _asm_ \
            "movl %3, %0\n\t" \
            "shrl $1, %0\n\t" \
            "cmpl %2, %3\n\t" \
            "ja 1f\n\t" \
            "inc %1\n\t" \
            "shrl $1, %2\n\t" \
            "rcr $1, %0\n\t" \
        "1:\n\t" \
            "divl %3" \
            : "=&a,a" (result), "+g,g" (exp) \
            : "d,d" (divident), "r,m" (divisor) \
            : "cc"); \
        result; \
    })

//--------------------- используем:
    e = a->e - b->e;
    v = __hdivu_gnuc(b->f, a->f, e);
//--------------------- получаем:
	subl	%ecx, %eax
/APP
	movl (%esi), %eax
	shrl $1, %eax
	cmpl %edx, (%esi)
	ja 1f
	inc %edx
	shrl $1, %edx
	rcr $1, %eax
	1:
	divl (%esi)
/NO_APP

---
Мне думается что EDX спутан с ECX и это bug. Еще есть идеи?
IMHO bug 100%, пока обошел так 26.10.04 16:07  
Автор: leo <Леонид Юрьев> Статус: Elderman
Отредактировано 26.10.04 16:08  Количество правок: 1
<"чистая" ссылка>
        unsigned __int32 result, temp = divident; \
       _asm_ \
            "movl %3, %0\n\t" \
            "shrl $1, %0\n\t" \
            "cmpl %2, %3\n\t" \
            "ja 1f\n\t" \
            "inc %1\n\t" \
            "shrl $1, %2\n\t" \
            "rcr $1, %0\n\t" \
        "1:\n\t" \
            "divl %3" \
            : "=&a,a" (result), "+g,g" (exp), "+d,d" (temp) \
            : "r,m" (divisor) \
            : "cc"); \
//-------- получаем:
	subl	%ecx, %eax
/APP
	movl (%esi), %eax
	shrl $1, %eax
	cmpl %edx, (%esi)
	ja 1f
	inc %ecx
	shrl $1, %edx
	rcr $1, %eax
	1:
	divl (%esi)
/NO_APP

---
Если кому интересно... 09.11.04 15:54  
Автор: leo <Леонид Юрьев> Статус: Elderman
Отредактировано 09.11.04 15:55  Количество правок: 1
<"чистая" ссылка>
gcc 3.4.2 при включении различной оптимизации все равно гадит.

помучившись сделал так:
    #define __hdivu_gnuc(divisor, divident, exp) \
    ({ \
        unsigned __int32 result; \
        unsigned __int64 ll; \
       _asm_ \
            "movl %2, %%edx\n\t" \
            "movl %3, %%eax\n\t" \
            "shrl $1, %%eax\n\t" \
            "cmp %%edx, %3\n\t" \
            "ja 1f\n\t" \
            "shrl $1, %%edx\n\t" \
            "rcrl $1, %%eax\n\t" \
            "incl %1\n\t" \
        "1:\n\t" \
            : "=A" (ll), "+g" (exp) : "g" (divident), "g" (divisor) \
            : "cc"); \
       _asm_ \
            "divl %2" \
            : "=a,a" (result) : "A,A" (ll), "r,m" (divisor) \
            : "cc"); \
        result; \
    })

---
а если обновить gcc? 09.11.04 16:25  
Автор: ZaDNiCa <indeed ZaDNiCa> Статус: Elderman
<"чистая" ссылка>
у меня под 3.4.2 tar-1.14.90 не собирался - выпадал с ошибкой
после обновления gcc до 3.4.3 собралось все без ошибок
"This release is a bug-fix release, containing fixes for regressions in GCC 3.4.2 relative to previous releases of GCC."
В списке fix-ов нет ничего похожего, в списке текущих ошибок... 09.11.04 17:11  
Автор: leo <Леонид Юрьев> Статус: Elderman
<"чистая" ссылка>
В списке fix-ов нет ничего похожего, в списке текущих ошибок тоже. Нужно катить bug-report.
Но как правило такие проблемы исправляются очень долго, или как минимум неохотно...
Долго, это да... Хотя, разработчики может лучше нашего поймут, в чём там собака, и может, проблема смехотворно легко исправляется... В любом случае, кто-то должен написать, а то так и не исправят… 10.11.04 10:06  
Автор: HandleX <Александр М.> Статус: The Elderman
<"чистая" ссылка>
В gcc смехотворно простых исправлений, кажется, уже не бывает... :( 10.11.04 18:56  
Автор: Ktirf <Æ Rusakov> Статус: Elderman
<"чистая" ссылка>
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2025 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach