@@ -966,6 +966,73 @@ sub _aes_gcm_update {
966
966
$code .= _aes_gcm_update 0;
967
967
$code .= _end_func;
968
968
969
- print $code ;
969
+ sub filter_and_print {
970
+ # This function replaces AVX2 assembly instructions with their assembled forms,
971
+ # to allow the code to work on old versions of binutils (older than 2.30) that do
972
+ # not support these instructions.
973
+ my %asmMap = (
974
+ ' vaesenc %ymm2, %ymm12, %ymm12' => ' .byte 0xc4,0x62,0x1d,0xdc,0xe2' ,
975
+ ' vaesenc %ymm2, %ymm13, %ymm13' => ' .byte 0xc4,0x62,0x15,0xdc,0xea' ,
976
+ ' vaesenc %ymm2, %ymm14, %ymm14' => ' .byte 0xc4,0x62,0x0d,0xdc,0xf2' ,
977
+ ' vaesenc %ymm2, %ymm15, %ymm15' => ' .byte 0xc4,0x62,0x05,0xdc,0xfa' ,
978
+ ' vaesenclast %ymm10, %ymm12, %ymm12' => ' .byte 0xc4,0x42,0x1d,0xdd,0xe2' ,
979
+ ' vaesenclast %ymm10, %ymm13, %ymm13' => ' .byte 0xc4,0x42,0x15,0xdd,0xea' ,
980
+ ' vaesenclast %ymm2, %ymm12, %ymm12' => ' .byte 0xc4,0x62,0x1d,0xdd,0xe2' ,
981
+ ' vaesenclast %ymm3, %ymm13, %ymm13' => ' .byte 0xc4,0x62,0x15,0xdd,0xeb' ,
982
+ ' vaesenclast %ymm5, %ymm14, %ymm14' => ' .byte 0xc4,0x62,0x0d,0xdd,0xf5' ,
983
+ ' vaesenclast %ymm6, %ymm15, %ymm15' => ' .byte 0xc4,0x62,0x05,0xdd,0xfe' ,
984
+ ' vpclmulqdq $0x00, %ymm2, %ymm12, %ymm4' => ' .byte 0xc4,0xe3,0x1d,0x44,0xe2,0x00' ,
985
+ ' vpclmulqdq $0x00, %ymm2, %ymm12, %ymm5' => ' .byte 0xc4,0xe3,0x1d,0x44,0xea,0x00' ,
986
+ ' vpclmulqdq $0x00, %ymm3, %ymm13, %ymm4' => ' .byte 0xc4,0xe3,0x15,0x44,0xe3,0x00' ,
987
+ ' vpclmulqdq $0x00, %ymm4, %ymm3, %ymm2' => ' .byte 0xc4,0xe3,0x65,0x44,0xd4,0x00' ,
988
+ ' vpclmulqdq $0x00, %ymm4, %ymm3, %ymm5' => ' .byte 0xc4,0xe3,0x65,0x44,0xec,0x00' ,
989
+ ' vpclmulqdq $0x00, %ymm5, %ymm3, %ymm0' => ' .byte 0xc4,0xe3,0x65,0x44,0xc5,0x00' ,
990
+ ' vpclmulqdq $0x00, %ymm5, %ymm4, %ymm0' => ' .byte 0xc4,0xe3,0x5d,0x44,0xc5,0x00' ,
991
+ ' vpclmulqdq $0x00, %ymm7, %ymm2, %ymm6' => ' .byte 0xc4,0xe3,0x6d,0x44,0xf7,0x00' ,
992
+ ' vpclmulqdq $0x00, %ymm8, %ymm2, %ymm2' => ' .byte 0xc4,0xc3,0x6d,0x44,0xd0,0x00' ,
993
+ ' vpclmulqdq $0x01, %ymm0, %ymm6, %ymm2' => ' .byte 0xc4,0xe3,0x4d,0x44,0xd0,0x01' ,
994
+ ' vpclmulqdq $0x01, %ymm1, %ymm6, %ymm0' => ' .byte 0xc4,0xe3,0x4d,0x44,0xc1,0x01' ,
995
+ ' vpclmulqdq $0x01, %ymm2, %ymm12, %ymm4' => ' .byte 0xc4,0xe3,0x1d,0x44,0xe2,0x01' ,
996
+ ' vpclmulqdq $0x01, %ymm2, %ymm12, %ymm6' => ' .byte 0xc4,0xe3,0x1d,0x44,0xf2,0x01' ,
997
+ ' vpclmulqdq $0x01, %ymm3, %ymm13, %ymm4' => ' .byte 0xc4,0xe3,0x15,0x44,0xe3,0x01' ,
998
+ ' vpclmulqdq $0x01, %ymm5, %ymm2, %ymm3' => ' .byte 0xc4,0xe3,0x6d,0x44,0xdd,0x01' ,
999
+ ' vpclmulqdq $0x01, %ymm5, %ymm3, %ymm1' => ' .byte 0xc4,0xe3,0x65,0x44,0xcd,0x01' ,
1000
+ ' vpclmulqdq $0x01, %ymm5, %ymm4, %ymm1' => ' .byte 0xc4,0xe3,0x5d,0x44,0xcd,0x01' ,
1001
+ ' vpclmulqdq $0x01, %ymm5, %ymm4, %ymm2' => ' .byte 0xc4,0xe3,0x5d,0x44,0xd5,0x01' ,
1002
+ ' vpclmulqdq $0x01, %ymm6, %ymm2, %ymm3' => ' .byte 0xc4,0xe3,0x6d,0x44,0xde,0x01' ,
1003
+ ' vpclmulqdq $0x01, %ymm6, %ymm4, %ymm2' => ' .byte 0xc4,0xe3,0x5d,0x44,0xd6,0x01' ,
1004
+ ' vpclmulqdq $0x10, %ymm2, %ymm12, %ymm4' => ' .byte 0xc4,0xe3,0x1d,0x44,0xe2,0x10' ,
1005
+ ' vpclmulqdq $0x10, %ymm3, %ymm13, %ymm4' => ' .byte 0xc4,0xe3,0x15,0x44,0xe3,0x10' ,
1006
+ ' vpclmulqdq $0x10, %ymm5, %ymm3, %ymm2' => ' .byte 0xc4,0xe3,0x65,0x44,0xd5,0x10' ,
1007
+ ' vpclmulqdq $0x10, %ymm5, %ymm4, %ymm2' => ' .byte 0xc4,0xe3,0x5d,0x44,0xd5,0x10' ,
1008
+ ' vpclmulqdq $0x10, %ymm7, %ymm2, %ymm2' => ' .byte 0xc4,0xe3,0x6d,0x44,0xd7,0x10' ,
1009
+ ' vpclmulqdq $0x10, %ymm8, %ymm2, %ymm2' => ' .byte 0xc4,0xc3,0x6d,0x44,0xd0,0x10' ,
1010
+ ' vpclmulqdq $0x11, %ymm2, %ymm12, %ymm4' => ' .byte 0xc4,0xe3,0x1d,0x44,0xe2,0x11' ,
1011
+ ' vpclmulqdq $0x11, %ymm2, %ymm12, %ymm7' => ' .byte 0xc4,0xe3,0x1d,0x44,0xfa,0x11' ,
1012
+ ' vpclmulqdq $0x11, %ymm3, %ymm13, %ymm4' => ' .byte 0xc4,0xe3,0x15,0x44,0xe3,0x11' ,
1013
+ ' vpclmulqdq $0x11, %ymm4, %ymm3, %ymm1' => ' .byte 0xc4,0xe3,0x65,0x44,0xcc,0x11' ,
1014
+ ' vpclmulqdq $0x11, %ymm4, %ymm3, %ymm2' => ' .byte 0xc4,0xe3,0x65,0x44,0xd4,0x11' ,
1015
+ ' vpclmulqdq $0x11, %ymm5, %ymm3, %ymm4' => ' .byte 0xc4,0xe3,0x65,0x44,0xe5,0x11' ,
1016
+ ' vpclmulqdq $0x11, %ymm5, %ymm4, %ymm3' => ' .byte 0xc4,0xe3,0x5d,0x44,0xdd,0x11' ,
1017
+ );
1018
+ for my $line (split (" \n " ,$code )) {
1019
+ my $trimmed ;
1020
+ $trimmed = $line ;
1021
+ $trimmed =~ s / ^\s +// ;
1022
+ $trimmed =~ s /\s +(#.*)?$// ;
1023
+ if (exists $asmMap {$trimmed }) {
1024
+ $line = $asmMap {$trimmed };
1025
+ } else {
1026
+ if ($trimmed =~ / (vpclmulqdq|vaes).*%[yz]mm/ ) {
1027
+ die (" found instruction not supported under old binutils, please update asmMap with the results of running\n " .
1028
+ ' find target -name "*aes-gcm-avx2*.o" -exec python3 crypto/fipsmodule/aes/asm/make-avx-map-for-old-binutils.py \{\} \; | LC_ALL=C sort | uniq' );
1029
+ }
1030
+ }
1031
+ print $line ," \n " ;
1032
+ }
1033
+ }
1034
+
1035
+ filter_and_print();
1036
+
970
1037
close STDOUT or die " error closing STDOUT: $! " ;
971
1038
exit 0;
0 commit comments