diff options
author | Huang Ying <ying.huang@intel.com> | 2010-03-13 03:28:42 -0500 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2010-03-13 03:28:42 -0500 |
commit | 32cbd7dfce93382a70f155bf539871b4c55bed29 (patch) | |
tree | 30ae215018df38e5f6b29eec73ad9a00d693ccc9 /arch | |
parent | 18bcc9194da3c97e8f458fb1b06ac5b9b35fb23f (diff) |
crypto: aesni-intel - Fix CTR optimization build failure with gas 2.16.1
Andrew Morton reported that AES-NI CTR optimization failed to compile
with gas 2.16.1, the error message is as follow:
arch/x86/crypto/aesni-intel_asm.S: Assembler messages:
arch/x86/crypto/aesni-intel_asm.S:752: Error: suffix or operands invalid for `movq'
arch/x86/crypto/aesni-intel_asm.S:753: Error: suffix or operands invalid for `movq'
To fix this, a gas macro is defined to assemble movq with 64bit
general purpose registers and XMM registers. The macro will generate
the raw .byte sequence for needed instructions.
Reported-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Huang Ying <ying.huang@intel.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/x86/crypto/aesni-intel_asm.S | 4 | ||||
-rw-r--r-- | arch/x86/include/asm/inst.h | 96 |
2 files changed, 95 insertions, 5 deletions
diff --git a/arch/x86/crypto/aesni-intel_asm.S b/arch/x86/crypto/aesni-intel_asm.S index 822846a9eba9..ff16756a51c1 100644 --- a/arch/x86/crypto/aesni-intel_asm.S +++ b/arch/x86/crypto/aesni-intel_asm.S | |||
@@ -749,8 +749,8 @@ _aesni_inc_init: | |||
749 | movaps IV, CTR | 749 | movaps IV, CTR |
750 | PSHUFB_XMM BSWAP_MASK CTR | 750 | PSHUFB_XMM BSWAP_MASK CTR |
751 | mov $1, TCTR_LOW | 751 | mov $1, TCTR_LOW |
752 | movq TCTR_LOW, INC | 752 | MOVQ_R64_XMM TCTR_LOW INC |
753 | movq CTR, TCTR_LOW | 753 | MOVQ_R64_XMM CTR TCTR_LOW |
754 | ret | 754 | ret |
755 | 755 | ||
756 | /* | 756 | /* |
diff --git a/arch/x86/include/asm/inst.h b/arch/x86/include/asm/inst.h index 14cf526091f9..840a399701b2 100644 --- a/arch/x86/include/asm/inst.h +++ b/arch/x86/include/asm/inst.h | |||
@@ -7,7 +7,66 @@ | |||
7 | 7 | ||
8 | #ifdef __ASSEMBLY__ | 8 | #ifdef __ASSEMBLY__ |
9 | 9 | ||
10 | #define REG_NUM_INVALID 100 | ||
11 | |||
12 | #define REG_TYPE_R64 0 | ||
13 | #define REG_TYPE_XMM 1 | ||
14 | #define REG_TYPE_INVALID 100 | ||
15 | |||
16 | .macro R64_NUM opd r64 | ||
17 | \opd = REG_NUM_INVALID | ||
18 | .ifc \r64,%rax | ||
19 | \opd = 0 | ||
20 | .endif | ||
21 | .ifc \r64,%rcx | ||
22 | \opd = 1 | ||
23 | .endif | ||
24 | .ifc \r64,%rdx | ||
25 | \opd = 2 | ||
26 | .endif | ||
27 | .ifc \r64,%rbx | ||
28 | \opd = 3 | ||
29 | .endif | ||
30 | .ifc \r64,%rsp | ||
31 | \opd = 4 | ||
32 | .endif | ||
33 | .ifc \r64,%rbp | ||
34 | \opd = 5 | ||
35 | .endif | ||
36 | .ifc \r64,%rsi | ||
37 | \opd = 6 | ||
38 | .endif | ||
39 | .ifc \r64,%rdi | ||
40 | \opd = 7 | ||
41 | .endif | ||
42 | .ifc \r64,%r8 | ||
43 | \opd = 8 | ||
44 | .endif | ||
45 | .ifc \r64,%r9 | ||
46 | \opd = 9 | ||
47 | .endif | ||
48 | .ifc \r64,%r10 | ||
49 | \opd = 10 | ||
50 | .endif | ||
51 | .ifc \r64,%r11 | ||
52 | \opd = 11 | ||
53 | .endif | ||
54 | .ifc \r64,%r12 | ||
55 | \opd = 12 | ||
56 | .endif | ||
57 | .ifc \r64,%r13 | ||
58 | \opd = 13 | ||
59 | .endif | ||
60 | .ifc \r64,%r14 | ||
61 | \opd = 14 | ||
62 | .endif | ||
63 | .ifc \r64,%r15 | ||
64 | \opd = 15 | ||
65 | .endif | ||
66 | .endm | ||
67 | |||
10 | .macro XMM_NUM opd xmm | 68 | .macro XMM_NUM opd xmm |
69 | \opd = REG_NUM_INVALID | ||
11 | .ifc \xmm,%xmm0 | 70 | .ifc \xmm,%xmm0 |
12 | \opd = 0 | 71 | \opd = 0 |
13 | .endif | 72 | .endif |
@@ -58,13 +117,25 @@ | |||
58 | .endif | 117 | .endif |
59 | .endm | 118 | .endm |
60 | 119 | ||
120 | .macro REG_TYPE type reg | ||
121 | R64_NUM reg_type_r64 \reg | ||
122 | XMM_NUM reg_type_xmm \reg | ||
123 | .if reg_type_r64 != REG_NUM_INVALID | ||
124 | \type = REG_TYPE_R64 | ||
125 | .elseif reg_type_xmm != REG_NUM_INVALID | ||
126 | \type = REG_TYPE_XMM | ||
127 | .else | ||
128 | \type = REG_TYPE_INVALID | ||
129 | .endif | ||
130 | .endm | ||
131 | |||
61 | .macro PFX_OPD_SIZE | 132 | .macro PFX_OPD_SIZE |
62 | .byte 0x66 | 133 | .byte 0x66 |
63 | .endm | 134 | .endm |
64 | 135 | ||
65 | .macro PFX_REX opd1 opd2 | 136 | .macro PFX_REX opd1 opd2 W=0 |
66 | .if (\opd1 | \opd2) & 8 | 137 | .if ((\opd1 | \opd2) & 8) || \W |
67 | .byte 0x40 | ((\opd1 & 8) >> 3) | ((\opd2 & 8) >> 1) | 138 | .byte 0x40 | ((\opd1 & 8) >> 3) | ((\opd2 & 8) >> 1) | (\W << 3) |
68 | .endif | 139 | .endif |
69 | .endm | 140 | .endm |
70 | 141 | ||
@@ -145,6 +216,25 @@ | |||
145 | .byte 0x0f, 0x38, 0xdf | 216 | .byte 0x0f, 0x38, 0xdf |
146 | MODRM 0xc0 aesdeclast_opd1 aesdeclast_opd2 | 217 | MODRM 0xc0 aesdeclast_opd1 aesdeclast_opd2 |
147 | .endm | 218 | .endm |
219 | |||
220 | .macro MOVQ_R64_XMM opd1 opd2 | ||
221 | REG_TYPE movq_r64_xmm_opd1_type \opd1 | ||
222 | .if movq_r64_xmm_opd1_type == REG_TYPE_XMM | ||
223 | XMM_NUM movq_r64_xmm_opd1 \opd1 | ||
224 | R64_NUM movq_r64_xmm_opd2 \opd2 | ||
225 | .else | ||
226 | R64_NUM movq_r64_xmm_opd1 \opd1 | ||
227 | XMM_NUM movq_r64_xmm_opd2 \opd2 | ||
228 | .endif | ||
229 | PFX_OPD_SIZE | ||
230 | PFX_REX movq_r64_xmm_opd1 movq_r64_xmm_opd2 1 | ||
231 | .if movq_r64_xmm_opd1_type == REG_TYPE_XMM | ||
232 | .byte 0x0f, 0x7e | ||
233 | .else | ||
234 | .byte 0x0f, 0x6e | ||
235 | .endif | ||
236 | MODRM 0xc0 movq_r64_xmm_opd1 movq_r64_xmm_opd2 | ||
237 | .endm | ||
148 | #endif | 238 | #endif |
149 | 239 | ||
150 | #endif | 240 | #endif |