; Copyright (C) 2024, 2025 Mikulas Patocka
;
; This file is part of Ajla.
;
; Ajla is free software: you can redistribute it and/or modify it under the
; terms of the GNU General Public License as published by the Free Software
; Foundation, either version 3 of the License, or (at your option) any later
; version.
;
; Ajla is distributed in the hope that it will be useful, but WITHOUT ANY
; WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
; A PARTICULAR PURPOSE. See the GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License along with
; Ajla. If not, see <https://www.gnu.org/licenses/>.
1
P_BinaryOp		; op, result, (ref_flag1, strict_flag, fused_flag), src1, (ref_flag2), src2
P_BinaryConstOp		; op, result, (ref_flag1, strict_flag, fused_flag), src1, const2
P_UnaryOp		; op, result, (ref_flag, strict_flag), src
P_Copy			; dest, ref_flag, src
P_Copy_Type_Cast	; dest, ref_flag, src
P_Free			; var
P_Eval			; var
P_Keep			; var
P_Where			; result_type, type, condition
P_Value			; result
P_Fn			; result, n_args, n_return_values, n_prereqs, n_contracts, args..., return_values..., prereqs..., contracts...
P_Load_Local_Type	; result, function var (-1 if we are referring to record entries), index
P_Load_Fn		; result, n_curried_args, call_mode, [path_idx, n_unit_chars, (unit_name), n_fn_index, (fn_index)], (ref_flag, arg_idx)
P_Curry			; result, n_curried_args, ref_flag, function, (ref_flag, arg_idx)
P_Call			; call_mode, n_return_values, n_args, [path_idx, n_unit_chars, (unit_name), n_fn_index, (fn_index)], (ref_flag, arg_idx), (return_value_idx)
P_Call_Indirect		; call_mode, n_return_values, n_args, ref_flag, function, (ref_flag, arg_idx), (return_value_idx)
P_Load_Const		; result, n_bytes, lsb...msb
P_Structured_Write	; n_steps, structured_result, ref_flag, structured_struct, ref_flag, scalar, ...	(Structured_Record, local_type, idx) | (Structured_Option, local_type, idx) | (Structured_Array, idx, local_type)
P_Record_Type		; result, n_entries, (entries), [path_idx, fn_idx, n_unit_chars, (unit_name)]
P_Option_Type		; result, n_entries, (entries), [path_idx, fn_idx, n_unit_chars, (unit_name)]
P_Record_Create		; result, n_args, (ref_flag, arg_idx)
P_Record_Load_Slot	; scalar, record, slot
P_Record_Load		; scalar, Flag_Evaluate | Flag_Borrow, record, slot
P_Option_Create		; result, index, ref_flag, value
P_Option_Load		; scalar, Flag_Evaluate | Flag_Borrow, option, index
P_Option_Test		; result, option, index
P_Option_Ord		; result, option
P_Array_Flexible	; result, type
P_Array_Fixed		; result, type, dim_var
P_Array_Create		; result, length, length_var, (ref_flag, arg_idx)
P_Array_Fill		; result, (ref_flag | sparse_flag), content_var, length_var
P_Array_String		; result, n_chars, (chars)
P_Array_Unicode		; result, (chars)
P_Array_Load		; scalar, Flag_Evaluate | Flag_Borrow | Flag_Index_In_Range, array, index
P_Array_Len		; result, array, Flag_Evaluate
P_Array_Len_Finite	; result, array, Flag_Evaluate
P_Array_Len_Greater_Than	; result, array, length, (Flag_Evaluate | Flag_Fused_Bin_Jmp)
P_Array_Sub		; result, (ref_flag | Flag_Evaluate), array, start, end
P_Array_Skip		; result, (ref_flag | Flag_Evaluate), array, start
P_Array_Append		; result, (ref_flag, arg1), (ref_flag, arg2)
P_Array_Append_One	; result, (ref_flag, arg1), (ref_flag, arg2)
P_Array_Flatten		; result, (ref_flag, arg1)
P_Array_Is_Finite	; result, arg1
P_Read_Clock		; result
P_Jmp			; label
P_Jmp_False		; variable, label if false, label if exception
P_Label			; label
P_IO			; io_type, n_outputs, n_inputs, n_params, outputs, inputs, params
P_Args			; (arg ...)
P_Return_Vars		; (ret ...)
P_Return_Vars_Inlined	; (ret ...)
P_Return		; ((ref_flag, arg) ...)
P_Assume		; var
P_Claim			; var
P_Invariant		; var
P_ForAll		; result, type, condition
P_Checkpoint		; (must-be-flat-var ...)
P_Line_Info		; line_number
P_Phi			; result, (arg ...)
P_Pcode_N

