comparison src/cpu/x86/vm/macroAssembler_x86.hpp @ 11080:b800986664f4

7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32 Summary: add intrinsics using new instruction to interpreter, C1, C2, for suitable x86; add test Reviewed-by: kvn, twisti
author drchase
date Tue, 02 Jul 2013 20:42:12 -0400
parents e961c11b85fe
children 740e263c80c6
comparison
equal deleted inserted replaced
11079:738e04fb1232 11080:b800986664f4
1 /* 1 /*
2 * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. 2 * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 * 4 *
5 * This code is free software; you can redistribute it and/or modify it 5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as 6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. 7 * published by the Free Software Foundation.
897 void movdqu(Address dst, XMMRegister src) { Assembler::movdqu(dst, src); } 897 void movdqu(Address dst, XMMRegister src) { Assembler::movdqu(dst, src); }
898 void movdqu(XMMRegister dst, Address src) { Assembler::movdqu(dst, src); } 898 void movdqu(XMMRegister dst, Address src) { Assembler::movdqu(dst, src); }
899 void movdqu(XMMRegister dst, XMMRegister src) { Assembler::movdqu(dst, src); } 899 void movdqu(XMMRegister dst, XMMRegister src) { Assembler::movdqu(dst, src); }
900 void movdqu(XMMRegister dst, AddressLiteral src); 900 void movdqu(XMMRegister dst, AddressLiteral src);
901 901
902 // Move Aligned Double Quadword
903 void movdqa(XMMRegister dst, Address src) { Assembler::movdqa(dst, src); }
904 void movdqa(XMMRegister dst, XMMRegister src) { Assembler::movdqa(dst, src); }
905 void movdqa(XMMRegister dst, AddressLiteral src);
906
902 void movsd(XMMRegister dst, XMMRegister src) { Assembler::movsd(dst, src); } 907 void movsd(XMMRegister dst, XMMRegister src) { Assembler::movsd(dst, src); }
903 void movsd(Address dst, XMMRegister src) { Assembler::movsd(dst, src); } 908 void movsd(Address dst, XMMRegister src) { Assembler::movsd(dst, src); }
904 void movsd(XMMRegister dst, Address src) { Assembler::movsd(dst, src); } 909 void movsd(XMMRegister dst, Address src) { Assembler::movsd(dst, src); }
905 void movsd(XMMRegister dst, AddressLiteral src); 910 void movsd(XMMRegister dst, AddressLiteral src);
906 911
1025 Assembler::vinserti128h(dst, nds, src); 1030 Assembler::vinserti128h(dst, nds, src);
1026 else 1031 else
1027 Assembler::vinsertf128h(dst, nds, src); 1032 Assembler::vinsertf128h(dst, nds, src);
1028 } 1033 }
1029 1034
1035 // Carry-Less Multiplication Quadword
1036 void vpclmulldq(XMMRegister dst, XMMRegister nds, XMMRegister src) {
1037 // 0x00 - multiply lower 64 bits [0:63]
1038 Assembler::vpclmulqdq(dst, nds, src, 0x00);
1039 }
1040 void vpclmulhdq(XMMRegister dst, XMMRegister nds, XMMRegister src) {
1041 // 0x11 - multiply upper 64 bits [64:127]
1042 Assembler::vpclmulqdq(dst, nds, src, 0x11);
1043 }
1044
1030 // Data 1045 // Data
1031 1046
1032 void cmov32( Condition cc, Register dst, Address src); 1047 void cmov32( Condition cc, Register dst, Address src);
1033 void cmov32( Condition cc, Register dst, Register src); 1048 void cmov32( Condition cc, Register dst, Register src);
1034 1049
1140 Register rtmp, XMMRegister xtmp); 1155 Register rtmp, XMMRegister xtmp);
1141 1156
1142 void encode_iso_array(Register src, Register dst, Register len, 1157 void encode_iso_array(Register src, Register dst, Register len,
1143 XMMRegister tmp1, XMMRegister tmp2, XMMRegister tmp3, 1158 XMMRegister tmp1, XMMRegister tmp2, XMMRegister tmp3,
1144 XMMRegister tmp4, Register tmp5, Register result); 1159 XMMRegister tmp4, Register tmp5, Register result);
1160
1161 // CRC32 code for java.util.zip.CRC32::updateBytes() instrinsic.
1162 void update_byte_crc32(Register crc, Register val, Register table);
1163 void kernel_crc32(Register crc, Register buf, Register len, Register table, Register tmp);
1164 // Fold 128-bit data chunk
1165 void fold_128bit_crc32(XMMRegister xcrc, XMMRegister xK, XMMRegister xtmp, Register buf, int offset);
1166 void fold_128bit_crc32(XMMRegister xcrc, XMMRegister xK, XMMRegister xtmp, XMMRegister xbuf);
1167 // Fold 8-bit data
1168 void fold_8bit_crc32(Register crc, Register table, Register tmp);
1169 void fold_8bit_crc32(XMMRegister crc, Register table, XMMRegister xtmp, Register tmp);
1145 1170
1146 #undef VIRTUAL 1171 #undef VIRTUAL
1147 1172
1148 }; 1173 };
1149 1174