]> granicus.if.org Git - llvm/commitdiff
[AArch64] Add v8.5-a Memory Tagging STZGM instruction
authorDavid Spickett <david.spickett@arm.com>
Mon, 1 Apr 2019 14:56:37 +0000 (14:56 +0000)
committerDavid Spickett <david.spickett@arm.com>
Mon, 1 Apr 2019 14:56:37 +0000 (14:56 +0000)
This instruction writes a block of allocation tags
and stores zero to the associated data locations.

It differs from STGM by 1 bit and has the same
arguments.

The specification can be found here:
https://developer.arm.com/docs/ddi0596/c

Differential Revision: https://reviews.llvm.org/D60065

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@357397 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/AArch64/AArch64InstrInfo.td
test/MC/AArch64/armv8.5a-mte-error.s
test/MC/AArch64/armv8.5a-mte.s
test/MC/Disassembler/AArch64/armv8.5a-mte.txt

index 347f0104c35be78313e6f60fe90b19f2edc1bc81..ee496fa5d438f074bea2b9c9be3197ba53bc05fe 100644 (file)
@@ -1261,6 +1261,10 @@ def LDGM : MemTagVector<1, "ldgm", "\t$Rt, [$Rn]",
 def STGM : MemTagVector<0, "stgm", "\t$Rt, [$Rn]",
                    (outs), (ins GPR64:$Rt, GPR64sp:$Rn)>;
 
+def STZGM : MemTagVector<0, "stzgm", "\t$Rt, [$Rn]",
+                   (outs), (ins GPR64:$Rt, GPR64sp:$Rn)> {
+  let Inst{23} = 0;
+}
 
 defm STG   : MemTagStore<0b00, "stg">;
 defm STZG  : MemTagStore<0b01, "stzg">;
index d9af3ba265b9822b6aceb7e78b8dfb23a50b5852..94d310884e9e17a51e2f2adec43f92d510db5dad 100644 (file)
@@ -858,3 +858,26 @@ stgm x0, [#1]
 // CHECK-NEXT: stgm #1, [x1]
 // CHECK:      invalid operand for instruction
 // CHECK-NEXT: stgm x0, [#1]
+
+stzgm
+stzgm x0
+stzgm sp, [x0]
+stzgm w0, [x0]
+stzgm x0, [w0]
+stzgm #1, [x1]
+stzgm x0, [#1]
+
+// CHECK:      too few operands for instruction
+// CHECK-NEXT: stzgm
+// CHECK:      too few operands for instruction
+// CHECK-NEXT: stzgm x0
+// CHECK:      invalid operand for instruction
+// CHECK-NEXT: stzgm sp, [x0]
+// CHECK:      invalid operand for instruction
+// CHECK-NEXT: stzgm w0, [x0]
+// CHECK:      invalid operand for instruction
+// CHECK-NEXT: stzgm x0, [w0]
+// CHECK:      invalid operand for instruction
+// CHECK-NEXT: stzgm #1, [x1]
+// CHECK:      invalid operand for instruction
+// CHECK-NEXT: stzgm x0, [#1]
index bd0d99e37a93e264366a7413f315c88ff6ba3102..176ac5fabd2ce4bbba08dd3bd96952aa86ce9dd6 100644 (file)
@@ -542,6 +542,7 @@ ldgm xzr, [x2]
 // CHECK: ldgm x1, [sp]  // encoding: [0xe1,0x03,0xe0,0xd9]
 // CHECK: ldgm xzr, [x2] // encoding: [0x5f,0x00,0xe0,0xd9]
 
+// NOMTE: instruction requires: mte
 // NOMTE: instruction requires: mte
 // NOMTE: instruction requires: mte
 
@@ -555,3 +556,16 @@ stgm xzr, [x2]
 
 // NOMTE: instruction requires: mte
 // NOMTE: instruction requires: mte
+// NOMTE: instruction requires: mte
+
+stzgm x0, [x1]
+stzgm x1, [sp]
+stzgm xzr, [x2]
+
+// CHECK: stzgm x0, [x1]  // encoding: [0x20,0x00,0x20,0xd9]
+// CHECK: stzgm x1, [sp]  // encoding: [0xe1,0x03,0x20,0xd9]
+// CHECK: stzgm xzr, [x2] // encoding: [0x5f,0x00,0x20,0xd9]
+
+// NOMTE: instruction requires: mte
+// NOMTE: instruction requires: mte
+// NOMTE: instruction requires: mte
index 4cded66f40c1e1febb0073f0537af9f062eea6e8..a32829e207b10d9f104955d73afc7d024c81615b 100644 (file)
 [0x20,0x00,0xa0,0xd9]
 [0xe1,0x03,0xa0,0xd9]
 [0x5f,0x00,0xa0,0xd9]
+[0x20,0x00,0x20,0xd9]
+[0xe1,0x03,0x20,0xd9]
+[0x5f,0x00,0x20,0xd9]
 
 # CHECK: ldgm x0, [x1]
 # CHECK: ldgm x1, [sp]
 # CHECK: stgm x0, [x1]
 # CHECK: stgm x1, [sp]
 # CHECK: stgm xzr, [x2]
+# CHECK: stzgm x0, [x1]
+# CHECK: stzgm x1, [sp]
+# CHECK: stzgm xzr, [x2]
 
 # NOMTE:      warning: invalid instruction encoding
 # NOMTE-NEXT: [0x20,0x00,0xe0,0xd9]
 # NOMTE-NEXT: [0xe1,0x03,0xa0,0xd9]
 # NOMTE:      warning: invalid instruction encoding
 # NOMTE-NEXT: [0x5f,0x00,0xa0,0xd9]
+# NOMTE:      warning: invalid instruction encoding
+# NOMTE-NEXT: [0x20,0x00,0x20,0xd9]
+# NOMTE:      warning: invalid instruction encoding
+# NOMTE-NEXT: [0xe1,0x03,0x20,0xd9]
+# NOMTE:      warning: invalid instruction encoding
+# NOMTE-NEXT: [0x5f,0x00,0x20,0xd9]
 
 [0x60,0x76,0x08,0xd5]
 [0x81,0x76,0x08,0xd5]