202 lines
4.9 KiB
C
202 lines
4.9 KiB
C
/*************************************************************************
|
|
* *
|
|
* YAP Prolog *
|
|
* *
|
|
* Yap Prolog was developed at NCCUP - Universidade do Porto *
|
|
* *
|
|
* Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997 *
|
|
* *
|
|
**************************************************************************
|
|
* *
|
|
* File: absmi.c *
|
|
* Last rev: *
|
|
* mods: *
|
|
* comments: Portable abstract machine interpreter that support threaded
|
|
* execution. *
|
|
* *
|
|
*************************************************************************/
|
|
|
|
/**
|
|
* @file absmi-threaded.h
|
|
* @author VITOR SANTOS COSTA <vsc@VITORs-MacBook-Pro.local>
|
|
* @date Sun Aug 2 23:46:47 2015
|
|
*
|
|
* @brief This file implements the support for threaded execution of
|
|
* the YAP abstract machine emulator.
|
|
*
|
|
% Threaded emulators keep the address of the instruction as the opcode
|
|
% itself. This makes it faster to execute virtual instructions, but
|
|
% when grain-size is small it is easy to spend most of the instruction
|
|
% waiting for data.
|
|
%
|
|
* YAP includes several operations to support threaded emulation:
|
|
*
|
|
* - a header that defines the type of instruction;
|
|
*
|
|
* - a transition instruction that moves to the next operation;
|
|
*
|
|
* - get values well before they are needed; this is still
|
|
* useful for the opcode of the next instruction.
|
|
* -
|
|
*
|
|
*/
|
|
|
|
#ifndef ABSMI_THREADED_H
|
|
|
|
#define ABSMI_THREADED_H
|
|
|
|
#if USE_THREADED_CODE
|
|
|
|
#ifndef _NATIVE
|
|
|
|
#if YAP_JIT
|
|
|
|
#define DO_PREFETCH(TYPE) \
|
|
if (ExpEnv.config_struc.current_displacement) \
|
|
to_go = (void *) OpAddress[Yap_op_from_opcode(NEXTOP(PREG,TYPE)->opc) + ExpEnv.config_struc.current_displacement]; \
|
|
else \
|
|
to_go = (void *)(NEXTOP(PREG,TYPE)->opc);
|
|
|
|
#define DO_PREFETCH_W(TYPE) \
|
|
if (ExpEnv.config_struc.current_displacement) \
|
|
to_go = (void *)OpAddress[Yap_op_from_opcode(NEXTOP(PREG,TYPE)->y_u.o.opcw) + ExpEnv.config_struc.current_displacement]; \
|
|
else \
|
|
to_go = (void *)(NEXTOP(PREG,TYPE)->y_u.o.opcw);
|
|
|
|
#else /* YAP_JIT */
|
|
|
|
#define DO_PREFETCH(TYPE) to_go = (void *)(NEXTOP(PREG,TYPE)->opc)
|
|
|
|
#define DO_PREFETCH_W(TYPE) to_go = (void *)(NEXTOP(PREG,TYPE)->y_u.o.opcw)
|
|
|
|
#endif /* YAP_JIT */
|
|
|
|
#else /* _NATIVE */
|
|
|
|
#define DO_PREFETCH(TYPE)
|
|
|
|
#define DO_PREFETCH_W(TYPE)
|
|
|
|
#endif /* _NATIVE */
|
|
|
|
#ifndef _NATIVE
|
|
|
|
#if LIMITED_PREFETCH||USE_PREFETCH
|
|
|
|
#define ALWAYS_START_PREFETCH(TYPE) \
|
|
{ register void *to_go; DO_PREFETCH(TYPE)
|
|
|
|
#if YAP_JIT
|
|
#define ALWAYS_LOOKAHEAD(WHAT) \
|
|
{ \
|
|
register void *to_go; \
|
|
if (ExpEnv.config_struc.current_displacement) \
|
|
to_go = (void *) OpAddress[Yap_op_from_opcode(WHAT) + ExpEnv.config_struc.current_displacement]; \
|
|
else \
|
|
to_go = (void *)(WHAT);
|
|
#else /* YAP_JIT */
|
|
#define ALWAYS_LOOKAHEAD(WHAT) \
|
|
{ register void *to_go = (void *)(WHAT);
|
|
#endif /* YAP_JIT */
|
|
|
|
#define ALWAYS_START_PREFETCH_W(TYPE) \
|
|
{ register void *to_go; DO_PREFETCH_W(TYPE)
|
|
|
|
#else
|
|
|
|
#define ALWAYS_START_PREFETCH(TYPE) {
|
|
|
|
#define ALWAYS_START_PREFETCH_W(TYPE) {
|
|
|
|
#define ALWAYS_LOOKAHEAD(WHERE) {
|
|
|
|
#endif /* LIMITED_PREFETCH||USE_PREFETCH */
|
|
|
|
#else /* _NATIVE */
|
|
|
|
#if LIMITED_PREFETCH||USE_PREFETCH
|
|
|
|
#define ALWAYS_START_PREFETCH(TYPE)
|
|
|
|
#define ALWAYS_LOOKAHEAD(WHAT)
|
|
|
|
#define ALWAYS_START_PREFETCH_W(TYPE)
|
|
|
|
#else
|
|
|
|
#define ALWAYS_START_PREFETCH(TYPE)
|
|
|
|
#define ALWAYS_START_PREFETCH_W(TYPE)
|
|
|
|
#define ALWAYS_LOOKAHEAD(WHERE)
|
|
|
|
#endif /* LIMITED_PREFETCH||USE_PREFETCH */
|
|
|
|
#endif /* _NATIVE */
|
|
|
|
#ifndef _NATIVE
|
|
|
|
#ifdef USE_PREFETCH
|
|
|
|
#define START_PREFETCH(TYPE) ALWAYS_START_PREFETCH(TYPE)
|
|
|
|
#define START_PREFETCH_W(TYPE) ALWAYS_START_PREFETCH_W(TYPE)
|
|
|
|
#define INIT_PREFETCH() \
|
|
{ register void *to_go;
|
|
|
|
#define PREFETCH_OP(X) \
|
|
if (ExpEnv.config_struc.current_displacement) \
|
|
to_go = (void *) OpAddress[Yap_op_from_opcode((X)->opc) + ExpEnv.config_struc.current_displacement]; \
|
|
else \
|
|
to_go = (void *)((X)->opc);
|
|
|
|
#else
|
|
|
|
#define START_PREFETCH(TYPE) {
|
|
|
|
#define START_PREFETCH_W(TYPE) {
|
|
|
|
#define INIT_PREFETCH() {
|
|
|
|
#define PREFETCH_OP(X)
|
|
|
|
#endif /* USE_PREFETCH */
|
|
|
|
#else /* _NATIVE */
|
|
|
|
#ifdef USE_PREFETCH
|
|
|
|
#define START_PREFETCH(TYPE) ALWAYS_START_PREFETCH(TYPE)
|
|
|
|
#define START_PREFETCH_W(TYPE) ALWAYS_START_PREFETCH_W(TYPE)
|
|
|
|
#define INIT_PREFETCH()
|
|
|
|
#define PREFETCH_OP(X)
|
|
|
|
#else
|
|
|
|
#define START_PREFETCH(TYPE)
|
|
|
|
#define START_PREFETCH_W(TYPE)
|
|
|
|
#define INIT_PREFETCH()
|
|
|
|
#define PREFETCH_OP(X)
|
|
|
|
#endif /* USE_PREFETCH */
|
|
|
|
#endif /* _NATIVE */
|
|
|
|
/*****************************************************************
|
|
|
|
How to jump to the next abstract machine instruction
|
|
|
|
******************************************************************/
|
|
|
|
|
|
#endif // THREADED_CODE
|
|
|
|
#endif // ABSMI_THREADED_H
|