text: #ifndef UNARY_OPERATOR
  #define UNARY_OPERATOR(SYMBOL, ARGUMENT_TYPE, RESULT_TYPE, INTRINSIC)
  #endif
  
  UNARY_OPERATOR("!", "Bool", "Bool", "bitwise_neg_i1")
  
  UNARY_OPERATOR("~", "Int8", "Int8", "bitwise_neg_i8")
  UNARY_OPERATOR("~", "Int16", "Int16", "bitwise_neg_i16")
  UNARY_OPERATOR("~", "Int32", "Int32", "bitwise_neg_i32")
  UNARY_OPERATOR("~", "Int64", "Int64", "bitwise_neg_i64")
  // UNARY_OPERATOR("~", "Int", "Int", "bitwise_neg_i64")
  UNARY_OPERATOR("~", "UInt8", "UInt8", "bitwise_neg_i8")
  UNARY_OPERATOR("~", "UInt16", "UInt16", "bitwise_neg_i16")
  UNARY_OPERATOR("~", "UInt32", "UInt32", "bitwise_neg_i32")
  UNARY_OPERATOR("~", "UInt64", "UInt64", "bitwise_neg_i64")
  // UNARY_OPERATOR("~", "UInt", "UInt", "bitwise_neg_i64")
  
  UNARY_OPERATOR("+", "Int8", "Int8", "arg_val_0")
  UNARY_OPERATOR("+", "Int16", "Int16", "arg_val_0")
  UNARY_OPERATOR("+", "Int32", "Int32", "arg_val_0")
  UNARY_OPERATOR("+", "Int64", "Int64", "arg_val_0")
  // UNARY_OPERATOR("+", "Int", "Int", "arg_val_0")
  UNARY_OPERATOR("+", "UInt8", "UInt8", "arg_val_0")
  UNARY_OPERATOR("+", "UInt16", "UInt16", "arg_val_0")
  UNARY_OPERATOR("+", "UInt32", "UInt32", "arg_val_0")
  UNARY_OPERATOR("+", "UInt64", "UInt64", "arg_val_0")
  // UNARY_OPERATOR("+", "UInt", "UInt", "arg_val_0")
  UNARY_OPERATOR("+", "Float32", "Float32", "arg_val_0")
  UNARY_OPERATOR("+", "Float64", "Float64", "arg_val_0")
  UNARY_OPERATOR("+", "Float", "Float", "arg_val_0")
  
  UNARY_OPERATOR("-", "Int8", "Int8", "neg_i8")
  UNARY_OPERATOR("-", "Int16", "Int16", "neg_i16")
  UNARY_OPERATOR("-", "Int32", "Int32", "neg_i32")
  UNARY_OPERATOR("-", "Int64", "Int64", "neg_i64")
  // UNARY_OPERATOR("-", "Int", "Int", "neg_i64")
  UNARY_OPERATOR("-", "Float32", "Float32", "neg_f32")
  UNARY_OPERATOR("-", "Float64", "Float64", "neg_f64")
  UNARY_OPERATOR("-", "Float", "Float", "neg_f64")
  
  #ifndef BINARY_OPERATOR
  #define BINARY_OPERATOR(SYMBOL, ARGUMENT_TYPE1, ARGUMENT_TYPE2, RESULT_TYPE, INTRINSIC)
  #endif
  
  BINARY_OPERATOR("<<", "Int8", "UInt", "Int8", "shl_i8")
  BINARY_OPERATOR("<<", "Int16", "UInt", "Int16", "shl_i16")
  BINARY_OPERATOR("<<", "Int32", "UInt", "Int32", "shl_i32")
  BINARY_OPERATOR("<<", "Int64", "UInt", "Int64", "shl_i64")
  // BINARY_OPERATOR("<<", "Int", "UInt", "Int", "shl_i64")
  BINARY_OPERATOR("<<", "UInt8", "UInt", "UInt8", "shl_i8")
  BINARY_OPERATOR("<<", "UInt16", "UInt", "UInt16", "shl_i16")
  BINARY_OPERATOR("<<", "UInt32", "UInt", "UInt32", "shl_i32")
  BINARY_OPERATOR("<<", "UInt64", "UInt", "UInt64", "shl_i64")
  // BINARY_OPERATOR("<<", "UInt", "UInt", "UInt", "shl_i64")
  
  BINARY_OPERATOR(">>", "Int8", "UInt", "Int8", "shr_i8")
  BINARY_OPERATOR(">>", "Int16", "UInt", "Int16", "shr_i16")
  BINARY_OPERATOR(">>", "Int32", "UInt", "Int32", "shr_i32")
  BINARY_OPERATOR(">>", "Int64", "UInt", "Int64", "shr_i64")
  // BINARY_OPERATOR(">>", "Int", "UInt", "Int", "shr_i64")
  BINARY_OPERATOR(">>", "UInt8", "UInt", "UInt8", "shr_i8")
  BINARY_OPERATOR(">>", "UInt16", "UInt", "UInt16", "shr_i16")
  BINARY_OPERATOR(">>", "UInt32", "UInt", "UInt32", "shr_i32")
  BINARY_OPERATOR(">>", "UInt64", "UInt", "UInt64", "shr_i64")
  // BINARY_OPERATOR(">>", "UInt", "UInt", "UInt", "shr_i64")
  
  BINARY_OPERATOR("*", "Int8", "Int8", "Int8", "mul_i8")
  BINARY_OPERATOR("*", "Int16", "Int16", "Int16", "mul_i16")
  BINARY_OPERATOR("*", "Int32", "Int32", "Int32", "mul_i32")
  BINARY_OPERATOR("*", "Int64", "Int64", "Int64", "mul_i64")
  // BINARY_OPERATOR("*", "Int", "Int", "Int", "mul_i64")
  BINARY_OPERATOR("*", "UInt8", "UInt8", "UInt8", "mul_i8")
  BINARY_OPERATOR("*", "UInt16", "UInt16", "UInt16", "mul_i16")
  BINARY_OPERATOR("*", "UInt32", "UInt32", "UInt32", "mul_i32")
  BINARY_OPERATOR("*", "UInt64", "UInt64", "UInt64", "mul_i64")
  // BINARY_OPERATOR("*", "UInt", "UInt", "UInt", "mul_i64")
  BINARY_OPERATOR("*", "Float32", "Float32", "Float32", "mul_f32")
  BINARY_OPERATOR("*", "Float64", "Float64", "Float64", "mul_f64")
  BINARY_OPERATOR("*", "Float", "Float", "Float", "mul_f64")
  
  BINARY_OPERATOR("/", "Int8", "Int8", "Int8", "div_s8")
  BINARY_OPERATOR("/", "Int16", "Int16", "Int16", "div_s16")
  BINARY_OPERATOR("/", "Int32", "Int32", "Int32", "div_s32")
  BINARY_OPERATOR("/", "Int64", "Int64", "Int64", "div_s64")
  // BINARY_OPERATOR("/", "Int", "Int", "Int", "div_s64")
  BINARY_OPERATOR("/", "UInt8", "UInt8", "UInt8", "div_u8")
  BINARY_OPERATOR("/", "UInt16", "UInt16", "UInt16", "div_u16")
  BINARY_OPERATOR("/", "UInt32", "UInt32", "UInt32", "div_u32")
  BINARY_OPERATOR("/", "UInt64", "UInt64", "UInt64", "div_u64")
  // BINARY_OPERATOR("/", "UInt", "UInt", "UInt", "div_u64")
  BINARY_OPERATOR("/", "Float32", "Float32", "Float32", "div_f32")
  BINARY_OPERATOR("/", "Float64", "Float64", "Float64", "div_f64")
  BINARY_OPERATOR("/", "Float", "Float", "Float", "div_f64")
  
  BINARY_OPERATOR("%", "Int8", "Int8", "Int8", "rem_s8")
  BINARY_OPERATOR("%", "Int16", "Int16", "Int16", "rem_s16")
  BINARY_OPERATOR("%", "Int32", "Int32", "Int32", "rem_s32")
  BINARY_OPERATOR("%", "Int64", "Int64", "Int64", "rem_s64")
  // BINARY_OPERATOR("%", "Int", "Int", "Int", "rem_s64")
  BINARY_OPERATOR("%", "UInt8", "UInt8", "UInt8", "rem_u8")
  BINARY_OPERATOR("%", "UInt16", "UInt16", "UInt16", "rem_u16")
  BINARY_OPERATOR("%", "UInt32", "UInt32", "UInt32", "rem_u32")
  BINARY_OPERATOR("%", "UInt64", "UInt64", "UInt64", "rem_u64")
  // BINARY_OPERATOR("%", "UInt", "UInt", "UInt", "rem_u64")
  BINARY_OPERATOR("%", "Float32", "Float32", "Float32", "rem_f32")
  BINARY_OPERATOR("%", "Float64", "Float64", "Float64", "rem_f64")
  BINARY_OPERATOR("%", "Float", "Float", "Float", "rem_f64")
  
  BINARY_OPERATOR("&", "Int8", "Int8", "Int8", "bitwise_and_i8")
  BINARY_OPERATOR("&", "Int16", "Int16", "Int16", "bitwise_and_i16")
  BINARY_OPERATOR("&", "Int32", "Int32", "Int32", "bitwise_and_i32")
  BINARY_OPERATOR("&", "Int64", "Int64", "Int64", "bitwise_and_i64")
  // BINARY_OPERATOR("&", "Int", "Int", "Int", "bitwise_and_i64")
  BINARY_OPERATOR("&", "UInt8", "UInt8", "UInt8", "bitwise_and_i8")
  BINARY_OPERATOR("&", "UInt16", "UInt16", "UInt16", "bitwise_and_i16")
  BINARY_OPERATOR("&", "UInt32", "UInt32", "UInt32", "bitwise_and_i32")
  BINARY_OPERATOR("&", "UInt64", "UInt64", "UInt64", "bitwise_and_i64")
  // BINARY_OPERATOR("&", "UInt", "UInt", "UInt", "bitwise_and_i64")
  
  BINARY_OPERATOR("+", "Int8", "Int8", "Int8", "add_i8")
  BINARY_OPERATOR("+", "Int16", "Int16", "Int16", "add_i16")
  BINARY_OPERATOR("+", "Int32", "Int32", "Int32", "add_i32")
  BINARY_OPERATOR("+", "Int64", "Int64", "Int64", "add_i64")
  // BINARY_OPERATOR("+", "Int", "Int", "Int", "add_i64")
  BINARY_OPERATOR("+", "UInt8", "UInt8", "UInt8", "add_i8")
  BINARY_OPERATOR("+", "UInt16", "UInt16", "UInt16", "add_i16")
  BINARY_OPERATOR("+", "UInt32", "UInt32", "UInt32", "add_i32")
  BINARY_OPERATOR("+", "UInt64", "UInt64", "UInt64", "add_i64")
  // BINARY_OPERATOR("+", "UInt", "UInt", "UInt", "add_i64")
  BINARY_OPERATOR("+", "Float32", "Float32", "Float32", "add_f32")
  BINARY_OPERATOR("+", "Float64", "Float64", "Float64", "add_f64")
  BINARY_OPERATOR("+", "Float", "Float", "Float", "add_f64")
  
  BINARY_OPERATOR("-", "Int8", "Int8", "Int8", "sub_i8")
  BINARY_OPERATOR("-", "Int16", "Int16", "Int16", "sub_i16")
  BINARY_OPERATOR("-", "Int32", "Int32", "Int32", "sub_i32")
  BINARY_OPERATOR("-", "Int64", "Int64", "Int64", "sub_i64")
  // BINARY_OPERATOR("-", "Int", "Int", "Int", "sub_i64")
  BINARY_OPERATOR("-", "UInt8", "UInt8", "UInt8", "sub_i8")
  BINARY_OPERATOR("-", "UInt16", "UInt16", "UInt16", "sub_i16")
  BINARY_OPERATOR("-", "UInt32", "UInt32", "UInt32", "sub_i32")
  BINARY_OPERATOR("-", "UInt64", "UInt64", "UInt64", "sub_i64")
  // BINARY_OPERATOR("-", "UInt", "UInt", "UInt", "sub_i64")
  BINARY_OPERATOR("-", "Float32", "Float32", "Float32", "sub_f32")
  BINARY_OPERATOR("-", "Float64", "Float64", "Float64", "sub_f64")
  BINARY_OPERATOR("-", "Float", "Float", "Float", "sub_f64")
  BINARY_OPERATOR("-", "Void*", "Void*", "Int", "ptr_diff")
  
  BINARY_OPERATOR("|", "Int8", "Int8", "Int8", "bitwise_or_i8")
  BINARY_OPERATOR("|", "Int16", "Int16", "Int16", "bitwise_or_i16")
  BINARY_OPERATOR("|", "Int32", "Int32", "Int32", "bitwise_or_i32")
  BINARY_OPERATOR("|", "Int64", "Int64", "Int64", "bitwise_or_i64")
  // BINARY_OPERATOR("|", "Int", "Int", "Int", "bitwise_or_i64")
  BINARY_OPERATOR("|", "UInt8", "UInt8", "UInt8", "bitwise_or_i8")
  BINARY_OPERATOR("|", "UInt16", "UInt16", "UInt16", "bitwise_or_i16")
  BINARY_OPERATOR("|", "UInt32", "UInt32", "UInt32", "bitwise_or_i32")
  BINARY_OPERATOR("|", "UInt64", "UInt64", "UInt64", "bitwise_or_i64")
  // BINARY_OPERATOR("|", "UInt", "UInt", "UInt", "bitwise_or_i64")
  
  BINARY_OPERATOR("^", "Int8", "Int8", "Int8", "bitwise_xor_i8")
  BINARY_OPERATOR("^", "Int16", "Int16", "Int16", "bitwise_xor_i16")
  BINARY_OPERATOR("^", "Int32", "Int32", "Int32", "bitwise_xor_i32")
  BINARY_OPERATOR("^", "Int64", "Int64", "Int64", "bitwise_xor_i64")
  // BINARY_OPERATOR("^", "Int", "Int", "Int", "bitwise_xor_i64")
  BINARY_OPERATOR("^", "UInt8", "UInt8", "UInt8", "bitwise_xor_i8")
  BINARY_OPERATOR("^", "UInt16", "UInt16", "UInt16", "bitwise_xor_i16")
  BINARY_OPERATOR("^", "UInt32", "UInt32", "UInt32", "bitwise_xor_i32")
  BINARY_OPERATOR("^", "UInt64", "UInt64", "UInt64", "bitwise_xor_i64")
  // BINARY_OPERATOR("^", "UInt", "UInt", "UInt", "bitwise_xor_i64")
  
  BINARY_OPERATOR("<", "Int8", "Int8", "Bool", "cmp_lt_s8")
  BINARY_OPERATOR("<", "Int16", "Int16", "Bool", "cmp_lt_s16")
  BINARY_OPERATOR("<", "Int32", "Int32", "Bool", "cmp_lt_s32")
  BINARY_OPERATOR("<", "Int64", "Int64", "Bool", "cmp_lt_s64")
  // BINARY_OPERATOR("<", "Int", "Int", "Bool", "cmp_lt_s64")
  BINARY_OPERATOR("<", "UInt8", "UInt8", "Bool", "cmp_lt_u8")
  BINARY_OPERATOR("<", "UInt16", "UInt16", "Bool", "cmp_lt_u16")
  BINARY_OPERATOR("<", "UInt32", "UInt32", "Bool", "cmp_lt_u32")
  BINARY_OPERATOR("<", "UInt64", "UInt64", "Bool", "cmp_lt_u64")
  // BINARY_OPERATOR("<", "UInt", "UInt", "Bool", "cmp_lt_u64")
  BINARY_OPERATOR("<", "Float32", "Float32", "Bool", "cmp_lt_f32")
  BINARY_OPERATOR("<", "Float64", "Float64", "Bool", "cmp_lt_f64")
  BINARY_OPERATOR("<", "Float", "Float", "Bool", "cmp_lt_f64")
  
  BINARY_OPERATOR("<=", "Int8", "Int8", "Bool", "cmp_le_s8")
  BINARY_OPERATOR("<=", "Int16", "Int16", "Bool", "cmp_le_s16")
  BINARY_OPERATOR("<=", "Int32", "Int32", "Bool", "cmp_le_s32")
  BINARY_OPERATOR("<=", "Int64", "Int64", "Bool", "cmp_le_s64")
  // BINARY_OPERATOR("<=", "Int", "Int", "Bool", "cmp_le_s64")
  BINARY_OPERATOR("<=", "UInt8", "UInt8", "Bool", "cmp_le_u8")
  BINARY_OPERATOR("<=", "UInt16", "UInt16", "Bool", "cmp_le_u16")
  BINARY_OPERATOR("<=", "UInt32", "UInt32", "Bool", "cmp_le_u32")
  BINARY_OPERATOR("<=", "UInt64", "UInt64", "Bool", "cmp_le_u64")
  // BINARY_OPERATOR("<=", "UInt", "UInt", "Bool", "cmp_le_u64")
  BINARY_OPERATOR("<=", "Float32", "Float32", "Bool", "cmp_le_f32")
  BINARY_OPERATOR("<=", "Float64", "Float64", "Bool", "cmp_le_f64")
  BINARY_OPERATOR("<=", "Float", "Float", "Bool", "cmp_le_f64")
  
  BINARY_OPERATOR(">", "Int8", "Int8", "Bool", "cmp_gt_s8")
  BINARY_OPERATOR(">", "Int16", "Int16", "Bool", "cmp_gt_s16")
  BINARY_OPERATOR(">", "Int32", "Int32", "Bool", "cmp_sgt_s32")
  BINARY_OPERATOR(">", "Int64", "Int64", "Bool", "cmp_gt_s64")
  // BINARY_OPERATOR(">", "Int", "Int", "Bool", "cmp_gt_s64")
  BINARY_OPERATOR(">", "UInt8", "UInt8", "Bool", "cmp_gt_u8")
  BINARY_OPERATOR(">", "UInt16", "UInt16", "Bool", "cmp_gt_u16")
  BINARY_OPERATOR(">", "UInt32", "UInt32", "Bool", "cmp_gt_u32")
  BINARY_OPERATOR(">", "UInt64", "UInt64", "Bool", "cmp_gt_u64")
  // BINARY_OPERATOR(">", "UInt", "UInt", "Bool", "cmp_gt_u64")
  BINARY_OPERATOR(">", "Float32", "Float32", "Bool", "cmp_gt_f32")
  BINARY_OPERATOR(">", "Float64", "Float64", "Bool", "cmp_gt_f64")
  BINARY_OPERATOR(">", "Float", "Float", "Bool", "cmp_gt_f64")
  
  BINARY_OPERATOR(">=", "Int8", "Int8", "Bool", "cmp_ge_s8")
  BINARY_OPERATOR(">=", "Int16", "Int16", "Bool", "cmp_ge_s16")
  BINARY_OPERATOR(">=", "Int32", "Int32", "Bool", "cmp_ge_s32")
  BINARY_OPERATOR(">=", "Int64", "Int64", "Bool", "cmp_ge_s64")
  // BINARY_OPERATOR(">=", "Int", "Int", "Bool", "cmp_ge_s64")
  BINARY_OPERATOR(">=", "UInt8", "UInt8", "Bool", "cmp_ge_u8")
  BINARY_OPERATOR(">=", "UInt16", "UInt16", "Bool", "cmp_ge_u16")
  BINARY_OPERATOR(">=", "UInt32", "UInt32", "Bool", "cmp_ge_u32")
  BINARY_OPERATOR(">=", "UInt64", "UInt64", "Bool", "cmp_ge_u64")
  // BINARY_OPERATOR(">=", "UInt", "UInt", "Bool", "cmp_ge_u64")
  BINARY_OPERATOR(">=", "Float32", "Float32", "Bool", "cmp_ge_f32")
  BINARY_OPERATOR(">=", "Float64", "Float64", "Bool", "cmp_ge_f64")
  BINARY_OPERATOR(">=", "Float", "Float", "Bool", "cmp_ge_f64")
  
  BINARY_OPERATOR("==", "Bool", "Bool", "Bool", "cmp_eq_i1")
  BINARY_OPERATOR("==", "Int8", "Int8", "Bool", "cmp_eq_i8")
  BINARY_OPERATOR("==", "Int16", "Int16", "Bool", "cmp_eq_i16")
  BINARY_OPERATOR("==", "Int32", "Int32", "Bool", "cmp_eq_i32")
  BINARY_OPERATOR("==", "Int64", "Int64", "Bool", "cmp_eq_i64")
  // BINARY_OPERATOR("==", "Int", "Int", "Bool", "cmp_eq_i64")
  BINARY_OPERATOR("==", "UInt8", "UInt8", "Bool", "cmp_eq_i8")
  BINARY_OPERATOR("==", "UInt16", "UInt16", "Bool", "cmp_eq_i16")
  BINARY_OPERATOR("==", "UInt32", "UInt32", "Bool", "cmp_eq_i32")
  BINARY_OPERATOR("==", "UInt64", "UInt64", "Bool", "cmp_eq_i64")
  // BINARY_OPERATOR("==", "UInt", "UInt", "Bool", "cmp_eq_i64")
  BINARY_OPERATOR("==", "Float32", "Float32", "Bool", "cmp_eq_f32")
  BINARY_OPERATOR("==", "Float64", "Float64", "Bool", "cmp_eq_f64")
  BINARY_OPERATOR("==", "Float", "Float", "Bool", "cmp_eq_f64")
  BINARY_OPERATOR("==", "Void*", "Void*", "Bool", "cmp_eq_ptr")
  
  BINARY_OPERATOR("!=", "Int8", "Int8", "Bool", "cmp_ne_i8")
  BINARY_OPERATOR("!=", "Int16", "Int16", "Bool", "cmp_ne_i16")
  BINARY_OPERATOR("!=", "Int32", "Int32", "Bool", "cmp_ne_i32")
  BINARY_OPERATOR("!=", "Int64", "Int64", "Bool", "cmp_ne_i64")
  // BINARY_OPERATOR("!=", "Int", "Int", "Bool", "cmp_ne_i64")
  BINARY_OPERATOR("!=", "UInt8", "UInt8", "Bool", "cmp_ne_i8")
  BINARY_OPERATOR("!=", "UInt16", "UInt16", "Bool", "cmp_ne_i16")
  BINARY_OPERATOR("!=", "UInt32", "UInt32", "Bool", "cmp_ne_i32")
  BINARY_OPERATOR("!=", "UInt64", "UInt64", "Bool", "cmp_ne_i64")
  // BINARY_OPERATOR("!=", "UInt", "UInt", "Bool", "cmp_ne_i64")
  BINARY_OPERATOR("!=", "Float32", "Float32", "Bool", "cmp_ne_f32")
  BINARY_OPERATOR("!=", "Float64", "Float64", "Bool", "cmp_ne_f64")
  BINARY_OPERATOR("!=", "Float", "Float", "Bool", "cmp_ne_f64")
  BINARY_OPERATOR("!=", "Void*", "Void*", "Bool", "cmp_ne_ptr")
  
  BINARY_OPERATOR("&&", "Bool", "Bool", "Bool", "bitwise_and_i1")
  BINARY_OPERATOR("||", "Bool", "Bool", "Bool", "bitwise_or_i1")
  
  #undef UNARY_OPERATOR
  #undef BINARY_OPERATOR
  