Re: Register constraint in NEG instructions

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 





On 7/26/23 2:16 AM, Jose E. Marchesi wrote:

I see this in the verifier (bpf-next):

    if (opcode == BPF_NEG) {
	if (BPF_SRC(insn->code) != BPF_K ||
	    insn->src_reg != BPF_REG_0 ||
	    insn->off != 0 || insn->imm != 0) {
		verbose(env, "BPF_NEG uses reserved fields\n");
	return -EINVAL;
    }

And along this llvm assembler test:

                |
                v
   // CHECK: 84 01 00 00 00 00 00 00	w1 = -w1
   w1 = -w1

Is enough evidence that NEG is supposed to use only dst and not src.  I

Yes, in llvm (BPFInstrInfo.td),

class NEG_RR<BPFOpClass Class, BPFArithOp Opc,
             dag outs, dag ins, string asmstr, list<dag> pattern>
    : TYPE_ALU_JMP<Opc.Value, 0, outs, ins, asmstr, pattern> {
  bits<4> dst;

  let Inst{51-48} = dst;
  let BPFClass = Class;
}

You can see only dst register is used. The further evidence
is from the above kernel check.


am sending a fix for standarization/instruction-set.rst.

Hello.

The neg (and neg32) instructions are documented to use (and encode) both
src and dst register operands in standarization/instruction-set.rst:

   BPF_NEG   0x80   dst = -src

However, in llvm's BPFAsmParser::PreMatchCheck, it is checked that both
source and destination registers refer to the same register.  If they
are not, an error is raised.

Is this to speed up JIT to different architectures, some like x86
featuring `NEG reg' and others like aarch64 featuring `NEG reg1,reg2'?

Should I send a patch for instruction-set.rst documenting the
requirement?

Thanks.




[Index of Archives]     [Linux Samsung SoC]     [Linux Rockchip SoC]     [Linux Actions SoC]     [Linux for Synopsys ARC Processors]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]


  Powered by Linux