/*
 * Copyright 2004-2022 The OpenSSL Project Authors. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/*
 * Portions Copyright (c) 2022 Tino Reichardt <milky-zfs@mcmilk.de>
 * - modified assembly to fit into OpenZFS
 */

#if (defined(__PPC64__) && defined(__BIG_ENDIAN__))

#if (!defined(_CALL_ELF) || _CALL_ELF == 1)
.text

.globl	zfs_sha256_ppc
.globl	.zfs_sha256_ppc
.type	zfs_sha256_ppc,@function
.section	".opd","aw"
.align	3
zfs_sha256_ppc:
.quad	.zfs_sha256_ppc,.TOC.@tocbase,0
.previous
.align	6
.zfs_sha256_ppc:
#else
.abiversion	2
.text

.globl	zfs_sha256_ppc
.type	zfs_sha256_ppc,@function
.align	6
zfs_sha256_ppc:
.localentry	zfs_sha256_ppc,0
#endif
	stdu	1,-320(1)
	mflr	0
	sldi	5,5,6

	std	3,144(1)

	std	14,176(1)
	std	15,184(1)
	std	16,192(1)
	std	17,200(1)
	std	18,208(1)
	std	19,216(1)
	std	20,224(1)
	std	21,232(1)
	std	22,240(1)
	std	23,248(1)
	std	24,256(1)
	std	25,264(1)
	std	26,272(1)
	std	27,280(1)
	std	28,288(1)
	std	29,296(1)
	std	30,304(1)
	std	31,312(1)
	std	0,336(1)
	lwz	8,0(3)
	mr	31,4
	lwz	9,4(3)
	lwz	10,8(3)
	lwz	11,12(3)
	lwz	12,16(3)
	lwz	6,20(3)
	lwz	14,24(3)
	lwz	15,28(3)
	bl	.LPICmeup
.LPICedup:
	andi.	0,31,3
	bne	.Lunaligned
.Laligned:
	add	5,31,5
	std	5,128(1)
	std	31,136(1)
	bl	.Lsha2_block_private
	b	.Ldone

.align	4
.Lunaligned:
	subfic	0,31,4096
	andi.	0,0,4032
	beq	.Lcross_page
	cmpld	5,0
	ble	.Laligned
	subfc	5,0,5
	add	0,31,0
	std	5,120(1)
	std	0,128(1)
	std	31,136(1)
	bl	.Lsha2_block_private

	ld	5,120(1)
.Lcross_page:
	li	0,16
	mtctr	0
	addi	20,1,48
.Lmemcpy:
	lbz	16,0(31)
	lbz	17,1(31)
	lbz	18,2(31)
	lbz	19,3(31)
	addi	31,31,4
	stb	16,0(20)
	stb	17,1(20)
	stb	18,2(20)
	stb	19,3(20)
	addi	20,20,4
	bdnz	.Lmemcpy
	std	31,112(1)
	addi	0,1,112
	addi	31,1,48
	std	5,120(1)
	std	0,128(1)
	std	31,136(1)
	bl	.Lsha2_block_private
	ld	31,112(1)
	ld	5,120(1)
	addic.	5,5,-64
	bne	.Lunaligned

.Ldone:
	ld	0,336(1)
	ld	14,176(1)
	ld	15,184(1)
	ld	16,192(1)
	ld	17,200(1)
	ld	18,208(1)
	ld	19,216(1)
	ld	20,224(1)
	ld	21,232(1)
	ld	22,240(1)
	ld	23,248(1)
	ld	24,256(1)
	ld	25,264(1)
	ld	26,272(1)
	ld	27,280(1)
	ld	28,288(1)
	ld	29,296(1)
	ld	30,304(1)
	ld	31,312(1)
	mtlr	0
	addi	1,1,320
	blr	