-1
T_Type
T_SInt8
T_UInt8
T_SInt16
T_UInt16
T_SInt32
T_UInt32
T_SInt64
T_UInt64
T_SInt128
T_UInt128
T_Integer
T_Integer8
T_Integer16
T_Integer32
T_Integer64
T_Integer128
T_Real16
T_Real32
T_Real64
T_Real80
T_Real128
T_Bool		; these are used in variable runtime types
T_EmptyOption	; used in option declaration for typeless fields
T_Undetermined	; this must be the last type that may appear as runtime type in pcode
T_TypeOfType	; these are not used in pcode
T_Record
T_UnknownType
T_InvalidType
T_InferredType	; this must have the lowest number

1
Structured_Record
Structured_Option
Structured_Array

*
VarFlag_Must_Be_Flat
VarFlag_Must_Be_Data
VarFlag_Specialize

*
Flag_Free_Argument
Flag_Evaluate
Flag_Borrow
Flag_Array_Fill_Sparse
Flag_Op_Strict
Flag_Return_Elided
Flag_Index_In_Range
Flag_Fused_Bin_Jmp
Flag_Spec
Flag_NoSpec

0
Bin_Add
Bin_Subtract
Bin_Multiply
Bin_Divide_Int
Bin_Divide_Real
Bin_Modulo
Bin_Power
Bin_Atan2
Bin_And
Bin_Or
Bin_Xor
Bin_Shl
Bin_Shr
Bin_Rol
Bin_Ror
Bin_Bts
Bin_Btr
Bin_Btc
Bin_Equal
Bin_NotEqual
Bin_Less
Bin_LessEqual
Bin_Greater
Bin_GreaterEqual
Bin_Bt
Un_Not
Un_Neg
Un_Bswap
Un_Brev
Un_Bsf
Un_Bsr
Un_Popcnt
Un_Sqrt
Un_Cbrt
Un_Sin
Un_Cos
Un_Tan
Un_Asin
Un_Acos
Un_Atan
Un_Sinh
Un_Cosh
Un_Tanh
Un_Asinh
Un_Acosh
Un_Atanh
Un_Exp2
Un_Exp
Un_Exp10
Un_Log2
Un_Log
Un_Log10
Un_Round
Un_Floor
Un_Ceil
Un_Trunc
Un_Fract
Un_Mantissa
Un_Exponent
Un_NextNumber
Un_PrevNumber
Un_ConvertToInt
Un_ConvertFromInt
Un_IsException
Un_ExceptionClass
Un_ExceptionType
Un_ExceptionAux
Un_SystemProperty
Op_N

1
Fn_Function
Fn_Record
Fn_Option
3
Fn_Mask
4
Fn_AutoInline
8
Fn_IsFlatOption
16
Fn_AlwaysFlatOption
32
Fn_NoVerify
64
Fn_Specialize

0
Local_Type_Record	; [path_idx, fn_idx, n_unit_chars, (unit_name)], n_entries, (type)
Local_Type_Option	; [path_idx, fn_idx, n_unit_chars, (unit_name)], n_entries, (type)
Local_Type_Array	; content local type
Local_Type_Flat_Record	; non-flat-record, (flat type)
Local_Type_Flat_Array	; flat type, n_elements

