IF / ELSE / ELSEIF / END IF
Syntax
Syntax: IF condition THEN stmts [ELSEIF cond THEN stmts] [ELSE stmts] END IF
Source: pb_cg_emit_condition_false_jump (pb_codegen.c:305)
Description
Conditionally executes blocks of code based on a boolean or comparison expression. The IF statement is the primary branching construct. The compiler evaluates the condition and generates a conditional jump to skip the THEN block when the condition is false. ELSEIF chains multiple conditions efficiently, and ELSE provides a default path. Supports both integer and floating-point comparisons with all standard relational operators.
Parameters
| Parameter | Description |
condition | A comparison (x < 10) or boolean expression. Non-zero evaluates as TRUE, zero as FALSE. |
THEN | Introduces the block executed when the condition is true. Can be followed by a single statement on the same line or a multi-line block. |
ELSEIF condition THEN | Tests an additional condition if all previous conditions were false. Multiple ELSEIF blocks are allowed. |
ELSE | Optional block executed when no condition is true. |
END IF | Terminates the IF block. Required for multi-line IF statements. |
Example
FUNCTION PBMAIN() AS LONG
LOCAL score AS LONG
score = 85
IF score >= 90 THEN
PRINT "Grade: A"
ELSEIF score >= 80 THEN
PRINT "Grade: B"
ELSEIF score >= 70 THEN
PRINT "Grade: C"
ELSE
PRINT "Grade: F"
END IF
FUNCTION = 0
END FUNCTION
Generated Assembly - Integer Comparison
; Evaluate left expression -> RAX, save to temp
; Evaluate right expression -> RAX
mov r10, rax
mov rax, [rbp - left_offset] ; reload left
cmp rax, r10 ; compare left, right
je __pb_else_N ; jump to else if condition FALSE
; ... THEN body ...
jmp __pb_endif_N
__pb_else_N:
; ... ELSE body ...
__pb_endif_N:
Integer Jump Mappings
| Operator | Jump to ELSE (condition FALSE) | Meaning |
= (EQ) | jne | Jump if not equal |
<> (NE) | je | Jump if equal |
< (LT) | jge | Jump if greater or equal |
<= (LE) | jg | Jump if greater |
> (GT) | jle | Jump if less or equal |
>= (GE) | jl | Jump if less |
Float Comparison
; Evaluate left -> XMM0, save to [rbp - temp]
movsd xmm1, [rbp - temp] ; reload left
ucomisd xmm1, xmm0 ; unordered compare
ja __pb_else_N ; jump based on flags
Float Jump Mappings
| Operator | Jump to ELSE |
= | jne |
<> | je |
< | jae |
<= | ja |
> | jbe |
>= | jb |
Boolean Truthiness Test
; Evaluate expression -> RAX (0 = false, non-0 = true)
test rax, rax
je __pb_else_N ; jump if 0 (false)
ELSEIF Expansion
; IF a THEN -> cmp + jne __pb_elseif1_N
; ELSEIF b THEN -> __pb_elseif1_N: cmp + jne __pb_else_N
; ELSE -> __pb_else_N:
; END IF -> __pb_endif_N: