(module
 (import "fuzzing-support" "log-f32" (func $logf32 (param f32)))
 (import "fuzzing-support" "log-f64" (func $logf64 (param f64)))
 (func $test32 (export "test32")
  (call $logf32
   (f32.add
    (f32.const -nan:0x7fff82)
    (f32.neg
     (f32.const -nan:0x7ff622)
    )
   )
  )
  (call $logf32
   (f32.sub
    (f32.const -nan:0x7fff82)
    (f32.neg
     (f32.const -nan:0x7ff622)
    )
   )
  )
  (call $logf32
   (f32.mul
    (f32.const -nan:0x7fff82)
    (f32.neg
     (f32.const -nan:0x7ff622)
    )
   )
  )
  (call $logf32
   (f32.div
    (f32.const -nan:0x7fff82)
    (f32.neg
     (f32.const -nan:0x7ff622)
    )
   )
  )
  (call $logf32
   (f32.copysign
    (f32.const -nan:0x7fff82)
    (f32.neg
     (f32.const -nan:0x7ff622)
    )
   )
  )
  (call $logf32
   (f32.min
    (f32.const -nan:0x7fff82)
    (f32.neg
     (f32.const -nan:0x7ff622)
    )
   )
  )
  (call $logf32
   (f32.max
    (f32.const -nan:0x7fff82)
    (f32.neg
     (f32.const -nan:0x7ff622)
    )
   )
  )
 )
 (func $test64 (export "test64")
  (call $logf64
   (f64.add
    (f64.const -nan:0xfffffffffff82)
    (f64.neg
     (f64.const -nan:0xfffffffffa622)
    )
   )
  )
  (call $logf64
   (f64.sub
    (f64.const -nan:0xfffffffffff82)
    (f64.neg
     (f64.const -nan:0xfffffffffa622)
    )
   )
  )
  (call $logf64
   (f64.mul
    (f64.const -nan:0xfffffffffff82)
    (f64.neg
     (f64.const -nan:0xfffffffffa622)
    )
   )
  )
  (call $logf64
   (f64.div
    (f64.const -nan:0xfffffffffff82)
    (f64.neg
     (f64.const -nan:0xfffffffffa622)
    )
   )
  )
  (call $logf64
   (f64.copysign
    (f64.const -nan:0xfffffffffff82)
    (f64.neg
     (f64.const -nan:0xfffffffffa622)
    )
   )
  )
  (call $logf64
   (f64.min
    (f64.const -nan:0xfffffffffff82)
    (f64.neg
     (f64.const -nan:0xfffffffffa622)
    )
   )
  )
  (call $logf64
   (f64.max
    (f64.const -nan:0xfffffffffff82)
    (f64.neg
     (f64.const -nan:0xfffffffffa622)
    )
   )
  )
 )
 (func $just-one-nan (export "just-one-nan")
  (call $logf32
   (f32.add
    (f32.const 0)
    (f32.neg
     (f32.const -nan:0x7ff622)
    )
   )
  )
  (call $logf32
   (f32.add
    (f32.const -nan:0x7ff622)
    (f32.neg
     (f32.const 0)
    )
   )
  )
  (call $logf32
   (f32.add
    (f32.const -0)
    (f32.neg
     (f32.const -nan:0x7ff622)
    )
   )
  )
  (call $logf32
   (f32.add
    (f32.const -nan:0x7ff622)
    (f32.neg
     (f32.const -0)
    )
   )
  )
  (call $logf32
   (f32.add
    (f32.const 0)
    (f32.neg
     (f32.const nan:0x7ff622)
    )
   )
  )
  (call $logf32
   (f32.add
    (f32.const nan:0x7ff622)
    (f32.neg
     (f32.const 0)
    )
   )
  )
 )
 (func $ignore (export "ignore")
  ;; none of these are nan inputs, so the interpreter must not change the sign
  (call $logf32
   (f32.div
    (f32.const 0)
    (f32.neg
     (f32.const 0)
    )
   )
  )
  (call $logf32
   (f32.div
    (f32.const -0)
    (f32.neg
     (f32.const 0)
    )
   )
  )
  (call $logf32
   (f32.div
    (f32.const 0)
    (f32.neg
     (f32.const -0)
    )
   )
  )
  (call $logf32
   (f32.div
    (f32.const -0)
    (f32.neg
     (f32.const -0)
    )
   )
  )
 )
)
(module
 (import "fuzzing-support" "log-i32" (func $log (param i32)))
 (func $signed-comparison-to-unsigned
  (call $log
   (i32.eq               ;; should be false
    (i32.shr_s           ;; 0x0000006b after the sign-extend
     (i32.shl
      (i32.const -25749) ;; 0xffff9b6b
      (i32.const 24)
     )
     (i32.const 24)
    )
    (i32.const -149)     ;; 0xffffff6b - high bits are set, but not sign bit
   )
  )
  ;; the same, with mixed high bits. mixed bits mean the two sides can never be
  ;; equal, so the eq is always false
  (call $log
   (i32.eq
    (i32.shr_s
     (i32.shl
      (i32.const -25749)
      (i32.const 24)
     )
     (i32.const 24)
    )
    (i32.const 0xffffeb)
   )
  )
  ;; the same, with !=, so the result is always true
  (call $log
   (i32.ne
    (i32.shr_s
     (i32.shl
      (i32.const -25749)
      (i32.const 24)
     )
     (i32.const 24)
    )
    (i32.const 0xffffeb)
   )
  )
 )
 (func $foo (export "foo") (param $0 i32)
  ;; 8 - 0x80000000 < 0
  ;;
  ;; is not the same as
  ;;
  ;; 8 < 0x80000000
  ;;
  ;; because of overflow. the former is true, the latter is false
  (call $log
   (i32.le_s
    (i32.sub
     (i32.const 8)
     (block $label$1 (result i32) ;; the block prevents us from optimizing this
                                  ;; which would avoid the issue. a global or a
                                  ;; call would do the same, all would make the
                                  ;; value only visible at runtime
      (i32.const 0x80000000)
     )
    )
    (i32.const 0)
   )
  )
  ;; for comparison, without the block.
  (call $log
   (i32.le_s
    (i32.sub
     (i32.const 8)
     (i32.const 0x80000000)
    )
    (i32.const 0)
   )
  )
  ;; for comparison, what X - Y < 0 => X < Y would lead to, which has a
  ;; different value
  (call $log
   (i32.le_s
    (i32.const 8)
    (i32.const 0x80000000)
   )
  )
 )
 (func $shift (param $0 i32)
  (call $log
   ;; x << 24 >> 24 << 30 >> 24 - the extra shifts make it invalid to do the
   ;; optimization of not repeating a sign-extend. That is, this would be valid
   ;; if the 30 were replaced by a 24.
   (i32.shr_s
    (i32.shl
     (i32.shr_s
      (i32.shl
       (local.get $0)
       (i32.const 24)
      )
      (i32.const 24)
     )
     (i32.const 30)
    )
    (i32.const 24)
   )
  )
 )
 (func $do-shift (export "do-shift")
  (call $shift
   (i32.const 65419)
  )
 )
 ;; similar, but with the value compared to having the sign bit set but no
 ;; upper bits
 (func $compare-maybe-signed-eq (param $0 i32) (result i32)
  (i32.eq
   (i32.shr_s
    (i32.shl
     (local.get $0)
     (i32.const 24)
    )
    (i32.const 24)
   )
   (i32.const 128)
  )
 )
 (func $call-compare-maybe-signed-eq (export "call-compare-maybe-signed-eq") (result i32)
  (call $compare-maybe-signed-eq
   (i32.const 128)
  )
 )
 ;; the same with !=
 (func $compare-maybe-signed-ne (param $0 i32) (result i32)
  (i32.ne
   (i32.shr_s
    (i32.shl
     (local.get $0)
     (i32.const 24)
    )
    (i32.const 24)
   )
   (i32.const 128)
  )
 )
 (func $call-compare-maybe-signed-ne (export "call-compare-maybe-signed-ne") (result i32)
  (call $compare-maybe-signed-ne
   (i32.const 128)
  )
 )
)