LINUX.ORG.RU

учим Underflow с Gcc

 , ,


0

4

Имеем такой кусок:

#include <stdio.h>
extern void underflow(void) __attribute__((noreturn));
unsigned foo(unsigned a, unsigned b)
{
    unsigned r = a - b;
    if (r > a)
    {
        printf("underflow");
    }
    return r;
}

int main(){
	foo(1, 2);
	return 0;
}

Функция foo дает в этих ваших gcc:
        pushq	%rbx
	movl	%edi, %ebx
	subl	%esi, %ebx
	cmpl	%edi, %ebx
	jbe	.LBB0_2

Как заставить это говнецо выдавать нормальный код (хотя бы как у gcc 4.4.7):
	pushq	%rbx
	subl	%esi, %edi
	j(n)c	.L2

★
Ответ на: комментарий от parrto

на знаковой арифметике можно просто уходить в трап с -ftrapv

В крайнем случае напиши свою inline процедуру с такими asm вставками как тебе нравится. Но у оптимизатора gcc тогда будут проблемьі с окружающим кодом.

anonymous
()

Ну смотри: берёшь свой код и идёшь на https://gcc.godbolt.org, видишь на лицо регрессию, начиная с 4.8.2. Вытягиваешь всю ветку 4.8 гитом, там за полгода с 4.8.1 около полутысячи коммитов набралось. Что такое git bisect знаешь? Всего-то 9 проходов будет. С результатами отписываешься на https://gcc.gnu.org/bugzilla/

mix_mix ★★★★★
()
Ответ на: комментарий от mix_mix

в тред заглянул еще один падаван по имени люк.
С чего ты взял, что это регрессия? Вывезешь ли ты ответ? Сможешь ли?

parrto ★
() автор топика
Ответ на: комментарий от parrto

С чего ты взял, что это регрессия?

Сам сказал, насяльника.

anonymous
()

чем конкретно и как оно компилилось? может, ему флаги оптимизации надо скормить дополнительно? хотя, не должно вроде быть так.

Iron_Bug ★★★★★
()
Ответ на: комментарий от Iron_Bug

https://gcc.godbolt.org/
юный падаван завез же инфы сверху.

может, ему флаги оптимизации надо скормить дополнительно?

вот может знаешь какие?
или как переговнокодить кусок кода? (без асм вставок естно)

parrto ★
() автор топика
Ответ на: комментарий от parrto

Абсолютно необоснованное использование лишнего регистра, абсолютно ненужная cmp, ты и сам всё в первом посте сказал. А вообще иди ты в жопу с таким отношением.

mix_mix ★★★★★
()
Ответ на: комментарий от Iron_Bug

Ну я вот компилю gcc 4.9.2 с -O3 - так и получается.

anonymous
()
Ответ на: комментарий от anonymous

Нет, но внеси, пусть пояснит по хардкору.

parrto ★
() автор топика
Ответ на: комментарий от parrto

а дефолтный -march=genric -O0, с которым gcc собирает по-умолчанию, рассчитан на скорость компиляции

anonymous
()
Ответ на: комментарий от anonymous

cmp и sub не архитектурно-зависимые же. И O1+ сам посмотри, что творит с кодом на gcc.godbolt.org

parrto ★
() автор топика
Ответ на: комментарий от beastie

parrto, может хватит материться, а?

Нормас, читаю и тащусь. Ящитаю, что мат при ответах по делу допустим, как минимум в тех разделах. Но только при ответах по делу.

Pavval ★★★★★
()
Ответ на: комментарий от parrto

а я всего лишь попугай, смекаешь?

хэх, молоток, добавлю тебе в коммент )))

yyk ★★★★★
()

Во, давай проще сделаем. Ты возьмёшь и напишешь, как тебе нужно, чтоб листинг foo выглядел. Только полностью, с printf и возвратом r.

mix_mix ★★★★★
()
Ответ на: комментарий от mix_mix

Че слился? все? Не вывез твой красный дипломчик?

Где в моём листинге cmp в foo? Или ты до сих пор понять не можешь, что не может он без ebx, до тех пор пока ты printf следом дёргать можешь.

А при чем тут твой листинг? Я привел пример. Но да, куда тебе с твоим эгоцентризмом до моего листинга. У ТЕБЯ ЖЕ СВОЙ ЕСТЬ.

parrto ★
() автор топика
Ответ на: комментарий от parrto

Ты привёл неполный пример. Я хочу, чтоб была полностью вся функция. У тебя претензии к кодогенератору — напиши, как нужно.

mix_mix ★★★★★
()
Ответ на: комментарий от mix_mix

У тебя претензии к кодогенератору — напиши, как нужно.

но погоди, это ты тут влез некастованный(«я вас не звал, идите на х*й») и сказал, что батька расставит все по местам:

Всего-то 9 проходов будет

я все жду результата твоих трудов

parrto ★
() автор топика
Ответ на: комментарий от parrto

Ты какой-то странный. Ты пишешь, что gcc выдаёт говно. ОК, положим. Напиши, как листинг foo должен выглядеть в твоём представлении в идеале. Это займёт около 10 строк и чуть больше минуты времени, не ленись. Разводить демагогию и кидаться оскорблениями это, конечно, круто, но там мы ничего не сделаем.

mix_mix ★★★★★
()
Ответ на: комментарий от mix_mix

Аргументы приходят в edi и esi, необходимо где-то хранить разность, т.к. эти же edi и esi нужны для printf.

Лол, без тебя всосал, я тут сонный и подумал, что ты отдаешь результат вычитания в принтф, my bad.
А ты с красным дипломом эту хрень не смог нормально объяснить, не вывез. Бывает. Красный диплом он ведь для того и нужен.

Напиши, как листинг

без cmp, да.
Ну так будут найдены участки кода с регрессией? Ты сможешь, я в тебя верю.

parrto ★
() автор топика
Ответ на: комментарий от mix_mix

ну ты «регрессию» ищешь. ок. Ведь разговор был про нее, а не твое неумение грамотно объяснять.
Я ведь не виноват, что краснодипломник запутался в своих же показаниях

Абсолютно необоснованное использование лишнего регистра,
Использование ebx здесь оправдано

parrto ★
() автор топика
Ответ на: комментарий от parrto

Ну если printf впереди не видеть, то ebx не нужен, конечно же, был. Я по твоему микро-листингу в пером посте смотрел.

mix_mix ★★★★★
()
Ответ на: комментарий от parrto

похоже, что «fastcall» работает только на i386. если указать функции __attribute__((fastcall)) или __attribute__((regparm(2))) и в компиляции дать флаг -m32, то параметры передаются через регистры.
для x86_64 это не поддерживается, кажись.

Iron_Bug ★★★★★
()
Ответ на: комментарий от parrto

Почему я до сих пор не вижу твоего репорта на багзиллле?

mix_mix ★★★★★
()
25 ноября 2015 г.
Вы не можете добавлять комментарии в эту тему: топик перемещен в архив.