AVR: Bitverschiebung möglich mit OR und EOR?

Gast #234740
Lesenswert?

Nein. EOR, OR und AND arbeiten bitweise, d.h. jedes Bit des ersten
Operanden wird mit dem entsprechenden Bit des zweiten Operanden
verknüpft. Diese Verknüpfung wirkt sich jeweils nur auf dieses eine Bit
aus, also sind Verschiebungen auf die Weise nicht möglich.
Gast #234741
Lesenswert?

Das habe ich befürchtet.
Dachte an die Möglichkeit, das man mit 3 EOR-Befehlen die Inhalte
zweier Register austauschen kann, hier im Wiki zu finden, und war der
Ansicht, das mit verschiedenen Bitmasken, je nach Anzahl der
Verschiebungen, zum Verschieben der Bits nutzbar zu machen.
Aber was nicht geht, geht nicht, wenn, dann wird es evtl. komplexer.

Vielen Dank für Deine Antwort!

MfG
Andi
Gast #234744
Lesenswert?

Daran ist nichts komplex, meinte das in Bezug von logischen
Verknüpfungen Bits zu verschieben wenn es überhaupt möglich wäre.
Im Moment sieht meine Bit-Schieberei so aus:

.def tb=r11
.def i=r24
.def j=r25

        sbrs    tb,2
        rjmp    DCL51
        swap    i
        mov     j,i
        andi    i,0x0f
        andi    j,0xf0
DCL51:  sbrs    tb,1
        rjmp    DCL52
        lsr     i
        ror     j
        lsr     i
        ror     j
DCL52:  sbrs    tb,0
        rjmp    DCL7
        lsr     i
        ror     j
DCL7:   .....

Komme damit auf mind. 9 Takte für 0 Bits bis 16 Takte für 7 Bits.
Mache ich eine 0-Prüfung hinzu ("tst tb", "breq ...") sind es 3
Takte bei 0 aber für alle anderen Möglichkeiten (1 bis 7) jeweils 2
Takte mehr, gar nicht gut.
Dachte, man könnte das vielleicht mit logischen Verknüpfungen noch ein
paar Takte schneller hinbekommen.
Hast Du noch Ideen?

MfG
Andi
Gast #234746
Lesenswert?

Habe gemeint, das man das erkennt.
Also:

In tb ist die Anzahl der Bits zum Verschieben.
In i das zu verschiebende Byte.
In j der "Auffangbehälter" der hinausgeschobenen Bits aus i.

.def tb=r11
.def i=r24
.def j=r25

        sbrs    tb,2    ;Wird mindestens 4 mal geschoben? (Bit 2 = 1).
        rjmp    DCL51
        swap    i       ;Dann 4 mal schieben per Nibble-Austausch.
        mov     j,i     ;Selbes Ergebnis in das Auffangregister.
        andi    i,0x0f  ;Im Ausgangsregister nur die unteren 4 Bits.
        andi    j,0xf0  ;Im Auffangregister nur die oberen 4 Bits.
DCL51:  sbrs    tb,1    ;Muß auch 2 mal geschoben werden? (Bit 1 = 1).
        rjmp    DCL52
        lsr     i       ;Dann 2 Bits über Register i und j schieben.
        ror     j
        lsr     i
        ror     j
DCL52:  sbrs    tb,0   ;Muß auch 1 mal geschoben werden? (Bit 1 = 1).
        rjmp    DCL7
        lsr     i      ;Dann 1 Bit über Register i und j schieben.
        ror     j
DCL7:   .....

Die Routine ist ein Teil zur Ausgabe von Grafiken (Fonts, Bitmaps) auf
jede X-Beliebige Pixelposition und wollte noch etwas optimieren.

MfG
Andi

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren