skip to main content

kiesler.at

Alpha C Inline-Assembler
updated by rck, 2004-10-08

C war schon seit Anfang an eine sehr maschinennahe Programmiersprache. Dadurch entstanden einerseits Probleme wie Bufferoverflows ('effizientes' Speichermanagement). Andererseits wichtige Konzepte wie Inline-Assembler. Inline-Assembler ist oft nicht nur einfacher zu durchschauen, weil der C-Compiler das ,,Housekeeping'' (Adressen-Ausrichtung, etc.) macht. Sondern auch fast so effizient wie ,,pure Assembler''.
1 | 2 | 3 | 4 | 5 | 6

asmb optimiert

Etliche Evolutionsstufen sp�ter habe ich dann das folgende Programm ins Rennen geschickt:

unsigned long mem0s(unsigned char *s, unsigned long l) {
��������unsigned long r=0, i=0, mem_read;


��������while(i+8
����������������mem_read=(unsigned long)(((unsigned long*)(s*cool));

����������������asm volatile (

������������������������"not %1, %1 \n\t"
������������������������"ctpop %1, %1 \n\t"
������������������������"addq %0, %1 \n\t":

������������������������"=r"(r): "r"(mem_read)
����������������);

����������������i += 8;
��������}

��������while(i
����������������mem_read=s;

����������������asm volatile (

������������������������"not %1, %1 \n\t"
������������������������"and %1, 255, %1 \n\t"
������������������������"ctpop %1, %1 \n\t"
������������������������"addq %0, %1 \n\t":

������������������������"=r"(r): "r"(mem_read)
����������������);

����������������i += 1;
��������}

��������return r;
}

Nicht mehr besonders sch�n. Jedoch effizienter als sein Urahne zuvor! F�r Details zu Programmoptimierung sei auf die ausgezeichnete �bung Effiziente Programme von Anton Ertl verwiesen, die mir hier sicher den einen oder anderen Anhaltspunkt gab.

1 | 2 | 3 | 4 | 5 | 6



RSSComments - Make a comment
The comments are owned by the poster. We are not responsible for its content.
  • Eleganter

    Posted on 2004-05-22 01:25:06 By rck[110]

    static inline long
    __attribute__ ((unused))
    count_population (volatile long val)
    {
    long ret;

    __asm__ __volatile__ (
    "ctpop %1,%0\n\t"
    : "=&r"(ret)
    : "r"(val));

    return ret;
    }

    So meinte ich das im Informatikforum. Wof�r das attribute(unused) ist, wei� ich auch nicht genau, aber bei der glibc wird's immer so geschrieben, wird schon nicht so falsch sein.

    Und bei deinem ersten Beispiel w�rd ich das "not" weglassen und stattdessen bei den Eingangs-Constraints einfach ~a statt a schreiben - das gibt dem Compiler mehr Freiheit zu optimieren, wenn ihm danach ist.

    [Reply ]

RSSAll Articles
2008, 2007, 2006, 2005, 2004

What's Related

Documents

�bersetzerbau

Link Manager

�bersetzerbau
Programming

Article Manager

�bersetzerbau
Programming

FAQ

�bersetzerbau

Photo Albums

Programming

RSS News Feeds

Programming

Announcements

Programming

Web Pages

Programming

Latest Updates

AdministrativeTexts
updated by freddiemac1993, 2013-06-14
wiki

Re: adventures
created by brittdavis10, 2012-02-23 (1 rply, 3 views)
thread

Re: how to run phpwebsite...
created by alexander, 2011-08-25 (2 rpls, 3607 views)
thread

Re: Forum tags
created by HaroldFaragher, 2011-08-22 (3 rpls, 8488 views)
thread


Zu den KO2100 Foren