diff options
-rw-r--r-- | Changelog | 4 | ||||
-rw-r--r-- | arm/TargetPrinter.ml | 9 |
2 files changed, 7 insertions, 6 deletions
@@ -1,3 +1,7 @@ +Code generation and optimization: +- ARM in Thumb mode: simpler instruction sequence for branch through jump table. + +Bug fixing: - Issue #P25: make sure sizeof(long double) = sizeof(double) in all contexts. diff --git a/arm/TargetPrinter.ml b/arm/TargetPrinter.ml index 1dfe8af6..b95a600b 100644 --- a/arm/TargetPrinter.ml +++ b/arm/TargetPrinter.ml @@ -705,15 +705,12 @@ struct (neg_condition_name cond) ireg r1 shift_op ifnot; 2 | Pbtbl(r, tbl) -> if !Clflags.option_mthumb then begin - let lbl = new_label() in - fprintf oc " adr r14, .L%d\n" lbl; - fprintf oc " add r14, r14, %a, lsl #2\n" ireg r; - fprintf oc " mov pc, r14\n"; - fprintf oc ".L%d:\n" lbl; + fprintf oc " lsl r14, %a, #2\n" ireg r; + fprintf oc " add pc, r14\n"; List.iter (fun l -> fprintf oc " b.w %a\n" print_label l) tbl; - 3 + List.length tbl + 2 + List.length tbl end else begin fprintf oc " add pc, pc, %a, lsl #2\n" ireg r; fprintf oc " nop\n"; |