.machine	"any"
.text

.globl	p384_felem_mul
.type	p384_felem_mul,@function
.section	".opd","aw"
.align	3
p384_felem_mul:
.quad	.p384_felem_mul,.TOC.@tocbase,0
.previous

.align	4
.p384_felem_mul:

	stdu	1, -176(1)
	mflr	0
	std	14, 56(1)
	std	15, 64(1)
	std	16, 72(1)
	std	17, 80(1)
	std	18, 88(1)
	std	19, 96(1)
	std	20, 104(1)
	std	21, 112(1)
	std	22, 120(1)

	bl	_p384_felem_mul_core

	mtlr	0
	ld	14, 56(1)
	ld	15, 64(1)
	ld	16, 72(1)
	ld	17, 80(1)
	ld	18, 88(1)
	ld	19, 96(1)
	ld	20, 104(1)
	ld	21, 112(1)
	ld	22, 120(1)
	addi	1, 1, 176
	blr	


.globl	p384_felem_square
.type	p384_felem_square,@function
.section	".opd","aw"
.align	3
p384_felem_square:
.quad	.p384_felem_square,.TOC.@tocbase,0
.previous

.align	4
.p384_felem_square:

	stdu	1, -176(1)
	mflr	0
	std	14, 56(1)
	std	15, 64(1)
	std	16, 72(1)
	std	17, 80(1)

	bl	_p384_felem_square_core

	mtlr	0
	ld	14, 56(1)
	ld	15, 64(1)
	ld	16, 72(1)
	ld	17, 80(1)
	addi	1, 1, 176
	blr	







.align	4
_p384_felem_mul_core:

	ld	6,0(4)
	ld	14,0(5)
	ld	7,8(4)
	ld	15,8(5)
	ld	8,16(4)
	ld	16,16(5)
	ld	9,24(4)
	ld	17,24(5)
	ld	10,32(4)
	ld	18,32(5)
	ld	11,40(4)
	ld	19,40(5)
	ld	12,48(4)
	ld	20,48(5)


	mulld	21, 14, 6
	mulhdu	22, 14, 6
	std	21, 0(3)
	std	22, 8(3)

	vxor	0, 0, 0


	mtvsrdd	32+13, 14, 6
	mtvsrdd	32+14, 7, 15
.long	0x102D7023


	mtvsrdd	32+15, 15, 6
	mtvsrdd	32+16, 7, 16
	mtvsrdd	32+17, 0, 8
	mtvsrdd	32+18, 0, 14
.long	0x126F8023
.long	0x105194E3


	mtvsrdd	32+13, 16, 6
	mtvsrdd	32+14, 7, 17
	mtvsrdd	32+15, 14, 8
	mtvsrdd	32+16, 9, 15
.long	0x126D7023
.long	0x106F84E3


	mtvsrdd	32+13, 17, 6
	mtvsrdd	32+14, 7, 18
	mtvsrdd	32+15, 15, 8
	mtvsrdd	32+16, 9, 16
	mtvsrdd	32+17, 0, 10
	mtvsrdd	32+18, 0, 14
.long	0x126D7023
.long	0x108F84E3
.long	0x10919123


	mtvsrdd	32+13, 18, 6
	mtvsrdd	32+14, 7, 19
	mtvsrdd	32+15, 16, 8
	mtvsrdd	32+16, 9, 17
	mtvsrdd	32+17, 14, 10
	mtvsrdd	32+18, 11, 15
.long	0x126D7023
.long	0x10AF84E3
.long	0x10B19163

	stxv	32+1, 16(3)
	stxv	32+2, 32(3)
	stxv	32+3, 48(3)
	stxv	32+4, 64(3)
	stxv	32+5, 80(3)


	mtvsrdd	32+13, 19, 6
	mtvsrdd	32+14, 7, 20
	mtvsrdd	32+15, 17, 8
	mtvsrdd	32+16, 9, 18
	mtvsrdd	32+17, 15, 10
	mtvsrdd	32+18, 11, 16
.long	0x126D7023
.long	0x10CF84E3
	mtvsrdd	32+13, 0, 12
	mtvsrdd	32+14, 0, 14
.long	0x127191A3
.long	0x10CD74E3


	mtvsrdd	32+13, 19, 7
	mtvsrdd	32+14, 8, 20
	mtvsrdd	32+15, 17, 9
	mtvsrdd	32+16, 10, 18
	mtvsrdd	32+17, 15, 11
	mtvsrdd	32+18, 12, 16
.long	0x126D7023
.long	0x10EF84E3
.long	0x10F191E3


	mtvsrdd	32+13, 19, 8
	mtvsrdd	32+14, 9, 20
	mtvsrdd	32+15, 17, 10
	mtvsrdd	32+16, 11, 18
	mtvsrdd	32+17, 0, 12
	mtvsrdd	32+18, 0, 16
.long	0x126D7023
.long	0x110F84E3
.long	0x11119223


	mtvsrdd	32+13, 19, 9
	mtvsrdd	32+14, 10, 20
	mtvsrdd	32+15, 17, 11
	mtvsrdd	32+16, 12, 18
.long	0x126D7023
.long	0x112F84E3


	mtvsrdd	32+13, 19, 10
	mtvsrdd	32+14, 11, 20
	mtvsrdd	32+15, 0, 12
	mtvsrdd	32+16, 0, 18
.long	0x126D7023
.long	0x114F84E3


	mtvsrdd	32+17, 19, 11
	mtvsrdd	32+18, 12, 20
.long	0x11719023

	stxv	32+6, 96(3)
	stxv	32+7, 112(3)
	stxv	32+8, 128(3)
	stxv	32+9, 144(3)
	stxv	32+10, 160(3)
	stxv	32+11, 176(3)


	mulld	21, 20, 12
	mulhdu	22, 20, 12

	std	21, 192(3)
	std	22, 200(3)

	blr	







.align	4
_p384_felem_square_core:

	ld	6, 0(4)
	ld	7, 8(4)
	ld	8, 16(4)
	ld	9, 24(4)
	ld	10, 32(4)
	ld	11, 40(4)
	ld	12, 48(4)

	vxor	0, 0, 0


	mulld	14, 6, 6
	mulhdu	15, 6, 6
	std	14, 0(3)
	std	15, 8(3)


	add	14, 6, 6
	mtvsrdd	32+13, 0, 14
	mtvsrdd	32+14, 0, 7
.long	0x102D7023


	mtvsrdd	32+15, 7, 14
	mtvsrdd	32+16, 7, 8
.long	0x104F8023


	add	15, 7, 7
	mtvsrdd	32+13, 8, 14
	mtvsrdd	32+14, 15, 9
.long	0x106D7023


	mtvsrdd	32+13, 9, 14
	mtvsrdd	32+14, 15, 10
	mtvsrdd	32+15, 0, 8
.long	0x108D7023
.long	0x108F7923


	mtvsrdd	32+13, 10, 14
	mtvsrdd	32+14, 15, 11
	add	16, 8, 8
	mtvsrdd	32+15, 0, 16
	mtvsrdd	32+16, 0, 9
.long	0x10AD7023
.long	0x10AF8163

	stxv	32+1, 16(3)
	stxv	32+2, 32(3)
	stxv	32+3, 48(3)
	stxv	32+4, 64(3)


	mtvsrdd	32+13, 11, 14
	mtvsrdd	32+14, 15, 12
	mtvsrdd	32+15, 9, 16
	mtvsrdd	32+16, 9, 10
	stxv	32+5, 80(3)
.long	0x126D7023
.long	0x10CF84E3


	add	17, 9, 9
	mtvsrdd	32+13, 11, 15
	mtvsrdd	32+14, 16, 12
	mtvsrdd	32+15, 0, 17
	mtvsrdd	32+16, 0, 10
.long	0x126D7023
.long	0x10EF84E3


	mtvsrdd	32+13, 11, 16
	mtvsrdd	32+14, 17, 12
	mtvsrdd	32+15, 0, 10
.long	0x126D7023
.long	0x110F7CE3


	add	14, 10, 10
	mtvsrdd	32+13, 11, 17
	mtvsrdd	32+14, 14, 12
.long	0x112D7023


	mtvsrdd	32+13, 11, 14
	mtvsrdd	32+14, 11, 12
.long	0x114D7023

	stxv	32+6, 96(3)
	stxv	32+7, 112(3)







	mulld	6, 12, 11
	mulhdu	7, 12, 11
	addc	8, 6, 6
	adde	9, 7, 7

	stxv	32+8, 128(3)
	stxv	32+9, 144(3)
	stxv	32+10, 160(3)



	mulld	14, 12, 12
	mulhdu	15, 12, 12

	std	8, 176(3)
	std	9, 184(3)
	std	14, 192(3)
	std	15, 200(3)

	blr	





