Hallo zusammen!
Da ich einen Algorithmus programmiere, der verzweigt, wenn bei der Multiplikation von 2 uint32_t Zahlen ein Overflow eintritt, wollte ich dies möglichst effizient programmieren.
Daher habe ich mich fuer asm entschieden, damit ich die Prozessorflags benutzen kann.
Zum Testen habe ich ein kleines Programm geschrieben, dass einfach 2 Zahlen multipliziert (i,j) und wenn ein Overflow auftritt, re auf 1 setzt..
Hier nun mein Code:
Komischerweise gibt das Programm für re immer 0 aus, obwohl ein Overflow eintritt. Nun weiss ich nicht, ob mein asm Code einen Fehler beinhaltet oder ich etwas bei dem "inlining" flasch gemacht habe.
Getestet habe ich es auf FreeBSD und Linux mit gcc.
Würde mich über jeglich Tipss freuen.
Bis denn dann,
Mips
Da ich einen Algorithmus programmiere, der verzweigt, wenn bei der Multiplikation von 2 uint32_t Zahlen ein Overflow eintritt, wollte ich dies möglichst effizient programmieren.
Daher habe ich mich fuer asm entschieden, damit ich die Prozessorflags benutzen kann.
Zum Testen habe ich ein kleines Programm geschrieben, dass einfach 2 Zahlen multipliziert (i,j) und wenn ein Overflow auftritt, re auf 1 setzt..
Hier nun mein Code:
Code:
#include <stdio.h>
int main(void) {
unsigned int i = 0xfffffff1;
// unsigned int i = 0x01;
unsigned int j = 0x0A;
volatile unsigned int re = 0;
__asm__("leal (%2,%0), %0\n"
"jno ende\n"
"movl $1, %1\n"
"ende:\n"
:"=r" (j), "=r" (re)
:"r" (i), "r" (re), "r" (j)
:"0");
printf("%u %u\n",j, re);
return(0);
}
Komischerweise gibt das Programm für re immer 0 aus, obwohl ein Overflow eintritt. Nun weiss ich nicht, ob mein asm Code einen Fehler beinhaltet oder ich etwas bei dem "inlining" flasch gemacht habe.
Getestet habe ich es auf FreeBSD und Linux mit gcc.
Würde mich über jeglich Tipss freuen.
Bis denn dann,
Mips