Skip to content

Commit 1d37bc7

Browse files
author
Yonghong Song
committed
Simplify XADD/XADDD pattern matching
The patch is from Eduard. class XADD and class ATOMIC_NOFETCH are almost the same except the pattern matching string. Removing class XADD and defining two Pat's (pattern -> insn) for 32bit and 64bit XADD/XADDD to use ATOMIC_NOFETACH can simplify code a lot.
1 parent a28cd44 commit 1d37bc7

File tree

1 file changed

+21
-51
lines changed

1 file changed

+21
-51
lines changed

llvm/lib/Target/BPF/BPFInstrInfo.td

Lines changed: 21 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -786,52 +786,13 @@ let Predicates = [BPFNoALU32] in {
786786
def : Pat<(i64 (extloadi32 ADDRri:$src)), (i64 (LDW ADDRri:$src))>;
787787
}
788788

789-
// Atomic XADD for BPFNoALU32
790-
class XADD<BPFWidthModifer SizeOp, string OpcodeStr, PatFrag OpNode>
791-
: TYPE_LD_ST<BPF_ATOMIC.Value, SizeOp.Value,
792-
(outs GPR:$dst),
793-
(ins MEMri:$addr, GPR:$val),
794-
"lock *("#OpcodeStr#" *)($addr) += $val",
795-
[(set GPR:$dst, (OpNode ADDRri:$addr, GPR:$val))]> {
796-
bits<4> dst;
797-
bits<20> addr;
798-
799-
let Inst{51-48} = addr{19-16}; // base reg
800-
let Inst{55-52} = dst;
801-
let Inst{47-32} = addr{15-0}; // offset
802-
let Inst{7-4} = BPF_ADD.Value;
803-
let BPFClass = BPF_STX;
804-
}
805-
806-
let Constraints = "$dst = $val" in {
807-
let Predicates = [BPFNoALU32] in {
808-
def XADDW : XADD<BPF_W, "u32", atomic_load_add_i32>;
809-
def XADDD : XADD<BPF_DW, "u64", atomic_load_add_i64>;
810-
}
811-
}
812-
813789
// Atomic add, and, or, xor
814-
class ATOMIC_NOFETCH<BPFArithOp Opc, string Opstr>
815-
: TYPE_LD_ST<BPF_ATOMIC.Value, BPF_DW.Value,
790+
class ATOMIC_NOFETCH<BPFWidthModifer SizeOp, string OpType, RegisterClass RegTp,
791+
BPFArithOp Opc, string Opstr>
792+
: TYPE_LD_ST<BPF_ATOMIC.Value, SizeOp.Value,
816793
(outs GPR:$dst),
817-
(ins MEMri:$addr, GPR:$val),
818-
"lock *(u64 *)($addr) " #Opstr# "= $val",
819-
[]> {
820-
bits<4> dst;
821-
bits<20> addr;
822-
823-
let Inst{51-48} = addr{19-16}; // base reg
824-
let Inst{55-52} = dst;
825-
let Inst{47-32} = addr{15-0}; // offset
826-
let Inst{7-4} = Opc.Value;
827-
let BPFClass = BPF_STX;
828-
}
829-
830-
class ATOMIC32_NOFETCH<BPFArithOp Opc, string Opstr>
831-
: TYPE_LD_ST<BPF_ATOMIC.Value, BPF_W.Value,
832-
(outs GPR32:$dst),
833-
(ins MEMri:$addr, GPR32:$val),
834-
"lock *(u32 *)($addr) " #Opstr# "= $val",
794+
(ins MEMri:$addr, RegTp:$val),
795+
"lock *(" #OpType# " *)($addr) " #Opstr# "= $val",
835796
[]> {
836797
bits<4> dst;
837798
bits<20> addr;
@@ -845,14 +806,23 @@ class ATOMIC32_NOFETCH<BPFArithOp Opc, string Opstr>
845806

846807
let Constraints = "$dst = $val" in {
847808
let Predicates = [BPFHasALU32], DecoderNamespace = "BPFALU32" in {
848-
def XADDW32 : ATOMIC32_NOFETCH<BPF_ADD, "+">;
849-
def XANDW32 : ATOMIC32_NOFETCH<BPF_AND, "&">;
850-
def XORW32 : ATOMIC32_NOFETCH<BPF_OR, "|">;
851-
def XXORW32 : ATOMIC32_NOFETCH<BPF_XOR, "^">;
809+
def XADDW32 : ATOMIC_NOFETCH<BPF_W, "u32", GPR32, BPF_ADD, "+">;
810+
def XANDW32 : ATOMIC_NOFETCH<BPF_W, "u32", GPR32, BPF_AND, "&">;
811+
def XORW32 : ATOMIC_NOFETCH<BPF_W, "u32", GPR32, BPF_OR, "|">;
812+
def XXORW32 : ATOMIC_NOFETCH<BPF_W, "u32", GPR32, BPF_XOR, "^">;
852813
}
853-
def XANDD : ATOMIC_NOFETCH<BPF_AND, "&">;
854-
def XORD : ATOMIC_NOFETCH<BPF_OR, "|">;
855-
def XXORD : ATOMIC_NOFETCH<BPF_XOR, "^">;
814+
def XADDW : ATOMIC_NOFETCH<BPF_W, "u32", GPR, BPF_ADD, "+">;
815+
def XADDD : ATOMIC_NOFETCH<BPF_DW, "u64", GPR, BPF_ADD, "+">;
816+
def XANDD : ATOMIC_NOFETCH<BPF_DW, "u64", GPR, BPF_AND, "&">;
817+
def XORD : ATOMIC_NOFETCH<BPF_DW, "u64", GPR, BPF_OR, "|">;
818+
def XXORD : ATOMIC_NOFETCH<BPF_DW, "u64", GPR, BPF_XOR, "^">;
819+
}
820+
821+
let Predicates = [BPFNoALU32] in {
822+
def : Pat<(atomic_load_add_i32 ADDRri:$addr, GPR:$val),
823+
(XADDW ADDRri:$addr, GPR:$val)>;
824+
def : Pat<(atomic_load_add_i64 ADDRri:$addr, GPR:$val),
825+
(XADDD ADDRri:$addr, GPR:$val)>;
856826
}
857827

858828
// Atomic Fetch-and-<add, and, or, xor> operations

0 commit comments

Comments
 (0)