From 6259d4ee6c06cc6ae4ce07484b75f7d327a6a52a Mon Sep 17 00:00:00 2001
From: johannst <johannes.stoelp@gmail.com>
Date: Thu, 19 Mar 2020 22:14:18 +0100
Subject: added gcc

---
 src/SUMMARY.md |  1 +
 src/gcc.md     | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 59 insertions(+)
 create mode 100644 src/gcc.md

(limited to 'src')

diff --git a/src/SUMMARY.md b/src/SUMMARY.md
index 45c07b5..80aced1 100644
--- a/src/SUMMARY.md
+++ b/src/SUMMARY.md
@@ -24,3 +24,4 @@
 - [c++filt](./c++filt.md)
 - [c++](./c++.md)
 - [glibc](./glibc.md)
+- [gcc](./gcc.md)
diff --git a/src/gcc.md b/src/gcc.md
new file mode 100644
index 0000000..1381242
--- /dev/null
+++ b/src/gcc.md
@@ -0,0 +1,58 @@
+# gcc(1)
+
+## CLI
+
+### Preprocessing
+While debugging can be helpful to just pre-process files.
+
+```bash
+gcc -E [-dM] ...
+```
+- `-E` run only preprocessor
+- `-dM` list only `#define` statements
+
+## [Builtins][builtins]
+
+### `__builtin_expect(expr, cond)`
+Give the compiler a hint which branch is hot, so it can lay out the code
+accordingly to reduce number of jump instructions.
+See on [compiler explorer](https://godbolt.org/z/MbTHAP).
+
+```bash
+echo "
+extern void foo();
+extern void bar();
+void run0(int x) {
+  if (__builtin_expect(x,0)) { foo(); }
+  else { bar(); }
+}
+void run1(int x) {
+  if (__builtin_expect(x,1)) { foo(); }
+  else { bar(); }
+}
+" | gcc -O2 -S -masm=intel -o /dev/stdout -xc -
+```
+
+Will generate something similar to the following.
+- `run0`: `bar` is on the path without branch
+- `run1`: `foo` is on the path without branch
+```c
+run0:
+        test    edi, edi
+        jne     .L4
+        xor     eax, eax
+        jmp     bar
+.L4:
+        xor     eax, eax
+        jmp     foo
+run1:
+        test    edi, edi
+        je      .L6
+        xor     eax, eax
+        jmp     foo
+.L6:
+        xor     eax, eax
+        jmp     bar
+```
+
+[builtins]: https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html
-- 
cgit v1.2.3