[PATCH[[mips] Add octeon branch instructions bbit0/bbit032/bbit1/bbit132
Kai Nacke
kai.nacke at redstar.de
Mon Jan 5 22:12:35 PST 2015
Hi Daniel,
the attached patch adds the octeon branch instructions
bbit0/bbit032/bbit1/bbit132. Test case is included. Please review.
BTW: I did not implement the automatic change of the instruction if the
constant does not fit (e.g. bbit0 $22, 42, foo -> bbit032 $22, 10, foo).
Do you have an suggestion where to implement this? Thanks.
Regards,
Kai
-------------- next part --------------
diff --git a/lib/Target/Mips/Mips64InstrInfo.td b/lib/Target/Mips/Mips64InstrInfo.td
index 4e2dcd8..f664400 100644
--- a/lib/Target/Mips/Mips64InstrInfo.td
+++ b/lib/Target/Mips/Mips64InstrInfo.td
@@ -303,12 +303,46 @@ class SetCC64_I<string opstr, PatFrag cond_op>:
let TwoOperandAliasConstraint = "$rt = $rs";
}
+class CBranchImm<string opstr, DAGOperand opnd, PatFrag cond_op,
+ RegisterOperand RO> :
+ InstSE<(outs), (ins RO:$rs, uimm16_64:$rt, opnd:$offset),
+ !strconcat(opstr, "\t$rs, $rt, $offset"),
+ [(brcond (i32 (cond_op (and (srl RO:$rs, (i64 imm:$rt)),
+ 1), 0)), bb:$offset)], IIBranch,
+ FrmI, opstr> {
+ let isBranch = 1;
+ let isTerminator = 1;
+ let hasDelaySlot = 1;
+ let Defs = [AT];
+}
+
+class CBranchImm32<string opstr, DAGOperand opnd, PatFrag cond_op,
+ RegisterOperand RO> :
+ InstSE<(outs), (ins RO:$rs, uimm16_64:$rt, opnd:$offset),
+ !strconcat(opstr, "\t$rs, $rt, $offset"),
+ [(brcond (i32 (cond_op (and (srl RO:$rs, (add (i64 imm:$rt), 32)),
+ 1), 0)), bb:$offset)], IIBranch,
+ FrmI, opstr> {
+ let isBranch = 1;
+ let isTerminator = 1;
+ let hasDelaySlot = 1;
+ let Defs = [AT];
+}
+
// Unsigned Byte Add
let Pattern = [(set GPR64Opnd:$rd,
(and (add GPR64Opnd:$rs, GPR64Opnd:$rt), 255))] in
def BADDu : ArithLogicR<"baddu", GPR64Opnd, 1, II_BADDU>,
ADD_FM<0x1c, 0x28>;
+// Branch on Bit Clear /+32
+def BBIT0 : CBranchImm<"bbit0", brtarget, seteq, GPR64Opnd>, BEQ_FM<0x32>;
+def BBIT032: CBranchImm32<"bbit032", brtarget, seteq, GPR64Opnd>, BEQ_FM<0x36>;
+
+// Branch on Bit Set /+32
+def BBIT1 : CBranchImm<"bbit1", brtarget, setne, GPR64Opnd>, BEQ_FM<0x3a>;
+def BBIT132: CBranchImm32<"bbit132", brtarget, setne, GPR64Opnd>, BEQ_FM<0x3e>;
+
// Multiply Doubleword to GPR
let Defs = [HI0, LO0, P0, P1, P2] in
def DMUL : ArithLogicR<"dmul", GPR64Opnd, 1, II_DMUL, mul>,
diff --git a/test/MC/Mips/octeon-instructions.s b/test/MC/Mips/octeon-instructions.s
index 2922744..e98bbe4 100644
--- a/test/MC/Mips/octeon-instructions.s
+++ b/test/MC/Mips/octeon-instructions.s
@@ -3,6 +3,10 @@
# CHECK: baddu $9, $6, $7 # encoding: [0x70,0xc7,0x48,0x28]
# CHECK: baddu $17, $18, $19 # encoding: [0x72,0x53,0x88,0x28]
# CHECK: baddu $2, $2, $3 # encoding: [0x70,0x43,0x10,0x28]
+# CHECK: bbit0 $19, 22, foo # encoding: [0xca,0x76,A,A]
+# CHECK: bbit032 $fp, 11, foo # encoding: [0xdb,0xcb,A,A]
+# CHECK: bbit1 $3, 31, foo # encoding: [0xe8,0x7f,A,A]
+# CHECK: bbit132 $24, 10, foo # encoding: [0xfb,0x0a,A,A]
# CHECK: cins $25, $10, 22, 2 # encoding: [0x71,0x59,0x15,0xb2]
# CHECK: cins $9, $9, 17, 29 # encoding: [0x71,0x29,0xec,0x72]
# CHECK: cins32 $15, $2, 18, 8 # encoding: [0x70,0x4f,0x44,0xb3]
@@ -46,9 +50,14 @@
# CHECK: vmulu $sp, $10, $17 # encoding: [0x71,0x51,0xe8,0x0f]
# CHECK: vmulu $27, $27, $6 # encoding: [0x73,0x66,0xd8,0x0f]
+foo:
baddu $9, $6, $7
baddu $17, $18, $19
baddu $2, $3
+ bbit0 $19, 22, foo
+ bbit032 $30, 11, foo
+ bbit1 $3, 31, foo
+ bbit132 $24, 10, foo
cins $25, $10, 22, 2
cins $9, 17, 29
cins32 $15, $2, 18, 8
More information about the llvm-commits
mailing list