Mercurial > hg > graal-jvmci-8
comparison src/cpu/x86/vm/x86_64.ad @ 3783:de6a837d75cf
7056380: VM crashes with SIGSEGV in compiled code
Summary: code was using andq reg, imm instead of addq addr, imm
Reviewed-by: kvn, jrose, twisti
author | never |
---|---|
date | Tue, 21 Jun 2011 09:04:55 -0700 |
parents | c7c81f18c834 |
children | 3d42f82cd811 |
comparison
equal
deleted
inserted
replaced
3782:aacaff365100 | 3783:de6a837d75cf |
---|---|
826 } else { | 826 } else { |
827 MacroAssembler _masm(&cbuf); | 827 MacroAssembler _masm(&cbuf); |
828 | 828 |
829 __ movdqa(as_XMMRegister(dst_encoding), as_XMMRegister(src_encoding)); | 829 __ movdqa(as_XMMRegister(dst_encoding), as_XMMRegister(src_encoding)); |
830 } | 830 } |
831 } | |
832 | |
833 // This could be in MacroAssembler but it's fairly C2 specific | |
834 void emit_cmpfp_fixup(MacroAssembler& _masm) { | |
835 Label exit; | |
836 __ jccb(Assembler::noParity, exit); | |
837 __ pushf(); | |
838 __ andq(Address(rsp, 0), 0xffffff2b); | |
839 __ popf(); | |
840 __ bind(exit); | |
841 __ nop(); // (target for branch to avoid branch to branch) | |
831 } | 842 } |
832 | 843 |
833 | 844 |
834 //============================================================================= | 845 //============================================================================= |
835 const bool Matcher::constant_table_absolute_addressing = true; | 846 const bool Matcher::constant_table_absolute_addressing = true; |
2171 %{ | 2182 %{ |
2172 emit_opcode(cbuf, $opcode$$constant); | 2183 emit_opcode(cbuf, $opcode$$constant); |
2173 emit_rm(cbuf, 0x3, $dst$$reg & 7, $src$$reg & 7); | 2184 emit_rm(cbuf, 0x3, $dst$$reg & 7, $src$$reg & 7); |
2174 %} | 2185 %} |
2175 | 2186 |
2176 enc_class cmpfp_fixup() | 2187 enc_class cmpfp_fixup() %{ |
2177 %{ | 2188 MacroAssembler _masm(&cbuf); |
2178 // jnp,s exit | 2189 emit_cmpfp_fixup(_masm); |
2179 emit_opcode(cbuf, 0x7B); | |
2180 emit_d8(cbuf, 0x0A); | |
2181 | |
2182 // pushfq | |
2183 emit_opcode(cbuf, 0x9C); | |
2184 | |
2185 // andq $0xffffff2b, (%rsp) | |
2186 emit_opcode(cbuf, Assembler::REX_W); | |
2187 emit_opcode(cbuf, 0x81); | |
2188 emit_opcode(cbuf, 0x24); | |
2189 emit_opcode(cbuf, 0x24); | |
2190 emit_d32(cbuf, 0xffffff2b); | |
2191 | |
2192 // popfq | |
2193 emit_opcode(cbuf, 0x9D); | |
2194 | |
2195 // nop (target for branch to avoid branch to branch) | |
2196 emit_opcode(cbuf, 0x90); | |
2197 %} | 2190 %} |
2198 | 2191 |
2199 enc_class cmpfp3(rRegI dst) | 2192 enc_class cmpfp3(rRegI dst) |
2200 %{ | 2193 %{ |
2201 int dstenc = $dst$$reg; | 2194 int dstenc = $dst$$reg; |
10251 "pushfq\t# saw NaN, set CF\n\t" | 10244 "pushfq\t# saw NaN, set CF\n\t" |
10252 "andq [rsp], #0xffffff2b\n\t" | 10245 "andq [rsp], #0xffffff2b\n\t" |
10253 "popfq\n" | 10246 "popfq\n" |
10254 "exit: nop\t# avoid branch to branch" %} | 10247 "exit: nop\t# avoid branch to branch" %} |
10255 ins_encode %{ | 10248 ins_encode %{ |
10256 Label L_exit; | |
10257 __ ucomiss($src$$XMMRegister, $constantaddress($con)); | 10249 __ ucomiss($src$$XMMRegister, $constantaddress($con)); |
10258 __ jcc(Assembler::noParity, L_exit); | 10250 emit_cmpfp_fixup(_masm); |
10259 __ pushf(); | |
10260 __ andq(rsp, 0xffffff2b); | |
10261 __ popf(); | |
10262 __ bind(L_exit); | |
10263 __ nop(); | |
10264 %} | 10251 %} |
10265 ins_pipe(pipe_slow); | 10252 ins_pipe(pipe_slow); |
10266 %} | 10253 %} |
10267 | 10254 |
10268 instruct cmpF_cc_immCF(rFlagsRegUCF cr, regF src, immF con) %{ | 10255 instruct cmpF_cc_immCF(rFlagsRegUCF cr, regF src, immF con) %{ |
10339 "pushfq\t# saw NaN, set CF\n\t" | 10326 "pushfq\t# saw NaN, set CF\n\t" |
10340 "andq [rsp], #0xffffff2b\n\t" | 10327 "andq [rsp], #0xffffff2b\n\t" |
10341 "popfq\n" | 10328 "popfq\n" |
10342 "exit: nop\t# avoid branch to branch" %} | 10329 "exit: nop\t# avoid branch to branch" %} |
10343 ins_encode %{ | 10330 ins_encode %{ |
10344 Label L_exit; | |
10345 __ ucomisd($src$$XMMRegister, $constantaddress($con)); | 10331 __ ucomisd($src$$XMMRegister, $constantaddress($con)); |
10346 __ jcc(Assembler::noParity, L_exit); | 10332 emit_cmpfp_fixup(_masm); |
10347 __ pushf(); | |
10348 __ andq(rsp, 0xffffff2b); | |
10349 __ popf(); | |
10350 __ bind(L_exit); | |
10351 __ nop(); | |
10352 %} | 10333 %} |
10353 ins_pipe(pipe_slow); | 10334 ins_pipe(pipe_slow); |
10354 %} | 10335 %} |
10355 | 10336 |
10356 instruct cmpD_cc_immCF(rFlagsRegUCF cr, regD src, immD con) %{ | 10337 instruct cmpD_cc_immCF(rFlagsRegUCF cr, regD src, immD con) %{ |