# opcode function table
# 
# format is:
# name args arg_types
# 
# Opcode number is determined at build time
#
# All fields should be whitespace separated
#
# The arg_types are the types to be packed (integer, number, whatever) 
# not the type of the register or anything. So N3 is still an i, since that
# 3 specifying the register should be packed as an integer.
# Revised arg types:
#      i       Integer constant
#      I       Integer register
#      n       Numeric constant
#      N       Numeric register
#      s       String constant?
#      S       String register
#      D       Destination 
#
# $Id: opcode_table,v 1.22 2001/09/24 16:27:48 gregor Exp $
#


# This must be opcode zero

end	0

# Integer ops

set_i_ic 	2	I i
set_i  	2	I I
add_i	3	I I I
sub_i	3	I I I
mul_i	3	I I I
div_i	3	I I I
mod_i	3	I I I
inc_i	1	I
inc_i_ic	2	I i
dec_i	1	I
dec_i_ic	2	I i

# NUM ops

set_n_nc	2	N n
set_n  	2	N N
add_n	3	N N N
sub_n	3	N N N
mul_n	3	N N N
div_n	3	N N N
inc_n	1	N
inc_n_nc	2	N n
dec_n	1	N
dec_n_nc	2	N n

# String ops

set_s_sc	2	S s
print_s	1	S
print_sc	1	s
length_i_s	2	I S
chopn_s_ic	2	S i
substr_s_s_i	4	S S I I
concat_s	2	S S

# Comparators (TODO: String comparators)

eq_i_ic	3	I I D
eq_ic_ic	3	I i D
ne_i_ic	3	I I D
ne_ic_ic	3	I i D
lt_i_ic	3	I I D
lt_ic_ic	3	I i D
le_i_ic	3	I I D
le_ic_ic	3	I i D
gt_i_ic	3	I I D
gt_ic_ic	3	I i D
ge_i_ic	3	I I D
ge_ic_ic	3	I i D 

eq_n_ic	3	N N D
eq_nc_ic	3	N n D
ne_n_ic	3	N N D
ne_nc_ic	3	N n D
lt_n_ic	3	N N D
lt_nc_ic	3	N n D
le_n_ic	3	N N D
le_nc_ic	3	N n D
gt_n_ic	3 	N N D
gt_nc_ic	3	N n D
ge_n_ic	3	N N D 
ge_nc_ic	3	N n D

# Flow control

jump_i	1	I
branch_ic	1	D
if_i_ic	2	I D
if_n_ic	2	N D

# Convertors

iton_n_i	2	N I
ntoi_i_n	2	I N

# Miscellaneous and debugging ops

time_i	1	I
print_i	1	I
print_ic	1	i
time_n	1	N
print_n	1	N
print_nc	1	n
noop	0

# Register ops

push_i	0
push_s	0
push_n	0
push_p	0
pop_i	0
pop_s	0
pop_n	0
pop_p	0
clear_i	0
clear_s	0
clear_n	0
clear_p	0

# Transcendental Math Ops

sin_n_n	2	N N
cos_n_n	2	N N
tan_n_n	2	N N
sec_n_n	2	N N
atan_n_n	2	N N
atan2_n_n_n	3	N N N
asin_n_n	2	N N
acos_n_n	2	N N
asec_n_n	2	N N
cosh_n_n	2	N N
sinh_n_n	2	N N
tanh_n_n	2	N N
sech_n_n	2	N N
log2_n_n	2	N N
log10_n_n	2	N N
ln_n_n	2	N N
exp_n_n	2	N N
pow_n_n_n	3	N N N
sin_n_i	2	N I
cos_n_i	2	N I
tan_n_i	2	N I
sec_n_i	2	N I
atan_n_i	2	N I
atan2_n_n_i	3	N N I
atan2_n_i_n	3	N I N
atan2_n_i_i	3	N I I
asin_n_i	2	N I
acos_n_i	2	N I
asec_n_i	2	N I
cosh_n_i	2	N I
sinh_n_i	2	N I
tanh_n_i	2	N I
sech_n_i	2	N I
log2_n_i	2	N I
log10_n_i	2	N I
ln_n_i	2	N I
exp_n_i	2	N I
pow_n_n_i	3	N N I
pow_n_i_i	3	N I I
pow_n_i_n	3	N I N

# Bitwise Ops

and_i	3	I I I
not_i	2	I I
or_i	3	I I I
shl_i_ic	3	I I i
shr_i_ic	3	I I i
xor_i	3	I I I