.long	0
.byte	0,12,4,1,0x80,18,3,0
.long	0
.align	4
.Lsha2_block_private:
	lwz	0,0(7)
	lwz	16,0(31)
	rotrwi	3,12,6
	rotrwi	4,12,11
	and	5,6,12
	xor	3,3,4
	add	15,15,0
	andc	0,14,12
	rotrwi	4,4,14
	or	5,5,0
	add	15,15,16
	xor	3,3,4
	add	15,15,5
	add	15,15,3

	rotrwi	3,8,2
	rotrwi	4,8,13
	and	5,8,9
	and	0,8,10
	xor	3,3,4
	rotrwi	4,4,9
	xor	5,5,0
	and	0,9,10
	xor	3,3,4
	add	11,11,15
	xor	5,5,0
	lwz	0,4(7)
	add	15,15,3
	add	15,15,5

	lwz	17,4(31)
	rotrwi	3,11,6
	rotrwi	4,11,11
	and	5,12,11
	xor	3,3,4
	add	14,14,0
	andc	0,6,11
	rotrwi	4,4,14
	or	5,5,0
	add	14,14,17
	xor	3,3,4
	add	14,14,5
	add	14,14,3

	rotrwi	3,15,2
	rotrwi	4,15,13
	and	5,15,8
	and	0,15,9
	xor	3,3,4
	rotrwi	4,4,9
	xor	5,5,0
	and	0,8,9
	xor	3,3,4
	add	10,10,14
	xor	5,5,0
	lwz	0,8(7)
	add	14,14,3
	add	14,14,5

	lwz	18,8(31)
	rotrwi	3,10,6
	rotrwi	4,10,11
	and	5,11,10
	xor	3,3,4
	add	6,6,0
	andc	0,12,10
	rotrwi	4,4,14
	or	5,5,0
	add	6,6,18
	xor	3,3,4
	add	6,6,5
	add	6,6,3

	rotrwi	3,14,2
	rotrwi	4,14,13
	and	5,14,15
	and	0,14,8
	xor	3,3,4
	rotrwi	4,4,9
	xor	5,5,0
	and	0,15,8
	xor	3,3,4
	add	9,9,6
	xor	5,5,0
	lwz	0,12(7)
	add	6,6,3
	add	6,6,5

	lwz	19,12(31)
	rotrwi	3,9,6
	rotrwi	4,9,11
	and	5,10,9
	xor	3,3,4
	add	12,12,0
	andc	0,11,9
	rotrwi	4,4,14
	or	5,5,0
	add	12,12,19
	xor	3,3,4
	add	12,12,5
	add	12,12,3

	rotrwi	3,6,2
	rotrwi	4,6,13
	and	5,6,14
	and	0,6,15
	xor	3,3,4
	rotrwi	4,4,9
	xor	5,5,0
	and	0,14,15
	xor	3,3,4
	add	8,8,12
	xor	5,5,0
	lwz	0,16(7)
	add	12,12,3
	add	12,12,5

	lwz	20,16(31)
	rotrwi	3,8,6
	rotrwi	4,8,11
	and	5,9,8
	xor	3,3,4
	add	11,11,0
	andc	0,10,8
	rotrwi	4,4,14
	or	5,5,0
	add	11,11,20
	xor	3,3,4
	add	11,11,5
	add	11,11,3

	rotrwi	3,12,2
	rotrwi	4,12,13
	and	5,12,6
	and	0,12,14
	xor	3,3,4
	rotrwi	4,4,9
	xor	5,5,0
	and	0,6,14
	xor	3,3,4
	add	15,15,11
	xor	5,5,0
	lwz	0,20(7)
	add	11,11,3
	add	11,11,5

	lwz	21,20(31)
	rotrwi	3,15,6
	rotrwi	4,15,11
	and	5,8,15
	xor	3,3,4
	add	10,10,0
	andc	0,9,15
	rotrwi	4,4,14
	or	5,5,0
	add	10,10,21
	xor	3,3,4
	add	10,10,5
	add	10,10,3

	rotrwi	3,11,2
	rotrwi	4,11,13
	and	5,11,12
	and	0,11,6
	xor	3,3,4
	rotrwi	4,4,9
	xor	5,5,0
	and	0,12,6
	xor	3,3,4
	add	14,14,10
	xor	5,5,0
	lwz	0,24(7)
	add	10,10,3
	add	10,10,5

	lwz	22,24(31)
	rotrwi	3,14,6
	rotrwi	4,14,11
	and	5,15,14
	xor	3,3,4
	add	9,9,0
	andc	0,8,14
	rotrwi	4,4,14
	or	5,5,0
	add	9,9,22
	xor	3,3,4
	add	9,9,5
	add	9,9,3

	rotrwi	3,10,2
	rotrwi	4,10,13
	and	5,10,11
	and	0,10,12
	xor	3,3,4
	rotrwi	4,4,9
	xor	5,5,0
	and	0,11,12
	xor	3,3,4
	add	6,6,9
	xor	5,5,0
	lwz	0,28(7)
	add	9,9,3
	add	9,9,5

	lwz	23,28(31)
	rotrwi	3,6,6
	rotrwi	4,6,11
	and	5,14,6
	xor	3,3,4
	add	8,8,0
	andc	0,15,6
	rotrwi	4,4,14
	or	5,5,0
	add	8,8,23
	xor	3,3,4
	add	8,8,5
	add	8,8,3

	rotrwi	3,9,2
	rotrwi	4,9,13
	and	5,9,10
	and	0,9,11
	xor	3,3,4
	rotrwi	4,4,9
	xor	5,5,0
	and	0,10,11
	xor	3,3,4
	add	12,12,8
	xor	5,5,0
	lwz	0,32(7)
	add	8,8,3
	add	8,8,5

	lwz	24,32(31)
	rotrwi	3,12,6
	rotrwi	4,12,11
	and	5,6,12
	xor	3,3,4
	add	15,15,0
	andc	0,14,12
	rotrwi	4,4,14
	or	5,5,0
	add	15,15,24
	xor	3,3,4
	add	15,15,5
	add	15,15,3

	rotrwi	3,8,2
	rotrwi	4,8,13
	and	5,8,9
	and	0,8,10
	xor	3,3,4
	rotrwi	4,4,9
	xor	5,5,0
	and	0,9,10
	xor	3,3,4
	add	11,11,15
	xor	5,5,0
	lwz	0,36(7)
	add	15,15,3
	add	15,15,5

	lwz	25,36(31)
	rotrwi	3,11,6
	rotrwi	4,11,11
	and	5,12,11
	xor	3,3,4
	add	14,14,0
	andc	0,6,11
	rotrwi	4,4,14
	or	5,5,0
	add	14,14,25
	xor	3,3,4
	add	14,14,5
	add	14,14,3

	rotrwi	3,15,2
	rotrwi	4,15,13
	and	5,15,8
	and	0,15,9
	xor	3,3,4
	rotrwi	4,4,9
	xor	5,5,0
	and	0,8,9
	xor	3,3,4
	add	10,10,14
	xor	5,5,0
	lwz	0,40(7)
	add	14,14,3
	add	14,14,5

	lwz	26,40(31)
	rotrwi	3,10,6
	rotrwi	4,10,11
	and	5,11,10
	xor	3,3,4
	add	6,6,0
	andc	0,12,10
	rotrwi	4,4,14
	or	5,5,0
	add	6,6,26
	xor	3,3,4
	add	6,6,5
	add	6,6,3

	rotrwi	3,14,2
	rotrwi	4,14,13
	and	5,14,15
	and	0,14,8
	xor	3,3,4
	rotrwi	4,4,9
	xor	5,5,0
	and	0,15,8
	xor	3,3,4
	add	9,9,6
	xor	5,5,0
	lwz	0,44(7)
	add	6,6,3
	add	6,6,5

	lwz	27,44(31)
	rotrwi	3,9,6
	rotrwi	4,9,11
	and	5,10,9
	xor	3,3,4
	add	12,12,0
	andc	0,11,9
	rotrwi	4,4,14
	or	5,5,0
	add	12,12,27
	xor	3,3,4
	add	12,12,5
	add	12,12,3

	rotrwi	3,6,2
	rotrwi	4,6,13
	and	5,6,14
	and	0,6,15
	xor	3,3,4
	rotrwi	4,4,9
	xor	5,5,0
	and	0,14,15
	xor	3,3,4
	add	8,8,12
	xor	5,5,0
	lwz	0,48(7)
	add	12,12,3
	add	12,12,5

	lwz	28,48(31)
	rotrwi	3,8,6
	rotrwi	4,8,11
	and	5,9,8
	xor	3,3,4
	add	11,11,0
	andc	0,10,8
	rotrwi	4,4,14
	or	5,5,0
	add	11,11,28
	xor	3,3,4
	add	11,11,5
	add	11,11,3

	rotrwi	3,12,2
	rotrwi	4,12,13
	and	5,12,6
	and	0,12,14
	xor	3,3,4
	rotrwi	4,4,9
	xor	5,5,0
	and	0,6,14
	xor	3,3,4
	add	15,15,11
	xor	5,5,0
	lwz	0,52(7)
	add	11,11,3
	add	11,11,5

	lwz	29,52(31)
	rotrwi	3,15,6
	rotrwi	4,15,11
	and	5,8,15
	xor	3,3,4
	add	10,10,0
	andc	0,9,15
	rotrwi	4,4,14
	or	5,5,0
	add	10,10,29
	xor	3,3,4
	add	10,10,5
	add	10,10,3

	rotrwi	3,11,2
	rotrwi	4,11,13
	and	5,11,12
	and	0,11,6
	xor	3,3,4
	rotrwi	4,4,9
	xor	5,5,0
	and	0,12,6
	xor	3,3,4
	add	14,14,10
	xor	5,5,0
	lwz	0,56(7)
	add	10,10,3
	add	10,10,5

	lwz	30,56(31)
	rotrwi	3,14,6
	rotrwi	4,14,11
	and	5,15,14
	xor	3,3,4
	add	9,9,0
	andc	0,8,14
	rotrwi	4,4,14
	or	5,5,0
	add	9,9,30
	xor	3,3,4
	add	9,9,5
	add	9,9,3

	rotrwi	3,10,2
	rotrwi	4,10,13
	and	5,10,11
	and	0,10,12
	xor	3,3,4
	rotrwi	4,4,9
	xor	5,5,0
	and	0,11,12
	xor	3,3,4
	add	6,6,9
	xor	5,5,0
	lwz	0,60(7)
	add	9,9,3
	add	9,9,5

	lwz	31,60(31)
	rotrwi	3,6,6
	rotrwi	4,6,11
	and	5,14,6
	xor	3,3,4
	add	8,8,0
	andc	0,15,6
	rotrwi	4,4,14
	or	5,5,0
	add	8,8,31
	xor	3,3,4
	add	8,8,5
	add	8,8,3

	rotrwi	3,9,2
	rotrwi	4,9,13
	and	5,9,10
	and	0,9,11
	xor	3,3,4
	rotrwi	4,4,9
	xor	5,5,0
	and	0,10,11
	xor	3,3,4
	add	12,12,8
	xor	5,5,0
	add	8,8,3
	add	8,8,5

	li	5,3
	mtctr	5
