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 +