When the branch target is known, gas should reject values that overflow the range of a *signed* value. That is, code such as .text braw loopend .REPT 20000 nop .ENDR loopend: should give an error. Instead, an (incorrect) negative value is written. Note that ld gives a warning at least, if the target is not known and defined in some other compilation unit (relocation truncated to fit: DISP16 against symbol `loopend')