.align	4
.Lrounds:
	addi	7,7,64
	rotrwi	3,17,7
	rotrwi	4,17,18
	rotrwi	5,30,17
	rotrwi	0,30,19
	xor	3,3,4
	srwi	4,17,3
	xor	5,5,0
	srwi	0,30,10
	add	16,16,25
	xor	3,3,4
	xor	5,5,0
	lwz	0,0(7)
	add	16,16,3
	add	16,16,5
	rotrwi	3,12,6
	rotrwi	4,12,11
	and	5,6,12
	xor	3,3,4
	add	15,15,0
	andc	0,14,12
	rotrwi	4,4,14
	or	5,5,0
	add	15,15,16
	xor	3,3,4
	add	15,15,5
	add	15,15,3

	rotrwi	3,8,2
	rotrwi	4,8,13
	and	5,8,9
	and	0,8,10
	xor	3,3,4
	rotrwi	4,4,9
	xor	5,5,0
	and	0,9,10
	xor	3,3,4
	add	11,11,15
	xor	5,5,0
	add	15,15,3
	add	15,15,5

	rotrwi	3,18,7
	rotrwi	4,18,18
	rotrwi	5,31,17
	rotrwi	0,31,19
	xor	3,3,4
	srwi	4,18,3
	xor	5,5,0
	srwi	0,31,10
	add	17,17,26
	xor	3,3,4
	xor	5,5,0
	lwz	0,4(7)
	add	17,17,3
	add	17,17,5
	rotrwi	3,11,6
	rotrwi	4,11,11
	and	5,12,11
	xor	3,3,4
	add	14,14,0
	andc	0,6,11
	rotrwi	4,4,14
	or	5,5,0
	add	14,14,17
	xor	3,3,4
	add	14,14,5
	add	14,14,3

	rotrwi	3,15,2
	rotrwi	4,15,13
	and	5,15,8
	and	0,15,9
	xor	3,3,4
	rotrwi	4,4,9
	xor	5,5,0
	and	0,8,9
	xor	3,3,4
	add	10,10,14
	xor	5,5,0
	add	14,14,3
	add	14,14,5

	rotrwi	3,19,7
	rotrwi	4,19,18
	rotrwi	5,16,17
	rotrwi	0,16,19
	xor	3,3,4
	srwi	4,19,3
	xor	5,5,0
	srwi	0,16,10
	add	18,18,27
	xor	3,3,4
	xor	5,5,0
	lwz	0,8(7)
	add	18,18,3
	add	18,18,5
	rotrwi	3,10,6
	rotrwi	4,10,11
	and	5,11,10
	xor	3,3,4
	add	6,6,0
	andc	0,12,10
	rotrwi	4,4,14
	or	5,5,0
	add	6,6,18
	xor	3,3,4
	add	6,6,5
	add	6,6,3

	rotrwi	3,14,2
	rotrwi	4,14,13
	and	5,14,15
	and	0,14,8
	xor	3,3,4
	rotrwi	4,4,9
	xor	5,5,0
	and	0,15,8
	xor	3,3,4
	add	9,9,6
	xor	5,5,0
	add	6,6,3
	add	6,6,5

	rotrwi	3,20,7
	rotrwi	4,20,18
	rotrwi	5,17,17
	rotrwi	0,17,19
	xor	3,3,4
	srwi	4,20,3
	xor	5,5,0
	srwi	0,17,10
	add	19,19,28
	xor	3,3,4
	xor	5,5,0
	lwz	0,12(7)
	add	19,19,3
	add	19,19,5
	rotrwi	3,9,6
	rotrwi	4,9,11
	and	5,10,9
	xor	3,3,4
	add	12,12,0
	andc	0,11,9
	rotrwi	4,4,14
	or	5,5,0
	add	12,12,19
	xor	3,3,4
	add	12,12,5
	add	12,12,3

	rotrwi	3,6,2
	rotrwi	4,6,13
	and	5,6,14
	and	0,6,15
	xor	3,3,4
	rotrwi	4,4,9
	xor	5,5,0
	and	0,14,15
	xor	3,3,4
	add	8,8,12
	xor	5,5,0
	add	12,12,3
	add	12,12,5

	rotrwi	3,21,7
	rotrwi	4,21,18
	rotrwi	5,18,17
	rotrwi	0,18,19
	xor	3,3,4
	srwi	4,21,3
	xor	5,5,0
	srwi	0,18,10
	add	20,20,29
	xor	3,3,4
	xor	5,5,0
	lwz	0,16(7)
	add	20,20,3
	add	20,20,5
	rotrwi	3,8,6
	rotrwi	4,8,11
	and	5,9,8
	xor	3,3,4
	add	11,11,0
	andc	0,10,8
	rotrwi	4,4,14
	or	5,5,0
	add	11,11,20
	xor	3,3,4
	add	11,11,5
	add	11,11,3

	rotrwi	3,12,2
	rotrwi	4,12,13
	and	5,12,6
	and	0,12,14
	xor	3,3,4
	rotrwi	4,4,9
	xor	5,5,0
	and	0,6,14
	xor	3,3,4
	add	15,15,11
	xor	5,5,0
	add	11,11,3
	add	11,11,5

	rotrwi	3,22,7
	rotrwi	4,22,18
	rotrwi	5,19,17
	rotrwi	0,19,19
	xor	3,3,4
	srwi	4,22,3
	xor	5,5,0
	srwi	0,19,10
	add	21,21,30
	xor	3,3,4
	xor	5,5,0
	lwz	0,20(7)
	add	21,21,3
	add	21,21,5
	rotrwi	3,15,6
	rotrwi	4,15,11
	and	5,8,15
	xor	3,3,4
	add	10,10,0
	andc	0,9,15
	rotrwi	4,4,14
	or	5,5,0
	add	10,10,21
	xor	3,3,4
	add	10,10,5
	add	10,10,3

	rotrwi	3,11,2
	rotrwi	4,11,13
	and	5,11,12
	and	0,11,6
	xor	3,3,4
	rotrwi	4,4,9
	xor	5,5,0
	and	0,12,6
	xor	3,3,4
	add	14,14,10
	xor	5,5,0
	add	10,10,3
	add	10,10,5

	rotrwi	3,23,7
	rotrwi	4,23,18
	rotrwi	5,20,17
	rotrwi	0,20,19
	xor	3,3,4
	srwi	4,23,3
	xor	5,5,0
	srwi	0,20,10
	add	22,22,31
	xor	3,3,4
	xor	5,5,0
	lwz	0,24(7)
	add	22,22,3
	add	22,22,5
	rotrwi	3,14,6
	rotrwi	4,14,11
	and	5,15,14
	xor	3,3,4
	add	9,9,0
	andc	0,8,14
	rotrwi	4,4,14
	or	5,5,0
	add	9,9,22
	xor	3,3,4
	add	9,9,5
	add	9,9,3

	rotrwi	3,10,2
	rotrwi	4,10,13
	and	5,10,11
	and	0,10,12
	xor	3,3,4
	rotrwi	4,4,9
	xor	5,5,0
	and	0,11,12
	xor	3,3,4
	add	6,6,9
	xor	5,5,0
	add	9,9,3
	add	9,9,5

	rotrwi	3,24,7
	rotrwi	4,24,18
	rotrwi	5,21,17
	rotrwi	0,21,19
	xor	3,3,4
	srwi	4,24,3
	xor	5,5,0
	srwi	0,21,10
	add	23,23,16
	xor	3,3,4
	xor	5,5,0
	lwz	0,28(7)
	add	23,23,3
	add	23,23,5
	rotrwi	3,6,6
	rotrwi	4,6,11
	and	5,14,6
	xor	3,3,4
	add	8,8,0
	andc	0,15,6
	rotrwi	4,4,14
	or	5,5,0
	add	8,8,23
	xor	3,3,4
	add	8,8,5
	add	8,8,3

	rotrwi	3,9,2
	rotrwi	4,9,13
	and	5,9,10
	and	0,9,11
	xor	3,3,4
	rotrwi	4,4,9
	xor	5,5,0
	and	0,10,11
	xor	3,3,4
	add	12,12,8
	xor	5,5,0
	add	8,8,3
	add	8,8,5

	rotrwi	3,25,7
	rotrwi	4,25,18
	rotrwi	5,22,17
	rotrwi	0,22,19
	xor	3,3,4
	srwi	4,25,3
	xor	5,5,0
	srwi	0,22,10
	add	24,24,17
	xor	3,3,4
	xor	5,5,0
	lwz	0,32(7)
	add	24,24,3
	add	24,24,5
	rotrwi	3,12,6
	rotrwi	4,12,11
	and	5,6,12
	xor	3,3,4
	add	15,15,0
	andc	0,14,12
	rotrwi	4,4,14
	or	5,5,0
	add	15,15,24
	xor	3,3,4
	add	15,15,5
	add	15,15,3

	rotrwi	3,8,2
	rotrwi	4,8,13
	and	5,8,9
	and	0,8,10
	xor	3,3,4
	rotrwi	4,4,9
	xor	5,5,0
	and	0,9,10
	xor	3,3,4
	add	11,11,15
	xor	5,5,0
	add	15,15,3
	add	15,15,5

	rotrwi	3,26,7
	rotrwi	4,26,18
	rotrwi	5,23,17
	rotrwi	0,23,19
	xor	3,3,4
	srwi	4,26,3
	xor	5,5,0
	srwi	0,23,10
	add	25,25,18
	xor	3,3,4
	xor	5,5,0
	lwz	0,36(7)
	add	25,25,3
	add	25,25,5
	rotrwi	3,11,6
	rotrwi	4,11,11
	and	5,12,11
	xor	3,3,4
	add	14,14,0
	andc	0,6,11
	rotrwi	4,4,14
	or	5,5,0
	add	14,14,25
	xor	3,3,4
	add	14,14,5
	add	14,14,3

	rotrwi	3,15,2
	rotrwi	4,15,13
	and	5,15,8
	and	0,15,9
	xor	3,3,4
	rotrwi	4,4,9
	xor	5,5,0
	and	0,8,9
	xor	3,3,4
	add	10,10,14
	xor	5,5,0
	add	14,14,3
	add	14,14,5

	rotrwi	3,27,7
	rotrwi	4,27,18
	rotrwi	5,24,17
	rotrwi	0,24,19
	xor	3,3,4
	srwi	4,27,3
	xor	5,5,0
	srwi	0,24,10
	add	26,26,19
	xor	3,3,4
	xor	5,5,0
	lwz	0,40(7)
	add	26,26,3
	add	26,26,5
	rotrwi	3,10,6
	rotrwi	4,10,11
	and	5,11,10
	xor	3,3,4
	add	6,6,0
	andc	0,12,10
	rotrwi	4,4,14
	or	5,5,0
	add	6,6,26
	xor	3,3,4
	add	6,6,5
	add	6,6,3

	rotrwi	3,14,2
	rotrwi	4,14,13
	and	5,14,15
	and	0,14,8
	xor	3,3,4
	rotrwi	4,4,9
	xor	5,5,0
	and	0,15,8
	xor	3,3,4
	add	9,9,6
	xor	5,5,0
	add	6,6,3
	add	6,6,5

	rotrwi	3,28,7
	rotrwi	4,28,18
	rotrwi	5,25,17
	rotrwi	0,25,19
	xor	3,3,4
	srwi	4,28,3
	xor	5,5,0
	srwi	0,25,10
	add	27,27,20
	xor	3,3,4
	xor	5,5,0
	lwz	0,44(7)
	add	27,27,3
	add	27,27,5
	rotrwi	3,9,6
	rotrwi	4,9,11
	and	5,10,9
	xor	3,3,4
	add	12,12,0
	andc	0,11,9
	rotrwi	4,4,14
	or	5,5,0
	add	12,12,27
	xor	3,3,4
	add	12,12,5
	add	12,12,3

	rotrwi	3,6,2
	rotrwi	4,6,13
	and	5,6,14
	and	0,6,15
	xor	3,3,4
	rotrwi	4,4,9
	xor	5,5,0
	and	0,14,15
	xor	3,3,4
	add	8,8,12
	xor	5,5,0
	add	12,12,3
	add	12,12,5

	rotrwi	3,29,7
	rotrwi	4,29,18
	rotrwi	5,26,17
	rotrwi	0,26,19
	xor	3,3,4
	srwi	4,29,3
	xor	5,5,0
	srwi	0,26,10
	add	28,28,21
	xor	3,3,4
	xor	5,5,0
	lwz	0,48(7)
	add	28,28,3
	add	28,28,5
	rotrwi	3,8,6
	rotrwi	4,8,11
	and	5,9,8
	xor	3,3,4
	add	11,11,0
	andc	0,10,8
	rotrwi	4,4,14
	or	5,5,0
	add	11,11,28
	xor	3,3,4
	add	11,11,5
	add	11,11,3

	rotrwi	3,12,2
	rotrwi	4,12,13
	and	5,12,6
	and	0,12,14
	xor	3,3,4
	rotrwi	4,4,9
	xor	5,5,0
	and	0,6,14
	xor	3,3,4
	add	15,15,11
	xor	5,5,0
	add	11,11,3
	add	11,11,5

	rotrwi	3,30,7
	rotrwi	4,30,18
	rotrwi	5,27,17
	rotrwi	0,27,19
	xor	3,3,4
	srwi	4,30,3
	xor	5,5,0
	srwi	0,27,10
	add	29,29,22
	xor	3,3,4
	xor	5,5,0
	lwz	0,52(7)
	add	29,29,3
	add	29,29,5
	rotrwi	3,15,6
	rotrwi	4,15,11
	and	5,8,15
	xor	3,3,4
	add	10,10,0
	andc	0,9,15
	rotrwi	4,4,14
	or	5,5,0
	add	10,10,29
	xor	3,3,4
	add	10,10,5
	add	10,10,3

	rotrwi	3,11,2
	rotrwi	4,11,13
	and	5,11,12
	and	0,11,6
	xor	3,3,4
	rotrwi	4,4,9
	xor	5,5,0
	and	0,12,6
	xor	3,3,4
	add	14,14,10
	xor	5,5,0
	add	10,10,3
	add	10,10,5

	rotrwi	3,31,7
	rotrwi	4,31,18
	rotrwi	5,28,17
	rotrwi	0,28,19
	xor	3,3,4
	srwi	4,31,3
	xor	5,5,0
	srwi	0,28,10
	add	30,30,23
	xor	3,3,4
	xor	5,5,0
	lwz	0,56(7)
	add	30,30,3
	add	30,30,5
	rotrwi	3,14,6
	rotrwi	4,14,11
	and	5,15,14
	xor	3,3,4
	add	9,9,0
	andc	0,8,14
	rotrwi	4,4,14
	or	5,5,0
	add	9,9,30
	xor	3,3,4
	add	9,9,5
	add	9,9,3

	rotrwi	3,10,2
	rotrwi	4,10,13
	and	5,10,11
	and	0,10,12
	xor	3,3,4
	rotrwi	4,4,9
	xor	5,5,0
	and	0,11,12
	xor	3,3,4
	add	6,6,9
	xor	5,5,0
	add	9,9,3
	add	9,9,5

	rotrwi	3,16,7
	rotrwi	4,16,18
	rotrwi	5,29,17
	rotrwi	0,29,19
	xor	3,3,4
	srwi	4,16,3
	xor	5,5,0
	srwi	0,29,10
	add	31,31,24
	xor	3,3,4
	xor	5,5,0
	lwz	0,60(7)
	add	31,31,3
	add	31,31,5
	rotrwi	3,6,6
	rotrwi	4,6,11
	and	5,14,6
	xor	3,3,4
	add	8,8,0
	andc	0,15,6
	rotrwi	4,4,14
	or	5,5,0
	add	8,8,31
	xor	3,3,4
	add	8,8,5
	add	8,8,3

	rotrwi	3,9,2
	rotrwi	4,9,13
	and	5,9,10
	and	0,9,11
	xor	3,3,4
	rotrwi	4,4,9
	xor	5,5,0
	and	0,10,11
	xor	3,3,4
	add	12,12,8
	xor	5,5,0
	add	8,8,3
	add	8,8,5

	bdnz	.Lrounds

	ld	3,144(1)
	ld	31,136(1)
	ld	5,128(1)
	subi	7,7,192

	lwz	16,0(3)
	lwz	17,4(3)
	lwz	18,8(3)
	lwz	19,12(3)
	lwz	20,16(3)
	lwz	21,20(3)
	lwz	22,24(3)
	addi	31,31,64
	lwz	23,28(3)
	add	8,8,16
	add	9,9,17
	std	31,136(1)
	add	10,10,18
	stw	8,0(3)
	add	11,11,19
	stw	9,4(3)
	add	12,12,20
	stw	10,8(3)
	add	6,6,21
	stw	11,12(3)
	add	14,14,22
	stw	12,16(3)
	add	15,15,23
	stw	6,20(3)
	stw	14,24(3)
	cmpld	31,5
	stw	15,28(3)
	bne	.Lsha2_block_private
	blr	
.long	0
.byte	0,12,0x14,0,0,0,0,0
#if (!defined(_CALL_ELF) || _CALL_ELF == 1)
.size	.zfs_sha256_ppc,.-.zfs_sha256_ppc
.size	zfs_sha256_ppc,.-.zfs_sha256_ppc
#else
.size	zfs_sha256_ppc,.-zfs_sha256_ppc
#endif
.align	6
.LPICmeup:
	mflr	0
	bcl	20,31,$+4
	mflr	7
	addi	7,7,56
	mtlr	0
	blr	
.long	0
.byte	0,12,0x14,0,0,0,0,0
.space	28
.long	0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5
.long	0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5
.long	0xd807aa98,0x12835b01,0x243185be,0x550c7dc3
.long	0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174
.long	0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc
.long	0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da
.long	0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7
.long	0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967
.long	0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13
.long	0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85
.long	0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3
.long	0xd192e819,0xd6990624,0xf40e3585,0x106aa070
.long	0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5
.long	0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3
.long	0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208
.long	0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2

#elif (defined(__PPC64__) && defined(__LITTLE_ENDIAN__))

.abiversion	2
.text

.globl	zfs_sha256_ppc
.type	zfs_sha256_ppc,@function
.align	6
zfs_sha256_ppc:
.localentry	zfs_sha256_ppc,0

	stdu	1,-320(1)
	mflr	0
	sldi	5,5,6

	std	3,144(1)

	std	14,176(1)
	std	15,184(1)
	std	16,192(1)
	std	17,200(1)
	std	18,208(1)
	std	19,216(1)
	std	20,224(1)
	std	21,232(1)
	std	22,240(1)
	std	23,248(1)
	std	24,256(1)
	std	25,264(1)
	std	26,272(1)
	std	27,280(1)
	std	28,288(1)
	std	29,296(1)
	std	30,304(1)
	std	31,312(1)
	std	0,336(1)
	lwz	8,0(3)
	mr	31,4
	lwz	9,4(3)
	lwz	10,8(3)
	lwz	11,12(3)
	lwz	12,16(3)
	lwz	6,20(3)
	lwz	14,24(3)
	lwz	15,28(3)
	bl	.LPICmeup
