UML Internal Register Opcodes - JoakimLarsson/mame GitHub Wiki

Below is a detailed description of all the UML internal register opcodes. For general information about the UML, please see UML Architecture.

Table of Contents

GETEXP

Usage:

 GETEXP  ''dest''

Codegen Shorthand:

 UML_GETEXP(block, PTYPE(''dest''));

Parameters:

  • dest — a 32-bit integer register or memory location
Flags: undefined

Description: The GETEXP opcode fetches the current value of the internal EXP (exception parameter) register. The EXP is set equal to the parameter value that was specified by the most recently executed EXH opcode, or is set equal to the pc parameter from a HASHJMP opcode that failed to find any associated code.

Example:

 void generate_get_exception_parameter_in_i7(drcuml_block *block)
 {
     UML_GETEXP(block, IREG(7));
 }

GETFLGS

Usage:

 GETFLGS ''dest'',''mask''

Codegen Shorthand:

 UML_GETFLGS(block, PTYPE(''dest''), ''mask'');

Parameters:

  • dest — a 32-bit integer register or memory location
  • mask — an immediate mask of the flags to be retrieved
Flags: undefined

Description: The GETFLGS opcode retrieves the current value of the UML flags and stores them in the target destination. Although all of the flags are available, it is rare that all flags are required, and often more efficient if the back-end only needs to fetch a subset of the flags. The mask parameter makes it possible to specify exactly which flags are needed. Bits in dest representing unrequested flags will be set to zero.

Example:

 void generate_get_sign_and_zero_flags_in_i0(drcuml_block *block)
 {
     UML_GETFLGS(block, IREG(0), DRCUML_FLAG_S | DRCUML_FLAG_Z);
 }

GETFMOD

Usage:

 GETFMOD ''dest''

Codegen Shorthand:

 UML_GETFMOD(block, PTYPE(''mode''));

Parameters:

  • dest — a 32-bit integer register or memory location
Flags: undefined

Description: The GETFMOD opcode retrieves the current floating point rounding mode. It will produce one of the following values:

  • DRCUML_FMOD_TRUNC (0) means truncate, or round toward zero
  • DRCUML_FMOD_ROUND (1) means round to nearest
  • DRCUML_FMOD_CEIL (2) means round toward positive infinity
  • DRCUML_FMOD_FLOOR (3) means round toward negative infinity
Example:
 void generate_save_rounding_mode(drcuml_block *block)
 {
     UML_GETFMOD(block, MEM(&saved_mode));
 }

RESTORE

Usage:

 RESTORE ''source''

Codegen Shorthand:

 UML_RESTORE(block, ''source'');

Parameters:

  • source — a memory pointer to a drcuml_machine_state structure
Flags:
  • C — set to the value provided in source
  • V — set to the value provided in source
  • Z — set to the value provided in source
  • S — set to the value provided in source
  • U — set to the value provided in source
Description: The RESTORE opcode copies the provided drcuml_machine_state structure into the live UML machine state.

Example:

 void generate_restore_machine_state(drcuml_block *block, drcuml_machine_state *state)
 {
     UML_RESTORE(block, state);
 }

SAVE

Usage:

 SAVE    ''dest''

Codegen Shorthand:

 UML_SAVE(block, ''dest'');

Parameters:

  • dest — a memory pointer to a drcuml_machine_state structure
Flags: undefined

Description: The SAVE opcode dumps the current UML machine state to the provided drcuml_machine_state structure. This state may be used for debugging or compliance analysis.

Example:

 void generate_save_machine_state(drcuml_block *block)
 {
     UML_SAVE(block, &state);
 }

SETFMOD

Usage:

 SETFMOD ''mode''

Codegen Shorthand:

 UML_SETFMOD(block, PTYPE(''mode''));

Parameters:

  • mode — a 32-bit integer register, memory location, map variable, or immediate
Flags: undefined

Description: The SETFMOD opcode sets the currently active floating point rounding mode, which is implicitly used when performing most floating point operations (apart from those which explicitly specify a mode). The mode can be one of four values:

  • DRCUML_FMOD_TRUNC (0) means truncate, or round toward zero
  • DRCUML_FMOD_ROUND (1) means round to nearest
  • DRCUML_FMOD_CEIL (2) means round toward positive infinity
  • DRCUML_FMOD_FLOOR (3) means round toward negative infinity
Only the two least significant bits of the mode parameter are considered; all other bits are ignored. Note that the floating point mode is forgotten once an EXIT opcode is executed. A dynamic recompiler that relies on the rounding mode must reset it in its entry point via this opcode.

Example:

 void generate_set_fixed_rounding_mode(drcuml_block *block, int mode)
 {
     UML_SETFMOD(block, IMM(mode));
 }
⚠️ **GitHub.com Fallback** ⚠️