st20.ssl.m

Go to the documentation of this file.
00001 dnl m4 processed
00002 changequote([[, ]])dnl
00003 #
00004 # RTL description for ST20
00005 #
00006 
00007 MAXSIGN32   := 2**31 - 1;    # all bits except sign bit are set
00008 SIGN_32_NEG := -2**31;
00009 INF := 0x7F800000;
00010 
00011 INTEGER
00012 [ %Areg, %Breg, %Creg ] -> 0..2,
00013 %sp -> 3,
00014 %pc -> -1,
00015 [ %ZF, %CF ][1] -> -1 ;
00016 
00017 define([[PUSH]], [[
00018     *32* %Creg := %Breg
00019     *32* %Breg := %Areg
00020     *32* %Areg := $1]])
00021 
00022 define([[POPALL]], [[
00023     *32* %Areg := %Breg
00024     *32* %Breg := %Creg]])
00025 dnl#    *32* %Creg := -1
00026 dnl ]])
00027 
00028 #A was replaced so dont overwrite it
00029 define([[POP1]], [[
00030     *32* %Breg := %Creg]])
00031 dnl#    *32* %Creg := -1
00032 dnl ]])
00033 define([[POP2]], [[]])
00034 
00035 #OP2(op) {
00036 #   *32* %Areg := %Breg op %Areg
00037 #   POP1()
00038 #};
00039 
00040 #OP2C(op) {
00041 #   *32* %Areg := [%Breg op %Areg?1:0];
00042 #   POP1()
00043 #};
00044 
00045 adc        val      # add constant
00046     *32* %Areg := %Areg + val;
00047 add              # add
00048     *32* %Areg := %Breg + %Areg
00049     POP1();
00050 addc             # add with carry
00051     _ ;
00052 ajw        val      # adjust work space
00053     *32* %sp := %sp + (4*val);
00054 andq         # and
00055     *32* %Areg := %Breg & %Areg
00056     POP1();
00057 arot             # anti-rotate stack
00058     _ ;
00059 ashr             # arithmetic shift right
00060     #OP2(">>");
00061     *32* %Areg := %Breg >>A %Areg
00062     POP1();
00063 biquad           # biquad IIR filter step
00064     _ ;
00065 bitld            # load bit
00066     _ ;
00067 bitmask          # create bit mask
00068     _ ;
00069 bitst            # store bit
00070     _ ;
00071 breakpoint       # breakpoint
00072     _ ;
00073 cj         val      # conditional jump
00074     *32* tmp := %Areg
00075     *32* %ZF := 
00076     *32* %Areg := [tmp = 0?%Areg:%Breg]
00077     *32* %Breg := [tmp = 0?%Breg:%Creg]
00078     *32* %pc := [tmp = 0?%pc+val:%pc];
00079 cj1        val      # conditional jump
00080     *32* tmp := %Areg
00081     *32* %ZF := 
00082     *32* %Areg := [tmp = 0?%Areg:%Breg]
00083     *32* %Breg := [tmp = 0?%Breg:%Creg];
00084 dequeue          # dequeue a process
00085     _ ;
00086 divstep          # divide step
00087     _ ;
00088 dup              # duplicate
00089     PUSH(%Areg);
00090 ecall            # exception call
00091     _ ;
00092 enqueue          # enqueue a process
00093     _ ;
00094 eqc        val      # equals constant
00095     *32* %Areg := ;
00096 eret             # exception return
00097     _ ;
00098 fcall      val   # function call
00099     _ ;
00100 gajw             # general adjust workspace
00101     *32* tmp := %sp
00102     *32* %sp := %Areg
00103     *32* %Areg := tmp;
00104 gt               # greater than
00105     #OP2C(">");
00106     *32* %Areg := 
00107     POP1();
00108 gtu              # greater than unsigned
00109     #OP2C(">");
00110     *32* %Areg := 
00111     POP1();
00112 io               # input/output
00113     _ ;
00114 j          val   # jump
00115     *32* %pc := %pc + val;
00116 #   *32* %pc := val;
00117 jab              # jump absolute
00118     _ ;
00119 lbinc            # load byte and increment
00120     _ ;
00121 ldc        val      # load constant
00122     PUSH(val);
00123 ldl        val      # load local
00124     PUSH(m[%sp + (val*4)]{32});
00125 ldlp       val      # load local pointer
00126     PUSH(%sp + (val*4));
00127 ldnl       val      # load non-local
00128     *32* %Areg := m[%Areg + (val * 4)]{32};
00129 ldnlp      val      # load non-local pointer
00130     *32* %Areg := %Areg + (val * 4);
00131 ldpi             # load pointer to instruction
00132     *32* %Areg := %pc + (%Areg * 4);
00133 ldprodid         # load product identity
00134     _ ;
00135 ldtdesc          # load task descriptor
00136     _ ;
00137 lsinc            # load sixteen and increment
00138     _ ;
00139 lsxinc           # load sixteen sign extended and increment
00140     _ ;
00141 lwinc            # load word and increment
00142     _ ;
00143 mac              # multiply accumulate
00144     _ ;
00145 mul              # multiply
00146     #OP2("*");
00147     *32* %Areg := %Breg * %Areg
00148     POP1();
00149 nfix       val      # negative prefix
00150     _ ;
00151 nop              # no operation
00152     _ ;
00153 not              # bitwise not
00154     *32* %Areg := ~%Areg;
00155 opr        val      # operate
00156     _ ;
00157 orq               # or
00158     #OP2("|");
00159     *32* %Areg := %Breg | %Areg
00160     POP1();
00161 order            # order
00162     _ ;
00163 orderu           # unsigned order
00164     _ ;
00165 pfix       val      # prefix
00166     _ ;
00167 rev              # reverse
00168     *32* tmp := %Areg
00169     *32* %Areg := %Breg
00170     *32* %Areg := tmp;
00171 rmw              # read modify write
00172     _ ;
00173 rot              # rotate stack
00174     _ ;
00175 run              # run process
00176     _ ;
00177 saturate         # saturate
00178     _ ;
00179 sbinc            # store byte and increment
00180     _ ;
00181 shl              # shift left
00182     #OP2("<<");
00183     *32* %Areg := %Breg << %Areg
00184     POP1();
00185 shr              # shift right
00186     #OP2(">>");
00187     *32* %Areg := %Breg >> %Areg
00188     POP1();
00189 signal           # signal
00190     _ ;
00191 smacinit         # initialize short multiply accumulate loop
00192     _ ;
00193 smacloop         # short multiply accumulate loop
00194     _ ;
00195 smul             # short multiply
00196     _ ;
00197 ssinc            # store sixteen and increment
00198     _ ;
00199 statusclr        # clear bits in status register
00200     _ ;
00201 statusset        # set bits in status register
00202     _ ;
00203 statustst        # test status register
00204     _ ;
00205 stl        val      # store local
00206     *32* m := %Areg
00207     POPALL();
00208 stnl       val      # store non-local
00209     *32* m[%Areg + (val * 4) ] := %Breg
00210     POPALL()
00211     POPALL();
00212 stop             # stop process
00213     _ ;
00214 sub              # subtract
00215     #OP2("-");
00216     *32* %Areg := %Breg - %Areg
00217     POP1();
00218 subc             # subtract with carry
00219     _ ;
00220 swap32           # byte swap 32
00221     _ ;
00222 swinc            # store word and increment
00223     _ ;
00224 timeslice        # timeslice
00225     _ ;
00226 umac             # unsigned multiply accumulate
00227     _ ;
00228 unsign           # unsign argument
00229     _ ;
00230 wait             # wait
00231     _ ;
00232 wsub             # word subscript
00233     #OP2("*4 +");
00234     *32* %Areg := (%Breg * 4) + %Areg
00235     POP1();
00236 xbword           # sign extend byte to word
00237     *32* %Areg := sgnex(8,32,%Areg{8});
00238 xor              # exclusive or
00239     #OP2("^");
00240     *32* %Areg := %Breg ^ %Areg
00241     POP1();
00242 
00243 xsword           # sign extend sixteen to word
00244     *32* %Areg := sgnex(16, 32, %Areg{16});
00245 
00246 # C2-C4 instructions
00247 
00248 altq                 # alt start
00249     _ ;
00250 altend              # alt end
00251     _ ;
00252 altwt               # alt wait
00253     _ ;
00254 bcnt                # byte count
00255     *32* %Areg := %Areg * 32;
00256 bitcnt              # count bits set in word
00257     _ ;
00258 bitrevnbits         # reverse bottom n bits in word
00259     _ ;
00260 bitrevword          # reverse bits in word
00261     _ ;
00262 bsub                # byte subscript
00263     #OP2("+");
00264     *32* %Areg := %Breg + %Areg
00265     POP1();
00266 call    val         # call
00267     *32* %sp := %sp - 16
00268     *32* m[%sp] := %pc
00269     *32* m[%sp+4] := %Areg
00270     *32* m[%sp+8] := %Breg
00271     *32* m[%sp+12] := %Creg
00272 #   *32* %Areg := %pc
00273 #   *32* %Breg := -1
00274 #   *32* %Creg := -1
00275     *32* %pc := %pc + val;
00276 #   *32* %pc := val;
00277 call1   val         # call
00278     *32* %sp := %sp - 16
00279     *32* m[%sp] := %pc
00280     *32* m[%sp+4] := %Areg
00281     *32* m[%sp+8] := %Breg
00282     *32* m[%sp+12] := %Creg;
00283 #   *32* %Areg := %pc
00284 #   *32* %Breg := -1
00285 #   *32* %Creg := -1
00286 #   *32* %pc := %pc + val;
00287 #   *32* %pc := val;
00288 call2   val         # call
00289     *32* %sp := %sp - 16
00290     *32* m[%sp] := %pc
00291     *32* m[%sp+4] := %Areg
00292     *32* m[%sp+8] := %Breg
00293     *32* m[%sp+12] := %Creg
00294     *32* %sp := %sp + 16;
00295 #   *32* %Areg := %pc
00296 #   *32* %Breg := -1
00297 #   *32* %Creg := -1
00298 #   *32* %pc := %pc + val;
00299 #   *32* %pc := val;
00300 causeerror          # cause error
00301     _ ;
00302 cb                  # check byte
00303     _ ;
00304 cbu                 # check byte unsigned
00305     _ ;
00306 ccnt1               # check count from 1
00307     _ ;
00308 cflerr              # check floating point error
00309     _ ;
00310 cir                 # check in range
00311     _ ;
00312 ciru                # check in range unsigned
00313     _ ;
00314 clockdis            # clock disable
00315     _ ;
00316 clockenb            # clock enable
00317     _ ;
00318 clrhalterr          # clear halt-on error flag
00319     _ ;
00320 crcbyte             # calculate CRC on byte
00321     _ ;
00322 crcword             # calculate CRC on word
00323     _ ;
00324 cs                  # check sixteen
00325     _ ;
00326 csngl               # check single
00327     _ ;
00328 csu                 # check sixteen unsigned
00329     _ ;
00330 csub0               # check subscript from 0
00331     _ ;
00332 cword               # check word
00333     _ ;
00334 devlb               # device load byte
00335     *32* %Areg := zfill(8,32,m[%Areg]{8});
00336 devls               # device load sixteen
00337     *32* %Areg := zfill(16,32,m[%Areg]{16});
00338 devlw               # device load word
00339     *32* %Areg := m{32};
00340 devmove             # device move
00341     _ ;
00342 devsb               # device store byte
00343     *8* m := %Breg
00344     POPALL()
00345     POPALL();
00346 devss               # device store sixteen
00347     *16* m := %Breg
00348     POPALL()
00349     POPALL();
00350 devsw               # device store word
00351     *32* m := %Breg
00352     POPALL()
00353     POPALL();
00354 diff                # difference
00355     #OP2("-");
00356     *32* %Areg := %Breg - %Areg
00357     POP1();
00358 disc                # disable channel
00359     _ ;
00360 diss                # disable skip
00361     _ ;
00362 dist                # disable timer
00363     _ ;
00364 div                 # divide
00365     #OP2("/");
00366     *32* %Areg := %Breg / %Areg
00367     POP1();
00368 enbc                # enable channel
00369     _ ;
00370 enbs                # enable skip
00371     _ ;
00372 enbt                # enable timer
00373     _ ;
00374 endp                # end process
00375     _ ;
00376 fmul                # fractional multiply
00377     _ ;
00378 fptesterr           # test for FPU error
00379     _ ;
00380 gcall               # general call
00381     *32* tmp := %pc
00382     *32* %pc := %Areg
00383     *32* %Areg := tmp;
00384 gintdis             # general interrupt disable
00385     _ ;
00386 gintenb             # general interrupt enable
00387     _ ;
00388 in                  # input message
00389     _ ;
00390 insertqueue         # insert at front of scheduler queue
00391     _ ;
00392 intdis              # (localised) interrupt disable
00393     _ ;
00394 intenb              # (localised) interrupt enable
00395     _ ;
00396 iret                # interrupt return
00397     *32* %Creg := m{32}
00398     *32* %Breg := m{32}
00399     *32* %Areg := m{32}
00400     *32* %pc := m{32}
00401     *32* %sp := m{32};
00402     # no status reg yet
00403 ladd                # long add
00404     *32* %Areg := %Areg + %Breg + zfill(1,32,%Creg@[0:0])
00405     POP2();
00406 lb                  # load byte
00407     *32* %Areg := m{8};
00408 lbx                 # load byte and sign extend
00409     *32* %Areg := m{8};
00410 ldclock             # load clock
00411     _ ;
00412 lddevid             # load device identity
00413     _ ;
00414 ldiff               # long diff
00415     *33* tmp := %Breg - %Areg - zfill(1,32,%Creg@[0:0])
00416     *32* %Areg := tmp@[0:31]
00417     *32* %Breg := tmp@[32:32]
00418     *32* %Creg := -1;
00419 ldinf               # load infinity
00420     PUSH(INF);
00421 ldiv                # long divide
00422     *64* tmp@ := %Breg
00423     *64* tmp@ := %Creg
00424     *32* %Breg := tmp % %Areg
00425     *32* %Areg := tmp / %Areg
00426     *32* %Creg := -1;
00427 ldmemstartval       # load value of MemStart address
00428     _ ;
00429 ldpri               # load current priority
00430     _ ;
00431 ldshadow            # load shadow registers
00432     _ ;
00433 ldtimer             # load timer
00434     PUSH(0);
00435 ldtraph             # load trap handler
00436     _ ;
00437 ldtrapped           # load trapped process status
00438     _ ;
00439 lend                # loop end
00440     _ ;
00441 lmul                # long multiply
00442     *64* tmp := %Breg * %Areg
00443     *32* %Areg := tmp@
00444     *32* %Breg := tmp@
00445     *32* %Creg := -1;
00446 ls                  # load sixteen
00447     *32* %Areg := m{16};
00448 lshl                # long shift left
00449     #OP2("<<");
00450     *32* %Areg := %Breg >> %Areg
00451     POP1();
00452 lshr                # long shift right
00453     #OP2(">>");
00454     *32* %Areg := %Breg >> %Areg
00455     POP1();
00456 lsub                # long subtract
00457     _ ;
00458 lsum                # long sum
00459     _ ;
00460 lsx                 # load sixteen and sign extend
00461     *32* %Areg := m{16};
00462 mint                # minimum integer
00463     PUSH(SIGN_32_NEG);
00464 move                # move message
00465     _ ;     #special function
00466 move2dall           # 2D block copy
00467     _ ;
00468 move2dinit          # initialize data for 2D block move
00469     _ ;
00470 move2dnonzero       # 2D block copy non-zero bytes
00471     _ ;
00472 move2dzero          # 2D block copy zero bytes
00473     _ ;
00474 norm                # normalize
00475     _ ;
00476 out                 # output message
00477     _ ;
00478 outbyte             # output byte
00479     _ ;
00480 outword             # output word
00481     _ ;
00482 pop                 # pop processor stack
00483     POPALL();
00484 postnormsn          # post-normalize correction of single length fp number
00485     _ ;
00486 prod                # product
00487     #OP2("*");
00488     *32* %Areg := %Breg * %Areg
00489     POP1();
00490 reboot              # reboot
00491     _ ;
00492 rem                 # remainder
00493     #OP2("%");
00494     *32* %Areg := %Breg % %Areg
00495     POP1();
00496 resetch             # reset channel
00497     _ ;
00498 restart             # restart
00499     _ ;
00500 ret                 # return
00501     *32* %pc := m{32}
00502     *32* %sp := %sp + 16;
00503 roundsn             # round single length floating point number
00504     _ ;
00505 runp                # run process
00506     _ ;
00507 satadd              # saturating add
00508     _ ;
00509 satmul              # saturating multiply
00510     _ ;
00511 satsub              # saturating subtract
00512     _ ;
00513 saveh               # save high priority queue registers
00514     _ ;
00515 savel               # save low priority queue registers
00516     _ ;
00517 sb                  # store byte
00518     *8* m := %Breg@
00519     POP2();
00520 seterr              # set error flags
00521     _ ;
00522 sethalterr          # set halt-on error flag
00523     _ ;
00524 settimeslice        # set timeslicing status
00525     _ ;
00526 slmul               # signed long multiply
00527     _ ;
00528 ss                  # store sixteen
00529     *16* m := %Breg@
00530     POP2();
00531 ssub                # sixteen subscript
00532     #OP2("*2 +");
00533     *32* %Areg := (%Breg *2) + %Areg
00534     POP1();
00535 startp              # start process
00536     _ ;
00537 stclock             # store clock register
00538     _ ;
00539 sthb                # store high priority back pointer
00540     _ ;
00541 sthf                # store high priority front pointer
00542     _ ;
00543 stlb                # store low priority back pointer
00544     _ ;
00545 stlf                # store low priority front pointer
00546     _ ;
00547 stoperr             # stop on error
00548     _ ;
00549 stopp               # stop process
00550     _ ;
00551 stshadow            # store shadow registers
00552     _ ;
00553 sttimer             # store timer
00554     _ ;
00555 sttraph             # store trap handler
00556     _ ;
00557 sttrapped           # store trapped process
00558     _ ;
00559 sulmul              # signed timer unsigned long multiply
00560     _ ;
00561 sum                 # sum
00562     _ ;
00563 swapqueue           # swap scheduler queue
00564     _ ;
00565 swaptimer           # swap timer queue
00566     _ ;
00567 talt                # timer alt start
00568     _ ;
00569 taltwt              # timer alt wait
00570     _ ;
00571 testerr             # test error flag
00572     _ ;
00573 testhalterr         # test halt-on error flag
00574     _ ;
00575 testpranal          # test processor analysing
00576     _ ;
00577 tin                 # timer input
00578     _ ;
00579 trapdis             # trap disable
00580     _ ;
00581 trapenb             # trap enable
00582     _ ;
00583 tret                # trap return
00584     _ ;
00585 unpacksn            # unpack single length fp number
00586     _ ;
00587 wcnt                # word count
00588     _ ;
00589 wsubdb              # form double word subscript
00590     #OP2("*8 +");
00591     *32* %Areg := (%Breg *8) + %Areg
00592     POP1();
00593 xdble               # extend to double
00594     *32* %Creg := %Breg
00595     *32* %Breg := ;
00596 xword               # extend word
00597     _ ;

Generated on Tue Sep 19 21:18:33 2006 for Boomerang by  doxygen 1.4.6