.LPICedup:
	andi.	0,31,3
	bne	.Lunaligned
.Laligned:
	add	5,31,5
	std	5,128(1)
	std	31,136(1)
	bl	.Lsha2_block_private
	b	.Ldone

.align	4
.Lunaligned:
	subfic	0,31,4096
	andi.	0,0,4032
	beq	.Lcross_page
	cmpld	5,0
	ble	.Laligned
	subfc	5,0,5
	add	0,31,0
	std	5,120(1)
	std	0,128(1)
	std	31,136(1)
	bl	.Lsha2_block_private

	ld	5,120(1)
.Lcross_page:
	li	0,16
	mtctr	0
	addi	20,1,48
.Lmemcpy:
	lbz	16,0(31)
	lbz	17,1(31)
	lbz	18,2(31)
	lbz	19,3(31)
	addi	31,31,4
	stb	16,0(20)
	stb	17,1(20)
	stb	18,2(20)
	stb	19,3(20)
	addi	20,20,4
	bdnz	.Lmemcpy
	std	31,112(1)
	addi	0,1,112
	addi	31,1,48
	std	5,120(1)
	std	0,128(1)
	std	31,136(1)
	bl	.Lsha2_block_private
	ld	31,112(1)
	ld	5,120(1)
	addic.	5,5,-64
	bne	.Lunaligned

.Ldone:
	ld	0,336(1)
	ld	14,176(1)
	ld	15,184(1)
	ld	16,192(1)
	ld	17,200(1)
	ld	18,208(1)
	ld	19,216(1)
	ld	20,224(1)
	ld	21,232(1)
	ld	22,240(1)
	ld	23,248(1)
	ld	24,256(1)
	ld	25,264(1)
	ld	26,272(1)
	ld	27,280(1)
	ld	28,288(1)
	ld	29,296(1)
	ld	30,304(1)
	ld	31,312(1)
	mtlr	0
	addi	1,1,320
	blr	
