This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
[ARM] Support ARMv8.2 RAS extension.
- From: Matthew Wahab <matthew dot wahab at foss dot arm dot com>
- To: "binutils at sourceware dot org" <binutils at sourceware dot org>
- Date: Tue, 8 Dec 2015 16:07:55 +0000
- Subject: [ARM] Support ARMv8.2 RAS extension.
- Authentication-results: sourceware.org; auth=none
Hello,
ARMv8.2 includes the RAS extension which adds an instruction, ESB, and a
number of coprocessor registers. This patch adds the instruction to
binutils, making it available when -march=armv8.2-a is selected. It also
adds tests for the instruction and for the coprocessor registers.
Tested with arm-none-linux-gnueabihf with cross-compiled check-binutils
and check-gas.
Ok for trunk?
Matthew
gas/
2015-12-08 Matthew Wahab <matthew.wahab@arm.com>
* config/tc-arm.c (arm_ext_v8_2): New.
(insns): Add "esb".
gas/testsuite/
2015-12-08 Matthew Wahab <matthew.wahab@arm.com>
* gas/arm/armv8_2-a.d: New.
* gas/arm/armv8_2-a.s: New.
opcodes/
2015-12-08 Matthew Wahab <matthew.wahab@arm.com>
* arm-dis.c (arm_opcodes): Add "esb".
(thumb_opcodes): Likewise.
>From 7173b99ee6ea91c12a350ac460e7215c5918b9e2 Mon Sep 17 00:00:00 2001
From: Matthew Wahab <matthew.wahab@arm.com>
Date: Thu, 12 Nov 2015 16:54:33 +0000
Subject: [PATCH] [ARM] Support ARMv8.2 RAS extension.
Change-Id: I29c0a99e3ded0ac1557b5475a96f85ba7d0b72c4
---
gas/config/tc-arm.c | 9 +++++++
gas/testsuite/gas/arm/armv8_2-a.d | 51 +++++++++++++++++++++++++++++++++++++++
gas/testsuite/gas/arm/armv8_2-a.s | 44 +++++++++++++++++++++++++++++++++
opcodes/arm-dis.c | 8 ++++++
4 files changed, 112 insertions(+)
create mode 100644 gas/testsuite/gas/arm/armv8_2-a.d
create mode 100644 gas/testsuite/gas/arm/armv8_2-a.s
diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c
index 8ea1e8d..9013dd7 100644
--- a/gas/config/tc-arm.c
+++ b/gas/config/tc-arm.c
@@ -208,6 +208,8 @@ static const arm_feature_set arm_ext_os = ARM_FEATURE_CORE_LOW (ARM_EXT_OS);
static const arm_feature_set arm_ext_adiv = ARM_FEATURE_CORE_LOW (ARM_EXT_ADIV);
static const arm_feature_set arm_ext_virt = ARM_FEATURE_CORE_LOW (ARM_EXT_VIRT);
static const arm_feature_set arm_ext_pan = ARM_FEATURE_CORE_HIGH (ARM_EXT2_PAN);
+static const arm_feature_set arm_ext_v8_2 =
+ ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_2A);
static const arm_feature_set arm_arch_any = ARM_ANY;
static const arm_feature_set arm_arch_full = ARM_FEATURE (-1, -1, -1);
@@ -19223,6 +19225,13 @@ static const struct asm_opcode insns[] =
TUEc("crc32ch",1200240, fad0f090, 3, (RR, oRR, RR), crc32ch),
TUEc("crc32cw",1400240, fad0f0a0, 3, (RR, oRR, RR), crc32cw),
+ /* ARMv8.2 RAS extension. */
+#undef ARM_VARIANT
+#define ARM_VARIANT & arm_ext_v8_2
+#undef THUMB_VARIANT
+#define THUMB_VARIANT & arm_ext_v8_2
+ TUE ("esb", 320f010, f3af8010, 0, (), noargs, noargs),
+
#undef ARM_VARIANT
#define ARM_VARIANT & fpu_fpa_ext_v1 /* Core FPA instruction set (V1). */
#undef THUMB_VARIANT
diff --git a/gas/testsuite/gas/arm/armv8_2-a.d b/gas/testsuite/gas/arm/armv8_2-a.d
new file mode 100644
index 0000000..92845de
--- /dev/null
+++ b/gas/testsuite/gas/arm/armv8_2-a.d
@@ -0,0 +1,51 @@
+#name: ARMv8.2-A
+#objdump: -dr
+
+.*: +file format .*arm.*
+
+Disassembly of section .text:
+
+[0-9a-f]+ <.*>:
+ [0-9a-f]+: e320f010 esb
+
+[0-9a-f]+ <.*>:
+ [0-9a-f]+: f3af 8010 esb
+
+[0-9a-f]+ <.*>:
+ [0-9a-f]+: ee100f11 mrc 15, 0, r0, cr0, cr1, \{0\}
+ [0-9a-f]+: ee100fd2 mrc 15, 0, r0, cr0, cr2, \{6\}
+ [0-9a-f]+: ee150f13 mrc 15, 0, r0, cr5, cr3, \{0\}
+ [0-9a-f]+: ee150f33 mrc 15, 0, r0, cr5, cr3, \{1\}
+ [0-9a-f]+: ee051f33 mcr 15, 0, r1, cr5, cr3, \{1\}
+ [0-9a-f]+: ee150f14 mrc 15, 0, r0, cr5, cr4, \{0\}
+ [0-9a-f]+: ee150f34 mrc 15, 0, r0, cr5, cr4, \{1\}
+ [0-9a-f]+: ee051f34 mcr 15, 0, r1, cr5, cr4, \{1\}
+ [0-9a-f]+: ee150f54 mrc 15, 0, r0, cr5, cr4, \{2\}
+ [0-9a-f]+: ee051f54 mcr 15, 0, r1, cr5, cr4, \{2\}
+ [0-9a-f]+: ee150f74 mrc 15, 0, r0, cr5, cr4, \{3\}
+ [0-9a-f]+: ee051f74 mcr 15, 0, r1, cr5, cr4, \{3\}
+ [0-9a-f]+: ee150f94 mrc 15, 0, r0, cr5, cr4, \{4\}
+ [0-9a-f]+: ee150fb4 mrc 15, 0, r0, cr5, cr4, \{5\}
+ [0-9a-f]+: ee051fb4 mcr 15, 0, r1, cr5, cr4, \{5\}
+ [0-9a-f]+: ee150ff4 mrc 15, 0, r0, cr5, cr4, \{7\}
+ [0-9a-f]+: ee051ff4 mcr 15, 0, r1, cr5, cr4, \{7\}
+ [0-9a-f]+: ee150f15 mrc 15, 0, r0, cr5, cr5, \{0\}
+ [0-9a-f]+: ee051f15 mcr 15, 0, r1, cr5, cr5, \{0\}
+ [0-9a-f]+: ee150f35 mrc 15, 0, r0, cr5, cr5, \{1\}
+ [0-9a-f]+: ee051f35 mcr 15, 0, r1, cr5, cr5, \{1\}
+ [0-9a-f]+: ee150f95 mrc 15, 0, r0, cr5, cr5, \{4\}
+ [0-9a-f]+: ee051f95 mcr 15, 0, r1, cr5, cr5, \{4\}
+ [0-9a-f]+: ee150fb5 mrc 15, 0, r0, cr5, cr5, \{5\}
+ [0-9a-f]+: ee051fb5 mcr 15, 0, r1, cr5, cr5, \{5\}
+ [0-9a-f]+: ee1c0f31 mrc 15, 0, r0, cr12, cr1, \{1\}
+ [0-9a-f]+: ee0c1f31 mcr 15, 0, r1, cr12, cr1, \{1\}
+ [0-9a-f]+: ee910f91 mrc 15, 4, r0, cr1, cr1, \{4\}
+ [0-9a-f]+: ee811f91 mcr 15, 4, r1, cr1, cr1, \{4\}
+ [0-9a-f]+: ee950f72 mrc 15, 4, r0, cr5, cr2, \{3\}
+ [0-9a-f]+: ee851f72 mcr 15, 4, r1, cr5, cr2, \{3\}
+ [0-9a-f]+: ee910f31 mrc 15, 4, r0, cr1, cr1, \{1\}
+ [0-9a-f]+: ee811f31 mcr 15, 4, r1, cr1, cr1, \{1\}
+ [0-9a-f]+: ee9c0f31 mrc 15, 4, r0, cr12, cr1, \{1\}
+ [0-9a-f]+: ee8c1f31 mcr 15, 4, r1, cr12, cr1, \{1\}
+ [0-9a-f]+: eed10f11 mrc 15, 6, r0, cr1, cr1, \{0\}
+ [0-9a-f]+: eec11f11 mcr 15, 6, r1, cr1, cr1, \{0\}
diff --git a/gas/testsuite/gas/arm/armv8_2-a.s b/gas/testsuite/gas/arm/armv8_2-a.s
new file mode 100644
index 0000000..a27ac63
--- /dev/null
+++ b/gas/testsuite/gas/arm/armv8_2-a.s
@@ -0,0 +1,44 @@
+ /* ARMv8.2 features. */
+
+ /* RAS instructions. */
+A1:
+ .arm
+ esb
+T1: .thumb
+ esb
+
+ /* RAS system registers. */
+ .macro test_sysreg Opc1 CRn CRm Opc2 rw
+ mrc p15, \Opc1,\() r0, \CRn\(), \CRm\(), \Opc2\()
+ .if \rw
+ mcr p15, \Opc1\(), r1, \CRn\(), \CRm\(), \Opc2\()
+ .endif
+ .endm
+
+A2:
+ .arm
+ test_sysreg 0 c0 c1 0 0
+ test_sysreg 0 c0 c2 6 0
+ test_sysreg 0 c5 c3 0 0
+ test_sysreg 0 c5 c3 1 1
+
+ test_sysreg 0 c5 c4 0 0
+ test_sysreg 0 c5 c4 1 1
+ test_sysreg 0 c5 c4 2 1
+ test_sysreg 0 c5 c4 3 1
+ test_sysreg 0 c5 c4 4 0
+ test_sysreg 0 c5 c4 5 1
+ test_sysreg 0 c5 c4 7 1
+
+ test_sysreg 0 c5 c5 0 1
+ test_sysreg 0 c5 c5 1 1
+ test_sysreg 0 c5 c5 4 1
+ test_sysreg 0 c5 c5 5 1
+
+ test_sysreg 0 c12 c1 1 1
+ test_sysreg 4 c1 c1 4 1
+ test_sysreg 4 c5 c2 3 1
+ test_sysreg 4 c1 c1 1 1
+ test_sysreg 4 c12 c1 1 1
+
+ test_sysreg 6 c1 c1 0 1
diff --git a/opcodes/arm-dis.c b/opcodes/arm-dis.c
index 94fe304..ba8e7b6 100644
--- a/opcodes/arm-dis.c
+++ b/opcodes/arm-dis.c
@@ -1576,6 +1576,10 @@ static const struct opcode32 arm_opcodes[] =
0x00a00090, 0x0fa000f0,
"%22?sumlal%20's%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"},
+ /* V8.2 RAS extension instructions. */
+ {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_2A),
+ 0xe320f010, 0xffffffff, "esb"},
+
/* V8 instructions. */
{ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
0x0320f005, 0x0fffffff, "sevl"},
@@ -2524,6 +2528,10 @@ static const struct opcode16 thumb_opcodes[] =
makes heavy use of special-case bit patterns. */
static const struct opcode32 thumb32_opcodes[] =
{
+ /* ARM V8.2 RAS extension instructions. */
+ {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_2A),
+ 0xf3af8010, 0xffffffff, "esb"},
+
/* V8 instructions. */
{ARM_FEATURE_CORE_LOW (ARM_EXT_V8),
0xf3af8005, 0xffffffff, "sevl%c.w"},
--
2.1.4