mpzBit :: String -> Operand -> Operand -> Codegen Operand
mpzBit name x y = do
  nx <- unbox (FArith (ATInt ITBig)) x
  ny <- unbox (FArith (ATInt ITBig)) y
  bitcnt <- inst $ simpleCall "__gmpz_get_ui" [ny]
  nz <- alloc mpzTy
  inst' $ simpleCall "__gmpz_init" [nz]
  inst' $ simpleCall ("__gmpz_" ++ name) [nz, nx, bitcnt]
  box (FArith (ATInt ITBig)) nz
mpzBit :: String -> Operand -> Operand -> Codegen Operand
mpzBit name x y = do
  nx <- unbox (FArith (ATInt ITBig)) x
  ny <- unbox (FArith (ATInt ITBig)) y
  bitcnt <- inst $ simpleCall "__gmpz_get_ui" [ny]
  nz <- alloc mpzTy
  inst' $ simpleCall "__gmpz_init" [nz]
  inst' $ simpleCall ("__gmpz_" ++ name) [nz, nx, bitcnt]
  box (FArith (ATInt ITBig)) nz
mpzBit name x y = do
  nx <- unbox (FArith (ATInt ITBig)) x
  ny <- unbox (FArith (ATInt ITBig)) y
  bitcnt <- inst $ simpleCall "__gmpz_get_ui" [ny]
  nz <- alloc mpzTy
  inst' $ simpleCall "__gmpz_init" [nz]
  inst' $ simpleCall ("__gmpz_" ++ name) [nz, nx, bitcnt]
  box (FArith (ATInt ITBig)) nz