/* SPDX-License-Identifier: AGPL-3.0-or-later */ /* Copyright (C) 2026 David (Corey) Herrera */ /** * @file ft_bh_isa.h * @brief Blackhole Tensix coprocessor instruction encodings: the 32-bit word for each instruction * the kernels issue, the two issue paths (.ttinsn immediate and instruction-buffer store), and * the field-value constants those words take. * * Source: tt-isa-documentation. Each instruction cites the page it was read from (BlackholeA0 * where a Blackhole page exists, else WormholeB0) and the Diagrams/Src/Bits32.lua layout entry * (the `_BH` entry where one exists). Bit positions not drawn by any Bits32 entry are marked * "inferred" with the reasoning; those are the fields to check first against the instruction * diff. * * Every FT_BH_ENC_ is a constant expression when its arguments are, so FT_BH_TTINSN_ can * be used with compile-time arguments and FT_BH_PUSH_ with run-time ones. * * @status Clean-room replacement of the kernels' instruction-encoding header, plan Phase 4.2. * @issues Blackhole deltas measured by the instruction diff: AddrMod is 3 bits at 16:14 for * ELW*, MVMUL and ZEROACC (MOVD2B follows, unexercised) but stays 2 bits at 16:15 for GAPOOL * and GMPOOL; ZEROACC is relaid. UNPACR bits 5 and 0 and UNPACR_NOP bit 5 are inferred * (see each). * @todo None */ #ifndef FT_BH_ISA_H #define FT_BH_ISA_H #include #include "ft_bh_regs.h" /* ===== Issue mechanisms ================================================================== */ /* Opcode lives in bits 31:24 of every Tensix instruction word. */ #define FT_BH_ENC(opcode, fields) (((opcode) << 24) + (fields)) /* Immediate issue: the .ttinsn directive (BabyRISCV/PushTensixInstruction.md). */ #define FT_BH_TTINSN(word) __asm__ __volatile__(".ttinsn %0" : : "n"((word))) /* Store issue: the instruction buffer at INSTRN_BUF_BASE 0xFFE40000, placed by the linker script * (BabyRISCV/PushTensixInstruction.md). */ extern volatile uint32_t __instrn_buffer[]; #define FT_BH_INSTRN_BUF ((volatile uint32_t FT_BH_REG_PTR *)__instrn_buffer) #define FT_BH_PUSH(word) (FT_BH_INSTRN_BUF[0] = (word)) /* ===== Zero-operand instructions ========================================================= */ /* NOP.md (WH page), Bits32 NOP. */ #define FT_BH_ENC_NOP FT_BH_ENC(0x02u, 0) #define FT_BH_TTINSN_NOP FT_BH_TTINSN(FT_BH_ENC_NOP) #define FT_BH_PUSH_NOP FT_BH_PUSH(FT_BH_ENC_NOP) /* DMANOP.md (WH page), Bits32 DMANOP. */ #define FT_BH_ENC_DMANOP FT_BH_ENC(0x60u, 0) #define FT_BH_TTINSN_DMANOP FT_BH_TTINSN(FT_BH_ENC_DMANOP) #define FT_BH_PUSH_DMANOP FT_BH_PUSH(FT_BH_ENC_DMANOP) /* TRNSPSRCB.md (WH page), Bits32 TRNSPSRCB. */ #define FT_BH_ENC_TRNSPSRCB FT_BH_ENC(0x16u, 0) #define FT_BH_TTINSN_TRNSPSRCB FT_BH_TTINSN(FT_BH_ENC_TRNSPSRCB) #define FT_BH_PUSH_TRNSPSRCB FT_BH_PUSH(FT_BH_ENC_TRNSPSRCB) /* SFPNOP.md (BH page defers to WH, identical), Bits32 SFPNOP. */ #define FT_BH_ENC_SFPNOP FT_BH_ENC(0x8Fu, 0) #define FT_BH_TTINSN_SFPNOP FT_BH_TTINSN(FT_BH_ENC_SFPNOP) #define FT_BH_PUSH_SFPNOP FT_BH_PUSH(FT_BH_ENC_SFPNOP) /* ===== Matrix Unit (FPU) ================================================================= */ /* No Blackhole pages exist for these (BH MatrixUnit.md defers to WH); WH layouts used except * AddrMod: WH draws 2 bits at 16:15, Blackhole uses 3 bits at 16:14 (Blackhole layout, measured * by the instruction diff: ELWADD/ELWMUL/MVMUL words; MOVD2B follows, unexercised). GAPOOL and * GMPOOL are the exception: they keep the WH 2-bit AddrMod at 16:15 (measured). */ /* ELWADD.md / ELWSUB.md / ELWMUL.md (WH pages), Bits32 ELWADD / ELWSUB / ELWMUL. * clear_dvalid: FlipSrcB<<1 | FlipSrcA at 23:22. add_to_dest: AddDst at 21 (ELWMUL draws no * AddDst bit; same position kept). srcb_bcast: BroadcastSrcBRow<<1 | BroadcastSrcBCol0 at 20:19. * addr_mod: AddrMod at 16:14 (Blackhole layout, measured by the instruction diff). dst_row: DstRow * at 9:0. */ #define FT_BH_ELW_FIELDS(clear_dvalid, add_to_dest, srcb_bcast, addr_mod, dst_row) \ (((clear_dvalid) << 22) + ((add_to_dest) << 21) + ((srcb_bcast) << 19) + ((addr_mod) << 14) \ + ((dst_row) << 0)) #define FT_BH_ENC_ELWADD(clear_dvalid, add_to_dest, srcb_bcast, addr_mod, dst_row) \ FT_BH_ENC(0x28u, FT_BH_ELW_FIELDS(clear_dvalid, add_to_dest, srcb_bcast, addr_mod, dst_row)) #define FT_BH_TTINSN_ELWADD(clear_dvalid, add_to_dest, srcb_bcast, addr_mod, dst_row) \ FT_BH_TTINSN(FT_BH_ENC_ELWADD(clear_dvalid, add_to_dest, srcb_bcast, addr_mod, dst_row)) #define FT_BH_PUSH_ELWADD(clear_dvalid, add_to_dest, srcb_bcast, addr_mod, dst_row) \ FT_BH_PUSH(FT_BH_ENC_ELWADD(clear_dvalid, add_to_dest, srcb_bcast, addr_mod, dst_row)) #define FT_BH_ENC_ELWSUB(clear_dvalid, add_to_dest, srcb_bcast, addr_mod, dst_row) \ FT_BH_ENC(0x30u, FT_BH_ELW_FIELDS(clear_dvalid, add_to_dest, srcb_bcast, addr_mod, dst_row)) #define FT_BH_TTINSN_ELWSUB(clear_dvalid, add_to_dest, srcb_bcast, addr_mod, dst_row) \ FT_BH_TTINSN(FT_BH_ENC_ELWSUB(clear_dvalid, add_to_dest, srcb_bcast, addr_mod, dst_row)) #define FT_BH_PUSH_ELWSUB(clear_dvalid, add_to_dest, srcb_bcast, addr_mod, dst_row) \ FT_BH_PUSH(FT_BH_ENC_ELWSUB(clear_dvalid, add_to_dest, srcb_bcast, addr_mod, dst_row)) #define FT_BH_ENC_ELWMUL(clear_dvalid, add_to_dest, srcb_bcast, addr_mod, dst_row) \ FT_BH_ENC(0x27u, FT_BH_ELW_FIELDS(clear_dvalid, add_to_dest, srcb_bcast, addr_mod, dst_row)) #define FT_BH_TTINSN_ELWMUL(clear_dvalid, add_to_dest, srcb_bcast, addr_mod, dst_row) \ FT_BH_TTINSN(FT_BH_ENC_ELWMUL(clear_dvalid, add_to_dest, srcb_bcast, addr_mod, dst_row)) #define FT_BH_PUSH_ELWMUL(clear_dvalid, add_to_dest, srcb_bcast, addr_mod, dst_row) \ FT_BH_PUSH(FT_BH_ENC_ELWMUL(clear_dvalid, add_to_dest, srcb_bcast, addr_mod, dst_row)) /* MVMUL.md (WH page), Bits32 MVMUL. clear_dvalid at 23:22; mode: BroadcastSrcBRow at 19 (the * field base); addr_mod at 16:14 (Blackhole layout, measured by the instruction diff); dst_row * at 9:0. */ #define FT_BH_ENC_MVMUL(clear_dvalid, mode, addr_mod, dst_row) \ FT_BH_ENC(0x26u, ((clear_dvalid) << 22) + ((mode) << 19) + ((addr_mod) << 14) \ + ((dst_row) << 0)) #define FT_BH_TTINSN_MVMUL(clear_dvalid, mode, addr_mod, dst_row) \ FT_BH_TTINSN(FT_BH_ENC_MVMUL(clear_dvalid, mode, addr_mod, dst_row)) #define FT_BH_PUSH_MVMUL(clear_dvalid, mode, addr_mod, dst_row) \ FT_BH_PUSH(FT_BH_ENC_MVMUL(clear_dvalid, mode, addr_mod, dst_row)) /* GAPOOL.md / GMPOOL.md (WH pages), Bits32 GAPOOL / GMPOOL. clear_dvalid at 23:22; addr_mod at * 16:15, 2 bits, and max_pool_index (ArgMax) at 14: Blackhole layout, measured by the instruction * diff (GAPOOL store-form word 0x34088xxx, round 2), i.e. the WH layout, unlike the 3-bit AddrMod * of ELW* and MVMUL. dst_row at 9:0. mode: no Bits32 entry draws it (GMPOOL's syntax passes a fixed * 1 there); placed at 19, inferred from MVMUL/ELW* and consistent with bit 19 set in the measured * word. */ #define FT_BH_POOL_FIELDS(clear_dvalid, mode, addr_mod, max_pool_index, dst_row) \ (((clear_dvalid) << 22) + ((mode) << 19) + ((addr_mod) << 15) + ((max_pool_index) << 14) \ + ((dst_row) << 0)) #define FT_BH_ENC_GAPOOL(clear_dvalid, mode, addr_mod, max_pool_index, dst_row) \ FT_BH_ENC(0x34u, FT_BH_POOL_FIELDS(clear_dvalid, mode, addr_mod, max_pool_index, dst_row)) #define FT_BH_TTINSN_GAPOOL(clear_dvalid, mode, addr_mod, max_pool_index, dst_row) \ FT_BH_TTINSN(FT_BH_ENC_GAPOOL(clear_dvalid, mode, addr_mod, max_pool_index, dst_row)) #define FT_BH_PUSH_GAPOOL(clear_dvalid, mode, addr_mod, max_pool_index, dst_row) \ FT_BH_PUSH(FT_BH_ENC_GAPOOL(clear_dvalid, mode, addr_mod, max_pool_index, dst_row)) #define FT_BH_ENC_GMPOOL(clear_dvalid, mode, addr_mod, max_pool_index, dst_row) \ FT_BH_ENC(0x33u, FT_BH_POOL_FIELDS(clear_dvalid, mode, addr_mod, max_pool_index, dst_row)) #define FT_BH_TTINSN_GMPOOL(clear_dvalid, mode, addr_mod, max_pool_index, dst_row) \ FT_BH_TTINSN(FT_BH_ENC_GMPOOL(clear_dvalid, mode, addr_mod, max_pool_index, dst_row)) #define FT_BH_PUSH_GMPOOL(clear_dvalid, mode, addr_mod, max_pool_index, dst_row) \ FT_BH_PUSH(FT_BH_ENC_GMPOOL(clear_dvalid, mode, addr_mod, max_pool_index, dst_row)) /* MOVD2B.md (WH page), Bits32 MOVD2B. use_dst32b_lo: UseDst32bLo at 23; src_row: SrcRow at * 22:17; addr_mod at 16:14 (Blackhole Matrix Unit layout, measured by the instruction diff on * ELWADD/ELWMUL/MVMUL; not exercised for MOVD2B); mode: field base 12 (Move4Rows is mode bit 1, * bit 13); dst_row at 9:0. */ #define FT_BH_ENC_MOVD2B(use_dst32b_lo, src_row, addr_mod, mode, dst_row) \ FT_BH_ENC(0x0Au, ((use_dst32b_lo) << 23) + ((src_row) << 17) + ((addr_mod) << 14) \ + ((mode) << 12) + ((dst_row) << 0)) #define FT_BH_TTINSN_MOVD2B(use_dst32b_lo, src_row, addr_mod, mode, dst_row) \ FT_BH_TTINSN(FT_BH_ENC_MOVD2B(use_dst32b_lo, src_row, addr_mod, mode, dst_row)) #define FT_BH_PUSH_MOVD2B(use_dst32b_lo, src_row, addr_mod, mode, dst_row) \ FT_BH_PUSH(FT_BH_ENC_MOVD2B(use_dst32b_lo, src_row, addr_mod, mode, dst_row)) /* ZEROACC.md (WH page), Bits32 ZEROACC. Blackhole layout, measured by the instruction diff * (WH draws UseDst32b 21, Mode 20:19, Revert 18, AddrMod 16:15): clear_mode: Mode at 20:19; * use_dst32b at 18; clear_zero_flags (Revert) at 17 (reported with the diff; not exercised by a * non-zero value); addr_mod at 16:14; where: Imm10 at 9:0. */ #define FT_BH_ENC_ZEROACC(clear_mode, use_dst32b, clear_zero_flags, addr_mod, where) \ FT_BH_ENC(0x10u, ((clear_mode) << 19) + ((use_dst32b) << 18) + ((clear_zero_flags) << 17) \ + ((addr_mod) << 14) + ((where) << 0)) #define FT_BH_TTINSN_ZEROACC(clear_mode, use_dst32b, clear_zero_flags, addr_mod, where) \ FT_BH_TTINSN(FT_BH_ENC_ZEROACC(clear_mode, use_dst32b, clear_zero_flags, addr_mod, where)) #define FT_BH_PUSH_ZEROACC(clear_mode, use_dst32b, clear_zero_flags, addr_mod, where) \ FT_BH_PUSH(FT_BH_ENC_ZEROACC(clear_mode, use_dst32b, clear_zero_flags, addr_mod, where)) /* ZEROSRC.md (WH page), Bits32 ZEROSRC. zero_value: NegativeInfSrcA at 4; write_mode: * SingleBankMatrixUnit at 3; bank_mask: BothBanks at 2; src_mask: ClearSrcB<<1 | ClearSrcA at * 1:0. */ #define FT_BH_ENC_ZEROSRC(zero_value, write_mode, bank_mask, src_mask) \ FT_BH_ENC(0x11u, ((zero_value) << 4) + ((write_mode) << 3) + ((bank_mask) << 2) \ + ((src_mask) << 0)) #define FT_BH_TTINSN_ZEROSRC(zero_value, write_mode, bank_mask, src_mask) \ FT_BH_TTINSN(FT_BH_ENC_ZEROSRC(zero_value, write_mode, bank_mask, src_mask)) #define FT_BH_PUSH_ZEROSRC(zero_value, write_mode, bank_mask, src_mask) \ FT_BH_PUSH(FT_BH_ENC_ZEROSRC(zero_value, write_mode, bank_mask, src_mask)) /* ===== Register-window counters ========================================================== */ /* INCRWC.md (WH page), Bits32 INCRWC. cr: DstCr<<2 | SrcBCr<<1 | SrcACr at 20:18; dst_inc at * 17:14; srcb_inc at 13:10; srca_inc at 9:6. */ #define FT_BH_ENC_INCRWC(cr, dst_inc, srcb_inc, srca_inc) \ FT_BH_ENC(0x38u, ((cr) << 18) + ((dst_inc) << 14) + ((srcb_inc) << 10) + ((srca_inc) << 6)) #define FT_BH_TTINSN_INCRWC(cr, dst_inc, srcb_inc, srca_inc) \ FT_BH_TTINSN(FT_BH_ENC_INCRWC(cr, dst_inc, srcb_inc, srca_inc)) #define FT_BH_PUSH_INCRWC(cr, dst_inc, srcb_inc, srca_inc) \ FT_BH_PUSH(FT_BH_ENC_INCRWC(cr, dst_inc, srcb_inc, srca_inc)) /* SETRWC.md (WH page), Bits32 SETRWC. clear_dvalid: FlipSrcB<<1 | FlipSrcA at 23:22; cr: * DstCtoCr<<3 | DstCr<<2 | SrcBCr<<1 | SrcACr at 21:18; dst at 17:14; srcb at 13:10; srca at 9:6; * set_mask: Fidelity<<3 | Dst<<2 | SrcB<<1 | SrcA at 3:0. */ #define FT_BH_ENC_SETRWC(clear_dvalid, cr, dst, srcb, srca, set_mask) \ FT_BH_ENC(0x37u, ((clear_dvalid) << 22) + ((cr) << 18) + ((dst) << 14) + ((srcb) << 10) \ + ((srca) << 6) + ((set_mask) << 0)) #define FT_BH_TTINSN_SETRWC(clear_dvalid, cr, dst, srcb, srca, set_mask) \ FT_BH_TTINSN(FT_BH_ENC_SETRWC(clear_dvalid, cr, dst, srcb, srca, set_mask)) #define FT_BH_PUSH_SETRWC(clear_dvalid, cr, dst, srcb, srca, set_mask) \ FT_BH_PUSH(FT_BH_ENC_SETRWC(clear_dvalid, cr, dst, srcb, srca, set_mask)) /* ===== Configuration Unit ================================================================ */ /* SETC16.md (BH page), Bits32 SETC16. cfg_index: CfgIndex at 23:16; value: NewValue at 15:0. */ #define FT_BH_ENC_SETC16(cfg_index, value) \ FT_BH_ENC(0xB2u, ((cfg_index) << 16) + ((value) << 0)) #define FT_BH_TTINSN_SETC16(cfg_index, value) FT_BH_TTINSN(FT_BH_ENC_SETC16(cfg_index, value)) #define FT_BH_PUSH_SETC16(cfg_index, value) FT_BH_PUSH(FT_BH_ENC_SETC16(cfg_index, value)) /* RMWCIB.md (BH page), Bits32 RMWCIB. Opcode 0xB3 + byte lane. mask: Mask at 23:16; data: * NewValue at 15:8; cfg_word: Index4 at 7:0. */ #define FT_BH_RMWCIB_FIELDS(mask, data, cfg_word) \ (((mask) << 16) + ((data) << 8) + ((cfg_word) << 0)) #define FT_BH_ENC_RMWCIB0(mask, data, cfg_word) \ FT_BH_ENC(0xB3u, FT_BH_RMWCIB_FIELDS(mask, data, cfg_word)) #define FT_BH_TTINSN_RMWCIB0(mask, data, cfg_word) \ FT_BH_TTINSN(FT_BH_ENC_RMWCIB0(mask, data, cfg_word)) #define FT_BH_PUSH_RMWCIB0(mask, data, cfg_word) FT_BH_PUSH(FT_BH_ENC_RMWCIB0(mask, data, cfg_word)) #define FT_BH_ENC_RMWCIB1(mask, data, cfg_word) \ FT_BH_ENC(0xB4u, FT_BH_RMWCIB_FIELDS(mask, data, cfg_word)) #define FT_BH_TTINSN_RMWCIB1(mask, data, cfg_word) \ FT_BH_TTINSN(FT_BH_ENC_RMWCIB1(mask, data, cfg_word)) #define FT_BH_PUSH_RMWCIB1(mask, data, cfg_word) FT_BH_PUSH(FT_BH_ENC_RMWCIB1(mask, data, cfg_word)) #define FT_BH_ENC_RMWCIB2(mask, data, cfg_word) \ FT_BH_ENC(0xB5u, FT_BH_RMWCIB_FIELDS(mask, data, cfg_word)) #define FT_BH_TTINSN_RMWCIB2(mask, data, cfg_word) \ FT_BH_TTINSN(FT_BH_ENC_RMWCIB2(mask, data, cfg_word)) #define FT_BH_PUSH_RMWCIB2(mask, data, cfg_word) FT_BH_PUSH(FT_BH_ENC_RMWCIB2(mask, data, cfg_word)) #define FT_BH_ENC_RMWCIB3(mask, data, cfg_word) \ FT_BH_ENC(0xB6u, FT_BH_RMWCIB_FIELDS(mask, data, cfg_word)) #define FT_BH_TTINSN_RMWCIB3(mask, data, cfg_word) \ FT_BH_TTINSN(FT_BH_ENC_RMWCIB3(mask, data, cfg_word)) #define FT_BH_PUSH_RMWCIB3(mask, data, cfg_word) FT_BH_PUSH(FT_BH_ENC_RMWCIB3(mask, data, cfg_word)) /* WRCFG.md (BH page defers to WH, identical), Bits32 WRCFG. gpr: InputReg at 21:16; is_128bit: * Is128Bit at 15; cfg_word: CfgIndex at 10:0. */ #define FT_BH_ENC_WRCFG(gpr, is_128bit, cfg_word) \ FT_BH_ENC(0xB0u, ((gpr) << 16) + ((is_128bit) << 15) + ((cfg_word) << 0)) #define FT_BH_TTINSN_WRCFG(gpr, is_128bit, cfg_word) \ FT_BH_TTINSN(FT_BH_ENC_WRCFG(gpr, is_128bit, cfg_word)) #define FT_BH_PUSH_WRCFG(gpr, is_128bit, cfg_word) \ FT_BH_PUSH(FT_BH_ENC_WRCFG(gpr, is_128bit, cfg_word)) /* RDCFG.md (BH page), Bits32 RDCFG. gpr: ResultReg at 21:16; cfg_word: CfgIndex at 10:0. */ #define FT_BH_ENC_RDCFG(gpr, cfg_word) FT_BH_ENC(0xB1u, ((gpr) << 16) + ((cfg_word) << 0)) #define FT_BH_TTINSN_RDCFG(gpr, cfg_word) FT_BH_TTINSN(FT_BH_ENC_RDCFG(gpr, cfg_word)) #define FT_BH_PUSH_RDCFG(gpr, cfg_word) FT_BH_PUSH(FT_BH_ENC_RDCFG(gpr, cfg_word)) /* ===== Sync Unit ========================================================================= */ /* STALLWAIT.md (BH page), Bits32 STALLWAIT_BH. stall_on: BlockMask at 23:15; wait_for: * ConditionMask at 12:0 (13 bits on BH; WH is 15 bits). */ #define FT_BH_ENC_STALLWAIT(stall_on, wait_for) \ FT_BH_ENC(0xA2u, ((stall_on) << 15) + ((wait_for) << 0)) #define FT_BH_TTINSN_STALLWAIT(stall_on, wait_for) \ FT_BH_TTINSN(FT_BH_ENC_STALLWAIT(stall_on, wait_for)) #define FT_BH_PUSH_STALLWAIT(stall_on, wait_for) FT_BH_PUSH(FT_BH_ENC_STALLWAIT(stall_on, wait_for)) /* SEMINIT.md (BH page defers to WH, identical), Bits32 SEMINIT. max_value: NewMax at 23:20; * init_value: NewValue at 19:16; sem_mask: SemaphoreMask at 9:2. */ #define FT_BH_ENC_SEMINIT(max_value, init_value, sem_mask) \ FT_BH_ENC(0xA3u, ((max_value) << 20) + ((init_value) << 16) + ((sem_mask) << 2)) #define FT_BH_TTINSN_SEMINIT(max_value, init_value, sem_mask) \ FT_BH_TTINSN(FT_BH_ENC_SEMINIT(max_value, init_value, sem_mask)) #define FT_BH_PUSH_SEMINIT(max_value, init_value, sem_mask) \ FT_BH_PUSH(FT_BH_ENC_SEMINIT(max_value, init_value, sem_mask)) /* SEMPOST.md / SEMGET.md (BH pages defer to WH, identical), Bits32 SEMPOST / SEMGET. * sem_mask: SemaphoreMask at 9:2. */ #define FT_BH_ENC_SEMPOST(sem_mask) FT_BH_ENC(0xA4u, ((sem_mask) << 2)) #define FT_BH_TTINSN_SEMPOST(sem_mask) FT_BH_TTINSN(FT_BH_ENC_SEMPOST(sem_mask)) #define FT_BH_PUSH_SEMPOST(sem_mask) FT_BH_PUSH(FT_BH_ENC_SEMPOST(sem_mask)) #define FT_BH_ENC_SEMGET(sem_mask) FT_BH_ENC(0xA5u, ((sem_mask) << 2)) #define FT_BH_TTINSN_SEMGET(sem_mask) FT_BH_TTINSN(FT_BH_ENC_SEMGET(sem_mask)) #define FT_BH_PUSH_SEMGET(sem_mask) FT_BH_PUSH(FT_BH_ENC_SEMGET(sem_mask)) /* SEMWAIT.md (BH page), Bits32 SEMWAIT. stall_on: BlockMask at 23:15; sem_mask: SemaphoreMask * at 9:2; wait_cond: ConditionMask at 1:0. */ #define FT_BH_ENC_SEMWAIT(stall_on, sem_mask, wait_cond) \ FT_BH_ENC(0xA6u, ((stall_on) << 15) + ((sem_mask) << 2) + ((wait_cond) << 0)) #define FT_BH_TTINSN_SEMWAIT(stall_on, sem_mask, wait_cond) \ FT_BH_TTINSN(FT_BH_ENC_SEMWAIT(stall_on, sem_mask, wait_cond)) #define FT_BH_PUSH_SEMWAIT(stall_on, sem_mask, wait_cond) \ FT_BH_PUSH(FT_BH_ENC_SEMWAIT(stall_on, sem_mask, wait_cond)) /* ATGETM.md / ATRELM.md (BH pages), Bits32 ATGETM / ATRELM. mutex: Index at 15:0. */ #define FT_BH_ENC_ATGETM(mutex) FT_BH_ENC(0xA0u, ((mutex) << 0)) #define FT_BH_TTINSN_ATGETM(mutex) FT_BH_TTINSN(FT_BH_ENC_ATGETM(mutex)) #define FT_BH_PUSH_ATGETM(mutex) FT_BH_PUSH(FT_BH_ENC_ATGETM(mutex)) #define FT_BH_ENC_ATRELM(mutex) FT_BH_ENC(0xA1u, ((mutex) << 0)) #define FT_BH_TTINSN_ATRELM(mutex) FT_BH_TTINSN(FT_BH_ENC_ATRELM(mutex)) #define FT_BH_PUSH_ATRELM(mutex) FT_BH_PUSH(FT_BH_ENC_ATRELM(mutex)) /* ===== Frontend: MOP expander and replay buffer ========================================== */ /* MOP.md (WH page; BH MOPExpander.md has no MOP encoding), Bits32 MOP. mop_type: Template at 23; * loop_count: Count1 at 22:16; zmask_lo: MaskLo at 15:0. */ #define FT_BH_ENC_MOP(mop_type, loop_count, zmask_lo) \ FT_BH_ENC(0x01u, ((mop_type) << 23) + ((loop_count) << 16) + ((zmask_lo) << 0)) #define FT_BH_TTINSN_MOP(mop_type, loop_count, zmask_lo) \ FT_BH_TTINSN(FT_BH_ENC_MOP(mop_type, loop_count, zmask_lo)) #define FT_BH_PUSH_MOP(mop_type, loop_count, zmask_lo) \ FT_BH_PUSH(FT_BH_ENC_MOP(mop_type, loop_count, zmask_lo)) /* REPLAY.md (BH page defers to WH, "similar"), Bits32 REPLAY (no _BH entry). start: Index at * 18:14; length: Count at 9:4; exec_while_loading: Exec at 1; load_mode: Load at 0. */ #define FT_BH_ENC_REPLAY(start, length, exec_while_loading, load_mode) \ FT_BH_ENC(0x04u, ((start) << 14) + ((length) << 4) + ((exec_while_loading) << 1) \ + ((load_mode) << 0)) #define FT_BH_TTINSN_REPLAY(start, length, exec_while_loading, load_mode) \ FT_BH_TTINSN(FT_BH_ENC_REPLAY(start, length, exec_while_loading, load_mode)) #define FT_BH_PUSH_REPLAY(start, length, exec_while_loading, load_mode) \ FT_BH_PUSH(FT_BH_ENC_REPLAY(start, length, exec_while_loading, load_mode)) /* ===== Scalar Unit (ThCon) =============================================================== */ /* SETDMAREG_Immediate.md / SETDMAREG_Special.md (WH pages), Bits32 SETDMAREG_Immediate / * SETDMAREG_Special. sig_size: ResultSize at 23:22; payload: NewValue at 23:8 (or the special * selectors WhichPackers/InputSource/InputHalfReg starting at 8); set_signals_mode: bit 7; * reg_index: ResultHalfReg at 6:0. */ #define FT_BH_ENC_SETDMAREG(sig_size, payload, set_signals_mode, reg_index) \ FT_BH_ENC(0x45u, ((sig_size) << 22) + ((payload) << 8) + ((set_signals_mode) << 7) \ + ((reg_index) << 0)) #define FT_BH_TTINSN_SETDMAREG(sig_size, payload, set_signals_mode, reg_index) \ FT_BH_TTINSN(FT_BH_ENC_SETDMAREG(sig_size, payload, set_signals_mode, reg_index)) #define FT_BH_PUSH_SETDMAREG(sig_size, payload, set_signals_mode, reg_index) \ FT_BH_PUSH(FT_BH_ENC_SETDMAREG(sig_size, payload, set_signals_mode, reg_index)) /* ADDDMAREG.md (WH page), Bits32 ADDDMAREG / ADDDMAREGi. b_is_const: bit 23; result: ResultReg * at 17:12; operand_b: RightReg or RightImm6 at 11:6; operand_a: LeftReg at 5:0. */ #define FT_BH_ENC_ADDDMAREG(b_is_const, result, operand_b, operand_a) \ FT_BH_ENC(0x58u, ((b_is_const) << 23) + ((result) << 12) + ((operand_b) << 6) \ + ((operand_a) << 0)) #define FT_BH_TTINSN_ADDDMAREG(b_is_const, result, operand_b, operand_a) \ FT_BH_TTINSN(FT_BH_ENC_ADDDMAREG(b_is_const, result, operand_b, operand_a)) #define FT_BH_PUSH_ADDDMAREG(b_is_const, result, operand_b, operand_a) \ FT_BH_PUSH(FT_BH_ENC_ADDDMAREG(b_is_const, result, operand_b, operand_a)) /* STOREREG.md (WH page), Bits32 STOREREG. gpr: DataReg at 23:18; reg_addr: AddrLo at 17:0. */ #define FT_BH_ENC_STOREREG(gpr, reg_addr) FT_BH_ENC(0x67u, ((gpr) << 18) + ((reg_addr) << 0)) #define FT_BH_TTINSN_STOREREG(gpr, reg_addr) FT_BH_TTINSN(FT_BH_ENC_STOREREG(gpr, reg_addr)) #define FT_BH_PUSH_STOREREG(gpr, reg_addr) FT_BH_PUSH(FT_BH_ENC_STOREREG(gpr, reg_addr)) /* ===== Address counters (ADCs) =========================================================== */ /* SETADC.md (WH page), Bits32 SETADC. set_mask: PK<<2 | U1<<1 | U0 at 23:21; channel: Channel at * 20; dim: XYZW at 19:18; value: NewValue at 17:0. */ #define FT_BH_ENC_SETADC(set_mask, channel, dim, value) \ FT_BH_ENC(0x50u, ((set_mask) << 21) + ((channel) << 20) + ((dim) << 18) + ((value) << 0)) #define FT_BH_TTINSN_SETADC(set_mask, channel, dim, value) \ FT_BH_TTINSN(FT_BH_ENC_SETADC(set_mask, channel, dim, value)) #define FT_BH_PUSH_SETADC(set_mask, channel, dim, value) \ FT_BH_PUSH(FT_BH_ENC_SETADC(set_mask, channel, dim, value)) /* SETADCXY.md / SETADCZW.md (WH pages), Bits32 SETADCXY / SETADCZW. set_mask at 23:21; ch1 second * coordinate (Y1Val / W1Val) at 17:15; ch1 first (X1Val / Z1Val) at 14:12; ch0 second (Y0Val / * W0Val) at 11:9; ch0 first (X0Val / Z0Val) at 8:6; bit_mask (Y1 X1 Y0 X0 / W1 Z1 W0 Z0) at 3:0. * ThreadOverride (19:18) has no operand. */ #define FT_BH_SETADC2D_FIELDS(set_mask, ch1_b, ch1_a, ch0_b, ch0_a, bit_mask) \ (((set_mask) << 21) + ((ch1_b) << 15) + ((ch1_a) << 12) + ((ch0_b) << 9) + ((ch0_a) << 6) \ + ((bit_mask) << 0)) #define FT_BH_ENC_SETADCXY(set_mask, ch1_y, ch1_x, ch0_y, ch0_x, bit_mask) \ FT_BH_ENC(0x51u, FT_BH_SETADC2D_FIELDS(set_mask, ch1_y, ch1_x, ch0_y, ch0_x, bit_mask)) #define FT_BH_TTINSN_SETADCXY(set_mask, ch1_y, ch1_x, ch0_y, ch0_x, bit_mask) \ FT_BH_TTINSN(FT_BH_ENC_SETADCXY(set_mask, ch1_y, ch1_x, ch0_y, ch0_x, bit_mask)) #define FT_BH_PUSH_SETADCXY(set_mask, ch1_y, ch1_x, ch0_y, ch0_x, bit_mask) \ FT_BH_PUSH(FT_BH_ENC_SETADCXY(set_mask, ch1_y, ch1_x, ch0_y, ch0_x, bit_mask)) #define FT_BH_ENC_SETADCZW(set_mask, ch1_w, ch1_z, ch0_w, ch0_z, bit_mask) \ FT_BH_ENC(0x54u, FT_BH_SETADC2D_FIELDS(set_mask, ch1_w, ch1_z, ch0_w, ch0_z, bit_mask)) #define FT_BH_TTINSN_SETADCZW(set_mask, ch1_w, ch1_z, ch0_w, ch0_z, bit_mask) \ FT_BH_TTINSN(FT_BH_ENC_SETADCZW(set_mask, ch1_w, ch1_z, ch0_w, ch0_z, bit_mask)) #define FT_BH_PUSH_SETADCZW(set_mask, ch1_w, ch1_z, ch0_w, ch0_z, bit_mask) \ FT_BH_PUSH(FT_BH_ENC_SETADCZW(set_mask, ch1_w, ch1_z, ch0_w, ch0_z, bit_mask)) /* SETADCXX.md (WH page), Bits32 SETADCXX. set_mask at 23:21; x_end: X1Val at 19:10; x_start: * X0Val at 9:0. */ #define FT_BH_ENC_SETADCXX(set_mask, x_end, x_start) \ FT_BH_ENC(0x5Eu, ((set_mask) << 21) + ((x_end) << 10) + ((x_start) << 0)) #define FT_BH_TTINSN_SETADCXX(set_mask, x_end, x_start) \ FT_BH_TTINSN(FT_BH_ENC_SETADCXX(set_mask, x_end, x_start)) #define FT_BH_PUSH_SETADCXX(set_mask, x_end, x_start) \ FT_BH_PUSH(FT_BH_ENC_SETADCXX(set_mask, x_end, x_start)) /* ===== Unpackers and packers ============================================================= */ /* UNPACR_Regular.md (BH page defers to WH, conditionalized inline), Bits32 UNPACR_Regular (no * _BH entry). which: WhichUnpacker at 23; addr_mod: Ch1YInc/Ch1ZInc/Ch0YInc/Ch0ZInc at 22:15; * ctx_count_inc: bit 13 (the IncrementContextCounter form sets it); ctx_id: ContextNumber at * 12:10; adc_ctx_id: ContextADC at 9:8; ovrd_thread_id: MultiContextMode at 7; set_dvalid: * FlipSrc at 6; zero_write2: AllDatumsAreZero at 4; auto_inc_ctx_id: UseContextCounter at 3; * row_search: RowSearch at 2; cache_flush: bit 1 (the FlushCache form sets it). * rarefy_b at 5 and last at 0 are inferred: those two bits are the only ones left undrawn, and * the documented operand order puts the two corresponding constant operands at those slots. */ #define FT_BH_ENC_UNPACR(which, addr_mod, ctx_count_inc, ctx_id, adc_ctx_id, ovrd_thread_id, \ set_dvalid, rarefy_b, zero_write2, auto_inc_ctx_id, row_search, \ cache_flush, last) \ FT_BH_ENC(0x42u, ((which) << 23) + ((addr_mod) << 15) + ((ctx_count_inc) << 13) \ + ((ctx_id) << 10) + ((adc_ctx_id) << 8) + ((ovrd_thread_id) << 7) \ + ((set_dvalid) << 6) + ((rarefy_b) << 5) + ((zero_write2) << 4) \ + ((auto_inc_ctx_id) << 3) + ((row_search) << 2) \ + ((cache_flush) << 1) + ((last) << 0)) #define FT_BH_TTINSN_UNPACR(which, addr_mod, ctx_count_inc, ctx_id, adc_ctx_id, ovrd_thread_id, \ set_dvalid, rarefy_b, zero_write2, auto_inc_ctx_id, row_search, \ cache_flush, last) \ FT_BH_TTINSN(FT_BH_ENC_UNPACR(which, addr_mod, ctx_count_inc, ctx_id, adc_ctx_id, \ ovrd_thread_id, set_dvalid, rarefy_b, zero_write2, \ auto_inc_ctx_id, row_search, cache_flush, last)) #define FT_BH_PUSH_UNPACR(which, addr_mod, ctx_count_inc, ctx_id, adc_ctx_id, ovrd_thread_id, \ set_dvalid, rarefy_b, zero_write2, auto_inc_ctx_id, row_search, \ cache_flush, last) \ FT_BH_PUSH(FT_BH_ENC_UNPACR(which, addr_mod, ctx_count_inc, ctx_id, adc_ctx_id, \ ovrd_thread_id, set_dvalid, rarefy_b, zero_write2, \ auto_inc_ctx_id, row_search, cache_flush, last)) /* UNPACR_NOP*.md (WH pages), Bits32 UNPACR_NOP_* (no _BH entries). which: WhichUnpacker at 23; * stream_id: WhichStream at 21:16; msg_clr_cnt: ClearCount at 14:4; stall_clr_ctrl: * WaitLikeUnpacr at 4; bank_clr_ctrl: BothBanks at 3; src_clr_val_ctrl: NegativeInfSrcA at 2 * (UNPACR_NOP_ZEROSRC.md notes this bit is part of a wider clear-value field on BH; width not * documented); unpack_pop: the sub-op select at 2:0 (0x2 = plain NOP). * set_dvalid at 8: Blackhole layout, measured by the instruction diff (a ZEROSRC-form word with * set_dvalid = 1 reads 0x101 in its low 12 bits). clr_to1_fmt_ctrl at 5 is inferred (an undrawn * bit above the ZEROSRC controls) and not yet exercised by a non-zero value. */ #define FT_BH_ENC_UNPACR_NOP(which, stream_id, msg_clr_cnt, set_dvalid, clr_to1_fmt_ctrl, \ stall_clr_ctrl, bank_clr_ctrl, src_clr_val_ctrl, unpack_pop) \ FT_BH_ENC(0x43u, ((which) << 23) + ((stream_id) << 16) + ((set_dvalid) << 8) \ + ((clr_to1_fmt_ctrl) << 5) + ((msg_clr_cnt) << 4) \ + ((stall_clr_ctrl) << 4) + ((bank_clr_ctrl) << 3) \ + ((src_clr_val_ctrl) << 2) + ((unpack_pop) << 0)) #define FT_BH_TTINSN_UNPACR_NOP(which, stream_id, msg_clr_cnt, set_dvalid, clr_to1_fmt_ctrl, \ stall_clr_ctrl, bank_clr_ctrl, src_clr_val_ctrl, unpack_pop) \ FT_BH_TTINSN(FT_BH_ENC_UNPACR_NOP(which, stream_id, msg_clr_cnt, set_dvalid, \ clr_to1_fmt_ctrl, stall_clr_ctrl, bank_clr_ctrl, \ src_clr_val_ctrl, unpack_pop)) #define FT_BH_PUSH_UNPACR_NOP(which, stream_id, msg_clr_cnt, set_dvalid, clr_to1_fmt_ctrl, \ stall_clr_ctrl, bank_clr_ctrl, src_clr_val_ctrl, unpack_pop) \ FT_BH_PUSH(FT_BH_ENC_UNPACR_NOP(which, stream_id, msg_clr_cnt, set_dvalid, \ clr_to1_fmt_ctrl, stall_clr_ctrl, bank_clr_ctrl, \ src_clr_val_ctrl, unpack_pop)) /* PACR.md (BH page), Bits32 PACR_BH. cfg_ctxt: CfgContext at 22:21; row_pad_zero: RowPadZero at * 20:18; dst_access_mode: DstAccessMode at 17; addr_mod: AddrMod at 16:15; addr_cnt_ctxt: * AddrCntContext at 14:13; zero_write: ZeroWrite at 12; read_intf_sel: ReadIntfSel at 11:8; * ovrd_thread_id: OvrdThreadId at 7; concat: Concat at 4; ctxt_ctrl: CtxtCtrl at 3:2; flush: * Flush at 1; last: Last at 0. */ #define FT_BH_ENC_PACR(cfg_ctxt, row_pad_zero, dst_access_mode, addr_mod, addr_cnt_ctxt, \ zero_write, read_intf_sel, ovrd_thread_id, concat, ctxt_ctrl, flush, \ last) \ FT_BH_ENC(0x41u, ((cfg_ctxt) << 21) + ((row_pad_zero) << 18) + ((dst_access_mode) << 17) \ + ((addr_mod) << 15) + ((addr_cnt_ctxt) << 13) + ((zero_write) << 12) \ + ((read_intf_sel) << 8) + ((ovrd_thread_id) << 7) + ((concat) << 4) \ + ((ctxt_ctrl) << 2) + ((flush) << 1) + ((last) << 0)) #define FT_BH_TTINSN_PACR(cfg_ctxt, row_pad_zero, dst_access_mode, addr_mod, addr_cnt_ctxt, \ zero_write, read_intf_sel, ovrd_thread_id, concat, ctxt_ctrl, flush, \ last) \ FT_BH_TTINSN(FT_BH_ENC_PACR(cfg_ctxt, row_pad_zero, dst_access_mode, addr_mod, \ addr_cnt_ctxt, zero_write, read_intf_sel, ovrd_thread_id, \ concat, ctxt_ctrl, flush, last)) #define FT_BH_PUSH_PACR(cfg_ctxt, row_pad_zero, dst_access_mode, addr_mod, addr_cnt_ctxt, \ zero_write, read_intf_sel, ovrd_thread_id, concat, ctxt_ctrl, flush, \ last) \ FT_BH_PUSH(FT_BH_ENC_PACR(cfg_ctxt, row_pad_zero, dst_access_mode, addr_mod, \ addr_cnt_ctxt, zero_write, read_intf_sel, ovrd_thread_id, \ concat, ctxt_ctrl, flush, last)) /* ===== Vector Unit (SFPU) ================================================================ */ /* SFPLOAD.md (BH page), Bits32 SFPLOAD_BH. lreg: VD at 23:20; instr_mod: Mod0 at 19:16; * addr_mode: AddrMod at 15:13 (3 bits on BH; WH is 2 bits at 15:14); dest_addr: Imm10 at 9:0. */ #define FT_BH_ENC_SFPLOAD(lreg, instr_mod, addr_mode, dest_addr) \ FT_BH_ENC(0x70u, ((lreg) << 20) + ((instr_mod) << 16) + ((addr_mode) << 13) \ + ((dest_addr) << 0)) #define FT_BH_TTINSN_SFPLOAD(lreg, instr_mod, addr_mode, dest_addr) \ FT_BH_TTINSN(FT_BH_ENC_SFPLOAD(lreg, instr_mod, addr_mode, dest_addr)) #define FT_BH_PUSH_SFPLOAD(lreg, instr_mod, addr_mode, dest_addr) \ FT_BH_PUSH(FT_BH_ENC_SFPLOAD(lreg, instr_mod, addr_mode, dest_addr)) /* SFPLOADMACRO.md (BH page), Bits32 SFPLOADMACRO_BH. lreg: MacroIndex<<2 | VDLo at 23:20; * instr_mod: Mod0 at 19:16; addr_mode: AddrMod at 15:13 (WH: 2 bits at 15:14); dest_addr: * Imm9<<1 | VDHi at 9:0. */ #define FT_BH_ENC_SFPLOADMACRO(lreg, instr_mod, addr_mode, dest_addr) \ FT_BH_ENC(0x93u, ((lreg) << 20) + ((instr_mod) << 16) + ((addr_mode) << 13) \ + ((dest_addr) << 0)) #define FT_BH_TTINSN_SFPLOADMACRO(lreg, instr_mod, addr_mode, dest_addr) \ FT_BH_TTINSN(FT_BH_ENC_SFPLOADMACRO(lreg, instr_mod, addr_mode, dest_addr)) #define FT_BH_PUSH_SFPLOADMACRO(lreg, instr_mod, addr_mode, dest_addr) \ FT_BH_PUSH(FT_BH_ENC_SFPLOADMACRO(lreg, instr_mod, addr_mode, dest_addr)) /* SFPLOADI.md (BH page defers to WH, identical), Bits32 SFPLOADI. lreg: VD at 23:20; instr_mod: * Mod0 at 19:16; imm16: Imm16 at 15:0. */ #define FT_BH_ENC_SFPLOADI(lreg, instr_mod, imm16) \ FT_BH_ENC(0x71u, ((lreg) << 20) + ((instr_mod) << 16) + ((imm16) << 0)) #define FT_BH_TTINSN_SFPLOADI(lreg, instr_mod, imm16) \ FT_BH_TTINSN(FT_BH_ENC_SFPLOADI(lreg, instr_mod, imm16)) #define FT_BH_PUSH_SFPLOADI(lreg, instr_mod, imm16) \ FT_BH_PUSH(FT_BH_ENC_SFPLOADI(lreg, instr_mod, imm16)) /* SFPSHFT2.md (BH page), Bits32 SFPSHFT2 / SFPSHFT2b. imm12: VB or Imm12 at 23:12; lreg_c: VC at * 11:8; lreg_dest: VD at 7:4; instr_mod: Mod1 at 3:0. */ #define FT_BH_ENC_SFPSHFT2(imm12, lreg_c, lreg_dest, instr_mod) \ FT_BH_ENC(0x94u, ((imm12) << 12) + ((lreg_c) << 8) + ((lreg_dest) << 4) \ + ((instr_mod) << 0)) #define FT_BH_TTINSN_SFPSHFT2(imm12, lreg_c, lreg_dest, instr_mod) \ FT_BH_TTINSN(FT_BH_ENC_SFPSHFT2(imm12, lreg_c, lreg_dest, instr_mod)) #define FT_BH_PUSH_SFPSHFT2(imm12, lreg_c, lreg_dest, instr_mod) \ FT_BH_PUSH(FT_BH_ENC_SFPSHFT2(imm12, lreg_c, lreg_dest, instr_mod)) /* SFPSWAP.md (BH page), Bits32 SFPSWAP. imm12: first operand (0 in the documented syntax), * placed at 23:12 like SFPSHFT2; lreg_c: VC at 11:8; lreg_dest: VD at 7:4; instr_mod: Mod1 at * 3:0. */ #define FT_BH_ENC_SFPSWAP(imm12, lreg_c, lreg_dest, instr_mod) \ FT_BH_ENC(0x92u, ((imm12) << 12) + ((lreg_c) << 8) + ((lreg_dest) << 4) \ + ((instr_mod) << 0)) #define FT_BH_TTINSN_SFPSWAP(imm12, lreg_c, lreg_dest, instr_mod) \ FT_BH_TTINSN(FT_BH_ENC_SFPSWAP(imm12, lreg_c, lreg_dest, instr_mod)) #define FT_BH_PUSH_SFPSWAP(imm12, lreg_c, lreg_dest, instr_mod) \ FT_BH_PUSH(FT_BH_ENC_SFPSWAP(imm12, lreg_c, lreg_dest, instr_mod)) /* SFPCONFIG.md (BH page defers to WH, identical), Bits32 SFPCONFIG. imm16: Imm16 at 23:8; * config_dest: VD at 7:4; instr_mod: Mod1 at 3:0. */ #define FT_BH_ENC_SFPCONFIG(imm16, config_dest, instr_mod) \ FT_BH_ENC(0x91u, ((imm16) << 8) + ((config_dest) << 4) + ((instr_mod) << 0)) #define FT_BH_TTINSN_SFPCONFIG(imm16, config_dest, instr_mod) \ FT_BH_TTINSN(FT_BH_ENC_SFPCONFIG(imm16, config_dest, instr_mod)) #define FT_BH_PUSH_SFPCONFIG(imm16, config_dest, instr_mod) \ FT_BH_PUSH(FT_BH_ENC_SFPCONFIG(imm16, config_dest, instr_mod)) /* ===== Field-value constants ============================================================= */ /* SETRWC.md: clear_dvalid (FlipSrcB<<1 | FlipSrcA), set_mask (Fidelity Dst SrcB SrcA) and cr * (DstCtoCr DstCr SrcBCr SrcACr) bit values. */ #define FT_BH_SETRWC_CLR_NONE 0x0u #define FT_BH_SETRWC_CLR_A 0x1u #define FT_BH_SETRWC_CLR_B 0x2u #define FT_BH_SETRWC_CLR_AB 0x3u #define FT_BH_SETRWC_SET_A 0x1u #define FT_BH_SETRWC_SET_B 0x2u #define FT_BH_SETRWC_SET_AB 0x3u #define FT_BH_SETRWC_SET_D 0x4u #define FT_BH_SETRWC_SET_ABD_F 0xFu #define FT_BH_SETRWC_CR_AB 0x3u #define FT_BH_SETRWC_CR_D 0x4u /* STALLWAIT.md (BH page) condition bits C0..C12; SEMWAIT-shared names. */ #define FT_BH_STALLWAIT_COND_NONE 0x0u #define FT_BH_STALLWAIT_COND_THCON 0x1u #define FT_BH_STALLWAIT_COND_UNPACK0 0x2u #define FT_BH_STALLWAIT_COND_UNPACK1 0x4u #define FT_BH_STALLWAIT_COND_UNPACK 0x6u #define FT_BH_STALLWAIT_COND_PACK 0x8u #define FT_BH_STALLWAIT_COND_MATH 0x10u #define FT_BH_STALLWAIT_COND_SRCA_VALID 0x80u #define FT_BH_STALLWAIT_COND_SRCB_VALID 0x100u #define FT_BH_STALLWAIT_COND_TRISC_CFG 0x400u #define FT_BH_STALLWAIT_COND_SFPU1 0x800u #define FT_BH_STALLWAIT_COND_SFPU 0x800u /* STALLWAIT.md (BH page) block bits B0..B8. */ #define FT_BH_STALLWAIT_BLOCK_TDMA 0x1u #define FT_BH_STALLWAIT_BLOCK_SYNC 0x2u #define FT_BH_STALLWAIT_BLOCK_UNPACK 0x8u #define FT_BH_STALLWAIT_BLOCK_THCON 0x20u #define FT_BH_STALLWAIT_BLOCK_MATH 0x40u #define FT_BH_STALLWAIT_BLOCK_CFG 0x80u #define FT_BH_STALLWAIT_BLOCK_SFPU 0x100u /* SEMWAIT.md condition bits C0 (Value == 0) and C1 (Value >= Max); semaphore 1 select bit. */ #define FT_BH_SEMWAIT_COND_ZERO 0x1u #define FT_BH_SEMWAIT_COND_MAX 0x2u #define FT_BH_SEMAPHORE_1 0x2u /* ELWADD.md srcb_bcast values (BroadcastSrcBRow<<1 | BroadcastSrcBCol0). */ #define FT_BH_ELWADD_SRCB_NO_BCAST 0x0u #define FT_BH_ELWADD_SRCB_BCAST_COL 0x1u #define FT_BH_ELWADD_SRCB_BCAST_ROW 0x2u #define FT_BH_ELWADD_SRCB_BCAST_ALL 0x3u /* ZEROACC.md Mode values. */ #define FT_BH_ZEROACC_CLR_SPECIFIC 0x0u #define FT_BH_ZEROACC_CLR_16 0x1u #define FT_BH_ZEROACC_CLR_HALF 0x2u #define FT_BH_ZEROACC_CLR_ALL 0x3u /* SETADC.md set_mask (PK U1 U0), XYZW index for W, channel 0. */ #define FT_BH_SETADC_UNP_A 0x1u #define FT_BH_SETADC_UNP_B 0x2u #define FT_BH_SETADC_UNP_AB 0x3u #define FT_BH_SETADC_PAC 0x4u #define FT_BH_SETADC_SET_W 0x3u #define FT_BH_SETADC_CH_0 0x0u /* UNPACR_Regular.md: rarefy-B off; WhichUnpacker 0 targets SrcA, 1 targets SrcB. */ #define FT_BH_UNPACR_RAREFYB_DISABLE 0x0u #define FT_BH_UNPACR_SRC_A 0x0u #define FT_BH_UNPACR_SRC_B 0x1u /* PACR.md (BH page) operand values. */ #define FT_BH_PACR_ZERO_OUTPUT_DISABLED 0x0u #define FT_BH_PACR_DST_ACCESS_NORMAL_MODE 0x0u #define FT_BH_PACR_NO_ROW_PAD_ZERO 0x0u #define FT_BH_PACR_CFG_CTXT_0 0x0u #define FT_BH_PACR_ADDR_CNT_CTXT_0 0x0u #define FT_BH_PACR_ALL_INTF_ACTIVE 0x0u #define FT_BH_PACR_SINGLE_INTF_ACTIVE 0x1u #define FT_BH_PACR_TWO_INTFS_ACTIVE 0x3u #define FT_BH_PACR_NO_CTXT_CTRL 0x0u /* WRCFG.md Is128Bit. */ #define FT_BH_WRCFG_32B 0x0u #define FT_BH_WRCFG_128B 0x1u /* Hardware data-format codes (Unpackers/FormatConversion.md type-encoding table for the 4-bit * codes; UInt32/Fp8_e4m3/UInt8 use the fifth bit, kept as given by the spec). */ #define FT_BH_DATA_FORMAT_FLOAT32 0u #define FT_BH_DATA_FORMAT_FLOAT16 1u #define FT_BH_DATA_FORMAT_BFP8 2u #define FT_BH_DATA_FORMAT_TF32 4u #define FT_BH_DATA_FORMAT_FLOAT16_B 5u #define FT_BH_DATA_FORMAT_BFP8_B 6u #define FT_BH_DATA_FORMAT_INT32 8u #define FT_BH_DATA_FORMAT_UINT16 9u #define FT_BH_DATA_FORMAT_LF8 10u #define FT_BH_DATA_FORMAT_INT8 14u #define FT_BH_DATA_FORMAT_UINT32 24u #define FT_BH_DATA_FORMAT_FP8_E4M3 26u #define FT_BH_DATA_FORMAT_UINT8 30u #define FT_BH_DATA_FORMAT_CONFIG_MASK 0xFu #define FT_BH_DATA_FORMAT_CONFIG_BITS(f) ((f) & 0xF) /* Address-modifier slot indices (RWCs.md). */ #define FT_BH_ADDR_MOD_0 0u #define FT_BH_ADDR_MOD_1 1u #define FT_BH_ADDR_MOD_2 2u #define FT_BH_ADDR_MOD_3 3u #define FT_BH_ADDR_MOD_4 4u #define FT_BH_ADDR_MOD_5 5u #define FT_BH_ADDR_MOD_6 6u #define FT_BH_ADDR_MOD_7 7u #endif /* FT_BH_ISA_H */