[Stackless] Stackless Python for Python 2.5.1

Richard Tew richard.m.tew at gmail.com
Wed May 9 15:09:37 CEST 2007


On 5/9/07, Hieu Hoang <hieu.d.hoang at gmail.com> wrote:
> On 5/9/07, Kristján Valur Jónsson <kristjan at ccpgames.com> wrote:
> > From this it seems that we must save rbp, rbx and r12-r15, plus the mxcsr
> > register.
> >
>
> With #define REGS_TO_SAVE "rdx", "rbp", "rbx", "r12", "r13", "r14",
> "r15", "mxcsr":
>
> ./Stackless/platf/switch_amd64_unix.h: In function 'slp_transfer':
> ./Stackless/platf/switch_amd64_unix.h:39: error: unknown register name
> 'mxcsr' in 'asm'
> make: *** [Stackless/core/slp_transfer.o] Error 1

As far as I can tell, it cannot be addressed directly and you need to
load values to it and store values from it manually with specific
assembler instructions (ldmxcsr and stmxcsr).

rbp is already preserved because of the assembler gcc generates, as
shown by the assembler files you have previously provided, where it
was used for

I think that a custom assembler stack switch function is needed here.
Perhaps something like this (not guaranteed to work without tweaking):

@ (int) slp_switch (void);

	.text
	.type	slp_switch, @function
slp_switch:
	pushq	%rbp
	pushq	%r15
	pushq	%r14
	pushq	%r13
	pushq	%r12
	pushq	%rbx

	subq	4, %rsp
	stmxcsr	[%rsp-4]

	call slp_save_state		@  diff = slp_save_state([?]stackref)
	
	cmp	-1, %rax		@ if (diff == -1)
	beq	.exit			@     return -1;

	cmp	-1, %rax		@ if (diff ==  1)
	beq	.no_restore		@     return 0;

.restore:
	addq	%rax, %rsp		@ Adjust the stack pointer for the state we are restoring.

	call slp_restore_state		@ slp_restore_state()

.no_restore:
	xor	%rax, %rax		@ Switch successful (whether we restored or not).

.exit:
	ldmxcsr	[%rsp-4]
	addq	4, %rsp

	popq	%rbx
	popq	%r12
	popq	%r13
	popq	%r14
	popq	%r15

	leave
	ret
.LFE11:
	.size	slp_switch, .-slp_switch

The only thing I am not really really sure about is what register to
pass the stack address into slp_save_state in.  But that could be
determined from the assembler version of slp_switch after it was
compiled with EXTERNAL_ASM defined.

_______________________________________________
Stackless mailing list
Stackless at stackless.com
http://www.stackless.com/mailman/listinfo/stackless



More information about the Stackless mailing list