0
Call_Mode_Unspecified
Call_Mode_Normal
Call_Mode_Strict
Call_Mode_Spark
Call_Mode_Weakspark
Call_Mode_Lazy
Call_Mode_Inline
Call_Mode_Cache
Call_Mode_Save
Call_Mode_Flat

1
SystemProperty_OS
SystemProperty_Charset
SystemProperty_Charset_Console
SystemProperty_Fixed
SystemProperty_Real
SystemProperty_Privileged
SystemProperty_Sandbox
SystemProperty_Compile
SystemProperty_NoInline
SystemProperty_Verify
SystemProperty_Verify_Timeout

1
SystemProperty_OS_Posix
SystemProperty_OS_DOS
SystemProperty_OS_OS2
SystemProperty_OS_Cygwin
SystemProperty_OS_Windows

0
IO_Exception_Make
IO_Exception_String
IO_Exception_Payload
IO_Exception_Stack
IO_N_Std_Handles
IO_Get_Std_Handle
IO_Get_Args
IO_Get_Environment
IO_Stream_Open_Read
IO_Stream_Read_Partial
IO_Stream_Open_Write
IO_Stream_Write
IO_Read_Console_Packet
IO_Write_Console_Packet
IO_Pipe
IO_Block_Open
IO_Block_Read
IO_Block_Write
IO_LSeek
IO_FTruncate
IO_FAllocate
IO_CloneRange
IO_FSync
IO_Sync
IO_Root_Dir
IO_Lib_Path
IO_Open_Dir
IO_Read_Dir
IO_Dir_Path
IO_DMonitor_Prepare
IO_DMonitor_Wait
IO_Stat
IO_FStat
IO_FStatFS
IO_DStatFS
IO_ReadLink
IO_Dir_Action
IO_Dir2_Action
IO_Drives
IO_Stty
IO_Tty_Size
IO_Tty_Background
IO_Tty_Foreground
IO_UName
IO_GetHostName
IO_Spawn
IO_Wait
IO_GetTime
IO_TimeToCalendar
IO_CalendarToTime
IO_Sleep
IO_Any
IO_Never
IO_Fork
IO_Atomic_Enter
IO_Atomic_Exit
IO_Wait_For_Dereferenced
IO_Int_To_Native
IO_Native_To_Int
IO_Socket
IO_Connect
IO_Connect_Wait
IO_Bind
IO_Listen
IO_Accept
IO_Get_Sock_Name
IO_Get_Peer_Name
IO_Recv_From
IO_Send_To
IO_Get_Sock_Opt
IO_Set_Sock_Opt
IO_Get_Addr_Info
IO_Get_Name_Info
IO_MsgQueue_New
IO_MsgQueue_Send
IO_MsgQueue_Receive
IO_MsgQueue_Wait
IO_MsgQueue_Is_Nonempty
IO_Signal_Handle
IO_Signal_Prepare
IO_Signal_Wait
IO_Consume_Parameters
IO_Load_Program
IO_Get_Function_Ptr
IO_Get_SubFunctions
IO_Load_Optimized_Pcode
IO_Register_Dependence
IO_Deep_Eval
IO_Evaluate
IO_Debug
IO_StackTrace
IO_TraceCtl
IO_Get_Dump
IO_FFI_Get_Size_Alignment
IO_FFI_Create_Structure
IO_FFI_Structure_Offset
IO_FFI_Poke
IO_FFI_Peek
IO_FFI_Poke_Array
IO_FFI_Peek_Array
IO_FFI_Handle_To_Number
IO_FFI_Number_To_Handle
IO_FFI_Open_Library
IO_FFI_Create_Function
IO_FFI_Call_Function
IO_FFI_Encode_Real
IO_FFI_Decode_Real
IO_FFI_Destructor_New
IO_FFI_Destructor_Allocate
IO_FFI_Destructor_Free
IO_FFI_Destructor_Call
IO_N

*
IO_Open_Flag_Read
IO_Open_Flag_Write
IO_Open_Flag_Append
IO_Open_Flag_Create
IO_Open_Flag_Must_Create
IO_Open_Flag_No_Follow
IO_Open_Flag_N

*
IO_Stat_Flag_DevMajor
IO_Stat_Flag_DevMinor
IO_Stat_Flag_Inode
IO_Stat_Flag_Type
IO_Stat_Flag_Mode
IO_Stat_Flag_NLink
IO_Stat_Flag_UID
IO_Stat_Flag_GID
IO_Stat_Flag_RDevMajor
IO_Stat_Flag_RDevMinor
IO_Stat_Flag_Size
IO_Stat_Flag_OptimalIOSize
IO_Stat_Flag_Allocated
IO_Stat_Flag_ATime
IO_Stat_Flag_MTime
IO_Stat_Flag_CTime

1
IO_Stat_Type_File
IO_Stat_Type_Directory
IO_Stat_Type_Link
IO_Stat_Type_Pipe
IO_Stat_Type_CharDev
IO_Stat_Type_BlockDev
IO_Stat_Type_Socket

*
IO_StatFS_Flag_BSize
IO_StatFS_Flag_FrSize
IO_StatFS_Flag_FrTotal
IO_StatFS_Flag_FrFree
IO_StatFS_Flag_FrAvail
IO_StatFS_Flag_InTotal
IO_StatFS_Flag_InFree
IO_StatFS_Flag_InAvail
IO_StatFS_Flag_FSId
IO_StatFS_Flag_Flags
IO_StatFS_Flag_NameLen

*
IO_StatFS_ST_ReadOnly
IO_StatFS_ST_NoSuid
IO_StatFS_ST_NoDev
IO_StatFS_ST_NoExec
IO_StatFS_ST_Synchronous
IO_StatFS_ST_MandLock
IO_StatFS_ST_NoAtime
IO_StatFS_ST_NoDirAtime
IO_StatFS_ST_RelAtime

*
IO_UName_Flag_Ajla_Version
IO_UName_Flag_Flavor
IO_UName_Flag_System
IO_UName_Flag_Release
IO_UName_Flag_Version
IO_UName_Flag_Machine

1
IO_Action_Rm
IO_Action_Rm_Dir
IO_Action_Mk_Dir
IO_Action_Mk_Pipe
IO_Action_Mk_Socket
IO_Action_Mk_CharDev
IO_Action_Mk_BlockDev
IO_Action_Mk_SymLink
IO_Action_Mk_Link
IO_Action_Rename
IO_Action_ChMod
IO_Action_ChOwn
IO_Action_LChOwn
IO_Action_UTime
IO_Action_LUTime

*
IO_Stty_Flag_Raw
IO_Stty_Flag_Noecho
IO_Stty_Flag_Nosignal
IO_Stty_Flag_NoCRLF

0
EC_NONE
EC_SYNC
EC_ASYNC
EC_SYSCALL
EC_LIBRARY
EC_EXIT
EC_N

