Spec-Zone.ru › GCC 15

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API