Yes, that's it !

If   A<>B   I don't care about R1 and C,
and if (it's known that) A=B  I only have to test  R1 <= C

I had put mental parentheses around the 2nd and 3rd conditions connected by the 
AND,
never seeing that the 2nd condition was not even needed in the first place ...

Many thanks !


-----Message d'origine-----
De : IBM Mainframe Assembler List [mailto:[email protected]] De 
la part de Rob Scott
Envoyé : mercredi 25 avril 2012 11:14
À : [email protected]
Objet : Re: Boolean logic in structured programming macroes

The macros are only doing exactly what you are telling them - unfortunately in 
this case the second CLC in your "IF" is redundant and there is no need to code 
it.

If "A<>B" is not satisfied, then there is no need to test "A=B" before your 
next condition.

You should be able to code the following :

           IF  (CLC,A,NE,B),OR,(CH,R1,LE,C)
              STH   R3,NUMBER
          ENDIF ,


Rob Scott
Lead Developer
Rocket Software
275 Grove Street * Newton, MA 02466-2272 * USA
Tel: +1.781.684.2305
Email: [email protected]
Web: www.rocketsoftware.com


-----Original Message-----
From: IBM Mainframe Assembler List [mailto:[email protected]] On 
Behalf Of DEBERT Jean-Louis
Sent: 25 April 2012 09:46
To: [email protected]
Subject: Boolean logic in structured programming macroes

Hi all,


I have been experimenting for some time with the structured programming macros 
in the HLASM toolkit   (IF,  ELSE,  DO,  etc...)
and I stumbled on a small inconsistency, which I don't quite know how to 
bypass, "cleanly" that is.

This is a case where I want to do something if  (A ne B)   or if   ((A eq B)  
and (R1 le C))
So I used the structured programming macroes, writing the following:


           IF  (CLC,A,NE,B),OR,                                        *
               (CLC,A,EQ,B),AND,                                       *
               (CH,R1,LE,C)
              STH   R3,NUMBER                                    <-   this is 
what I want to do if the correct conditions are matched.
          ENDIF ,


The code generated by the macros is hereafter:

                                                                                
               2092              IF  (CLC,A,NE,B),OR,                           
             *02730000
                                                                                
                                          (CLC,A,EQ,B),AND,                     
                  *02740000
                                                                                
                                          (CH,R1,LE,C)                          
                             02750000
000000E0 D507 D080 D088 00000080 00000088    2111+                CLC           
  A,B                                                    03-ASMMPOPI
000000E6 A774 000B                                 000000FC   2112+             
   BRC             7,#@LB2                                        03-ASMMPOPI
000000EA D507 D080 D088 00000080 00000088    2113+                CLC           
  A,B                                                   03-ASMMPOPI
000000F0 A774 0008                                 00000100    2114+            
    BRC             7,#@LB1                                        03-ASMMPOPI
000000F4 4910 D090                                 00000090    2115+            
    CH              R1,C                                                  
03-ASMMPOPI
000000F8 A724 0004                                 00000100    2116+            
    BRC            2,#@LB1                                         02-ASMMIFPR
000000FC                                                                        
     2117+#@LB2                  DC  0H                                         
        02-ASMMIFPR
000000FC 4030 D092                                 00000092    2119             
    STH   R3,NUMBER                                            02760000
                                                                                
                2120            ENDIF ,                                         
                             02780000
00000100                                                                        
     2125+#@LB1    DC    0H                                                     
        01-00000935


Now, the code generated does what I want, but due to two conditions being 
tested on exactly the same instruction (CLC  A,B) it happens that when A is 
equal to B, it will execute the 2nd CLC  (at address EA) for nothing at all, 
because if this instruction is executed, it is already known that A equals B

I repeat, the generated code still do what I want, but I wondered whether there 
would be some way of coding the conditions so as to avoid the unnecessary CLC  ?
Also, at the code generation stage in the macro, the assembler has everything 
it needs (instruction code and parameters) to know that the same instruction is 
(unnecessarily) repeated, so why does it still do repeat it ?

Any hint would be welcome.


Please forgive me if something is obvious to you, my knowledge of Boolean logic 
is sparse at best.
Also possibly forgive my English, as it is not my native language.

Thanks in advance to all.

Reply via email to