| 
									
										
										
										
											2007-05-16 04:51:48 +08:00
										 |  |  | #!/usr/bin/env perl | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-14 06:01:30 +08:00
										 |  |  | $flavour = shift; | 
					
						
							| 
									
										
										
										
											2007-05-16 04:51:48 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; | 
					
						
							|  |  |  | ( $xlate="${dir}ppc-xlate.pl" and -f $xlate ) or | 
					
						
							|  |  |  | ( $xlate="${dir}perlasm/ppc-xlate.pl" and -f $xlate) or | 
					
						
							|  |  |  | die "can't locate ppc-xlate.pl"; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-14 06:01:30 +08:00
										 |  |  | open STDOUT,"| $^X $xlate $flavour ".shift || die "can't call $xlate: $!"; | 
					
						
							| 
									
										
										
										
											2007-05-16 04:51:48 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-14 06:01:30 +08:00
										 |  |  | if ($flavour=~/64/) { | 
					
						
							| 
									
										
										
										
											2007-05-16 04:51:48 +08:00
										 |  |  |     $CMPLI="cmpldi"; | 
					
						
							|  |  |  |     $SHRLI="srdi"; | 
					
						
							|  |  |  |     $SIGNX="extsw"; | 
					
						
							|  |  |  | } else { | 
					
						
							|  |  |  |     $CMPLI="cmplwi"; | 
					
						
							|  |  |  |     $SHRLI="srwi"; | 
					
						
							|  |  |  |     $SIGNX="mr"; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | $code=<<___; | 
					
						
							| 
									
										
										
										
											2008-09-12 22:45:54 +08:00
										 |  |  | .machine	"any" | 
					
						
							| 
									
										
										
										
											2007-05-16 04:51:48 +08:00
										 |  |  | .text | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-27 05:30:13 +08:00
										 |  |  | .globl	.OPENSSL_ppc64_probe | 
					
						
							| 
									
										
										
										
											2007-05-16 04:51:48 +08:00
										 |  |  | .align	4 | 
					
						
							| 
									
										
										
										
											2009-12-27 05:30:13 +08:00
										 |  |  | .OPENSSL_ppc64_probe: | 
					
						
							|  |  |  | 	fcfid	f1,f1 | 
					
						
							|  |  |  | 	extrdi	r0,r0,32,0 | 
					
						
							| 
									
										
										
										
											2007-05-16 04:51:48 +08:00
										 |  |  | 	blr | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-10 23:00:51 +08:00
										 |  |  | .globl	.OPENSSL_altivec_probe | 
					
						
							|  |  |  | .align	4 | 
					
						
							|  |  |  | .OPENSSL_altivec_probe: | 
					
						
							|  |  |  | 	.long	0x10000484	# vor	v0,v0,v0 | 
					
						
							|  |  |  | 	blr | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-05-16 04:51:48 +08:00
										 |  |  | .globl	.OPENSSL_wipe_cpu | 
					
						
							|  |  |  | .align	4 | 
					
						
							|  |  |  | .OPENSSL_wipe_cpu: | 
					
						
							|  |  |  | 	xor	r0,r0,r0 | 
					
						
							| 
									
										
										
										
											2010-01-17 21:44:14 +08:00
										 |  |  | 	fmr	f0,f31 | 
					
						
							|  |  |  | 	fmr	f1,f31 | 
					
						
							|  |  |  | 	fmr	f2,f31 | 
					
						
							| 
									
										
										
										
											2007-05-16 04:51:48 +08:00
										 |  |  | 	mr	r3,r1 | 
					
						
							| 
									
										
										
										
											2010-01-17 21:44:14 +08:00
										 |  |  | 	fmr	f3,f31 | 
					
						
							| 
									
										
										
										
											2007-05-16 04:51:48 +08:00
										 |  |  | 	xor	r4,r4,r4 | 
					
						
							| 
									
										
										
										
											2010-01-17 21:44:14 +08:00
										 |  |  | 	fmr	f4,f31 | 
					
						
							| 
									
										
										
										
											2007-05-16 04:51:48 +08:00
										 |  |  | 	xor	r5,r5,r5 | 
					
						
							| 
									
										
										
										
											2010-01-17 21:44:14 +08:00
										 |  |  | 	fmr	f5,f31 | 
					
						
							| 
									
										
										
										
											2007-05-16 04:51:48 +08:00
										 |  |  | 	xor	r6,r6,r6 | 
					
						
							| 
									
										
										
										
											2010-01-17 21:44:14 +08:00
										 |  |  | 	fmr	f6,f31 | 
					
						
							| 
									
										
										
										
											2007-05-16 04:51:48 +08:00
										 |  |  | 	xor	r7,r7,r7 | 
					
						
							| 
									
										
										
										
											2010-01-17 21:44:14 +08:00
										 |  |  | 	fmr	f7,f31 | 
					
						
							| 
									
										
										
										
											2007-05-16 04:51:48 +08:00
										 |  |  | 	xor	r8,r8,r8 | 
					
						
							| 
									
										
										
										
											2010-01-17 21:44:14 +08:00
										 |  |  | 	fmr	f8,f31 | 
					
						
							| 
									
										
										
										
											2007-05-16 04:51:48 +08:00
										 |  |  | 	xor	r9,r9,r9 | 
					
						
							| 
									
										
										
										
											2010-01-17 21:44:14 +08:00
										 |  |  | 	fmr	f9,f31 | 
					
						
							| 
									
										
										
										
											2007-05-16 04:51:48 +08:00
										 |  |  | 	xor	r10,r10,r10 | 
					
						
							| 
									
										
										
										
											2010-01-17 21:44:14 +08:00
										 |  |  | 	fmr	f10,f31 | 
					
						
							| 
									
										
										
										
											2007-05-16 04:51:48 +08:00
										 |  |  | 	xor	r11,r11,r11 | 
					
						
							| 
									
										
										
										
											2010-01-17 21:44:14 +08:00
										 |  |  | 	fmr	f11,f31 | 
					
						
							| 
									
										
										
										
											2007-05-16 04:51:48 +08:00
										 |  |  | 	xor	r12,r12,r12 | 
					
						
							| 
									
										
										
										
											2010-01-17 21:44:14 +08:00
										 |  |  | 	fmr	f12,f31 | 
					
						
							|  |  |  | 	fmr	f13,f31 | 
					
						
							| 
									
										
										
										
											2007-05-16 04:51:48 +08:00
										 |  |  | 	blr | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .globl	.OPENSSL_atomic_add | 
					
						
							|  |  |  | .align	4 | 
					
						
							|  |  |  | .OPENSSL_atomic_add: | 
					
						
							| 
									
										
										
										
											2011-04-17 20:46:00 +08:00
										 |  |  | Ladd:	lwarx	r5,0,r3 | 
					
						
							| 
									
										
										
										
											2007-05-16 04:51:48 +08:00
										 |  |  | 	add	r0,r4,r5 | 
					
						
							|  |  |  | 	stwcx.	r0,0,r3 | 
					
						
							| 
									
										
										
										
											2011-04-17 20:46:00 +08:00
										 |  |  | 	bne-	Ladd | 
					
						
							| 
									
										
										
										
											2007-05-16 04:51:48 +08:00
										 |  |  | 	$SIGNX	r3,r0 | 
					
						
							|  |  |  | 	blr | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .globl	.OPENSSL_rdtsc | 
					
						
							|  |  |  | .align	4 | 
					
						
							|  |  |  | .OPENSSL_rdtsc: | 
					
						
							|  |  |  | 	mftb	r3 | 
					
						
							|  |  |  | 	mftbu	r4 | 
					
						
							|  |  |  | 	blr | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .globl	.OPENSSL_cleanse | 
					
						
							|  |  |  | .align	4 | 
					
						
							|  |  |  | .OPENSSL_cleanse: | 
					
						
							|  |  |  | 	$CMPLI	r4,7 | 
					
						
							|  |  |  | 	li	r0,0 | 
					
						
							|  |  |  | 	bge	Lot | 
					
						
							| 
									
										
										
										
											2010-01-24 22:54:24 +08:00
										 |  |  | 	$CMPLI	r4,0 | 
					
						
							|  |  |  | 	beqlr- | 
					
						
							| 
									
										
										
										
											2007-05-16 04:51:48 +08:00
										 |  |  | Little:	mtctr	r4 | 
					
						
							|  |  |  | 	stb	r0,0(r3) | 
					
						
							|  |  |  | 	addi	r3,r3,1 | 
					
						
							| 
									
										
										
										
											2007-08-01 02:19:40 +08:00
										 |  |  | 	bdnz-	\$-8 | 
					
						
							| 
									
										
										
										
											2007-05-16 04:51:48 +08:00
										 |  |  | 	blr | 
					
						
							|  |  |  | Lot:	andi.	r5,r3,3 | 
					
						
							|  |  |  | 	beq	Laligned | 
					
						
							|  |  |  | 	stb	r0,0(r3) | 
					
						
							|  |  |  | 	subi	r4,r4,1 | 
					
						
							|  |  |  | 	addi	r3,r3,1 | 
					
						
							|  |  |  | 	b	Lot | 
					
						
							|  |  |  | Laligned: | 
					
						
							|  |  |  | 	$SHRLI	r5,r4,2 | 
					
						
							|  |  |  | 	mtctr	r5 | 
					
						
							|  |  |  | 	stw	r0,0(r3) | 
					
						
							|  |  |  | 	addi	r3,r3,4 | 
					
						
							| 
									
										
										
										
											2007-08-01 02:19:40 +08:00
										 |  |  | 	bdnz-	\$-8 | 
					
						
							| 
									
										
										
										
											2007-05-16 04:51:48 +08:00
										 |  |  | 	andi.	r4,r4,3 | 
					
						
							|  |  |  | 	bne	Little | 
					
						
							|  |  |  | 	blr | 
					
						
							|  |  |  | ___ | 
					
						
							| 
									
										
										
										
											2011-04-17 20:46:00 +08:00
										 |  |  | { | 
					
						
							|  |  |  | my ($out,$cnt,$max)=("r3","r4","r5"); | 
					
						
							|  |  |  | my ($tick,$lasttick)=("r6","r7"); | 
					
						
							|  |  |  | my ($diff,$lastdiff)=("r8","r9"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | $code.=<<___; | 
					
						
							|  |  |  | .globl	.OPENSSL_instrument_bus | 
					
						
							|  |  |  | .align	4 | 
					
						
							|  |  |  | .OPENSSL_instrument_bus: | 
					
						
							|  |  |  | 	mtctr	$cnt | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	mftb	$lasttick		# collect 1st tick | 
					
						
							|  |  |  | 	li	$diff,0 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	dcbf	0,$out			# flush cache line | 
					
						
							|  |  |  | 	lwarx	$tick,0,$out		# load and lock | 
					
						
							|  |  |  | 	add	$tick,$tick,$diff | 
					
						
							|  |  |  | 	stwcx.	$tick,0,$out | 
					
						
							|  |  |  | 	stwx	$tick,0,$out | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Loop:	mftb	$tick | 
					
						
							|  |  |  | 	sub	$diff,$tick,$lasttick | 
					
						
							|  |  |  | 	mr	$lasttick,$tick | 
					
						
							|  |  |  | 	dcbf	0,$out			# flush cache line | 
					
						
							|  |  |  | 	lwarx	$tick,0,$out		# load and lock | 
					
						
							|  |  |  | 	add	$tick,$tick,$diff | 
					
						
							|  |  |  | 	stwcx.	$tick,0,$out | 
					
						
							|  |  |  | 	stwx	$tick,0,$out | 
					
						
							|  |  |  | 	addi	$out,$out,4		# ++$out | 
					
						
							|  |  |  | 	bdnz	Loop | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	mr	r3,$cnt | 
					
						
							|  |  |  | 	blr | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .globl	.OPENSSL_instrument_bus2 | 
					
						
							|  |  |  | .align	4 | 
					
						
							|  |  |  | .OPENSSL_instrument_bus2: | 
					
						
							|  |  |  | 	mr	r0,$cnt | 
					
						
							|  |  |  | 	slwi	$cnt,$cnt,2 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	mftb	$lasttick		# collect 1st tick | 
					
						
							|  |  |  | 	li	$diff,0 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	dcbf	0,$out			# flush cache line | 
					
						
							|  |  |  | 	lwarx	$tick,0,$out		# load and lock | 
					
						
							|  |  |  | 	add	$tick,$tick,$diff | 
					
						
							|  |  |  | 	stwcx.	$tick,0,$out | 
					
						
							|  |  |  | 	stwx	$tick,0,$out | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	mftb	$tick			# collect 1st diff | 
					
						
							|  |  |  | 	sub	$diff,$tick,$lasttick | 
					
						
							|  |  |  | 	mr	$lasttick,$tick | 
					
						
							|  |  |  | 	mr	$lastdiff,$diff | 
					
						
							|  |  |  | Loop2: | 
					
						
							|  |  |  | 	dcbf	0,$out			# flush cache line | 
					
						
							|  |  |  | 	lwarx	$tick,0,$out		# load and lock | 
					
						
							|  |  |  | 	add	$tick,$tick,$diff | 
					
						
							|  |  |  | 	stwcx.	$tick,0,$out | 
					
						
							|  |  |  | 	stwx	$tick,0,$out | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	addic.	$max,$max,-1 | 
					
						
							|  |  |  | 	beq	Ldone2 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	mftb	$tick | 
					
						
							|  |  |  | 	sub	$diff,$tick,$lasttick | 
					
						
							|  |  |  | 	mr	$lasttick,$tick | 
					
						
							|  |  |  | 	cmplw	7,$diff,$lastdiff | 
					
						
							|  |  |  | 	mr	$lastdiff,$diff | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	mfcr	$tick			# pull cr | 
					
						
							|  |  |  | 	not	$tick,$tick		# flip bits | 
					
						
							|  |  |  | 	rlwinm	$tick,$tick,1,29,29	# isolate flipped eq bit and scale | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	sub.	$cnt,$cnt,$tick		# conditional --$cnt | 
					
						
							|  |  |  | 	add	$out,$out,$tick		# conditional ++$out | 
					
						
							|  |  |  | 	bne	Loop2 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Ldone2: | 
					
						
							|  |  |  | 	srwi	$cnt,$cnt,2 | 
					
						
							|  |  |  | 	sub	r3,r0,$cnt | 
					
						
							|  |  |  | 	blr | 
					
						
							|  |  |  | ___ | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2007-05-16 04:51:48 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | $code =~ s/\`([^\`]*)\`/eval $1/gem; | 
					
						
							|  |  |  | print $code; | 
					
						
							|  |  |  | close STDOUT; |