[prev in list] [next in list] [prev in thread] [next in thread] 

List:       openjdk-hotspot-compiler-dev
Subject:    Re: pipeline class for sequence of instructions
From:       Edward Nevill <edward.nevill () gmail ! com>
Date:       2015-06-22 12:47:06
Message-ID: 1434977226.21282.14.camel () mint
[Download RAW message or body]

On Wed, 2015-06-17 at 19:34 +0000, Alexeev, Alexander wrote:


> Stages for arguments read/writes, decoder and execution unit are specified only \
> once. Is it then applied on every instructions that uses that pipeline class \
> arguments or for the whole ins_encode body?

AFAIUI

It is the whole ins_encode body. The pipeline scheduler does not go inside an AD \
instruct %{ ... %}

I would use the read parameters for the first instruction, and the write parameters \
for the last instruction. If a resource is used just list it as being used in the \
normal place you would expect such a resource to be used.

I think the pipeline scheduler is not really designed for multi instruction sequences \
so you have to just do the best you can to model the multi instruction sequence as a \
single fictitious instruction. 

Interestingly, in the example you chose below, I think it should be \
ins_pipe(ialu_reg_reg) rather than ins_pipe(ialu_reg) because countLeadingZerosL_bsr \
has both src and dst registers.

All the best,
Ed.

> // Integer ALU reg operation
> pipe_class ialu_reg(rRegI dst)
> %{
> single_instruction;
> dst    : S4(write);
> dst    : S3(read);
> DECODE : S0;        // any decoder
> ALU    : S3;        // any alu
> %}
> 
> 
> 
> instruct countLeadingZerosL_bsr(rRegI dst, rRegL src, rFlagsReg cr) %{
> predicate(!UseCountLeadingZerosInstruction);
> match(Set dst (CountLeadingZerosL src));
> effect(KILL cr);
> 
> format %{ "bsrq    $dst, $src\t# count leading zeros (long)\n\t"
> "jnz     skip\n\t"
> "movl    $dst, -1\n"
> "skip:\n\t"
> "negl    $dst\n\t"
> "addl    $dst, 63" %}
> ins_encode %{
> Register Rdst = $dst$$Register;
> Register Rsrc = $src$$Register;
> Label skip;
> __ bsrq(Rdst, Rsrc);
> __ jccb(Assembler::notZero, skip);
> __ movl(Rdst, -1);
> __ bind(skip);
> __ negl(Rdst);
> __ addl(Rdst, BitsPerLong - 1);
> %}
> ins_pipe(ialu_reg);
> %}


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic