raddbg -> raddbgi

This commit is contained in:
Ryan Fleury
2024-02-12 14:56:10 -08:00
parent 4b68967fbe
commit aa2a0948ba
55 changed files with 2620 additions and 2945 deletions
+113 -113
View File
@@ -22,18 +22,18 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode)
for (;ptr < opl;){
// consume opcode
RADDBG_EvalOp op = (RADDBG_EvalOp)*ptr;
if (op >= RADDBG_EvalOp_COUNT){
RADDBGI_EvalOp op = (RADDBGI_EvalOp)*ptr;
if (op >= RADDBGI_EvalOp_COUNT){
result.code = EVAL_ResultCode_BadOp;
goto done;
}
U8 ctrlbits = raddbg_eval_opcode_ctrlbits[op];
U8 ctrlbits = raddbgi_eval_opcode_ctrlbits[op];
ptr += 1;
// decode
U64 imm = 0;
{
U32 decode_size = RADDBG_DECODEN_FROM_CTRLBITS(ctrlbits);
U32 decode_size = RADDBGI_DECODEN_FROM_CTRLBITS(ctrlbits);
U8 *next_ptr = ptr + decode_size;
if (next_ptr > opl){
result.code = EVAL_ResultCode_BadOp;
@@ -54,7 +54,7 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode)
// pop
EVAL_Slot *svals = 0;
{
U32 pop_count = RADDBG_POPN_FROM_CTRLBITS(ctrlbits);
U32 pop_count = RADDBGI_POPN_FROM_CTRLBITS(ctrlbits);
if (pop_count > stack_count){
result.code = EVAL_ResultCode_BadOp;
goto done;
@@ -68,29 +68,29 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode)
// interpret
EVAL_Slot nval = {0};
switch (op){
case RADDBG_EvalOp_Stop:
case RADDBGI_EvalOp_Stop:
{
goto done;
}break;
case RADDBG_EvalOp_Noop:
case RADDBGI_EvalOp_Noop:
{
// do nothing
}break;
case RADDBG_EvalOp_Cond:
case RADDBGI_EvalOp_Cond:
{
if (svals[0].u64){
ptr += imm;
}
}break;
case RADDBG_EvalOp_Skip:
case RADDBGI_EvalOp_Skip:
{
ptr += imm;
}break;
case RADDBG_EvalOp_MemRead:
case RADDBGI_EvalOp_MemRead:
{
U64 addr = svals[0].u64;
U64 size = imm;
@@ -105,12 +105,12 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode)
}
}break;
case RADDBG_EvalOp_RegRead:
case RADDBGI_EvalOp_RegRead:
{
U8 raddbg_reg_code = (imm&0x0000FF)>>0;
U8 byte_size = (imm&0x00FF00)>>8;
U8 byte_off = (imm&0xFF0000)>>16;
REGS_RegCode base_reg_code = regs_reg_code_from_arch_raddbg_code(machine->arch, raddbg_reg_code);
U8 raddbgi_reg_code = (imm&0x0000FF)>>0;
U8 byte_size = (imm&0x00FF00)>>8;
U8 byte_off = (imm&0xFF0000)>>16;
REGS_RegCode base_reg_code = regs_reg_code_from_arch_raddbgi_code(machine->arch, raddbgi_reg_code);
REGS_Rng rng = regs_reg_code_rng_table_from_architecture(machine->arch)[base_reg_code];
U64 off = (U64)rng.byte_off + byte_off;
U64 size = (U64)byte_size;
@@ -123,7 +123,7 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode)
}
}break;
case RADDBG_EvalOp_RegReadDyn:
case RADDBGI_EvalOp_RegReadDyn:
{
U64 off = svals[0].u64;
U64 size = bit_size_from_arch(machine->arch)/8;
@@ -136,7 +136,7 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode)
}
}break;
case RADDBG_EvalOp_FrameOff:
case RADDBGI_EvalOp_FrameOff:
{
if (machine->frame_base != 0){
nval.u64 = *machine->frame_base + imm;
@@ -147,7 +147,7 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode)
}
}break;
case RADDBG_EvalOp_ModuleOff:
case RADDBGI_EvalOp_ModuleOff:
{
if (machine->module_base != 0){
nval.u64 = *machine->module_base + imm;
@@ -158,7 +158,7 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode)
}
}break;
case RADDBG_EvalOp_TLSOff:
case RADDBGI_EvalOp_TLSOff:
{
if (machine->tls_base != 0){
nval.u64 = *machine->tls_base + imm;
@@ -169,23 +169,23 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode)
}
}break;
case RADDBG_EvalOp_ConstU8:
case RADDBG_EvalOp_ConstU16:
case RADDBG_EvalOp_ConstU32:
case RADDBG_EvalOp_ConstU64:
case RADDBGI_EvalOp_ConstU8:
case RADDBGI_EvalOp_ConstU16:
case RADDBGI_EvalOp_ConstU32:
case RADDBGI_EvalOp_ConstU64:
{
nval.u64 = imm;
}break;
case RADDBG_EvalOp_Abs:
case RADDBGI_EvalOp_Abs:
{
if (imm == RADDBG_EvalTypeGroup_F32){
if (imm == RADDBGI_EvalTypeGroup_F32){
nval.f32 = svals[0].f32;
if (svals[0].f32 < 0){
nval.f32 = -svals[0].f32;
}
}
else if (imm == RADDBG_EvalTypeGroup_F64){
else if (imm == RADDBGI_EvalTypeGroup_F64){
nval.f64 = svals[0].f64;
if (svals[0].f64 < 0){
nval.f64 = -svals[0].f64;
@@ -199,12 +199,12 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode)
}
}break;
case RADDBG_EvalOp_Neg:
case RADDBGI_EvalOp_Neg:
{
if (imm == RADDBG_EvalTypeGroup_F32){
if (imm == RADDBGI_EvalTypeGroup_F32){
nval.f32 = -svals[0].f32;
}
else if (imm == RADDBG_EvalTypeGroup_F64){
else if (imm == RADDBGI_EvalTypeGroup_F64){
nval.f64 = -svals[0].f64;
}
else{
@@ -212,12 +212,12 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode)
}
}break;
case RADDBG_EvalOp_Add:
case RADDBGI_EvalOp_Add:
{
if (imm == RADDBG_EvalTypeGroup_F32){
if (imm == RADDBGI_EvalTypeGroup_F32){
nval.f32 = svals[0].f32 + svals[1].f32;
}
else if (imm == RADDBG_EvalTypeGroup_F64){
else if (imm == RADDBGI_EvalTypeGroup_F64){
nval.f64 = svals[0].f64 + svals[1].f64;
}
else{
@@ -225,12 +225,12 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode)
}
}break;
case RADDBG_EvalOp_Sub:
case RADDBGI_EvalOp_Sub:
{
if (imm == RADDBG_EvalTypeGroup_F32){
if (imm == RADDBGI_EvalTypeGroup_F32){
nval.f32 = svals[0].f32 - svals[1].f32;
}
else if (imm == RADDBG_EvalTypeGroup_F64){
else if (imm == RADDBGI_EvalTypeGroup_F64){
nval.f64 = svals[0].f64 - svals[1].f64;
}
else{
@@ -238,12 +238,12 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode)
}
}break;
case RADDBG_EvalOp_Mul:
case RADDBGI_EvalOp_Mul:
{
if (imm == RADDBG_EvalTypeGroup_F32){
if (imm == RADDBGI_EvalTypeGroup_F32){
nval.f32 = svals[0].f32*svals[1].f32;
}
else if (imm == RADDBG_EvalTypeGroup_F64){
else if (imm == RADDBGI_EvalTypeGroup_F64){
nval.f64 = svals[0].f64*svals[1].f64;
}
else{
@@ -251,9 +251,9 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode)
}
}break;
case RADDBG_EvalOp_Div:
case RADDBGI_EvalOp_Div:
{
if (imm == RADDBG_EvalTypeGroup_F32){
if (imm == RADDBGI_EvalTypeGroup_F32){
if (svals[1].f32 != 0.f){
nval.f32 = svals[0].f32/svals[1].f32;
}
@@ -263,7 +263,7 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode)
goto done;
}
}
else if (imm == RADDBG_EvalTypeGroup_F64){
else if (imm == RADDBGI_EvalTypeGroup_F64){
if (svals[1].f64 != 0.){
nval.f64 = svals[0].f64/svals[1].f64;
}
@@ -273,8 +273,8 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode)
goto done;
}
}
else if (imm == RADDBG_EvalTypeGroup_U ||
imm == RADDBG_EvalTypeGroup_S){
else if (imm == RADDBGI_EvalTypeGroup_U ||
imm == RADDBGI_EvalTypeGroup_S){
if (svals[1].u64 != 0){
nval.u64 = svals[0].u64/svals[1].u64;
}
@@ -290,10 +290,10 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode)
}
}break;
case RADDBG_EvalOp_Mod:
case RADDBGI_EvalOp_Mod:
{
if (imm == RADDBG_EvalTypeGroup_U ||
imm == RADDBG_EvalTypeGroup_S){
if (imm == RADDBGI_EvalTypeGroup_U ||
imm == RADDBGI_EvalTypeGroup_S){
if (svals[1].u64 != 0){
nval.u64 = svals[0].u64%svals[1].u64;
}
@@ -304,10 +304,10 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode)
}
}break;
case RADDBG_EvalOp_LShift:
case RADDBGI_EvalOp_LShift:
{
if (imm == RADDBG_EvalTypeGroup_U ||
imm == RADDBG_EvalTypeGroup_S){
if (imm == RADDBGI_EvalTypeGroup_U ||
imm == RADDBGI_EvalTypeGroup_S){
nval.u64 = svals[0].u64 << svals[1].u64;
}
else{
@@ -316,12 +316,12 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode)
}
}break;
case RADDBG_EvalOp_RShift:
case RADDBGI_EvalOp_RShift:
{
if (imm == RADDBG_EvalTypeGroup_U){
if (imm == RADDBGI_EvalTypeGroup_U){
nval.u64 = svals[0].u64 >> svals[1].u64;
}
else if (imm == RADDBG_EvalTypeGroup_S){
else if (imm == RADDBGI_EvalTypeGroup_S){
nval.u64 = svals[0].s64 >> svals[1].u64;
}
else{
@@ -330,10 +330,10 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode)
}
}break;
case RADDBG_EvalOp_BitAnd:
case RADDBGI_EvalOp_BitAnd:
{
if (imm == RADDBG_EvalTypeGroup_U ||
imm == RADDBG_EvalTypeGroup_S){
if (imm == RADDBGI_EvalTypeGroup_U ||
imm == RADDBGI_EvalTypeGroup_S){
nval.u64 = svals[0].u64&svals[1].u64;
}
else{
@@ -342,10 +342,10 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode)
}
}break;
case RADDBG_EvalOp_BitOr:
case RADDBGI_EvalOp_BitOr:
{
if (imm == RADDBG_EvalTypeGroup_U ||
imm == RADDBG_EvalTypeGroup_S){
if (imm == RADDBGI_EvalTypeGroup_U ||
imm == RADDBGI_EvalTypeGroup_S){
nval.u64 = svals[0].u64|svals[1].u64;
}
else{
@@ -354,10 +354,10 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode)
}
}break;
case RADDBG_EvalOp_BitXor:
case RADDBGI_EvalOp_BitXor:
{
if (imm == RADDBG_EvalTypeGroup_U ||
imm == RADDBG_EvalTypeGroup_S){
if (imm == RADDBGI_EvalTypeGroup_U ||
imm == RADDBGI_EvalTypeGroup_S){
nval.u64 = svals[0].u64^svals[1].u64;
}
else{
@@ -366,10 +366,10 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode)
}
}break;
case RADDBG_EvalOp_BitNot:
case RADDBGI_EvalOp_BitNot:
{
if (imm == RADDBG_EvalTypeGroup_U ||
imm == RADDBG_EvalTypeGroup_S){
if (imm == RADDBGI_EvalTypeGroup_U ||
imm == RADDBGI_EvalTypeGroup_S){
nval.u64 = ~svals[0].u64;
}
else{
@@ -378,10 +378,10 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode)
}
}break;
case RADDBG_EvalOp_LogAnd:
case RADDBGI_EvalOp_LogAnd:
{
if (imm == RADDBG_EvalTypeGroup_U ||
imm == RADDBG_EvalTypeGroup_S){
if (imm == RADDBGI_EvalTypeGroup_U ||
imm == RADDBGI_EvalTypeGroup_S){
nval.u64 = (svals[0].u64 && svals[1].u64);
}
else{
@@ -390,10 +390,10 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode)
}
}break;
case RADDBG_EvalOp_LogOr:
case RADDBGI_EvalOp_LogOr:
{
if (imm == RADDBG_EvalTypeGroup_U ||
imm == RADDBG_EvalTypeGroup_S){
if (imm == RADDBGI_EvalTypeGroup_U ||
imm == RADDBGI_EvalTypeGroup_S){
nval.u64 = (svals[0].u64 || svals[1].u64);
}
else{
@@ -402,10 +402,10 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode)
}
}break;
case RADDBG_EvalOp_LogNot:
case RADDBGI_EvalOp_LogNot:
{
if (imm == RADDBG_EvalTypeGroup_U ||
imm == RADDBG_EvalTypeGroup_S){
if (imm == RADDBGI_EvalTypeGroup_U ||
imm == RADDBGI_EvalTypeGroup_S){
nval.u64 = (!svals[0].u64);
}
else{
@@ -414,28 +414,28 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode)
}
}break;
case RADDBG_EvalOp_EqEq:
case RADDBGI_EvalOp_EqEq:
{
nval.u64 = (svals[0].u64 == svals[1].u64);
}break;
case RADDBG_EvalOp_NtEq:
case RADDBGI_EvalOp_NtEq:
{
nval.u64 = (svals[0].u64 != svals[1].u64);
}break;
case RADDBG_EvalOp_LsEq:
case RADDBGI_EvalOp_LsEq:
{
if (imm == RADDBG_EvalTypeGroup_F32){
if (imm == RADDBGI_EvalTypeGroup_F32){
nval.u64 = (svals[0].f32 <= svals[1].f32);
}
else if (imm == RADDBG_EvalTypeGroup_F64){
else if (imm == RADDBGI_EvalTypeGroup_F64){
nval.u64 = (svals[0].f64 <= svals[1].f64);
}
else if (imm == RADDBG_EvalTypeGroup_U){
else if (imm == RADDBGI_EvalTypeGroup_U){
nval.u64 = (svals[0].u64 <= svals[1].u64);
}
else if (imm == RADDBG_EvalTypeGroup_S){
else if (imm == RADDBGI_EvalTypeGroup_S){
nval.u64 = (svals[0].s64 <= svals[1].s64);
}
else{
@@ -444,18 +444,18 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode)
}
}break;
case RADDBG_EvalOp_GrEq:
case RADDBGI_EvalOp_GrEq:
{
if (imm == RADDBG_EvalTypeGroup_F32){
if (imm == RADDBGI_EvalTypeGroup_F32){
nval.u64 = (svals[0].f32 >= svals[1].f32);
}
else if (imm == RADDBG_EvalTypeGroup_F64){
else if (imm == RADDBGI_EvalTypeGroup_F64){
nval.u64 = (svals[0].f64 >= svals[1].f64);
}
else if (imm == RADDBG_EvalTypeGroup_U){
else if (imm == RADDBGI_EvalTypeGroup_U){
nval.u64 = (svals[0].u64 >= svals[1].u64);
}
else if (imm == RADDBG_EvalTypeGroup_S){
else if (imm == RADDBGI_EvalTypeGroup_S){
nval.u64 = (svals[0].s64 >= svals[1].s64);
}
else{
@@ -464,18 +464,18 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode)
}
}break;
case RADDBG_EvalOp_Less:
case RADDBGI_EvalOp_Less:
{
if (imm == RADDBG_EvalTypeGroup_F32){
if (imm == RADDBGI_EvalTypeGroup_F32){
nval.u64 = (svals[0].f32 < svals[1].f32);
}
else if (imm == RADDBG_EvalTypeGroup_F64){
else if (imm == RADDBGI_EvalTypeGroup_F64){
nval.u64 = (svals[0].f64 < svals[1].f64);
}
else if (imm == RADDBG_EvalTypeGroup_U){
else if (imm == RADDBGI_EvalTypeGroup_U){
nval.u64 = (svals[0].u64 < svals[1].u64);
}
else if (imm == RADDBG_EvalTypeGroup_S){
else if (imm == RADDBGI_EvalTypeGroup_S){
nval.u64 = (svals[0].s64 < svals[1].s64);
}
else{
@@ -484,18 +484,18 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode)
}
}break;
case RADDBG_EvalOp_Grtr:
case RADDBGI_EvalOp_Grtr:
{
if (imm == RADDBG_EvalTypeGroup_F32){
if (imm == RADDBGI_EvalTypeGroup_F32){
nval.u64 = (svals[0].f32 > svals[1].f32);
}
else if (imm == RADDBG_EvalTypeGroup_F64){
else if (imm == RADDBGI_EvalTypeGroup_F64){
nval.u64 = (svals[0].f64 > svals[1].f64);
}
else if (imm == RADDBG_EvalTypeGroup_U){
else if (imm == RADDBGI_EvalTypeGroup_U){
nval.u64 = (svals[0].u64 > svals[1].u64);
}
else if (imm == RADDBG_EvalTypeGroup_S){
else if (imm == RADDBGI_EvalTypeGroup_S){
nval.u64 = (svals[0].s64 > svals[1].s64);
}
else{
@@ -504,7 +504,7 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode)
}
}break;
case RADDBG_EvalOp_Trunc:
case RADDBGI_EvalOp_Trunc:
{
if (0 < imm){
U64 mask = 0;
@@ -515,7 +515,7 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode)
}
}break;
case RADDBG_EvalOp_TruncSigned:
case RADDBGI_EvalOp_TruncSigned:
{
if (0 < imm){
U64 mask = 0;
@@ -530,52 +530,52 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode)
}
}break;
case RADDBG_EvalOp_Convert:
case RADDBGI_EvalOp_Convert:
{
U32 in = imm&0xFF;
U32 out = (imm >> 8)&0xFF;
if (in != out){
switch (in + out*RADDBG_EvalTypeGroup_COUNT){
case RADDBG_EvalTypeGroup_F32 + RADDBG_EvalTypeGroup_U*RADDBG_EvalTypeGroup_COUNT:
switch (in + out*RADDBGI_EvalTypeGroup_COUNT){
case RADDBGI_EvalTypeGroup_F32 + RADDBGI_EvalTypeGroup_U*RADDBGI_EvalTypeGroup_COUNT:
{
nval.u64 = (U64)svals[0].f32;
}break;
case RADDBG_EvalTypeGroup_F64 + RADDBG_EvalTypeGroup_U*RADDBG_EvalTypeGroup_COUNT:
case RADDBGI_EvalTypeGroup_F64 + RADDBGI_EvalTypeGroup_U*RADDBGI_EvalTypeGroup_COUNT:
{
nval.u64 = (U64)svals[0].f64;
}break;
case RADDBG_EvalTypeGroup_F32 + RADDBG_EvalTypeGroup_S*RADDBG_EvalTypeGroup_COUNT:
case RADDBGI_EvalTypeGroup_F32 + RADDBGI_EvalTypeGroup_S*RADDBGI_EvalTypeGroup_COUNT:
{
nval.s64 = (S64)svals[0].f32;
}break;
case RADDBG_EvalTypeGroup_F64 + RADDBG_EvalTypeGroup_S*RADDBG_EvalTypeGroup_COUNT:
case RADDBGI_EvalTypeGroup_F64 + RADDBGI_EvalTypeGroup_S*RADDBGI_EvalTypeGroup_COUNT:
{
nval.s64 = (S64)svals[0].f64;
}break;
case RADDBG_EvalTypeGroup_U + RADDBG_EvalTypeGroup_F32*RADDBG_EvalTypeGroup_COUNT:
case RADDBGI_EvalTypeGroup_U + RADDBGI_EvalTypeGroup_F32*RADDBGI_EvalTypeGroup_COUNT:
{
nval.f32 = (F32)svals[0].u64;
}break;
case RADDBG_EvalTypeGroup_S + RADDBG_EvalTypeGroup_F32*RADDBG_EvalTypeGroup_COUNT:
case RADDBGI_EvalTypeGroup_S + RADDBGI_EvalTypeGroup_F32*RADDBGI_EvalTypeGroup_COUNT:
{
nval.f32 = (F32)svals[0].s64;
}break;
case RADDBG_EvalTypeGroup_F64 + RADDBG_EvalTypeGroup_F32*RADDBG_EvalTypeGroup_COUNT:
case RADDBGI_EvalTypeGroup_F64 + RADDBGI_EvalTypeGroup_F32*RADDBGI_EvalTypeGroup_COUNT:
{
nval.f32 = (F32)svals[0].f64;
}break;
case RADDBG_EvalTypeGroup_U + RADDBG_EvalTypeGroup_F64*RADDBG_EvalTypeGroup_COUNT:
case RADDBGI_EvalTypeGroup_U + RADDBGI_EvalTypeGroup_F64*RADDBGI_EvalTypeGroup_COUNT:
{
nval.f64 = (F64)svals[0].u64;
}break;
case RADDBG_EvalTypeGroup_S + RADDBG_EvalTypeGroup_F64*RADDBG_EvalTypeGroup_COUNT:
case RADDBGI_EvalTypeGroup_S + RADDBGI_EvalTypeGroup_F64*RADDBGI_EvalTypeGroup_COUNT:
{
nval.f64 = (F64)svals[0].s64;
}break;
case RADDBG_EvalTypeGroup_F32 + RADDBG_EvalTypeGroup_F64*RADDBG_EvalTypeGroup_COUNT:
case RADDBGI_EvalTypeGroup_F32 + RADDBGI_EvalTypeGroup_F64*RADDBGI_EvalTypeGroup_COUNT:
{
nval.f64 = (F64)svals[0].f32;
}break;
@@ -583,7 +583,7 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode)
}
}break;
case RADDBG_EvalOp_Pick:
case RADDBGI_EvalOp_Pick:
{
if (stack_count > imm){
nval = stack[stack_count - imm - 1];
@@ -594,12 +594,12 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode)
}
}break;
case RADDBG_EvalOp_Pop:
case RADDBGI_EvalOp_Pop:
{
// do nothing - the pop is handled by the control bits
}break;
case RADDBG_EvalOp_Insert:
case RADDBGI_EvalOp_Insert:
{
if (stack_count > imm){
if (imm > 0){
@@ -619,7 +619,7 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode)
// push
{
U64 push_count = RADDBG_PUSHN_FROM_CTRLBITS(ctrlbits);
U64 push_count = RADDBGI_PUSHN_FROM_CTRLBITS(ctrlbits);
if (push_count == 1){
if (stack_count < stack_cap){
stack[stack_count] = nval;