///|
// Jump kinds - corresponds to enum J in QBE
pub(all) enum JumpKind {
  Jxxx // Invalid/unset

  // Returns
  Jret0 // Return void
  Jretw // Return word
  Jretl // Return long
  Jrets // Return single
  Jretd // Return double
  Jretc // Return aggregate

  // Unconditional jump
  Jjmp

  // Conditional non-zero jump
  Jjnz

  // Int comparison jumps
  Jjfieq
  Jjfine
  Jjfisge
  Jjfisgt
  Jjfisle
  Jjfislt
  Jjfiuge
  Jjfiugt
  Jjfiule
  Jjfiult

  // Float comparison jumps
  Jjffeq
  Jjffge
  Jjffgt
  Jjffle
  Jjfflt
  Jjffne
  Jjffo
  Jjffuo
} derive(Eq, Debug)

///|
// Check if jump is a return
#as_free_fn(is_ret, deprecated="use `JumpKind::is_ret` instead")
pub fn JumpKind::is_ret(self : JumpKind) -> Bool {
  match self {
    Jret0 | Jretw | Jretl | Jrets | Jretd | Jretc => true
    _ => false
  }
}

///|
// Index of a jump kind in the J enum.
#as_free_fn(jump_index, deprecated="use `JumpKind::index` instead")
pub fn JumpKind::index(self : JumpKind) -> Int {
  match self {
    Jxxx => 0
    Jret0 => 1
    Jretw => 2
    Jretl => 3
    Jrets => 4
    Jretd => 5
    Jretc => 6
    Jjmp => 7
    Jjnz => 8
    Jjfieq => 9
    Jjfine => 10
    Jjfisge => 11
    Jjfisgt => 12
    Jjfisle => 13
    Jjfislt => 14
    Jjfiuge => 15
    Jjfiugt => 16
    Jjfiule => 17
    Jjfiult => 18
    Jjffeq => 19
    Jjffge => 20
    Jjffgt => 21
    Jjffle => 22
    Jjfflt => 23
    Jjffne => 24
    Jjffo => 25
    Jjffuo => 26
  }
}

///|
// Jump kind from its index in the J enum.
#as_free_fn(jump_from_index, deprecated="use `JumpKind::from_index` instead")
pub fn JumpKind::from_index(i : Int) -> JumpKind {
  match i {
    0 => Jxxx
    1 => Jret0
    2 => Jretw
    3 => Jretl
    4 => Jrets
    5 => Jretd
    6 => Jretc
    7 => Jjmp
    8 => Jjnz
    9 => Jjfieq
    10 => Jjfine
    11 => Jjfisge
    12 => Jjfisgt
    13 => Jjfisle
    14 => Jjfislt
    15 => Jjfiuge
    16 => Jjfiugt
    17 => Jjfiule
    18 => Jjfiult
    19 => Jjffeq
    20 => Jjffge
    21 => Jjffgt
    22 => Jjffle
    23 => Jjfflt
    24 => Jjffne
    25 => Jjffo
    26 => Jjffuo
    _ => abort("invalid jump index")
  }
}