Skip to content

Commit

Permalink
Finished change
Browse files Browse the repository at this point in the history
  • Loading branch information
LucasSte committed Dec 12, 2024
1 parent 6e2e876 commit 63266c1
Showing 1 changed file with 138 additions and 66 deletions.
204 changes: 138 additions & 66 deletions llvm/lib/Target/SBF/SBFInstrInfo.td
Original file line number Diff line number Diff line change
Expand Up @@ -492,12 +492,12 @@ def LD_pseudo
}

// STORE instructions
class STORE_V1<SBFWidthModifer SizeOp, string Mnemonic, list<dag> Pattern>
class STORE_V1<SBFWidthModifer SizeOp, string Mnemonic>
: TYPE_LD_ST<SBF_MEM.Value, SizeOp.Value,
(outs),
(ins GPR:$src, MEMri:$addr),
Mnemonic # " [$addr], $src",
Pattern> {
[]> {
bits<4> src;
bits<20> addr;

Expand All @@ -507,12 +507,12 @@ class STORE_V1<SBFWidthModifer SizeOp, string Mnemonic, list<dag> Pattern>
let SBFClass = SBF_STX;
}

class STORE_V2<SBFSizeModifier SizeOp, string Mnemonic, list<dag> Pattern>
class STORE_V2<SBFSizeModifier SizeOp, string Mnemonic>
: TYPE_LD_ST_V2<SizeOp.Value, SBF_X.Value,
(outs),
(ins GPR:$src, MEMri:$addr),
Mnemonic # " [$addr], $src",
Pattern> {
[]> {
bits<4> src;
bits<20> addr;

Expand All @@ -523,30 +523,52 @@ class STORE_V2<SBFSizeModifier SizeOp, string Mnemonic, list<dag> Pattern>
}

multiclass STOREi64<SBFWidthModifer SizeV1, SBFSizeModifier SizeV2,
string Mnemonic, PatFrag OpNode> {
def _V1 : STORE_V1<SizeV1, Mnemonic, [(OpNode GPR:$src, ADDRri:$addr)]>,
Requires<[SBFOldMemEncoding]>;
string Mnemonic> {
def _V1 : STORE_V1<SizeV1, Mnemonic>, Requires<[SBFOldMemEncoding]>;

let DecoderNamespace = "SBFv2" in {
def _V2 : STORE_V2<SizeV2, Mnemonic, [(OpNode GPR:$src, ADDRri:$addr)]>,
Requires<[SBFNewMemEncoding]>;
def _V2 : STORE_V2<SizeV2, Mnemonic>, Requires<[SBFNewMemEncoding]>;
}
}

let Predicates = [SBFNoALU32] in {
defm STW : STOREi64<SBF_W, SBF_W_V2, "stxw", truncstorei32>;
defm STH : STOREi64<SBF_H, SBF_H_V2, "stxh", truncstorei16>;
defm STB : STOREi64<SBF_B, SBF_B_V2, "stxb", truncstorei8>;

defm STW : STOREi64<SBF_W, SBF_W_V2, "stxw">;
defm STH : STOREi64<SBF_H, SBF_H_V2, "stxh">;
defm STB : STOREi64<SBF_B, SBF_B_V2, "stxb">;
defm STD : STOREi64<SBF_DW, SBF_DW_V2, "stxdw">;

def : Pat<(store GPR:$src, ADDRri:$addr),
(STD_V1 GPR:$src, ADDRri:$addr)>, Requires<[SBFOldMemEncoding]>;

def : Pat<(store GPR:$src, ADDRri:$addr),
(STD_V2 GPR:$src, ADDRri:$addr)>, Requires<[SBFNewMemEncoding]>;

let Predicates = [SBFNoALU32, SBFOldMemEncoding] in {
def : Pat<(truncstorei32 GPR:$src, ADDRri:$addr),
(STW_V1 GPR:$src, ADDRri:$addr)>;
def : Pat<(truncstorei16 GPR:$src, ADDRri:$addr),
(STH_V1 GPR:$src, ADDRri:$addr)>;
def : Pat<(truncstorei8 GPR:$src, ADDRri:$addr),
(STB_V1 GPR:$src, ADDRri:$addr)>;
}

let Predicates = [SBFNoALU32, SBFNewMemEncoding] in {
def : Pat<(truncstorei32 GPR:$src, ADDRri:$addr),
(STW_V2 GPR:$src, ADDRri:$addr)>;
def : Pat<(truncstorei16 GPR:$src, ADDRri:$addr),
(STH_V2 GPR:$src, ADDRri:$addr)>;
def : Pat<(truncstorei8 GPR:$src, ADDRri:$addr),
(STB_V2 GPR:$src, ADDRri:$addr)>;
}
defm STD : STOREi64<SBF_DW, SBF_DW_V2, "stxdw", store>;


class STORE_imm_V1<SBFWidthModifer SizeOp,
string Mnemonic, list<dag> Pattern>
string Mnemonic>
: TYPE_LD_ST<SBF_MEM.Value, SizeOp.Value,
(outs),
(ins i64imm:$imm, MEMri:$addr),
Mnemonic # " [$addr], $imm",
Pattern> {
[]> {
bits<20> addr;
bits<32> imm;
let Inst{51-48} = addr{19-16}; // base reg
Expand All @@ -556,12 +578,12 @@ class STORE_imm_V1<SBFWidthModifer SizeOp,
}

class STORE_imm_V2<SBFSizeModifier SizeOp,
string Mnemonic, list<dag> Pattern>
string Mnemonic>
: TYPE_LD_ST_V2<SizeOp.Value, SBF_K.Value,
(outs),
(ins i64imm:$imm, MEMri:$addr),
Mnemonic # " [$addr], $imm",
Pattern> {
[]> {
bits<20> addr;
bits<32> imm;
let Inst{51-48} = addr{19-16}; // base reg
Expand All @@ -571,11 +593,11 @@ class STORE_imm_V2<SBFSizeModifier SizeOp,
}

multiclass STORE_imm<SBFWidthModifer SizeV1, SBFSizeModifier SizeV2,
string Mnemonic, list<dag> Pattern> {
def _V1 : STORE_imm_V1<SizeV1, Mnemonic, Pattern>, Requires<[SBFOldMemEncoding]>;
string Mnemonic> {
def _V1 : STORE_imm_V1<SizeV1, Mnemonic>, Requires<[SBFOldMemEncoding]>;

let DecoderNamespace = "SBFv2" in {
def _V2 : STORE_imm_V2<SizeV2, Mnemonic, Pattern>, Requires<[SBFNewMemEncoding]>;
def _V2 : STORE_imm_V2<SizeV2, Mnemonic>, Requires<[SBFNewMemEncoding]>;
}
}

Expand All @@ -591,10 +613,10 @@ multiclass STORE_imm<SBFWidthModifer SizeV1, SBFSizeModifier SizeV2,
// stx [rb], rA
//
// For SBF_{B,H,W} the size of value stored matches size of the immediate.
defm STD_imm : STORE_imm<SBF_DW, SBF_DW_V2, "stdw", []>;
defm STW_imm : STORE_imm<SBF_W, SBF_W_V2, "stw", []>;
defm STH_imm : STORE_imm<SBF_H, SBF_H_V2, "sth", []>;
defm STB_imm : STORE_imm<SBF_B, SBF_B_V2, "stb", []>;
defm STD_imm : STORE_imm<SBF_DW, SBF_DW_V2, "stdw">;
defm STW_imm : STORE_imm<SBF_W, SBF_W_V2, "stw">;
defm STH_imm : STORE_imm<SBF_H, SBF_H_V2, "sth">;
defm STB_imm : STORE_imm<SBF_B, SBF_B_V2, "stb">;

let Predicates = [SBFHasStoreImm, SBFOldMemEncoding] in {
def : Pat<(store (i64 i64immSExt32:$imm), ADDRri:$addr),
Expand Down Expand Up @@ -647,12 +669,12 @@ let Predicates = [SBFHasALU32, SBFHasStoreImm, SBFNewMemEncoding] in {
}

// LOAD instructions
class LOAD_V1<SBFWidthModifer SizeOp, string Mnemonic, list<dag> Pattern>
class LOAD_V1<SBFWidthModifer SizeOp, string Mnemonic>
: TYPE_LD_ST<SBF_MEM.Value, SizeOp.Value,
(outs GPR:$dst),
(ins MEMri:$addr),
Mnemonic # " $dst, [$addr]",
Pattern> {
[]> {
bits<4> dst;
bits<20> addr;

Expand All @@ -662,12 +684,12 @@ class LOAD_V1<SBFWidthModifer SizeOp, string Mnemonic, list<dag> Pattern>
let SBFClass = SBF_LDX;
}

class LOAD_V2<SBFSizeModifier SizeOp, string Mnemonic, list<dag> Pattern>
class LOAD_V2<SBFSizeModifier SizeOp, string Mnemonic>
: TYPE_LD_ST_V2<SizeOp.Value, SBF_X.Value,
(outs GPR:$dst),
(ins MEMri:$addr),
Mnemonic # " $dst, [$addr]",
Pattern> {
[]> {
bits<4> dst;
bits<20> addr;

Expand All @@ -677,14 +699,11 @@ class LOAD_V2<SBFSizeModifier SizeOp, string Mnemonic, list<dag> Pattern>
let SBFClass = SBF_LD_V2;
}

multiclass LOADi64<SBFWidthModifer SizeV1, SBFSizeModifier SizeV2, string Mnemonic, PatFrag OpNode> {
def _V1 : LOAD_V1<SizeV1, Mnemonic, [(set i64:$dst, (OpNode ADDRri:$addr))]>,
Requires<[SBFOldMemEncoding]>;

multiclass LOADi64<SBFWidthModifer SizeV1, SBFSizeModifier SizeV2, string Mnemonic> {
def _V1 : LOAD_V1<SizeV1, Mnemonic>, Requires<[SBFOldMemEncoding]>;

let DecoderNamespace = "SBFv2" in {
def _V2 : LOAD_V2<SizeV2, Mnemonic, [(set i64:$dst, (OpNode ADDRri:$addr))]>,
Requires<[SBFOldMemEncoding]>;
def _V2 : LOAD_V2<SizeV2, Mnemonic>, Requires<[SBFNewMemEncoding]>;
}
}

Expand Down Expand Up @@ -727,13 +746,34 @@ let isCodeGenOnly = 1 in {
}
}

let Predicates = [SBFNoALU32] in {
defm LDW : LOADi64<SBF_W, SBF_W_V2, "ldxw", zextloadi32>;
defm LDH : LOADi64<SBF_H, SBF_H_V2, "ldxh", zextloadi16>;
defm LDB : LOADi64<SBF_B, SBF_B_V2, "ldxb", zextloadi8>;
defm LDW : LOADi64<SBF_W, SBF_W_V2, "ldxw">;
defm LDH : LOADi64<SBF_H, SBF_H_V2, "ldxh">;
defm LDB : LOADi64<SBF_B, SBF_B_V2, "ldxb">;
defm LDD : LOADi64<SBF_DW, SBF_DW_V2, "ldxdw">;

def : Pat<(load ADDRri:$addr),
(LDD_V1 ADDRri:$addr)>, Requires<[SBFOldMemEncoding]>;

def : Pat<(load ADDRri:$addr),
(LDD_V2 ADDRri:$addr)>, Requires<[SBFNewMemEncoding]>;

let Predicates = [SBFNoALU32, SBFOldMemEncoding] in {
def : Pat<(zextloadi32 ADDRri:$addr),
(LDW_V1 ADDRri:$addr)>;
def : Pat<(zextloadi16 ADDRri:$addr),
(LDH_V1 ADDRri:$addr)>;
def : Pat<(zextloadi8 ADDRri:$addr),
(LDB_V1 ADDRri:$addr)>;
}

defm LDD : LOADi64<SBF_DW, SBF_DW_V2, "ldxdw", load>;
let Predicates = [SBFNoALU32, SBFNewMemEncoding] in {
def : Pat<(zextloadi32 ADDRri:$addr),
(LDW_V2 ADDRri:$addr)>;
def : Pat<(zextloadi16 ADDRri:$addr),
(LDH_V2 ADDRri:$addr)>;
def : Pat<(zextloadi8 ADDRri:$addr),
(LDB_V2 ADDRri:$addr)>;
}

class BRANCH<SBFJumpOp Opc, string Mnemonic, list<dag> Pattern>
: TYPE_ALU_JMP<Opc.Value, SBF_K.Value,
Expand Down Expand Up @@ -1225,12 +1265,12 @@ def : Pat<(i64 (anyext GPR32:$src)),
def : Pat<(i64 (anyext GPR32:$src)),
(INSERT_SUBREG (i64 (IMPLICIT_DEF)), GPR32:$src, sub_32)>, Requires<[SBFNoExplicitSignExt]>;

class STORE32_V1<SBFWidthModifer SizeOp, string Mnemonic, list<dag> Pattern>
class STORE32_V1<SBFWidthModifer SizeOp, string Mnemonic>
: TYPE_LD_ST<SBF_MEM.Value, SizeOp.Value,
(outs),
(ins GPR32:$src, MEMri:$addr),
Mnemonic # " [$addr], $src",
Pattern> {
[]> {
bits<4> src;
bits<20> addr;

Expand All @@ -1240,13 +1280,13 @@ class STORE32_V1<SBFWidthModifer SizeOp, string Mnemonic, list<dag> Pattern>
let SBFClass = SBF_STX;
}

class STORE32_V2<SBFSizeModifier SizeOp, string Mnemonic, list<dag> Pattern>
class STORE32_V2<SBFSizeModifier SizeOp, string Mnemonic>
: TYPE_LD_ST_V2<SizeOp.Value,
SBF_X.Value,
(outs),
(ins GPR32:$src, MEMri:$addr),
Mnemonic # " [$addr], $src",
Pattern> {
[]> {
bits<4> src;
bits<20> addr;

Expand All @@ -1257,28 +1297,44 @@ class STORE32_V2<SBFSizeModifier SizeOp, string Mnemonic, list<dag> Pattern>
}

multiclass STOREi32<SBFWidthModifer SizeV1, SBFSizeModifier SizeV2,
string Mnemonic, PatFrag OpNode> {
def _V1 : STORE32_V1<SizeV1, Mnemonic, [(OpNode GPR32:$src, ADDRri:$addr)]>,
Requires<[SBFOldMemEncoding]>;
string Mnemonic> {
def _V1 : STORE32_V1<SizeV1, Mnemonic>, Requires<[SBFOldMemEncoding]>;

let DecoderNamespace = "SBFALU32v2" in {
def _V2 : STORE32_V2<SizeV2, Mnemonic, [(OpNode GPR32:$src, ADDRri:$addr)]>,
Requires<[SBFNewMemEncoding]>;
def _V2 : STORE32_V2<SizeV2, Mnemonic>, Requires<[SBFNewMemEncoding]>;
}
}

let Predicates = [SBFHasALU32], DecoderNamespace = "SBFALU32" in {
defm STW32 : STOREi32<SBF_W, SBF_W_V2, "stxw", store>;
defm STH32 : STOREi32<SBF_H, SBF_H_V2, "stxh", truncstorei16>;
defm STB32 : STOREi32<SBF_B, SBF_B_V2, "stxb", truncstorei8>;
let DecoderNamespace = "SBFALU32" in {
defm STW32 : STOREi32<SBF_W, SBF_W_V2, "stxw">;
defm STH32 : STOREi32<SBF_H, SBF_H_V2, "stxh">;
defm STB32 : STOREi32<SBF_B, SBF_B_V2, "stxb">;
}

let Predicates = [SBFHasALU32, SBFOldMemEncoding] in {
def : Pat<(store GPR32:$src, ADDRri:$addr),
(STW32_V1 GPR32:$src, ADDRri:$addr)>;
def : Pat<(truncstorei16 GPR32:$src, ADDRri:$addr),
(STH32_V1 GPR32:$src, ADDRri:$addr)>;
def : Pat<(truncstorei8 GPR32:$src, ADDRri:$addr),
(STB32_V1 GPR32:$src, ADDRri:$addr)>;
}

let Predicates = [SBFHasALU32, SBFNewMemEncoding] in {
def : Pat<(store GPR32:$src, ADDRri:$addr),
(STW32_V2 GPR32:$src, ADDRri:$addr)>;
def : Pat<(truncstorei16 GPR32:$src, ADDRri:$addr),
(STH32_V2 GPR32:$src, ADDRri:$addr)>;
def : Pat<(truncstorei8 GPR32:$src, ADDRri:$addr),
(STB32_V2 GPR32:$src, ADDRri:$addr)>;
}

class LOAD32_V1<SBFWidthModifer SizeOp, string Mnemonic, list<dag> Pattern>
class LOAD32_V1<SBFWidthModifer SizeOp, string Mnemonic>
: TYPE_LD_ST<SBF_MEM.Value, SizeOp.Value,
(outs GPR32:$dst),
(ins MEMri:$addr),
Mnemonic # " $dst, [$addr]",
Pattern> {
[]> {
bits<4> dst;
bits<20> addr;

Expand All @@ -1288,12 +1344,12 @@ class LOAD32_V1<SBFWidthModifer SizeOp, string Mnemonic, list<dag> Pattern>
let SBFClass = SBF_LDX;
}

class LOAD32_V2<SBFSizeModifier SizeOp, string Mnemonic, list<dag> Pattern>
class LOAD32_V2<SBFSizeModifier SizeOp, string Mnemonic>
: TYPE_LD_ST_V2<SizeOp.Value, SBF_X.Value,
(outs GPR32:$dst),
(ins MEMri:$addr),
Mnemonic # " $dst, [$addr]",
Pattern> {
[]> {
bits<4> dst;
bits<20> addr;

Expand All @@ -1305,19 +1361,35 @@ class LOAD32_V2<SBFSizeModifier SizeOp, string Mnemonic, list<dag> Pattern>


multiclass LOADi32<SBFWidthModifer SizeV1, SBFSizeModifier SizeV2,
string Mnemonic, PatFrag OpNode> {
def _V1 : LOAD32_V1<SizeV1, Mnemonic, [(set i32:$dst, (OpNode ADDRri:$addr))]>,
Requires<[SBFOldMemEncoding]>;
string Mnemonic> {
def _V1 : LOAD32_V1<SizeV1, Mnemonic>, Requires<[SBFOldMemEncoding]>;
let DecoderNamespace = "SBFALU32v2" in {
def _V2 : LOAD32_V2<SizeV2, Mnemonic, [(set i32:$dst, (OpNode ADDRri:$addr))]>,
Requires<[SBFNewMemEncoding]>;
def _V2 : LOAD32_V2<SizeV2, Mnemonic>, Requires<[SBFNewMemEncoding]>;
}
}

let Predicates = [SBFHasALU32], DecoderNamespace = "SBFALU32" in {
defm LDW32 : LOADi32<SBF_W, SBF_W_V2, "ldxw", load>;
defm LDH32 : LOADi32<SBF_H, SBF_H_V2, "ldxh", zextloadi16>;
defm LDB32 : LOADi32<SBF_B, SBF_B_V2, "ldxb", zextloadi8>;
let DecoderNamespace = "SBFALU32" in {
defm LDW32 : LOADi32<SBF_W, SBF_W_V2, "ldxw">;
defm LDH32 : LOADi32<SBF_H, SBF_H_V2, "ldxh">;
defm LDB32 : LOADi32<SBF_B, SBF_B_V2, "ldxb">;
}

let Predicates = [SBFHasALU32, SBFOldMemEncoding] in {
def : Pat<(load ADDRri:$addr),
(LDW32_V1 ADDRri:$addr)>;
def : Pat<(zextloadi16 ADDRri:$addr),
(LDH32_V1 ADDRri:$addr)>;
def : Pat<(zextloadi8 ADDRri:$addr),
(LDB32_V1 ADDRri:$addr)>;
}

let Predicates = [SBFHasALU32, SBFNewMemEncoding] in {
def : Pat<(load ADDRri:$addr),
(LDW32_V2 ADDRri:$addr)>;
def : Pat<(zextloadi16 ADDRri:$addr),
(LDH32_V2 ADDRri:$addr)>;
def : Pat<(zextloadi8 ADDRri:$addr),
(LDB32_V2 ADDRri:$addr)>;
}

let Predicates = [SBFHasALU32, SBFOldMemEncoding] in {
Expand Down

0 comments on commit 63266c1

Please sign in to comment.