#ifndef ThunkGenerators_h
#define ThunkGenerators_h
#include "CodeSpecializationKind.h"
#include "RegisterPreservationMode.h"
#include "ThunkGenerator.h"
#if ENABLE(JIT)
namespace JSC {
MacroAssemblerCodeRef throwExceptionFromCallSlowPathGenerator(VM*);
MacroAssemblerCodeRef linkCallThunkGenerator(VM*);
MacroAssemblerCodeRef linkConstructThunkGenerator(VM*);
MacroAssemblerCodeRef linkCallThatPreservesRegsThunkGenerator(VM*);
MacroAssemblerCodeRef linkConstructThatPreservesRegsThunkGenerator(VM*);
inline ThunkGenerator linkThunkGeneratorFor(
CodeSpecializationKind kind, RegisterPreservationMode registers)
{
switch (kind) {
case CodeForCall:
switch (registers) {
case RegisterPreservationNotRequired:
return linkCallThunkGenerator;
case MustPreserveRegisters:
return linkCallThatPreservesRegsThunkGenerator;
}
break;
case CodeForConstruct:
switch (registers) {
case RegisterPreservationNotRequired:
return linkConstructThunkGenerator;
case MustPreserveRegisters:
return linkConstructThatPreservesRegsThunkGenerator;
}
break;
}
RELEASE_ASSERT_NOT_REACHED();
return 0;
}
MacroAssemblerCodeRef linkPolymorphicCallThunkGenerator(VM*);
MacroAssemblerCodeRef linkPolymorphicCallThatPreservesRegsThunkGenerator(VM*);
inline ThunkGenerator linkPolymorphicCallThunkGeneratorFor(RegisterPreservationMode registers)
{
switch (registers) {
case RegisterPreservationNotRequired:
return linkPolymorphicCallThunkGenerator;
case MustPreserveRegisters:
return linkPolymorphicCallThatPreservesRegsThunkGenerator;
}
RELEASE_ASSERT_NOT_REACHED();
return 0;
}
MacroAssemblerCodeRef virtualCallThunkGenerator(VM*);
MacroAssemblerCodeRef virtualConstructThunkGenerator(VM*);
MacroAssemblerCodeRef virtualCallThatPreservesRegsThunkGenerator(VM*);
MacroAssemblerCodeRef virtualConstructThatPreservesRegsThunkGenerator(VM*);
inline ThunkGenerator virtualThunkGeneratorFor(
CodeSpecializationKind kind, RegisterPreservationMode registers)
{
switch (kind) {
case CodeForCall:
switch (registers) {
case RegisterPreservationNotRequired:
return virtualCallThunkGenerator;
case MustPreserveRegisters:
return virtualCallThatPreservesRegsThunkGenerator;
}
break;
case CodeForConstruct:
switch (registers) {
case RegisterPreservationNotRequired:
return virtualConstructThunkGenerator;
case MustPreserveRegisters:
return virtualConstructThatPreservesRegsThunkGenerator;
}
break;
}
RELEASE_ASSERT_NOT_REACHED();
return 0;
}
MacroAssemblerCodeRef nativeCallGenerator(VM*);
MacroAssemblerCodeRef nativeConstructGenerator(VM*);
MacroAssemblerCodeRef nativeTailCallGenerator(VM*);
MacroAssemblerCodeRef arityFixupGenerator(VM*);
MacroAssemblerCodeRef baselineGetterReturnThunkGenerator(VM* vm);
MacroAssemblerCodeRef baselineSetterReturnThunkGenerator(VM* vm);
MacroAssemblerCodeRef charCodeAtThunkGenerator(VM*);
MacroAssemblerCodeRef charAtThunkGenerator(VM*);
MacroAssemblerCodeRef clz32ThunkGenerator(VM*);
MacroAssemblerCodeRef fromCharCodeThunkGenerator(VM*);
MacroAssemblerCodeRef absThunkGenerator(VM*);
MacroAssemblerCodeRef ceilThunkGenerator(VM*);
MacroAssemblerCodeRef expThunkGenerator(VM*);
MacroAssemblerCodeRef floorThunkGenerator(VM*);
MacroAssemblerCodeRef logThunkGenerator(VM*);
MacroAssemblerCodeRef roundThunkGenerator(VM*);
MacroAssemblerCodeRef sqrtThunkGenerator(VM*);
MacroAssemblerCodeRef powThunkGenerator(VM*);
MacroAssemblerCodeRef imulThunkGenerator(VM*);
}
#endif // ENABLE(JIT)
#endif // ThunkGenerator_h