-
Notifications
You must be signed in to change notification settings - Fork 12.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[RISCV] Implement assembler pseudo instructions for RV32I and RV64I
Adds the assembler pseudo instructions of RV32I and RV64I which can be mapped to a single canonical instruction. The missing pseudo instructions (e.g., call, tail, ...) are marked as TODO. Other things, like for example PCREL_LO, have to be implemented first. Currently, alias emission is disabled by default to keep the patch minimal. Alias emission by default will be enabled in a subsequent patch which also updates all affected tests. Note that this patch should actually break the floating point MC tests. However, the used FileCheck configuration is not tight enought to detect the breakage. Differential Revision: https://reviews.llvm.org/D40902 Patch by Mario Werner. llvm-svn: 320487
- Loading branch information
Showing
8 changed files
with
288 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,8 @@ | ||
| # RUN: not llvm-mc %s -triple=riscv32 -riscv-no-aliases 2>&1 | FileCheck %s | ||
| # RUN: not llvm-mc %s -triple=riscv32 -riscv-no-aliases=false 2>&1 | FileCheck %s | ||
|
|
||
| # TODO ld | ||
| # TODO sd | ||
|
|
||
| negw x1, x2 # CHECK: :[[@LINE]]:1: error: instruction use requires an option to be enabled | ||
| sext.w x3, x4 # CHECK: :[[@LINE]]:1: error: instruction use requires an option to be enabled |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,20 @@ | ||
| # RUN: llvm-mc %s -triple=riscv32 -riscv-no-aliases \ | ||
| # RUN: | FileCheck -check-prefixes=CHECK-INST %s | ||
| # RUN: llvm-mc %s -triple=riscv32 -riscv-no-aliases=false \ | ||
| # RUN: | FileCheck -check-prefixes=CHECK-ALIAS %s | ||
| # RUN: llvm-mc -filetype=obj -triple riscv32 < %s \ | ||
| # RUN: | llvm-objdump -d -riscv-no-aliases - \ | ||
| # RUN: | FileCheck -check-prefixes=CHECK-INST %s | ||
| # RUN: llvm-mc -filetype=obj -triple riscv32 < %s \ | ||
| # RUN: | llvm-objdump -d -riscv-no-aliases=false - \ | ||
| # RUN: | FileCheck -check-prefixes=CHECK-ALIAS %s | ||
|
|
||
| # CHECK-INST: csrrs t4, 3202, zero | ||
| # CHECK-ALIAS: rdinstreth t4 | ||
| rdinstreth x29 | ||
| # CHECK-INST: csrrs s11, 3200, zero | ||
| # CHECK-ALIAS: rdcycleh s11 | ||
| rdcycleh x27 | ||
| # CHECK-INST: csrrs t3, 3201, zero | ||
| # CHECK-ALIAS: rdtimeh t3 | ||
| rdtimeh x28 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,6 @@ | ||
| # RUN: not llvm-mc %s -triple=riscv64 -riscv-no-aliases 2>&1 | FileCheck %s | ||
| # RUN: not llvm-mc %s -triple=riscv64 -riscv-no-aliases=false 2>&1 | FileCheck %s | ||
|
|
||
| rdinstreth x29 # CHECK: :[[@LINE]]:1: error: instruction use requires an option to be enabled | ||
| rdcycleh x27 # CHECK: :[[@LINE]]:1: error: instruction use requires an option to be enabled | ||
| rdtimeh x28 # CHECK: :[[@LINE]]:1: error: instruction use requires an option to be enabled |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,20 @@ | ||
| # RUN: llvm-mc %s -triple=riscv64 -riscv-no-aliases \ | ||
| # RUN: | FileCheck -check-prefix=CHECK-INST %s | ||
| # RUN: llvm-mc %s -triple=riscv64 -riscv-no-aliases=false \ | ||
| # RUN: | FileCheck -check-prefix=CHECK-ALIAS %s | ||
| # RUN: llvm-mc -filetype=obj -triple riscv64 < %s \ | ||
| # RUN: | llvm-objdump -d -riscv-no-aliases - \ | ||
| # RUN: | FileCheck -check-prefix=CHECK-INST %s | ||
| # RUN: llvm-mc -filetype=obj -triple riscv64 < %s \ | ||
| # RUN: | llvm-objdump -d -riscv-no-aliases=false - \ | ||
| # RUN: | FileCheck -check-prefix=CHECK-ALIAS %s | ||
|
|
||
| # TODO ld | ||
| # TODO sd | ||
|
|
||
| # CHECK-INST: subw t6, zero, ra | ||
| # CHECK-ALIAS: negw t6, ra | ||
| negw x31, x1 | ||
| # CHECK-INST: addiw t6, ra, 0 | ||
| # CHECK-ALIAS: sext.w t6, ra | ||
| sext.w x31, x1 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,138 @@ | ||
| # RUN: llvm-mc %s -triple=riscv32 -riscv-no-aliases \ | ||
| # RUN: | FileCheck -check-prefix=CHECK-INST %s | ||
| # RUN: llvm-mc %s -triple=riscv32 -riscv-no-aliases=false \ | ||
| # RUN: | FileCheck -check-prefix=CHECK-ALIAS %s | ||
| # RUN: llvm-mc %s -triple=riscv64 -riscv-no-aliases\ | ||
| # RUN: | FileCheck -check-prefix=CHECK-INST %s | ||
| # RUN: llvm-mc %s -triple=riscv64 -riscv-no-aliases=false \ | ||
| # RUN: | FileCheck -check-prefix=CHECK-ALIAS %s | ||
| # RUN: llvm-mc -filetype=obj -triple riscv32 < %s \ | ||
| # RUN: | llvm-objdump -d -riscv-no-aliases - \ | ||
| # RUN: | FileCheck -check-prefix=CHECK-INST %s | ||
| # RUN: llvm-mc -filetype=obj -triple riscv32 < %s \ | ||
| # RUN: | llvm-objdump -d -riscv-no-aliases=false - \ | ||
| # RUN: | FileCheck -check-prefix=CHECK-ALIAS %s | ||
| # RUN: llvm-mc -filetype=obj -triple riscv64 < %s \ | ||
| # RUN: | llvm-objdump -d -riscv-no-aliases - \ | ||
| # RUN: | FileCheck -check-prefix=CHECK-INST %s | ||
| # RUN: llvm-mc -filetype=obj -triple riscv64 < %s \ | ||
| # RUN: | llvm-objdump -d -riscv-no-aliases=false - \ | ||
| # RUN: | FileCheck -check-prefix=CHECK-ALIAS %s | ||
|
|
||
| # TODO la | ||
| # TODO lb lh lw | ||
| # TODO sb sh sw | ||
|
|
||
| # CHECK-INST: addi zero, zero, 0 | ||
| # CHECK-ALIAS: nop | ||
| nop | ||
| # TODO li | ||
| # CHECK-INST: addi t6, zero, 0 | ||
| # CHECK-ALIAS: mv t6, zero | ||
| mv x31, zero | ||
| # CHECK-INST: xori t6, ra, -1 | ||
| # CHECK-ALIAS: not t6, ra | ||
| not x31, x1 | ||
| # CHECK-INST: sub t6, zero, ra | ||
| # CHECK-ALIAS: neg t6, ra | ||
| neg x31, x1 | ||
| # CHECK-INST: sltiu t6, ra, 1 | ||
| # CHECK-ALIAS: seqz t6, ra | ||
| seqz x31, x1 | ||
| # CHECK-INST: sltu t6, zero, ra | ||
| # CHECK-ALIAS: snez t6, ra | ||
| snez x31, x1 | ||
| # CHECK-INST: slt t6, ra, zero | ||
| # CHECK-ALIAS: sltz t6, ra | ||
| sltz x31, x1 | ||
| # CHECK-INST: slt t6, zero, ra | ||
| # CHECK-ALIAS: sgtz t6, ra | ||
| sgtz x31, x1 | ||
|
|
||
| # CHECK-INST: beq a0, zero, 512 | ||
| # CHECK-ALIAS: beqz a0, 512 | ||
| beqz x10, 512 | ||
| # CHECK-INST: bne a1, zero, 1024 | ||
| # CHECK-ALIAS: bnez a1, 1024 | ||
| bnez x11, 1024 | ||
| # CHECK-INST: bge zero, a2, 4 | ||
| # CHECK-ALIAS: blez a2, 4 | ||
| blez x12, 4 | ||
| # CHECK-INST: bge a3, zero, 8 | ||
| # CHECK-ALIAS: bgez a3, 8 | ||
| bgez x13, 8 | ||
| # CHECK-INST: blt a4, zero, 12 | ||
| # CHECK-ALIAS: bltz a4, 12 | ||
| bltz x14, 12 | ||
| # CHECK-INST: blt zero, a5, 16 | ||
| # CHECK-ALIAS: bgtz a5, 16 | ||
| bgtz x15, 16 | ||
|
|
||
| # Always output the canonical mnemonic for the pseudo branch instructions. | ||
| # CHECK-INST: blt a6, a5, 20 | ||
| # CHECK-ALIAS: blt a6, a5, 20 | ||
| bgt x15, x16, 20 | ||
| # CHECK-INST: bge a7, a6, 24 | ||
| # CHECK-ALIAS: bge a7, a6, 24 | ||
| ble x16, x17, 24 | ||
| # CHECK-INST: bltu s2, a7, 28 | ||
| # CHECK-ALIAS: bltu s2, a7, 28 | ||
| bgtu x17, x18, 28 | ||
| # CHECK-INST: bgeu s3, s2, 32 | ||
| # CHECK-ALIAS: bgeu s3, s2, 32 | ||
| bleu x18, x19, 32 | ||
|
|
||
| # CHECK-INST: jal zero, 2044 | ||
| # CHECK-ALIAS: j 2044 | ||
| j 2044 | ||
| # CHECK-INST: jal ra, 2040 | ||
| # CHECK-ALIAS: jal 2040 | ||
| jal 2040 | ||
| # CHECK-INST: jalr zero, s4, 0 | ||
| # CHECK-ALIAS: jr s4 | ||
| jr x20 | ||
| # CHECK-INST: jalr ra, s5, 0 | ||
| # CHECK-ALIAS: jalr s5 | ||
| jalr x21 | ||
| # CHECK-INST: jalr zero, ra, 0 | ||
| # CHECK-ALIAS: ret | ||
| ret | ||
| # TODO call | ||
| # TODO tail | ||
|
|
||
| # CHECK-INST: fence iorw, iorw | ||
| # CHECK-ALIAS: fence | ||
| fence | ||
|
|
||
| # CHECK-INST: csrrs s10, 3074, zero | ||
| # CHECK-ALIAS: rdinstret s10 | ||
| rdinstret x26 | ||
| # CHECK-INST: csrrs s8, 3072, zero | ||
| # CHECK-ALIAS: rdcycle s8 | ||
| rdcycle x24 | ||
| # CHECK-INST: csrrs s9, 3073, zero | ||
| # CHECK-ALIAS: rdtime s9 | ||
| rdtime x25 | ||
|
|
||
| # CHECK-INST: csrrs s0, 336, zero | ||
| # CHECK-ALIAS: csrr s0, 336 | ||
| csrr x8, 0x150 | ||
| # CHECK-INST: csrrw zero, 320, s1 | ||
| # CHECK-ALIAS: csrw 320, s1 | ||
| csrw 0x140, x9 | ||
| # CHECK-INST: csrrs zero, 4095, s6 | ||
| # CHECK-ALIAS: csrs 4095, s6 | ||
| csrs 0xfff, x22 | ||
| # CHECK-INST: csrrc zero, 4095, s7 | ||
| # CHECK-ALIAS: csrc 4095, s7 | ||
| csrc 0xfff, x23 | ||
|
|
||
| # CHECK-INST: csrrwi zero, 336, 15 | ||
| # CHECK-ALIAS: csrwi 336, 15 | ||
| csrwi 0x150, 0xf | ||
| # CHECK-INST: csrrsi zero, 4095, 16 | ||
| # CHECK-ALIAS: csrsi 4095, 16 | ||
| csrsi 0xfff, 0x10 | ||
| # CHECK-INST: csrrci zero, 320, 17 | ||
| # CHECK-ALIAS: csrci 320, 17 | ||
| csrci 0x140, 0x11 |