if, while, do
This commit is contained in:
parent
f6ee9bfa66
commit
70523ba1bb
2 changed files with 87 additions and 29 deletions
69
05/codegen.b
69
05/codegen.b
|
@ -1612,9 +1612,9 @@ function generate_push_expression
|
||||||
if c == EXPRESSION_CONDITIONAL goto generate_conditional
|
if c == EXPRESSION_CONDITIONAL goto generate_conditional
|
||||||
|
|
||||||
putnln(c)
|
putnln(c)
|
||||||
die(.str_genpushexprNI)
|
die(.str_genpushbadexpr)
|
||||||
:str_genpushexprNI
|
:str_genpushbadexpr
|
||||||
string generate_push_expression not implemented.
|
string Internal compiler error: bad expression passed to generate_push_expression.
|
||||||
byte 0
|
byte 0
|
||||||
:generate_cast
|
:generate_cast
|
||||||
expr += 8
|
expr += 8
|
||||||
|
@ -2509,9 +2509,13 @@ function generate_statement
|
||||||
local dat2
|
local dat2
|
||||||
local dat3
|
local dat3
|
||||||
local dat4
|
local dat4
|
||||||
|
local addr0
|
||||||
|
local addr1
|
||||||
|
local addr2
|
||||||
local n
|
local n
|
||||||
local p
|
local p
|
||||||
local c
|
local c
|
||||||
|
local d
|
||||||
|
|
||||||
dat1 = statement + 8
|
dat1 = statement + 8
|
||||||
dat1 = *8dat1
|
dat1 = *8dat1
|
||||||
|
@ -2528,6 +2532,10 @@ function generate_statement
|
||||||
if c == STATEMENT_RETURN goto gen_return
|
if c == STATEMENT_RETURN goto gen_return
|
||||||
if c == STATEMENT_LOCAL_DECLARATION goto gen_local_decl
|
if c == STATEMENT_LOCAL_DECLARATION goto gen_local_decl
|
||||||
if c == STATEMENT_EXPRESSION goto gen_stmt_expr
|
if c == STATEMENT_EXPRESSION goto gen_stmt_expr
|
||||||
|
if c == STATEMENT_IF goto gen_stmt_if
|
||||||
|
if c == STATEMENT_WHILE goto gen_stmt_while
|
||||||
|
if c == STATEMENT_DO goto gen_stmt_do
|
||||||
|
|
||||||
; @TODO
|
; @TODO
|
||||||
die(.str_genstmtNI)
|
die(.str_genstmtNI)
|
||||||
:str_genstmtNI
|
:str_genstmtNI
|
||||||
|
@ -2584,7 +2592,60 @@ function generate_statement
|
||||||
; since we casted to void, it'll always be 8 bytes on the stack
|
; since we casted to void, it'll always be 8 bytes on the stack
|
||||||
emit_add_rsp_imm32(8)
|
emit_add_rsp_imm32(8)
|
||||||
return
|
return
|
||||||
|
:gen_stmt_if
|
||||||
|
p = dat1 + 4
|
||||||
|
generate_push_expression(statement, dat1)
|
||||||
|
generate_stack_compare_against_zero(statement, *4p)
|
||||||
|
emit_je_rel32(0) ; je +0 (temporary)
|
||||||
|
addr1 = code_output
|
||||||
|
generate_statement(dat2) ; "if" branch
|
||||||
|
emit_jmp_rel32(0) ; jmp +0 (temporary)
|
||||||
|
addr2 = code_output
|
||||||
|
; fill in je
|
||||||
|
d = addr2 - addr1
|
||||||
|
addr1 -= 4
|
||||||
|
*4addr1 = d
|
||||||
|
addr1 = addr2
|
||||||
|
if dat3 == 0 goto gen_if_no_else
|
||||||
|
generate_statement(dat3) ; "else" branch
|
||||||
|
:gen_if_no_else
|
||||||
|
addr2 = code_output
|
||||||
|
; fill in jmp
|
||||||
|
d = addr2 - addr1
|
||||||
|
addr1 -= 4
|
||||||
|
*4addr1 = d
|
||||||
|
return
|
||||||
|
:gen_stmt_while
|
||||||
|
addr0 = code_output
|
||||||
|
p = dat1 + 4
|
||||||
|
generate_push_expression(statement, dat1)
|
||||||
|
generate_stack_compare_against_zero(statement, *4p)
|
||||||
|
emit_je_rel32(0) ; je +0 (temporary)
|
||||||
|
addr1 = code_output
|
||||||
|
generate_statement(dat2)
|
||||||
|
emit_jmp_rel32(0) ; jmp +0 (temporary)
|
||||||
|
addr2 = code_output
|
||||||
|
; fill in je
|
||||||
|
d = addr2 - addr1
|
||||||
|
p = addr1 - 4
|
||||||
|
*4p = d
|
||||||
|
; fill in jmp
|
||||||
|
d = addr0 - addr2
|
||||||
|
p = addr2 - 4
|
||||||
|
*4p = d
|
||||||
|
return
|
||||||
|
:gen_stmt_do
|
||||||
|
addr0 = code_output
|
||||||
|
generate_statement(dat1)
|
||||||
|
p = dat2 + 4
|
||||||
|
generate_push_expression(statement, dat2)
|
||||||
|
generate_stack_compare_against_zero(statement, *4p)
|
||||||
|
emit_jne_rel32(0) ; jne +0 (temorary)
|
||||||
|
addr1 = code_output
|
||||||
|
d = addr0 - addr1
|
||||||
|
addr1 -= 4
|
||||||
|
*4addr1 = d
|
||||||
|
return
|
||||||
|
|
||||||
function generate_function
|
function generate_function
|
||||||
argument function_name
|
argument function_name
|
||||||
|
|
47
05/main.c
47
05/main.c
|
@ -1,6 +1,9 @@
|
||||||
long factorial(long x) {
|
long factorial(long x) {
|
||||||
return x > 0 ? x * factorial(x - 1)
|
if (x == 0) {
|
||||||
: 1;
|
return 1;
|
||||||
|
} else {
|
||||||
|
return x * factorial(x-1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
long fibonacci(long x) {
|
long fibonacci(long x) {
|
||||||
|
@ -11,28 +14,22 @@ long fibonacci(long x) {
|
||||||
: 0;
|
: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
long gcd(long a, long b) {
|
||||||
float f = 3.7;
|
while (a != 0) {
|
||||||
int i = 37;
|
long temp = a;
|
||||||
f--;
|
a = b % a;
|
||||||
++i;
|
b = temp;
|
||||||
--f;
|
}
|
||||||
++f;
|
return b;
|
||||||
f++;
|
}
|
||||||
--i;
|
|
||||||
f--;
|
int main(int argc, char **argv) {
|
||||||
++i;
|
double f = 1;
|
||||||
--f;
|
int exp = 0;
|
||||||
++f;
|
do {
|
||||||
f++;
|
f /= 2;
|
||||||
--i;
|
++exp;
|
||||||
f--;
|
} while (f);
|
||||||
++i;
|
return exp;
|
||||||
--f;
|
|
||||||
++f;
|
|
||||||
f++;
|
|
||||||
--i;
|
|
||||||
|
|
||||||
return f;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue