diff options
| -rw-r--r-- | arch/x86/crypto/crc32-pclmul_asm.S | 2 | ||||
| -rw-r--r-- | arch/x86/include/asm/inst.h | 74 |
2 files changed, 73 insertions, 3 deletions
diff --git a/arch/x86/crypto/crc32-pclmul_asm.S b/arch/x86/crypto/crc32-pclmul_asm.S index 94c27df8a549..f247304299a2 100644 --- a/arch/x86/crypto/crc32-pclmul_asm.S +++ b/arch/x86/crypto/crc32-pclmul_asm.S | |||
| @@ -240,7 +240,7 @@ fold_64: | |||
| 240 | pand %xmm3, %xmm1 | 240 | pand %xmm3, %xmm1 |
| 241 | PCLMULQDQ 0x00, CONSTANT, %xmm1 | 241 | PCLMULQDQ 0x00, CONSTANT, %xmm1 |
| 242 | pxor %xmm2, %xmm1 | 242 | pxor %xmm2, %xmm1 |
| 243 | pextrd $0x01, %xmm1, %eax | 243 | PEXTRD 0x01, %xmm1, %eax |
| 244 | 244 | ||
| 245 | ret | 245 | ret |
| 246 | ENDPROC(crc32_pclmul_le_16) | 246 | ENDPROC(crc32_pclmul_le_16) |
diff --git a/arch/x86/include/asm/inst.h b/arch/x86/include/asm/inst.h index 280bf7fb6aba..3e115273ed88 100644 --- a/arch/x86/include/asm/inst.h +++ b/arch/x86/include/asm/inst.h | |||
| @@ -9,12 +9,68 @@ | |||
| 9 | 9 | ||
| 10 | #define REG_NUM_INVALID 100 | 10 | #define REG_NUM_INVALID 100 |
| 11 | 11 | ||
| 12 | #define REG_TYPE_R64 0 | 12 | #define REG_TYPE_R32 0 |
| 13 | #define REG_TYPE_XMM 1 | 13 | #define REG_TYPE_R64 1 |
| 14 | #define REG_TYPE_XMM 2 | ||
| 14 | #define REG_TYPE_INVALID 100 | 15 | #define REG_TYPE_INVALID 100 |
| 15 | 16 | ||
| 17 | .macro R32_NUM opd r32 | ||
| 18 | \opd = REG_NUM_INVALID | ||
| 19 | .ifc \r32,%eax | ||
| 20 | \opd = 0 | ||
| 21 | .endif | ||
| 22 | .ifc \r32,%ecx | ||
| 23 | \opd = 1 | ||
| 24 | .endif | ||
| 25 | .ifc \r32,%edx | ||
| 26 | \opd = 2 | ||
| 27 | .endif | ||
| 28 | .ifc \r32,%ebx | ||
| 29 | \opd = 3 | ||
| 30 | .endif | ||
| 31 | .ifc \r32,%esp | ||
| 32 | \opd = 4 | ||
| 33 | .endif | ||
| 34 | .ifc \r32,%ebp | ||
| 35 | \opd = 5 | ||
| 36 | .endif | ||
| 37 | .ifc \r32,%esi | ||
| 38 | \opd = 6 | ||
| 39 | .endif | ||
| 40 | .ifc \r32,%edi | ||
| 41 | \opd = 7 | ||
| 42 | .endif | ||
| 43 | #ifdef CONFIG_X86_64 | ||
| 44 | .ifc \r32,%r8d | ||
| 45 | \opd = 8 | ||
| 46 | .endif | ||
| 47 | .ifc \r32,%r9d | ||
| 48 | \opd = 9 | ||
| 49 | .endif | ||
| 50 | .ifc \r32,%r10d | ||
| 51 | \opd = 10 | ||
| 52 | .endif | ||
| 53 | .ifc \r32,%r11d | ||
| 54 | \opd = 11 | ||
| 55 | .endif | ||
| 56 | .ifc \r32,%r12d | ||
| 57 | \opd = 12 | ||
| 58 | .endif | ||
| 59 | .ifc \r32,%r13d | ||
| 60 | \opd = 13 | ||
| 61 | .endif | ||
| 62 | .ifc \r32,%r14d | ||
| 63 | \opd = 14 | ||
| 64 | .endif | ||
| 65 | .ifc \r32,%r15d | ||
| 66 | \opd = 15 | ||
| 67 | .endif | ||
| 68 | #endif | ||
| 69 | .endm | ||
| 70 | |||
| 16 | .macro R64_NUM opd r64 | 71 | .macro R64_NUM opd r64 |
| 17 | \opd = REG_NUM_INVALID | 72 | \opd = REG_NUM_INVALID |
| 73 | #ifdef CONFIG_X86_64 | ||
| 18 | .ifc \r64,%rax | 74 | .ifc \r64,%rax |
| 19 | \opd = 0 | 75 | \opd = 0 |
| 20 | .endif | 76 | .endif |
| @@ -63,6 +119,7 @@ | |||
| 63 | .ifc \r64,%r15 | 119 | .ifc \r64,%r15 |
| 64 | \opd = 15 | 120 | \opd = 15 |
| 65 | .endif | 121 | .endif |
| 122 | #endif | ||
| 66 | .endm | 123 | .endm |
| 67 | 124 | ||
| 68 | .macro XMM_NUM opd xmm | 125 | .macro XMM_NUM opd xmm |
| @@ -118,10 +175,13 @@ | |||
| 118 | .endm | 175 | .endm |
| 119 | 176 | ||
| 120 | .macro REG_TYPE type reg | 177 | .macro REG_TYPE type reg |
| 178 | R32_NUM reg_type_r32 \reg | ||
| 121 | R64_NUM reg_type_r64 \reg | 179 | R64_NUM reg_type_r64 \reg |
| 122 | XMM_NUM reg_type_xmm \reg | 180 | XMM_NUM reg_type_xmm \reg |
| 123 | .if reg_type_r64 <> REG_NUM_INVALID | 181 | .if reg_type_r64 <> REG_NUM_INVALID |
| 124 | \type = REG_TYPE_R64 | 182 | \type = REG_TYPE_R64 |
| 183 | .elseif reg_type_r32 <> REG_NUM_INVALID | ||
| 184 | \type = REG_TYPE_R32 | ||
| 125 | .elseif reg_type_xmm <> REG_NUM_INVALID | 185 | .elseif reg_type_xmm <> REG_NUM_INVALID |
| 126 | \type = REG_TYPE_XMM | 186 | \type = REG_TYPE_XMM |
| 127 | .else | 187 | .else |
| @@ -162,6 +222,16 @@ | |||
| 162 | .byte \imm8 | 222 | .byte \imm8 |
| 163 | .endm | 223 | .endm |
| 164 | 224 | ||
| 225 | .macro PEXTRD imm8 xmm gpr | ||
| 226 | R32_NUM extrd_opd1 \gpr | ||
| 227 | XMM_NUM extrd_opd2 \xmm | ||
| 228 | PFX_OPD_SIZE | ||
| 229 | PFX_REX extrd_opd1 extrd_opd2 | ||
| 230 | .byte 0x0f, 0x3a, 0x16 | ||
| 231 | MODRM 0xc0 extrd_opd1 extrd_opd2 | ||
| 232 | .byte \imm8 | ||
| 233 | .endm | ||
| 234 | |||
| 165 | .macro AESKEYGENASSIST rcon xmm1 xmm2 | 235 | .macro AESKEYGENASSIST rcon xmm1 xmm2 |
| 166 | XMM_NUM aeskeygen_opd1 \xmm1 | 236 | XMM_NUM aeskeygen_opd1 \xmm1 |
| 167 | XMM_NUM aeskeygen_opd2 \xmm2 | 237 | XMM_NUM aeskeygen_opd2 \xmm2 |
