Lowlevel
Lowlevel => OS-Design => Thema gestartet von: SSJ7Gohan am 11. February 2006, 19:13
-
Ich habe folgendes C Statement (i ist eine Integer Variable):
if (i == 5 || (i > 3 && i < 7)) { }
Welchen Parsetree sollte ich daraus erstellen? Ich hatte mir sowas gedacht:
IF
OR
EQUALS
i
5
AND
GREATER
i
3
LESS
i
7
Was wäre der beste x86 Code, den man daraus erstellen kann? (Angenommen i befindet sich in einem Register)
Ich finde keinen guten Weg, den Parsetree in x86 Code umzuwandeln. Hat jemand eine Idee? :/
-
Als allererstes mal das i == 5 wegoptimieren. ;)
Im Ernst: Warum schaust du dir nicht einfach mal das an, was der gcc oder irgendein anderer Compiler erzeugt?
-
Habe ich schon, aber mein Problem liegt eher darin, den Code aus dem Parsetree zu erstellen. Der gcc macht das so:
cmp eax, 5
je label1
cmp eax, 3
jle label2
cmp eax, 7
jge label2
label2:
; hier steht der code innerhalb des ifs
label1:
; der code nach dem if
-
Hmm, scheint tatsächlich so üblich zu sein, AND- und OR-Verknüpfungen durch jede Menge Jumps zu berechnen. Das wird ja nicht nur in diesem Fall mit dem if so gemacht, sondern auch bei einem "int x = (i == 5 || (i > 3 && i < 7))".
Ich habe dasselbe nochmal kurz mit FreePascal probiert, da kommt auch so etwas ähnliches raus:
# [3] if (i = 5) or ((i > 3) and (i < 7)) then begin
cmpl $5,%eax
je .L3
jmp .L5
.L5:
cmpl $3,%eax
jg .L6
jmp .L4
.L6:
cmpl $7,%eax
jl .L3
jmp .L4
.L3:
# then-Zweig
.L4:
# else-Zweig