>> I just checked my copy of s390.md and I don’t see >> LA being used for arithmetic.
> This would be the "*la_31" and "*la_31_and" patterns. Sorry, I did a grep for “LA”, forgetting that s390.md doesn’t use uppercase instructions. > (Note that the addition is implicit in the use of > the "address_operand" constraint.) If it is an address we are talking about, then that LA instruction is going to work perfectly fine in AM24, AM31 and AM64, and in the AM64 case it is going to be the equivalent of AM32, so maybe the s390 port could have a “-m32” option for use when running 32-bit applications as AM64? >> If your copy of s390.md is using LA for arithmetic >> then would it be possible to have an option to >> use a normal mathematics instruction instead of >> LA? > LA was just an example. It doesn't usually make sense > to reason on an "use instruction X" basis, that's not > how compiler optimizations work. You rather start with > a set of semantic invariants and then make sure those > are preserved through all transformations. Ok, that’s above my head. > Therefore again my question, what is the actual goal > you want to achieve? I'm still not sure I understand > that ... I would like to know what is required to implement “-m32” in the S/390 target. I realize that z/Arch doesn’t have a specific AM32, but I don’t need a specific AM32. What would actually happen if you coded a “-m32” and then ran it in an AM64 environment? My experiments show “with one single problem discovered so far, actually –m31 and –m32 are identical and work fine under AM64”. >> Also, I just realized – if GCC is using LA for maths >> for 32-bit registers, then values will be limited to >> 2 GiB instead of 4 GiB for unsigned, but that is not >> the case. > That's why GCC makes sure to only use the instruction > when a 31-bit addition is wanted. This can be the > case either when GCC can prove that the involved > operands are pointer values (which are by definition > restricted to 31-bit values in -m31 mode) The compiler doesn’t create a restriction there. It just generates a simple LA and it works differently depending on whether it is AM24/31/64. > or when > there is an explict 31-bit addition (using e.g. an > & 0x7fffffff) in the source code. Ok, thankyou, this is what I needed to know. I believe I would like to have a –m32 that drops this test. I don’t want GCC to assume that such an AND instruction can be implemented with the use of the “LA” instruction. I want to see an explicit “N” instruction used. Can I have this as part of “-m32”? Thanks. Paul.