Rewrite push_expr.

parent f5f95048
......@@ -496,6 +496,8 @@ add_symbol_label:
ret
;; Input in [ESP+4] (name) and [ESP+8] (want_address)
;; Destroys: EAX, ECX, EDX
push_expr:
push ebp
mov ebp, esp
......@@ -505,7 +507,6 @@ push_expr:
;; Try to interpret argument as number
mov eax, [ebp+8]
call decode_number_or_char
mov ebx, edx
cmp eax, 0
je push_expr_stack
......@@ -514,8 +515,7 @@ push_expr:
jne platform_panic
;; Emit the code
mov edx, temp_var
call push_var
mov ebx, edx
mov cl, 0x68 ; push ??
call emit
mov ecx, ebx
......@@ -539,8 +539,6 @@ push_expr_stack:
jne push_expr_stack_addr
;; We want the value, emit the code
mov edx, temp_var
call push_var
mov ecx, 0x24b4ff ; push [esp+??]
call emit24
mov ecx, ebx
......@@ -550,8 +548,6 @@ push_expr_stack:
push_expr_stack_addr:
;; We want the address, emit the code
mov edx, temp_var
call push_var
mov ecx, 0x24848d ; lea eax, [esp+??]
call emit24
mov ecx, ebx
......@@ -567,35 +563,27 @@ push_expr_symbol:
call find_symbol_or_panic
mov ebx, eax
;; If arity is -2, check we do not want the address
;; Handle (in this order) global constants, cases when we want the
;; address and global variables
cmp edx, -2
jne push_expr_after_assert
je push_expr_symbol_const
cmp DWORD [ebp+12], 0
jne platform_panic
push_expr_after_assert:
;; Check if we want the address or arity is -2
cmp edx, -2
je push_expr_addr
cmp DWORD [ebp+12], 0
jne push_expr_addr
;; Check if arity is -1
jne push_expr_symbol_addr
cmp edx, -1
je push_expr_val
mov esi, edx
je push_expr_symbol_var
;; This is a real function call, emit the code (part 1)
;; This is a real function call, save arity and emit the call
mov esi, edx
mov cl, 0xe8 ; call ??
call emit
mov eax, ebx
call compute_rel
mov ecx, eax
call emit32
;; Multiply the arity by 4 and emit stack unwinding
mov ecx, 0xc481 ; add esp, ??
call emit16
;; Multiply the arity by 4 and continue emitting code
mov ecx, esi
shl ecx, 2
call emit32
......@@ -603,10 +591,10 @@ push_expr_after_assert:
call emit
;; Update stack variables
push_expr_symbol_loop:
push_expr_symbol_call_loop:
;; Check for termination
cmp esi, 0
je push_expr_symbol_loop_end
je push_expr_ret
;; Call pop_var
mov eax, 1
......@@ -614,18 +602,18 @@ push_expr_symbol_loop:
;; Decrement arity and reloop
dec esi
jmp push_expr_symbol_loop
jmp push_expr_symbol_call_loop
push_expr_symbol_loop_end:
mov edx, temp_var
call push_var
push_expr_symbol_const:
;; Check we do not want the address
cmp DWORD [ebp+12], 0
jne platform_panic
jmp push_expr_ret
;; But we actually emit the address, because there is where the
;; constant value is stored
push_expr_addr:
push_expr_symbol_addr:
;; We want the address, emit the code
mov edx, temp_var
call push_var
mov cl, 0x68 ; push ??
call emit
mov ecx, ebx
......@@ -633,20 +621,20 @@ push_expr_addr:
jmp push_expr_ret
push_expr_val:
push_expr_symbol_var:
;; We want the value, emit the code
mov edx, temp_var
call push_var
mov cl, 0xb8 ; mov eax, ??
call emit
mov ecx, 0x35ff ; push [??]
call emit16
mov ecx, ebx
call emit32
mov ecx, 0x30ff ; push [eax]
call emit16
jmp push_expr_ret
push_expr_ret:
;; Keep note of the new temporary
mov edx, temp_var
call push_var
pop esi
pop ebx
pop ebp
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment