Lassen sich Integer-Zahlen bitweise auslesen?

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Lassen sich Integer-Zahlen bitweise auslesen?

Beitrag von mschnell »

CPU-Quaeler hat geschrieben:Das ganze ist nun mit 32x AA bei einer Benchmark-Funktion ca. 12% langsamer, aber das ist auch logisch.
Das ist nut bei einem 32-Bit Programm logisch, bei einem 64-Bit Programm sollte es gleich sein (vermutlich funktioniert es dann auch ohne den "QWORD(1)" -Zusatz, weil eine "1" dann defaultmäßig ein int64 ist).

-Michael

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Re: Lassen sich Integer-Zahlen bitweise auslesen?

Beitrag von Euklid »

mschnell hat geschrieben:
CPU-Quaeler hat geschrieben:Das ganze ist nun mit 32x AA bei einer Benchmark-Funktion ca. 12% langsamer, aber das ist auch logisch.
Das ist nut bei einem 32-Bit Programm logisch, bei einem 64-Bit Programm sollte es gleich sein (vermutlich funktioniert es dann auch ohne den "QWORD(1)" -Zusatz, weil eine "1" dann defaultmäßig ein int64 ist).
Das Programm arbeitet auch dann ca. 12% langsamer, wenn es mit 64 Bits kompiliert wurde. Das könnte aber möglicherweise an der Speicheranbindung liegen? Theoretisch müssten sich in der selben Zeit ja doppelt so viele 32bit-Variablen wie 64bit-Variablen übertragen lassen?

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Lassen sich Integer-Zahlen bitweise auslesen?

Beitrag von mschnell »

CPU-Quaeler hat geschrieben:Das Programm arbeitet auch dann ca. 12% langsamer, wenn es mit 64 Bits kompiliert wurde. Das könnte aber möglicherweise an der Speicheranbindung liegen? Theoretisch müssten sich in der selben Zeit ja doppelt so viele 32bit-Variablen wie 64bit-Variablen übertragen lassen?
Zeig 'mal den Assembler-code von beiden Varianten !
-Michael

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Re: Lassen sich Integer-Zahlen bitweise auslesen?

Beitrag von Euklid »

mschnell hat geschrieben: Zeig 'mal den Assembler-code von beiden Varianten !

GetBit und SetBit im Umgang mit DWord:

Code: Alles auswählen

# GetBit:
.globl	UGRAPHCOM_TGRAPHCOM_$__GETBIT$LONGWORD$BYTE$$BOOLEAN
	.type	UGRAPHCOM_TGRAPHCOM_$__GETBIT$LONGWORD$BYTE$$BOOLEAN,@function
UGRAPHCOM_TGRAPHCOM_$__GETBIT$LONGWORD$BYTE$$BOOLEAN:
# Temps allocated between rsp+0 and rsp+0
# Var Value located in register esi
# Var Bit located in register cl
# Var $self located in register rdi
# Var $result located in register al
# [96] begin
	movb	%dl,%cl
# [97] Result := (Value and (1 shl Bit)) <> 0;
	movzbl	%cl,%ecx
	movl	$1,%eax
	shll	%cl,%eax
	andl	%esi,%eax
	andl	$4294967295,%eax
	testq	%rax,%rax
	setneb	%al
# [98] end;
	ret
.Le2:
	.size	UGRAPHCOM_TGRAPHCOM_$__GETBIT$LONGWORD$BYTE$$BOOLEAN, .Le2 - UGRAPHCOM_TGRAPHCOM_$__GETBIT$LONGWORD$BYTE$$BOOLEAN
 
.section .text
	.balign 8,0x90
 
# SetBit:
.globl	UGRAPHCOM_TGRAPHCOM_$__SETBIT$LONGWORD$BYTE$$LONGWORD
	.type	UGRAPHCOM_TGRAPHCOM_$__SETBIT$LONGWORD$BYTE$$LONGWORD,@function
UGRAPHCOM_TGRAPHCOM_$__SETBIT$LONGWORD$BYTE$$LONGWORD:
# Temps allocated between rsp+0 and rsp+0
# Var Value located in register esi
# Var Bit located in register cl
# Var $self located in register rdi
# Var $result located in register eax
# [103] begin
	movb	%dl,%cl
# [104] Result := Value or (1 shl Bit);
	movzbl	%cl,%ecx
	movl	$1,%eax
	shll	%cl,%eax
	movslq	%eax,%rax
	andl	$4294967295,%esi
	orq	%rsi,%rax
# [105] end;
	ret
.Le3:
	.size	UGRAPHCOM_TGRAPHCOM_$__SETBIT$LONGWORD$BYTE$$LONGWORD, .Le3 - UGRAPHCOM_TGRAPHCOM_$__SETBIT$LONGWORD$BYTE$$LONGWORD
 
.section .text
	.balign 8,0x90
GetBit und SetBit im Umgang mit QWord:

Code: Alles auswählen

# Zunächst der GetBit-Code:
.globl	UGRAPHCOM_TGRAPHCOM_$__GETBIT$QWORD$BYTE$$BOOLEAN
	.type	UGRAPHCOM_TGRAPHCOM_$__GETBIT$QWORD$BYTE$$BOOLEAN,@function
UGRAPHCOM_TGRAPHCOM_$__GETBIT$QWORD$BYTE$$BOOLEAN:
# Temps allocated between rsp+0 and rsp+0
# Var Value located in register rsi
# Var Bit located in register cl
# Var $self located in register rdi
# Var $result located in register al
# [96] begin
	movb	%dl,%cl
# [97] Result := (Value and (qword(1) shl Bit)) <> 0;
	movzbl	%cl,%ecx
	movq	$1,%rax
	shlq	%cl,%rax
	andq	%rsi,%rax
	testq	%rax,%rax
	setneb	%al
# [98] end;
	ret
.Le2:
	.size	UGRAPHCOM_TGRAPHCOM_$__GETBIT$QWORD$BYTE$$BOOLEAN, .Le2 - UGRAPHCOM_TGRAPHCOM_$__GETBIT$QWORD$BYTE$$BOOLEAN
 
.section .text
	.balign 8,0x90
 
# Nun der SetBit-Code:
.globl	UGRAPHCOM_TGRAPHCOM_$__SETBIT$QWORD$BYTE$$QWORD
	.type	UGRAPHCOM_TGRAPHCOM_$__SETBIT$QWORD$BYTE$$QWORD,@function
UGRAPHCOM_TGRAPHCOM_$__SETBIT$QWORD$BYTE$$QWORD:
# Temps allocated between rsp+0 and rsp+0
# Var Value located in register rsi
# Var Bit located in register cl
# Var $self located in register rdi
# Var $result located in register rax
# [103] begin
	movb	%dl,%cl
# [104] Result := Value or (qword(1) shl Bit);
	movzbl	%cl,%ecx
	movq	$1,%rax
	shlq	%cl,%rax
	orq	%rsi,%rax
# [105] end;
	ret
.Le3:
	.size	UGRAPHCOM_TGRAPHCOM_$__SETBIT$QWORD$BYTE$$QWORD, .Le3 - UGRAPHCOM_TGRAPHCOM_$__SETBIT$QWORD$BYTE$$QWORD
 
.section .text
	.balign 8,0x90
Im DWord-Code gibt es eine Zeile zusätzlich, im Fall von GetBit

Code: Alles auswählen

andl   $4294967295,%eax
wobei mir (mit meinen bescheidenen Assembler-Kenntnissen) der Sinn dieser Zeile nicht einleuchtet. Wird nicht mit

Code: Alles auswählen

andl   %esi,%eax
schon alles notwendige getan?

Die Zeilen wurden zu 64 bit kompiliert.
Wenn ich die DWord- und die QWord-Methode getrennt voneinander in einem Benchmark teste, kommen vergleichbare Zeiten bei raus.

Viele Grüße, Euklid

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Lassen sich Integer-Zahlen bitweise auslesen?

Beitrag von mschnell »

> wobei mir (mit meinen bescheidenen Assembler-Kenntnissen) der Sinn dieser Zeile nicht einleuchtet. Wird nicht mit

Mir auch nicht !

wäre bei dem Befehl nicht
andq 0x00000000FFFFFFFF,%rax
eigentlich richtig, weil doch die oberen 32 Bit von rax noch gar nicht definiert sind ?

Compiler Bug ?

Der Behehl
movzbl %cl,%ecx
im "richtigen" Code ist doch eigentlich auch überflüssig, ecx wird doch gar mehr verwendet ?!?!?

-Michael

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Re: Lassen sich Integer-Zahlen bitweise auslesen?

Beitrag von Euklid »

mschnell hat geschrieben: wäre bei dem Befehl nicht
andq 0x00000000FFFFFFFF,%rax
eigentlich richtig, weil doch die oberen 32 Bit von rax noch gar nicht definiert sind ?
Stimmt. Wahrscheinlich wird im 64bit-Modus $4294967295 durch 0x00000000FFFFFFFF im Hexadezimalen repräsentiert, dann macht die Zeile Sinn.
Der Behehl
movzbl %cl,%ecx
im "richtigen" Code ist doch eigentlich auch überflüssig, ecx wird doch gar mehr verwendet ?!?!?
hmmm. Gute Frage...

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Lassen sich Integer-Zahlen bitweise auslesen?

Beitrag von mschnell »

Ich würde das gerne selbst 'mal probieren. Wie hast Du den ASM-Code erzeugt ?
Ich habe im Moment keinen Rechner mit 64 Bit Linux laufen. Kann man auf einer 32 bit Maschine nach 64 Bit cross-compilieren ? (Es reicht ja hier ein Kommando-Zeilen FPC. )