.macro	F128_X_8 _off1 _off2
	ld	9,\_off1(3)
	ld	8,\_off2(3)
	srdi	10,9,61
	rldimi	10,8,3,0
	sldi	9,9,3
	std	9,\_off1(3)
	std	10,\_off2(3)
.endm	

.globl	p384_felem128_mul_by_8
.type	p384_felem128_mul_by_8,@function
.section	".opd","aw"
.align	3
p384_felem128_mul_by_8:
.quad	.p384_felem128_mul_by_8,.TOC.@tocbase,0
.previous

.align	4
.p384_felem128_mul_by_8:

	F128_X_8	0, 8

	F128_X_8	16, 24

	F128_X_8	32, 40

	F128_X_8	48, 56

	F128_X_8	64, 72

	F128_X_8	80, 88

	F128_X_8	96, 104

	F128_X_8	112, 120

	F128_X_8	128, 136

	F128_X_8	144, 152

	F128_X_8	160, 168

	F128_X_8	176, 184

	F128_X_8	192, 200

	blr	





.macro	F128_X_2 _off1 _off2
	ld	9,\_off1(3)
	ld	8,\_off2(3)
	srdi	10,9,63
	rldimi	10,8,1,0
	sldi	9,9,1
	std	9,\_off1(3)
	std	10,\_off2(3)
.endm	

.globl	p384_felem128_mul_by_2
.type	p384_felem128_mul_by_2,@function
.section	".opd","aw"
.align	3
p384_felem128_mul_by_2:
.quad	.p384_felem128_mul_by_2,.TOC.@tocbase,0
.previous

.align	4
.p384_felem128_mul_by_2:

	F128_X_2	0, 8

	F128_X_2	16, 24

	F128_X_2	32, 40

	F128_X_2	48, 56

	F128_X_2	64, 72

	F128_X_2	80, 88

	F128_X_2	96, 104

	F128_X_2	112, 120

	F128_X_2	128, 136

	F128_X_2	144, 152

	F128_X_2	160, 168

	F128_X_2	176, 184

	F128_X_2	192, 200

	blr	


.globl	p384_felem_diff128
.type	p384_felem_diff128,@function
.section	".opd","aw"
.align	3
p384_felem_diff128:
.quad	.p384_felem_diff128,.TOC.@tocbase,0
.previous

.align	4
.p384_felem_diff128:

	addis	5, 2, .LConst_two127@toc@ha
	addi	5, 5, .LConst_two127@toc@l

	ld	10, 0(3)
	ld	8, 8(3)
	li	9, 0
	addc	10, 10, 9
	li	7, -1
	rldicr	7, 7, 0, 0
	adde	8, 8, 7
	ld	11, 0(4)
	ld	12, 8(4)
	subfc	11, 11, 10
	subfe	12, 12, 8
	std	11, 0(3)
	std	12, 8(3)


	ld	8, 16(3)
	ld	7, 24(3)
	ld	10, 24(5)
	addc	8, 8, 9
	adde	7, 7, 10
	ld	11, 16(4)
	ld	12, 24(4)
	subfc	11, 11, 8
	subfe	12, 12, 7
	std	11, 16(3)
	std	12, 24(3)

	ld	8, 32(3)
	ld	7, 40(3)
	addc	8, 8, 9
	adde	7, 7, 10
	ld	11, 32(4)
	ld	12, 40(4)
	subfc	11, 11, 8
	subfe	12, 12, 7
	std	11, 32(3)
	std	12, 40(3)

	ld	8, 48(3)
	ld	7, 56(3)
	addc	8, 8, 9
	adde	7, 7, 10
	ld	11, 48(4)
	ld	12, 56(4)
	subfc	11, 11, 8
	subfe	12, 12, 7
	std	11, 48(3)
	std	12, 56(3)

	ld	8, 64(3)
	ld	7, 72(3)
	addc	8, 8, 9
	adde	7, 7, 10
	ld	11, 64(4)
	ld	12, 72(4)
	subfc	11, 11, 8
	subfe	12, 12, 7
	std	11, 64(3)
	std	12, 72(3)

	ld	8, 80(3)
	ld	7, 88(3)
	addc	8, 8, 9
	adde	7, 7, 10
	ld	11, 80(4)
	ld	12, 88(4)
	subfc	11, 11, 8
	subfe	12, 12, 7
	std	11, 80(3)
	std	12, 88(3)

	ld	8, 96(3)
	ld	7, 104(3)
	ld	6, 40(5)
	addc	8, 8, 9
	adde	7, 7, 6
	ld	11, 96(4)
	ld	12, 104(4)
	subfc	11, 11, 8
	subfe	12, 12, 7
	std	11, 96(3)
	std	12, 104(3)

	ld	8, 112(3)
	ld	7, 120(3)
	ld	6, 56(5)
	addc	8, 8, 9
	adde	7, 7, 6
	ld	11, 112(4)
	ld	12, 120(4)
	subfc	11, 11, 8
	subfe	12, 12, 7
	std	11, 112(3)
	std	12, 120(3)

	ld	8, 128(3)
	ld	7, 136(3)
	ld	6, 72(5)
	addc	8, 8, 9
	adde	7, 7, 6
	ld	11, 128(4)
	ld	12, 136(4)
	subfc	11, 11, 8
	subfe	12, 12, 7
	std	11, 128(3)
	std	12, 136(3)

	ld	8, 144(3)
	ld	7, 152(3)
	addc	8, 8, 9
	adde	7, 7, 10
	ld	11, 144(4)
	ld	12, 152(4)
	subfc	11, 11, 8
	subfe	12, 12, 7
	std	11, 144(3)
	std	12, 152(3)

	ld	8, 160(3)
	ld	7, 168(3)
	addc	8, 8, 9
	adde	7, 7, 10
	ld	11, 160(4)
	ld	12, 168(4)
	subfc	11, 11, 8
	subfe	12, 12, 7
	std	11, 160(3)
	std	12, 168(3)

	ld	8, 176(3)
	ld	7, 184(3)
	addc	8, 8, 9
	adde	7, 7, 10
	ld	11, 176(4)
	ld	12, 184(4)
	subfc	11, 11, 8
	subfe	12, 12, 7
	std	11, 176(3)
	std	12, 184(3)

	ld	8, 192(3)
	ld	7, 200(3)
	addc	8, 8, 9
	adde	7, 7, 10
	ld	11, 192(4)
	ld	12, 200(4)
	subfc	11, 11, 8
	subfe	12, 12, 7
	std	11, 192(3)
	std	12, 200(3)

	blr	


.data	
.align	4
.LConst_two127:

.long	0x00000000, 0x00000000, 0x00000000, 0x80000000

.long	0x00000000, 0x00000000, 0xffffff80, 0x7fffffff

.long	0x00000000, 0x00000000, 0xffff7f80, 0x80007fff

.long	0x00000000, 0x00000000, 0xffffff80, 0x7f7fffff

.long	0x00000000, 0x00000000, 0x7fffff80, 0x7fffffff

.text

.globl	p384_felem_diff_128_64
.type	p384_felem_diff_128_64,@function
.section	".opd","aw"
.align	3
p384_felem_diff_128_64:
.quad	.p384_felem_diff_128_64,.TOC.@tocbase,0
.previous

.align	4
.p384_felem_diff_128_64:
	addis	5, 2, .LConst_128_two64@toc@ha
	addi	5, 5, .LConst_128_two64@toc@l

	ld	9, 0(3)
	ld	10, 8(3)
	ld	8, 48(5)
	li	7, 0
	addc	9, 9, 8
	li	6, 1
	adde	10, 10, 6
	ld	11, 0(4)
	subfc	8, 11, 9
	subfe	12, 7, 10
	std	8, 0(3)
	std	12, 8(3)

	ld	9, 16(3)
	ld	10, 24(3)
	ld	8, 0(5)
	addc	9, 9, 8
	addze	10, 10
	ld	11, 8(4)
	subfc	11, 11, 9
	subfe	12, 7, 10
	std	11, 16(3)
	std	12, 24(3)

	ld	9, 32(3)
	ld	10, 40(3)
	ld	8, 16(5)
	addc	9, 9, 8
	addze	10, 10
	ld	11, 16(4)
	subfc	11, 11, 9
	subfe	12, 7, 10
	std	11, 32(3)
	std	12, 40(3)

	ld	10, 48(3)
	ld	8, 56(3)

	li	9, -256
	addc	10, 10, 9
	addze	8, 8
	ld	11, 24(4)
	subfc	11, 11, 10
	subfe	12, 7, 8
	std	11, 48(3)
	std	12, 56(3)

	ld	10, 64(3)
	ld	8, 72(3)
	addc	10, 10, 9
	addze	8, 8
	ld	11, 32(4)
	subfc	11, 11, 10
	subfe	12, 7, 8
	std	11, 64(3)
	std	12, 72(3)

	ld	10, 80(3)
	ld	8, 88(3)
	addc	10, 10, 9
	addze	8, 8
	ld	11, 40(4)
	subfc	11, 11, 10
	subfe	12, 7, 8
	std	11, 80(3)
	std	12, 88(3)

	ld	10, 96(3)
	ld	8, 104(3)
	addc	10, 10, 9
	addze	9, 8
	ld	11, 48(4)
	subfc	11, 11, 10
	subfe	12, 7, 9
	std	11, 96(3)
	std	12, 104(3)

	blr	


.data	
.align	4
.LConst_128_two64:

.long	0xffffff00, 0xfeffffff, 0x00000000, 0x00000000

.long	0xffffff00, 0xfffffffe, 0x00000000, 0x00000000

.long	0xffffff00, 0xffffffff, 0x00000000, 0x00000000

.long	0xffff0000, 0x0000ffff, 0x00000001, 0x00000000

.LConst_two60:

.long	0xfffffff0, 0x0fefffff, 0x0, 0x0

.long	0xfffff000, 0x10000fff, 0x0, 0x0

.long	0xeffffff0, 0x0fffffff, 0x0, 0x0

.long	0xfffffff0, 0x0fffffff, 0x0, 0x0

.text



.globl	p384_felem_diff64
.type	p384_felem_diff64,@function
.section	".opd","aw"
.align	3
p384_felem_diff64:
.quad	.p384_felem_diff64,.TOC.@tocbase,0
.previous

.align	4
.p384_felem_diff64:
	addis	5, 2, .LConst_two60@toc@ha
	addi	5, 5, .LConst_two60@toc@l

	ld	9, 0(3)
	ld	8, 16(5)
	li	7, 0
	add	9, 9, 8
	ld	11, 0(4)
	subf	8, 11, 9
	std	8, 0(3)

	ld	9, 8(3)
	ld	8, 0(5)
	add	9, 9, 8
	ld	11, 8(4)
	subf	11, 11, 9
	std	11, 8(3)

	ld	9, 16(3)
	ld	8, 32(5)
	add	9, 9, 8
	ld	11, 16(4)
	subf	11, 11, 9
	std	11, 16(3)

	ld	10, 24(3)
	ld	9, 48(5)
	add	10, 10, 9
	ld	12, 24(4)
	subf	12, 12, 10
	std	12, 24(3)

	ld	10, 32(3)
	add	10, 10, 9
	ld	11, 32(4)
	subf	11, 11, 10
	std	11, 32(3)

	ld	10, 40(3)
	add	10, 10, 9
	ld	12, 40(4)
	subf	12, 12, 10
	std	12, 40(3)

	ld	10, 48(3)
	add	10, 10, 9
	ld	11, 48(4)
	subf	11, 11, 10
	std	11, 48(3)

	blr	


.text



.macro	SHR o_h o_l in_h in_l nbits
	srdi	\o_l, \in_l, \nbits
	rldimi	\o_l, \in_h, 64-\nbits, 0
	srdi	\o_h, \in_h, \nbits
.endm	




.global	p384_felem_reduce

.align	4
p384_felem_reduce:

	stdu	1, -208(1)
	mflr	0
	std	14, 56(1)
	std	15, 64(1)
	std	16, 72(1)
	std	17, 80(1)
	std	18, 88(1)
	std	19, 96(1)
	std	20, 104(1)
	std	21, 112(1)
	std	22, 120(1)
	std	23, 128(1)
	std	24, 136(1)
	std	25, 144(1)
	std	26, 152(1)
	std	27, 160(1)
	std	28, 168(1)
	std	29, 176(1)
	std	30, 184(1)
	std	31, 192(1)

	bl	_p384_felem_reduce_core

	mtlr	0
	ld	14, 56(1)
	ld	15, 64(1)
	ld	16, 72(1)
	ld	17, 80(1)
	ld	18, 88(1)
	ld	19, 96(1)
	ld	20, 104(1)
	ld	21, 112(1)
	ld	22, 120(1)
	ld	23, 128(1)
	ld	24, 136(1)
	ld	25, 144(1)
	ld	26, 152(1)
	ld	27, 160(1)
	ld	28, 168(1)
	ld	29, 176(1)
	ld	30, 184(1)
	ld	31, 192(1)
	addi	1, 1, 208
	blr	







.align	4
_p384_felem_reduce_core:
	addis	12, 2, .LConst@toc@ha
	addi	12, 12, .LConst@toc@l


	ld	11, 8(12)


	ld	26, 96(4)
	ld	27, 96+8(4)
	add	27, 27, 11


	ld	24, 80(4)
	ld	25, 80+8(4)
	add	25, 25, 11


	ld	22, 64(4)
	ld	23, 64+8(4)
	add	23, 23, 11


	ld	20, 48(4)
	ld	21, 48+8(4)
	add	21, 21, 11

	ld	11, 48+8(12)


	ld	18, 32(4)
	ld	19, 32+8(4)
	add	19, 19, 11

	ld	11, 16+8(12)


	ld	16, 16(4)
	ld	17, 16+8(4)
	add	17, 17, 11

	ld	11, 32+8(12)


	ld	14, 0(4)
	ld	15, 0+8(4)
	add	15, 15, 11


	li	7, -1




	ld	5, 192(4)
	ld	6, 192+8(4)
	SHR	9, 10, 6, 5, 32
	ld	30, 128(4)
	ld	31, 136(4)
	addc	30, 30, 10
	adde	31, 31, 9


	srdi	11, 7, 32
	and	11, 11, 5
	sldi	11, 11, 24
	ld	28, 112(4)
	ld	29, 120(4)
	addc	28, 28, 11
	addze	29, 29


	SHR	9, 10, 6, 5, 8
	addc	28, 28, 10
	adde	29, 29, 9


	andi.	11, 5, 0xff
	sldi	11, 11, 48
	addc	26, 26, 11
	addze	27, 27


	SHR	9, 10, 6, 5, 16
	subfc	26, 10, 26
	subfe	27, 9, 27


	srdi	11, 7, 48
	and	11, 11, 5
	sldi	11, 11, 40
	li	9, 0
	subfc	24, 11, 24
	subfe	25, 9, 25


	SHR	9, 10, 6, 5, 48
	addc	26, 26, 10
	adde	27, 27, 9


	srdi	11, 7, 16
	and	11, 11, 5
	sldi	11, 11, 8
	addc	24, 24, 11
	addze	25, 25




	ld	5, 176(4)
	ld	6, 176+8(4)
	SHR	9, 10, 6, 5, 32
	addc	28, 28, 10
	adde	29, 29, 9


	srdi	11, 7, 32
	and	11, 11, 5
	sldi	11, 11, 24
	addc	26, 26, 11
	addze	27, 27


	SHR	9, 10, 6, 5, 8
	addc	26, 26, 10
	adde	27, 27, 9


	andi.	11, 5, 0xff
	sldi	11, 11, 48
	addc	24, 24, 11
	addze	25, 25


	SHR	9, 10, 6, 5, 16
	subfc	24, 10, 24
	subfe	25, 9, 25


	srdi	11, 7, 48
	and	11, 11, 5
	sldi	11, 11, 40
	li	9, 0
	subfc	22, 11, 22
	subfe	23, 9, 23


	SHR	9, 10, 6, 5, 48
	addc	24, 24, 10
	adde	25, 25, 9


	srdi	11, 7, 16
	and	11, 11, 5
	sldi	11, 11, 8
	addc	22, 22, 11
	addze	23, 23




	ld	5, 160(4)
	ld	6, 160+8(4)
	SHR	9, 10, 6, 5, 32
	addc	26, 26, 10
	adde	27, 27, 9


	srdi	11, 7, 32
	and	11, 11, 5
	sldi	11, 11, 24
	addc	24, 24, 11
	addze	25, 25


	SHR	9, 10, 6, 5, 8
	addc	24, 24, 10
	adde	25, 25, 9


	andi.	11, 5, 0xff
	sldi	11, 11, 48
	addc	22, 22, 11
	addze	23, 23


	SHR	9, 10, 6, 5, 16
	subfc	22, 10, 22
	subfe	23, 9, 23


	srdi	11, 7, 48
	and	11, 11, 5
	sldi	11, 11, 40
	li	9, 0
	subfc	20, 11, 20
	subfe	21, 9, 21


	SHR	9, 10, 6, 5, 48
	addc	22, 22, 10
	adde	23, 23, 9


	srdi	11, 7, 16
	and	11, 11, 5
	sldi	11, 11, 8
	addc	20, 20, 11
	addze	21, 21




	ld	5, 144(4)
	ld	6, 144+8(4)
	SHR	9, 10, 6, 5, 32
	addc	24, 24, 10
	adde	25, 25, 9


	srdi	11, 7, 32
	and	11, 11, 5
	sldi	11, 11, 24
	addc	22, 22, 11
	addze	23, 23


	SHR	9, 10, 6, 5, 8
	addc	22, 22, 10
	adde	23, 23, 9


	andi.	11, 5, 0xff
	sldi	11, 11, 48
	addc	20, 20, 11
	addze	21, 21


	SHR	9, 10, 6, 5, 16
	subfc	20, 10, 20
	subfe	21, 9, 21


	srdi	11, 7, 48
	and	11, 11, 5
	sldi	11, 11, 40
	li	9, 0
	subfc	18, 11, 18
	subfe	19, 9, 19


	SHR	9, 10, 6, 5, 48
	addc	20, 20, 10
	adde	21, 21, 9


	srdi	11, 7, 16
	and	11, 11, 5
	sldi	11, 11, 8
	addc	18, 18, 11
	addze	19, 19




	mr	5, 30
	mr	6, 31
	SHR	9, 10, 6, 5, 32
	addc	22, 22, 10
	adde	23, 23, 9


	srdi	11, 7, 32
	and	11, 11, 5
	sldi	11, 11, 24
	addc	20, 20, 11
	addze	21, 21


	SHR	9, 10, 6, 5, 8
	addc	20, 20, 10
	adde	21, 21, 9


	andi.	11, 5, 0xff
	sldi	11, 11, 48
	addc	18, 18, 11
	addze	19, 19


	SHR	9, 10, 6, 5, 16
	subfc	18, 10, 18
	subfe	19, 9, 19


	srdi	11, 7, 48
	and	11, 11, 5
	sldi	11, 11, 40
	li	9, 0
	subfc	16, 11, 16
	subfe	17, 9, 17


	SHR	9, 10, 6, 5, 48
	addc	18, 18, 10
	adde	19, 19, 9


	srdi	11, 7, 16
	and	11, 11, 5
	sldi	11, 11, 8
	addc	16, 16, 11
	addze	17, 17




	mr	5, 28
	mr	6, 29
	SHR	9, 10, 6, 5, 32
	addc	20, 20, 10
	adde	21, 21, 9


	srdi	11, 7, 32
	and	11, 11, 5
	sldi	11, 11, 24
	addc	18, 18, 11
	addze	19, 19


	SHR	9, 10, 6, 5, 8
	addc	18, 18, 10
	adde	19, 19, 9


	andi.	11, 5, 0xff
	sldi	11, 11, 48
	addc	16, 16, 11
	addze	17, 17


	SHR	9, 10, 6, 5, 16
	subfc	16, 10, 16
	subfe	17, 9, 17


	srdi	11, 7, 48
	and	11, 11, 5
	sldi	11, 11, 40
	li	9, 0
	subfc	14, 11, 14
	subfe	15, 9, 15


	SHR	9, 10, 6, 5, 48
	addc	16, 16, 10
	adde	17, 17, 9


	srdi	11, 7, 16
	and	11, 11, 5
	sldi	11, 11, 8
	addc	14, 14, 11
	addze	15, 15






	SHR	9, 10, 23, 22, 56
	addc	24, 24, 10
	adde	25, 25, 9
	srdi	11, 7, 8
	and	22, 22, 11
	li	23, 0



	SHR	9, 10, 25, 24, 56
	addc	26, 26, 10
	adde	27, 27, 9
	and	24, 24, 11
	li	25, 0




	SHR	31, 30, 27, 26, 48
	srdi	11, 7, 16
	and	26, 26, 11
	li	27, 0



	SHR	9, 10, 31, 30, 40
	addc	20, 20, 10
	adde	21, 21, 9


	srdi	11, 7, 24
	and	10, 30, 11
	sldi	10, 10, 16
	addc	18, 18, 10
	addze	19, 19


	SHR	9, 10, 31, 30, 16
	addc	18, 18, 10
	adde	19, 19, 9


	srdi	11, 7, 48
	and	10, 30, 11
	sldi	10, 10, 40
	addc	16, 16, 10
	addze	17, 17


	SHR	9, 10, 31, 30, 24
	subfc	16, 10, 16
	subfe	17, 9, 17


	srdi	11, 7, 40
	and	10, 30, 11
	sldi	10, 10, 32
	li	9, 0
	subfc	14, 10, 14
	subfe	15, 9, 15


	addc	14, 14, 30
	adde	15, 15, 31




	SHR	9, 10, 15, 14, 56
	addc	16, 16, 10
	adde	17, 17, 9


	srdi	11, 7, 8
	and	14, 14, 11
	li	15, 0


	SHR	9, 10, 17, 16, 56
	addc	18, 18, 10
	adde	19, 19, 9


	and	16, 16, 11
	li	17, 0


	SHR	9, 10, 19, 18, 56
	addc	20, 20, 10
	adde	21, 21, 9


	and	18, 18, 11
	li	19, 0


	SHR	9, 10, 21, 20, 56
	addc	22, 22, 10
	adde	23, 23, 9


	and	20, 20, 11
	li	21, 0


	SHR	9, 10, 23, 22, 56
	addc	24, 24, 10
	adde	25, 25, 9


	and	22, 22, 11


	SHR	9, 10, 25, 24, 56
	addc	26, 26, 10
	adde	27, 27, 9


	and	24, 24, 11

	std	14, 0(3)
	std	16, 8(3)
	std	18, 16(3)
	std	20, 24(3)
	std	22, 32(3)
	std	24, 40(3)
	std	26, 48(3)
	blr	


.data	
.align	4
.LConst:

.long	0x0, 0x0, 0xfffffff0, 0xfffffff

.long	0x0, 0x0, 0xfffffff0, 0xfefffff

.long	0x0, 0x0, 0xfffff000, 0x10000fff

.long	0x0, 0x0, 0xeffffff0, 0xfffffff

.text




.global	p384_felem_square_reduce

.align	4
p384_felem_square_reduce:
	stdu	1, -512(1)
	mflr	0
	std	14, 56(1)
	std	15, 64(1)
	std	16, 72(1)
	std	17, 80(1)
	std	18, 88(1)
	std	19, 96(1)
	std	20, 104(1)
	std	21, 112(1)
	std	22, 120(1)
	std	23, 128(1)
	std	24, 136(1)
	std	25, 144(1)
	std	26, 152(1)
	std	27, 160(1)
	std	28, 168(1)
	std	29, 176(1)
	std	30, 184(1)
	std	31, 192(1)

	std	3, 496(1)
	addi	3, 1, 208
	bl	_p384_felem_square_core

	mr	4, 3
	ld	3, 496(1)
	bl	_p384_felem_reduce_core

	ld	14, 56(1)
	ld	15, 64(1)
	ld	16, 72(1)
	ld	17, 80(1)
	ld	18, 88(1)
	ld	19, 96(1)
	ld	20, 104(1)
	ld	21, 112(1)
	ld	22, 120(1)
	ld	23, 128(1)
	ld	24, 136(1)
	ld	25, 144(1)
	ld	26, 152(1)
	ld	27, 160(1)
	ld	28, 168(1)
	ld	29, 176(1)
	ld	30, 184(1)
	ld	31, 192(1)
	addi	1, 1, 512
	mtlr	0
	blr	





.global	p384_felem_mul_reduce

.align	5
p384_felem_mul_reduce:
	stdu	1, -512(1)
	mflr	0
	std	14, 56(1)
	std	15, 64(1)
	std	16, 72(1)
	std	17, 80(1)
	std	18, 88(1)
	std	19, 96(1)
	std	20, 104(1)
	std	21, 112(1)
	std	22, 120(1)
	std	23, 128(1)
	std	24, 136(1)
	std	25, 144(1)
	std	26, 152(1)
	std	27, 160(1)
	std	28, 168(1)
	std	29, 176(1)
	std	30, 184(1)
	std	31, 192(1)

	std	3, 496(1)
	addi	3, 1, 208
	bl	_p384_felem_mul_core

	mr	4, 3
	ld	3, 496(1)
	bl	_p384_felem_reduce_core

	ld	14, 56(1)
	ld	15, 64(1)
	ld	16, 72(1)
	ld	17, 80(1)
	ld	18, 88(1)
	ld	19, 96(1)
	ld	20, 104(1)
	ld	21, 112(1)
	ld	22, 120(1)
	ld	23, 128(1)
	ld	24, 136(1)
	ld	25, 144(1)
	ld	26, 152(1)
	ld	27, 160(1)
	ld	28, 168(1)
	ld	29, 176(1)
	ld	30, 184(1)
	ld	31, 192(1)
	addi	1, 1, 512
	mtlr	0
	blr	

