Mercurial > hg > truffle
comparison src/cpu/x86/vm/assembler_x86.cpp @ 6894:a3ecd773a7b9
7184394: add intrinsics to use AES instructions
Summary: Use new x86 AES instructions for AESCrypt.
Reviewed-by: twisti, kvn, roland
Contributed-by: tom.deneau@amd.com
author | kvn |
---|---|
date | Wed, 24 Oct 2012 14:33:22 -0700 |
parents | d804e148cff8 |
children | e522a00b91aa 6ab62ad83507 |
comparison
equal
deleted
inserted
replaced
6893:b2c669fd8114 | 6894:a3ecd773a7b9 |
---|---|
1005 void Assembler::addss(XMMRegister dst, Address src) { | 1005 void Assembler::addss(XMMRegister dst, Address src) { |
1006 NOT_LP64(assert(VM_Version::supports_sse(), "")); | 1006 NOT_LP64(assert(VM_Version::supports_sse(), "")); |
1007 emit_simd_arith(0x58, dst, src, VEX_SIMD_F3); | 1007 emit_simd_arith(0x58, dst, src, VEX_SIMD_F3); |
1008 } | 1008 } |
1009 | 1009 |
1010 void Assembler::aesdec(XMMRegister dst, Address src) { | |
1011 assert(VM_Version::supports_aes(), ""); | |
1012 InstructionMark im(this); | |
1013 simd_prefix(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38); | |
1014 emit_byte(0xde); | |
1015 emit_operand(dst, src); | |
1016 } | |
1017 | |
1018 void Assembler::aesdec(XMMRegister dst, XMMRegister src) { | |
1019 assert(VM_Version::supports_aes(), ""); | |
1020 int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38); | |
1021 emit_byte(0xde); | |
1022 emit_byte(0xC0 | encode); | |
1023 } | |
1024 | |
1025 void Assembler::aesdeclast(XMMRegister dst, Address src) { | |
1026 assert(VM_Version::supports_aes(), ""); | |
1027 InstructionMark im(this); | |
1028 simd_prefix(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38); | |
1029 emit_byte(0xdf); | |
1030 emit_operand(dst, src); | |
1031 } | |
1032 | |
1033 void Assembler::aesdeclast(XMMRegister dst, XMMRegister src) { | |
1034 assert(VM_Version::supports_aes(), ""); | |
1035 int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38); | |
1036 emit_byte(0xdf); | |
1037 emit_byte(0xC0 | encode); | |
1038 } | |
1039 | |
1040 void Assembler::aesenc(XMMRegister dst, Address src) { | |
1041 assert(VM_Version::supports_aes(), ""); | |
1042 InstructionMark im(this); | |
1043 simd_prefix(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38); | |
1044 emit_byte(0xdc); | |
1045 emit_operand(dst, src); | |
1046 } | |
1047 | |
1048 void Assembler::aesenc(XMMRegister dst, XMMRegister src) { | |
1049 assert(VM_Version::supports_aes(), ""); | |
1050 int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38); | |
1051 emit_byte(0xdc); | |
1052 emit_byte(0xC0 | encode); | |
1053 } | |
1054 | |
1055 void Assembler::aesenclast(XMMRegister dst, Address src) { | |
1056 assert(VM_Version::supports_aes(), ""); | |
1057 InstructionMark im(this); | |
1058 simd_prefix(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38); | |
1059 emit_byte(0xdd); | |
1060 emit_operand(dst, src); | |
1061 } | |
1062 | |
1063 void Assembler::aesenclast(XMMRegister dst, XMMRegister src) { | |
1064 assert(VM_Version::supports_aes(), ""); | |
1065 int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38); | |
1066 emit_byte(0xdd); | |
1067 emit_byte(0xC0 | encode); | |
1068 } | |
1069 | |
1070 | |
1010 void Assembler::andl(Address dst, int32_t imm32) { | 1071 void Assembler::andl(Address dst, int32_t imm32) { |
1011 InstructionMark im(this); | 1072 InstructionMark im(this); |
1012 prefix(dst); | 1073 prefix(dst); |
1013 emit_byte(0x81); | 1074 emit_byte(0x81); |
1014 emit_operand(rsp, dst, 4); | 1075 emit_operand(rsp, dst, 4); |
2305 | 2366 |
2306 void Assembler::prefix(Prefix p) { | 2367 void Assembler::prefix(Prefix p) { |
2307 a_byte(p); | 2368 a_byte(p); |
2308 } | 2369 } |
2309 | 2370 |
2371 void Assembler::pshufb(XMMRegister dst, XMMRegister src) { | |
2372 assert(VM_Version::supports_ssse3(), ""); | |
2373 int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38); | |
2374 emit_byte(0x00); | |
2375 emit_byte(0xC0 | encode); | |
2376 } | |
2377 | |
2378 void Assembler::pshufb(XMMRegister dst, Address src) { | |
2379 assert(VM_Version::supports_ssse3(), ""); | |
2380 assert((UseAVX > 0), "SSE mode requires address alignment 16 bytes"); | |
2381 InstructionMark im(this); | |
2382 simd_prefix(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38); | |
2383 emit_byte(0x00); | |
2384 emit_operand(dst, src); | |
2385 } | |
2386 | |
2310 void Assembler::pshufd(XMMRegister dst, XMMRegister src, int mode) { | 2387 void Assembler::pshufd(XMMRegister dst, XMMRegister src, int mode) { |
2311 assert(isByte(mode), "invalid value"); | 2388 assert(isByte(mode), "invalid value"); |
2312 NOT_LP64(assert(VM_Version::supports_sse2(), "")); | 2389 NOT_LP64(assert(VM_Version::supports_sse2(), "")); |
2313 emit_simd_arith_nonds(0x70, dst, src, VEX_SIMD_66); | 2390 emit_simd_arith_nonds(0x70, dst, src, VEX_SIMD_66); |
2314 emit_byte(mode & 0xFF); | 2391 emit_byte(mode & 0xFF); |
8065 | 8142 |
8066 void MacroAssembler::movptr(Address dst, Register src) { | 8143 void MacroAssembler::movptr(Address dst, Register src) { |
8067 LP64_ONLY(movq(dst, src)) NOT_LP64(movl(dst, src)); | 8144 LP64_ONLY(movq(dst, src)) NOT_LP64(movl(dst, src)); |
8068 } | 8145 } |
8069 | 8146 |
8147 void MacroAssembler::movdqu(XMMRegister dst, AddressLiteral src) { | |
8148 if (reachable(src)) { | |
8149 Assembler::movdqu(dst, as_Address(src)); | |
8150 } else { | |
8151 lea(rscratch1, src); | |
8152 Assembler::movdqu(dst, Address(rscratch1, 0)); | |
8153 } | |
8154 } | |
8155 | |
8070 void MacroAssembler::movsd(XMMRegister dst, AddressLiteral src) { | 8156 void MacroAssembler::movsd(XMMRegister dst, AddressLiteral src) { |
8071 if (reachable(src)) { | 8157 if (reachable(src)) { |
8072 Assembler::movsd(dst, as_Address(src)); | 8158 Assembler::movsd(dst, as_Address(src)); |
8073 } else { | 8159 } else { |
8074 lea(rscratch1, src); | 8160 lea(rscratch1, src); |
8352 if (reachable(src)) { | 8438 if (reachable(src)) { |
8353 Assembler::xorps(dst, as_Address(src)); | 8439 Assembler::xorps(dst, as_Address(src)); |
8354 } else { | 8440 } else { |
8355 lea(rscratch1, src); | 8441 lea(rscratch1, src); |
8356 Assembler::xorps(dst, Address(rscratch1, 0)); | 8442 Assembler::xorps(dst, Address(rscratch1, 0)); |
8443 } | |
8444 } | |
8445 | |
8446 void MacroAssembler::pshufb(XMMRegister dst, AddressLiteral src) { | |
8447 // Used in sign-bit flipping with aligned address. | |
8448 assert((UseAVX > 0) || (((intptr_t)src.target() & 15) == 0), "SSE mode requires address alignment 16 bytes"); | |
8449 if (reachable(src)) { | |
8450 Assembler::pshufb(dst, as_Address(src)); | |
8451 } else { | |
8452 lea(rscratch1, src); | |
8453 Assembler::pshufb(dst, Address(rscratch1, 0)); | |
8357 } | 8454 } |
8358 } | 8455 } |
8359 | 8456 |
8360 // AVX 3-operands instructions | 8457 // AVX 3-operands instructions |
8361 | 8458 |