/*
* jitc_var.c - Coder implementation for JIT variables.
*
* Copyright (C) 2001 Southern Storm Software, Pty Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifdef IL_JITC_CODE
/*
* Convert a local/arg to the type needed on the stack.
* Returns the converted value when conversion is needed or value as it is.
*/
static ILJitValue ConvertToStack(ILJITCoder *coder, ILJitValue value)
{
ILJitType type = jit_value_get_type(value);
ILJitType newType = jit_type_promote_int(type);
if(type != newType)
{
return jit_insn_convert(coder->jitFunction, value, newType, 0);
}
if((type == _IL_JIT_TYPE_SINGLE) || (type == _IL_JIT_TYPE_DOUBLE))
{
return jit_insn_convert(coder->jitFunction, value, _IL_JIT_TYPE_NFLOAT, 0);
}
return value;
}
/*
* Handle a load from an argument.
*/
static void JITCoder_LoadArg(ILCoder *coder, ILUInt32 argNum, ILType *type)
{
ILJITCoder *jitCoder = _ILCoderToILJITCoder(coder);
/* We need argNum + 1 because the ILExecThread is added as param 0 */
ILJitValue param = jit_value_get_param(jitCoder->jitFunction, argNum + 1);
ILJitValue newParam = ConvertToStack(jitCoder, param);
jitCoder->jitStack[jitCoder->stackTop] = newParam;
JITC_ADJUST(jitCoder, 1);
}
/*
* Handle a load from a local variable.
*/
static void JITCoder_LoadLocal(ILCoder *coder, ILUInt32 localNum, ILType *type)
{
ILJITCoder *jitCoder = _ILCoderToILJITCoder(coder);
ILJitValue localValue = jitCoder->jitLocals[localNum];
jitCoder->jitStack[jitCoder->stackTop] =
ConvertToStack(jitCoder, localValue);
JITC_ADJUST(jitCoder, 1);
}
/*
* Handle a store to an argument.
*/
static void JITCoder_StoreArg(ILCoder *coder, ILUInt32 argNum,
ILEngineType engineType, ILType *type)
{
ILJITCoder *jitCoder = _ILCoderToILJITCoder(coder);
/* We need argNum + 1 because the ILExecThread is added as param 0 */
ILJitValue argValue = jit_value_get_param(jitCoder->jitFunction, argNum + 1);
jit_insn_store(jitCoder->jitFunction, argValue,
jitCoder->jitStack[jitCoder->stackTop - 1]);
JITC_ADJUST(jitCoder, -1);
}
/*
* Handle a store to a local variable.
*/
static void JITCoder_StoreLocal(ILCoder *coder, ILUInt32 localNum,
ILEngineType engineType, ILType *type)
{
ILJITCoder *jitCoder = _ILCoderToILJITCoder(coder);
jit_insn_store(jitCoder->jitFunction, jitCoder->jitLocals[localNum],
jitCoder->jitStack[jitCoder->stackTop - 1]);
JITC_ADJUST(jitCoder, -1);
}
/*
* Load the address of an argument onto the stack.
*/
static void JITCoder_AddrOfArg(ILCoder *coder, ILUInt32 argNum)
{
ILJITCoder *jitCoder = _ILCoderToILJITCoder(coder);
}
/*
* Load the address of a local onto the stack.
*/
static void JITCoder_AddrOfLocal(ILCoder *coder, ILUInt32 localNum)
{
ILJITCoder *jitCoder = _ILCoderToILJITCoder(coder);
}
/*
* Allocate local stack space.
*/
static void JITCoder_LocalAlloc(ILCoder *coder, ILEngineType sizeType)
{
ILJITCoder *jitCoder = _ILCoderToILJITCoder(coder);
}
#endif /* IL_JITC_CODE */