Компилятор поддерживает обычные для С/С++ простые типы данных (табл.1), однако их реализация в объектном коде выполняется с учетом архитектуры процессоры, т.е. 32-разрядных регистров. Компилятор не поддерживает типы данных меньшие, чем адресуемая ячейка памяти процессора. Хотя это приводит к необычной эквивалентности размерности переменных типа short int, int, long int и char (все по 32 бита), но не противоречит стандарту ISO/IEC.
Таблица 1
Тип | Размер в битах | Результат, возвращаемый оператором sizeof |
int | 32 (ФЗ знаковый) | |
unsigned int | 32 (ФЗ беззнаковый) | |
long | 32 (ФЗ знаковый) | |
unsigned long | 32 (ФЗ беззнаковый) | |
char | 32 (ФЗ знаковый) | |
unsigned char | 32 (ФЗ беззнаковый) | |
short | 32 (ФЗ знаковый) | |
unsigned short | 32 (ФЗ беззнаковый) | |
pointer | ||
float | 32 (ПЗ) | |
double | 32 или 64 (ПЗ) | 1 или 2 (по умолчанию 1) |
long double | 64 (ПЗ) | |
fract | 32 (в С++ - ФЗ дробный знаковый, в С – эмуляция через ПЗ) |
Несколько слов следует сказать особо о представлении дробных операндов и операндов в формате с плавающей запятой (ПЗ). Тип данных float представляет собой 32-битовое значение в формате IEEE-1985. Тип double может быть либо 32-х, либо 64-битовым. Обработка 64-битовых ПЗ-данных выполняется с использованием программной эмуляции ПЗ-арифметики, что приводит к существенному снижению производительности вычислений. Поэтому более предпочтительным является использование данных в формате float или 32-битовых double, поскольку в этом случае обработка ведется в "родном" для ADSP формате.
|
|
Для обработки дробных данных в поддерживаемом компиляторе языка С++ типе fract (32-битовые ФЗ-числа в диапазоне [-1…1) должен быть подключен соответствующий класс путем использования заголовочного файла <fract>. Чтобы компилятор мог отличить константу в дробном ФЗ-формате от ПЗ-константы, она должна иметь суффикс "r", например 0.5r. При этом поддерживаются операции преобразования типов между дробным и целыми типами и между дробным и ПЗ-типами, а также стандартный набор арифметических операций: сложение, вычитание, умножение, сдвиги, сравнения.
Варианты оптимизации генерируемого программного кода при компиляции
Компилятор cc21k поддерживает следующие режимы оптимизации в порядке "возрастания степени оптимизации":
- "Debugging" – компилятор генерирует полную отладочную информацию с целью обеспечения возможности сопоставления исходного и дизассемблированного кода при отладке;
- "Default" – выполняется высокоуровневая оптимизация, такая как вставка функций, явно объявленных как inline;
- "Procedural Optimization" – компилятор выполняет более агрессивную оптимизацию в пределах каждой компилируемой процедуры, при этом некоторые отладочные возможности могут быть ограничены;
|
|
- "Interprocedural Optimization" – выполняется оптимизация в пределах всей компилируемой программы (проекта) дополнительно к внутримодульной оптимизации.
2.4. Расширения языка С/С++
Компилятор cc21k поддерживает ряд расширений стандарта ANSI C/C++. Эти расширения введены как с учетом архитектуры DSP-процессоров, так и для того, чтобы позволить программисту использовать некоторые возможности С++ при программировании на С.
К основным расширениям относится поддержка:
- inline-функций;
- вставок на ассемблере;
- двух пространств памяти pm и dm;
- явного указания сегментов для размещения данных и кода;
- булевских типов данных (bool, true, false);
- ограничения перекрытий указателей
и другие.