1511 assert(__ offset() - offset <= (int) size_deopt_handler(), "overflow"); |
1511 assert(__ offset() - offset <= (int) size_deopt_handler(), "overflow"); |
1512 __ end_a_stub(); |
1512 __ end_a_stub(); |
1513 return offset; |
1513 return offset; |
1514 } |
1514 } |
1515 |
1515 |
1516 |
|
1517 const bool Matcher::match_rule_supported(int opcode) { |
|
1518 if (!has_match_rule(opcode)) |
|
1519 return false; |
|
1520 |
|
1521 switch (opcode) { |
|
1522 case Op_PopCountI: |
|
1523 case Op_PopCountL: |
|
1524 if (!UsePopCountInstruction) |
|
1525 return false; |
|
1526 break; |
|
1527 } |
|
1528 |
|
1529 return true; // Per default match rules are supported. |
|
1530 } |
|
1531 |
|
1532 int Matcher::regnum_to_fpu_offset(int regnum) |
1516 int Matcher::regnum_to_fpu_offset(int regnum) |
1533 { |
1517 { |
1534 return regnum - 32; // The FP registers are in the second chunk |
1518 return regnum - 32; // The FP registers are in the second chunk |
1535 } |
1519 } |
1536 |
1520 |
6425 } |
6409 } |
6426 %} |
6410 %} |
6427 ins_pipe(ialu_reg_reg); // XXX |
6411 ins_pipe(ialu_reg_reg); // XXX |
6428 %} |
6412 %} |
6429 |
6413 |
|
6414 // Convert oop into int for vectors alignment masking |
|
6415 instruct convP2I(rRegI dst, rRegP src) |
|
6416 %{ |
|
6417 match(Set dst (ConvL2I (CastP2X src))); |
|
6418 |
|
6419 format %{ "movl $dst, $src\t# ptr -> int" %} |
|
6420 ins_encode %{ |
|
6421 __ movl($dst$$Register, $src$$Register); |
|
6422 %} |
|
6423 ins_pipe(ialu_reg_reg); // XXX |
|
6424 %} |
|
6425 |
|
6426 // Convert compressed oop into int for vectors alignment masking |
|
6427 // in case of 32bit oops (heap < 4Gb). |
|
6428 instruct convN2I(rRegI dst, rRegN src) |
|
6429 %{ |
|
6430 predicate(Universe::narrow_oop_shift() == 0); |
|
6431 match(Set dst (ConvL2I (CastP2X (DecodeN src)))); |
|
6432 |
|
6433 format %{ "movl $dst, $src\t# compressed ptr -> int" %} |
|
6434 ins_encode %{ |
|
6435 __ movl($dst$$Register, $src$$Register); |
|
6436 %} |
|
6437 ins_pipe(ialu_reg_reg); // XXX |
|
6438 %} |
6430 |
6439 |
6431 // Convert oop pointer into compressed form |
6440 // Convert oop pointer into compressed form |
6432 instruct encodeHeapOop(rRegN dst, rRegP src, rFlagsReg cr) %{ |
6441 instruct encodeHeapOop(rRegN dst, rRegP src, rFlagsReg cr) %{ |
6433 predicate(n->bottom_type()->make_ptr()->ptr() != TypePtr::NotNull); |
6442 predicate(n->bottom_type()->make_ptr()->ptr() != TypePtr::NotNull); |
6434 match(Set dst (EncodeP src)); |
6443 match(Set dst (EncodeP src)); |
10047 __ movdq($dst$$Register, $src$$XMMRegister); |
10056 __ movdq($dst$$Register, $src$$XMMRegister); |
10048 %} |
10057 %} |
10049 ins_pipe( pipe_slow ); |
10058 ins_pipe( pipe_slow ); |
10050 %} |
10059 %} |
10051 |
10060 |
10052 // The next instructions have long latency and use Int unit. Set high cost. |
|
10053 instruct MoveI2F_reg_reg(regF dst, rRegI src) %{ |
10061 instruct MoveI2F_reg_reg(regF dst, rRegI src) %{ |
10054 match(Set dst (MoveI2F src)); |
10062 match(Set dst (MoveI2F src)); |
10055 effect(DEF dst, USE src); |
10063 effect(DEF dst, USE src); |
10056 ins_cost(300); |
10064 ins_cost(100); |
10057 format %{ "movd $dst,$src\t# MoveI2F" %} |
10065 format %{ "movd $dst,$src\t# MoveI2F" %} |
10058 ins_encode %{ |
10066 ins_encode %{ |
10059 __ movdl($dst$$XMMRegister, $src$$Register); |
10067 __ movdl($dst$$XMMRegister, $src$$Register); |
10060 %} |
10068 %} |
10061 ins_pipe( pipe_slow ); |
10069 ins_pipe( pipe_slow ); |
10062 %} |
10070 %} |
10063 |
10071 |
10064 instruct MoveL2D_reg_reg(regD dst, rRegL src) %{ |
10072 instruct MoveL2D_reg_reg(regD dst, rRegL src) %{ |
10065 match(Set dst (MoveL2D src)); |
10073 match(Set dst (MoveL2D src)); |
10066 effect(DEF dst, USE src); |
10074 effect(DEF dst, USE src); |
10067 ins_cost(300); |
10075 ins_cost(100); |
10068 format %{ "movd $dst,$src\t# MoveL2D" %} |
10076 format %{ "movd $dst,$src\t# MoveL2D" %} |
10069 ins_encode %{ |
10077 ins_encode %{ |
10070 __ movdq($dst$$XMMRegister, $src$$Register); |
10078 __ movdq($dst$$XMMRegister, $src$$Register); |
10071 %} |
10079 %} |
10072 ins_pipe( pipe_slow ); |
10080 ins_pipe( pipe_slow ); |