Mercurial > hg > truffle
comparison src/cpu/x86/vm/x86_32.ad @ 643:c771b7f43bbf
6378821: bitCount() should use POPC on SPARC processors and AMD+10h
Summary: bitCount() should use POPC on SPARC processors where POPC is implemented directly in hardware.
Reviewed-by: kvn, never
author | twisti |
---|---|
date | Fri, 13 Mar 2009 11:35:17 -0700 |
parents | 337400e7a5dd |
children | c517646eef23 |
comparison
equal
deleted
inserted
replaced
642:660978a2a31a | 643:c771b7f43bbf |
---|---|
1481 // encoding scheme (opcode, rm, sib, immediate), and call them from C++ | 1481 // encoding scheme (opcode, rm, sib, immediate), and call them from C++ |
1482 // code in the enc_class source block. Emit functions will live in the | 1482 // code in the enc_class source block. Emit functions will live in the |
1483 // main source block for now. In future, we can generalize this by | 1483 // main source block for now. In future, we can generalize this by |
1484 // adding a syntax that specifies the sizes of fields in an order, | 1484 // adding a syntax that specifies the sizes of fields in an order, |
1485 // so that the adlc can build the emit functions automagically | 1485 // so that the adlc can build the emit functions automagically |
1486 enc_class OpcP %{ // Emit opcode | 1486 |
1487 emit_opcode(cbuf,$primary); | 1487 // Emit primary opcode |
1488 %} | 1488 enc_class OpcP %{ |
1489 | 1489 emit_opcode(cbuf, $primary); |
1490 enc_class OpcS %{ // Emit opcode | 1490 %} |
1491 emit_opcode(cbuf,$secondary); | 1491 |
1492 %} | 1492 // Emit secondary opcode |
1493 | 1493 enc_class OpcS %{ |
1494 enc_class Opcode(immI d8 ) %{ // Emit opcode | 1494 emit_opcode(cbuf, $secondary); |
1495 emit_opcode(cbuf,$d8$$constant); | 1495 %} |
1496 | |
1497 // Emit opcode directly | |
1498 enc_class Opcode(immI d8) %{ | |
1499 emit_opcode(cbuf, $d8$$constant); | |
1496 %} | 1500 %} |
1497 | 1501 |
1498 enc_class SizePrefix %{ | 1502 enc_class SizePrefix %{ |
1499 emit_opcode(cbuf,0x66); | 1503 emit_opcode(cbuf,0x66); |
1500 %} | 1504 %} |
6382 "XCHG $dst.lo $dst.hi" %} | 6386 "XCHG $dst.lo $dst.hi" %} |
6383 | 6387 |
6384 ins_cost(125); | 6388 ins_cost(125); |
6385 ins_encode( bswap_long_bytes(dst) ); | 6389 ins_encode( bswap_long_bytes(dst) ); |
6386 ins_pipe( ialu_reg_reg); | 6390 ins_pipe( ialu_reg_reg); |
6391 %} | |
6392 | |
6393 | |
6394 //---------- Population Count Instructions ------------------------------------- | |
6395 | |
6396 instruct popCountI(eRegI dst, eRegI src) %{ | |
6397 predicate(UsePopCountInstruction); | |
6398 match(Set dst (PopCountI src)); | |
6399 | |
6400 format %{ "POPCNT $dst, $src" %} | |
6401 ins_encode %{ | |
6402 __ popcntl($dst$$Register, $src$$Register); | |
6403 %} | |
6404 ins_pipe(ialu_reg); | |
6405 %} | |
6406 | |
6407 instruct popCountI_mem(eRegI dst, memory mem) %{ | |
6408 predicate(UsePopCountInstruction); | |
6409 match(Set dst (PopCountI (LoadI mem))); | |
6410 | |
6411 format %{ "POPCNT $dst, $mem" %} | |
6412 ins_encode %{ | |
6413 __ popcntl($dst$$Register, $mem$$Address); | |
6414 %} | |
6415 ins_pipe(ialu_reg); | |
6416 %} | |
6417 | |
6418 // Note: Long.bitCount(long) returns an int. | |
6419 instruct popCountL(eRegI dst, eRegL src, eRegI tmp, eFlagsReg cr) %{ | |
6420 predicate(UsePopCountInstruction); | |
6421 match(Set dst (PopCountL src)); | |
6422 effect(KILL cr, TEMP tmp, TEMP dst); | |
6423 | |
6424 format %{ "POPCNT $dst, $src.lo\n\t" | |
6425 "POPCNT $tmp, $src.hi\n\t" | |
6426 "ADD $dst, $tmp" %} | |
6427 ins_encode %{ | |
6428 __ popcntl($dst$$Register, $src$$Register); | |
6429 __ popcntl($tmp$$Register, HIGH_FROM_LOW($src$$Register)); | |
6430 __ addl($dst$$Register, $tmp$$Register); | |
6431 %} | |
6432 ins_pipe(ialu_reg); | |
6433 %} | |
6434 | |
6435 // Note: Long.bitCount(long) returns an int. | |
6436 instruct popCountL_mem(eRegI dst, memory mem, eRegI tmp, eFlagsReg cr) %{ | |
6437 predicate(UsePopCountInstruction); | |
6438 match(Set dst (PopCountL (LoadL mem))); | |
6439 effect(KILL cr, TEMP tmp, TEMP dst); | |
6440 | |
6441 format %{ "POPCNT $dst, $mem\n\t" | |
6442 "POPCNT $tmp, $mem+4\n\t" | |
6443 "ADD $dst, $tmp" %} | |
6444 ins_encode %{ | |
6445 //__ popcntl($dst$$Register, $mem$$Address$$first); | |
6446 //__ popcntl($tmp$$Register, $mem$$Address$$second); | |
6447 __ popcntl($dst$$Register, Address::make_raw($mem$$base, $mem$$index, $mem$$scale, $mem$$disp, false)); | |
6448 __ popcntl($tmp$$Register, Address::make_raw($mem$$base, $mem$$index, $mem$$scale, $mem$$disp + 4, false)); | |
6449 __ addl($dst$$Register, $tmp$$Register); | |
6450 %} | |
6451 ins_pipe(ialu_reg); | |
6387 %} | 6452 %} |
6388 | 6453 |
6389 | 6454 |
6390 //----------Load/Store/Move Instructions--------------------------------------- | 6455 //----------Load/Store/Move Instructions--------------------------------------- |
6391 //----------Load Instructions-------------------------------------------------- | 6456 //----------Load Instructions-------------------------------------------------- |