summaryrefslogtreecommitdiffstats
path: root/llvm/test
diff options
context:
space:
mode:
authorAlex Bradbury <asb@lowrisc.org>2017-12-07 12:50:32 +0000
committerAlex Bradbury <asb@lowrisc.org>2017-12-07 12:50:32 +0000
commit9f6aec4b7aab9a0c0d33bff634af0e148ed580ef (patch)
tree3c927837c770161d62d555607491b2ba10679f83 /llvm/test
parent87a54d611042449aff1c8f6ceee417af85dee193 (diff)
downloadbcm5719-llvm-9f6aec4b7aab9a0c0d33bff634af0e148ed580ef.tar.gz
bcm5719-llvm-9f6aec4b7aab9a0c0d33bff634af0e148ed580ef.zip
[RISCV] MC layer support for load/store instructions of the C (compressed) extension
Differential Revision: https://reviews.llvm.org/D40001 Patch by Shiva Chen. llvm-svn: 320037
Diffstat (limited to 'llvm/test')
-rw-r--r--llvm/test/MC/RISCV/rv32c-invalid.s18
-rw-r--r--llvm/test/MC/RISCV/rv32c-valid.s23
-rw-r--r--llvm/test/MC/RISCV/rv64c-invalid.s18
-rw-r--r--llvm/test/MC/RISCV/rv64c-valid.s19
4 files changed, 78 insertions, 0 deletions
diff --git a/llvm/test/MC/RISCV/rv32c-invalid.s b/llvm/test/MC/RISCV/rv32c-invalid.s
new file mode 100644
index 00000000000..c3403aa632b
--- /dev/null
+++ b/llvm/test/MC/RISCV/rv32c-invalid.s
@@ -0,0 +1,18 @@
+# RUN: not llvm-mc -triple=riscv32 -mattr=+c < %s 2>&1 | FileCheck %s
+
+## GPRC
+c.lw ra, 4(sp) # CHECK: :[[@LINE]]:7: error: invalid operand for instruction
+c.sw sp, 4(sp) # CHECK: :[[@LINE]]:7: error: invalid operand for instruction
+
+## GPRNoX0
+c.lwsp x0, 4(sp) # CHECK: :[[@LINE]]:9: error: invalid operand for instruction
+c.lwsp zero, 4(sp) # CHECK: :[[@LINE]]:9: error: invalid operand for instruction
+
+# Out of range immediates
+
+## uimm8_lsb00
+c.lwsp ra, 256(sp) # CHECK: :[[@LINE]]:13: error: immediate must be a multiple of 4 bytes in the range [0, 252]
+c.swsp ra, -4(sp) # CHECK: :[[@LINE]]:13: error: immediate must be a multiple of 4 bytes in the range [0, 252]
+## uimm7_lsb00
+c.lw s0, -4(sp) # CHECK: :[[@LINE]]:11: error: immediate must be a multiple of 4 bytes in the range [0, 124]
+c.sw s0, 128(sp) # CHECK: :[[@LINE]]:11: error: immediate must be a multiple of 4 bytes in the range [0, 124]
diff --git a/llvm/test/MC/RISCV/rv32c-valid.s b/llvm/test/MC/RISCV/rv32c-valid.s
new file mode 100644
index 00000000000..86c2dff5698
--- /dev/null
+++ b/llvm/test/MC/RISCV/rv32c-valid.s
@@ -0,0 +1,23 @@
+# RUN: llvm-mc -triple=riscv32 -mattr=+c -show-encoding < %s \
+# RUN: | FileCheck -check-prefixes=CHECK,CHECK-INST %s
+# RUN: llvm-mc -triple=riscv64 -mattr=+c -show-encoding < %s \
+# RUN: | FileCheck -check-prefixes=CHECK,CHECK-INST %s
+# RUN: llvm-mc -filetype=obj -triple riscv32 -mattr=+c < %s \
+# RUN: | llvm-objdump -mattr=+c -d - | FileCheck -check-prefix=CHECK-INST %s
+# RUN: llvm-mc -filetype=obj -triple riscv64 -mattr=+c < %s \
+# RUN: | llvm-objdump -mattr=+c -d - | FileCheck -check-prefix=CHECK-INST %s
+
+# TODO: more exhaustive testing of immediate encoding.
+
+# CHECK-INST: c.lwsp ra, 0(sp)
+# CHECK: encoding: [0x82,0x40]
+c.lwsp ra, 0(sp)
+# CHECK-INST: c.swsp ra, 252(sp)
+# CHECK: encoding: [0x86,0xdf]
+c.swsp ra, 252(sp)
+# CHECK-INST: c.lw a2, 0(a0)
+# CHECK: encoding: [0x10,0x41]
+c.lw a2, 0(a0)
+# CHECK-INST: c.sw a5, 124(a3)
+# CHECK: encoding: [0xfc,0xde]
+c.sw a5, 124(a3)
diff --git a/llvm/test/MC/RISCV/rv64c-invalid.s b/llvm/test/MC/RISCV/rv64c-invalid.s
new file mode 100644
index 00000000000..1dcf5e40a8a
--- /dev/null
+++ b/llvm/test/MC/RISCV/rv64c-invalid.s
@@ -0,0 +1,18 @@
+# RUN: not llvm-mc -triple=riscv64 -mattr=+c < %s 2>&1 | FileCheck %s
+
+## GPRC
+c.ld ra, 4(sp) # CHECK: :[[@LINE]]:6: error: invalid operand for instruction
+c.sd sp, 4(sp) # CHECK: :[[@LINE]]:6: error: invalid operand for instruction
+
+## GPRNoX0
+c.ldsp x0, 4(sp) # CHECK: :[[@LINE]]:9: error: invalid operand for instruction
+c.ldsp zero, 4(sp) # CHECK: :[[@LINE]]:9: error: invalid operand for instruction
+
+# Out of range immediates
+
+## uimm9_lsb000
+c.ldsp ra, 512(sp) # CHECK: :[[@LINE]]:13: error: immediate must be a multiple of 8 bytes in the range [0, 504]
+c.sdsp ra, -8(sp) # CHECK: :[[@LINE]]:13: error: immediate must be a multiple of 8 bytes in the range [0, 504]
+## uimm8_lsb000
+c.ld s0, -8(sp) # CHECK: :[[@LINE]]:11: error: immediate must be a multiple of 8 bytes in the range [0, 248]
+c.sd s0, 256(sp) # CHECK: :[[@LINE]]:11: error: immediate must be a multiple of 8 bytes in the range [0, 248]
diff --git a/llvm/test/MC/RISCV/rv64c-valid.s b/llvm/test/MC/RISCV/rv64c-valid.s
new file mode 100644
index 00000000000..9521f9ebd08
--- /dev/null
+++ b/llvm/test/MC/RISCV/rv64c-valid.s
@@ -0,0 +1,19 @@
+# RUN: llvm-mc -triple=riscv64 -mattr=+c -show-encoding < %s \
+# RUN: | FileCheck -check-prefixes=CHECK,CHECK-INST %s
+# RUN: llvm-mc -filetype=obj -triple riscv64 -mattr=+c < %s \
+# RUN: | llvm-objdump -mattr=+c -d - | FileCheck -check-prefix=CHECK-INST %s
+
+# TODO: more exhaustive testing of immediate encoding.
+
+# CHECK-INST: c.ldsp ra, 0(sp)
+# CHECK: encoding: [0x82,0x60]
+c.ldsp ra, 0(sp)
+# CHECK-INST: c.sdsp ra, 504(sp)
+# CHECK: encoding: [0x86,0xff]
+c.sdsp ra, 504(sp)
+# CHECK-INST: c.ld a4, 0(a3)
+# CHECK: encoding: [0x98,0x62]
+c.ld a4, 0(a3)
+# CHECK-INST: c.sd a5, 248(a3)
+# CHECK: encoding: [0xfc,0xfe]
+c.sd a5, 248(a3)
OpenPOWER on IntegriCloud