Как создаются ловушки для исключений с плавающей запятой? - PullRequest
1 голос
/ 25 июня 2019

Я хочу знать, какой код и файлы в библиотеке glibc отвечают за создание прерываний для исключений с плавающей запятой, когда прерывания включены.

В настоящее время GCC для RISC-V не перехватывает исключения с плавающей запятой.Я заинтересован в добавлении этой функции.Итак, я смотрел, как эта функциональность реализована в GCC для x86.

Мне известно, что мы можем перехватывать сигналы, как описано в этом [вопросе] ( Перехват переполнения с плавающей запятой в C ), но я хочу узнать больше подробностей о том, как это работает.

Я просмотрел файлы в glibc / math, которые, по моему мнению, в той или иной форме отвечают за генерацию ловушек, таких как

fenv.h
feenablxcpt.c
fegetexpect.c
feupdateenv.c

и многие другие файлы, начинающиеся с fe.

Все эти файлы также присутствуют в glibc для RISC-V.Я не могу понять, как glibc для x86 может генерировать ловушки.

1 Ответ

3 голосов
/ 25 июня 2019

Эти ловушки обычно генерируются аппаратным обеспечением * на уровне архитектуры набора команд (ISA). В частности на x86-64.

Я хочу знать, какой код и файлы в библиотеке glibc отвечают за генерацию ловушек для исключений с плавающей запятой, когда ловушки включены.

Так что такого файла нет. Однако операционная система kernel (особенно с signal (7) -s в Linux ...) переводит ловушки в нечто другое.

Пожалуйста, прочитайте Операционные системы: Три легкие части для получения дополнительной информации. И детально изучите x86-64 набор инструкций.

Более знакомый пример - целочисленное деление на ноль. На большинстве аппаратных средств, которые производят машинную ловушку (или машину исключение ), обработанную ядром. На некоторых аппаратных средствах (IIRC, PowerPC ) он выдает -1 в результате и устанавливает некоторый бит в регистре состояния. Дальнейший машинный код может проверить этот бит. Я считаю, что компилятор GCC в некоторых случаях и с некоторыми отключенными оптимизациями 1038 * будет генерировать такой тест после каждого деления. Но это не обязательно.

Язык C (читай n1570 , который практически является стандартом C11) определил понятие неопределенное поведение , чтобы обрабатывать такие ситуации максимально быстро и просто. Прочитайте Lattner Что должен знать каждый программист C о неопределенном поведении blog.

Поскольку вы упоминаете RISC-V , прочитайте о философии RISC прошлого века и помните, что проектирование вышло из строя и * Процессоры 1057 * суперскалярные требуют больших инженерных усилий. Я предполагаю, что если вы инвестируете столько же НИОКР (что означает десятки миллиардов долларов США или евро), чем Intel - или, в меньшей степени, AMD - сделал на x86-64 в чип RISC-V, вы могли бы получить сопоставимые производительность для современных процессоров x86-64. Обратите внимание, что чипы SPARC или PowerPC (или, возможно, ARM) похожи на RISC, а их лучшие процессоры почти сопоставимы по производительности с чипами Intel, но, вероятно, в десять раз меньше инвестиций в НИОКР, чем Intel вкладывает в свои микропроцессоры.

...