< prev index next >

src/hotspot/cpu/aarch64/aarch64.ad

Print this page

        

*** 13576,13585 **** --- 13576,13631 ---- } %} ins_pipe(fp_uop_d); %} + instruct signumD_reg(vRegD dst, vRegD src, vRegD tmp, vRegD one) %{ + match(Set dst (SignumD src)); + effect(TEMP_DEF dst, TEMP tmp, TEMP one); + format %{ "signumD $dst, $src" %} + ins_encode %{ + FloatRegister src = as_FloatRegister($src$$reg), + dst = as_FloatRegister($dst$$reg), + tmp = as_FloatRegister($tmp$$reg), + one = as_FloatRegister($one$$reg); + __ fmovd(tmp, 0.0d); + __ fmovd(one, 1.0d); + __ facgtd(dst, src, tmp); // dst=0 for +-0.0 and NaN. 0xFFF..F otherwise + __ ushrd(dst, dst, 1); // dst=0 for +-0.0 and NaN. 0x7FF..F otherwise + // Bit selection instruction gets bit from "one" for each enabled bit in + // "dst", otherwise gets a bit from "src". For "src" that contains +-0.0 or + // NaN the whole "src" will be copied because "dst" is zero. For all other + // "src" values dst is 0x7FF..F, which means only the sign bit is copied + // from "src", and all other bits are copied from 1.0. + __ bsl(dst, __ T8B, one, src); + %} + ins_pipe(fp_uop_d); + %} + + instruct signumF_reg(vRegF dst, vRegF src, vRegF tmp, vRegF one) %{ + match(Set dst (SignumF src)); + effect(TEMP_DEF dst, USE src, TEMP tmp, TEMP one); + format %{ "signumF $dst, $src" %} + ins_encode %{ + FloatRegister src = as_FloatRegister($src$$reg), + dst = as_FloatRegister($dst$$reg), + tmp = as_FloatRegister($tmp$$reg), + one = as_FloatRegister($one$$reg); + __ fmovs(tmp, 0.0f); + __ fmovs(one, 1.0f); + __ facgts(dst, src, tmp); // dst=0 for +-0.0 and NaN. 0xFFF..F otherwise + __ ushr(dst, __ T2S, dst, 1); // dst=0 for +-0.0 and NaN. 0x7FF..F otherwise + // Bit selection instruction gets bit from "one" for each enabled bit in + // "dst", otherwise gets a bit from "src". For "src" that contains +-0.0 or + // NaN the whole "src" will be copied because "dst" is zero. For all other + // "src" values dst is 0x7FF..F, which means only the sign bit is copied + // from "src", and all other bits are copied from 1.0. + __ bsl(dst, __ T8B, one, src); + %} + ins_pipe(fp_uop_d); + %} + // ============================================================================ // Logical Instructions // Integer Logical Instructions
< prev index next >