\ \ Some attempts to test and reverse engineer the Xburst media instructions \ \ Copyright (C) David Kühling 2010 \ \ License: LGPLv3+; NO WARRANTY \ \ !This depends on the new 2010-08-07 GForth CVS snapshot! \ Get Gforth package for Nanonote from: \ \ (compiled) http://mosquito.dyndns.tv/~spock/openwrt \ (source) git clone git://projects.qi-hardware.com/openwrt-packages.git \ \ Other information about the media instruction set: \ \ http://www.gp32x.com/board/index.php?/topic/50216-jzsimd-mxu-instructions-list/ \ http://nmj.sumomo.ne.jp/suz-aa1/Jz47xx/mxu_as \ http://pastebin.com/f442c9e6e \ define new assembler opcodes also assembler definitions : S32M2I, ( xr rt -- ) \ move from media register $1C ( special2) 26 lshift $2E ( function) or ( rt) asm-rt ( xr) asm-shamt l, ; : S32I2M, ( xr rt -- ) \ move to media register $1C ( special2) 26 lshift $2F ( function) or ( rt) asm-rt ( xr) asm-shamt l, ; : S32LDD, ( xr r offs -- ) \ 12345678901234567890123456789012 \ SSSSSSRRRRRrOOOOOOOOOOXXXXEEEEEE $1C ( special2) 26 lshift $10 ( function) or ( reverse? 1 20 lshift or) ( offs) swap 2/ 2/ 10 lshift or \ only 10 bits max! ( rt) asm-rs ( xrf) swap 6 lshift or l, ; : S32STD, ( xr r offs -- ) \ 12345678901234567890123456789012 \ SSSSSSRRRRRrOOOOOOOOOOXXXXEEEEEE $1C ( special2) 26 lshift $11 ( function) or ( reverse? 1 20 lshift or) ( offs) swap 2/ 2/ 10 lshift or \ only 10 bits max! ( rt) asm-rs ( xrf) swap 6 lshift or l, ; 0 constant ww 1 constant lw 2 constant hw 3 constant xw 0 constant aa 1 constant as 2 constant sa 3 constant ss : Q16ADD, ( xr1 xr2 xr3 xr4 AA WW -- ) \ see mcu_as $1C ( special2) 26 lshift %001110 ( function) or ( ww) swap 22 lshift or ( aa) swap 24 lshift or ( regs) 6 4 - dup 4 4 * + do swap I lshift or 4 -loop l, ; previous definitions \ read out dsp registers abi-code dsp> ( -- dsp31 ... dsp0 ) $v0 $4 4 -17 * addiu, 17 0 [?do] [i] $t0 S32M2I, $t0 [i] 4 * $v0 sw, [loop] $ra jr, nop, end-code : .dsp dsp> 17 0 do cr i 3 .r ." = " hex. loop ; \ need to write '1' to reg16 (some status reg?) to enable SIMD instructions abi-code reg16! $t0 0 $4 lw, \ load into normal register first, since 16 $t0 S32I2M, \ only S32I2M can access XR16! $ra jr, $v0 $4 4 addiu, end-code abi-code xrclear \ clear all 16 QR registers $t0 $zero move, 16 0 [?do] [i] $t0 S32I2M, [loop] $ra jr, $v0 $4 move, end-code abi-code testld ( x1 x2 x3 -- ) 1 $4 0 S32LDD, \ load from stack into XR1..XR3 2 $4 4 S32LDD, \ check result using .dsp 3 $4 8 S32LDD, $ra jr, $v0 $4 12 addiu, end-code abi-code testq16add ( x1 x2 -- x3 x4 ) 1 $4 4 S32LDD, \ load 2 operands from from stack 2 $4 0 S32LDD, 3 1 2 4 AS WW q16add, \ xr3 = xr1+xr2, xr4 = xr1-xr2, 3 $4 4 S32STD, \ load 2 operands from from stack 4 $4 0 S32STD, $ra jr, $v0 $4 move, end-code CR .( enabling simd instructions) 1 reg16! CR .( testing whether it works... ) : test-xburst-media-instructions $00040003 $00010002 testq16add assert0( swap $00050005 = ) assert0( $00030001 = ) ; test-xburst-media-instructions .( OK! )