From: David Schleef Date: Thu, 12 Aug 2010 01:22:43 +0000 (-0700) Subject: sse: be more careful about keeping stack aligned X-Git-Tag: orc-0.4.7~24 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=6202cc84a9c78249a58429628be4f48f63e56665;p=platform%2Fupstream%2Forc.git sse: be more careful about keeping stack aligned --- diff --git a/orc/orcrules-sse.c b/orc/orcrules-sse.c index 3c99f1d..f751878 100644 --- a/orc/orcrules-sse.c +++ b/orc/orcrules-sse.c @@ -1065,8 +1065,12 @@ sse_rule_divluw (OrcCompiler *p, void *user, OrcInstruction *insn) /* About 40.7 cycles per array member on ginger. I.e., really slow */ int i; int regsize = p->is_64bit ? 8 : 4; + int stackframe; - orc_x86_emit_add_imm_reg (p, regsize, -32 - 2*regsize, X86_ESP, FALSE); + stackframe = 32 + 2*regsize; + stackframe = (stackframe + 0xf) & (~0xf); + + orc_x86_emit_add_imm_reg (p, regsize, -stackframe, X86_ESP, FALSE); orc_x86_emit_mov_sse_memoffset (p, 16, p->vars[insn->src_args[0]].alloc, 0, X86_ESP, FALSE, FALSE); orc_x86_emit_mov_sse_memoffset (p, 16, p->vars[insn->src_args[1]].alloc, @@ -1110,7 +1114,7 @@ sse_rule_divluw (OrcCompiler *p, void *user, OrcInstruction *insn) orc_x86_emit_mov_memoffset_reg (p, 4, 32, X86_ESP, X86_EAX); orc_x86_emit_mov_memoffset_reg (p, 4, 32 + regsize, X86_ESP, X86_EDX); - orc_x86_emit_add_imm_reg (p, regsize, 32 + 2*regsize, X86_ESP, FALSE); + orc_x86_emit_add_imm_reg (p, regsize, stackframe, X86_ESP, FALSE); } #endif @@ -1251,8 +1255,12 @@ static void sse_rule_mulll_slow (OrcCompiler *p, void *user, OrcInstruction *insn) { int i; + int stackframe; + + stackframe = 32; + stackframe = (stackframe + 0xf) & (~0xf); - orc_x86_emit_add_imm_reg (p, p->is_64bit ? 8 : 4, -32, X86_ESP, + orc_x86_emit_add_imm_reg (p, p->is_64bit ? 8 : 4, -stackframe, X86_ESP, FALSE); orc_x86_emit_mov_sse_memoffset (p, 16, p->vars[insn->src_args[0]].alloc, 0, X86_ESP, FALSE, FALSE); @@ -1268,7 +1276,7 @@ sse_rule_mulll_slow (OrcCompiler *p, void *user, OrcInstruction *insn) orc_x86_emit_mov_memoffset_sse (p, 16, 0, X86_ESP, p->vars[insn->dest_args[0]].alloc, FALSE); - orc_x86_emit_add_imm_reg (p, p->is_64bit ? 8 : 4, 32, X86_ESP, + orc_x86_emit_add_imm_reg (p, p->is_64bit ? 8 : 4, stackframe, X86_ESP, FALSE); } @@ -1277,8 +1285,12 @@ sse_rule_mulhsl_slow (OrcCompiler *p, void *user, OrcInstruction *insn) { int i; int regsize = p->is_64bit ? 8 : 4; + int stackframe; - orc_x86_emit_add_imm_reg (p, regsize, -32 - 2*regsize, X86_ESP, FALSE); + stackframe = 32 + 2*regsize; + stackframe = (stackframe + 0xf) & (~0xf); + + orc_x86_emit_add_imm_reg (p, regsize, -stackframe, X86_ESP, FALSE); orc_x86_emit_mov_sse_memoffset (p, 16, p->vars[insn->src_args[0]].alloc, 0, X86_ESP, FALSE, FALSE); orc_x86_emit_mov_sse_memoffset (p, 16, p->vars[insn->src_args[1]].alloc, @@ -1301,7 +1313,7 @@ sse_rule_mulhsl_slow (OrcCompiler *p, void *user, OrcInstruction *insn) orc_x86_emit_mov_memoffset_reg (p, 4, 32, X86_ESP, X86_EAX); orc_x86_emit_mov_memoffset_reg (p, 4, 32 + regsize, X86_ESP, X86_EDX); - orc_x86_emit_add_imm_reg (p, regsize, 32 + 2*regsize, X86_ESP, FALSE); + orc_x86_emit_add_imm_reg (p, regsize, stackframe, X86_ESP, FALSE); } static void @@ -1309,8 +1321,12 @@ sse_rule_mulhul_slow (OrcCompiler *p, void *user, OrcInstruction *insn) { int i; int regsize = p->is_64bit ? 8 : 4; + int stackframe; + + stackframe = 32 + 2*regsize; + stackframe = (stackframe + 0xf) & (~0xf); - orc_x86_emit_add_imm_reg (p, regsize, -32 - 2*regsize, X86_ESP, FALSE); + orc_x86_emit_add_imm_reg (p, regsize, -stackframe, X86_ESP, FALSE); orc_x86_emit_mov_sse_memoffset (p, 16, p->vars[insn->src_args[0]].alloc, 0, X86_ESP, FALSE, FALSE); orc_x86_emit_mov_sse_memoffset (p, 16, p->vars[insn->src_args[1]].alloc, @@ -1333,7 +1349,7 @@ sse_rule_mulhul_slow (OrcCompiler *p, void *user, OrcInstruction *insn) orc_x86_emit_mov_memoffset_reg (p, 4, 32, X86_ESP, X86_EAX); orc_x86_emit_mov_memoffset_reg (p, 4, 32 + regsize, X86_ESP, X86_EDX); - orc_x86_emit_add_imm_reg (p, regsize, 32 + 2*regsize, X86_ESP, FALSE); + orc_x86_emit_add_imm_reg (p, regsize, stackframe, X86_ESP, FALSE); } static void