From d32974f9dc069e2399e1f8eb9097effbb110c57d Mon Sep 17 00:00:00 2001 From: James Y Knight Date: Mon, 6 Jul 2015 16:01:04 +0000 Subject: [PATCH] [Sparc] Add support for flush instruction. Differential Revision: http://reviews.llvm.org/D9833 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@241460 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/Sparc/SparcInstrAliases.td | 3 +++ lib/Target/Sparc/SparcInstrInfo.td | 14 ++++++++++++++ test/MC/Sparc/sparc-mem-instructions.s | 10 ++++++++++ 3 files changed, 27 insertions(+) diff --git a/lib/Target/Sparc/SparcInstrAliases.td b/lib/Target/Sparc/SparcInstrAliases.td index 670e9e989c8..12d05dd4523 100644 --- a/lib/Target/Sparc/SparcInstrAliases.td +++ b/lib/Target/Sparc/SparcInstrAliases.td @@ -306,6 +306,9 @@ def : InstAlias<"mov $rs2, $rd", (ORrr IntRegs:$rd, G0, IntRegs:$rs2)>; // mov simm13, rd -> or %g0, simm13, rd def : InstAlias<"mov $simm13, $rd", (ORri IntRegs:$rd, G0, i32imm:$simm13)>; +// flush -> flush %g0 +def : InstAlias<"flush", (FLUSH), 0>; + // set value, rd // (turns into a sequence of sethi+or, depending on the value) // def : InstAlias<"set $val, $rd", (ORri IntRegs:$rd, (SETHIi (HI22 imm:$val)), (LO10 imm:$val))>; diff --git a/lib/Target/Sparc/SparcInstrInfo.td b/lib/Target/Sparc/SparcInstrInfo.td index a02bae07a33..39abc727f26 100644 --- a/lib/Target/Sparc/SparcInstrInfo.td +++ b/lib/Target/Sparc/SparcInstrInfo.td @@ -828,6 +828,20 @@ let rd = 0 in def UNIMP : F2_1<0b000, (outs), (ins i32imm:$imm22), "unimp $imm22", []>; +// Section B.32 - Flush Instruction Memory +let rd = 0 in { + def FLUSHrr : F3_1<2, 0b111011, (outs), (ins MEMrr:$addr), + "flush $addr", []>; + def FLUSHri : F3_2<2, 0b111011, (outs), (ins MEMri:$addr), + "flush $addr", []>; + + // The no-arg FLUSH is only here for the benefit of the InstAlias + // "flush", which cannot seem to use FLUSHrr, due to the inability + // to construct a MEMrr with fixed G0 registers. + let rs1 = 0, rs2 = 0 in + def FLUSH : F3_1<2, 0b111011, (outs), (ins), "flush %g0", []>; +} + // Section B.33 - Floating-point Operate (FPop) Instructions // Convert Integer to Floating-point Instructions, p. 141 diff --git a/test/MC/Sparc/sparc-mem-instructions.s b/test/MC/Sparc/sparc-mem-instructions.s index ba4c0f2d104..c10c8781fd8 100644 --- a/test/MC/Sparc/sparc-mem-instructions.s +++ b/test/MC/Sparc/sparc-mem-instructions.s @@ -72,3 +72,13 @@ st %o2, [%g1] ! CHECK: sta %o2, [%i0+%l6] 131 ! encoding: [0xd4,0xa6,0x10,0x76] sta %o2, [%i0 + %l6] 131 + + ! CHECK: flush %g1+%g2 ! encoding: [0x81,0xd8,0x40,0x02] + flush %g1 + %g2 + ! CHECK: flush %g1+8 ! encoding: [0x81,0xd8,0x60,0x08] + flush %g1 + 8 + ! CHECK: flush %g1 ! encoding: [0x81,0xd8,0x40,0x00] + flush %g1 + ! Not specified in manual, but accepted by gas. + ! CHECK: flush %g0 ! encoding: [0x81,0xd8,0x00,0x00] + flush -- 2.34.1