semolina 0.1.4

Optimized field arithmetic for Pasta moduli for x86-64 and aarch64
Documentation
	AREA	|.text|,CODE,ALIGN=8,ARM64



	EXPORT	|pasta_add|[FUNC]
	ALIGN	32
|pasta_add| PROC
	ldp	x8,x9,[x1]
	ldp	x12,x13,[x2]

	ldp	x10,x11,[x1,#16]
	adds	x8,x8,x12
	ldp	x14,x15,[x2,#16]
	adcs	x9,x9,x13
	ldp	x4,x5,[x3]
	adcs	x10,x10,x14
	ldp	x6,x7,[x3,#16]
	adcs	x11,x11,x15
	adc	x3,xzr,xzr

	subs	x16,x8,x4
	sbcs	x17,x9,x5
	sbcs	x1,x10,x6
	sbcs	x2,x11,x7
	sbcs	xzr,x3,xzr

	csello	x8,x8,x16
	csello	x9,x9,x17
	csello	x10,x10,x1
	stp	x8,x9,[x0]
	csello	x11,x11,x2
	stp	x10,x11,[x0,#16]

	ret
	ENDP



	EXPORT	|pasta_cneg|[FUNC]
	ALIGN	32
|pasta_cneg| PROC
	ldp	x8,x9,[x1]
	ldp	x4,x5,[x3]

	ldp	x10,x11,[x1,#16]
	subs	x12,x4,x8
	ldp	x6,x7,[x3,#16]
	orr	x4,x8,x9
	sbcs	x13,x5,x9
	orr	x5,x10,x11
	sbcs	x14,x6,x10
	orr	x3,x4,x5
	sbc	x15,x7,x11

	cmp	x3,#0
	csetmne	x3
	ands	x2,x2,x3

	cseleq	x8,x8,x12
	cseleq	x9,x9,x13
	cseleq	x10,x10,x14
	stp	x8,x9,[x0]
	cseleq	x11,x11,x15
	stp	x10,x11,[x0,#16]

	ret
	ENDP



	EXPORT	|pasta_sub|[FUNC]
	ALIGN	32
|pasta_sub| PROC
	ldp	x8,x9,[x1]
	ldp	x12,x13,[x2]

	ldp	x10,x11,[x1,#16]
	subs	x8,x8,x12
	ldp	x14,x15,[x2,#16]
	sbcs	x9,x9,x13
	ldp	x4,x5,[x3]
	sbcs	x10,x10,x14
	ldp	x6,x7,[x3,#16]
	sbcs	x11,x11,x15
	sbc	x3,xzr,xzr

	and	x4,x4,x3
	and	x5,x5,x3
	adds	x8,x8,x4
	and	x6,x6,x3
	adcs	x9,x9,x5
	and	x7,x7,x3
	adcs	x10,x10,x6
	stp	x8,x9,[x0]
	adc	x11,x11,x7
	stp	x10,x11,[x0,#16]

	ret
	ENDP



	EXPORT	|pasta_lshift|[FUNC]
	ALIGN	32
|pasta_lshift| PROC
	ldp	x8,x9,[x1]
	ldp	x10,x11,[x1,#16]

	ldp	x4,x5,[x3]
	ldp	x6,x7,[x3,#16]

|$Loop_lshift_mod_256|
	adds	x8,x8,x8
	sub	x2,x2,#1
	adcs	x9,x9,x9
	adcs	x10,x10,x10
	adcs	x11,x11,x11
	adc	x3,xzr,xzr

	subs	x12,x8,x4
	sbcs	x13,x9,x5
	sbcs	x14,x10,x6
	sbcs	x15,x11,x7
	sbcs	xzr,x3,xzr

	csello	x8,x8,x12
	csello	x9,x9,x13
	csello	x10,x10,x14
	csello	x11,x11,x15

	cbnz	x2,|$Loop_lshift_mod_256|

	stp	x8,x9,[x0]
	stp	x10,x11,[x0,#16]

	ret
	ENDP



	EXPORT	|pasta_rshift|[FUNC]
	ALIGN	32
|pasta_rshift| PROC
	ldp	x8,x9,[x1]
	ldp	x10,x11,[x1,#16]

	ldp	x4,x5,[x3]
	ldp	x6,x7,[x3,#16]

|$Loop_rshift|
	adds	x12,x8,x4
	sub	x2,x2,#1
	adcs	x13,x9,x5
	adcs	x14,x10,x6
	adcs	x15,x11,x7
	adc	x3,xzr,xzr
	tst	x8,#1

	cselne	x12,x12,x8
	cselne	x13,x13,x9
	cselne	x14,x14,x10
	cselne	x15,x15,x11
	cselne	x3,x3,xzr

	extr	x8,x13,x12,#1
	extr	x9,x14,x13,#1
	extr	x10,x15,x14,#1
	extr	x11,x3,x15,#1

	cbnz	x2,|$Loop_rshift|

	stp	x8,x9,[x0]
	stp	x10,x11,[x0,#16]

	ret
	ENDP
	END