1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project// Works on all IA-64 platforms: Linux, HP-UX, Win64i...
2656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project// On Win64i compile with ias.exe.
3656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.text
4221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
5221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.global	OPENSSL_cpuid_setup#
6221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.proc	OPENSSL_cpuid_setup#
7221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromOPENSSL_cpuid_setup:
8221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom{ .mib;	br.ret.sptk.many	b0		};;
9221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.endp	OPENSSL_cpuid_setup#
10221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.global	OPENSSL_rdtsc#
12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.proc	OPENSSL_rdtsc#
13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectOPENSSL_rdtsc:
14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ .mib;	mov			r8=ar.itc
15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	br.ret.sptk.many	b0		};;
16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.endp   OPENSSL_rdtsc#
17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.global	OPENSSL_atomic_add#
19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.proc	OPENSSL_atomic_add#
20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align	32
21656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectOPENSSL_atomic_add:
22656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ .mii;	ld4		r2=[r32]
23656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	nop.i		0
24656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	nop.i		0		};;
25656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lspin:
26656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ .mii;	mov		ar.ccv=r2
27656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	add		r8=r2,r33
28656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov		r3=r2		};;
29392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom{ .mmi;	mf;;
30656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	cmpxchg4.acq	r2=[r32],r8,ar.ccv
31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	nop.i		0		};;
32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ .mib;	cmp.ne		p6,p0=r2,r3
33656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	nop.i		0
34656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project(p6)	br.dpnt		.Lspin		};;
35656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ .mib;	nop.m		0
36656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sxt4		r8=r8
37656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	br.ret.sptk.many	b0	};;
38656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.endp	OPENSSL_atomic_add#
39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project// Returns a structure comprising pointer to the top of stack of
41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project// the caller and pointer beyond backing storage for the current
42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project// register frame. The latter is required, because it might be
43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project// insufficient to wipe backing storage for the current frame
44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project// (as this procedure does), one might have to go further, toward
45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project// higher addresses to reach for whole "retroactively" saved
46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project// context...
47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.global	OPENSSL_wipe_cpu#
48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.proc	OPENSSL_wipe_cpu#
49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align	32
50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectOPENSSL_wipe_cpu:
51656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	.prologue
52656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	.fframe	0
53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	.save	ar.pfs,r2
54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	.save	ar.lc,r3
55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ .mib;	alloc		r2=ar.pfs,0,96,0,96
56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov		r3=ar.lc
57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	brp.loop.imp	.L_wipe_top,.L_wipe_end-16
58656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					};;
59656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ .mii;	mov		r9=ar.bsp
60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov		r8=pr
61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov		ar.lc=96	};;
62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	.body
63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ .mii;	add		r9=96*8-8,r9
64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov		ar.ec=1		};;
65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project// One can sweep double as fast, but then we can't quarantee
67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project// that backing storage is wiped...
68656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.L_wipe_top:
69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ .mfi;	st8		[r9]=r0,-8
70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov		f127=f0
71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov		r127=r0		}
72656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ .mfb;	nop.m		0
73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	nop.f		0
74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	br.ctop.sptk	.L_wipe_top	};;
75656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.L_wipe_end:
76656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ .mfi;	mov		r11=r0
78656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov		f6=f0
79656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov		r14=r0		}
80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ .mfi;	mov		r15=r0
81656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov		f7=f0
82656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov		r16=r0		}
83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ .mfi;	mov		r17=r0
84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov		f8=f0
85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov		r18=r0		}
86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ .mfi;	mov		r19=r0
87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov		f9=f0
88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov		r20=r0		}
89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ .mfi;	mov		r21=r0
90656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov		f10=f0
91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov		r22=r0		}
92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ .mfi;	mov		r23=r0
93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov		f11=f0
94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov		r24=r0		}
95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ .mfi;	mov		r25=r0
96656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov		f12=f0
97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov		r26=r0		}
98656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ .mfi;	mov		r27=r0
99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov		f13=f0
100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov		r28=r0		}
101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ .mfi;	mov		r29=r0
102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov		f14=f0
103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov		r30=r0		}
104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ .mfi;	mov		r31=r0
105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov		f15=f0
106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	nop.i		0		}
107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ .mfi;	mov		f16=f0		}
108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ .mfi;	mov		f17=f0		}
109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ .mfi;	mov		f18=f0		}
110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ .mfi;	mov		f19=f0		}
111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ .mfi;	mov		f20=f0		}
112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ .mfi;	mov		f21=f0		}
113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ .mfi;	mov		f22=f0		}
114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ .mfi;	mov		f23=f0		}
115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ .mfi;	mov		f24=f0		}
116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ .mfi;	mov		f25=f0		}
117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ .mfi;	mov		f26=f0		}
118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ .mfi;	mov		f27=f0		}
119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ .mfi;	mov		f28=f0		}
120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ .mfi;	mov		f29=f0		}
121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ .mfi;	mov		f30=f0		}
122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ .mfi;	add		r9=96*8+8,r9
123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov		f31=f0
124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov		pr=r8,0x1ffff	}
125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ .mib;	mov		r8=sp
126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov		ar.lc=r3
127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	br.ret.sptk	b0		};;
128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.endp	OPENSSL_wipe_cpu#
129221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
130221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.global	OPENSSL_cleanse#
131221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.proc	OPENSSL_cleanse#
132221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromOPENSSL_cleanse:
133221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom{ .mib;	cmp.eq		p6,p0=0,r33	    // len==0
134221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#if defined(_HPUX_SOURCE) && !defined(_LP64)
135221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	addp4		r32=0,r32
136221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#endif
137221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom(p6)	br.ret.spnt	b0		};;
138221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom{ .mib;	and		r2=7,r32
139221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	cmp.leu		p6,p0=15,r33	    // len>=15
140221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom(p6)	br.cond.dptk	.Lot		};;
141221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
142221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Little:
143221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom{ .mib;	st1		[r32]=r0,1
144221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	cmp.ltu		p6,p7=1,r33	}  // len>1
145221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom{ .mbb;	add		r33=-1,r33	   // len--
146221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom(p6)	br.cond.dptk	.Little
147221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom(p7)	br.ret.sptk.many	b0	};;
148221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
149221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lot:
150221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom{ .mib;	cmp.eq		p6,p0=0,r2
151221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom(p6)	br.cond.dptk	.Laligned	};;
152221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom{ .mmi;	st1		[r32]=r0,1;;
153221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	and		r2=7,r32	}
154221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom{ .mib;	add		r33=-1,r33
155221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	br		.Lot		};;
156221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
157221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Laligned:
158221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom{ .mmi;	st8		[r32]=r0,8
159221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	and		r2=-8,r33	    // len&~7
160221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	add		r33=-8,r33	};; // len-=8
161221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom{ .mib;	cmp.ltu		p6,p0=8,r2	    // ((len+8)&~7)>8
162221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom(p6)	br.cond.dptk	.Laligned	};;
163221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
164221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom{ .mbb;	cmp.eq		p6,p7=r0,r33
165221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom(p7)	br.cond.dpnt	.Little
166221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom(p6)	br.ret.sptk.many	b0	};;
167221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.endp	OPENSSL_cleanse#
168