#include typedef struct IR IR; typedef struct IRVar IRVar; typedef enum { IR_POINTER, IR_UINT64, IR_UINT32, IR_UINT16, IR_UINT8, IR_INT64, IR_INT32, IR_INT16, IR_INT8 } IRBasicType; IR *ir_new (void); IRVar *ir_arg (IR *ir, int arg_no, IRBasicType type); IRVar *ir_var_new (IR *ir, int n_fields, IRBasicType type); IRVar *ir_var_new_similar (IR *ir, IRVar *other); IRVar *ir_var_new_wider (IR *ir, IRVar *other); /* FIXME: should be iconst16, iconst32, iconst64 etc. */ IRVar *ir_iconst1 (IR *ir, uint32_t value); IRVar *ir_iconst2 (IR *ir, uint32_t value); void ir_unpack_low (IR *ir, IRVar *dest, IRVar *src1, IRVar *src2); void ir_unpack_high (IR *ir, IRVar *dest, IRVar *src1, IRVar *src2); void ir_pack (IR *ir, IRVar *dest, IRVar *hi, IRVar *lo); void ir_shuffle4 (IR *ir, IRVar *dest, IRVar *src1, int s1, int s2, int s3, int s4); void ir_label (IR *ir, const char *name); void ir_jump_neq (IR *ir, IRVar *op1, IRVar *op2, const char *label); void ir_jump_nand (IR *ir, IRVar *op1, IRVar *op2, const char *label); void ir_mul (IR *ir, IRVar *dest, IRVar *src1, IRVar *src2); void ir_shl (IR *ir, IRVar *dest, IRVar *src, int n_pos); void ir_shrl (IR *ir, IRVar *dest, IRVar *src, IRVar *n_pos); void ir_shra (IR *ir, IRVar *dest, IRVar *src, int n_pos); void ir_mov (IR *ir, IRVar *dest, IRVar *src); void ir_sub (IR *ir, IRVar *dest, IRVar *src1, IRVar *src2); void ir_add (IR *ir, IRVar *dest, IRVar *src1, IRVar *src2); void ir_xor (IR *ir, IRVar *dest, IRVar *src1, IRVar *src2); void ir_adds (IR *ir, IRVar *dest, IRVar *src1, IRVar *dest2); void ir_load128 (IR *ir, IRVar *dest, IRVar *pointer); void ir_load64 (IR *ir, IRVar *dest, IRVar *pointer); void ir_load32 (IR *ir, IRVar *dest, IRVar *pointer); void ir_load8 (IR *ir, IRVar *dest, IRVar *pointer); void ir_store (IR *ir, IRVar *src, IRVar *pointer); void ir_jump (IR *ir, const char *label);