diff --git a/x86/machine.m4 b/x86/machine.m4
index dac44cdd7de65b7304c7d2b3600fc67760e38238..d7bccadebecd61ea1768a409af50f80193359f28 100644
--- a/x86/machine.m4
+++ b/x86/machine.m4
@@ -1,19 +1,3 @@
-dnl AES_LAST_ROUND(a, b, c, d)
-dnl Leaves result in %edi
-dnl Note that we have to quote $ in constants.
-define(<AES_LAST_ROUND>, <
-	movl	%e<>$1<>x,%edi
-	andl	<$>0x000000ff,%edi
-	movl	%e<>$2<>x,%ebp
-	andl	<$>0x0000ff00,%ebp
-	orl	%ebp,%edi
-	movl	%e<>$3<>x,%ebp
-	andl	<$>0x00ff0000,%ebp
-	orl	%ebp,%edi
-	movl	%e<>$4<>x,%ebp
-	andl	<$>0xff000000,%ebp
-	orl	%ebp,%edi>)dnl
-
 dnl AES_LOAD(key, src)
 dnl Loads the next block of data from src, and add the subkey pointed
 dnl to by key.
@@ -45,3 +29,40 @@ define(<AES_STORE>, <
 	movl	%ebx,4($2)
 	movl	%ecx,8($2)
 	movl	%edx,12($2)>)dnl
+
+dnl AES_ROUND(table,a,b,c,d)
+dnl Computes one word of the AES round. Leaves result in %edi.
+define(<AES_ROUND>, <
+	movl	%e<>$2<>x, %esi
+	andl	<$>0xff, %esi
+	shll	<$>2,%esi		C  index in table
+	movl	AES_TABLE0 + $1 (%esi),%edi
+	movl	%e<>$3<>x, %esi
+	shrl	<$>6,%esi
+	andl	<$>0x000003fc,%esi C  clear all but offset bytes
+	xorl	AES_TABLE1 + $1 (%esi),%edi
+	movl	%e<>$4<>x,%esi	C  third one
+	shrl	<$>14,%esi
+	andl	<$>0x000003fc,%esi
+	xorl	AES_TABLE2 + $1 (%esi),%edi
+	movl	%e<>$5<>x,%esi	C  fourth one
+	shrl	<$>22,%esi
+	andl	<$>0x000003fc,%esi
+	xorl	AES_TABLE3 + $1 (%esi),%edi>)dnl
+
+dnl AES_LAST_ROUND(a, b, c, d)
+dnl Computes one word of the final round. Leaves result in %edi.
+dnl Note that we have to quote $ in constants.
+define(<AES_LAST_ROUND>, <
+	movl	%e<>$1<>x,%edi
+	andl	<$>0x000000ff,%edi
+	movl	%e<>$2<>x,%ebp
+	andl	<$>0x0000ff00,%ebp
+	orl	%ebp,%edi
+	movl	%e<>$3<>x,%ebp
+	andl	<$>0x00ff0000,%ebp
+	orl	%ebp,%edi
+	movl	%e<>$4<>x,%ebp
+	andl	<$>0xff000000,%ebp
+	orl	%ebp,%edi>)dnl
+