diff options
author | Xavier Leroy <xavier.leroy@inria.fr> | 2017-08-22 15:52:58 +0200 |
---|---|---|
committer | Xavier Leroy <xavier.leroy@inria.fr> | 2017-08-22 15:52:58 +0200 |
commit | 0f41d864e06409a55976b3a69ab5deb127def42a (patch) | |
tree | 7be676abd934942548ca157e6d0e26e403b6a666 /arm | |
parent | 1cadd89587d5939d3b53b089502cd179ca232e3e (diff) | |
download | compcert-0f41d864e06409a55976b3a69ab5deb127def42a.tar.gz compcert-0f41d864e06409a55976b3a69ab5deb127def42a.zip |
ARM in Thumb mode: simpler instruction sequence for Pbtbl pseudo
It is also easier to recognize than the old one for binary analysis tools.
Diffstat (limited to 'arm')
-rw-r--r-- | arm/TargetPrinter.ml | 9 |
1 files changed, 3 insertions, 6 deletions
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"; |