Ich versuche, eine Funktion zu implementieren, die 32-Bit-Operand mit 256-Bit-Operand in ARM-Assembly auf ARM Cortex-a8 multipliziert. Das Problem ist, dass mir die Register ausgehen und ich keine Ahnung habe, wie ich hier die Anzahl der verwendeten Register reduzieren kann. Hier ist meine Funktion:ARM-Assembly: kann ein Register in der Klasse 'GENERAL_REGS' beim Neuladen von 'asm' nicht finden
typedef struct UN_256fe{
uint32_t uint32[8];
}UN_256fe;
typedef struct UN_288bite{
uint32_t uint32[9];
}UN_288bite;
void multiply32x256(uint32_t A, UN_256fe* B, UN_288bite* res){
asm (
"umull r3, r4, %9, %10;\n\t"
"mov %0, r3; \n\t"/*res->uint32[0] = r3*/
"umull r3, r5, %9, %11;\n\t"
"adds r6, r3, r4; \n\t"/*res->uint32[1] = r3 + r4*/
"mov %1, r6; \n\t"
"umull r3, r4, %9, %12;\n\t"
"adcs r6, r5, r3; \n\t"
"mov %2, r6; \n\t"/*res->uint32[2] = r6*/
"umull r3, r5, %9, %13;\n\t"
"adcs r6, r3, r4; \n\t"
"mov %3, r6; \n\t"/*res->uint32[3] = r6*/
"umull r3, r4, %9, %14;\n\t"
"adcs r6, r3, r5; \n\t"
"mov %4, r6; \n\t"/*res->uint32[4] = r6*/
"umull r3, r5, %9, %15;\n\t"
"adcs r6, r3, r4; \n\t"
"mov %5, r6; \n\t"/*res->uint32[5] = r6*/
"umull r3, r4, %9, %16;\n\t"
"adcs r6, r3, r5; \n\t"
"mov %6, r6; \n\t"/*res->uint32[6] = r6*/
"umull r3, r5, %9, %17;\n\t"
"adcs r6, r3, r4; \n\t"
"mov %7, r6; \n\t"/*res->uint32[7] = r6*/
"adc r6, r5, #0 ; \n\t"
"mov %8, r6; \n\t"/*res->uint32[8] = r6*/
: "=r"(res->uint32[8]), "=r"(res->uint32[7]), "=r"(res->uint32[6]), "=r"(res->uint32[5]), "=r"(res->uint32[4]),
"=r"(res->uint32[3]), "=r"(res->uint32[2]), "=r"(res->uint32[1]), "=r"(res->uint32[0])
: "r"(A), "r"(B->uint32[7]), "r"(B->uint32[6]), "r"(B->uint32[5]),
"r"(B->uint32[4]), "r"(B->uint32[3]), "r"(B->uint32[2]), "r"(B->uint32[1]), "r"(B->uint32[0]), "r"(temp)
: "r3", "r4", "r5", "r6", "cc", "memory");
}
EDIT-1: ich meine clobber Liste aktualisiert, basierend auf dem ersten Kommentar, aber ich habe immer noch die gleichen Fehler
Ihre asm-Anweisung hat ein größeres Problem. Sie müssen alle Register, die Sie explizit in der Anweisung asm angegeben haben, zur Clobber-Liste hinzufügen (die auch "cc" enthalten muss). Jene Clobbers plus alle Register, die benötigt werden, um die Eingabe- und Ausgabeoperanden zu halten (die auch als früher Clobber markiert werden müssen), bedeuten, dass Sie viel mehr Register verwenden als ARM. Sie haben das Problem nur noch schlimmer bei Ihrem letzten Versuch gemacht. –
@RossRidge Gibt es eine Möglichkeit, dass ich eine andere Notation anstelle von "r" 'vor meinen Eingaben verwenden kann und die richtigen Ergebnisse bekomme? Ich meine etwas wie "g" oder "m" '? – A23149577
Sie brauchen wirklich eine Schleife [mit Iteration Count 8] als was Sie tun. Überdenken Sie: Wie würden Sie es tun, wenn Ihr Eingabevektor 20.000 Elemente enthält? Sie müssten reg für skalare 'A' Wert, reg für' B' ptr, reg für 'res' ptr, reg für Iteration zählen, und was auch immer Sie regs tun müssen, umull et. al [wahrscheinlich noch 4-6] auf jeder Schleifeniteration, so ist insgesamt ~ 10. So wie es ist, haben Sie keine Regs mit einer Vektorgröße von 2-3, geschweige denn 8. Um Ihren Vektoralgorithmus gerade zu machen, wie wäre es mit der Kodierung eines C Fnc, der das tut [dient auch als Referenz für Sie asm fnc]. –