Gruß,
-Michael

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Re: Lassen sich Integer-Zahlen bitweise auslesen?

Beitrag von Euklid »

mschnell hat geschrieben:Ich würde das gerne selbst 'mal probieren. Wie hast Du den ASM-Code erzeugt ?
Durch die Compiler-Anweisung -al
Ich habe im Moment keinen Rechner mit 64 Bit Linux laufen. Kann man auf einer 32 bit Maschine nach 64 Bit cross-compilieren ?
Müsste irgendwie gehen (?).

Gruß, Euklid

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Lassen sich Integer-Zahlen bitweise auslesen?

Beitrag von mschnell »

Euklid hat geschrieben:Müsste irgendwie gehen (?).
Vermutlich. habe ich aber bisher nicht 'rausbekommen. Ich vermute der 64-Bit Compiler ist ein eigenes Programm, das normalerweise für 64 Bit Maschinen übersetzt wird. Falls "offiziell" kein 32-Bit Binary für den 64-Bit Compiler zum Download existiert, müsste man es aus den Sourcen übersetzten. Die Sourcen muss man ja ohnehin haben, wenn man Lazarus installiert. also sollte ich alles da haben. Aber wie compiliert man den Compiler ? Es gibt bestimmt eine Anleitung im Netzt ... :) .

-Michael
Zuletzt geändert von mschnell am Mi 8. Jul 2009, 09:03, insgesamt 1-mal geändert.

creed steiger
Beiträge: 958
Registriert: Mo 11. Sep 2006, 22:56

Re: Lassen sich Integer-Zahlen bitweise auslesen?

Beitrag von creed steiger »

Aber wie compiliert man den Compiler ? Es gibt bestimmt eine Anleitung im Netzt
Buildfaq
http://wiki.freepascal.org/buildfaq" onclick="window.open(this.href);return false;

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Lassen sich Integer-Zahlen bitweise auslesen?

Beitrag von mschnell »

Yep. Danke. Habe ich inzwischen auch gefunden.

Der will zum Übersetzen als Cross-Compiler aber (logischerweise) eine Cross-Assembler. Wo bekomme ich denn den her ?

-Michael

creed steiger
Beiträge: 958
Registriert: Mo 11. Sep 2006, 22:56

Re: Lassen sich Integer-Zahlen bitweise auslesen?

Beitrag von creed steiger »

http://wiki.lazarus.freepascal.org/Cross_compiling" onclick="window.open(this.href);return false;

Ist ne VM vielleicht die einfachere Alternative?

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6770
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Lassen sich Integer-Zahlen bitweise auslesen?

Beitrag von af0815 »

creed steiger hat geschrieben:Ist ne VM vielleicht die einfachere Alternative?
64 Bit VM -> 32 Bit Target = kein Problem
32 Bit VM -> 64 Bit Target = Problem

Da brauchst du eine VM die den Prozessor emuliert und dann wird es langsam (je nach Targetprozessor).
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Lassen sich Integer-Zahlen bitweise auslesen?

Beitrag von mschnell »

creed steiger hat geschrieben:http://wiki.lazarus.freepascal.org/Cross_compiling
Da steht ein guter Tip .
Anscheinend kann der normale as auch 64 Bit. Also macht man ein script "i386-64-linux-as":
#!/bin/bash
as --64 $@

Ich versuch's.
Danke !
-Michael

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Lassen sich Integer-Zahlen bitweise auslesen?

Beitrag von mschnell »

Ich habe Dank Eurer Hilfe einiges an's Laufen bekommen.

Das Kommando
gmake all CPU_TARGET=x86_64 OS_TARGET=linux CROSSBINDIR=~/cross86-64/bin BINUTILSPREFIX=x86_64-linux- INSTALL_PREFIX=/usr/local

Übersetzt und linkt eine ganze Zeit lang, und erzeugt einen Compiler "ppcross64".

Den benutzt es, um die Library zu kompilieren, bis es bei src/buildgtk2.pp auf ein Problem stößt:

pangoincludes.inc(14,2) Fatal: Can't open include file "pango-glyph-item.inc" .

Die nötige Vorbereitung war:
Ich habe entsprechend der "Cross-Compile" Anleitung ein Directory ~/cross86-64/bin eingerichtet und da die Script Dateien
x86_64-linux-as und
x86_64-linux-ld
hingelegt.

sie enthalten:
x86_64-linux-as:
#!/bin/bash
as --64 $@


x86_64-linux-ld
#!/bin/bash
ld -A elf64-x86-64 $@

Nun 'mal sehen, ob man auch die Library compiliert bekommt....

Immerhin hat er genug von der rtl übersetzt, dass ich die besagten QWORD Funktionen nun in ASM64 übersetzen kann und so den 32 Bit Code und den 64 Code vergleichen kann.

Gruß
-Michael

Antworten