xref: /haiku/src/system/libroot/os/arch/ppc/byteorder.S (revision f2762b2d5658b0b6c9ff62997a1485194cc77e7c)
1/*
2** Copyright 2003, Axel D�fler, axeld@pinc-software.de. All rights reserved.
3** Distributed under the terms of the OpenBeOS License.
4*/
5
6#define FUNCTION(x) .global x; .type x,@function; x
7
8.text
9
10/* float __swap_float(float value)
11 *					  f1
12 */
13FUNCTION(__swap_float):
14		// push a stack frame
15		stwu	%r1, -32(%r1)
16		mflr	%r0
17		stw		%r0, 36(%r1)
18
19		// %f1 -> %r3
20		stfs	%f1, 20(%r1)
21		lwz		%r3, 20(%r1)
22
23		// let __swap_int32 convert %r3
24		bl		__swap_int32
25
26		// %r3 -> %f1
27		stw		%r3, 20(%r1)
28		lfs		%f1, 20(%r1)
29
30		// pop the stack frame
31		lwz		%r0, 36(%r1)
32		mtlr	%r0
33		addi	%r1, %r1, 32
34		blr
35
36/* double __swap_double(double value)
37 *						f1
38 */
39FUNCTION(__swap_double):
40		// push a stack frame
41		stwu	%r1, -32(%r1)
42		mflr	%r0
43		stw		%r0, 36(%r1)
44
45		// %f1 -> (%r3:%r4)
46		stfd	%f1, 20(%r1)
47		lwz		%r3, 20(%r1)
48		lwz		%r4, 24(%r1)
49
50		// let __swap_int64 convert %r3:%r4
51		bl		__swap_int64
52
53		// (%r3:%r4) -> %f1
54		stw		%r3, 20(%r1)
55		stw		%r4, 24(%r1)
56		lfd		%f1, 20(%r1)
57
58		// pop the stack frame
59		lwz		%r0, 36(%r1)
60		mtlr	%r0
61		addi	%r1, %r1, 32
62		blr
63