openbsd-ports/devel/llvm/patches/patch-lib_Target_Sparc_SparcInstrInfo_td
ajacoutot aa81e92d88 Merge from upstream:
- [Sparc] Add mnemonic aliases for flush, stb, stba, sth, and stha
- [Sparc] Add membar assembler tags

from Brad (maintainer)
2018-11-14 09:07:41 +00:00

60 lines
2.3 KiB
Plaintext

$OpenBSD: patch-lib_Target_Sparc_SparcInstrInfo_td,v 1.7 2018/11/14 09:07:41 ajacoutot Exp $
- [Sparc] allow tls_add/tls_call syntax in assembler parser
- [Sparc] Add membar assembler tags
- [Sparc] Use synthetic instruction clr to zero register instead of sethi
Using `clr reg`/`mov %g0, reg`/`or %g0, %g0, reg` to zero a register
looks much better than `sethi 0, reg`.
Index: lib/Target/Sparc/SparcInstrInfo.td
--- lib/Target/Sparc/SparcInstrInfo.td.orig
+++ lib/Target/Sparc/SparcInstrInfo.td
@@ -121,6 +121,16 @@ def MEMri : Operand<iPTR> {
def TLSSym : Operand<iPTR>;
+def SparcMembarTagAsmOperand : AsmOperandClass {
+ let Name = "MembarTag";
+ let ParserMethod = "parseMembarTag";
+}
+
+def MembarTag : Operand<i32> {
+ let PrintMethod = "printMembarTag";
+ let ParserMatchClass = SparcMembarTagAsmOperand;
+}
+
// Branch targets have OtherVT type.
def brtarget : Operand<OtherVT> {
let EncoderMethod = "getBranchTargetOpValue";
@@ -1313,7 +1323,7 @@ let Defs = [FCC0], rd = 0, isCodeGenOnly = 1 in {
//===----------------------------------------------------------------------===//
// Instructions for Thread Local Storage(TLS).
//===----------------------------------------------------------------------===//
-let isCodeGenOnly = 1, isAsmParserOnly = 1 in {
+let isAsmParserOnly = 1 in {
def TLS_ADDrr : F3_1<2, 0b000000,
(outs IntRegs:$rd),
(ins IntRegs:$rs1, IntRegs:$rs2, TLSSym:$sym),
@@ -1508,8 +1518,8 @@ def : Pat<(ctpop i32:$src),
(POPCrr (SRLri $src, 0))>;
let Predicates = [HasV9], hasSideEffects = 1, rd = 0, rs1 = 0b01111 in
- def MEMBARi : F3_2<2, 0b101000, (outs), (ins simm13Op:$simm13),
- "membar $simm13", []>;
+ def MEMBARi : F3_2<2, 0b101000, (outs), (ins MembarTag:$tag),
+ "membar $tag", []>;
// The CAS instruction, unlike other instructions, only comes in a
// form which requires an ASI be provided. The ASI value hardcoded
@@ -1599,6 +1609,9 @@ let Predicates = [HasV9] in {
// Non-Instruction Patterns
//===----------------------------------------------------------------------===//
+// Zero immediate.
+def : Pat<(i32 0),
+ (ORrr (i32 G0), (i32 G0))>;
// Small immediates.
def : Pat<(i32 simm13:$val),
(ORri (i32 G0), imm:$val)>;