allow terms to be more complicated

This commit is contained in:
pommicket 2022-01-08 10:15:43 -05:00
parent 262824b214
commit d74f349e27
5 changed files with 60 additions and 77 deletions

View file

@ -227,6 +227,9 @@ A *term* is one of:
- `{variable name}` - the value of a (local or global) variable
- `.{label name}` - the address of a label
- `{number}`
- `&{variable}` - address of variable
- `*1{variable}` / `*2{variable}` / `*4{variable}` / `*8{variable}` - dereference 1, 2, 4, or 8 bytes
- `~{term}` - bitwise not
An *l-value* is the left-hand side of an assignment expression,
and it is one of:
@ -239,9 +242,6 @@ and it is one of:
An *r-value* is an expression, which can be more complicated than a term.
r-values are one of:
- `{term}`
- `&{variable}` - address of variable
- `*1{variable}` / `*2{variable}` / `*4{variable}` / `*8{variable}` - dereference 1, 2, 4, or 8 bytes
- `~{term}` - bitwise not
- `{function}({term}, {term}, ...)`
- `{term} + {term}`
- `{term} - {term}`

View file

@ -107,12 +107,10 @@ function stoi
function strlen
argument s
local c
local p
p = s
:strlen_loop
c = *1p
if c == 0 goto strlen_loop_end
if *1p == 0 goto strlen_loop_end
p += 1
goto strlen_loop
:strlen_loop_end

104
04/in03
View file

@ -1238,6 +1238,12 @@ align
?C=D:term_number
D='.
?C=D:term_label
D='*
?C=D:term_dereference
D='&
?C=D:term_addressof
D='~
?C=D:term_bitwise_not
D=d58
?C<D:term_number
; (fallthrough)
@ -1274,16 +1280,6 @@ align
C=:rvalue
8C=I
C=1I
D='&
?C=D:rvalue_addressof
D='~
?C=D:rvalue_bitwise_not
D='*
?C=D:rvalue_dereference
J=I
:rvalue_loop
C=1J
@ -1506,50 +1502,6 @@ align
:rvalue_shr
call :set_rcx_to_rsi
!:emit_shr_rax_cl
:rvalue_addressof
I+=d1
!:set_rax_to_address_of_variable
:rvalue_bitwise_not
I+=d1
call :set_rax_to_term
J=d4
I=:not_rax
D=d3
syscall x1
return
:not_rax
x48
xf7
xd0
:rvalue_dereference_size
reserve d1
:rvalue_dereference
I+=d1
D=1I
C=:rvalue_dereference_size
1C=D
I+=d1
call :set_rax_to_variable
call :set_rbx_to_rax
call :zero_rax
C=:rvalue_dereference_size
C=1C
D='1
?C=D:set_al_to_[rbx]
D='2
?C=D:set_ax_to_[rbx]
D='4
?C=D:set_eax_to_[rbx]
D='8
?C=D:set_rax_to_[rbx]
!:bad_term
; set <rax> to address of variable in rsi
:set_rax_to_address_of_variable
@ -1600,7 +1552,51 @@ align
call :read_number
I=A
!:set_rax_to_immediate
:term_bitwise_not
I+=d1
call :set_rax_to_term
J=d4
I=:not_rax
D=d3
syscall x1
return
:not_rax
x48
xf7
xd0
:term_dereference_size
reserve d1
:term_dereference
I+=d1
D=1I
C=:term_dereference_size
1C=D
I+=d1
call :set_rax_to_variable
call :set_rbx_to_rax
call :zero_rax
C=:term_dereference_size
C=1C
D='1
?C=D:set_al_to_[rbx]
D='2
?C=D:set_ax_to_[rbx]
D='4
?C=D:set_eax_to_[rbx]
D='8
?C=D:set_rax_to_[rbx]
!:bad_term
:term_addressof
I+=d1
!:set_rax_to_address_of_variable
; set rax to the number in the string at rsi
:read_number
C=1I

View file

@ -15,8 +15,7 @@ function strlen
local p
p = s
:strlen_loop
c = *1p
if c == 0 goto strlen_loop_end
if *1p == 0 goto strlen_loop_end
p += 1
goto strlen_loop
:strlen_loop_end
@ -24,9 +23,7 @@ function strlen
function putc
argument c
local p
p = &c
syscall(1, 1, p, 1)
syscall(1, 1, &c, 1)
return
function puts

View file

@ -331,11 +331,9 @@ function memchr
argument mem
argument c
local p
local a
p = mem
:memchr_loop
a = *1p
if a == c goto memchr_loop_end
if *1p == c goto memchr_loop_end
p += 1
goto memchr_loop
:memchr_loop_end
@ -343,12 +341,10 @@ function memchr
function strlen
argument s
local c
local p
p = s
:strlen_loop
c = *1p
if c == 0 goto strlen_loop_end
if *1p == 0 goto strlen_loop_end
p += 1
goto strlen_loop
:strlen_loop_end
@ -414,9 +410,7 @@ function fputn
function fputc
argument fd
argument c
local p
p = &c
syscall(1, fd, p, 1)
syscall(1, fd, &c, 1)
return
function putc
@ -428,10 +422,8 @@ function putc
function fgetc
argument fd
local c
local p
c = 0
p = &c
syscall(0, fd, p, 1)
syscall(0, fd, &c, 1)
return c
; read a line from fd as a null-terminated string