Concurrent Clean : 文字列

せっかく副作用がないのだから、部分文字列の切り出しは、メモリコピーなしに実装してあるんだよね、ということを確認したくなった。
該当ソース。

empty_string:
	movl	$zero_length_string,a0
	ret

	section	(sliceAC)
sliceAC:
	mov	4(a0),a2
	test	d1,d1
	jns	slice_string_1
	xorl	d1,d1
slice_string_1:
	cmp	a2,d1
	jge	empty_string
	cmp	d1,d0
	jl	empty_string
	inc	d0
	cmp	a2,d0
	jle	slice_string_2
	mov	a2,d0
slice_string_2:
	sub	d1,d0

	lea	8+3(d0),a2
	shr	$2,a2

	lea	-32(a4,a2,4),a1
	cmpl	end_heap,a1
	jae	gc_4
r_gc_4:
	sub	$2,a2
	lea	8(a0,d1),a1

	movl	$__STRING__+2,(a4)
	mov	d0,4(a4)

/ copy part of string
	mov	a2,%ecx
	movl	a4,a2
	add	$8,a4

	xchg	a1,%esi
	cld
	rep
	movsl
	mov	a1,%esi
	mov	a2,a0
	ret

gc_4:
	movl	a1,a2
	call	collect_1l
	lea	8+3(d0),a2
	shr	$2,a2
	jmp	r_gc_4