1
AJLA_ERROR_BASE
1
AJLA_ERROR_UNKNOWN_ERROR
AJLA_ERROR_OUT_OF_MEMORY
AJLA_ERROR_SIZE_OVERFLOW
AJLA_ERROR_INT_TOO_LARGE
AJLA_ERROR_DOESNT_FIT
AJLA_ERROR_INVALID_OPERATION
AJLA_ERROR_NOT_SUPPORTED
AJLA_ERROR_NEGATIVE_INDEX
AJLA_ERROR_INDEX_OUT_OF_RANGE
AJLA_ERROR_OPTION_DOESNT_MATCH
AJLA_ERROR_RECORD_FIELD_NOT_INITIALIZED
AJLA_ERROR_ARRAY_ENTRY_NOT_INITIALIZED
AJLA_ERROR_NOT_FOUND
AJLA_ERROR_NON_ABSOLUTE_PATH
AJLA_ERROR_ABORT
AJLA_ERROR_NAN
AJLA_ERROR_INFINITY
AJLA_ERROR_SYSTEM_RETURNED_INVALID_DATA
AJLA_ERROR_COMPILER_ERROR
AJLA_ERROR_OPTIMIZER_ERROR
AJLA_ERROR_SANDBOX_VIOLATION
AJLA_ERROR_SYSTEM
AJLA_ERROR_ERRNO
AJLA_ERROR_OS2
AJLA_ERROR_OS2_SOCKET
AJLA_ERROR_WIN32
AJLA_ERROR_H_ERRNO
AJLA_ERROR_GAI
AJLA_ERROR_SUBPROCESS
AJLA_ERROR_LIBRARY_NOT_FOUND
AJLA_ERROR_SYMBOL_NOT_FOUND
AJLA_ERROR_EXIT
AJLA_ERROR_USER
AJLA_ERROR_USER2
AJLA_ERROR_USER3
AJLA_ERROR_N

