Я пытаюсь создать кронштейну тест, который цикл по следующим инструкциям (в сборе), отдельно и в комбинации:указание точки поплавка по сборке ARM
- Целых дополнения
- Целых умножений
- точка Float дополнение
- точка Float умножения
Это мой код для целочисленных операций:
int additions_int(int n) {
int i, dummyValue = n;
__asm (
"MOV R0, #2\n"
"MOV R1, #6\n"
);
for (i = 0; i < n/LOOP_STEP; i++) {
__asm (
"ADD R0, R0, R1\n"
"ADD R0, R0, R1\n"
"ADD R0, R0, R1\n"
"ADD R0, R0, R1\n"
"ADD R0, R0, R1\n"
"ADD R0, R0, R1\n"
"ADD R0, R0, R1\n"
"ADD R0, R0, R1\n"
"ADD R0, R0, R1\n"
"ADD R0, R0, R1\n"
);
}
return dummyValue;
}
int multiplications_int(int n) {
int i, dummyValue=n;
__asm (
"MOV R0, #2\n"
"MOV R1, #6\n"
);
for (i = 0; i < n/LOOP_STEP; i++) {
__asm (
"MUL R0, R0, R1\n"
"MUL R0, R0, R1\n"
"MUL R0, R0, R1\n"
"MUL R0, R0, R1\n"
"MUL R0, R0, R1\n"
"MUL R0, R0, R1\n"
"MUL R0, R0, R1\n"
"MUL R0, R0, R1\n"
"MUL R0, R0, R1\n"
"MUL R0, R0, R1\n"
);
}
return dummyValue;
}
Проблема в операциях с плавающей точкой. Я проверил this documentation, и я судимый сделать что-то вроде этого:
float multiplications_fp(int n) {
int i;
float fn=n, dummyValue = fn;
for (i = 0; i < n/LOOP_STEP; i++) {
__asm (
"VMUL.F32 R0, R0, R1\n"
"VMUL.F32 R0, R0, R1\n"
"VMUL.F32 R0, R0, R1\n"
"VMUL.F32 R0, R0, R1\n"
"VMUL.F32 R0, R0, R1\n"
"VMUL.F32 R0, R0, R1\n"
"VMUL.F32 R0, R0, R1\n"
"VMUL.F32 R0, R0, R1\n"
"VMUL.F32 R0, R0, R1\n"
"VMUL.F32 R0, R0, R1\n"
);
}
return dummyValue;
}
float additions_fp(int n) {
int i;
float fn=n, dummyValue = fn;
for (i = 0; i < n/LOOP_STEP; i++) {
__asm (
"VADD.F32 R0, R0, R1\n"
"VADD.F32 R0, R0, R1\n"
"VADD.F32 R0, R0, R1\n"
"VADD.F32 R0, R0, R1\n"
"VADD.F32 R0, R0, R1\n"
"VADD.F32 R0, R0, R1\n"
"VADD.F32 R0, R0, R1\n"
"VADD.F32 R0, R0, R1\n"
"VADD.F32 R0, R0, R1\n"
"VADD.F32 R0, R0, R1\n"
);
}
return dummyValue;
}
Compiling с:
arm-linux-gnueabi-gcc -static -march=armv7-a microbenchmark_arm.c -o microbenchmark_arm
я получаю эту ошибку:
Error: selected processor does not support ARM mode `vmul.f32 R0,R0,R1'
Error: selected processor does not support ARM mode `vadd.f32 R0,R0,R1'
Может кто-нибудь сказать мне, что я делаю неправильно?
Может ли кто-нибудь показать мне пример добавления или умножения точки плавания для архитектуры ARM Cortex-A?
Как насчет первого чтения справочного руководства по архитектуре ARMv7A и спецификации вашего целевого процессора плюс руководство gcc? FYI: петли являются проблематичными, а не детерминированными. Сначала прочитайте, как правильно ориентироваться. – Olaf
Я вижу пример, написанный по-разному [здесь] (http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0491c/BABDEAGJ.html): 'VMUL.F32 d0, d0 , d0'. У меня нет опыта работы с ARM FP, поэтому не могу сказать, как именно исправить ваш синтаксис. – anatolyg
Кстати о «примере добавления или умножения точки плавания» вы можете увидеть пример, разобрав скомпилированный код. – anatolyg