1 .. default-domain:: ir 2 3 Sparse's Intermediate Representation 4 ==================================== 5 6 Instructions 7 ~~~~~~~~~~~~ 8 9 This document briefly describes which field of struct instruction is 10 used by which operation. 11 12 Some of those fields are used by almost all instructions, 13 some others are specific to only one or a few instructions. 14 The common ones are: 15 16 * .src1, .src2, .src3: (pseudo_t) operands of binops or ternary ops. 17 * .src: (pseudo_t) operand of unary ops (alias for .src1). 18 * .target: (pseudo_t) result of unary, binary & ternary ops, is 19 sometimes used otherwise by some others instructions. 20 * .cond: (pseudo_t) input operands for condition (alias .src/.src1) 21 * .type: (symbol*) usually the type of .result, sometimes of the operands 22 23 Terminators 24 ----------- 25 .. op:: OP_RET 26 Return from subroutine. 27 28 * .src : returned value (NULL if void) 29 * .type: type of .src 30 31 .. op:: OP_BR 32 Unconditional branch 33 34 * .bb_true: destination basic block 35 36 .. op:: OP_CBR 37 Conditional branch 38 39 * .cond: condition 40 * .type: type of .cond, must be an integral type 41 * .bb_true, .bb_false: destination basic blocks 42 43 .. op:: OP_SWITCH 44 Switch / multi-branch 45 46 * .cond: condition 47 * .type: type of .cond, must be an integral type 48 * .multijmp_list: pairs of case-value - destination basic block 49 50 .. op:: OP_COMPUTEDGOTO 51 Computed goto / branch to register 52 53 * .src: address to branch to (void*) 54 * .multijmp_list: list of possible destination basic blocks 55 56 Arithmetic binops 57 ----------------- 58 They all follow the same signature: 59 * .src1, .src1: operands (types must be compatible with .target) 60 * .target: result of the operation (must be an integral type) 61 * .type: type of .target 62 63 .. op:: OP_ADD 64 Integer addition. 65 66 .. op:: OP_SUB 67 Integer subtraction. 68 69 .. op:: OP_MUL 70 Integer multiplication. 71 72 .. op:: OP_DIVU 73 Integer unsigned division. 74 75 .. op:: OP_DIVS 76 Integer signed division. 77 78 .. op:: OP_MODU 79 Integer unsigned remainder. 80 81 .. op:: OP_MODS 82 Integer signed remainder. 83 84 .. op:: OP_SHL 85 Shift left (integer only) 86 87 .. op:: OP_LSR 88 Logical Shift right (integer only) 89 90 .. op:: OP_ASR 91 Arithmetic Shift right (integer only) 92 93 Floating-point binops 94 --------------------- 95 They all follow the same signature: 96 * .src1, .src1: operands (types must be compatible with .target) 97 * .target: result of the operation (must be a floating-point type) 98 * .type: type of .target 99 100 .. op:: OP_FADD 101 Floating-point addition. 102 103 .. op:: OP_FSUB 104 Floating-point subtraction. 105 106 .. op:: OP_FMUL 107 Floating-point multiplication. 108 109 .. op:: OP_FDIV 110 Floating-point division. 111 112 Logical ops 113 ----------- 114 They all follow the same signature: 115 * .src1, .src2: operands (types must be compatible with .target) 116 * .target: result of the operation 117 * .type: type of .target, must be an integral type 118 119 .. op:: OP_AND 120 Logical AND 121 122 .. op:: OP_OR 123 Logical OR 124 125 .. op:: OP_XOR 126 Logical XOR 127 128 Integer compares 129 ---------------- 130 They all have the following signature: 131 * .src1, .src2: operands (types must be compatible) 132 * .target: result of the operation (0/1 valued integer) 133 * .type: type of .target, must be an integral type 134 135 .. op:: OP_SET_EQ 136 Compare equal. 137 138 .. op:: OP_SET_NE 139 Compare not-equal. 140 141 .. op:: OP_SET_LE 142 Compare less-than-or-equal (signed). 143 144 .. op:: OP_SET_GE 145 Compare greater-than-or-equal (signed). 146 147 .. op:: OP_SET_LT 148 Compare less-than (signed). 149 150 .. op:: OP_SET_GT 151 Compare greater-than (signed). 152 153 .. op:: OP_SET_B 154 Compare less-than (unsigned). 155 156 .. op:: OP_SET_A 157 Compare greater-than (unsigned). 158 159 .. op:: OP_SET_BE 160 Compare less-than-or-equal (unsigned). 161 162 .. op:: OP_SET_AE 163 Compare greater-than-or-equal (unsigned). 164 165 Floating-point compares 166 ----------------------- 167 They all have the same signature as the integer compares. 168 169 The usual 6 operations exist in two versions: 'ordered' and 170 'unordered'. These operations first check if any operand is a 171 NaN and if it is the case the ordered compares return false 172 and then unordered return true, otherwise the result of the 173 comparison, now guaranteed to be done on non-NaNs, is returned. 174 175 .. op:: OP_FCMP_OEQ 176 Floating-point compare ordered equal 177 178 .. op:: OP_FCMP_ONE 179 Floating-point compare ordered not-equal 180 181 .. op:: OP_FCMP_OLE 182 Floating-point compare ordered less-than-or-equal 183 184 .. op:: OP_FCMP_OGE 185 Floating-point compare ordered greater-or-equal 186 187 .. op:: OP_FCMP_OLT 188 Floating-point compare ordered less-than 189 190 .. op:: OP_FCMP_OGT 191 Floating-point compare ordered greater-than 192 193 194 .. op:: OP_FCMP_UEQ 195 Floating-point compare unordered equal 196 197 .. op:: OP_FCMP_UNE 198 Floating-point compare unordered not-equal 199 200 .. op:: OP_FCMP_ULE 201 Floating-point compare unordered less-than-or-equal 202 203 .. op:: OP_FCMP_UGE 204 Floating-point compare unordered greater-or-equal 205 206 .. op:: OP_FCMP_ULT 207 Floating-point compare unordered less-than 208 209 .. op:: OP_FCMP_UGT 210 Floating-point compare unordered greater-than 211 212 213 .. op:: OP_FCMP_ORD 214 Floating-point compare ordered: return true if both operands are ordered 215 (none of the operands are a NaN) and false otherwise. 216 217 .. op:: OP_FCMP_UNO 218 Floating-point compare unordered: return false if no operands is ordered 219 and true otherwise. 220 221 Unary ops 222 --------- 223 .. op:: OP_NOT 224 Logical not. 225 226 * .src: operand (type must be compatible with .target) 227 * .target: result of the operation 228 * .type: type of .target, must be an integral type 229 230 .. op:: OP_NEG 231 Integer negation. 232 233 * .src: operand (type must be compatible with .target) 234 * .target: result of the operation (must be an integral type) 235 * .type: type of .target 236 237 .. op:: OP_FNEG 238 Floating-point negation. 239 240 * .src: operand (type must be compatible with .target) 241 * .target: result of the operation (must be a floating-point type) 242 * .type: type of .target 243 244 .. op:: OP_SYMADDR 245 Create a pseudo corresponding to the address of a symbol. 246 247 * .src: input symbol (must be a PSEUDO_SYM) 248 * .target: symbol's address 249 250 .. op:: OP_COPY 251 Copy (only needed after out-of-SSA). 252 253 * .src: operand (type must be compatible with .target) 254 * .target: result of the operation 255 * .type: type of .target 256 257 Type conversions 258 ---------------- 259 They all have the following signature: 260 * .src: source value 261 * .orig_type: type of .src 262 * .target: result value 263 * .type: type of .target 264 265 Currently, a cast to a void pointer is treated like a cast to 266 an unsigned integer of the same size. 267 268 .. op:: OP_TRUNC 269 Cast from integer to an integer of a smaller size. 270 271 .. op:: OP_SEXT 272 Cast from integer to an integer of a bigger size with sign extension. 273 274 .. op:: OP_ZEXT 275 Cast from integer to an integer of a bigger size with zero extension. 276 277 .. op:: OP_UTPTR 278 Cast from pointer-sized unsigned integer to pointer type. 279 280 .. op:: OP_PTRTU 281 Cast from pointer type to pointer-sized unsigned integer. 282 283 .. op:: OP_PTRCAST 284 Cast between pointers. 285 286 .. op:: OP_FCVTU 287 Conversion from float type to unsigned integer. 288 289 .. op:: OP_FCVTS 290 Conversion from float type to signed integer. 291 292 .. op:: OP_UCVTF 293 Conversion from unsigned integer to float type. 294 295 .. op:: OP_SCVTF 296 Conversion from signed integer to float type. 297 298 .. op:: OP_FCVTF 299 Conversion between float types. 300 301 Ternary ops 302 ----------- 303 .. op:: OP_SEL 304 * .src1: condition, must be of integral type 305 * .src2, .src3: operands (types must be compatible with .target) 306 * .target: result of the operation 307 * .type: type of .target 308 309 .. op:: OP_RANGE 310 Range/bounds checking (only used for an unused sparse extension). 311 312 * .src1: value to be checked 313 * .src2, src3: bound of the value (must be constants?) 314 * .type: type of .src[123]? 315 316 Memory ops 317 ---------- 318 .. op:: OP_LOAD 319 Load. 320 321 * .src: base address to load from 322 * .offset: address offset 323 * .target: loaded value 324 * .type: type of .target 325 326 .. op:: OP_STORE 327 Store. 328 329 * .src: base address to store to 330 * .offset: address offset 331 * .target: value to be stored 332 * .type: type of .target 333 334 Others 335 ------ 336 .. op:: OP_SETFVAL 337 Create a pseudo corresponding to a floating-point literal. 338 339 * .fvalue: the literal's value (long double) 340 * .target: the corresponding pseudo 341 * .type: type of the literal & .target 342 343 .. op:: OP_SETVAL 344 Create a pseudo corresponding to a string literal or a label-as-value. 345 The value is given as an expression EXPR_STRING or EXPR_LABEL. 346 347 * .val: (expression) input expression 348 * .target: the resulting value 349 * .type: type of .target, the value 350 351 .. op:: OP_PHI 352 Phi-node (for SSA form). 353 354 * .phi_list: phi-operands (type must be compatible with .target) 355 * .target: "result" 356 * .type: type of .target 357 358 .. op:: OP_PHISOURCE 359 Phi-node source. 360 Like OP_COPY but exclusively used to give a defining instructions 361 (and thus also a type) to *all* OP_PHI operands. 362 363 * .phi_src: operand (type must be compatible with .target, alias .src) 364 * .target: the "result" PSEUDO_PHI 365 * .type: type of .target 366 * .phi_users: list of phi instructions using the target pseudo 367 368 .. op:: OP_CALL 369 Function call. 370 371 * .func: (pseudo_t) the function (can be a symbol or a "register", 372 alias .src)) 373 * .arguments: (pseudo_list) list of the associated arguments 374 * .target: function return value (if any) 375 * .type: type of .target 376 * .fntypes: (symbol_list) list of the function's types: the first 377 entry is the full function type, the next ones are the type of 378 each arguments 379 380 .. op:: OP_INLINED_CALL 381 Only used as an annotation to show that the instructions just above 382 correspond to a function that have been inlined. 383 384 * .func: (pseudo_t) the function (must be a symbol, alias .src)) 385 * .arguments: list of pseudos that where the function's arguments 386 * .target: function return value (if any) 387 * .type: type of .target 388 389 .. op:: OP_SLICE 390 Extract a "slice" from an aggregate. 391 392 * .base: (pseudo_t) aggregate (alias .src) 393 * .from, .len: offet & size of the "slice" within the aggregate 394 * .target: result 395 * .type: type of .target 396 397 .. op:: OP_ASM 398 Inlined assembly code. 399 400 * .string: asm template 401 * .asm_rules: asm constraints, rules 402 403 Sparse tagging (line numbers, context, whatever) 404 ------------------------------------------------ 405 .. op:: OP_CONTEXT 406 Currently only used for lock/unlock tracking. 407 408 * .context_expr: unused 409 * .increment: (1 for locking, -1 for unlocking) 410 * .check: (ignore the instruction if 0) 411 412 Misc ops 413 -------- 414 .. op:: OP_ENTRY 415 Function entry point (no associated semantic). 416 417 .. op:: OP_BADOP 418 Invalid operation (should never be generated). 419 420 .. op:: OP_NOP 421 No-op (should never be generated). 422 423 .. op:: OP_DEATHNOTE 424 Annotation telling the pseudo will be death after the next 425 instruction (other than some other annotation, that is). 426 427 .. # vim: tabstop=4