1
SYSTEM_ERROR_BASE
1
SYSTEM_ERROR_EPERM
SYSTEM_ERROR_ENOENT
SYSTEM_ERROR_ESRCH
SYSTEM_ERROR_EINTR
SYSTEM_ERROR_EIO
SYSTEM_ERROR_ENXIO
SYSTEM_ERROR_E2BIG
SYSTEM_ERROR_ENOEXEC
SYSTEM_ERROR_EBADF
SYSTEM_ERROR_ECHILD
SYSTEM_ERROR_EAGAIN
SYSTEM_ERROR_ENOMEM
SYSTEM_ERROR_EACCES
SYSTEM_ERROR_EFAULT
SYSTEM_ERROR_ENOTBLK
SYSTEM_ERROR_EBUSY
SYSTEM_ERROR_EEXIST
SYSTEM_ERROR_EXDEV
SYSTEM_ERROR_ENODEV
SYSTEM_ERROR_ENOTDIR
SYSTEM_ERROR_EISDIR
SYSTEM_ERROR_EINVAL
SYSTEM_ERROR_ENFILE
SYSTEM_ERROR_EMFILE
SYSTEM_ERROR_ENOTTY
SYSTEM_ERROR_ETXTBSY
SYSTEM_ERROR_EFBIG
SYSTEM_ERROR_ENOSPC
SYSTEM_ERROR_ESPIPE
SYSTEM_ERROR_EROFS
SYSTEM_ERROR_EMLINK
SYSTEM_ERROR_EPIPE
SYSTEM_ERROR_EDOM
SYSTEM_ERROR_ERANGE
SYSTEM_ERROR_EDEADLK
SYSTEM_ERROR_ENAMETOOLONG
SYSTEM_ERROR_ENOLCK
SYSTEM_ERROR_ENOSYS
SYSTEM_ERROR_ENOTEMPTY
SYSTEM_ERROR_ELOOP
SYSTEM_ERROR_ENOMSG
SYSTEM_ERROR_EIDRM
SYSTEM_ERROR_ECHRNG
SYSTEM_ERROR_EL2NSYNC
SYSTEM_ERROR_EL3HLT
SYSTEM_ERROR_EL3RST
SYSTEM_ERROR_ELNRNG
SYSTEM_ERROR_EUNATCH
SYSTEM_ERROR_ENOCSI
SYSTEM_ERROR_EL2HLT
SYSTEM_ERROR_EBADE
SYSTEM_ERROR_EBADR
SYSTEM_ERROR_EXFULL
SYSTEM_ERROR_ENOANO
SYSTEM_ERROR_EBADRQC
SYSTEM_ERROR_EBADSLT
SYSTEM_ERROR_EBFONT
SYSTEM_ERROR_ENOSTR
SYSTEM_ERROR_ENODATA
SYSTEM_ERROR_ETIME
SYSTEM_ERROR_ENOSR
SYSTEM_ERROR_ENONET
SYSTEM_ERROR_ENOPKG
SYSTEM_ERROR_EREMOTE
SYSTEM_ERROR_ENOLINK
SYSTEM_ERROR_EADV
SYSTEM_ERROR_ESRMNT
SYSTEM_ERROR_ECOMM
SYSTEM_ERROR_EPROTO
SYSTEM_ERROR_EMULTIHOP
SYSTEM_ERROR_EDOTDOT
SYSTEM_ERROR_EBADMSG
SYSTEM_ERROR_EOVERFLOW
SYSTEM_ERROR_ENOTUNIQ
SYSTEM_ERROR_EBADFD
SYSTEM_ERROR_EREMCHG
SYSTEM_ERROR_ELIBACC
SYSTEM_ERROR_ELIBBAD
SYSTEM_ERROR_ELIBSCN
SYSTEM_ERROR_ELIBMAX
SYSTEM_ERROR_ELIBEXEC
SYSTEM_ERROR_EILSEQ
SYSTEM_ERROR_ERESTART
SYSTEM_ERROR_ESTRPIPE
SYSTEM_ERROR_EUSERS
SYSTEM_ERROR_ENOTSOCK
SYSTEM_ERROR_EDESTADDRREQ
SYSTEM_ERROR_EMSGSIZE
SYSTEM_ERROR_EPROTOTYPE
SYSTEM_ERROR_ENOPROTOOPT
SYSTEM_ERROR_EPROTONOSUPPORT
SYSTEM_ERROR_ESOCKTNOSUPPORT
SYSTEM_ERROR_EOPNOTSUPP
SYSTEM_ERROR_EPFNOSUPPORT
SYSTEM_ERROR_EAFNOSUPPORT
SYSTEM_ERROR_EADDRINUSE
SYSTEM_ERROR_EADDRNOTAVAIL
SYSTEM_ERROR_ENETDOWN
SYSTEM_ERROR_ENETUNREACH
SYSTEM_ERROR_ENETRESET
SYSTEM_ERROR_ECONNABORTED
SYSTEM_ERROR_ECONNRESET
SYSTEM_ERROR_ENOBUFS
SYSTEM_ERROR_EISCONN
SYSTEM_ERROR_ENOTCONN
SYSTEM_ERROR_ESHUTDOWN
SYSTEM_ERROR_ETOOMANYREFS
SYSTEM_ERROR_ETIMEDOUT
SYSTEM_ERROR_ECONNREFUSED
SYSTEM_ERROR_EHOSTDOWN
SYSTEM_ERROR_EHOSTUNREACH
SYSTEM_ERROR_EALREADY
SYSTEM_ERROR_EINPROGRESS
SYSTEM_ERROR_ESTALE
SYSTEM_ERROR_EUCLEAN
SYSTEM_ERROR_ENOTNAM
SYSTEM_ERROR_ENAVAIL
SYSTEM_ERROR_EISNAM
SYSTEM_ERROR_EREMOTEIO
SYSTEM_ERROR_EDQUOT
SYSTEM_ERROR_ENOMEDIUM
SYSTEM_ERROR_EMEDIUMTYPE
SYSTEM_ERROR_ECANCELED
SYSTEM_ERROR_ENOKEY
SYSTEM_ERROR_EKEYEXPIRED
SYSTEM_ERROR_EKEYREVOKED
SYSTEM_ERROR_EKEYREJECTED
SYSTEM_ERROR_EOWNERDEAD
SYSTEM_ERROR_ENOTRECOVERABLE
SYSTEM_ERROR_ERFKILL
SYSTEM_ERROR_EHWPOISON
SYSTEM_ERROR_N
