UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
syms_eval.c
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#ifndef SYMS_EVAL_C
4#define SYMS_EVAL_C
5
7//~ allen: Eval Meta Code
8
10
11// TODO(allen): this should be part of the optional extended data tables stuff
13
15//~ allen: Eval Bytecode Helper Functions
16
19 SYMS_EvalOpParams result = {0};
20 result.u64[0] = p;
21 return(result);
22}
23
26 SYMS_EvalOpParams result = {0};
27 result.u8[0] = p1;
28 result.u8[1] = p2;
29 return(result);
30}
31
34 SYMS_EvalOpParams result = {0};
35 result.u16[0] = p1;
36 result.u16[1] = p2;
37 return(result);
38}
39
40SYMS_API void
43
44 //- setup new op
46 loose_op->op = op;
47 loose_op->params = params;
48
49 //- main op push
50 // determine encoded byte count
53
54 // push onto list
55 SYMS_QueuePush(list->first, list->last, loose_op);
57 list->byte_count += encoded_byte_count;
58}
59
60SYMS_API void
62 //- setup new op
65 loose_op->params.data = bytecode;
66
67 // push onto list
68 SYMS_QueuePush(list->first, list->last, loose_op);
69 list->byte_count += bytecode.size;
70}
71
72SYMS_API void
74 left_dst->byte_count += right_destroyed->byte_count;
75 if (left_dst->last != 0){
76 if (right_destroyed->last != 0){
77 left_dst->last->next = right_destroyed->first;
78 left_dst->last = right_destroyed->last;
79 }
80 }
81 else{
82 left_dst->first = right_destroyed->first;
83 left_dst->last = right_destroyed->last;
84 }
86}
87
88SYMS_API void
102
103SYMS_API void
105 SYMS_U64 size = 64;
107 if (SYMS_S8_MIN <= s && s <= SYMS_S8_MAX){
109 size = 8;
110 }
111 else if (SYMS_S16_MIN <= s && s <= SYMS_S16_MAX){
113 size = 16;
114 }
115 else if (SYMS_S32_MIN <= s && s <= SYMS_S32_MAX){
117 size = 32;
118 }
120 if (size < 64){
122 }
123}
124
125SYMS_API void
130
131SYMS_API void
136
137//- bytecode analysis functions
138
163
164//- bytecode encoder
165
168 // allocate output
169 SYMS_String8 result = {0};
170 result.size = list->byte_count;
171 result.str = syms_push_array(arena, SYMS_U8, result.size);
172
173 // iterate loose op nodes
174 SYMS_U8 *ptr = result.str;
175 SYMS_U8 *opl = result.str + result.size;
176 for (SYMS_EvalOpNode *node = list->first;
177 node != 0;
178 node = node->next){
179 SYMS_U32 op = node->op;
180
181 switch (op){
182 default:
183 {
184 // compute bytecode advance
187
188 SYMS_U8 *next_ptr = ptr + 1 + extra_byte_count;
189 SYMS_ASSERT(next_ptr <= opl);
190
191 // fill bytecode
192 ptr[0] = op;
193 syms_memmove(ptr + 1, &node->params, extra_byte_count);
194
195 // advance output pointer
196 ptr = next_ptr;
197 }break;
198
200 {
201 // compute bytecode advance
202 SYMS_U64 size = node->params.data.size;
203 SYMS_U8 *next_ptr = ptr + size;
204 SYMS_ASSERT(next_ptr <= opl);
205
206 // fill bytecode
207 syms_memmove(ptr, node->params.data.str, size);
208
209 // advance output pointer
210 ptr = next_ptr;
211 }break;
212 }
213 }
214
215 return(result);
216}
217
218//- ir tree helpers functions
219
222 // choose encoding op
224 if (v < 0x100){
226 }
227 else if (v < 0x10000){
229 }
230 else if (v < 0x100000000){
232 }
233
234 // make the tree node
236 result->op = op;
237 result->params = syms_eval_op_params(v);
238 return(result);
239}
240
244 result->op = op;
246 result->children[0] = c;
247 return(result);
248}
249
254 result->op = op;
256 result->children[0] = l;
257 result->children[1] = r;
258 return(result);
259}
260
266
270 result->op = SYMS_EvalOp_Cond;
271 result->children[0] = c;
272 result->children[1] = l;
273 result->children[2] = r;
274 return(result);
275}
276
284
285#endif //SYMS_EVAL_C
286
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define op
float v
Definition radaudio_mdct.cpp:62
Definition syms_eval.h:40
struct SYMS_EvalIRTree * children[3]
Definition syms_eval.h:44
SYMS_EvalOpParams params
Definition syms_eval.h:45
SYMS_U32 op
Definition syms_eval.h:41
Definition syms_eval.h:56
Definition syms_eval.h:50
Definition syms_regs.h:49
SYMS_U16 size
Definition syms_regs.h:52
SYMS_U16 off
Definition syms_regs.h:51
Definition syms_base.h:296
SYMS_U8 * str
Definition syms_base.h:297
SYMS_U64 size
Definition syms_base.h:298
#define syms_true
Definition syms_base.h:105
#define SYMS_S32_MIN
Definition syms_base.h:168
#define SYMS_U16_MAX
Definition syms_base.h:174
#define SYMS_U8_MAX
Definition syms_base.h:173
#define SYMS_S16_MAX
Definition syms_base.h:167
#define SYMS_U32_MAX
Definition syms_base.h:175
#define syms_push_array(a, T, c)
Definition syms_base.h:561
#define syms_memzero_struct(s)
Definition syms_base.h:161
#define SYMS_S8_MAX
Definition syms_base.h:165
#define syms_false
Definition syms_base.h:104
#define SYMS_API
Definition syms_base.h:29
#define SYMS_ASSERT(x)
Definition syms_base.h:125
SYMS_U32 SYMS_RegID
Definition syms_base.h:107
#define SYMS_S32_MAX
Definition syms_base.h:169
SYMS_S32 SYMS_B32
Definition syms_base.h:99
#define SYMS_S8_MIN
Definition syms_base.h:164
#define syms_push_array_zero(a, T, c)
Definition syms_base.h:564
#define SYMS_S16_MIN
Definition syms_base.h:166
#define SYMS_QueuePush(f, l, n)
Definition syms_base.h:220
uint32_t SYMS_U32
Definition syms_crt_overrides.h:38
uint64_t SYMS_U64
Definition syms_crt_overrides.h:39
#define syms_memmove
Definition syms_crt_overrides.h:65
uint16_t SYMS_U16
Definition syms_crt_overrides.h:37
int64_t SYMS_S64
Definition syms_crt_overrides.h:35
uint8_t SYMS_U8
Definition syms_crt_overrides.h:36
#define SYMS_Arena
Definition syms_default_arena.h:61
SYMS_API SYMS_String8 syms_eval_bytecode_from_op_list(SYMS_Arena *arena, SYMS_EvalOpList *list)
Definition syms_eval.c:167
SYMS_API void syms_eval_op_push_bytecode(SYMS_Arena *arena, SYMS_EvalOpList *list, SYMS_String8 bytecode)
Definition syms_eval.c:61
SYMS_API SYMS_EvalIRTree * syms_eval_ir_tree_binary_op_u(SYMS_Arena *arena, SYMS_EvalOp op, SYMS_EvalIRTree *l, SYMS_EvalIRTree *r)
Definition syms_eval.c:262
SYMS_API SYMS_EvalIRTree * syms_eval_ir_tree_conditional(SYMS_Arena *arena, SYMS_EvalIRTree *c, SYMS_EvalIRTree *l, SYMS_EvalIRTree *r)
Definition syms_eval.c:268
SYMS_API void syms_eval_op_encode_reg_section(SYMS_Arena *arena, SYMS_EvalOpList *list, SYMS_RegSection sec)
Definition syms_eval.c:126
SYMS_API SYMS_EvalOpParams syms_eval_op_params_2u8(SYMS_U8 p1, SYMS_U8 p2)
Definition syms_eval.c:25
SYMS_API SYMS_EvalIRTree * syms_eval_ir_tree_const_u(SYMS_Arena *arena, SYMS_U64 v)
Definition syms_eval.c:221
SYMS_API void syms_eval_op_encode_s(SYMS_Arena *arena, SYMS_EvalOpList *list, SYMS_S64 s)
Definition syms_eval.c:104
SYMS_API void syms_eval_op_encode_reg(SYMS_Arena *arena, SYMS_EvalOpList *list, SYMS_Arch arch, SYMS_RegID reg_id)
Definition syms_eval.c:132
SYMS_API void syms_eval_op_push(SYMS_Arena *arena, SYMS_EvalOpList *list, SYMS_EvalOp op, SYMS_EvalOpParams params)
Definition syms_eval.c:41
SYMS_API void syms_eval_op_list_concat_in_place(SYMS_EvalOpList *left_dst, SYMS_EvalOpList *right_destroyed)
Definition syms_eval.c:73
SYMS_API SYMS_EvalOpParams syms_eval_op_params(SYMS_U64 p)
Definition syms_eval.c:18
SYMS_API void syms_eval_op_encode_u(SYMS_Arena *arena, SYMS_EvalOpList *list, SYMS_U64 u)
Definition syms_eval.c:89
SYMS_API SYMS_EvalIRTree * syms_eval_ir_tree_unary_op(SYMS_Arena *arena, SYMS_EvalOp op, SYMS_EvalTypeGroup group, SYMS_EvalIRTree *c)
Definition syms_eval.c:242
SYMS_API SYMS_EvalIRTree * syms_eval_ir_tree_binary_op(SYMS_Arena *arena, SYMS_EvalOp op, SYMS_EvalTypeGroup group, SYMS_EvalIRTree *l, SYMS_EvalIRTree *r)
Definition syms_eval.c:251
SYMS_API SYMS_EvalIRTree * syms_eval_ir_tree_bytecode_no_copy(SYMS_Arena *arena, SYMS_String8 bytecode)
Definition syms_eval.c:278
SYMS_API SYMS_EvalOpParams syms_eval_op_params_2u16(SYMS_U16 p1, SYMS_U16 p2)
Definition syms_eval.c:33
SYMS_API SYMS_B32 syms_eval_opcode_type_compatible(SYMS_EvalOp op, SYMS_EvalTypeGroup group)
Definition syms_eval.c:140
@ SYMS_EvalIRExtKind_Bytecode
Definition syms_eval.h:24
SYMS_Arch
Definition syms_meta_base.h:6
SYMS_GLOBAL SYMS_U8 syms_eval_opcode_ctrlbits[]
Definition syms_meta_eval.c:6
@ SYMS_EvalOpCtrlBits_DecodeMask
Definition syms_meta_eval.h:54
@ SYMS_EvalOpCtrlBits_DecodeShft
Definition syms_meta_eval.h:55
SYMS_EvalOp
Definition syms_meta_eval.h:6
@ SYMS_EvalOp_Cond
Definition syms_meta_eval.h:8
@ SYMS_EvalOp_COUNT
Definition syms_meta_eval.h:50
@ SYMS_EvalOp_LogAnd
Definition syms_meta_eval.h:35
@ SYMS_EvalOp_BitAnd
Definition syms_meta_eval.h:31
@ SYMS_EvalOp_Div
Definition syms_meta_eval.h:27
@ SYMS_EvalOp_GrEq
Definition syms_meta_eval.h:41
@ SYMS_EvalOp_Mod
Definition syms_meta_eval.h:28
@ SYMS_EvalOp_LogNot
Definition syms_meta_eval.h:37
@ SYMS_EvalOp_TruncSigned
Definition syms_meta_eval.h:45
@ SYMS_EvalOp_NtEq
Definition syms_meta_eval.h:39
@ SYMS_EvalOp_BitNot
Definition syms_meta_eval.h:34
@ SYMS_EvalOp_RShift
Definition syms_meta_eval.h:30
@ SYMS_EvalOp_BitOr
Definition syms_meta_eval.h:32
@ SYMS_EvalOp_EqEq
Definition syms_meta_eval.h:38
@ SYMS_EvalOp_ConstU32
Definition syms_meta_eval.h:20
@ SYMS_EvalOp_Mul
Definition syms_meta_eval.h:26
@ SYMS_EvalOp_ConstU64
Definition syms_meta_eval.h:21
@ SYMS_EvalOp_Neg
Definition syms_meta_eval.h:23
@ SYMS_EvalOp_Less
Definition syms_meta_eval.h:42
@ SYMS_EvalOp_Grtr
Definition syms_meta_eval.h:43
@ SYMS_EvalOp_LogOr
Definition syms_meta_eval.h:36
@ SYMS_EvalOp_Sub
Definition syms_meta_eval.h:25
@ SYMS_EvalOp_ConstU8
Definition syms_meta_eval.h:18
@ SYMS_EvalOp_BitXor
Definition syms_meta_eval.h:33
@ SYMS_EvalOp_Add
Definition syms_meta_eval.h:24
@ SYMS_EvalOp_LsEq
Definition syms_meta_eval.h:40
@ SYMS_EvalOp_LShift
Definition syms_meta_eval.h:29
@ SYMS_EvalOp_ConstU16
Definition syms_meta_eval.h:19
SYMS_EvalTypeGroup
Definition syms_meta_eval.h:62
@ SYMS_EvalTypeGroup_Other
Definition syms_meta_eval.h:63
@ SYMS_EvalTypeGroup_U
Definition syms_meta_eval.h:64
@ SYMS_EvalTypeGroup_S
Definition syms_meta_eval.h:65
SYMS_API SYMS_RegSection syms_reg_section_from_reg_id(SYMS_Arch arch, SYMS_RegID reg_id)
Definition syms_regs_helpers.c:61
Definition syms_eval.h:32
SYMS_U8 u8[8]
Definition syms_eval.h:33
SYMS_U64 u64[1]
Definition syms_eval.h:36
SYMS_U16 u16[4]
Definition syms_eval.h:34
SYMS_String8 data
Definition syms_eval.h:37