xref: /plan9/sys/src/libc/power/memmove.s (revision 6891d8578618fb7ccda4a131c122d4d0e6580c4b)
17dd7cddfSDavid du Colombier#define	BDNZ	BC	16,0,
2*6891d857SDavid du Colombier	TEXT	memmove(SB), $0
37dd7cddfSDavid du Colombier	BR	move
47dd7cddfSDavid du Colombier
5*6891d857SDavid du Colombier	TEXT	memcpy(SB), $0
67dd7cddfSDavid du Colombiermove:
77dd7cddfSDavid du Colombier
87dd7cddfSDavid du Colombier/*
97dd7cddfSDavid du Colombier * performance:
107dd7cddfSDavid du Colombier * (tba)
117dd7cddfSDavid du Colombier */
127dd7cddfSDavid du Colombier
137dd7cddfSDavid du Colombier	MOVW	R3, s1+0(FP)
147dd7cddfSDavid du Colombier	MOVW	n+8(FP), R9		/* R9 is count */
157dd7cddfSDavid du Colombier	MOVW	R3, R10			/* R10 is to-pointer */
167dd7cddfSDavid du Colombier	CMP	R9, $0
177dd7cddfSDavid du Colombier	BEQ	ret
187dd7cddfSDavid du Colombier	BLT	trap
197dd7cddfSDavid du Colombier	MOVW	s2+4(FP), R11		/* R11 is from-pointer */
207dd7cddfSDavid du Colombier
217dd7cddfSDavid du Colombier/*
227dd7cddfSDavid du Colombier * if no more than 16 bytes, just use one lsw/stsw
237dd7cddfSDavid du Colombier */
247dd7cddfSDavid du Colombier	CMP	R9, $16
257dd7cddfSDavid du Colombier	BLE	fout
267dd7cddfSDavid du Colombier
277dd7cddfSDavid du Colombier	ADD	R9,R11, R13		/* R13 is end from-pointer */
287dd7cddfSDavid du Colombier	ADD	R9,R10, R12		/* R12 is end to-pointer */
297dd7cddfSDavid du Colombier
307dd7cddfSDavid du Colombier/*
317dd7cddfSDavid du Colombier * easiest test is copy backwards if
327dd7cddfSDavid du Colombier * destination string has higher mem address
337dd7cddfSDavid du Colombier */
347dd7cddfSDavid du Colombier	CMPU	R10, R11
357dd7cddfSDavid du Colombier	BGT	back
367dd7cddfSDavid du Colombier
377dd7cddfSDavid du Colombier/*
387dd7cddfSDavid du Colombier * test if both pointers
397dd7cddfSDavid du Colombier * are similarly word aligned
407dd7cddfSDavid du Colombier */
417dd7cddfSDavid du Colombier	XOR	R10,R11, R7
427dd7cddfSDavid du Colombier	ANDCC	$3,R7
437dd7cddfSDavid du Colombier	BNE	fbad
447dd7cddfSDavid du Colombier
457dd7cddfSDavid du Colombier/*
467dd7cddfSDavid du Colombier * move a few bytes to align pointers
477dd7cddfSDavid du Colombier */
487dd7cddfSDavid du Colombier	ANDCC	$3,R10,R7
497dd7cddfSDavid du Colombier	BEQ	f2
507dd7cddfSDavid du Colombier	SUBC	R7, $4, R7
517dd7cddfSDavid du Colombier	SUB	R7, R9
527dd7cddfSDavid du Colombier	MOVW	R7, XER
537dd7cddfSDavid du Colombier	LSW	(R11), R16
547dd7cddfSDavid du Colombier	ADD	R7, R11
557dd7cddfSDavid du Colombier	STSW	R16, (R10)
567dd7cddfSDavid du Colombier	ADD	R7, R10
577dd7cddfSDavid du Colombier
587dd7cddfSDavid du Colombier/*
597dd7cddfSDavid du Colombier * turn R14 into doubleword count
607dd7cddfSDavid du Colombier * copy 16 bytes at a time while there's room.
617dd7cddfSDavid du Colombier */
627dd7cddfSDavid du Colombierf2:
637dd7cddfSDavid du Colombier	SRAWCC	$4, R9, R14
647dd7cddfSDavid du Colombier	BLE	fout
657dd7cddfSDavid du Colombier	MOVW	R14, CTR
667dd7cddfSDavid du Colombier	SUB	$4, R11
677dd7cddfSDavid du Colombier	SUB	$4, R10
687dd7cddfSDavid du Colombierf3:
697dd7cddfSDavid du Colombier	MOVWU	4(R11), R16
707dd7cddfSDavid du Colombier	MOVWU	4(R11), R17
71*6891d857SDavid du Colombier	MOVWU	4(R11), R18
72*6891d857SDavid du Colombier	MOVWU	4(R11), R19
737dd7cddfSDavid du Colombier	MOVWU	R16, 4(R10)
747dd7cddfSDavid du Colombier	MOVWU	R17, 4(R10)
75*6891d857SDavid du Colombier	MOVWU	R18, 4(R10)
76*6891d857SDavid du Colombier	MOVWU	R19, 4(R10)
777dd7cddfSDavid du Colombier	BDNZ	f3
787dd7cddfSDavid du Colombier	RLWNMCC	$0, R9, $15, R9	/* residue */
797dd7cddfSDavid du Colombier	BEQ	ret
807dd7cddfSDavid du Colombier	ADD	$4, R11
817dd7cddfSDavid du Colombier	ADD	$4, R10
827dd7cddfSDavid du Colombier
837dd7cddfSDavid du Colombier/*
847dd7cddfSDavid du Colombier * move up to 16 bytes through R16 .. R19; aligned and unaligned
857dd7cddfSDavid du Colombier */
867dd7cddfSDavid du Colombierfout:
877dd7cddfSDavid du Colombier	MOVW	R9, XER
887dd7cddfSDavid du Colombier	LSW	(R11), R16
897dd7cddfSDavid du Colombier	STSW	R16, (R10)
907dd7cddfSDavid du Colombier	BR	ret
917dd7cddfSDavid du Colombier
927dd7cddfSDavid du Colombier/*
937dd7cddfSDavid du Colombier * loop for unaligned copy, then copy up to 15 remaining bytes
947dd7cddfSDavid du Colombier */
957dd7cddfSDavid du Colombierfbad:
967dd7cddfSDavid du Colombier	SRAWCC	$4, R9, R14
977dd7cddfSDavid du Colombier	BLE	f6
987dd7cddfSDavid du Colombier	MOVW	R14, CTR
997dd7cddfSDavid du Colombierf5:
1007dd7cddfSDavid du Colombier	LSW	(R11), $16, R16
1017dd7cddfSDavid du Colombier	ADD	$16, R11
1027dd7cddfSDavid du Colombier	STSW	R16, $16, (R10)
1037dd7cddfSDavid du Colombier	ADD	$16, R10
1047dd7cddfSDavid du Colombier	BDNZ	f5
1057dd7cddfSDavid du Colombier	RLWNMCC	$0, R9, $15, R9	/* residue */
1067dd7cddfSDavid du Colombier	BEQ	ret
1077dd7cddfSDavid du Colombierf6:
1087dd7cddfSDavid du Colombier	MOVW	R9, XER
1097dd7cddfSDavid du Colombier	LSW	(R11), R16
1107dd7cddfSDavid du Colombier	STSW	R16, (R10)
1117dd7cddfSDavid du Colombier	BR	ret
1127dd7cddfSDavid du Colombier
1137dd7cddfSDavid du Colombier/*
1147dd7cddfSDavid du Colombier * whole thing repeated for backwards
1157dd7cddfSDavid du Colombier */
1167dd7cddfSDavid du Colombierback:
1177dd7cddfSDavid du Colombier	CMP	R9, $4
1187dd7cddfSDavid du Colombier	BLT	bout
1197dd7cddfSDavid du Colombier
1207dd7cddfSDavid du Colombier	XOR	R12,R13, R7
1217dd7cddfSDavid du Colombier	ANDCC	$3,R7
1227dd7cddfSDavid du Colombier	BNE	bout
1237dd7cddfSDavid du Colombierb1:
1247dd7cddfSDavid du Colombier	ANDCC	$3,R13, R7
1257dd7cddfSDavid du Colombier	BEQ	b2
1267dd7cddfSDavid du Colombier	MOVBZU	-1(R13), R16
1277dd7cddfSDavid du Colombier	MOVBZU	R16, -1(R12)
1287dd7cddfSDavid du Colombier	SUB	$1, R9
1297dd7cddfSDavid du Colombier	BR	b1
1307dd7cddfSDavid du Colombierb2:
1317dd7cddfSDavid du Colombier	SRAWCC	$4, R9, R14
1327dd7cddfSDavid du Colombier	BLE	b4
1337dd7cddfSDavid du Colombier	MOVW	R14, CTR
1347dd7cddfSDavid du Colombierb3:
1357dd7cddfSDavid du Colombier	MOVWU	-4(R13), R16
1367dd7cddfSDavid du Colombier	MOVWU	-4(R13), R17
137*6891d857SDavid du Colombier	MOVWU	-4(R13), R18
138*6891d857SDavid du Colombier	MOVWU	-4(R13), R19
1397dd7cddfSDavid du Colombier	MOVWU	R16, -4(R12)
1407dd7cddfSDavid du Colombier	MOVWU	R17, -4(R12)
141*6891d857SDavid du Colombier	MOVWU	R18, -4(R12)
142*6891d857SDavid du Colombier	MOVWU	R19, -4(R12)
1437dd7cddfSDavid du Colombier	BDNZ	b3
1447dd7cddfSDavid du Colombier	RLWNMCC	$0, R9, $15, R9	/* residue */
1457dd7cddfSDavid du Colombier	BEQ	ret
1467dd7cddfSDavid du Colombierb4:
1477dd7cddfSDavid du Colombier	SRAWCC	$2, R9, R14
1487dd7cddfSDavid du Colombier	BLE	bout
1497dd7cddfSDavid du Colombier	MOVW	R14, CTR
1507dd7cddfSDavid du Colombierb5:
1517dd7cddfSDavid du Colombier	MOVWU	-4(R13), R16
1527dd7cddfSDavid du Colombier	MOVWU	R16, -4(R12)
1537dd7cddfSDavid du Colombier	BDNZ	b5
1547dd7cddfSDavid du Colombier	RLWNMCC	$0, R9, $3, R9	/* residue */
1557dd7cddfSDavid du Colombier	BEQ	ret
1567dd7cddfSDavid du Colombier
1577dd7cddfSDavid du Colombierbout:
1587dd7cddfSDavid du Colombier	CMPU	R13, R11
1597dd7cddfSDavid du Colombier	BLE	ret
1607dd7cddfSDavid du Colombier	MOVBZU	-1(R13), R16
1617dd7cddfSDavid du Colombier	MOVBZU	R16, -1(R12)
1627dd7cddfSDavid du Colombier	BR	bout
1637dd7cddfSDavid du Colombier
1647dd7cddfSDavid du Colombiertrap:
1657dd7cddfSDavid du Colombier	MOVW	$0, R0
1667dd7cddfSDavid du Colombier	MOVW	0(R0), R0
1677dd7cddfSDavid du Colombier
1687dd7cddfSDavid du Colombierret:
1697dd7cddfSDavid du Colombier	MOVW	s1+0(FP), R3
1707dd7cddfSDavid du Colombier	RETURN
171