3.20.23 Параметры LoongArch
Для целей LoongArch определены следующие параметры командной строки:
-
-march=arch-type -
Генерировать инструкции для типа машины arch-type. Параметр -march=arch-type позволяет GCC генерировать код, который может вообще не работать на процессорах, отличных от указанного.
Для arch-type доступны следующие значения:
- ‘native’
Тип локального процессора, определённый нативным компилятором.
- ‘loongarch64’
Универсальный 64-разрядный процессор LoongArch.
- ‘la464’
Процессор на базе LoongArch LA464 с поддержкой LSX и LASX.
- ‘la664’
Процессор на базе LoongArch LA664 с поддержкой LSX, LASX и всех инструкций LoongArch v1.1.
- ‘la64v1.0’
Версия ISA LoongArch64 1.0.
- ‘la64v1.1’
Версия ISA LoongArch64 1.1.
Дополнительные сведения о версиях ISA LoongArch доступны по адресу https://github.com/loongson/la-toolchain-conventions.
-
-mtune=tune-type -
Оптимизировать генерируемый код для указанного целевого процессора.
Для tune-type доступны следующие значения:
- ‘native’
Тип локального процессора, определённый нативным компилятором.
- ‘generic’
Универсальный процессор LoongArch.
- ‘loongarch64’
Универсальный 64-разрядный процессор LoongArch.
- ‘la464’
Ядро LoongArch LA464.
- ‘la664’
Ядро LoongArch LA664.
-
-mabi=base-abi-type -
Генерировать код для указанного соглашения о вызовах. base-abi-type может принимать одно из следующих значений:
- ‘lp64d’
Для передачи параметров используются 64-разрядные регистры общего назначения и 32/64-разрядные регистры с плавающей точкой. Модель данных — LP64, в которой ‘int’ имеет размер 32 бита, а ‘long int’ и указатели — 64 бита.
- ‘lp64f’
Для передачи параметров используются 64-разрядные регистры общего назначения и 32-разрядные регистры с плавающей точкой. Модель данных — LP64, в которой ‘int’ имеет размер 32 бита, а ‘long int’ и указатели — 64 бита.
- ‘lp64s’
Для передачи параметров используются 64-разрядные регистры общего назначения, регистры с плавающей точкой не используются. Модель данных — LP64, в которой ‘int’ имеет размер 32 бита, а ‘long int’ и указатели — 64 бита.
-
-mfpu=fpu-type -
Генерировать код для указанного типа FPU, который может принимать одно из следующих значений:
- ‘64’
Разрешить использование аппаратных инструкций с плавающей точкой для операций с 32- и 64-разрядными числами.
- ‘32’
Разрешить использование аппаратных инструкций с плавающей точкой для операций с 32-разрядными числами.
- ‘none’
- ‘0’
Запретить использование аппаратных инструкций с плавающей точкой.
-
-msimd=simd-type -
Разрешить генерацию инструкций LoongArch SIMD для векторизации и встроенных функций. Значение может быть одним из следующих:
- ‘lasx’
Разрешить генерацию инструкций из 256-разрядного расширения LoongArch Advanced SIMD (LASX) и 128-разрядного расширения LoongArch SIMD (LSX).
- ‘lsx’
Разрешить генерацию инструкций из 128-разрядного расширения LoongArch SIMD (LSX).
- ‘none’
Запретить генерацию инструкций LoongArch SIMD.
-
-msoft-float -
Принудительно установить -mfpu=none и запретить использование регистров с плавающей точкой для передачи параметров. Этот параметр может изменить целевой ABI.
-
-msingle-float -
Принудительно установить -mfpu=32 и разрешить использование 32-разрядных регистров с плавающей точкой для передачи параметров. Этот параметр может изменить целевой ABI.
-
-mdouble-float -
Принудительно установить -mfpu=64 и разрешить использование 32/64-разрядных регистров с плавающей точкой для передачи параметров. Этот параметр может изменить целевой ABI.
-
-mlasx -mno-lasx-mlsx-mno-lsx-
Постепенно изменять набор расширений SIMD (none / LSX / LASX), которые компилятор может использовать при генерации кода. Включение LASX с помощью mlasx автоматически включает LSX, а отключение LSX с помощью mno-lsx автоматически отключает LASX. Эти параметры, действующие только на уровне драйвера, применяются к итоговой конфигурации msimd и постепенно изменяют её в порядке появления в командной строке драйвера GCC, формируя итоговый / канонизированный параметр msimd, передаваемый непосредственно компилятору.
-
-mbranch-cost=n -
Задать стоимость переходов примерно равной n инструкциям.
-
-maddr-reg-reg-cost=n -
Задать стоимость ADDRESS_REG_REG равной значению, вычисленному по n.
-
-mcheck-zero-division -mno-check-zero-divison-
Вызывать (не вызывать) ловушку при делении целого числа на ноль. По умолчанию используется -mcheck-zero-division для -O0 или -Og и -mno-check-zero-division для остальных уровней оптимизации.
-
-mcond-move-int -mno-cond-move-int-
Условные перемещения целочисленных данных в регистрах общего назначения включены (отключены). По умолчанию используется -mcond-move-int.
-
-mcond-move-float -mno-cond-move-float-
Условные перемещения для регистров с плавающей точкой включены (отключены). По умолчанию используется -mcond-move-float.
-
-mmemcpy -mno-memcpy-
Принудительно использовать (не использовать)
memcpyдля перемещения блоков нетривиального размера. По умолчанию используется -mno-memcpy, что позволяет GCC встраивать большинство копирований с постоянным размером. Установка уровня оптимизации -Os также принудительно включает использованиеmemcpy, однако явно указанный -mno-memcpy может переопределить это поведение независимо от порядка этих параметров в командной строке. -
-mstrict-align -mno-strict-align-
Запретить или разрешить генерацию обращений к памяти, которые могут быть не выровнены по естественной границе объекта, как описано в спецификации архитектуры. По умолчанию используется -mno-strict-align.
-
-G num -
Размещать глобальные и статические данные размером менее num байт в секции малых данных. Значение по умолчанию — 0.
-
-mmax-inline-memcpy-size=n -
Встраивать все перемещения блоков (например, вызовы
memcpyили копирование структур) размером не более n байт. Значение n по умолчанию — 1024. -
-mcmodel=code-model -
Задать одну из следующих моделей кода:
- ‘tiny-static (ещё не реализована)’
- ‘tiny (ещё не реализована)’
- ‘normal’
-
Текстовый сегмент должен находиться в пределах 128 МБ адресного пространства. Сегмент данных должен находиться в пределах 2 ГБ адресного пространства.
- ‘medium’
-
Текстовый сегмент и сегмент данных должны находиться в пределах 2 ГБ адресного пространства.
- ‘large (ещё не реализована)’
- ‘extreme’
В этом режиме размер сегмента кода и сегмента данных не ограничен. Параметр -mcmodel=extreme несовместим с -fplt и/или -mexplicit-relocs=none.
Модель кода по умолчанию —
normal. -mexplicit-relocs=style-
Задать, когда использовать операторы перемещения ассемблера при работе с символьными адресами. Альтернативой является использование макросов ассемблера, которые могут ограничить планирование инструкций, но позволяют выполнять релаксацию компоновщиком. При -mexplicit-relocs=none всегда используются макросы ассемблера, при -mexplicit-relocs=always всегда используются операторы перемещения ассемблера, а при -mexplicit-relocs=auto компилятор использует операторы перемещения там, где релаксация компоновщиком невозможна, чтобы улучшить качество кода, а в остальных случаях — макросы. Значение параметра по умолчанию определяется возможностями ассемблера, обнаруженными во время сборки GCC, и настройкой -mrelax: -mexplicit-relocs=none, если ассемблер вообще не поддерживает операторы перемещения; -mexplicit-relocs=always, если ассемблер поддерживает операторы перемещения, но -mrelax не включён; -mexplicit-relocs=auto, если ассемблер поддерживает операторы перемещения и включён -mrelax.
-
-mexplicit-relocs -
Псевдоним -mexplicit-relocs=always, оставленный для обратной совместимости.
-
-mno-explicit-relocs -
Псевдоним -mexplicit-relocs=none, оставленный для обратной совместимости.
-
-mdirect-extern-access -mno-direct-extern-access-
Не использовать или использовать GOT для доступа к внешним символам. По умолчанию используется -mno-direct-extern-access: GOT используется для внешних символов с видимостью по умолчанию, но не для других внешних символов.
При использовании -mdirect-extern-access GOT не используется, и адресация всех внешних символов выполняется относительно PC. Этот параметр подходит только для сред, в которых динамическая компоновка не выполняется, например для встроенного ПО, ядер ОС и исполняемых файлов, скомпонованных с помощью -static или -static-pie. -mdirect-extern-access несовместим с -fPIC и -fpic.
-
-mrelax -mno-relax-
Использовать (не использовать) возможности релаксации компоновщика. Если включён параметр -mpass-mrelax-to-as, этот параметр также передаётся ассемблеру. Значение по умолчанию определяется во время сборки GCC путём проверки поддержки соответствующих возможностей ассемблером: -mrelax, если ассемблер поддерживает и параметр -mrelax, и релаксацию условных переходов (последняя необходима, иначе директивы
.alignи условные инструкции перехода в выводимом GCC ассемблерном коде могут быть отклонены ассемблером из-за переполнения перемещения); в противном случае используется -mno-relax. -
-mpass-mrelax-to-as -mno-pass-mrelax-to-as-
Передавать (не передавать) ассемблеру параметр -mrelax или -mno-relax. Значение по умолчанию определяется во время сборки GCC путём проверки поддержки соответствующих возможностей ассемблером: -mpass-mrelax-to-as, если ассемблер поддерживает параметр -mrelax; в противном случае — -mno-pass-mrelax-to-as. Этот параметр в основном полезен для отладки или взаимодействия с ассемблерами, отличными от использовавшегося во время сборки.
-
-mrecip -
Этот параметр разрешает использовать инструкции оценки обратной величины и оценки обратного квадратного корня с дополнительными шагами Ньютона — Рафсона для повышения точности вместо выполнения деления либо вычисления квадратного корня и деления для аргументов с плавающей точкой. Эти инструкции генерируются только при включённых параметрах -funsafe-math-optimizations, -ffinite-math-only и -fno-trapping-math. По умолчанию этот параметр выключен. Перед его использованием необходимо убедиться, что целевой процессор поддерживает инструкции frecipe и frsqrte. Обратите внимание: хотя пропускная способность этой последовательности выше, чем у нерекiproкной инструкции, её точность может снизиться на величину до 2 ulp (то есть обратная величина 1.0 равна 0.99999994).
-
-mrecip=opt -
Этот параметр определяет, какие инструкции оценки обратной величины можно использовать. opt — список параметров, разделённых запятыми; перед параметром можно поставить ‘!’, чтобы инвертировать его действие:
- ‘all’
-
Включить все инструкции оценки.
- ‘default’
-
Включить инструкции по умолчанию; эквивалентно -mrecip.
- ‘none’
-
Отключить все инструкции оценки; эквивалентно -mno-recip.
- ‘div’
-
Включить аппроксимацию скалярного деления.
- ‘vec-div’
-
Включить аппроксимацию векторизованного деления.
- ‘sqrt’
-
Включить аппроксимацию скалярного квадратного корня.
- ‘vec-sqrt’
-
Включить аппроксимацию векторизованного квадратного корня.
- ‘rsqrt’
-
Включить аппроксимацию скалярного обратного квадратного корня.
- ‘vec-rsqrt’
Включить аппроксимацию векторизованного обратного квадратного корня.
Например, -mrecip=all,!sqrt включает все аппроксимации обратной величины, кроме скалярного квадратного корня.
-
-mfrecipe -mno-frecipe-
Использовать (не использовать) инструкции
frecipe.{s/d}иfrsqrte.{s/d}. При сборке с параметром -march=la664 этот параметр включён по умолчанию. По умолчанию используется -mno-frecipe. -
-mdiv32 -mno-div32-
Использовать (не использовать) инструкции
div.w[u]иmod.w[u]с входными данными без расширения знака. При сборке с параметром -march=la664 этот параметр включён по умолчанию. По умолчанию используется -mno-div32. -
-mlam-bh -mno-lam-bh-
Использовать (не использовать) инструкции
am{swap/add}[_db].{b/h}. При сборке с параметром -march=la664 этот параметр включён по умолчанию. По умолчанию используется -mno-lam-bh. -
-mlamcas -mno-lamcas-
Использовать (не использовать) инструкции
amcas[_db].{b/h/w/d}. При сборке с параметром -march=la664 этот параметр включён по умолчанию. По умолчанию используется -mno-lamcas. -
-mld-seq-sa -mno-ld-seq-sa-
Нужен ли барьер загрузка-загрузка для одного адреса (
dbar 0x700). При сборке с параметром -march=la664 этот параметр включён по умолчанию. По умолчанию используется -mno-ld-seq-sa; барьер загрузка-загрузка необходим. -
-mtls-dialect=opt -
Этот параметр определяет, какой диалект TLS можно использовать для моделей TLS с общей и локальной динамической компоновкой.
- ‘trad’
-
Использовать традиционный TLS. Это значение используется по умолчанию.
- ‘desc’
Использовать дескрипторы TLS.
-
-mannotate-tablejump -mno-annotate-tablejump-
Создать секцию аннотаций
.discard.tablejump_annotateдля сопоставления инструкцииjirlс таблицей переходов, если таблица переходов используется для оптимизации оператораswitch. Некоторым внешним инструментам, например objtool системы сборки ядра Linux, необходима эта аннотация для анализа потока управления. По умолчанию используется -mno-annotate-tablejump. --param loongarch-vect-unroll-limit=n-
Векторизатор будет использовать доступные данные о настройке целевой платформы, чтобы определить, целесообразно ли разворачивать основной векторизованный цикл и насколько. Этот параметр задаёт верхнюю границу степени разворачивания основного цикла векторизатором. Значение по умолчанию — шесть.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-15.3.0/gcc/LoongArch-Options.html