flat assembler
Message board for the users of flat assembler.
  
|  Index
      > Main > sorting the mathematical operations like this 2+10-2*4/3 Goto page 1, 2 Next | 
| Author | 
 | 
| Roman 08 Jul 2013, 08:11 I want sort by mathematical operations and break into groups. And then we get like this first -2*4=x then x/3=z and then 2+10=y and at last we have y+z
 I found a bug. If write CoolMath 2*99.99999 work, but if write CoolMath 2*199.99999 fasm swears for number 199.99999. Why ? I use Fasm version 1.69.03 | |||
|  08 Jul 2013, 08:11 | 
 | 
| revolution 08 Jul 2013, 10:24 Roman wrote: I found a bug. If write CoolMath 2*99.99999 work, but if write CoolMath 2*199.99999 fasm swears for number 199.99999. Why ? Roman wrote: I use Fasm version 1.69.03 | |||
|  08 Jul 2013, 10:24 | 
 | 
| Roman 08 Jul 2013, 13:02 Revolution
 compile this code. And you see. 
 | |||||||||||
|  08 Jul 2013, 13:02 | 
 | 
| uart777 08 Jul 2013, 18:25 `s and \s are misplaced and if should be replaced with match. Try something like this:     Code: macro MATH [p] { forward define ?s 0 match a+b, p \{ display 'add ' define ?s 1 ; success \} match =0 a-b, ?s p \{ display 'sub ' define ?s 1 ; success \} match =0 a*b, ?s p \{ display 'mul ' define ?s 1 ; success \} match =0 a/b, ?s p \{ display 'div ' define ?s 1 ; success \} if ?s eq 0 ; no successful match? 'Syntax error' end if } Code: MATH a+b, a*b ; displays 'add mul' | |||
|  08 Jul 2013, 18:25 | 
 | 
| Roman 09 Jul 2013, 07:00 uart777
 Thanks But how get this: MATH a+b - a*b or MATH a+b + a*b or MATH a+b * a*b uart777 if we write MATH a+b, a*b then it is not clear how the operation will be between a+b and a*b | |||
|  09 Jul 2013, 07:00 | 
 | 
| uart777 09 Jul 2013, 15:42 What are you trying to do? Just learning and practicing? How to match this? a+b - a*b? Exactly as-is.     Code: match a+b - x*y, p { ; ... } Code: match (i==0=,i<n=,i++), p { ; match (i=0,i<n,i++) ; ... } | |||
|  09 Jul 2013, 15:42 | 
 | 
| Roman 10 Jul 2013, 17:28 Now I am writing hands actions for different operations. But how is it easier with macros? The more operations, the more combinations will have to write your hands. It's like a sad write hands:(
 Code: macro MMXFlt2 Mesto,[p]{ Dons EQU No match a+b - x*y, p \{ mov eax,a movd xmm1,eax mov eax,b movd xmm2,eax addss xmm1,xmm2 mov eax,x movd xmm3,eax mov eax,y movd xmm4,eax mulss xmm3,xmm4 subss xmm1,xmm3 movss [Mesto],xmm1 Dons EQU Yes ;cvtss2si eax,xmm1 ;convert to integer number \} match =No a+b + x*y, Dons p \{ mov eax,a movd xmm1,eax mov eax,b movd xmm2,eax addss xmm1,xmm2 mov eax,x movd xmm3,eax mov eax,y movd xmm4,eax mulss xmm3,xmm4 addss xmm1,xmm3 movss [Mesto],xmm1 Dons EQU Yes \} match =No a+b * x*y, Dons p \{ mov eax,a movd xmm1,eax mov eax,b movd xmm2,eax ;addss xmm1,xmm2 mov eax,x movd xmm3,eax mov eax,y movd xmm4,eax mulss xmm3,xmm4 mulss xmm3,xmm2 addss xmm1,xmm3 movss [Mesto],xmm1 Dons EQU Yes \} } | |||
|  10 Jul 2013, 17:28 | 
 | 
| bitRAKE 10 Jul 2013, 22:19 Here is another possibility:     Code: ; stack of registers rept 8 i:0 { XREG equ xmm#i } macro def_XMMath { macro XMMath [str*] \{ common define OK = def_XMMath ; allow recursion ; low precedence operations first match R == A + B,XREG OK str \\{ restore OK define OK , XMMath A ; recurse on A restore XREG ; preserve value XMMath B ; recurse on B addss R,XREG XREG equ R \\} match R == A * B,XREG OK str \\{ restore OK define OK , XMMath A ; recurse on A restore XREG XMMath B ; recurse on B mulss R,XREG XREG equ R \\} ; no match, assume memory value match R ==,XREG OK \\{ movss R,str \\} purge XMMath restore OK \} } def_XMMath ; Example of use: _dv dd 9.80665 _dx dd 1.973 _t dd 9.12345 _x0 dd -5.0 entry $ ; generate code to put result in XMM7 (top of stack register) XMMath [_dv] * [_t] * [_t] + [_dx] * [_t] + [_x0] Less manual work by programmer, though. (Partly based on the discussion here.) _________________ ¯\(°_o)/¯ AI may [not] have aided with the above reply. | |||
|  10 Jul 2013, 22:19 | 
 | 
| Roman 11 Jul 2013, 06:43 bitRAKE thanks !
 Mama Mia ! Incredible and amazing example ! Sad fact that in this way macros are not considered in the documentation on FASM   Why ? | |||
|  11 Jul 2013, 06:43 | 
 | 
| Roman 11 Jul 2013, 07:38 bitRAKE
 Thanks for help. If you know, please tell me about this. In macro (for example Val equal [_dx]*[_x0] ) if i write movss xmm1,Val Fasm will give an error, because we get movss xmm1,[_dx]*[_x0]. But how to make the Val equal [_x0] (and not using match)? I mean depose Val to [_x0]. This can be done without match? | |||
|  11 Jul 2013, 07:38 | 
 | 
| Roman 11 Jul 2013, 08:00 Sad    XMMath [_t]/[_t]/[_dv] get value 2.0 ! This is wrong , must be 0.5 ! _dv dd 2.0 _t dd 4.0 | |||
|  11 Jul 2013, 08:00 | 
 | 
| bitRAKE 12 Jul 2013, 00:46 Topic was kind of split.
 Answer should be here, too: Code: match R == A / B / C,XREG OK str \\{ restore OK define OK XMMath A restore XREG XMMath B divss R,XREG XREG equ R XMMath R / C \\} | |||
|  12 Jul 2013, 00:46 | 
 | 
| bitRAKE 12 Jul 2013, 01:56 Roman wrote: In macro (for example Val equal [_dx]*[_x0] ) p.s. You don't need to PM me for every question. I will respond to the thread if I can. My email is at gmail if you have something private, or want to pay me (paypal) for more prompt replies. Otherwise just be patient, please. _________________ ¯\(°_o)/¯ AI may [not] have aided with the above reply. | |||
|  12 Jul 2013, 01:56 | 
 | 
| Roman 12 Jul 2013, 08:49 bitRAKE
 this work if we using only 3 operations But how to make this code more versatile(i mean using in macro)? Code: match R == A / B / C,XREG OK str \\{ restore OK define OK XMMath A restore XREG XMMath B divss R,XREG XREG equ R XMMath R / C \\} How to write this example for the next combination? XMMath [_t]/[_t]/[_dv]/../.../ (i mean we dont know how much operations div were. Maybe 4 operations or maybe 7 operations) | |||
|  12 Jul 2013, 08:49 | 
 | 
| bitRAKE 12 Jul 2013, 10:18 I'm sorry it was not clear. Use both and it works for any number of "/" operations.    Code: ; stack of availible registers rept 16 i:0 { XREG equ xmm#i } ; amd64 mode macro def_XMMath { macro XMMath [str*] \{ common define OK = def_XMMath ; allow recursion ; low precedence functions first match R == A + B,XREG OK str \\{ restore OK define OK XMMath A ; recurse on A restore XREG ; preserve value XMMath B ; recurse on B addss R,XREG XREG equ R \\} match R == A - B,XREG OK str \\{ restore OK define OK XMMath A ; recurse on A restore XREG ; preserve value XMMath B ; recurse on B subss R,XREG XREG equ R \\} match R == A * B,XREG OK str \\{ restore OK define OK XMMath A restore XREG XMMath B mulss R,XREG XREG equ R \\} match R == A / B / C,XREG OK str \\{ restore OK define OK XMMath A restore XREG XMMath B divss R,XREG XREG equ R XMMath R / C \\} match R == A / B,XREG OK str \\{ restore OK define OK XMMath A restore XREG XMMath B divss R,XREG XREG equ R \\} ; no match, assume memory value match R ==,XREG OK \\{ ; skip top of stack register match =R,str \\\{ restore OK define OK \\\} match ==,OK \\\{ movss R,str \\\} \\} purge XMMath restore OK \} } def_XMMath For example, the register stack could be the 64-bit registers r8-r15, and the instructions could be changed to use basic integer arithmetic, or fixed point code, etc. A slight adaptation would even work for the FPU math. _________________ ¯\(°_o)/¯ AI may [not] have aided with the above reply. | |||
|  12 Jul 2013, 10:18 | 
 | 
| Roman 12 Jul 2013, 11:31 bitRAKE
 Thanks again ! But there is one point, you macro XMMath generated a lot of extra commands. I mean XMMath [_dv]/[_dv]/[_dv]/[_t]+[_t] We get 11 SSE commands ! If write hands we write 5 SSE commands ! if we write a lot of similar (XMMath [_dv]/[_dv]/[_dv]/[_t]+[_t]) we get a lot of extra commands ! In any case, your macro zingy | |||
|  12 Jul 2013, 11:31 | 
 | 
| bitRAKE 12 Jul 2013, 12:27 Hmm...maybe you can figure out an optimization to improve the code generation. For example, if B is a register or memory location then it can be used directly in the instruction.
 I wonder if the "no match" case could assign the string to another symbol which would work as the second operand to the instructions? Probably something like that. | |||
|  12 Jul 2013, 12:27 | 
 | 
| Roman 12 Jul 2013, 12:35 bitRAKE
 What about this XMMath [_dv]/2.0/[_dv]/[_t]+11.11 | |||
|  12 Jul 2013, 12:35 | 
 | 
| bitRAKE 12 Jul 2013, 20:25 Processing constants aren't that difficult.     Code: match R == _ A,XREG OK str \\{ < store constant somewhere and reference it > \\} Different prefixes could be used for integers and float. Could detect common constants for special handling - like 0,+/-1, etc. _________________ ¯\(°_o)/¯ AI may [not] have aided with the above reply. | |||
|  12 Jul 2013, 20:25 | 
 | 
| Goto page 1, 2  Next < Last Thread | Next Thread > | 
| Forum Rules: 
 | 
Copyright © 1999-2025, Tomasz Grysztar. Also on GitHub, YouTube.
Website powered by rwasa.