Перейти к содержанию
    

Инлайн ассемблер в ARMCLANG

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;
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 minutes ago, AHTOXA said:

Я что-то запутался, кейл или gcc? 

KEIL - это просто среда (IDE), поддерживает ДВА компилятора: старый архаичный v5 (legacy) и Arm Compiler 6, который с некоторых пор идет в комплекте с keil.

Поэтому на выбор там доступны ДВА встроенных компилятора.

v6 - это по сути GCC, но перепиленный или заново сделанный самой ARM

Без KEIL (т.е. standalone) это компилятор стоит денег, в составе KEIL- бесплатно, в смысле входит его в цену ))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Разве GCC не бесплатный?

9 минут назад, Forger сказал:

v6 - это по сути GCC, но перепиленный или заново сделанный самой ARM

По вашей же ссылке написано - основан на LLVM. Это другая альтернатива. :gamer1:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 minutes ago, ViKo said:

Это другая альтернатива. :gamer1:

имелся ввиду синтаксис всяких расширений, слизанный с GCC ))

что там внутри, не знаю, но коли платный, то действительно получается что это их компилятор с нуля, но совместимый с GCC

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 сейчас моду задаёт.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 minutes ago, ViKo said:

Остался при том мнении, что если вы присвоили const переменной значение при определении, то она имеет те же свойства, что и constexpr.

Не совсем - constexpr в плане замены define гораздо больше подходит, чем const.

Вообще, const использую только для строк, все остальное - constexpr, а где он еще не добрался, то остается define 

 

5 minutes ago, ViKo said:

Да, GCC сейчас моду задаёт.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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, вперёд)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ага, так и было. Компилятор выбрасывал. Вот такой "абракадаброй" добился, чтобы работало, как хочу (есть лишнее, потом выброшу). Проверял в симуляторе. За что Кейл и люблю.
 

__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". Зверюга.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, Forger said:

что там внутри, не знаю, но коли платный, то действительно получается что это их компилятор с нуля, но совместимый с GCC

Я понимаю, что мы в России живём, и знание лицензионных тонкостей тут э-э... не востребовано, но, всё-таки, бесплатный  и свободный - вещи разные.

Например, микрочип вполне легально берёт деньги за свой XC32, который, по сути, GCC (но при этом не сильно препятствует желающим собрать свой собственный XC32 забесплатно).

 

И, разумеется, компилятор с нуля сейчас никто не пишет. Даже АРМ. Это clang. Допиленный-улучшенный-сертифицированный, но...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 минут назад, esaulenka сказал:

И, разумеется, компилятор с нуля сейчас никто не пишет. Даже АРМ. Это clang. Допиленный-улучшенный-сертифицированный, но... 

Угу. А лицензия у clang - пермиссивная (что-то типа BSD), поэтому свои наработки можно обратно не отдавать и закрывать. Так что в этом плане с gcc разница существенная, и собрать свой собственный armclang не выйдет :-)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 minute ago, AHTOXA said:

собрать свой собственный armclang

Конкретно про этот случай мне Рабинович напел, но у арма на сайте написано, что они совместили замечательный компилятор шланг и их супер-оптимизированные библиотеки.

Так что, может быть, не сильно-то он и отличается.

 

Но, повторюсь, сам я не проверял - ни платную версию, ни бесплатную (я даже не знаю, умеют ли prebuilt версии с https://clang.llvm.org/ собирать под мелко-армы).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Про локальные метки я нашел только здесь.
https://stackoverflow.com/questions/3898435/labels-in-gcc-inline-assembly
Что так мало информации. Где учебник?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Учебник (gcc) здесь: https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html

Но там про локальные метки ни слова. Видимо, тайное знание :-)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Учебник я смотрел. Вот как может быть "тайное знание"? Это абсурд какой-то! 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это опенсорс, здесь так случается. В код добавили, а в документацию нет. Не нашлось человека, который бы этим занялся.

Или мы плохо искали. Возможно, это описано в документации на ассемблер.

----

Гы, нашёл мануал в удивительном месте: на сайте ST :-)

И там есть про локальные метки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...