Files
raddebugger/src/regs/regs.c
T
2025-12-05 16:39:02 -08:00

107 lines
2.6 KiB
C

// Copyright (c) Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/)
////////////////////////////////
//~ rjf: Generated Code
#include "regs/generated/regs.meta.c"
////////////////////////////////
//~ rjf: Helpers
internal REGS_RegCode
regs_reg_code_from_name(Arch arch, String8 name)
{
String8 *name_table = regs_reg_code_string_table_from_arch(arch);
U64 name_count = regs_reg_code_count_from_arch(arch);
for EachIndex(i, name_count)
{
if(str8_match(name_table[i], name, StringMatchFlag_CaseInsensitive))
{
return (REGS_RegCode)i;
}
}
return 0;
}
internal REGS_AliasCode
regs_alias_code_from_name(Arch arch, String8 name)
{
String8 *alias_table = regs_alias_code_string_table_from_arch(arch);
U64 alias_count = regs_alias_code_count_from_arch(arch);
for EachIndex(i, alias_count)
{
if(str8_match(alias_table[i], name, StringMatchFlag_CaseInsensitive))
{
return (REGS_RegCode)i;
}
}
return 0;
}
internal Rng1U64
regs_range_from_code(Arch arch, B32 is_alias, U64 reg_code)
{
Rng1U64 range = {0};
if(is_alias)
{
REGS_Slice slice = regs_alias_code_slice_table_from_arch(arch)[reg_code];
REGS_Rng rng = regs_reg_code_rng_table_from_arch(arch)[reg_code];
range = r1u64(rng.byte_off + slice.byte_off, rng.byte_off + slice.byte_off + slice.byte_size);
}
else
{
REGS_Rng rng = regs_reg_code_rng_table_from_arch(arch)[reg_code];
range = r1u64(rng.byte_off, rng.byte_off + rng.byte_size);
}
return range;
}
internal U64
regs_rip_from_arch_block(Arch arch, void *block)
{
U64 result = 0;
if(block != 0) switch(arch)
{
default:{}break;
case Arch_x64:{result = ((REGS_RegBlockX64 *)block)->rip.u64;}break;
case Arch_x86:{NotImplemented;}break;
}
return result;
}
internal U64
regs_rsp_from_arch_block(Arch arch, void *block)
{
U64 result = 0;
if(block != 0) switch(arch)
{
default:{}break;
case Arch_x64:{result = ((REGS_RegBlockX64 *)block)->rsp.u64;}break;
case Arch_x86:{NotImplemented;}break;
}
return result;
}
internal void
regs_arch_block_write_rip(Arch arch, void *block, U64 rip)
{
if(block != 0) switch(arch)
{
default:{}break;
case Arch_x64:{((REGS_RegBlockX64 *)block)->rip.u64 = rip;}break;
case Arch_x86:{NotImplemented;}break;
}
}
internal void
regs_arch_block_write_rsp(Arch arch, void *block, U64 rsp)
{
if(block != 0) switch(arch)
{
default:{}break;
case Arch_x64:{((REGS_RegBlockX64 *)block)->rsp.u64 = rsp;}break;
case Arch_x86:{NotImplemented;}break;
}
}