Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[RISCV][MC] Add support for experimental Zfbfmin extension
Provides MC layer support for Zfbfmin: scalar BF16 conversions. As documented, this extension includes FLH, FSH, FMV.H.X, and FMH.X.H as defined in Zfh/Zfhmin, but doesn't require either extension. No Zfbfinxmin has been defined (though you would expect one in the future, for symmetry with Zfhinxmin). See issue riscv/riscv-bfloat16#27. Differential Revision: https://reviews.llvm.org/D147610
- Loading branch information
Showing
15 changed files
with
156 additions
and
6 deletions.
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
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,25 @@ | ||
//===-- RISCVInstrInfoZfbfmin.td - 'Zfbfmin' instructions --*- tablegen -*-===// | ||
// | ||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
// See https://llvm.org/LICENSE.txt for license information. | ||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
// | ||
//===----------------------------------------------------------------------===// | ||
// | ||
// This file describes the RISC-V instructions from the standard 'Zfbfmin' | ||
// extension, providing scalar conversion instructions for BFloat16. | ||
// This version is still experimental as the 'Zfbfmin' extension hasn't been | ||
// ratified yet. | ||
// | ||
//===----------------------------------------------------------------------===// | ||
|
||
//===----------------------------------------------------------------------===// | ||
// Instructions | ||
//===----------------------------------------------------------------------===// | ||
|
||
let Predicates = [HasStdExtZfbfmin] in { | ||
def FCVT_BF16_S : FPUnaryOp_r_frm<0b0100010, 0b01000, FPR16, FPR32, "fcvt.bf16.s">, | ||
Sched<[WriteFCvtF32ToF16, ReadFCvtF32ToF16]>; | ||
def FCVT_S_BF16 : FPUnaryOp_r_frm<0b0100000, 0b00110, FPR32, FPR16, "fcvt.s.bf16">, | ||
Sched<[WriteFCvtF32ToF16, ReadFCvtF32ToF16]>; | ||
} // Predicates = [HasStdExtZfbfmin] |
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
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,28 @@ | ||
# RUN: not llvm-mc -triple riscv32 -mattr=+experimental-zfbfmin,+d < %s 2>&1 | \ | ||
# RUN: FileCheck %s | ||
# RUN: not llvm-mc -triple riscv64 -mattr=+experimental-zfbfmin,+d < %s 2>&1 | \ | ||
# RUN: FileCheck %s | ||
|
||
# Out of range immediates | ||
## simm12 | ||
flh ft1, -2049(a0) # CHECK: :[[@LINE]]:10: error: operand must be a symbol with %lo/%pcrel_lo/%tprel_lo modifier or an integer in the range [-2048, 2047] | ||
fsh ft2, 2048(a1) # CHECK: :[[@LINE]]:10: error: operand must be a symbol with %lo/%pcrel_lo/%tprel_lo modifier or an integer in the range [-2048, 2047] | ||
|
||
# Memory operand not formatted correctly | ||
flh ft1, a0, -200 # CHECK: :[[@LINE]]:14: error: invalid operand for instruction | ||
|
||
# Invalid register names | ||
flh ft15, 100(a0) # CHECK: :[[@LINE]]:5: error: invalid operand for instruction | ||
flh ft1, 100(a10) # CHECK: :[[@LINE]]:14: error: expected register | ||
|
||
# Integer registers where FP regs are expected | ||
fmv.x.h fs7, a2 # CHECK: :[[@LINE]]:9: error: invalid operand for instruction | ||
|
||
# FP registers where integer regs are expected | ||
fmv.h.x a8, ft2 # CHECK: :[[@LINE]]:9: error: invalid operand for instruction | ||
|
||
# Attempting to use fcvt instructions from zfhmin | ||
fcvt.s.h fa0, ft0 # CHECK: [[@LINE]]:1: error: instruction requires the following: 'Zfh' (Half-Precision Floating-Point) or 'Zfhmin' (Half-Precision Floating-Point Minimal) | ||
fcvt.h.s ft2, fa2 # CHECK: [[@LINE]]:1: error: instruction requires the following: 'Zfh' (Half-Precision Floating-Point) or 'Zfhmin' (Half-Precision Floating-Point Minimal) | ||
fcvt.d.h fa0, ft0 # CHECK: [[@LINE]]:1: error: instruction requires the following: 'Zfh' (Half-Precision Floating-Point) or 'Zfhmin' (Half-Precision Floating-Point Minimal) | ||
fcvt.h.d ft2, fa2 # CHECK: [[@LINE]]:1: error: instruction requires the following: 'Zfh' (Half-Precision Floating-Point) or 'Zfhmin' (Half-Precision Floating-Point Minimal) |
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,56 @@ | ||
# RUN: llvm-mc %s -triple=riscv32 -mattr=+experimental-zfbfmin,+f -riscv-no-aliases -show-encoding \ | ||
# RUN: | FileCheck -check-prefixes=CHECK-ASM,CHECK-ASM-AND-OBJ %s | ||
# RUN: llvm-mc %s -triple=riscv64 -mattr=+experimental-zfbfmin,+f -riscv-no-aliases -show-encoding \ | ||
# RUN: | FileCheck -check-prefixes=CHECK-ASM,CHECK-ASM-AND-OBJ %s | ||
# RUN: llvm-mc -filetype=obj -triple=riscv32 -mattr=+experimental-zfbfmin,+d < %s \ | ||
# RUN: | llvm-objdump --mattr=+experimental-zfbfmin,+f -M no-aliases -d -r - \ | ||
# RUN: | FileCheck --check-prefix=CHECK-ASM-AND-OBJ %s | ||
# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+experimental-zfbfmin,+d < %s \ | ||
# RUN: | llvm-objdump --mattr=+experimental-zfbfmin,+f -M no-aliases -d -r - \ | ||
# RUN: | FileCheck --check-prefix=CHECK-ASM-AND-OBJ %s | ||
|
||
# CHECK-ASM-AND-OBJ: flh ft0, 12(a0) | ||
# CHECK-ASM: encoding: [0x07,0x10,0xc5,0x00] | ||
flh f0, 12(a0) | ||
# CHECK-ASM-AND-OBJ: flh ft1, 4(ra) | ||
# CHECK-ASM: encoding: [0x87,0x90,0x40,0x00] | ||
flh f1, +4(ra) | ||
# CHECK-ASM-AND-OBJ: flh ft2, -2048(a3) | ||
# CHECK-ASM: encoding: [0x07,0x91,0x06,0x80] | ||
flh f2, -2048(x13) | ||
# CHECK-ASM-AND-OBJ: flh ft3, -2048(s1) | ||
# CHECK-ASM: encoding: [0x87,0x91,0x04,0x80] | ||
flh f3, %lo(2048)(s1) | ||
# CHECK-ASM-AND-OBJ: flh ft4, 2047(s2) | ||
# CHECK-ASM: encoding: [0x07,0x12,0xf9,0x7f] | ||
flh f4, 2047(s2) | ||
# CHECK-ASM-AND-OBJ: flh ft5, 0(s3) | ||
# CHECK-ASM: encoding: [0x87,0x92,0x09,0x00] | ||
flh f5, 0(s3) | ||
|
||
# CHECK-ASM-AND-OBJ: fsh ft6, 2047(s4) | ||
# CHECK-ASM: encoding: [0xa7,0x1f,0x6a,0x7e] | ||
fsh f6, 2047(s4) | ||
# CHECK-ASM-AND-OBJ: fsh ft7, -2048(s5) | ||
# CHECK-ASM: encoding: [0x27,0x90,0x7a,0x80] | ||
fsh f7, -2048(s5) | ||
# CHECK-ASM-AND-OBJ: fsh fs0, -2048(s6) | ||
# CHECK-ASM: encoding: [0x27,0x10,0x8b,0x80] | ||
fsh f8, %lo(2048)(s6) | ||
# CHECK-ASM-AND-OBJ: fsh fs1, 999(s7) | ||
# CHECK-ASM: encoding: [0xa7,0x93,0x9b,0x3e] | ||
fsh f9, 999(s7) | ||
|
||
# CHECK-ASM-AND-OBJ: fmv.x.h a2, fs7 | ||
# CHECK-ASM: encoding: [0x53,0x86,0x0b,0xe4] | ||
fmv.x.h a2, fs7 | ||
# CHECK-ASM-AND-OBJ: fmv.h.x ft1, a6 | ||
# CHECK-ASM: encoding: [0xd3,0x00,0x08,0xf4] | ||
fmv.h.x ft1, a6 | ||
|
||
# CHECK-ASM-AND-OBJ: fcvt.s.bf16 fa0, ft0 | ||
# CHECK-ASM: encoding: [0x53,0x75,0x60,0x40] | ||
fcvt.s.bf16 fa0, ft0 | ||
# CHECK-ASM-AND-OBJ: fcvt.bf16.s ft2, fa2 | ||
# CHECK-ASM: encoding: [0x53,0x71,0x86,0x44] | ||
fcvt.bf16.s ft2, fa2 |
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