xvr 12 12 февраля, 2020 Опубликовано 12 февраля, 2020 · Жалоба 1 hour ago, ViKo said: Я от #define ухожу, где могу, цель такая. С++17 со всеми его красотами. xvr, а пример можете подкинуть. Сравнить с... Ну например вот (из Linux кернела) #define CRC32X(crc, value) __asm__("crc32x %w[c], %w[c], %x[v]":[c]"+r"(crc):[v]"r"(value)) #define CRC32W(crc, value) __asm__("crc32w %w[c], %w[c], %w[v]":[c]"+r"(crc):[v]"r"(value)) #define CRC32H(crc, value) __asm__("crc32h %w[c], %w[c], %w[v]":[c]"+r"(crc):[v]"r"(value)) #define CRC32B(crc, value) __asm__("crc32b %w[c], %w[c], %w[v]":[c]"+r"(crc):[v]"r"(value)) #define CRC32CX(crc, value) __asm__("crc32cx %w[c], %w[c], %x[v]":[c]"+r"(crc):[v]"r"(value)) #define CRC32CW(crc, value) __asm__("crc32cw %w[c], %w[c], %w[v]":[c]"+r"(crc):[v]"r"(value)) #define CRC32CH(crc, value) __asm__("crc32ch %w[c], %w[c], %w[v]":[c]"+r"(crc):[v]"r"(value)) #define CRC32CB(crc, value) __asm__("crc32cb %w[c], %w[c], %w[v]":[c]"+r"(crc):[v]"r"(value)) static u32 crc32_arm64_le_hw(u32 crc, const u8 *p, unsigned int len) { s64 length = len; while ((length -= sizeof(u64)) >= 0) { CRC32X(crc, get_unaligned_le64(p)); p += sizeof(u64); } /* The following is more efficient than the straight loop */ if (length & sizeof(u32)) { CRC32W(crc, get_unaligned_le32(p)); p += sizeof(u32); } if (length & sizeof(u16)) { CRC32H(crc, get_unaligned_le16(p)); p += sizeof(u16); } if (length & sizeof(u8)) CRC32B(crc, *p); return crc; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 12 февраля, 2020 Опубликовано 12 февраля, 2020 · Жалоба 10 minutes ago, AHTOXA said: Я что-то запутался, кейл или gcc? KEIL - это просто среда (IDE), поддерживает ДВА компилятора: старый архаичный v5 (legacy) и Arm Compiler 6, который с некоторых пор идет в комплекте с keil. Поэтому на выбор там доступны ДВА встроенных компилятора. v6 - это по сути GCC, но перепиленный или заново сделанный самой ARM Без KEIL (т.е. standalone) это компилятор стоит денег, в составе KEIL- бесплатно, в смысле входит его в цену )) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 12 февраля, 2020 Опубликовано 12 февраля, 2020 · Жалоба Разве GCC не бесплатный? 9 минут назад, Forger сказал: v6 - это по сути GCC, но перепиленный или заново сделанный самой ARM По вашей же ссылке написано - основан на LLVM. Это другая альтернатива. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 12 февраля, 2020 Опубликовано 12 февраля, 2020 · Жалоба 8 minutes ago, ViKo said: Это другая альтернатива. имелся ввиду синтаксис всяких расширений, слизанный с GCC )) что там внутри, не знаю, но коли платный, то действительно получается что это их компилятор с нуля, но совместимый с GCC Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 12 февраля, 2020 Опубликовано 12 февраля, 2020 · Жалоба 1 час назад, Forger сказал: Есть разница, и порой весьма существенная: https://stackoverflow.com/questions/13346879/const-vs-constexpr-on-variables https://habr.com/ru/post/228181/ constexpr это по сути #define, например, его смело можно использовать в параметрах шаблонов, поскольку это типичный compile-time объект Попытался понять, сколько хватило энергии. Остался при том мнении, что если вы присвоили const переменной значение при определении, то она имеет те же свойства, что и constexpr. 12 минут назад, Forger сказал: но совместимый с GCC Да, GCC сейчас моду задаёт. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 12 февраля, 2020 Опубликовано 12 февраля, 2020 · Жалоба 5 minutes ago, ViKo said: Остался при том мнении, что если вы присвоили const переменной значение при определении, то она имеет те же свойства, что и constexpr. Не совсем - constexpr в плане замены define гораздо больше подходит, чем const. Вообще, const использую только для строк, все остальное - constexpr, а где он еще не добрался, то остается define 5 minutes ago, ViKo said: Да, GCC сейчас моду задаёт. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 12 февраля, 2020 Опубликовано 12 февраля, 2020 · Жалоба 12 минут назад, ViKo сказал: Метка работает (во всяком случае, файл компилируется), если без volatile задать asm. Видимо, без volatile компилятор этот блок выбрасывает:) Вот как победить множественные метки: static inline uint32_t substract(uint32_t value, uint32_t count) { __asm__ __volatile__ ( "1: \n" " CMP %[cnt], #0 \n" " BEQ 2f \n" " SUBS %[val], #1 \n" " SUBS %[cnt], #1 \n" " CMP %[cnt], #0 \n" " B 1b \n" "2: \n" :[val]"+r" (value) /* output */ :[cnt]"r" (count) /* input */ :"memory" /* clobbers */ ); return value; } Метки должны состоять из номера (1, 2...), а в прыжке нужно указывать, вперёд или назад прыгать (1b - на метку 1, назад, 2f - на метку 2, вперёд) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 12 февраля, 2020 Опубликовано 12 февраля, 2020 · Жалоба Ага, так и было. Компилятор выбрасывал. Вот такой "абракадаброй" добился, чтобы работало, как хочу (есть лишнее, потом выброшу). Проверял в симуляторе. За что Кейл и люблю. __asm__ __volatile__ ( "1: // loop here \n\t" "SUBS %[res], %[res], #1 \n\t" // "SUBS r0, r0, #1 \n\t" "BNE 1b" // "BNE 0 \n\t" : [res] "+r" (qclk) /* result */ : [inp] "r" (qclk) : /* No clobbers */ ); Даже "1B" не принимает, требует "1b". Зверюга. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 12 февраля, 2020 Опубликовано 12 февраля, 2020 · Жалоба 2 hours ago, Forger said: что там внутри, не знаю, но коли платный, то действительно получается что это их компилятор с нуля, но совместимый с GCC Я понимаю, что мы в России живём, и знание лицензионных тонкостей тут э-э... не востребовано, но, всё-таки, бесплатный и свободный - вещи разные. Например, микрочип вполне легально берёт деньги за свой XC32, который, по сути, GCC (но при этом не сильно препятствует желающим собрать свой собственный XC32 забесплатно). И, разумеется, компилятор с нуля сейчас никто не пишет. Даже АРМ. Это clang. Допиленный-улучшенный-сертифицированный, но... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 12 февраля, 2020 Опубликовано 12 февраля, 2020 · Жалоба 7 минут назад, esaulenka сказал: И, разумеется, компилятор с нуля сейчас никто не пишет. Даже АРМ. Это clang. Допиленный-улучшенный-сертифицированный, но... Угу. А лицензия у clang - пермиссивная (что-то типа BSD), поэтому свои наработки можно обратно не отдавать и закрывать. Так что в этом плане с gcc разница существенная, и собрать свой собственный armclang не выйдет :-) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 12 февраля, 2020 Опубликовано 12 февраля, 2020 · Жалоба 1 minute ago, AHTOXA said: собрать свой собственный armclang Конкретно про этот случай мне Рабинович напел, но у арма на сайте написано, что они совместили замечательный компилятор шланг и их супер-оптимизированные библиотеки. Так что, может быть, не сильно-то он и отличается. Но, повторюсь, сам я не проверял - ни платную версию, ни бесплатную (я даже не знаю, умеют ли prebuilt версии с https://clang.llvm.org/ собирать под мелко-армы). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 12 февраля, 2020 Опубликовано 12 февраля, 2020 · Жалоба Про локальные метки я нашел только здесь.https://stackoverflow.com/questions/3898435/labels-in-gcc-inline-assembly Что так мало информации. Где учебник? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 12 февраля, 2020 Опубликовано 12 февраля, 2020 · Жалоба Учебник (gcc) здесь: https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html Но там про локальные метки ни слова. Видимо, тайное знание :-) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 12 февраля, 2020 Опубликовано 12 февраля, 2020 · Жалоба Учебник я смотрел. Вот как может быть "тайное знание"? Это абсурд какой-то! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 13 февраля, 2020 Опубликовано 13 февраля, 2020 · Жалоба Это опенсорс, здесь так случается. В код добавили, а в документацию нет. Не нашлось человека, который бы этим занялся. Или мы плохо искали. Возможно, это описано в документации на ассемблер. ---- Гы, нашёл мануал в удивительном месте: на сайте ST :-) И там есть про локальные метки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться