dnl  S/390-64 mpn_invert_limb

dnl  Contributed to the GNU project by Torbjorn Granlund.

dnl  Copyright 2011 Free Software Foundation, Inc.

dnl  This file is part of the GNU MP Library.

dnl  The GNU MP Library is free software; you can redistribute it and/or modify
dnl  it under the terms of the GNU Lesser General Public License as published
dnl  by the Free Software Foundation; either version 3 of the License, or (at
dnl  your option) any later version.

dnl  The GNU MP Library is distributed in the hope that it will be useful, but
dnl  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
dnl  or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
dnl  License for more details.

dnl  You should have received a copy of the GNU Lesser General Public License
dnl  along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.

include(`../config.m4')

C            cycles/limb
C z900	       142
C z990          86
C z9		 ?
C z10		 ?
C z196		 ?

ASM_START()
	TEXT
	ALIGN(16)
PROLOGUE(mpn_invert_limb)
	stg	%r9, 72(%r15)
	srlg	%r9, %r2, 55
	agr	%r9, %r9
	larl	%r4, approx_tab-512
	srlg	%r3, %r2, 24
	aghi	%r3, 1
	lghi	%r5, 1
	llgh	%r4, 0(%r9, %r4)
	sllg	%r9, %r4, 11
	msgr	%r4, %r4
	msgr	%r4, %r3
	srlg	%r4, %r4, 40
	aghi	%r9, -1
	sgr	%r9, %r4
	sllg	%r0, %r9, 60
	sllg	%r1, %r9, 13
	msgr	%r9, %r9
	msgr	%r9, %r3
	sgr	%r0, %r9
	ngr	%r5, %r2
	srlg	%r4, %r2, 1
	srlg	%r3, %r0, 47
	agr	%r3, %r1
	agr	%r4, %r5
	msgr	%r4, %r3
	srlg	%r1, %r3, 1
	lcgr	%r5, %r5
	ngr	%r1, %r5
	sgr	%r1, %r4
	mlgr	%r0, %r3
	srlg	%r9, %r0, 1
	sllg	%r4, %r3, 31
	agr	%r4, %r9
	lgr	%r1, %r4
	mlgr	%r0, %r2
	algr	%r1, %r2
	alcgr	%r0, %r2
	lgr	%r2, %r4
	sgr	%r2, %r0
	lg	%r9, 72(%r15)
	br	%r14
EPILOGUE()
	RODATA
	ALIGN(2)
approx_tab:
	.word	0x7fd,0x7f5,0x7ed,0x7e5,0x7dd,0x7d5,0x7ce,0x7c6
	.word	0x7bf,0x7b7,0x7b0,0x7a8,0x7a1,0x79a,0x792,0x78b
	.word	0x784,0x77d,0x776,0x76f,0x768,0x761,0x75b,0x754
	.word	0x74d,0x747,0x740,0x739,0x733,0x72c,0x726,0x720
	.word	0x719,0x713,0x70d,0x707,0x700,0x6fa,0x6f4,0x6ee
	.word	0x6e8,0x6e2,0x6dc,0x6d6,0x6d1,0x6cb,0x6c5,0x6bf
	.word	0x6ba,0x6b4,0x6ae,0x6a9,0x6a3,0x69e,0x698,0x693
	.word	0x68d,0x688,0x683,0x67d,0x678,0x673,0x66e,0x669
	.word	0x664,0x65e,0x659,0x654,0x64f,0x64a,0x645,0x640
	.word	0x63c,0x637,0x632,0x62d,0x628,0x624,0x61f,0x61a
	.word	0x616,0x611,0x60c,0x608,0x603,0x5ff,0x5fa,0x5f6
	.word	0x5f1,0x5ed,0x5e9,0x5e4,0x5e0,0x5dc,0x5d7,0x5d3
	.word	0x5cf,0x5cb,0x5c6,0x5c2,0x5be,0x5ba,0x5b6,0x5b2
	.word	0x5ae,0x5aa,0x5a6,0x5a2,0x59e,0x59a,0x596,0x592
	.word	0x58e,0x58a,0x586,0x583,0x57f,0x57b,0x577,0x574
	.word	0x570,0x56c,0x568,0x565,0x561,0x55e,0x55a,0x556
	.word	0x553,0x54f,0x54c,0x548,0x545,0x541,0x53e,0x53a
	.word	0x537,0x534,0x530,0x52d,0x52a,0x526,0x523,0x520
	.word	0x51c,0x519,0x516,0x513,0x50f,0x50c,0x509,0x506
	.word	0x503,0x500,0x4fc,0x4f9,0x4f6,0x4f3,0x4f0,0x4ed
	.word	0x4ea,0x4e7,0x4e4,0x4e1,0x4de,0x4db,0x4d8,0x4d5
	.word	0x4d2,0x4cf,0x4cc,0x4ca,0x4c7,0x4c4,0x4c1,0x4be
	.word	0x4bb,0x4b9,0x4b6,0x4b3,0x4b0,0x4ad,0x4ab,0x4a8
	.word	0x4a5,0x4a3,0x4a0,0x49d,0x49b,0x498,0x495,0x493
	.word	0x490,0x48d,0x48b,0x488,0x486,0x483,0x481,0x47e
	.word	0x47c,0x479,0x477,0x474,0x472,0x46f,0x46d,0x46a
	.word	0x468,0x465,0x463,0x461,0x45e,0x45c,0x459,0x457
	.word	0x455,0x452,0x450,0x44e,0x44b,0x449,0x447,0x444
	.word	0x442,0x440,0x43e,0x43b,0x439,0x437,0x435,0x432
	.word	0x430,0x42e,0x42c,0x42a,0x428,0x425,0x423,0x421
	.word	0x41f,0x41d,0x41b,0x419,0x417,0x414,0x412,0x410
	.word	0x40e,0x40c,0x40a,0x408,0x406,0x404,0x402,0x400
ASM_END()
