Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
| | |
а если обновить gcc? 09.11.04 16:25 Число просмотров: 1639
Автор: 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."
|
<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
|
|
|
|