1

Баловался с CFLAGS, нашел вот что: gcc-4.5 включает флаг -msahf, если указать -march=native на Intel Atom N270, который вообще-то 32-разрядный.  Если -march=atom, то этот флаг не включается. Насколько я понял, немного погуглив на эту тему, этот флаг для 64-битных процессоров. Так зачем же gcc его включает?

 Консоль:

bobr bin # gcc -march=native -Q --help=target|grep enabled
  -m32                                [enabled]
  -m80387                             [enabled]
  -m96bit-long-double                 [enabled]
  -malign-stringops                   [enabled]
  -mfancy-math-387                    [enabled]
  -mfp-ret-in-387                     [enabled]
  -mfused-madd                        [enabled]
  -mglibc                             [enabled]
  -mhard-float                        [enabled]
  -mieee-fp                           [enabled]
  -mmovbe                             [enabled]
  -mno-sse4                           [enabled]
  -mpush-args                         [enabled]
  -mred-zone                          [enabled]
  -msahf                              [enabled]
  -mstackrealign                      [enabled]
  -mtls-direct-seg-refs               [enabled]

 Консоль:

bobr bin # gcc -march=atom -Q --help=target|grep enabled
  -m32                                [enabled]
  -m80387                             [enabled]
  -m96bit-long-double                 [enabled]
  -malign-stringops                   [enabled]
  -mfancy-math-387                    [enabled]
  -mfp-ret-in-387                     [enabled]
  -mfused-madd                        [enabled]
  -mglibc                             [enabled]
  -mhard-float                        [enabled]
  -mieee-fp                           [enabled]
  -mno-sse4                           [enabled]
  -mpush-args                         [enabled]
  -mred-zone                          [enabled]
  -mstackrealign                      [enabled]
  -mtls-direct-seg-refs               [enabled]

Йа тьомный эльф

2 (29.06.2010 09:36:26 отредактировано mycetophylax)

Тут почитал, ничего не понял  ag .

Эта опция позволяет использовать инструкцию SAHF в генерируемом 64битном коде...

SAHF - (Store AH register into register Flags)
Загрузка регистра флагов eFlags/Flags из регистра AH
Схема команды:  sahf
Назначение: запись содержимого регистра ah в младший байт регистра eflags/flags, в котором содержатся пять флагов cf, pf, af, zf и sf.
Алгоритм работы:
Команда загружает младший байт регистра eflags/flags содержимым регистра ah. В битах 7, 6, 4, 2 и 0 регистра ah должны, соответственно, содержаться новые значения флагов sf, zf, af, pf и cf.
Применение:
Эта команда используется совместно с командой lahf. Из-за того, что регистр флагов непосредственно недоступен, сочетание этих команд можно применять для анализа - и, возможно, изменения - состояния некоторых флагов в регистре eflags/flags. Содержимое старшей части регистра флагов не изменяется.

LAHF - (Load AH register from register Flags)
Загрузка регистра AH флагами из регистра eFlags/Flags
Схема команды:      lahf
Назначение: извлечение содержимого младшего байта регистра eflags/flags, в котором содержатся пять флагов: cf, pf, af, zf и sf.
Алгоритм работы:
команда загружает регистр ah содержимым младшего байта регистра eflags/flags.
Применение:
Из-за того, что регистр флагов непосредственно недоступен, команду lahf можно применять для анализа и последующего изменения командой sahf состояния некоторых флагов регистра eflags/flags.

eflags/flags (flag register) — регистр флагов. Разрядность eflags/flags — 32/16 бит. Отдельные биты данного регистра имеют определенное функциональное назначение и называются флагами. Младшая часть этого регистра полностью аналогична регистру flags для i8086.

Исходя из особенностей использования, флаги регистра eflags/flags можно разделить на три группы:

1. 8 флагов состояния. Эти флаги могут изменяться после выполнения машинных команд.
Флаги состояния регистра eflags отражают особенности результата исполнения арифметических или логических операций. Это дает возможность анализировать состояние вычислительного процесса и реагировать на него с помощью команд условных переходов и вызовов подпрограмм. В табл. 1 приведены флаги состояния и указано их назначение;
2. 1 флаг управления. Обозначается df (Directory Flag).
Он находится в 10-м бите регистра eflags и используется цепочечными командами. Значение флага df определяет направление поэлементной обработки в этих операциях: от начала строки к концу (df = 0) либо наоборот, от конца строки к ее началу (df = 1).
Для работы с флагом df существуют специальные команды: cld (снять флаг df) и std (установить флаг df).
Применение этих команд позволяет привести флаг df в соответствие с алгоритмом и обеспечить автоматическое увеличение или уменьшение счетчиков при выполнении операций со строками;
3. 5 системных флагов, управляющих вводом/выводом, маскируемыми прерываниями, отладкой, переключением между задачами и виртуальным режимом 8086.
Прикладным программам не рекомендуется модифицировать без необходимости эти флаги, так как в большинстве случаев это приведет к прерыванию работы программы.

3

mycetophylax пишет:

Тут почитал, ничего не понял  ag .

Там же читал, это и сбило с толку. Инструкция-то 64-битная, зачем ее использовать на 32-бит процессоре? А ведь, она зачем-то включена в -march=native для этого процессора. Я ее выключил. Может стоит включить?

Йа тьомный эльф