diff options
author | aph <none@none> | 2014-07-03 16:07:33 +0100 |
---|---|---|
committer | aph <none@none> | 2014-07-03 16:07:33 +0100 |
commit | f9ef28f6951f4002cc664b0af9e454be937a3632 (patch) | |
tree | 634cd6e7a7ea6b3fafce89628c355b6918943c21 | |
parent | 975db41bf95754a2b032f7b60e60ad88035cb559 (diff) | |
parent | cad8387a5945229a0abd3260e692ee379bfc6b67 (diff) |
Merge
-rw-r--r-- | src/cpu/aarch64/vm/aarch64.ad | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/src/cpu/aarch64/vm/aarch64.ad b/src/cpu/aarch64/vm/aarch64.ad index a7f6e8802..3a912e104 100644 --- a/src/cpu/aarch64/vm/aarch64.ad +++ b/src/cpu/aarch64/vm/aarch64.ad @@ -5988,6 +5988,61 @@ instruct bytes_reverse_short(iRegINoSp dst) %{ %} // ============================================================================ +// Zero Count Instructions + +instruct countLeadingZerosI(iRegI dst, iRegI src) %{ + match(Set dst (CountLeadingZerosI src)); + + ins_cost(INSN_COST); + format %{ "clzw $dst, $src" %} + ins_encode %{ + __ clzw(as_Register($dst$$reg), as_Register($src$$reg)); + %} + + ins_pipe( pipe_class_default ); +%} + +instruct countLeadingZerosL(iRegI dst, iRegL src) %{ + match(Set dst (CountLeadingZerosL src)); + + ins_cost(INSN_COST); + format %{ "clz $dst, $src" %} + ins_encode %{ + __ clz(as_Register($dst$$reg), as_Register($src$$reg)); + %} + + ins_pipe( pipe_class_default ); +%} + +instruct countTrailingZerosI(iRegI dst, iRegI src) %{ + match(Set dst (CountTrailingZerosI src)); + + ins_cost(INSN_COST * 2); + format %{ "rbitw $dst, $src\n\t" + "clzw $dst, $dst" %} + ins_encode %{ + __ rbitw(as_Register($dst$$reg), as_Register($src$$reg)); + __ clzw(as_Register($dst$$reg), as_Register($dst$$reg)); + %} + + ins_pipe( pipe_class_default ); +%} + +instruct countTrailingZerosL(iRegI dst, iRegL src) %{ + match(Set dst (CountTrailingZerosL src)); + + ins_cost(INSN_COST * 2); + format %{ "rbit $dst, $src\n\t" + "clz $dst, $dst" %} + ins_encode %{ + __ rbit(as_Register($dst$$reg), as_Register($src$$reg)); + __ clz(as_Register($dst$$reg), as_Register($dst$$reg)); + %} + + ins_pipe( pipe_class_default ); +%} + +// ============================================================================ // MemBar Instruction instruct load_fence() %{ @@ -9750,6 +9805,32 @@ instruct absD_reg(vRegD dst, vRegD src) %{ ins_pipe(pipe_class_default); %} +instruct sqrtD_reg(vRegD dst, vRegD src) %{ + match(Set dst (SqrtD src)); + + ins_cost(INSN_COST * 50); + format %{ "fsqrtd $dst, $src" %} + ins_encode %{ + __ fsqrtd(as_FloatRegister($dst$$reg), + as_FloatRegister($src$$reg)); + %} + + ins_pipe(pipe_class_default); +%} + +instruct sqrtF_reg(vRegF dst, vRegF src) %{ + match(Set dst (ConvD2F (SqrtD (ConvF2D src)))); + + ins_cost(INSN_COST * 50); + format %{ "fsqrts $dst, $src" %} + ins_encode %{ + __ fsqrtd(as_FloatRegister($dst$$reg), + as_FloatRegister($src$$reg)); + %} + + ins_pipe(pipe_class_default); +%} + // ============================================================================ // Logical Instructions |