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 г.
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.