.long	0
.byte	0,12,4,1,0x80,18,3,0
.long	0
.align	4
.Lsha2_block_private:
	lwz	0,0(7)
	lwz	3,0(31)
	rotlwi	16,3,8
	rlwimi	16,3,24,0,7
	rlwimi	16,3,24,16,23
	rotrwi	3,12,6
	rotrwi	4,12,11
	and	5,6,12
	xor	3,3,4
	add	15,15,0
	andc	0,14,12
	rotrwi	4,4,14
	or	5,5,0
	add	15,15,16
	xor	3,3,4
	add	15,15,5
	add	15,15,3

	rotrwi	3,8,2
	rotrwi	4,8,13
	and	5,8,9
	and	0,8,10
	xor	3,3,4
	rotrwi	4,4,9
	xor	5,5,0
	and	0,9,10
	xor	3,3,4
	add	11,11,15
	xor	5,5,0
	lwz	0,4(7)
	add	15,15,3
	add	15,15,5

	lwz	3,4(31)
	rotlwi	17,3,8
	rlwimi	17,3,24,0,7
	rlwimi	17,3,24,16,23
	rotrwi	3,11,6
	rotrwi	4,11,11
	and	5,12,11
	xor	3,3,4
	add	14,14,0
	andc	0,6,11
	rotrwi	4,4,14
	or	5,5,0
	add	14,14,17
	xor	3,3,4
	add	14,14,5
	add	14,14,3

	rotrwi	3,15,2
	rotrwi	4,15,13
	and	5,15,8
	and	0,15,9
	xor	3,3,4
	rotrwi	4,4,9
	xor	5,5,0
	and	0,8,9
	xor	3,3,4
	add	10,10,14
	xor	5,5,0
	lwz	0,8(7)
	add	14,14,3
	add	14,14,5

	lwz	3,8(31)
	rotlwi	18,3,8
	rlwimi	18,3,24,0,7
	rlwimi	18,3,24,16,23
	rotrwi	3,10,6
	rotrwi	4,10,11
	and	5,11,10
	xor	3,3,4
	add	6,6,0
	andc	0,12,10
	rotrwi	4,4,14
	or	5,5,0
	add	6,6,18
	xor	3,3,4
	add	6,6,5
	add	6,6,3

	rotrwi	3,14,2
	rotrwi	4,14,13
	and	5,14,15
	and	0,14,8
	xor	3,3,4
	rotrwi	4,4,9
	xor	5,5,0
	and	0,15,8
	xor	3,3,4
	add	9,9,6
	xor	5,5,0
	lwz	0,12(7)
	add	6,6,3
	add	6,6,5

	lwz	3,12(31)
	rotlwi	19,3,8
	rlwimi	19,3,24,0,7
	rlwimi	19,3,24,16,23
	rotrwi	3,9,6
	rotrwi	4,9,11
	and	5,10,9
	xor	3,3,4
	add	12,12,0
	andc	0,11,9
	rotrwi	4,4,14
	or	5,5,0
	add	12,12,19
	xor	3,3,4
	add	12,12,5
	add	12,12,3

	rotrwi	3,6,2
	rotrwi	4,6,13
	and	5,6,14
	and	0,6,15
	xor	3,3,4
	rotrwi	4,4,9
	xor	5,5,0
	and	0,14,15
	xor	3,3,4
	add	8,8,12
	xor	5,5,0
	lwz	0,16(7)
	add	12,12,3
	add	12,12,5

	lwz	3,16(31)
	rotlwi	20,3,8
	rlwimi	20,3,24,0,7
	rlwimi	20,3,24,16,23
	rotrwi	3,8,6
	rotrwi	4,8,11
	and	5,9,8
	xor	3,3,4
	add	11,11,0
	andc	0,10,8
	rotrwi	4,4,14
	or	5,5,0
	add	11,11,20
	xor	3,3,4
	add	11,11,5
	add	11,11,3

	rotrwi	3,12,2
	rotrwi	4,12,13
	and	5,12,6
	and	0,12,14
	xor	3,3,4
	rotrwi	4,4,9
	xor	5,5,0
	and	0,6,14
	xor	3,3,4
	add	15,15,11
	xor	5,5,0
	lwz	0,20(7)
	add	11,11,3
	add	11,11,5

	lwz	3,20(31)
	rotlwi	21,3,8
	rlwimi	21,3,24,0,7
	rlwimi	21,3,24,16,23
	rotrwi	3,15,6
	rotrwi	4,15,11
	and	5,8,15
	xor	3,3,4
	add	10,10,0
	andc	0,9,15
	rotrwi	4,4,14
	or	5,5,0
	add	10,10,21
	xor	3,3,4
	add	10,10,5
	add	10,10,3

	rotrwi	3,11,2
	rotrwi	4,11,13
	and	5,11,12
	and	0,11,6
	xor	3,3,4
	rotrwi	4,4,9
	xor	5,5,0
	and	0,12,6
	xor	3,3,4
	add	14,14,10
	xor	5,5,0
	lwz	0,24(7)
	add	10,10,3
	add	10,10,5

	lwz	3,24(31)
	rotlwi	22,3,8
	rlwimi	22,3,24,0,7
	rlwimi	22,3,24,16,23
	rotrwi	3,14,6
	rotrwi	4,14,11
	and	5,15,14
	xor	3,3,4
	add	9,9,0
	andc	0,8,14
	rotrwi	4,4,14
	or	5,5,0
	add	9,9,22
	xor	3,3,4
	add	9,9,5
	add	9,9,3

	rotrwi	3,10,2
	rotrwi	4,10,13
	and	5,10,11
	and	0,10,12
	xor	3,3,4
	rotrwi	4,4,9
	xor	5,5,0
	and	0,11,12
	xor	3,3,4
	add	6,6,9
	xor	5,5,0
	lwz	0,28(7)
	add	9,9,3
	add	9,9,5

	lwz	3,28(31)
	rotlwi	23,3,8
	rlwimi	23,3,24,0,7
	rlwimi	23,3,24,16,23
	rotrwi	3,6,6
	rotrwi	4,6,11
	and	5,14,6
	xor	3,3,4
	add	8,8,0
	andc	0,15,6
	rotrwi	4,4,14
	or	5,5,0
	add	8,8,23
	xor	3,3,4
	add	8,8,5
	add	8,8,3

	rotrwi	3,9,2
	rotrwi	4,9,13
	and	5,9,10
	and	0,9,11
	xor	3,3,4
	rotrwi	4,4,9
	xor	5,5,0
	and	0,10,11
	xor	3,3,4
	add	12,12,8
	xor	5,5,0
	lwz	0,32(7)
	add	8,8,3
	add	8,8,5

	lwz	3,32(31)
	rotlwi	24,3,8
	rlwimi	24,3,24,0,7
	rlwimi	24,3,24,16,23
	rotrwi	3,12,6
	rotrwi	4,12,11
	and	5,6,12
	xor	3,3,4
	add	15,15,0
	andc	0,14,12
	rotrwi	4,4,14
	or	5,5,0
	add	15,15,24
	xor	3,3,4
	add	15,15,5
	add	15,15,3

	rotrwi	3,8,2
	rotrwi	4,8,13
	and	5,8,9
	and	0,8,10
	xor	3,3,4
	rotrwi	4,4,9
	xor	5,5,0
	and	0,9,10
	xor	3,3,4
	add	11,11,15
	xor	5,5,0
	lwz	0,36(7)
	add	15,15,3
	add	15,15,5

	lwz	3,36(31)
	rotlwi	25,3,8
	rlwimi	25,3,24,0,7
	rlwimi	25,3,24,16,23
	rotrwi	3,11,6
	rotrwi	4,11,11
	and	5,12,11
	xor	3,3,4
	add	14,14,0
	andc	0,6,11
	rotrwi	4,4,14
	or	5,5,0
	add	14,14,25
	xor	3,3,4
	add	14,14,5
	add	14,14,3

	rotrwi	3,15,2
	rotrwi	4,15,13
	and	5,15,8
	and	0,15,9
	xor	3,3,4
	rotrwi	4,4,9
	xor	5,5,0
	and	0,8,9
	xor	3,3,4
	add	10,10,14
	xor	5,5,0
	lwz	0,40(7)
	add	14,14,3
	add	14,14,5

	lwz	3,40(31)
	rotlwi	26,3,8
	rlwimi	26,3,24,0,7
	rlwimi	26,3,24,16,23
	rotrwi	3,10,6
	rotrwi	4,10,11
	and	5,11,10
	xor	3,3,4
	add	6,6,0
	andc	0,12,10
	rotrwi	4,4,14
	or	5,5,0
	add	6,6,26
	xor	3,3,4
	add	6,6,5
	add	6,6,3

	rotrwi	3,14,2
	rotrwi	4,14,13
	and	5,14,15
	and	0,14,8
	xor	3,3,4
	rotrwi	4,4,9
	xor	5,5,0
	and	0,15,8
	xor	3,3,4
	add	9,9,6
	xor	5,5,0
	lwz	0,44(7)
	add	6,6,3
	add	6,6,5

	lwz	3,44(31)
	rotlwi	27,3,8
	rlwimi	27,3,24,0,7
	rlwimi	27,3,24,16,23
	rotrwi	3,9,6
	rotrwi	4,9,11
	and	5,10,9
	xor	3,3,4
	add	12,12,0
	andc	0,11,9
	rotrwi	4,4,14
	or	5,5,0
	add	12,12,27
	xor	3,3,4
	add	12,12,5
	add	12,12,3

	rotrwi	3,6,2
	rotrwi	4,6,13
	and	5,6,14
	and	0,6,15
	xor	3,3,4
	rotrwi	4,4,9
	xor	5,5,0
	and	0,14,15
	xor	3,3,4
	add	8,8,12
	xor	5,5,0
	lwz	0,48(7)
	add	12,12,3
	add	12,12,5

	lwz	3,48(31)
	rotlwi	28,3,8
	rlwimi	28,3,24,0,7
	rlwimi	28,3,24,16,23
	rotrwi	3,8,6
	rotrwi	4,8,11
	and	5,9,8
	xor	3,3,4
	add	11,11,0
	andc	0,10,8
	rotrwi	4,4,14
	or	5,5,0
	add	11,11,28
	xor	3,3,4
	add	11,11,5
	add	11,11,3

	rotrwi	3,12,2
	rotrwi	4,12,13
	and	5,12,6
	and	0,12,14
	xor	3,3,4
	rotrwi	4,4,9
	xor	5,5,0
	and	0,6,14
	xor	3,3,4
	add	15,15,11
	xor	5,5,0
	lwz	0,52(7)
	add	11,11,3
	add	11,11,5

	lwz	3,52(31)
	rotlwi	29,3,8
	rlwimi	29,3,24,0,7
	rlwimi	29,3,24,16,23
	rotrwi	3,15,6
	rotrwi	4,15,11
	and	5,8,15
	xor	3,3,4
	add	10,10,0
	andc	0,9,15
	rotrwi	4,4,14
	or	5,5,0
	add	10,10,29
	xor	3,3,4
	add	10,10,5
	add	10,10,3

	rotrwi	3,11,2
	rotrwi	4,11,13
	and	5,11,12
	and	0,11,6
	xor	3,3,4
	rotrwi	4,4,9
	xor	5,5,0
	and	0,12,6
	xor	3,3,4
	add	14,14,10
	xor	5,5,0
	lwz	0,56(7)
	add	10,10,3
	add	10,10,5

	lwz	3,56(31)
	rotlwi	30,3,8
	rlwimi	30,3,24,0,7
	rlwimi	30,3,24,16,23
	rotrwi	3,14,6
	rotrwi	4,14,11
	and	5,15,14
	xor	3,3,4
	add	9,9,0
	andc	0,8,14
	rotrwi	4,4,14
	or	5,5,0
	add	9,9,30
	xor	3,3,4
	add	9,9,5
	add	9,9,3

	rotrwi	3,10,2
	rotrwi	4,10,13
	and	5,10,11
	and	0,10,12
	xor	3,3,4
	rotrwi	4,4,9
	xor	5,5,0
	and	0,11,12
	xor	3,3,4
	add	6,6,9
	xor	5,5,0
	lwz	0,60(7)
	add	9,9,3
	add	9,9,5

	lwz	3,60(31)
	rotlwi	31,3,8
	rlwimi	31,3,24,0,7
	rlwimi	31,3,24,16,23
	rotrwi	3,6,6
	rotrwi	4,6,11
	and	5,14,6
	xor	3,3,4
	add	8,8,0
	andc	0,15,6
	rotrwi	4,4,14
	or	5,5,0
	add	8,8,31
	xor	3,3,4
	add	8,8,5
	add	8,8,3

	rotrwi	3,9,2
	rotrwi	4,9,13
	and	5,9,10
	and	0,9,11
	xor	3,3,4
	rotrwi	4,4,9
	xor	5,5,0
	and	0,10,11
	xor	3,3,4
	add	12,12,8
	xor	5,5,0
	add	8,8,3
	add	8,8,5

	li	5,3
	mtctr	5
.align	4
.Lrounds:
	addi	7,7,64
	rotrwi	3,17,7
	rotrwi	4,17,18
	rotrwi	5,30,17
	rotrwi	0,30,19
	xor	3,3,4
	srwi	4,17,3
	xor	5,5,0
	srwi	0,30,10
	add	16,16,25
	xor	3,3,4
	xor	5,5,0
	lwz	0,0(7)
	add	16,16,3
	add	16,16,5
	rotrwi	3,12,6
	rotrwi	4,12,11
	and	5,6,12
	xor	3,3,4
	add	15,15,0
	andc	0,14,12
	rotrwi	4,4,14
	or	5,5,0
	add	15,15,16
	xor	3,3,4
	add	15,15,5
	add	15,15,3

	rotrwi	3,8,2
	rotrwi	4,8,13
	and	5,8,9
	and	0,8,10
	xor	3,3,4
	rotrwi	4,4,9
	xor	5,5,0
	and	0,9,10
	xor	3,3,4
	add	11,11,15
	xor	5,5,0
	add	15,15,3
	add	15,15,5

	rotrwi	3,18,7
	rotrwi	4,18,18
	rotrwi	5,31,17
	rotrwi	0,31,19
	xor	3,3,4
	srwi	4,18,3
	xor	5,5,0
	srwi	0,31,10
	add	17,17,26
	xor	3,3,4
	xor	5,5,0
	lwz	0,4(7)
	add	17,17,3
	add	17,17,5
	rotrwi	3,11,6
	rotrwi	4,11,11
	and	5,12,11
	xor	3,3,4
	add	14,14,0
	andc	0,6,11
	rotrwi	4,4,14
	or	5,5,0
	add	14,14,17
	xor	3,3,4
	add	14,14,5
	add	14,14,3

	rotrwi	3,15,2
	rotrwi	4,15,13
	and	5,15,8
	and	0,15,9
	xor	3,3,4
	rotrwi	4,4,9
	xor	5,5,0
	and	0,8,9
	xor	3,3,4
	add	10,10,14
	xor	5,5,0
	add	14,14,3
	add	14,14,5

	rotrwi	3,19,7
	rotrwi	4,19,18
	rotrwi	5,16,17
	rotrwi	0,16,19
	xor	3,3,4
	srwi	4,19,3
	xor	5,5,0
	srwi	0,16,10
	add	18,18,27
	xor	3,3,4
	xor	5,5,0
	lwz	0,8(7)
	add	18,18,3
	add	18,18,5
	rotrwi	3,10,6
	rotrwi	4,10,11
	and	5,11,10
	xor	3,3,4
	add	6,6,0
	andc	0,12,10
	rotrwi	4,4,14
	or	5,5,0
	add	6,6,18
	xor	3,3,4
	add	6,6,5
	add	6,6,3

	rotrwi	3,14,2
	rotrwi	4,14,13
	and	5,14,15
	and	0,14,8
	xor	3,3,4
	rotrwi	4,4,9
	xor	5,5,0
	and	0,15,8
	xor	3,3,4
	add	9,9,6
	xor	5,5,0
	add	6,6,3
	add	6,6,5

	rotrwi	3,20,7
	rotrwi	4,20,18
	rotrwi	5,17,17
	rotrwi	0,17,19
	xor	3,3,4
	srwi	4,20,3
	xor	5,5,0
	srwi	0,17,10
	add	19,19,28
	xor	3,3,4
	xor	5,5,0
	lwz	0,12(7)
	add	19,19,3
	add	19,19,5
	rotrwi	3,9,6
	rotrwi	4,9,11
	and	5,10,9
	xor	3,3,4
	add	12,12,0
	andc	0,11,9
	rotrwi	4,4,14
	or	5,5,0
	add	12,12,19
	xor	3,3,4
	add	12,12,5
	add	12,12,3

	rotrwi	3,6,2
	rotrwi	4,6,13
	and	5,6,14
	and	0,6,15
	xor	3,3,4
	rotrwi	4,4,9
	xor	5,5,0
	and	0,14,15
	xor	3,3,4
	add	8,8,12
	xor	5,5,0
	add	12,12,3
	add	12,12,5

	rotrwi	3,21,7
	rotrwi	4,21,18
	rotrwi	5,18,17
	rotrwi	0,18,19
	xor	3,3,4
	srwi	4,21,3
	xor	5,5,0
	srwi	0,18,10
	add	20,20,29
	xor	3,3,4
	xor	5,5,0
	lwz	0,16(7)
	add	20,20,3
	add	20,20,5
	rotrwi	3,8,6
	rotrwi	4,8,11
	and	5,9,8
	xor	3,3,4
	add	11,11,0
	andc	0,10,8
	rotrwi	4,4,14
	or	5,5,0
	add	11,11,20
	xor	3,3,4
	add	11,11,5
	add	11,11,3

	rotrwi	3,12,2
	rotrwi	4,12,13
	and	5,12,6
	and	0,12,14
	xor	3,3,4
	rotrwi	4,4,9
	xor	5,5,0
	and	0,6,14
	xor	3,3,4
	add	15,15,11
	xor	5,5,0
	add	11,11,3
	add	11,11,5

	rotrwi	3,22,7
	rotrwi	4,22,18
	rotrwi	5,19,17
	rotrwi	0,19,19
	xor	3,3,4
	srwi	4,22,3
	xor	5,5,0
	srwi	0,19,10
	add	21,21,30
	xor	3,3,4
	xor	5,5,0
	lwz	0,20(7)
	add	21,21,3
	add	21,21,5
	rotrwi	3,15,6
	rotrwi	4,15,11
	and	5,8,15
	xor	3,3,4
	add	10,10,0
	andc	0,9,15
	rotrwi	4,4,14
	or	5,5,0
	add	10,10,21
	xor	3,3,4
	add	10,10,5
	add	10,10,3

	rotrwi	3,11,2
	rotrwi	4,11,13
	and	5,11,12
	and	0,11,6
	xor	3,3,4
	rotrwi	4,4,9
	xor	5,5,0
	and	0,12,6
	xor	3,3,4
	add	14,14,10
	xor	5,5,0
	add	10,10,3
	add	10,10,5

	rotrwi	3,23,7
	rotrwi	4,23,18
	rotrwi	5,20,17
	rotrwi	0,20,19
	xor	3,3,4
	srwi	4,23,3
	xor	5,5,0
	srwi	0,20,10
	add	22,22,31
	xor	3,3,4
	xor	5,5,0
	lwz	0,24(7)
	add	22,22,3
	add	22,22,5
	rotrwi	3,14,6
	rotrwi	4,14,11
	and	5,15,14
	xor	3,3,4
	add	9,9,0
	andc	0,8,14
	rotrwi	4,4,14
	or	5,5,0
	add	9,9,22
	xor	3,3,4
	add	9,9,5
	add	9,9,3

	rotrwi	3,10,2
	rotrwi	4,10,13
	and	5,10,11
	and	0,10,12
	xor	3,3,4
	rotrwi	4,4,9
	xor	5,5,0
	and	0,11,12
	xor	3,3,4
	add	6,6,9
	xor	5,5,0
	add	9,9,3
	add	9,9,5

	rotrwi	3,24,7
	rotrwi	4,24,18
	rotrwi	5,21,17
	rotrwi	0,21,19
	xor	3,3,4
	srwi	4,24,3
	xor	5,5,0
	srwi	0,21,10
	add	23,23,16
	xor	3,3,4
	xor	5,5,0
	lwz	0,28(7)
	add	23,23,3
	add	23,23,5
	rotrwi	3,6,6
	rotrwi	4,6,11
	and	5,14,6
	xor	3,3,4
	add	8,8,0
	andc	0,15,6
	rotrwi	4,4,14
	or	5,5,0
	add	8,8,23
	xor	3,3,4
	add	8,8,5
	add	8,8,3

	rotrwi	3,9,2
	rotrwi	4,9,13
	and	5,9,10
	and	0,9,11
	xor	3,3,4
	rotrwi	4,4,9
	xor	5,5,0
	and	0,10,11
	xor	3,3,4
	add	12,12,8
	xor	5,5,0
	add	8,8,3
	add	8,8,5

	rotrwi	3,25,7
	rotrwi	4,25,18
	rotrwi	5,22,17
	rotrwi	0,22,19
	xor	3,3,4
	srwi	4,25,3
	xor	5,5,0
	srwi	0,22,10
	add	24,24,17
	xor	3,3,4
	xor	5,5,0
	lwz	0,32(7)
	add	24,24,3
	add	24,24,5
	rotrwi	3,12,6
	rotrwi	4,12,11
	and	5,6,12
	xor	3,3,4
	add	15,15,0
	andc	0,14,12
	rotrwi	4,4,14
	or	5,5,0
	add	15,15,24
	xor	3,3,4
	add	15,15,5
	add	15,15,3

	rotrwi	3,8,2
	rotrwi	4,8,13
	and	5,8,9
	and	0,8,10
	xor	3,3,4
	rotrwi	4,4,9
	xor	5,5,0
	and	0,9,10
	xor	3,3,4
	add	11,11,15
	xor	5,5,0
	add	15,15,3
	add	15,15,5

	rotrwi	3,26,7
	rotrwi	4,26,18
	rotrwi	5,23,17
	rotrwi	0,23,19
	xor	3,3,4
	srwi	4,26,3
	xor	5,5,0
	srwi	0,23,10
	add	25,25,18
	xor	3,3,4
	xor	5,5,0
	lwz	0,36(7)
	add	25,25,3
	add	25,25,5
	rotrwi	3,11,6
	rotrwi	4,11,11
	and	5,12,11
	xor	3,3,4
	add	14,14,0
	andc	0,6,11
	rotrwi	4,4,14
	or	5,5,0
	add	14,14,25
	xor	3,3,4
	add	14,14,5
	add	14,14,3

	rotrwi	3,15,2
	rotrwi	4,15,13
	and	5,15,8
	and	0,15,9
	xor	3,3,4
	rotrwi	4,4,9
	xor	5,5,0
	and	0,8,9
	xor	3,3,4
	add	10,10,14
	xor	5,5,0
	add	14,14,3
	add	14,14,5

	rotrwi	3,27,7
	rotrwi	4,27,18
	rotrwi	5,24,17
	rotrwi	0,24,19
	xor	3,3,4
	srwi	4,27,3
	xor	5,5,0
	srwi	0,24,10
	add	26,26,19
	xor	3,3,4
	xor	5,5,0
	lwz	0,40(7)
	add	26,26,3
	add	26,26,5
	rotrwi	3,10,6
	rotrwi	4,10,11
	and	5,11,10
	xor	3,3,4
	add	6,6,0
	andc	0,12,10
	rotrwi	4,4,14
	or	5,5,0
	add	6,6,26
	xor	3,3,4
	add	6,6,5
	add	6,6,3

	rotrwi	3,14,2
	rotrwi	4,14,13
	and	5,14,15
	and	0,14,8
	xor	3,3,4
	rotrwi	4,4,9
	xor	5,5,0
	and	0,15,8
	xor	3,3,4
	add	9,9,6
	xor	5,5,0
	add	6,6,3
	add	6,6,5

	rotrwi	3,28,7
	rotrwi	4,28,18
	rotrwi	5,25,17
	rotrwi	0,25,19
	xor	3,3,4
	srwi	4,28,3
	xor	5,5,0
	srwi	0,25,10
	add	27,27,20
	xor	3,3,4
	xor	5,5,0
	lwz	0,44(7)
	add	27,27,3
	add	27,27,5
	rotrwi	3,9,6
	rotrwi	4,9,11
	and	5,10,9
	xor	3,3,4
	add	12,12,0
	andc	0,11,9
	rotrwi	4,4,14
	or	5,5,0
	add	12,12,27
	xor	3,3,4
	add	12,12,5
	add	12,12,3

	rotrwi	3,6,2
	rotrwi	4,6,13
	and	5,6,14
	and	0,6,15
	xor	3,3,4
	rotrwi	4,4,9
	xor	5,5,0
	and	0,14,15
	xor	3,3,4
	add	8,8,12
	xor	5,5,0
	add	12,12,3
	add	12,12,5

	rotrwi	3,29,7
	rotrwi	4,29,18
	rotrwi	5,26,17
	rotrwi	0,26,19
	xor	3,3,4
	srwi	4,29,3
	xor	5,5,0
	srwi	0,26,10
	add	28,28,21
	xor	3,3,4
	xor	5,5,0
	lwz	0,48(7)
	add	28,28,3
	add	28,28,5
	rotrwi	3,8,6
	rotrwi	4,8,11
	and	5,9,8
	xor	3,3,4
	add	11,11,0
	andc	0,10,8
	rotrwi	4,4,14
	or	5,5,0
	add	11,11,28
	xor	3,3,4
	add	11,11,5
	add	11,11,3

	rotrwi	3,12,2
	rotrwi	4,12,13
	and	5,12,6
	and	0,12,14
	xor	3,3,4
	rotrwi	4,4,9
	xor	5,5,0
	and	0,6,14
	xor	3,3,4
	add	15,15,11
	xor	5,5,0
	add	11,11,3
	add	11,11,5

	rotrwi	3,30,7
	rotrwi	4,30,18
	rotrwi	5,27,17
	rotrwi	0,27,19
	xor	3,3,4
	srwi	4,30,3
	xor	5,5,0
	srwi	0,27,10
	add	29,29,22
	xor	3,3,4
	xor	5,5,0
	lwz	0,52(7)
	add	29,29,3
	add	29,29,5
	rotrwi	3,15,6
	rotrwi	4,15,11
	and	5,8,15
	xor	3,3,4
	add	10,10,0
	andc	0,9,15
	rotrwi	4,4,14
	or	5,5,0
	add	10,10,29
	xor	3,3,4
	add	10,10,5
	add	10,10,3

	rotrwi	3,11,2
	rotrwi	4,11,13
	and	5,11,12
	and	0,11,6
	xor	3,3,4
	rotrwi	4,4,9
	xor	5,5,0
	and	0,12,6
	xor	3,3,4
	add	14,14,10
	xor	5,5,0
	add	10,10,3
	add	10,10,5

	rotrwi	3,31,7
	rotrwi	4,31,18
	rotrwi	5,28,17
	rotrwi	0,28,19
	xor	3,3,4
	srwi	4,31,3
	xor	5,5,0
	srwi	0,28,10
	add	30,30,23
	xor	3,3,4
	xor	5,5,0
	lwz	0,56(7)
	add	30,30,3
	add	30,30,5
	rotrwi	3,14,6
	rotrwi	4,14,11
	and	5,15,14
	xor	3,3,4
	add	9,9,0
	andc	0,8,14
	rotrwi	4,4,14
	or	5,5,0
	add	9,9,30
	xor	3,3,4
	add	9,9,5
	add	9,9,3

	rotrwi	3,10,2
	rotrwi	4,10,13
	and	5,10,11
	and	0,10,12
	xor	3,3,4
	rotrwi	4,4,9
	xor	5,5,0
	and	0,11,12
	xor	3,3,4
	add	6,6,9
	xor	5,5,0
	add	9,9,3
	add	9,9,5

	rotrwi	3,16,7
	rotrwi	4,16,18
	rotrwi	5,29,17
	rotrwi	0,29,19
	xor	3,3,4
	srwi	4,16,3
	xor	5,5,0
	srwi	0,29,10
	add	31,31,24
	xor	3,3,4
	xor	5,5,0
	lwz	0,60(7)
	add	31,31,3
	add	31,31,5
	rotrwi	3,6,6
	rotrwi	4,6,11
	and	5,14,6
	xor	3,3,4
	add	8,8,0
	andc	0,15,6
	rotrwi	4,4,14
	or	5,5,0
	add	8,8,31
	xor	3,3,4
	add	8,8,5
	add	8,8,3

	rotrwi	3,9,2
	rotrwi	4,9,13
	and	5,9,10
	and	0,9,11
	xor	3,3,4
	rotrwi	4,4,9
	xor	5,5,0
	and	0,10,11
	xor	3,3,4
	add	12,12,8
	xor	5,5,0
	add	8,8,3
	add	8,8,5

	bdnz	.Lrounds

	ld	3,144(1)
	ld	31,136(1)
	ld	5,128(1)
	subi	7,7,192

	lwz	16,0(3)
	lwz	17,4(3)
	lwz	18,8(3)
	lwz	19,12(3)
	lwz	20,16(3)
	lwz	21,20(3)
	lwz	22,24(3)
	addi	31,31,64
	lwz	23,28(3)
	add	8,8,16
	add	9,9,17
	std	31,136(1)
	add	10,10,18
	stw	8,0(3)
	add	11,11,19
	stw	9,4(3)
	add	12,12,20
	stw	10,8(3)
	add	6,6,21
	stw	11,12(3)
	add	14,14,22
	stw	12,16(3)
	add	15,15,23
	stw	6,20(3)
	stw	14,24(3)
	cmpld	31,5
	stw	15,28(3)
	bne	.Lsha2_block_private
	blr	
.long	0
.byte	0,12,0x14,0,0,0,0,0
.size	zfs_sha256_ppc,.-zfs_sha256_ppc
.align	6
.LPICmeup:
	mflr	0
	bcl	20,31,$+4
	mflr	7
	addi	7,7,56
	mtlr	0
	blr	
.long	0
.byte	0,12,0x14,0,0,0,0,0
.space	28
.long	0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5
.long	0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5
.long	0xd807aa98,0x12835b01,0x243185be,0x550c7dc3
.long	0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174
.long	0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc
.long	0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da
.long	0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7
.long	0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967
.long	0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13
.long	0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85
.long	0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3
.long	0xd192e819,0xd6990624,0xf40e3585,0x106aa070
.long	0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5
.long	0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3
.long	0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208
.long	0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2

#endif