Lowlevel

Lowlevel => OS-Design => Thema gestartet von: SSJ7Gohan am 11. February 2006, 19:13

Titel: Kompilieren von Bedingungen
Beitrag 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? :/
Titel: Kompilieren von Bedingungen
Beitrag von: kevin am 11. February 2006, 20:19
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?
Titel: Kompilieren von Bedingungen
Beitrag von: SSJ7Gohan am 11. February 2006, 20:35
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
Titel: Kompilieren von Bedingungen
Beitrag von: kevin am 11. February 2006, 21:02
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