Hi all,

I have a problem with absm2 insn, my target machine can suppport abs operation with QImode, HImode and SImode. I give machine description in md file as below.

(define_mode_macro SHQ [SI HI QI])

(define_insn "abs<mode>2"
  [(set (match_operand:SHQ           0 "register_operand" "=r")
        (abs:SHQ (match_operand:SHQ   1 "nonmemory_operand"  "rM")))]
  ""
  "abs.<MODE>  out=%0, in=%1"
  [(set_attr "type" "mux")
   (set_attr "length" "1")])


When I compiled the c code as shown below:

shirt int a, b;

a=abs(b);

note: a, b both globel variables

The generated codes do the following operations: 1) extend variable a_HI (HImode) to temp variable SImode, and do abs operation with SImode operators. I find the gimple intermedia represention as shown below:

  D.1298 = a_HI[0];
  D.1299 = (int) D.1298;
  D.1300 = ABS_EXPR <D.1299>;
  D.1301 = (short int) D.1300;

The unnecessary insns have been generated. It looks that ABS_EXPR only do SImode in the frontend.


Could anyone know how to solve this problem?


Thanks very much in advances



Best regards


Maggie



Reply via email to