diff options
author | Victor Do Nascimento <vicdon01@e133397.arm.com> | 2024-02-27 16:17:25 +0000 |
---|---|---|
committer | Victor Do Nascimento <victor.donascimento@arm.com> | 2024-05-16 13:22:30 +0100 |
commit | a09771e687bacc24163d1f1978cc46d9c72b3a08 (patch) | |
tree | bbe9f361a5748eb6df0c558f3595aa2fb4e2f30f /opcodes | |
parent | eef66d27fcdc55c83a63a17f295409bb4a13688b (diff) | |
download | gdb-a09771e687bacc24163d1f1978cc46d9c72b3a08.zip gdb-a09771e687bacc24163d1f1978cc46d9c72b3a08.tar.gz gdb-a09771e687bacc24163d1f1978cc46d9c72b3a08.tar.bz2 |
aarch64: fp8 convert and scale - add sme2 insn variants
Add the SME2 variant of the FP8 convert and scale
instructions, enabled at assembly-time using the `+sme2+fp8'
architectural extension flag. More specifically, support is
added for the following instructions:
Multi-vector floating-point convert from FP8 to
BFloat16 (in-order):
-----------------------------------------------
- bf1cvt { <Zd1>.H-<Zd2>.H }, <Zn>.B
- bf2cvt { <Zd1>.H-<Zd2>.H }, <Zn>.B
Multi-vector floating-point convert from FP8 to
deinterleaved BFloat16:
-----------------------------------------------
- bf1cvtl { <Zd1>.H-<Zd2>.H }, <Zn>.B
- bf2cvtl { <Zd1>.H-<Zd2>.H }, <Zn>.B
Multi-vector floating-point convert from BFloat16
to packed FP8 format:
-------------------------------------------------
- bfcvt <Zd>.B, { <Zn1>.H-<Zn2>.H }
Multi-vector floating-point convert from FP8 to
half-precision (in-order):
-----------------------------------------------
- f1cvt { <Zd1>.H-<Zd2>.H }, <Zn>.B
- f2cvt { <Zd1>.H-<Zd2>.H }, <Zn>.B
Multi-vector floating-point convert from FP8 to
deinterleaved half-precision:
-----------------------------------------------
- f1cvtl { <Zd1>.H-<Zd2>.H }, <Zn>.B
- f2cvtl { <Zd1>.H-<Zd2>.H }, <Zn>.B
Multi-vector floating-point convert from half-precision
to packed FP8 format:
-------------------------------------------------------
fcvt_2h
Multi-vector floating-point convert from single-precision
to packed FP8 format:
---------------------------------------------------------
fcvt_4s
Multi-vector floating-point convert from single-precision
to interleaved FP8 format:
---------------------------------------------------------
- fcvtn <Zd>.B, { <Zn1>.S-<Zn4>.S }
Multi-vector floating-point adjust exponent by vector:
------------------------------------------------------
- fscale { <Zdn1>.H-<Zdn2>.H }, { <Zdn1>.H-<Zdn2>.H },
<Zm>.H
- fscale { <Zdn1>.S-<Zdn2>.S }, { <Zdn1>.S-<Zdn2>.S },
<Zm>.S
- fscale { <Zdn1>.D-<Zdn2>.D }, { <Zdn1>.D-<Zdn2>.D },
<Zm>.D
Multi-vector floating-point adjust exponent:
--------------------------------------------
- fscale { <Zdn1>.H-<Zdn2>.H }, { <Zdn1>.H-<Zdn2>.H },
{ <Zm1>.H - <Zm2>.H }
- fscale { <Zdn1>.S-<Zdn2>.S }, { <Zdn1>.S-<Zdn2>.S },
{ <Zm1>.S - <Zm2>.S }
- fscale { <Zdn1>.D-<Zdn2>.D }, { <Zdn1>.D-<Zdn2>.D },
{ <Zm1>.D - <Zm2>.D }
Diffstat (limited to 'opcodes')
-rw-r--r-- | opcodes/aarch64-dis-2.c | 448 | ||||
-rw-r--r-- | opcodes/aarch64-tbl.h | 16 |
2 files changed, 328 insertions, 136 deletions
diff --git a/opcodes/aarch64-dis-2.c b/opcodes/aarch64-dis-2.c index 36d4744..46f4e2f 100644 --- a/opcodes/aarch64-dis-2.c +++ b/opcodes/aarch64-dis-2.c @@ -4465,33 +4465,44 @@ aarch64_opcode_lookup_1 (uint32_t word) { if (((word >> 5) & 0x1) == 0) { - if (((word >> 8) & 0x1) == 0) - { - /* 33222222222211111111110000000000 - 10987654321098765432109876543210 - x1000001xx1xxxxx101000x0xx0xxxx0 - smax. */ - return 2710; - } - else + if (((word >> 7) & 0x1) == 0) { - if (((word >> 9) & 0x1) == 0) + if (((word >> 8) & 0x1) == 0) { /* 33222222222211111111110000000000 10987654321098765432109876543210 - x1000001xx1xxxxx10100001xx0xxxx0 - fmax. */ - return 2545; + x1000001xx1xxxxx101000x00x0xxxx0 + smax. */ + return 2710; } else { - /* 33222222222211111111110000000000 - 10987654321098765432109876543210 - x1000001xx1xxxxx10100011xx0xxxx0 - add. */ - return 2499; + if (((word >> 9) & 0x1) == 0) + { + /* 33222222222211111111110000000000 + 10987654321098765432109876543210 + x1000001xx1xxxxx101000010x0xxxx0 + fmax. */ + return 2545; + } + else + { + /* 33222222222211111111110000000000 + 10987654321098765432109876543210 + x1000001xx1xxxxx101000110x0xxxx0 + add. */ + return 2499; + } } } + else + { + /* 33222222222211111111110000000000 + 10987654321098765432109876543210 + x1000001xx1xxxxx101000xx1x0xxxx0 + fscale. */ + return 3370; + } } else { @@ -4581,9 +4592,9 @@ aarch64_opcode_lookup_1 (uint32_t word) { if (((word >> 16) & 0x1) == 0) { - if (((word >> 5) & 0x1) == 0) + if (((word >> 17) & 0x1) == 0) { - if (((word >> 17) & 0x1) == 0) + if (((word >> 5) & 0x1) == 0) { if (((word >> 18) & 0x1) == 0) { @@ -4628,45 +4639,34 @@ aarch64_opcode_lookup_1 (uint32_t word) } else { - if (((word >> 20) & 0x1) == 0) - { - /* 33222222222211111111110000000000 - 10987654321098765432109876543210 - x1000001xx10x100111000xxxx0xxxxx - frinta. */ - return 2589; - } - else - { - /* 33222222222211111111110000000000 - 10987654321098765432109876543210 - x1000001xx11x100111000xxxx0xxxxx - frinta. */ - return 2590; - } - } - } - else - { - if (((word >> 18) & 0x1) == 0) - { if (((word >> 19) & 0x1) == 0) { if (((word >> 20) & 0x1) == 0) { - /* 33222222222211111111110000000000 - 10987654321098765432109876543210 - x1000001xx100010111000xxxx0xxxxx - scvtf. */ - return 2694; + if (((word >> 22) & 0x1) == 0) + { + /* 33222222222211111111110000000000 + 10987654321098765432109876543210 + x1000001x0100100111000xxxx0xxxxx + fcvt. */ + return 3367; + } + else + { + /* 33222222222211111111110000000000 + 10987654321098765432109876543210 + x1000001x1100100111000xxxx0xxxxx + bfcvt. */ + return 3362; + } } else { /* 33222222222211111111110000000000 10987654321098765432109876543210 - x1000001xx110010111000xxxx0xxxxx - scvtf. */ - return 2695; + x1000001xx110100111000xxxx0xxxxx + fcvt. */ + return 3368; } } else @@ -4675,79 +4675,222 @@ aarch64_opcode_lookup_1 (uint32_t word) { /* 33222222222211111111110000000000 10987654321098765432109876543210 - x1000001xx101010111000xxxx0xxxxx - frintm. */ - return 2591; + x1000001xx101100111000xxxx0xxxxx + frinta. */ + return 2589; } else { /* 33222222222211111111110000000000 10987654321098765432109876543210 - x1000001xx111010111000xxxx0xxxxx - frintm. */ - return 2592; + x1000001xx111100111000xxxx0xxxxx + frinta. */ + return 2590; } } } - else + } + else + { + if (((word >> 18) & 0x1) == 0) { - if (((word >> 1) & 0x1) == 0) + if (((word >> 22) & 0x1) == 0) { /* 33222222222211111111110000000000 10987654321098765432109876543210 - x1000001xx1xx110111000xxxx0xxx0x - zip. */ - return 2959; + x1000001x01xx000111000xxxx1xxxxx + fcvtn. */ + return 2534; } else { /* 33222222222211111111110000000000 10987654321098765432109876543210 - x1000001xx1xx110111000xxxx0xxx1x - uzp. */ - return 2946; + x1000001x11xx000111000xxxx1xxxxx + bfcvtn. */ + return 2502; } } + else + { + /* 33222222222211111111110000000000 + 10987654321098765432109876543210 + x1000001xx1xx100111000xxxx1xxxxx + fcvtn. */ + return 3369; + } } } else { - if (((word >> 17) & 0x1) == 0) + if (((word >> 0) & 0x1) == 0) { - if (((word >> 22) & 0x1) == 0) + if (((word >> 18) & 0x1) == 0) { - /* 33222222222211111111110000000000 - 10987654321098765432109876543210 - x1000001x01xxx00111000xxxx1xxxxx - fcvtn. */ - return 2534; + if (((word >> 5) & 0x1) == 0) + { + if (((word >> 19) & 0x1) == 0) + { + if (((word >> 20) & 0x1) == 0) + { + /* 33222222222211111111110000000000 + 10987654321098765432109876543210 + x1000001xx100010111000xxxx0xxxx0 + scvtf. */ + return 2694; + } + else + { + /* 33222222222211111111110000000000 + 10987654321098765432109876543210 + x1000001xx110010111000xxxx0xxxx0 + scvtf. */ + return 2695; + } + } + else + { + if (((word >> 20) & 0x1) == 0) + { + /* 33222222222211111111110000000000 + 10987654321098765432109876543210 + x1000001xx101010111000xxxx0xxxx0 + frintm. */ + return 2591; + } + else + { + /* 33222222222211111111110000000000 + 10987654321098765432109876543210 + x1000001xx111010111000xxxx0xxxx0 + frintm. */ + return 2592; + } + } + } + else + { + if (((word >> 20) & 0x1) == 0) + { + /* 33222222222211111111110000000000 + 10987654321098765432109876543210 + x1000001xx10x010111000xxxx1xxxx0 + ucvtf. */ + return 2859; + } + else + { + /* 33222222222211111111110000000000 + 10987654321098765432109876543210 + x1000001xx11x010111000xxxx1xxxx0 + ucvtf. */ + return 2860; + } + } } else { - /* 33222222222211111111110000000000 - 10987654321098765432109876543210 - x1000001x11xxx00111000xxxx1xxxxx - bfcvtn. */ - return 2502; + if (((word >> 20) & 0x1) == 0) + { + if (((word >> 22) & 0x1) == 0) + { + if (((word >> 23) & 0x1) == 0) + { + /* 33222222222211111111110000000000 + 10987654321098765432109876543210 + x10000010010x110111000xxxxxxxxx0 + f1cvt. */ + return 3363; + } + else + { + /* 33222222222211111111110000000000 + 10987654321098765432109876543210 + x10000011010x110111000xxxxxxxxx0 + f2cvt. */ + return 3364; + } + } + else + { + if (((word >> 23) & 0x1) == 0) + { + /* 33222222222211111111110000000000 + 10987654321098765432109876543210 + x10000010110x110111000xxxxxxxxx0 + bf1cvt. */ + return 3358; + } + else + { + /* 33222222222211111111110000000000 + 10987654321098765432109876543210 + x10000011110x110111000xxxxxxxxx0 + bf2cvt. */ + return 3359; + } + } + } + else + { + if (((word >> 1) & 0x1) == 0) + { + /* 33222222222211111111110000000000 + 10987654321098765432109876543210 + x1000001xx11x110111000xxxxxxxx00 + zip. */ + return 2959; + } + else + { + /* 33222222222211111111110000000000 + 10987654321098765432109876543210 + x1000001xx11x110111000xxxxxxxx10 + uzp. */ + return 2946; + } + } } } else { - if (((word >> 20) & 0x1) == 0) + if (((word >> 22) & 0x1) == 0) { - /* 33222222222211111111110000000000 - 10987654321098765432109876543210 - x1000001xx10xx10111000xxxx1xxxxx - ucvtf. */ - return 2859; + if (((word >> 23) & 0x1) == 0) + { + /* 33222222222211111111110000000000 + 10987654321098765432109876543210 + x1000001001xxx10111000xxxxxxxxx1 + f1cvtl. */ + return 3365; + } + else + { + /* 33222222222211111111110000000000 + 10987654321098765432109876543210 + x1000001101xxx10111000xxxxxxxxx1 + f2cvtl. */ + return 3366; + } } else { - /* 33222222222211111111110000000000 - 10987654321098765432109876543210 - x1000001xx11xx10111000xxxx1xxxxx - ucvtf. */ - return 2860; + if (((word >> 23) & 0x1) == 0) + { + /* 33222222222211111111110000000000 + 10987654321098765432109876543210 + x1000001011xxx10111000xxxxxxxxx1 + bf1cvtl. */ + return 3360; + } + else + { + /* 33222222222211111111110000000000 + 10987654321098765432109876543210 + x1000001111xxx10111000xxxxxxxxx1 + bf2cvtl. */ + return 3361; + } } } } @@ -4990,21 +5133,32 @@ aarch64_opcode_lookup_1 (uint32_t word) { if (((word >> 6) & 0x1) == 0) { - if (((word >> 8) & 0x1) == 0) + if (((word >> 7) & 0x1) == 0) { - /* 33222222222211111111110000000000 - 10987654321098765432109876543210 - x1000001xx1xxxxx1x1100x0x00xxxx0 - smax. */ - return 2712; + if (((word >> 8) & 0x1) == 0) + { + /* 33222222222211111111110000000000 + 10987654321098765432109876543210 + x1000001xx1xxxxx1x1100x0000xxxx0 + smax. */ + return 2712; + } + else + { + /* 33222222222211111111110000000000 + 10987654321098765432109876543210 + x1000001xx1xxxxx1x1100x1000xxxx0 + fmax. */ + return 2547; + } } else { /* 33222222222211111111110000000000 10987654321098765432109876543210 - x1000001xx1xxxxx1x1100x1x00xxxx0 - fmax. */ - return 2547; + x1000001xx1xxxxx1x1100xx100xxxx0 + fscale. */ + return 3372; } } else @@ -5120,53 +5274,75 @@ aarch64_opcode_lookup_1 (uint32_t word) { if (((word >> 6) & 0x1) == 0) { - if (((word >> 8) & 0x1) == 0) + if (((word >> 7) & 0x1) == 0) { - if (((word >> 12) & 0x1) == 0) - { - /* 33222222222211111111110000000000 - 10987654321098765432109876543210 - x1000001xx1xxxxx1x1010x0x00xxxx0 - smax. */ - return 2711; - } - else - { - /* 33222222222211111111110000000000 - 10987654321098765432109876543210 - x1000001xx1xxxxx1x1110x0x00xxxx0 - smax. */ - return 2713; - } - } - else - { - if (((word >> 9) & 0x1) == 0) + if (((word >> 8) & 0x1) == 0) { if (((word >> 12) & 0x1) == 0) { /* 33222222222211111111110000000000 10987654321098765432109876543210 - x1000001xx1xxxxx1x101001x00xxxx0 - fmax. */ - return 2546; + x1000001xx1xxxxx1x1010x0000xxxx0 + smax. */ + return 2711; } else { /* 33222222222211111111110000000000 10987654321098765432109876543210 - x1000001xx1xxxxx1x111001x00xxxx0 - fmax. */ - return 2548; + x1000001xx1xxxxx1x1110x0000xxxx0 + smax. */ + return 2713; + } + } + else + { + if (((word >> 9) & 0x1) == 0) + { + if (((word >> 12) & 0x1) == 0) + { + /* 33222222222211111111110000000000 + 10987654321098765432109876543210 + x1000001xx1xxxxx1x101001000xxxx0 + fmax. */ + return 2546; + } + else + { + /* 33222222222211111111110000000000 + 10987654321098765432109876543210 + x1000001xx1xxxxx1x111001000xxxx0 + fmax. */ + return 2548; + } + } + else + { + /* 33222222222211111111110000000000 + 10987654321098765432109876543210 + x1000001xx1xxxxx1x1x1011000xxxx0 + add. */ + return 2500; } } + } + else + { + if (((word >> 12) & 0x1) == 0) + { + /* 33222222222211111111110000000000 + 10987654321098765432109876543210 + x1000001xx1xxxxx1x1010xx100xxxx0 + fscale. */ + return 3371; + } else { /* 33222222222211111111110000000000 10987654321098765432109876543210 - x1000001xx1xxxxx1x1x1011x00xxxx0 - add. */ - return 2500; + x1000001xx1xxxxx1x1110xx100xxxx0 + fscale. */ + return 3373; } } } @@ -10334,7 +10510,7 @@ aarch64_opcode_lookup_1 (uint32_t word) 10987654321098765432109876543210 x0x11010000xxxxxxx1xxxxxxxxxxxxx addpt. */ - return 3358; + return 3374; } else { @@ -10342,7 +10518,7 @@ aarch64_opcode_lookup_1 (uint32_t word) 10987654321098765432109876543210 x1x11010000xxxxxxx1xxxxxxxxxxxxx subpt. */ - return 3359; + return 3375; } } } @@ -11260,7 +11436,7 @@ aarch64_opcode_lookup_1 (uint32_t word) 10987654321098765432109876543210 xxxx1011x11xxxxx0xxxxxxxxxxxxxxx maddpt. */ - return 3360; + return 3376; } else { @@ -11268,7 +11444,7 @@ aarch64_opcode_lookup_1 (uint32_t word) 10987654321098765432109876543210 xxxx1011x11xxxxx1xxxxxxxxxxxxxxx msubpt. */ - return 3361; + return 3377; } } } @@ -11353,7 +11529,7 @@ aarch64_opcode_lookup_1 (uint32_t word) 10987654321098765432109876543210 000001x0xx000100000xxxxxxxxxxxxx addpt. */ - return 3362; + return 3378; } else { @@ -11460,7 +11636,7 @@ aarch64_opcode_lookup_1 (uint32_t word) 10987654321098765432109876543210 000001x0xx000101000xxxxxxxxxxxxx subpt. */ - return 3364; + return 3380; } else { @@ -11665,7 +11841,7 @@ aarch64_opcode_lookup_1 (uint32_t word) 10987654321098765432109876543210 000001x0xx1xxxxx000010xxxxxxxxxx addpt. */ - return 3363; + return 3379; } else { @@ -11706,7 +11882,7 @@ aarch64_opcode_lookup_1 (uint32_t word) 10987654321098765432109876543210 000001x0xx1xxxxx000011xxxxxxxxxx subpt. */ - return 3365; + return 3381; } else { @@ -13364,7 +13540,7 @@ aarch64_opcode_lookup_1 (uint32_t word) 10987654321098765432109876543210 010001x0xx0xxxxx110100xxxxxxxxxx mlapt. */ - return 3367; + return 3383; } } else @@ -13394,7 +13570,7 @@ aarch64_opcode_lookup_1 (uint32_t word) 10987654321098765432109876543210 010001x0xx0xxxxx110110xxxxxxxxxx madpt. */ - return 3366; + return 3382; } } } diff --git a/opcodes/aarch64-tbl.h b/opcodes/aarch64-tbl.h index 464d931..43153f4 100644 --- a/opcodes/aarch64-tbl.h +++ b/opcodes/aarch64-tbl.h @@ -6520,6 +6520,22 @@ const struct aarch64_opcode aarch64_opcode_table[] = FP8_SVE2_INSN ("fcvtn", 0x650a3000, 0xfffffc20, sve_misc, 0, OP2 (SVE_Zd, SME_Znx2), OP_SVE_BH, 0, 0), FP8_SVE2_INSN ("fcvtnb", 0x650a3400, 0xfffffc20, sve_misc, 0, OP2 (SVE_Zd, SME_Znx2), OP_SVE_BS, 0, 0), FP8_SVE2_INSN ("fcvtnt", 0x650a3c00, 0xfffffc20, sve_misc, 0, OP2 (SVE_Zd, SME_Znx2), OP_SVE_BS, 0, 0), + FP8_SME2_INSN ("bf1cvt", 0xc166e000, 0xfffffc01, sme_misc, 0, OP2 (SME_Zdnx2, SVE_Zn), OP_SVE_HB, 0, 0), + FP8_SME2_INSN ("bf2cvt", 0xc1e6e000, 0xfffffc01, sme_misc, 0, OP2 (SME_Zdnx2, SVE_Zn), OP_SVE_HB, 0, 0), + FP8_SME2_INSN ("bf1cvtl", 0xc166e001, 0xfffffc01, sme_misc, 0, OP2 (SME_Zdnx2, SVE_Zn), OP_SVE_HB, 0, 0), + FP8_SME2_INSN ("bf2cvtl", 0xc1e6e001, 0xfffffc01, sme_misc, 0, OP2 (SME_Zdnx2, SVE_Zn), OP_SVE_HB, 0, 0), + FP8_SME2_INSN ("bfcvt", 0xc164e000, 0xfffffc20, sme_misc, 0, OP2 (SVE_Zd, SME_Znx2), OP_SVE_BH, 0, 0), + FP8_SME2_INSN ("f1cvt", 0xc126e000, 0xfffffc01, sme_misc, 0, OP2 (SME_Zdnx2, SVE_Zn), OP_SVE_HB, 0, 0), + FP8_SME2_INSN ("f2cvt", 0xc1a6e000, 0xfffffc01, sme_misc, 0, OP2 (SME_Zdnx2, SVE_Zn), OP_SVE_HB, 0, 0), + FP8_SME2_INSN ("f1cvtl", 0xc126e001, 0xfffffc01, sme_misc, 0, OP2 (SME_Zdnx2, SVE_Zn), OP_SVE_HB, 0, 0), + FP8_SME2_INSN ("f2cvtl", 0xc1a6e001, 0xfffffc01, sme_misc, 0, OP2 (SME_Zdnx2, SVE_Zn), OP_SVE_HB, 0, 0), + FP8_SME2_INSN ("fcvt", 0xc124e000, 0xfffffc20, sme_misc, 0, OP2 (SVE_Zd, SME_Znx2), OP_SVE_BH, 0, 0), + FP8_SME2_INSN ("fcvt", 0xc134e000, 0xfffffc60, sme_misc, 0, OP2 (SVE_Zd, SME_Znx4), OP_SVE_BS, 0, 0), + FP8_SME2_INSN ("fcvtn", 0xc134e020, 0xfffffc60, sme_misc, 0, OP2 (SVE_Zd, SME_Znx4), OP_SVE_BS, 0, 0), + FP8_SME2_INSN ("fscale", 0xc120a180, 0xff30ffe1, sme_size_22_hsd, 0, OP3 (SME_Zdnx2, SME_Zdnx2, SME_Zm), OP_SVE_VVV_HSD, 0, 1), + FP8_SME2_INSN ("fscale", 0xc120a980, 0xff30ffe3, sme_size_22_hsd, 0, OP3 (SME_Zdnx4, SME_Zdnx4, SME_Zm), OP_SVE_VVV_HSD, 0, 1), + FP8_SME2_INSN ("fscale", 0xc120b180, 0xff21ffe1, sme_size_22_hsd, 0, OP3 (SME_Zdnx2, SME_Zdnx2, SME_Zmx2), OP_SVE_VVV_HSD, 0, 1), + FP8_SME2_INSN ("fscale", 0xc120b980, 0xff23ffe3, sme_size_22_hsd, 0, OP3 (SME_Zdnx4, SME_Zdnx4, SME_Zmx4), OP_SVE_VVV_HSD, 0, 1), /* Checked Pointer Arithmetic Instructions. */ CPA_INSN ("addpt", 0x9a002000, 0xffe0e000, aarch64_misc, OP3 (Rd_SP, Rn_SP, Rm_LSL), QL_I3SAMEX), |