Skip to content
This repository was archived by the owner on Feb 5, 2019. It is now read-only.

Commit 8d6095a

Browse files
committed
[AArch64][SVE] Asm: Support for FTMAD instruction.
Floating-point trigonometric multiply-add coefficient, e.g. ftmad z0.h, z0.h, z1.h, #7 with variants for 16, 32 and 64-bit elements. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@337533 91177308-0d34-0410-b5e6-96231b3b80d8
1 parent 14b97bb commit 8d6095a

File tree

4 files changed

+91
-0
lines changed

4 files changed

+91
-0
lines changed

lib/Target/AArch64/AArch64SVEInstrInfo.td

+2
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,8 @@ let Predicates = [HasSVE] in {
145145
defm FNMAD_ZPmZZ : sve_fp_3op_p_zds_b<0b10, "fnmad">;
146146
defm FNMSB_ZPmZZ : sve_fp_3op_p_zds_b<0b11, "fnmsb">;
147147

148+
defm FTMAD_ZZI : sve_fp_ftmad<"ftmad">;
149+
148150
defm FMLA_ZZZI : sve_fp_fma_by_indexed_elem<0b0, "fmla">;
149151
defm FMLS_ZZZI : sve_fp_fma_by_indexed_elem<0b1, "fmls">;
150152

lib/Target/AArch64/SVEInstrFormats.td

+25
Original file line numberDiff line numberDiff line change
@@ -985,6 +985,31 @@ multiclass sve_fp_2op_p_zds<bits<4> opc, string asm> {
985985
def _D : sve_fp_2op_p_zds<0b11, opc, asm, ZPR64>;
986986
}
987987

988+
class sve_fp_ftmad<bits<2> sz, string asm, ZPRRegOp zprty>
989+
: I<(outs zprty:$Zdn), (ins zprty:$_Zdn, zprty:$Zm, imm0_7:$imm3),
990+
asm, "\t$Zdn, $_Zdn, $Zm, $imm3",
991+
"",
992+
[]>, Sched<[]> {
993+
bits<5> Zdn;
994+
bits<5> Zm;
995+
bits<3> imm3;
996+
let Inst{31-24} = 0b01100101;
997+
let Inst{23-22} = sz;
998+
let Inst{21-19} = 0b010;
999+
let Inst{18-16} = imm3;
1000+
let Inst{15-10} = 0b100000;
1001+
let Inst{9-5} = Zm;
1002+
let Inst{4-0} = Zdn;
1003+
1004+
let Constraints = "$Zdn = $_Zdn";
1005+
}
1006+
1007+
multiclass sve_fp_ftmad<string asm> {
1008+
def _H : sve_fp_ftmad<0b01, asm, ZPR16>;
1009+
def _S : sve_fp_ftmad<0b10, asm, ZPR32>;
1010+
def _D : sve_fp_ftmad<0b11, asm, ZPR64>;
1011+
}
1012+
9881013

9891014
//===----------------------------------------------------------------------===//
9901015
// SVE Floating Point Arithmetic - Unpredicated Group
+38
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
// RUN: not llvm-mc -triple=aarch64 -show-encoding -mattr=+sve 2>&1 < %s| FileCheck %s
2+
3+
4+
// ------------------------------------------------------------------------- //
5+
// Invalid element size
6+
7+
ftmad z0.b, z0.b, z1.b, #7
8+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width
9+
// CHECK-NEXT: ftmad z0.b, z0.b, z1.b, #7
10+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
11+
12+
ftmad z0.b, z0.b, z1.h, #7
13+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width
14+
// CHECK-NEXT: ftmad z0.b, z0.b, z1.h, #7
15+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
16+
17+
18+
// ------------------------------------------------------------------------- //
19+
// Tied operands must match
20+
21+
ftmad z0.h, z1.h, z2.h, #7
22+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: operand must match destination register
23+
// CHECK-NEXT: ftmad z0.h, z1.h, z2.h, #7
24+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
25+
26+
27+
// ------------------------------------------------------------------------- //
28+
// Invalid immediate range
29+
30+
ftmad z0.h, z0.h, z1.h, #-1
31+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [0, 7].
32+
// CHECK-NEXT: ftmad z0.h, z0.h, z1.h, #-1
33+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
34+
35+
ftmad z0.h, z0.h, z1.h, #8
36+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [0, 7].
37+
// CHECK-NEXT: ftmad z0.h, z0.h, z1.h, #8
38+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

test/MC/AArch64/SVE/ftmad.s

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sve < %s \
2+
// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
3+
// RUN: not llvm-mc -triple=aarch64 -show-encoding < %s 2>&1 \
4+
// RUN: | FileCheck %s --check-prefix=CHECK-ERROR
5+
// RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sve < %s \
6+
// RUN: | llvm-objdump -d -mattr=+sve - | FileCheck %s --check-prefix=CHECK-INST
7+
// RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sve < %s \
8+
// RUN: | llvm-objdump -d - | FileCheck %s --check-prefix=CHECK-UNKNOWN
9+
10+
ftmad z0.h, z0.h, z31.h, #7
11+
// CHECK-INST: ftmad z0.h, z0.h, z31.h, #7
12+
// CHECK-ENCODING: [0xe0,0x83,0x57,0x65]
13+
// CHECK-ERROR: instruction requires: sve
14+
// CHECK-UNKNOWN: e0 83 57 65 <unknown>
15+
16+
ftmad z0.s, z0.s, z31.s, #7
17+
// CHECK-INST: ftmad z0.s, z0.s, z31.s, #7
18+
// CHECK-ENCODING: [0xe0,0x83,0x97,0x65]
19+
// CHECK-ERROR: instruction requires: sve
20+
// CHECK-UNKNOWN: e0 83 97 65 <unknown>
21+
22+
ftmad z0.d, z0.d, z31.d, #7
23+
// CHECK-INST: ftmad z0.d, z0.d, z31.d, #7
24+
// CHECK-ENCODING: [0xe0,0x83,0xd7,0x65]
25+
// CHECK-ERROR: instruction requires: sve
26+
// CHECK-UNKNOWN: e0 83 d7 65 <unknown>

0 commit comments

Comments
 (0)