; > &.Hdr.FPMacros as hacked by Tutu to be usable ; ; Macros to generate new floating point instructions in AAsm ; f0 FN 0 f1 FN 1 f2 FN 2 f3 FN 3 f4 FN 4 f5 FN 5 f6 FN 6 f7 FN 7 GBLA mask GBLA cond_mask GBLA prepost_mask GBLA incdec_mask GBLA size_mask GBLA size_rt_mask GBLA Wb_mask GBLA Rn_mask GBLA Rd_mask GBLA Fd_mask GBLA Fn_mask GBLA Fm_mask GBLA offset_mask GBLA round_mask ; Set offset_mask from numeric variable offset MACRO set_offset $offset [ ($offset >= 1024) :LOR: ($offset < 0) ! 0, "FP offset out of range " MEXIT ] [ ($offset :AND: 3) <> 0 ! 0, "Invalid FP offset" MEXIT ] offset_mask SETA $offset/4 MEND ; Set Fd_mask from string $Fd MACRO set_Fd $Fd [ $Fd = f0 Fd_mask SETA &00000000 MEXIT ] [ $Fd = f1 Fd_mask SETA &00001000 MEXIT ] [ $Fd = f2 Fd_mask SETA &00002000 MEXIT ] [ $Fd = f3 Fd_mask SETA &00003000 MEXIT ] [ $Fd = f4 Fd_mask SETA &00004000 MEXIT ] [ $Fd = f5 Fd_mask SETA &00005000 MEXIT ] [ $Fd = f6 Fd_mask SETA &00006000 MEXIT ] [ $Fd = f7 Fd_mask SETA &00007000 MEXIT ] MEND ; Set Fn_mask from string $Fn MACRO set_Fn $Fn [ $Fn = f0 Fn_mask SETA &00000000 MEXIT ] [ $Fn = f1 Fn_mask SETA &00010000 MEXIT ] [ $Fn = f2 Fn_mask SETA &00020000 MEXIT ] [ $Fn = f3 Fn_mask SETA &00030000 MEXIT ] [ $Fn = f4 Fn_mask SETA &00040000 MEXIT ] [ $Fn = f5 Fn_mask SETA &00050000 MEXIT ] [ $Fn = f6 Fn_mask SETA &00060000 MEXIT ] [ $Fn = f7 Fn_mask SETA &00070000 MEXIT ] MEND ; Set Fm_mask from string $Fm MACRO set_Fm $Fm [ "$Fm" = "0.0" Fm_mask SETA &00000008 MEXIT ] [ "$Fm" = "1.0" Fm_mask SETA &00000009 MEXIT ] [ "$Fm" = "2.0" Fm_mask SETA &0000000A MEXIT ] [ "$Fm" = "3.0" Fm_mask SETA &0000000B MEXIT ] [ "$Fm" = "4.0" Fm_mask SETA &0000000C MEXIT ] [ "$Fm" = "5.0" Fm_mask SETA &0000000D MEXIT ] [ "$Fm" = "0.5" Fm_mask SETA &0000000E MEXIT ] [ "$Fm" = "10.0" Fm_mask SETA &0000000F MEXIT ] [ $Fm = f0 Fm_mask SETA &00000000 MEXIT ] [ $Fm = f1 Fm_mask SETA &00000001 MEXIT ] [ $Fm = f2 Fm_mask SETA &00000002 MEXIT ] [ $Fm = f3 Fm_mask SETA &00000003 MEXIT ] [ $Fm = f4 Fm_mask SETA &00000004 MEXIT ] [ $Fm = f5 Fm_mask SETA &00000005 MEXIT ] [ $Fm = f6 Fm_mask SETA &00000006 MEXIT ] [ $Fm = f7 Fm_mask SETA &00000007 MEXIT ] MEND ; Set Rn_mask from string $Rn MACRO set_Rn $Rn [ $Rn = r0 Rn_mask SETA &00000000 MEXIT ] [ $Rn = r1 Rn_mask SETA &00010000 MEXIT ] [ $Rn = r2 Rn_mask SETA &00020000 MEXIT ] [ $Rn = r3 Rn_mask SETA &00030000 MEXIT ] [ $Rn = r4 Rn_mask SETA &00040000 MEXIT ] [ $Rn = r5 Rn_mask SETA &00050000 MEXIT ] [ $Rn = r6 Rn_mask SETA &00060000 MEXIT ] [ $Rn = r7 Rn_mask SETA &00070000 MEXIT ] [ $Rn = r8 Rn_mask SETA &00080000 MEXIT ] [ $Rn = r9 Rn_mask SETA &00090000 MEXIT ] [ $Rn = r10 Rn_mask SETA &000A0000 MEXIT ] [ $Rn = r11 Rn_mask SETA &000B0000 MEXIT ] [ $Rn = r12 Rn_mask SETA &000C0000 MEXIT ] [ $Rn = r13 Rn_mask SETA &000D0000 MEXIT ] [ $Rn = r14 Rn_mask SETA &000E0000 MEXIT ] [ $Rn = r15 Rn_mask SETA &000F0000 MEXIT ] MEND ; Set Rd_mask from string $Rd MACRO set_Rd $Rd [ $Rd = r0 Rd_mask SETA &00000000 MEXIT ] [ $Rd = r1 Rd_mask SETA &00001000 MEXIT ] [ $Rd = r2 Rd_mask SETA &00002000 MEXIT ] [ $Rd = r3 Rd_mask SETA &00003000 MEXIT ] [ $Rd = r4 Rd_mask SETA &00004000 MEXIT ] [ $Rd = r5 Rd_mask SETA &00005000 MEXIT ] [ $Rd = r6 Rd_mask SETA &00006000 MEXIT ] [ $Rd = r7 Rd_mask SETA &00007000 MEXIT ] [ $Rd = r8 Rd_mask SETA &00008000 MEXIT ] [ $Rd = r9 Rd_mask SETA &00009000 MEXIT ] [ $Rd = r10 Rd_mask SETA &0000A000 MEXIT ] [ $Rd = r11 Rd_mask SETA &0000B000 MEXIT ] [ $Rd = r12 Rd_mask SETA &0000C000 MEXIT ] [ $Rd = r13 Rd_mask SETA &0000D000 MEXIT ] [ $Rd = r14 Rd_mask SETA &0000E000 MEXIT ] [ $Rd = r15 Rd_mask SETA &0000F000 MEXIT ] MEND ; Set Wb_mask from string $Wb (writeback is like xxM not xxR) MACRO set_Wb $Wb [ "$Wb"="!" Wb_mask SETA 2_00000000001000000000000000000000 | Wb_mask SETA 0 ] MEND ; Set size_mask from string $size MACRO set_size $size [ "$size"="S" size_mask SETA 2_00000000000000000000000000000000 MEXIT ] [ "$size"="D" size_mask SETA 2_00000000000000001000000000000000 MEXIT ] [ "$size"="E" size_mask SETA 2_00000000010000000000000000000000 MEXIT ] [ "$size"="P" size_mask SETA 2_00000000010000001000000000000000 MEXIT ] MEND ; Set size_rt_mask from string $size_rt MACRO set_size_rt $size_rt [ "$size_rt"="S" size_rt_mask SETA 2_00000000000000000000000000000000 MEXIT ] [ "$size_rt"="D" size_rt_mask SETA 2_00000000000000000000000010000000 MEXIT ] [ "$size_rt"="E" size_rt_mask SETA 2_00000000000010000000000000000000 MEXIT ] [ "$size_rt"="P" size_rt_mask SETA 2_00000000000010000000000010000000 MEXIT ] MEND ; Set incdec_mask from string $incdec MACRO set_incdec $incdec [ "$incdec"="inc" incdec_mask SETA 2_00000000100000000000000000000000 | incdec_mask SETA 0 ] MEND ; Set prepost_mask from string $prepost MACRO set_prepost $prepost [ "$prepost"="pre" prepost_mask SETA 2_00000001000000000000000000000000 | prepost_mask SETA 0 ] MEND ; Set round_mask from string $round MACRO set_round $round round_mask SETA 0 [ "$round"="Z" round_mask SETA &00000060 MEXIT ] [ "$round"="P" round_mask SETA &00000020 MEXIT ] [ "$round"="M" round_mask SETA &00000040 MEXIT ] MEND ; Set cond_mask from string $cond MACRO set_cond $cond [ "$cond"="" cond_mask SETA &E0000000 MEXIT ] [ "$cond"="EQ" cond_mask SETA &00000000 MEXIT ] [ "$cond"="NE" cond_mask SETA &10000000 MEXIT ] [ "$cond"="CS" :LOR: "$cond"="HS" cond_mask SETA &20000000 MEXIT ] [ "$cond"="CC" :LOR: "$cond"="LO" cond_mask SETA &30000000 MEXIT ] [ "$cond"="MI" cond_mask SETA &40000000 MEXIT ] [ "$cond"="PL" cond_mask SETA &50000000 MEXIT ] [ "$cond"="VS" cond_mask SETA &60000000 MEXIT ] [ "$cond"="VC" cond_mask SETA &70000000 MEXIT ] [ "$cond"="HI" cond_mask SETA &80000000 MEXIT ] [ "$cond"="LS" cond_mask SETA &90000000 MEXIT ] [ "$cond"="GE" cond_mask SETA &A0000000 MEXIT ] [ "$cond"="LT" cond_mask SETA &B0000000 MEXIT ] [ "$cond"="GT" cond_mask SETA &C0000000 MEXIT ] [ "$cond"="LE" cond_mask SETA &D0000000 MEXIT ] [ "$cond"="AL" cond_mask SETA &E0000000 MEXIT ] [ "$cond"="NV" cond_mask SETA &F0000000 MEXIT ] MEND ; +++++++++++++ Now for actual fp instruction generating macros +++++++++++++++ MACRO $label LDF $cond,$size,$Fd,$Rn,$offset,$prepost,$incdec,$Wb $label set_cond $cond set_size $size set_Fd $Fd set_Rn $Rn set_offset $offset set_prepost $prepost set_incdec $incdec set_Wb $Wb mask SETA cond_mask :OR: size_mask :OR: Fd_mask :OR: Rn_mask mask SETA mask :OR: offset_mask :OR: prepost_mask :OR: Wb_mask mask SETA mask :OR: incdec_mask DCD mask :OR: 2_00001100000100000000000100000000 MEND MACRO $label STF $cond,$size,$Fd,$Rn,$offset,$prepost,$incdec,$Wb $label set_cond $cond set_size $size set_Fd $Fd set_Rn $Rn set_offset $offset set_prepost $prepost set_incdec $incdec set_Wb $Wb mask SETA cond_mask :OR: size_mask :OR: Fd_mask :OR: Rn_mask mask SETA mask :OR: offset_mask :OR: prepost_mask :OR: Wb_mask mask SETA mask :OR: incdec_mask DCD mask :OR: 2_00001100000000000000000100000000 MEND MACRO $label WFS $cond,$Rd $label set_cond $cond set_Rd $Rd DCD cond_mask :OR: Rd_mask :OR: 2_00001110001000000000000100010000 MEND MACRO $label RFS $cond,$Rd $label set_cond $cond set_Rd $Rd DCD cond_mask :OR: Rd_mask :OR: 2_00001110001100000000000100010000 MEND MACRO $label FLT $cond,$size_rt,$Fn,$Rd,$round $label set_cond $cond set_size_rt $size_rt set_Fn $Fn set_Rd $Rd set_round $round mask SETA cond_mask :OR: size_rt_mask :OR: Fn_mask :OR: Rd_mask DCD mask :OR: 2_00001110000000000000000100010000 MEND MACRO $label FIX $cond,$Rd,$Fm,$round $label set_cond $cond set_Rd $Rd set_Fm $Fm set_round $round mask SETA cond_mask :OR: Rd_mask :OR: Fm_mask DCD mask :OR: 2_00001110000100000000000100010000 MEND MACRO $label CMF $cond,$Fn,$Fm $label set_cond $cond set_Fn $Fn set_Fm $Fm mask SETA cond_mask :OR: Fn_mask :OR: Fm_mask DCD mask :OR: 2_00001110100100001111000100010000 MEND MACRO $label CNF $cond,$Fn,$Fm $label set_cond $cond set_Fn $Fn set_Fm $Fm mask SETA cond_mask :OR: Fn_mask :OR: Fm_mask DCD mask :OR: 2_00001110101100001111000100010000 MEND MACRO $label CMFE $cond,$Fn,$Fm $label set_cond $cond set_Fn $Fn set_Fm $Fm mask SETA cond_mask :OR: Fn_mask :OR: Fm_mask DCD mask :OR: 2_00001110110100001111000100010000 MEND MACRO $label CNFE $cond,$Fn,$Fm $label set_cond $cond set_Fn $Fn set_Fm $Fm mask SETA cond_mask :OR: Fn_mask :OR: Fm_mask DCD mask :OR: 2_00001110111100001111000100010000 MEND MACRO $label mvf $cond,$size_rt,$Fd,$Fm,$round $label set_cond $cond set_size_rt $size_rt set_Fd $Fd set_Fm $Fm set_round $round mask SETA cond_mask :OR: size_rt_mask :OR: Fd_mask :OR: Fm_mask DCD mask :OR: 2_00001110000000001000000100000000 MEND MACRO $label MNF $cond,$size_rt,$Fd,$Fm,$round $label set_cond $cond set_size_rt $size_rt set_Fd $Fd set_Fm $Fm set_round $round mask SETA cond_mask :OR: size_rt_mask :OR: Fd_mask :OR: Fm_mask DCD mask :OR: 2_00001110000100001000000100000000 MEND MACRO $label ABS $cond,$size_rt,$Fd,$Fm,$round $label set_cond $cond set_size_rt $size_rt set_Fd $Fd set_Fm $Fm set_round $round mask SETA cond_mask :OR: size_rt_mask :OR: Fd_mask :OR: Fm_mask DCD mask :OR: 2_00001110001000001000000100000000 MEND MACRO $label RND $cond,$size_rt,$Fd,$Fm,$round $label set_cond $cond set_size_rt $size_rt set_Fd $Fd set_Fm $Fm set_round $round mask SETA cond_mask :OR: size_rt_mask :OR: Fd_mask :OR: Fm_mask DCD mask :OR: 2_00001110001100001000000100000000 MEND MACRO $label SQT $cond,$size_rt,$Fd,$Fm,$round $label set_cond $cond set_size_rt $size_rt set_Fd $Fd set_Fm $Fm set_round $round mask SETA cond_mask :OR: size_rt_mask :OR: Fd_mask :OR: Fm_mask DCD mask :OR: 2_00001110010000001000000100000000 MEND MACRO $label LOG $cond,$size_rt,$Fd,$Fm,$round $label set_cond $cond set_size_rt $size_rt set_Fd $Fd set_Fm $Fm set_round $round mask SETA cond_mask :OR: size_rt_mask :OR: Fd_mask :OR: Fm_mask DCD mask :OR: 2_00001110010100001000000100000000 MEND MACRO $label LGN $cond,$size_rt,$Fd,$Fm,$round $label set_cond $cond set_size_rt $size_rt set_Fd $Fd set_Fm $Fm set_round $round mask SETA cond_mask :OR: size_rt_mask :OR: Fd_mask :OR: Fm_mask DCD mask :OR: 2_00001110011000001000000100000000 MEND MACRO $label EXP $cond,$size_rt,$Fd,$Fm,$round $label set_cond $cond set_size_rt $size_rt set_Fd $Fd set_Fm $Fm set_round $round mask SETA cond_mask :OR: size_rt_mask :OR: Fd_mask :OR: Fm_mask DCD mask :OR: 2_00001110011100001000000100000000 MEND MACRO $label SIN $cond,$size_rt,$Fd,$Fm,$round $label set_cond $cond set_size_rt $size_rt set_Fd $Fd set_Fm $Fm set_round $round mask SETA cond_mask :OR: size_rt_mask :OR: Fd_mask :OR: Fm_mask DCD mask :OR: 2_00001110100000001000000100000000 MEND MACRO $label COS $cond,$size_rt,$Fd,$Fm,$round $label set_cond $cond set_size_rt $size_rt set_Fd $Fd set_Fm $Fm set_round $round mask SETA cond_mask :OR: size_rt_mask :OR: Fd_mask :OR: Fm_mask DCD mask :OR: 2_00001110100100001000000100000000 MEND MACRO $label TAN $cond,$size_rt,$Fd,$Fm,$round $label set_cond $cond set_size_rt $size_rt set_Fd $Fd set_Fm $Fm set_round $round mask SETA cond_mask :OR: size_rt_mask :OR: Fd_mask :OR: Fm_mask DCD mask :OR: 2_00001110101000001000000100000000 MEND MACRO $label ASN $cond,$size_rt,$Fd,$Fm,$round $label set_cond $cond set_size_rt $size_rt set_Fd $Fd set_Fm $Fm set_round $round mask SETA cond_mask :OR: size_rt_mask :OR: Fd_mask :OR: Fm_mask DCD mask :OR: 2_00001110101100001000000100000000 MEND MACRO $label ACS $cond,$size_rt,$Fd,$Fm,$round $label set_cond $cond set_size_rt $size_rt set_Fd $Fd set_Fm $Fm set_round $round mask SETA cond_mask :OR: size_rt_mask :OR: Fd_mask :OR: Fm_mask DCD mask :OR: 2_00001110110000001000000100000000 MEND MACRO $label ATN $cond,$size_rt,$Fd,$Fm,$round $label set_cond $cond set_size_rt $size_rt set_Fd $Fd set_Fm $Fm set_round $round mask SETA cond_mask :OR: size_rt_mask :OR: Fd_mask :OR: Fm_mask DCD mask :OR: 2_00001110110100001000000100000000 MEND MACRO $label ADF $cond,$size_rt,$Fd,$Fn,$Fm,$round $label set_cond $cond set_size_rt $size_rt set_Fd $Fd set_Fn $Fn set_Fm $Fm set_round $round mask SETA cond_mask :OR: size_rt_mask :OR: Fd_mask :OR: Fn_mask mask SETA mask :OR: Fm_mask :OR: round_mask DCD mask :OR: 2_00001110000000000000000100000000 MEND MACRO $label SUF $cond,$size_rt,$Fd,$Fn,$Fm,$round $label set_cond $cond set_size_rt $size_rt set_Fd $Fd set_Fn $Fn set_Fm $Fm set_round $round mask SETA cond_mask :OR: size_rt_mask :OR: Fd_mask :OR: Fn_mask mask SETA mask :OR: Fm_mask :OR: round_mask DCD mask :OR: 2_00001110001000000000000100000000 MEND MACRO $label RSF $cond,$size_rt,$Fd,$Fn,$Fm,$round $label set_cond $cond set_size_rt $size_rt set_Fd $Fd set_Fn $Fn set_Fm $Fm set_round $round mask SETA cond_mask :OR: size_rt_mask :OR: Fd_mask :OR: Fn_mask mask SETA mask :OR: Fm_mask :OR: round_mask DCD mask :OR: 2_00001110001100000000000100000000 MEND MACRO $label MUF $cond,$size_rt,$Fd,$Fn,$Fm,$round $label set_cond $cond set_size_rt $size_rt set_Fd $Fd set_Fn $Fn set_Fm $Fm set_round $round mask SETA cond_mask :OR: size_rt_mask :OR: Fd_mask :OR: Fn_mask mask SETA mask :OR: Fm_mask :OR: round_mask DCD mask :OR: 2_00001110000100000000000100000000 MEND MACRO $label FML $cond,$size_rt,$Fd,$Fn,$Fm,$round $label set_cond $cond set_size_rt $size_rt set_Fd $Fd set_Fn $Fn set_Fm $Fm set_round $round mask SETA cond_mask :OR: size_rt_mask :OR: Fd_mask :OR: Fn_mask mask SETA mask :OR: Fm_mask :OR: round_mask DCD mask :OR: 2_00001110100100000000000100000000 MEND MACRO $label DVF $cond,$size_rt,$Fd,$Fn,$Fm,$round $label set_cond $cond set_size_rt $size_rt set_Fd $Fd set_Fn $Fn set_Fm $Fm set_round $round mask SETA cond_mask :OR: size_rt_mask :OR: Fd_mask :OR: Fn_mask mask SETA mask :OR: Fm_mask :OR: round_mask DCD mask :OR: 2_00001110010000000000000100000000 MEND MACRO $label RDF $cond,$size_rt,$Fd,$Fn,$Fm,$round $label set_cond $cond set_size_rt $size_rt set_Fd $Fd set_Fn $Fn set_Fm $Fm set_round $round mask SETA cond_mask :OR: size_rt_mask :OR: Fd_mask :OR: Fn_mask mask SETA mask :OR: Fm_mask :OR: round_mask DCD mask :OR: 2_00001110010100000000000100000000 MEND MACRO $label POW $cond,$size_rt,$Fd,$Fn,$Fm,$round $label set_cond $cond set_size_rt $size_rt set_Fd $Fd set_Fn $Fn set_Fm $Fm set_round $round mask SETA cond_mask :OR: size_rt_mask :OR: Fd_mask :OR: Fn_mask mask SETA mask :OR: Fm_mask :OR: round_mask DCD mask :OR: 2_00001110011000000000000100000000 MEND MACRO $label RPW $cond,$size_rt,$Fd,$Fn,$Fm,$round $label set_cond $cond set_size_rt $size_rt set_Fd $Fd set_Fn $Fn set_Fm $Fm set_round $round mask SETA cond_mask :OR: size_rt_mask :OR: Fd_mask :OR: Fn_mask mask SETA mask :OR: Fm_mask :OR: round_mask DCD mask :OR: 2_00001110011100000000000100000000 MEND MACRO $label FDV $cond,$size_rt,$Fd,$Fn,$Fm,$round $label set_cond $cond set_size_rt $size_rt set_Fd $Fd set_Fn $Fn set_Fm $Fm set_round $round mask SETA cond_mask :OR: size_rt_mask :OR: Fd_mask :OR: Fn_mask mask SETA mask :OR: Fm_mask :OR: round_mask DCD mask :OR: 2_00001110101000000000000100000000 MEND MACRO $label FRD $cond,$size_rt,$Fd,$Fn,$Fm,$round $label set_cond $cond set_size_rt $size_rt set_Fd $Fd set_Fn $Fn set_Fm $Fm set_round $round mask SETA cond_mask :OR: size_rt_mask :OR: Fd_mask :OR: Fn_mask mask SETA mask :OR: Fm_mask :OR: round_mask DCD mask :OR: 2_00001110101100000000000100000000 MEND MACRO $label POL $cond,$size_rt,$Fd,$Fn,$Fm,$round $label set_cond $cond set_size_rt $size_rt set_Fd $Fd set_Fn $Fn set_Fm $Fm set_round $round mask SETA cond_mask :OR: size_rt_mask :OR: Fd_mask :OR: Fn_mask mask SETA mask :OR: Fm_mask :OR: round_mask DCD mask :OR: 2_00001110110000000000000100000000 MEND MACRO $label RMF $cond,$size_rt,$Fd,$Fn,$Fm,$round $label set_cond $cond set_size_rt $size_rt set_Fd $Fd set_Fn $Fn set_Fm $Fm set_round $round mask SETA cond_mask :OR: size_rt_mask :OR: Fd_mask :OR: Fn_mask mask SETA mask :OR: Fm_mask :OR: round_mask DCD mask :OR: 2_00001110100000000000000100000000 MEND END