Project

General

Profile

Revision 3cd040e3 src/backends/C/c_backend_common.ml

View differences:

src/backends/C/c_backend_common.ml
108 108
let pp_machine_clear_name fmt id = fprintf fmt "%s_clear" id
109 109
let pp_machine_step_name fmt id = fprintf fmt "%s_step" id
110 110

  
111
let pp_mod pp_val v1 v2 fmt =
112
  if !Options.integer_div_euclidean then
113
    (* (a mod_C b) + (a < 0 ? abs(b) : 0) *)
114
    Format.fprintf fmt "((%a %% %a) + (%a < 0?(abs(%a)):0))"
115
      pp_val v1 pp_val v2
116
      pp_val v1 pp_val v2
117
  else (* Regular behavior: printing a % *)
118
    Format.fprintf fmt "(%a %% %a)" pp_val v1 pp_val v2
119

  
120
let pp_div pp_val v1 v2 fmt =
121
  if !Options.integer_div_euclidean then
122
    (* (a - ((a mod_C b) + (a < 0 ? abs(b) : 0))) div_C b *)
123
    Format.fprintf fmt "(%a - ((%a %% %a) + (%a < 0 ? abs(%a) : 0))) / %a"
124
      pp_val v1 pp_val v1 pp_val v2
125
      pp_val v1 pp_val v2 pp_val v2
126
  else (* Regular behavior: printing a / *)
127
    Format.fprintf fmt "(%a / %a)" pp_val v1 pp_val v2
128
  
111 129
let pp_basic_lib_fun i pp_val fmt vl =
112 130
  match i, vl with
113 131
  (*  | "ite", [v1; v2; v3] -> Format.fprintf fmt "(%a?(%a):(%a))" pp_val v1 pp_val v2 pp_val v3 *)
......
115 133
  | "not", [v] -> Format.fprintf fmt "(!%a)" pp_val v
116 134
  | "impl", [v1; v2] -> Format.fprintf fmt "(!%a || %a)" pp_val v1 pp_val v2
117 135
  | "=", [v1; v2] -> Format.fprintf fmt "(%a == %a)" pp_val v1 pp_val v2
118
  | "mod", [v1; v2] -> Format.fprintf fmt "(%a %% %a)" pp_val v1 pp_val v2
136
  | "mod", [v1; v2] ->
137
     let typ = v1.value_type in
138
     if Types.is_int_type v1.value_type then
139
       pp_mod pp_val v1 v2 fmt 
140
     else
141
       Format.fprintf fmt "(%a %% %a)" pp_val v1 pp_val v2
119 142
  | "equi", [v1; v2] -> Format.fprintf fmt "(!%a == !%a)" pp_val v1 pp_val v2
120 143
  | "xor", [v1; v2] -> Format.fprintf fmt "(!%a != !%a)" pp_val v1 pp_val v2
144
  | "/", [v1; v2] ->
145
     if Types.is_int_type v1.value_type then
146
       pp_div pp_val v1 v2 fmt
147
     else
148
       Format.fprintf fmt "(%a / %a)" pp_val v1 pp_val v2
121 149
  | _, [v1; v2] -> Format.fprintf fmt "(%a %s %a)" pp_val v1 i pp_val v2
122 150
  | _ -> (Format.eprintf "internal error: Basic_library.pp_c %s@." i; assert false)
123 151

  

Also available in: Unified diff