⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 swap.s.vax

📁 cfront是最开始c++语言到C语言的转换工具
💻 VAX
字号:
	.file	"swap.s.vax"#	ident	"@(#)cls4:lib/task/task/swap.s.vax	1.1"################################################################################# C++ source for the C++ Language System, Release 3.0.  This product# is a new release of the original cfront developed in the computer# science research center of AT&T Bell Laboratories.## Copyright (c) 1991 AT&T and UNIX System Laboratories, Inc.# Copyright (c) 1984, 1989, 1990 AT&T.  All Rights Reserved.## THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE of AT&T and UNIX System#	# Laboratories, Inc.  The copyright notice above does not evidence# any actual or intended publication of such source code.#################################################################################	swap of DEDICATED# call swap(*running_task, *to_run_task, is_new_child, running_is_terminated)# This routine saves the fp in running's t_framep.# If running is a SHARED task, we must save its stack size as well,# although the stack does not need to be copied out here.# It then restores to_run's t_framep to be the current fp.# If to_run is a new child, it explicitly restores the registers from# New_task_regs.  If to_run is not a new child, it simply returns.# If running_task is TERMINATED, then we don't need to do a save.	.globl _swap	.align	1_swap:	.word	0xfc0		# entry mask; save all user regs (r11-r6)	movl	8(ap),r2	# r2 = to_run	movl	16(ap),r1	# r1 = running_is_terminated	cmpl	$1,r1		# if running is TERMINATED	jeql	.L_RESTORE	#	skip save	movl	4(ap),r1	# r1 = running	# save state of running task	movl	fp,20(r1)	# running->t_framep = fp	movl	52(r1),r0	# r0 = running->t_mode	cmpl	$2,r0		# if running->t_mode == SHARED	jneq	.L_RESTORE	# the code here to save the t_size is the same as for sswap	subl3	sp,32(r1),r0		# r0 = running->t_basep - sp					# (size in bytes)	divl3	$4,r0,36(r1)		# running->t_size = r0 / 4 (int).L_RESTORE:	movl	12(ap),r1	# r1 = is_new_child	# restore state of to_run_task	movl	20(r2),fp	# fp = to_run->t_framep	# if is_new_child, restore registers	tstl	r1	jeql	.L_RET	# new child task effectively returns from task::task, so we need	# to set the return value to "this"	movl	24(r2),r0		# r0 = to_run->th	moval	_New_task_regs,r2	# r2 = address of New_task_regs	movl	0(r2),r6	movl	4(r2),r7	movl	8(r2),r8	movl	12(r2),r9	movl	16(r2),r10	movl	20(r2),r11.L_RET:	ret#	swap of SHARED# sswap(*running, *prevOnStack, *to_run, is_new_child, running_is_terminated)# This routine saves the fp in running's t_framep and the stack size in t_size.# Then it copies out the target stack to prevOnStack's t_savearea. # If to_run is not a new child, it then copies the saved stack of to_run# (from t_savearea) to the target stack, and then restores to_run's t_framep# to be the current fp.  We don't need to restore state of a child # to_run object, because it's already in place.# If running_task is TERMINATED, then we don't need to do a save,# and if running_task is TERMINATED and equals prevOnStack, then we don't# have to do the stack copy.	.globl _sswap	.align	1_sswap:	.word	0xfc0		# entry mask; save all user regs (r11-r6)	movl	4(ap),r1		# r1 = running	movl	8(ap),r11		# r11 = prevOnStack	movl	20(ap),r0		# r0 = running_is_terminated	cmpl	$1,r0			# if running is TERMINATED	jeql	.L_SKIP			#	skip save		#save hw state of running	movl	fp,20(r1)		# running->t_framep = fp	subl3	sp,32(r1),r0		# r0 = running->t_basep - sp					# (size in bytes)	divl3	$4,r0,36(r1)		# running->t_size = r0 / 4 (int)	jmp	.L_SAVE.L_SKIP:	#if running is TERMINATED and running == prevOnStack,		#then we can skip the stack copy too	cmpl	r1,r11		# if running == prevOnStack	jeql	.L_REST			#	skip save.L_SAVE:	#copy out target stack to prevOnStack->t_savearea	movl	36(r11),r10		# r10 = prevOnStack->t_size (count)	pushl	r10	calls	$1,_swap_call_new	# get count bytes of storage	ashl	$2,r10,r10		# scale r10 to bytes	addl2	r10,r0			# r0 = base of new space, plus 1	subl2	$4,r0			# r0 = base of new stack (to)	movl	r0,40(r11)		# prevOnStack->t_savearea = r0 (to)	movl	32(r11),r2		# r2 = prevOnStack->t_basep (from)	movl	36(r11),r10		# r10 = prevOnStack->t_size (count).L1:		#copy out loop	tstl	r10			# while (count > 0)	jeql	.L2	decl	r10			# count--	movl	(r2),(r0)		# to = from	cmpl	-(r2),-(r0)		# to--, from--	jmp 	.L1.L2:.L_REST:	movl	16(ap),r1		# r1 = is_new_child	cmpl	$1,r1			# if is_new_child == 1	jeql	.L6			# 	skip the copy-in loop	#copy into target stack from to_run->t_savearea	movl	12(ap),r11		# r11 = to_run	movl	32(r11),r0		# r0 = to_run->t_basep (to)	movl	36(r11),r10		# r10 = to_run->t_size (count)		# Kick up the %sp if new stack will be taller than current.	ashl	$2,r10,r2		# r2 = new stack height in bytes.	subl3	r2,r0,r1		# r1 = target sp	subl2	sp,r1			# r1 = r1 - sp	cmpl	r1,$0			# if r1 < 0, kick up sp	jgeq	.L3	addl2	r1,sp.L3:	movl	40(r11),r2		# r2 = to_run->t_savearea (from).L4:		# copy in loop	tstl	r10			# while (count > 0)	jeql	.L5	decl	r10			# count--	movl	(r2),(r0)		# to = from	cmpl	-(r2),-(r0)		# --to, --from	jmp 	.L4.L5:		# restore state of to_run	movl	20(r11),fp		# fp = to_run->t_framep	# finally, delete to_run's t_savearea	movl	36(r11),r1		# r1 = to_run->t_size	ashl	$2,r1,r1		# scale size to bytes	movl	40(r11),r2		# r2 = to_run->t_savearea	subl2	r1,r2			# get low address of savearea	addl2	$4,r2	pushl	r2	calls	$1,_swap_call_delete	movl	$0,40(r11)		# to_run->t_savearea = 0.L6:	ret

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -