Skip to content

Commit

Permalink
[AArch64] fjcvtzs,rmif,cfinv,setf* all clobber nzcv
Browse files Browse the repository at this point in the history
Differential Revision: https://reviews.llvm.org/D83818
  • Loading branch information
jroelofs committed Jul 27, 2020
1 parent 4dd5c2b commit f5e1ec8
Show file tree
Hide file tree
Showing 11 changed files with 150 additions and 2 deletions.
1 change: 1 addition & 0 deletions llvm/lib/Target/AArch64/AArch64InstrFormats.td
Expand Up @@ -1942,6 +1942,7 @@ class BaseFlagManipulation<bit sf, bit sz, dag iops, string asm, string ops>
: I<(outs), iops, asm, ops, "", []>,
Sched<[WriteI, ReadI, ReadI]> {
let Uses = [NZCV];
let Defs = [NZCV];
bits<5> Rn;
let Inst{31} = sf;
let Inst{30-15} = 0b0111010000000000;
Expand Down
4 changes: 2 additions & 2 deletions llvm/lib/Target/AArch64/AArch64InstrInfo.td
Expand Up @@ -1030,7 +1030,7 @@ let Predicates = [HasPA] in {
}

// v8.3a floating point conversion for javascript
let Predicates = [HasJS, HasFPARMv8] in
let Predicates = [HasJS, HasFPARMv8], Defs = [NZCV] in
def FJCVTZS : BaseFPToIntegerUnscaled<0b01, 0b11, 0b110, FPR64, GPR32,
"fjcvtzs",
[(set GPR32:$Rd,
Expand All @@ -1039,7 +1039,7 @@ def FJCVTZS : BaseFPToIntegerUnscaled<0b01, 0b11, 0b110, FPR64, GPR32,
} // HasJS, HasFPARMv8

// v8.4 Flag manipulation instructions
let Predicates = [HasFMI] in {
let Predicates = [HasFMI], Defs = [NZCV], Uses = [NZCV] in {
def CFINV : SimpleSystemI<0, (ins), "cfinv", "">, Sched<[WriteSys]> {
let Inst{20-5} = 0b0000001000000000;
}
Expand Down
17 changes: 17 additions & 0 deletions llvm/test/CodeGen/AArch64/cfinv-def-nzcv.mir
@@ -0,0 +1,17 @@
# RUN: not llc -o - %s -mtriple=arm64-eabi -run-pass=legalizer 2>&1 | FileCheck %s

# CHECK: [[@LINE+11]]:29: missing implicit register operand 'implicit $nzcv'
...
---
name: test_flags
liveins:
- { reg: '$w0' }
- { reg: '$x0' }
body: |
bb.0:
liveins: $w0, $x0
CFINV implicit-def $nzcv
RET undef $lr, implicit killed $w0
17 changes: 17 additions & 0 deletions llvm/test/CodeGen/AArch64/cfinv-use-nzcv.mir
@@ -0,0 +1,17 @@
# RUN: not llc -o - %s -mtriple=arm64-eabi -run-pass=legalizer 2>&1 | FileCheck %s

# CHECK: [[@LINE+11]]:25: missing implicit register operand 'implicit-def $nzcv'
...
---
name: test_flags
liveins:
- { reg: '$w0' }
- { reg: '$x0' }
body: |
bb.0:
liveins: $w0, $x0
CFINV implicit $nzcv
RET undef $lr, implicit killed $w0
17 changes: 17 additions & 0 deletions llvm/test/CodeGen/AArch64/fjcvtzs.mir
@@ -0,0 +1,17 @@
# RUN: not llc -o - %s -mtriple=arm64-eabi -mattr=+jsconv -run-pass=legalizer 2>&1 | FileCheck %s

# CHECK: [[@LINE+11]]:49: missing implicit register operand 'implicit-def $nzcv'

...
---
name: test_jcvt
liveins:
- { reg: '$d0' }
body: |
bb.0:
liveins: $d0
renamable $w0 = FJCVTZS killed renamable $d0
RET undef $lr, implicit killed $w0
...
16 changes: 16 additions & 0 deletions llvm/test/CodeGen/AArch64/rmif-def-nzcv.mir
@@ -0,0 +1,16 @@
# RUN: not llc -o - %s -mtriple=arm64-eabi -run-pass=legalizer 2>&1 | FileCheck %s

# CHECK: [[@LINE+10]]:49: missing implicit register operand 'implicit $nzcv'
...
---
name: test_flags
liveins:
- { reg: '$x0' }
body: |
bb.0:
liveins: $x0
RMIF renamable $x0, 0, 0, implicit-def $nzcv
RET undef $lr, implicit killed $w0
16 changes: 16 additions & 0 deletions llvm/test/CodeGen/AArch64/rmif-use-nzcv.mir
@@ -0,0 +1,16 @@
# RUN: not llc -o - %s -mtriple=arm64-eabi -run-pass=legalizer 2>&1 | FileCheck %s

# CHECK: [[@LINE+10]]:45: missing implicit register operand 'implicit-def $nzcv'
...
---
name: test_flags
liveins:
- { reg: '$x0' }
body: |
bb.0:
liveins: $x0
RMIF renamable $x0, 0, 0, implicit $nzcv
RET undef $lr, implicit killed $w0
16 changes: 16 additions & 0 deletions llvm/test/CodeGen/AArch64/setf16-def-nzcv.mir
@@ -0,0 +1,16 @@
# RUN: not llc -o - %s -mtriple=arm64-eabi -run-pass=legalizer 2>&1 | FileCheck %s

# CHECK: [[@LINE+10]]:45: missing implicit register operand 'implicit $nzcv'
...
---
name: test_flags
liveins:
- { reg: '$w0' }
body: |
bb.0:
liveins: $w0
SETF16 renamable $w0, implicit-def $nzcv
RET undef $lr, implicit killed $w0
16 changes: 16 additions & 0 deletions llvm/test/CodeGen/AArch64/setf16-use-nzcv.mir
@@ -0,0 +1,16 @@
# RUN: not llc -o - %s -mtriple=arm64-eabi -run-pass=legalizer 2>&1 | FileCheck %s

# CHECK: [[@LINE+10]]:41: missing implicit register operand 'implicit-def $nzcv'
...
---
name: test_flags
liveins:
- { reg: '$w0' }
body: |
bb.0:
liveins: $w0
SETF16 renamable $w0, implicit $nzcv
RET undef $lr, implicit killed $w0
16 changes: 16 additions & 0 deletions llvm/test/CodeGen/AArch64/setf8-def-nzcv.mir
@@ -0,0 +1,16 @@
# RUN: not llc -o - %s -mtriple=arm64-eabi -run-pass=legalizer 2>&1 | FileCheck %s

# CHECK: [[@LINE+10]]:44: missing implicit register operand 'implicit $nzcv'
...
---
name: test_flags
liveins:
- { reg: '$w0' }
body: |
bb.0:
liveins: $w0
SETF8 renamable $w0, implicit-def $nzcv
RET undef $lr, implicit killed $w0
16 changes: 16 additions & 0 deletions llvm/test/CodeGen/AArch64/setf8-use-nzcv.mir
@@ -0,0 +1,16 @@
# RUN: not llc -o - %s -mtriple=arm64-eabi -run-pass=legalizer 2>&1 | FileCheck %s

# CHECK: [[@LINE+10]]:40: missing implicit register operand 'implicit-def $nzcv'
...
---
name: test_flags
liveins:
- { reg: '$w0' }
body: |
bb.0:
liveins: $w0
SETF8 renamable $w0, implicit $nzcv
RET undef $lr, implicit killed $w0

0 comments on commit f5e1ec8

Please sign in to comment.