3.20.40 Параметры RISC-V
Для целевых платформ RISC-V определены следующие параметры командной строки:
-
-mbranch-cost=n -
Задать стоимость переходов примерно равной n инструкциям.
-
-mplt -mno-plt-
При генерации PIC-кода разрешить или запретить использование PLT. Игнорируется для кода, не являющегося PIC. По умолчанию используется -mplt.
-
-mabi=ABI-string -
Указать соглашение о вызовах для целых чисел и чисел с плавающей точкой. ABI-string содержит две части: размер целочисленных типов и регистры, используемые для типов с плавающей точкой. Например, ‘-march=rv64ifd -mabi=lp64d’ означает, что ‘long’ и указатели имеют разрядность 64 бита (при этом ‘int’ неявно определяется как 32-разрядный), а значения с плавающей точкой шириной до 64 бит передаются в регистрах F. В отличие от этого, ‘-march=rv64ifd -mabi=lp64f’ по-прежнему позволяет компилятору генерировать код, использующий расширения F и D, но разрешает передавать в регистрах только значения с плавающей точкой длиной до 32 бит; а ‘-march=rv64ifd -mabi=lp64’ означает, что аргументы с плавающей точкой в регистрах передаваться не будут.
Значение этого аргумента по умолчанию зависит от системы; пользователям, которым требуется конкретное соглашение о вызовах, следует указать его явно. Допустимые соглашения о вызовах: ‘ilp32’, ‘ilp32f’, ‘ilp32d’, ‘lp64’, ‘lp64f’ и ‘lp64d’. Некоторые соглашения о вызовах невозможно реализовать на определённых ISA: например, ‘-march=rv32if -mabi=ilp32d’ недопустим, поскольку ABI требует передавать 64-разрядные значения в регистрах F, ширина которых составляет всего 32 бита. Существуют также ABI ‘ilp32e’, который можно использовать только с архитектурой ‘rv32e’, и ABI ‘lp64e’, который можно использовать только с ‘rv64e’. Эти ABI в настоящее время недостаточно хорошо специфицированы и могут измениться.
-
-mfdiv -mno-fdiv-
Использовать или не использовать аппаратные инструкции деления и извлечения квадратного корня для чисел с плавающей точкой. Для этого требуются расширения F или D, обеспечивающие регистры для чисел с плавающей точкой. По умолчанию они используются, если указанная архитектура поддерживает эти инструкции.
-
-mfence-tso -mno-fence-tso-
Использовать или не использовать инструкцию ‘fence.tso’, не реализованную на некоторых процессорах (в том числе процессорах T-Head). Если инструкция ‘fence.tso’ недоступна, вместо неё используется более строгий барьер.
-
-mdiv -mno-div-
Использовать или не использовать аппаратные инструкции целочисленного деления. Для этого требуется расширение M. По умолчанию они используются, если указанная архитектура поддерживает эти инструкции.
-
-misa-spec=ISA-spec-string -
Указать версию спецификации непривилегированной ISA RISC-V (ранее называвшейся ISA пользовательского уровня), которой должен соответствовать генерируемый код. Возможные значения ISA-spec-string:
2.2Создавать код, соответствующий версии 2.2.
20190608Создавать код, соответствующий версии 20190608.
20191213Создавать код, соответствующий версии 20191213.
По умолчанию используется -misa-spec=20191213, если только GCC не был сконфигурирован с параметром --with-isa-spec=, задающим другую версию по умолчанию.
-
-march=ISA-string -
Генерировать код для указанной ISA RISC-V (например, ‘rv64im’). Строки ISA должны быть записаны строчными буквами. Примеры: ‘rv64i’, ‘rv32g’, ‘rv32e’ и ‘rv32imaf’. Кроме того, для вывода списка всех поддерживаемых расширений допускается специальное значение help (-march=help).
Синтаксис строки ISA определяется следующим образом:
The string must start with ‘rv32’ or ‘rv64’, followed by‘i’, ‘e’ или ‘g’, именуемая базовой ISA.
The subsequent part of the string is a list of extension names. Extensionназвания делятся на многобуквенные (например, ‘zba’) и однобуквенные (например, ‘v’). Однобуквенные расширения могут записываться подряд, а многобуквенные должны разделяться символами подчёркивания.
An underscore can appear anywhere after the base ISA. It has no specificне влияет на работу, но используется для повышения удобочитаемости и может служить разделителем.
Extension names may include an optional version number, following theсинтаксис ‘<major>p<minor>’ или ‘<major>’ (например, ‘m2p1’ или ‘m2’).
Поддерживаемые расширения перечислены ниже:
Название расширения Поддерживаемая версия Описание i 2.0, 2.1 Базовое целочисленное расширение. e 2.0 Урезанное базовое целочисленное расширение. g - Базовое расширение для вычислений общего назначения; ‘g’ разворачивается в ‘i’, ‘m’, ‘a’, ‘f’, ‘d’, ‘zicsr’ и ‘zifencei’. m 2.0 Расширение умножения и деления целых чисел. a 2.0, 2.1 Атомарное расширение. f 2.0, 2.2 Расширение для чисел с плавающей точкой одинарной точности. d 2.0, 2.2 Расширение для чисел с плавающей точкой двойной точности. c 2.0 Расширение сжатых инструкций. h 1.0 Расширение гипервизора. v 1.0 Векторное расширение. zicsr 2.0 Расширение для доступа к регистрам управления и состояния. zifencei 2.0 Расширение для барьера выборки инструкций. zicond 1.0 Расширение условных операций над целыми числами. za64rs 1.0 Размер набора резервирования — 64 байта. za128rs 1.0 Размер набора резервирования — 128 байт. zawrs 1.0 Расширение ожидания набора резервирования. zba 1.0 Расширение вычисления адресов. zbb 1.0 Базовое расширение манипуляций с битами. zbc 1.0 Расширение безпереносного умножения. zbs 1.0 Расширение операций с отдельными битами. zfinx 1.0 Расширение для чисел с плавающей точкой одинарной точности в целочисленных регистрах. zdinx 1.0 Расширение для чисел с плавающей точкой двойной точности в целочисленных регистрах. zhinx 1.0 Расширение для чисел с плавающей точкой половинной точности в целочисленных регистрах. zhinxmin 1.0 Минимальное расширение для чисел с плавающей точкой половинной точности в целочисленных регистрах. zbkb 1.0 Криптографическое расширение манипуляций с битами. zbkc 1.0 Криптографическое расширение безпереносного умножения. zbkx 1.0 Криптографическое расширение перестановок с использованием кроссбара. zkne 1.0 Расширение шифрования AES. zknd 1.0 Расширение расшифрования AES. zknh 1.0 Расширение хеш-функций. zkr 1.0 Расширение источника энтропии. zksed 1.0 Расширение блочного шифра SM4. zksh 1.0 Расширение хеш-функции SM3. zkt 1.0 Расширение для выполнения с независимой от данных задержкой. zk 1.0 Стандартное расширение скалярной криптографии. zkn 1.0 Расширение набора алгоритмов NIST. zks 1.0 Расширение набора алгоритмов ShangMi. zihintntl 1.0 Расширение подсказок о невременной локальности. zihintpause 1.0 Расширение подсказки паузы. zicboz 1.0 Расширение обнуления блоков кэша. zicbom 1.0 Расширение управления блоками кэша. zicbop 1.0 Расширение предварительной выборки блоков кэша. zic64b 1.0 Размер блока кэша составляет 64 байта. ziccamoa 1.0 Основная память поддерживает все атомарные операции расширения A. ziccif 1.0 Основная память поддерживает выборку инструкций с требованием атомарности. zicclsm 1.0 Основная память поддерживает невыровненные загрузки и сохранения. ziccrse 1.0 Основная память обеспечивает продвижение вперёд для последовательностей LR/SC. zicntr 2.0 Стандартное расширение базовых счётчиков и таймеров. zihpm 2.0 Стандартное расширение аппаратных счётчиков производительности. ztso 1.0 Расширение полного упорядочивания операций записи. zve32x 1.0 Векторные расширения для встроенных процессоров. zve32f 1.0 Векторные расширения для встроенных процессоров. zve64x 1.0 Векторные расширения для встроенных процессоров. zve64f 1.0 Векторные расширения для встроенных процессоров. zve64d 1.0 Векторные расширения для встроенных процессоров. zvl32b 1.0 Стандартные расширения минимальной длины вектора zvl64b 1.0 Стандартные расширения минимальной длины вектора zvl128b 1.0 Стандартные расширения минимальной длины вектора zvl256b 1.0 Стандартные расширения минимальной длины вектора zvl512b 1.0 Стандартные расширения минимальной длины вектора zvl1024b 1.0 Стандартные расширения минимальной длины вектора zvl2048b 1.0 Стандартные расширения минимальной длины вектора zvl4096b 1.0 Стандартные расширения минимальной длины вектора zvbb 1.0 Базовое векторное расширение манипуляций с битами. zvbc 1.0 Векторное расширение безпереносного умножения. zvkb 1.0 Векторное криптографическое расширение манипуляций с битами. zvkg 1.0 Векторное расширение GCM/GMAC. zvkned 1.0 Векторное расширение блочного шифра AES. zvknha 1.0 Векторное расширение криптографического хеширования SHA-2. zvknhb 1.0 Векторное расширение криптографического хеширования SHA-2. zvksed 1.0 Векторное расширение блочного шифра SM4. zvksh 1.0 Векторное расширение криптографического хеширования SM3. zvkn 1.0 Векторное расширение набора алгоритмов NIST; ‘zvkn’ разворачивается в ‘zvkned’, ‘zvknhb’, ‘zvkb’ и ‘zvkt’. zvknc 1.0 Векторное расширение набора алгоритмов NIST с безпереносным умножением; ‘zvknc’ разворачивается в ‘zvkn’ и ‘zvbc’. zvkng 1.0 Векторное расширение набора алгоритмов NIST с GCM; ‘zvkng’ разворачивается в ‘zvkn’ и ‘zvkg’. zvks 1.0 Векторное расширение набора алгоритмов ShangMi; ‘zvks’ разворачивается в ‘zvksed’, ‘zvksh’, ‘zvkb’ и ‘zvkt’. zvksc 1.0 Векторное расширение набора алгоритмов ShangMi с безпереносным умножением; ‘zvksc’ разворачивается в ‘zvks’ и ‘zvbc’. zvksg 1.0 Векторное расширение набора алгоритмов ShangMi с GCM; ‘zvksg’ разворачивается в ‘zvks’ и ‘zvkg’. zvkt 1.0 Векторное расширение для выполнения с независимой от данных задержкой. zfh 1.0 Расширение для чисел с плавающей точкой половинной точности. zfhmin 1.0 Минимальное расширение для чисел с плавающей точкой половинной точности. zvfh 1.0 Векторное расширение для чисел с плавающей точкой половинной точности. zvfhmin 1.0 Минимальное векторное расширение для чисел с плавающей точкой половинной точности. zvfbfmin 1.0 Векторное расширение преобразования BF16. zfa 1.0 Дополнительное расширение для чисел с плавающей точкой. zmmul 1.0 Расширение умножения целых чисел. zca 1.0 Расширение сжатых целочисленных инструкций. zcf 1.0 Расширение сжатых загрузок и сохранений чисел с плавающей точкой одинарной точности. zcd 1.0 Расширение сжатых загрузок и сохранений чисел с плавающей точкой двойной точности. zcb 1.0 Расширение простых сжатых инструкций. zce 1.0 Расширения сжатых инструкций для встроенных процессоров. zcmp 1.0 Расширение сжатых инструкций помещения и извлечения из стека. zcmt 1.0 Расширение инструкции перехода по таблице. smaia 1.0 Расширение усовершенствованной архитектуры прерываний. smepmp 1.0 Усовершенствования PMP для управления доступом к памяти и предотвращения выполнения в машинном режиме. smstateen 1.0 Расширение разрешения доступа к состоянию. ssaia 1.0 Расширение усовершенствованной архитектуры прерываний для режима супервизора. sscofpmf 1.0 Расширение подсчёта переполнений и фильтрации. ssstateen 1.0 Расширение разрешения доступа к состоянию для режима супервизора. sstc 1.0 Расширение прерываний таймера в режиме супервизора. svinval 1.0 Расширение детализированной инвалидации кэша трансляции адресов. svnapot 1.0 Расширение непрерывности трансляции NAPOT. svpbmt 1.0 Расширение типов памяти на основе страниц. xcvmac 1.0 Расширение Core-V умножения с накоплением. xcvalu 1.0 Расширение Core-V для различных операций ALU. xcvelw 1.0 Расширение Core-V загрузки слова события. xtheadba 1.0 Расширение T-Head для вычисления адресов. xtheadbb 1.0 Расширение T-Head для базовых манипуляций с битами. xtheadbs 1.0 Расширение T-Head для инструкций работы с отдельными битами. xtheadcmo 1.0 Расширение T-Head для операций управления кэшем. xtheadcondmov 1.0 Расширение T-Head для условного перемещения. xtheadfmemidx 1.0 Расширение T-Head для индексированных операций с памятью с регистрами чисел с плавающей точкой. xtheadfmv 1.0 Расширение T-Head для передачи старшего бита данных чисел с плавающей точкой двойной точности. xtheadint 1.0 Расширение T-Head для ускорения обработки прерываний. xtheadmac 1.0 Расширение T-Head умножения с накоплением. xtheadmemidx 1.0 Расширение T-Head для индексированных операций с памятью. xtheadmempair 1.0 Расширение T-Head для операций с памятью и двумя регистрами общего назначения. xtheadsync 1.0 Расширение T-Head для синхронизации многоядерных систем. xventanacondops 1.0 Расширение Ventana для условных операций над целыми числами. Если параметр -march= не указан, использовать значение параметра -mcpu.
Если не указаны ни -march, ни -mcpu=, значение этого аргумента по умолчанию зависит от системы; пользователям, которым нужны расширения конкретной архитектуры, следует указать их явно.
Если спецификации RISC-V определяют зависимость расширения от других расширений, GCC неявно добавит зависимые расширения в набор включённых расширений, если они не были добавлены явно.
-
-mcpu=processor-string -
Использовать архитектуру указанного процессора и оптимизировать вывод для него. Процессор указывается по имени. Допустимые значения этого параметра: ‘sifive-e20’, ‘sifive-e21’, ‘sifive-e24’, ‘sifive-e31’, ‘sifive-e34’, ‘sifive-e76’, ‘sifive-s21’, ‘sifive-s51’, ‘sifive-s54’, ‘sifive-s76’, ‘sifive-u54’, ‘sifive-u74’, ‘sifive-x280’, ‘sifive-xp450’, ‘sifive-x670’, ‘thead-c906’, ‘tt-ascalon-d8’, ‘xiangshan-nanhu’.
Обратите внимание, что -mcpu не переопределяет -march или -mtune.
-
-mtune=processor-string -
Оптимизировать вывод для указанного процессора, задав микроархитектуру или конкретное имя процессора. Допустимые значения этого параметра: ‘generic-ooo’, ‘rocket’, ‘sifive-3-series’, ‘sifive-5-series’, ‘sifive-7-series’, ‘size’, ‘sifive-p400-series’, ‘sifive-p600-series’ и все допустимые значения параметра -mcpu=.
Если параметр -mtune= не указан, используется значение параметра -mcpu; если не указаны оба параметра, по умолчанию используется ‘rocket’.
Значение ‘size’ не предназначено для конечных пользователей. Оно используется при указании -Os. Этот параметр переопределяет сведения о стоимости инструкций, задаваемые параметром -mtune=, но не переопределяет сведения о конвейере. Это помогает уменьшить размер кода, сохраняя при этом высокую производительность.
-
-mpreferred-stack-boundary=num -
Попытаться выровнять границу стека по границе, кратной 2 в степени num байт. Если параметр -mpreferred-stack-boundary не указан, по умолчанию используется значение 4 (16 байт, или 128 бит).
Предупреждение: При использовании этого параметра все модули, включая библиотеки, необходимо собирать с одинаковым значением. Сюда входят системные библиотеки и модули запуска.
-
-msmall-data-limit=n -
Помещать глобальные и статические данные размером меньше n байт в специальную секцию (на некоторых целевых платформах).
-
-msave-restore -mno-save-restore-
Использовать или не использовать более компактный, но медленный код пролога и эпилога, вызывающий библиотечные функции. По умолчанию используются быстрые встроенные прологи и эпилоги.
-
-mmovcc -mno-movcc-
Генерировать или не генерировать последовательности кода условного перемещения без ветвлений, в том числе для целевых платформ без специальных инструкций условных операций. Если этот параметр включён, при наличии выгоды создаются последовательности операций ALU с использованием базовых инструкций целочисленной ISA.
-
-minline-atomics -mno-inline-atomics-
Использовать или не использовать более компактный, но медленный код эмуляции атомарных операций над подсловами, вызывающий функции libatomic. По умолчанию используются быстрые встроенные атомарные операции над подсловами, не требующие libatomic.
-
-minline-strlen -mno-inline-strlen-
Пытаться или не пытаться встраивать вызовы strlen, если это возможно. Встраивание выполняется только при правильном выравнивании строки и наличии инструкций для ускоренной обработки. По умолчанию вызовы strlen не встраиваются.
-
-minline-strcmp -mno-inline-strcmp-
Пытаться или не пытаться встраивать вызовы strcmp, если это возможно. Встраивание выполняется только при правильном выравнивании строк и наличии инструкций для ускоренной обработки. По умолчанию вызовы strcmp не встраиваются.
Параметр --param riscv-strcmp-inline-limit=n задаёт максимальное число байт, сравниваемых встроенным кодом. Значение по умолчанию — 64.
-
-minline-strncmp -mno-inline-strncmp-
Пытаться или не пытаться встраивать вызовы strncmp, если это возможно. Встраивание выполняется только при правильном выравнивании строк и наличии инструкций для ускоренной обработки. По умолчанию вызовы strncmp не встраиваются.
Параметр --param riscv-strcmp-inline-limit=n задаёт максимальное число байт, сравниваемых встроенным кодом. Значение по умолчанию — 64.
-
-mshorten-memrefs -mno-shorten-memrefs-
Использовать или не использовать больше сжатых инструкций загрузки и сохранения, заменяя загрузку или сохранение по адресу «базовый регистр + большое смещение» новой загрузкой или сохранением по адресу «новый базовый регистр + малое смещение». Если новый базовый регистр окажется сжатым регистром, новую загрузку или сохранение можно будет сжать. В настоящее время применяется только к 32-разрядным целочисленным загрузкам и сохранениям.
-
-mstrict-align -mno-strict-align-
Не генерировать или генерировать невыровненные обращения к памяти. Значение по умолчанию зависит от того, поддерживает ли процессор, для которого выполняется оптимизация, быстрый доступ к невыровненным данным.
-
-mscalar-strict-align -mno-scalar-strict-align-
Не генерировать или генерировать невыровненные обращения к памяти. Значение по умолчанию зависит от того, поддерживает ли процессор, для которого выполняется оптимизация, быстрый доступ к невыровненным данным. Это псевдоним параметра -mstrict-align.
-
-mvector-strict-align -mno-vector-strict-align-
Не генерировать или генерировать невыровненные векторные обращения к памяти. По умолчанию параметр выключен, если только процессор, для которого выполняется оптимизация, явно не поддерживает невыровненный доступ к элементам вектора.
-
-mcmodel=medlow -
Генерировать код для модели кода medium-low. Программа и её статически определённые символы должны находиться в пределах одного диапазона адресов размером 2 ГиБ и в диапазоне абсолютных адресов от −2 ГиБ до +2 ГиБ. Программы могут компоновываться статически или динамически. Эта модель кода используется по умолчанию, если только GCC не был сконфигурирован с параметром --with-cmodel=, задающим другую модель кода по умолчанию.
-
-mcmodel=medany -
Генерировать код для модели кода medium-any. Программа и её статически определённые символы должны находиться в пределах любого одного диапазона адресов размером 2 ГиБ. Программы могут компоновываться статически или динамически.
Код, сгенерированный моделью medium-any, является позиционно-независимым, но его корректная работа при компоновке в позиционно-независимые исполняемые файлы или библиотеки не гарантируется.
-
-mcmodel=large -
Генерировать код для большой модели кода, не накладывающей ограничений на размер и размещение символов.
-mexplicit-relocs-mno-exlicit-relocs-
Использовать или не использовать операторы перемещения ассемблера при работе с символьными адресами. В качестве альтернативы можно использовать макросы ассемблера, что может ограничить оптимизацию.
-
-mrelax -mno-relax-
Использовать возможности оптимизации компоновщика для уменьшения числа инструкций, необходимых для формирования адресов символов. По умолчанию эти возможности используются.
-
-mriscv-attribute -mno-riscv-attribute-
Добавлять (не добавлять) атрибут RISC-V для записи дополнительной информации в объекты ELF. Для использования этой возможности требуется binutils версии не ниже 2.32.
-
-mcsr-check -mno-csr-check-
Включить или отключить проверку CSR.
-
-malign-data=type -
Управлять выравниванием переменных и констант типов массива, структуры или объединения, выполняемым GCC. Допустимые значения type: ‘xlen’ — использовать ширину регистра x в качестве значения выравнивания; ‘natural’ — использовать естественное выравнивание. По умолчанию используется ‘xlen’.
-
-mbig-endian -
Генерировать код с порядком байтов от старшего к младшему. Это значение используется по умолчанию, если GCC настроен для целевой платформы ‘riscv64be-*-*’ или ‘riscv32be-*-*’.
-
-mlittle-endian -
Генерировать код с порядком байтов от младшего к старшему. Это значение используется по умолчанию, если GCC настроен для целевой платформы ‘riscv64-*-*’ или ‘riscv32-*-*’, но не для ‘riscv64be-*-*’ или ‘riscv32be-*-*’.
-
-mstack-protector-guard=guard -mstack-protector-guard-reg=reg-mstack-protector-guard-offset=offset-
Сгенерировать код защиты стека с использованием canary в guard. Поддерживаются расположения ‘global’ для глобального canary и ‘tls’ для canary в блоке TLS, отдельного для каждого потока.
При выборе последнего варианта параметры -mstack-protector-guard-reg=reg и -mstack-protector-guard-offset=offset дополнительно указывают, какой регистр использовать в качестве базового для чтения canary и по какому смещению относительно этого базового регистра его читать. Регистр и смещение по умолчанию не заданы, поскольку эта возможность предназначена исключительно для использования в ядре Linux.
-
-mtls-dialect=desc -
Использовать дескрипторы TLS в качестве механизма локального хранилища потоков для динамического доступа к переменным TLS.
-
-mtls-dialect=trad Использовать традиционный TLS в качестве механизма локального хранилища потоков для динамического доступа к переменным TLS. Это значение используется по умолчанию.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-15.3.0/gcc/RISC_002dV-Options.html