diff --git a/.vscode/launch.json b/.vscode/launch.json index dd5712aaa74f417d8f1129ab96732ac4423bdb3a..1d1e8e6eefab7d928121b7967dcbc58d0c04f139 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -9,12 +9,12 @@ "request": "attach", "name": "Debug hello", "gdbpath": "/usr/bin/arm-none-eabi-gdb", + "executable": "./target/thumbv7em-none-eabihf/debug/examples/hello", "target": ":3333", "remote": true, "autorun": [ "monitor reset halt", "monitor arm semihosting enable", - "file ./target/thumbv7em-none-eabihf/debug/examples/hello", "load" ], "cwd": "${workspaceRoot}" @@ -39,14 +39,14 @@ "request": "attach", "name": "Debug itm", "gdbpath": "/usr/bin/arm-none-eabi-gdb", + "executable": "./target/thumbv7em-none-eabihf/debug/examples/itm", "target": ":3333", "remote": true, "autorun": [ "monitor reset halt", "monitor arm semihosting enable", - "monitor tpiu config external uart off 8000000 2000000", + "monitor tpiu config internal /tmp/itm.log uart off 16000000 2000000", "monitor itm port 0 on", - "file ./target/thumbv7em-none-eabihf/debug/examples/itm", "load" ], "cwd": "${workspaceRoot}" @@ -81,6 +81,21 @@ ], "cwd": "${workspaceRoot}" }, + { + "type": "gdb", + "request": "attach", + "name": "Debug usart_clk --release", + "gdbpath": "/usr/bin/arm-none-eabi-gdb", + "target": ":3333", + "remote": true, + "autorun": [ + "monitor reset init", + "monitor arm semihosting enable", + "file ./target/thumbv7em-none-eabihf/release/examples/usart_clk", + "load" + ], + "cwd": "${workspaceRoot}" + }, { "type": "gdb", "request": "attach", diff --git a/.vscode/tasks.json b/.vscode/tasks.json index bb7e1ab1766fe45ea74e7e4fba358a33300428cb..670bf65085e63783834d24f570fd4cd098a18d8d 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -7,6 +7,10 @@ "taskName": "xargo build --example hello --release", "type": "shell", "command": "xargo build --example hello --release", + "group": { + "kind": "build", + "isDefault": true + }, "problemMatcher": [ "$rustc" ] @@ -15,6 +19,10 @@ "taskName": "xargo build --example hello", "type": "shell", "command": "xargo build --example hello", + "group": { + "kind": "build", + "isDefault": true + }, "problemMatcher": [ "$rustc" ] @@ -23,6 +31,10 @@ "taskName": "xargo build --example gpio", "type": "shell", "command": "xargo build --example gpio", + "group": { + "kind": "build", + "isDefault": true + }, "problemMatcher": [ "$rustc" ] @@ -31,6 +43,10 @@ "taskName": "xargo build --example usart1", "type": "shell", "command": "xargo build --example usart1", + "group": { + "kind": "build", + "isDefault": true + }, "problemMatcher": [ "$rustc" ] @@ -47,10 +63,26 @@ "$rustc" ] }, + { + "taskName": "xargo build --example usart_clk --release", + "type": "shell", + "command": "xargo build --example usart_clk --release", + "group": { + "kind": "build", + "isDefault": true + }, + "problemMatcher": [ + "$rustc" + ] + }, { "taskName": "xargo build --example itm", "type": "shell", "command": "xargo build --example itm", + "group": { + "kind": "build", + "isDefault": true + }, "problemMatcher": [ "$rustc" ] @@ -59,6 +91,10 @@ "taskName": "xargo build --example ble_hid", "type": "shell", "command": "xargo build --example ble_hid", + "group": { + "kind": "build", + "isDefault": true + }, "problemMatcher": [ "$rustc" ] diff --git a/checkstack.pl b/checkstack.pl new file mode 100755 index 0000000000000000000000000000000000000000..d11094553f022e37a7f254ec69c42eee2ccdce75 --- /dev/null +++ b/checkstack.pl @@ -0,0 +1,154 @@ +#!/usr/bin/perl + +# Stolen from Linux kernel :) +# borrowed from busybox and modified by: +# Maciek Borzecki <maciek.borzecki@gmail.com> + +# Check the stack usage of functions +# +# Copyright Joern Engel <joern@wh.fh-wedel.de> +# Inspired by Linus Torvalds +# Original idea maybe from Keith Owens +# s390 port and big speedup by Arnd Bergmann <arnd@bergmann-dalldorf.de> +# Mips port by Juan Quintela <quintela@mandrakesoft.com> +# IA64 port via Andreas Dilger +# Arm port by Holger Schurig +# sh64 port by Paul Mundt +# Random bits by Matt Mackall <mpm@selenic.com> +# M68k port by Geert Uytterhoeven and Andreas Schwab +# +# Usage: +# objdump -d vmlinux | checkstack.pl [arch] [threshold] +# +# TODO : Port to all architectures (one regex per arch) + +# modifications to version from busybox: +# 1. fix regex for ARM sp, Rd may not be included +# 2. add threshold parameter + +# check for arch +# +# $re is used for two matches: +# $& (whole re) matches the complete objdump line with the stack growth +# $1 (first bracket) matches the size of the stack growth +# +# use anything else and feel the pain ;) +my (@stack, $re, $x, $xs, $thresh); +{ + my $arch = shift; + if ($arch eq "") { + $arch = `uname -m`; + } + + $thresh = shift; + if ($thresh eq "") { + $thresh = 100; + } + + $x = "[0-9a-f]"; # hex character + $xs = "[0-9a-f ]"; # hex character or space + if ($arch eq 'arm') { + #c0008ffc: e24dd064 sub sp, sp, #100 ; 0x64 + # or without Rd + #800362e: b082 sub sp, #8 + $re = qr/.*sub.*(?:sp, )?sp, #([0-9]+)/o; + } elsif ($arch eq 'blackfin') { + # 52: 00 e8 03 00 LINK 0xc; + $re = qr/.*LINK (0x$x{1,5});$/o; + } elsif ($arch =~ /^i[3456]86$/) { + #c0105234: 81 ec ac 05 00 00 sub $0x5ac,%esp + $re = qr/^.*[as][du][db] \$(0x$x{1,8}),\%esp$/o; + } elsif ($arch eq 'x86_64') { + # 2f60: 48 81 ec e8 05 00 00 sub $0x5e8,%rsp + $re = qr/^.*[as][du][db] \$(0x$x{1,8}),\%rsp$/o; + } elsif ($arch eq 'ia64') { + #e0000000044011fc: 01 0f fc 8c adds r12=-384,r12 + $re = qr/.*adds.*r12=-(([0-9]{2}|[3-9])[0-9]{2}),r12/o; + } elsif ($arch eq 'm68k') { + # 2b6c: 4e56 fb70 linkw %fp,#-1168 + # 1df770: defc ffe4 addaw #-28,%sp + $re = qr/.*(?:linkw %fp,|addaw )#-([0-9]{1,4})(?:,%sp)?$/o; + } elsif ($arch eq 'mips64') { + #8800402c: 67bdfff0 daddiu sp,sp,-16 + $re = qr/.*daddiu.*sp,sp,-(([0-9]{2}|[3-9])[0-9]{2})/o; + } elsif ($arch eq 'mips') { + #88003254: 27bdffe0 addiu sp,sp,-32 + $re = qr/.*addiu.*sp,sp,-(([0-9]{2}|[3-9])[0-9]{2})/o; + } elsif ($arch eq 'ppc') { + #c00029f4: 94 21 ff 30 stwu r1,-208(r1) + $re = qr/.*stwu.*r1,-($x{1,8})\(r1\)/o; + } elsif ($arch eq 'ppc64') { + #XXX + $re = qr/.*stdu.*r1,-($x{1,8})\(r1\)/o; + } elsif ($arch eq 'powerpc') { + $re = qr/.*st[dw]u.*r1,-($x{1,8})\(r1\)/o; + } elsif ($arch =~ /^s390x?$/) { + # 11160: a7 fb ff 60 aghi %r15,-160 + $re = qr/.*ag?hi.*\%r15,-(([0-9]{2}|[3-9])[0-9]{2})/o; + } elsif ($arch =~ /^sh64$/) { + #XXX: we only check for the immediate case presently, + # though we will want to check for the movi/sub + # pair for larger users. -- PFM. + #a00048e0: d4fc40f0 addi.l r15,-240,r15 + $re = qr/.*addi\.l.*r15,-(([0-9]{2}|[3-9])[0-9]{2}),r15/o; + } else { + print("wrong or unknown architecture\n"); + exit + } +} + +sub bysize($) { + my ($asize, $bsize); + ($asize = $a) =~ s/.*: *(.*)$/$1/; + ($bsize = $b) =~ s/.*: *(.*)$/$1/; + $bsize <=> $asize +} + +# +# main() +# +my $funcre = qr/^$x* <(.*)>:$/; +my $func; +my $file, $lastslash; + +while (my $line = <STDIN>) { + if ($line =~ m/$funcre/) { + $func = $1; + } + elsif ($line =~ m/(.*):\s*file format/) { + $file = $1; + $file =~ s/\.ko//; + $lastslash = rindex($file, "/"); + if ($lastslash != -1) { + $file = substr($file, $lastslash + 1); + } + } + elsif ($line =~ m/$re/) { + my $size = $1; + $size = hex($size) if ($size =~ /^0x/); + + if ($size > 0xf0000000) { + $size = - $size; + $size += 0x80000000; + $size += 0x80000000; + } + next if ($size > 0x10000000); + + next if $line !~ m/^($xs*)/; + my $addr = $1; + $addr =~ s/ /0/g; + $addr = "0x$addr"; + + # bbox: was: my $intro = "$addr $func [$file]:"; + my $intro = "$func [$file]:"; + my $padlen = 56 - length($intro); + while ($padlen > 0) { + $intro .= ' '; + $padlen -= 8; + } + next if ($size < $thresh); + push @stack, "$intro$size\n"; + } +} + +print sort bysize @stack; \ No newline at end of file diff --git a/examples/ble_hid.rs b/examples/ble_hid.rs index dad30a573d2da5851fabed138a9dc8fb8f6e757f..f1b4493b61c00aad0310ebe2dab9f6dbff940e28 100644 --- a/examples/ble_hid.rs +++ b/examples/ble_hid.rs @@ -23,8 +23,8 @@ fn init(p: init::Peripherals) { p.DWT.cyccnt.write(0); } - p.FLASH.acr.reset(); //////////latency().write().bits(2); - p.FLASH.acr.modify(|_, w| unsafe {w.latency().bits(2)} ); //////////latency().write().bits(2); + //p.FLASH.acr.reset(); + p.FLASH.acr.modify(|_, w| unsafe { w.latency().bits(2) }); //modify(|_, w | w.latency().set_bits(2)); println!("Init! {:x}", p.FLASH.acr.read().latency().bits()); @@ -36,52 +36,43 @@ fn init(p: init::Peripherals) { // PP PLLN PLLM //rcc().pllcfgr.write(|w| w.bits(0b0000 0000 0000 00 01 0 101010000 010000)); - - - rtfm::bkpt(); - p.RCC.cfgr.modify(|_, w| w.sw0().clear_bit()); //Switch to HSI - p.RCC.cfgr.modify(|_, w| w.sw1().clear_bit()); //Switch to HSI - rtfm::bkpt(); - p.RCC.cfgr.modify(|_, w| unsafe { w.ppre1().bits(4) }); //Configure apb1 prescaler = 2 - p.RCC.apb1enr.modify(|_, w| w.pwren().set_bit()); - p.RCC.cr.write(|w| w.pllon().clear_bit()); //Enable PLL - p.RCC - .pllcfgr - .write(|w| unsafe { w.bits(0b00000000000000010101010000010000) }); //Configure PLL - - p.RCC.cr.modify(|_, w| w.pllon().set_bit()); //Enable PLL - - while p.RCC.cr.read().pllrdy().bit_is_clear() {} - - p.RCC.cfgr.modify(|_, w| w.sw0().clear_bit()); //Switch to PLL - rtfm::bkpt(); - p.RCC.cfgr.modify(|_, w| w.sw1().set_bit()); //Switch to PLL - rtfm::bkpt(); - p.RCC.apb2enr.modify(|_, w| w.syscfgen().set_bit()); - rtfm::bkpt(); - - p.RCC.ahb1enr.modify(|_, w| w.gpioaen().set_bit()); //Enable GPIOA clock - p.RCC.ahb1enr.modify(|_, w| w.gpioben().set_bit()); //Enable GPIOB clock - - //////////////////////////////////////////////////////////////////////////////////////////////// - // USART2 stuff - //////////////////////////////////////////////////////////////////////////////////////////////// - - rtfm::bkpt(); - USART::initialize(p.GPIOA, p.RCC, p.USART2); - USART::send(p.USART2, "\n\n\nUSART initialized\n\r"); - //////////////////////////////////////////////////////////////////////////////////////////////// - - //spi.initialize(); - //i2c.initialize(); - + + + p.RCC.cfgr.modify(|_, w| w.sw0().clear_bit()); //Switch to HSI + p.RCC.cfgr.modify(|_, w| w.sw1().clear_bit()); //Switch to HSI + p.RCC.cfgr.modify(|_, w| unsafe { w.ppre1().bits(4) }); //Configure apb1 prescaler = 2 + p.RCC.apb1enr.modify(|_, w| w.pwren().set_bit()); + p.RCC.cr.write(|w| w.pllon().clear_bit()); //Enable PLL + p.RCC + .pllcfgr + .write(|w| unsafe { w.bits(0b00000000000000010101010000010000) }); //Configure PLL + + p.RCC.cr.modify(|_, w| w.pllon().set_bit()); //Enable PLL + + while p.RCC.cr.read().pllrdy().bit_is_clear() {} + + p.RCC.cfgr.modify(|_, w| w.sw0().clear_bit()); //Switch to PLL + p.RCC.cfgr.modify(|_, w| w.sw1().set_bit()); //Switch to PLL + p.RCC.apb2enr.modify(|_, w| w.syscfgen().set_bit()); + + p.RCC.ahb1enr.modify(|_, w| w.gpioaen().set_bit()); //Enable GPIOA clock + p.RCC.ahb1enr.modify(|_, w| w.gpioben().set_bit()); //Enable GPIOB clock + + //////////////////////////////////////////////////////////////////////////////////////////////// + // USART2 stuff + //////////////////////////////////////////////////////////////////////////////////////////////// + + USART::initialize(p.GPIOA, p.RCC, p.USART2); + USART::send(p.USART2, "\n\n\nUSART initialized\n\r"); + //////////////////////////////////////////////////////////////////////////////////////////////// + + //spi.initialize(); + //i2c.initialize(); } fn idle() -> ! { rtfm::bkpt(); - rtfm::bkpt(); - println!("Hello, world!"); rtfm::bkpt(); diff --git a/examples/hello.rs b/examples/hello.rs index 9ea315ab424d54478b13bd86949df54a397a3872..da24e2e37401305f5f239a6fa06f5b5d6404407f 100644 --- a/examples/hello.rs +++ b/examples/hello.rs @@ -17,7 +17,8 @@ app! { fn init(_p: init::Peripherals) {} fn idle() -> ! { - println!("Hello, world!"); + let f = 1.0; + println!("Hello, world! {}", f); rtfm::bkpt(); loop { diff --git a/examples/itm.rs b/examples/itm.rs index 503ed097f04f411ac55eb590e5bb245bd29394d0..c6fd5aa27b52a92b013a30f2419593437b156fbe 100644 --- a/examples/itm.rs +++ b/examples/itm.rs @@ -3,7 +3,7 @@ //! You'll need to run these lines in your GDB session //! //! ``` text -//! > monitor tpiu config external uart off 8000000 2000000 +//! > monitor tpiu config internal /tmp/itm.log uart off 16000000 2000000 //! > monitor itm port 0 on //! ``` //! @@ -14,7 +14,7 @@ //! file. //! //! ``` console -//! $ cat /dev/ttyUSB0 +//! $ itmdump /tmp/itm.log //! Hello //! World //! ``` diff --git a/examples/usart1.rs b/examples/usart1.rs index 0ea9954b2b2b59fe6414fdb7e6c28e8f75653246..3b921b7679750abaa6579c5b5e6da1303cbd879e 100644 --- a/examples/usart1.rs +++ b/examples/usart1.rs @@ -9,10 +9,11 @@ //! info on pin header CN3 (TX/RX), howto use //#![deny(unsafe_code)] #![deny(warnings)] -//#![allow(warnings)] +#![allow(warnings)] #![feature(proc_macro)] #![no_std] + extern crate cortex_m_rtfm as rtfm; extern crate cortex_m_semihosting as semihosting; #[macro_use] @@ -106,9 +107,11 @@ fn init(p: init::Peripherals) { .clear_bit() }); + write(p.USART2, 'A' as u8).unwrap(); loop { let b = block!(read(p.USART2)).unwrap(); - write(p.USART2, b).unwrap(); + block!(write(p.USART2, b)).unwrap(); + // block!(write(p.USART2, ',' as u8)).unwrap(); } } @@ -130,9 +133,7 @@ pub enum Error { fn write(usart2: &USART2, byte: u8) -> Result<()> { let sr = usart2.sr.read(); - if sr.ore().bit_is_set() { - Err(nb::Error::Other(Error::Overrun)) - } else if sr.nf().bit_is_set() { + if sr.nf().bit_is_set() { Err(nb::Error::Other(Error::Noise)) } else if sr.fe().bit_is_set() { Err(nb::Error::Other(Error::Framing)) diff --git a/examples/usart3.rs b/examples/usart3.rs deleted file mode 100644 index 6dd8e9635520f1731025616ecaa42a9ac9aa3512..0000000000000000000000000000000000000000 --- a/examples/usart3.rs +++ /dev/null @@ -1,57 +0,0 @@ -//! Test the USART3 instance -//! -//! Connect the TX and RX pins to run this test - -#![deny(unsafe_code)] -#![deny(warnings)] -#![feature(proc_macro)] -#![no_std] - -extern crate blue_pill; -extern crate cortex_m_rtfm as rtfm; -extern crate nb; - -use blue_pill::Serial; -use blue_pill::prelude::*; -use blue_pill::time::Hertz; -use nb::Error; -use rtfm::app; - -const BAUD_RATE: Hertz = Hertz(115_200); - -app! { - device: blue_pill::stm32f103xx, -} - -fn init(p: init::Peripherals) { - let serial = Serial(p.USART3); - - serial.init(BAUD_RATE.invert(), p.AFIO, None, p.GPIOB, p.RCC); - - const BYTE: u8 = b'A'; - - assert!(serial.write(BYTE).is_ok()); - - for _ in 0..1_000 { - match serial.read() { - Ok(byte) => { - assert_eq!(byte, BYTE); - return; - } - Err(Error::Other(e)) => panic!("{:?}", e), - Err(Error::WouldBlock) => continue, - } - } - - panic!("Timeout") -} - -fn idle() -> ! { - // OK - rtfm::bkpt(); - - // Sleep - loop { - rtfm::wfi(); - } -} diff --git a/examples/usart_clk.rs b/examples/usart_clk.rs index ed907a2059e72d132fee5e723cf9a3eb2fdfd145..fb88eee69af8470eb5203f7a910e9fcb259a88af 100644 --- a/examples/usart_clk.rs +++ b/examples/usart_clk.rs @@ -103,6 +103,7 @@ fn clk_init(p: &init::Peripherals) { // RM0368 8.4.1 (register), 3.4 Table 6 // we assume 3.3 volt operation, thus 2 cycles for 84mHz // apb1 will be at 42 MHz + ::apb1::set_frequency(42_000_000); p.FLASH.acr.modify(|_, w| unsafe { w.latency().bits(2) }); println!("Flash latency! {:x}", p.FLASH.acr.read().latency().bits()); @@ -140,7 +141,7 @@ fn clk_init(p: &init::Peripherals) { #[inline(never)] fn init(p: init::Peripherals) { println!("Init!"); - // clk_init(&p); + clk_init(&p); serial_init(&p); //USART::initialize(p.GPIOA, p.RCC, p.USART2); diff --git a/examples/usart2.rs b/examples/usart_jap_original.rs similarity index 100% rename from examples/usart2.rs rename to examples/usart_jap_original.rs diff --git a/objdump.out b/objdump.out new file mode 100644 index 0000000000000000000000000000000000000000..e888bbb895211aa23b2c5116cf0ba85f1fef2aea --- /dev/null +++ b/objdump.out @@ -0,0 +1,7639 @@ + +target/thumbv7em-none-eabihf/release/examples/hello: file format elf32-littlearm + + +Disassembly of section .text: + +08000188 <cortex_m_rt::reset_handler>: +/// - `sbss` and `ebss` must be `T` aligned. +pub unsafe fn zero_bss<T>(mut sbss: *mut T, ebss: *mut T) +where + T: Copy, +{ + while sbss < ebss { + 8000188: f240 0000 movw r0, #0 + 800018c: f240 0100 movw r1, #0 + 8000190: f2c2 0000 movt r0, #8192 ; 0x2000 + 8000194: f2c2 0100 movt r1, #8192 ; 0x2000 + 8000198: 4281 cmp r1, r0 + 800019a: d208 bcs.n 80001ae <cortex_m_rt::reset_handler+0x26> + 800019c: f240 0100 movw r1, #0 + 80001a0: 2200 movs r2, #0 + 80001a2: f2c2 0100 movt r1, #8192 ; 0x2000 +/// } +/// ``` +#[inline] +#[stable(feature = "volatile", since = "1.9.0")] +pub unsafe fn write_volatile<T>(dst: *mut T, src: T) { + intrinsics::volatile_store(dst, src); + 80001a6: f841 2b04 str.w r2, [r1], #4 + 80001aa: 4281 cmp r1, r0 + 80001ac: d3fb bcc.n 80001a6 <cortex_m_rt::reset_handler+0x1e> + while sdata < edata { + 80001ae: f240 0000 movw r0, #0 + 80001b2: f240 0100 movw r1, #0 + 80001b6: f2c2 0000 movt r0, #8192 ; 0x2000 + 80001ba: f2c2 0100 movt r1, #8192 ; 0x2000 + 80001be: 4281 cmp r1, r0 + 80001c0: d20d bcs.n 80001de <cortex_m_rt::reset_handler+0x56> + 80001c2: f240 0100 movw r1, #0 + 80001c6: f644 32f8 movw r2, #19448 ; 0x4bf8 + 80001ca: f2c2 0100 movt r1, #8192 ; 0x2000 + 80001ce: f6c0 0200 movt r2, #2048 ; 0x800 + 80001d2: f852 3b04 ldr.w r3, [r2], #4 + intrinsics::move_val_init(&mut *dst, src) + 80001d6: f841 3b04 str.w r3, [r1], #4 + 80001da: 4281 cmp r1, r0 + 80001dc: d3f9 bcc.n 80001d2 <cortex_m_rt::reset_handler+0x4a> + 80001de: b580 push {r7, lr} + 80001e0: 466f mov r7, sp + 80001e2: f64e 5088 movw r0, #60808 ; 0xed88 + 80001e6: f2ce 0000 movt r0, #57344 ; 0xe000 + intrinsics::volatile_load(src) + 80001ea: 6801 ldr r1, [r0, #0] + let mut cpacr = self.cpacr.read() & !SCB_CPACR_FPU_MASK; + match mode { + FpuAccessMode::Disabled => (), + FpuAccessMode::Privileged => cpacr |= SCB_CPACR_FPU_ENABLE, + FpuAccessMode::Enabled => { + cpacr |= SCB_CPACR_FPU_ENABLE | SCB_CPACR_FPU_USER + 80001ec: f441 0170 orr.w r1, r1, #15728640 ; 0xf00000 + intrinsics::volatile_store(dst, src); + 80001f0: 6001 str r1, [r0, #0] + unsafe { + ::main(0, ::core::ptr::null()); + } + } + + main() + 80001f2: f000 f907 bl 8000404 <cortex_m_rt::reset_handler::main> + 80001f6: e8bd 4080 ldmia.w sp!, {r7, lr} + } + + // If `main` returns, then we go into "reactive" mode and simply attend + // interrupts as they occur. + loop { + asm!("wfi" :::: "volatile"); + 80001fa: bf30 wfi + loop { + 80001fc: e7fd b.n 80001fa <cortex_m_rt::reset_handler+0x72> + ... + +08000200 <ADC>: + 8000200: f000 b8fc b.w 80003fc <BUS_FAULT> + +08000204 <core::ptr::drop_in_place>: +pub unsafe fn drop_in_place<T: ?Sized>(to_drop: *mut T) { + 8000204: 4770 bx lr + +08000206 <core::result::unwrap_failed>: +} + +// This is a separate function to reduce the code size of the methods +#[inline(never)] +#[cold] +fn unwrap_failed<E: fmt::Debug>(msg: &str, error: E) -> ! { + 8000206: b580 push {r7, lr} + 8000208: 466f mov r7, sp + ); + ($msg:expr) => ({ + $crate::panicking::panic(&($msg, file!(), line!(), __rust_unstable_column!())) + }); + ($fmt:expr, $($arg:tt)*) => ({ + $crate::panicking::panic_fmt(format_args!($fmt, $($arg)*), + 800020a: f000 fa81 bl 8000710 <core::panicking::panic_fmt> + +0800020e <core::result::unwrap_failed>: + 800020e: b580 push {r7, lr} + 8000210: 466f mov r7, sp + 8000212: f000 fa7d bl 8000710 <core::panicking::panic_fmt> + +08000216 <<core::fmt::Write::write_fmt::Adapter<'a, T> as core::fmt::Write>::write_char>: + { + fn write_str(&mut self, s: &str) -> Result { + self.0.write_str(s) + } + + fn write_char(&mut self, c: char) -> Result { + 8000216: b580 push {r7, lr} + 8000218: 466f mov r7, sp + 800021a: b084 sub sp, #16 + self.0.write_char(c) + 800021c: 6800 ldr r0, [r0, #0] + 800021e: 2200 movs r2, #0 + #[inline] + fn encode_utf8(self, dst: &mut [u8]) -> &mut str { + let code = self as u32; + unsafe { + let len = + if code < MAX_ONE_B && !dst.is_empty() { + 8000220: 297f cmp r1, #127 ; 0x7f + self.write_str(c.encode_utf8(&mut [0; 4])) + 8000222: 9200 str r2, [sp, #0] + 8000224: d804 bhi.n 8000230 <<core::fmt::Write::write_fmt::Adapter<'a, T> as core::fmt::Write>::write_char+0x1a> + *dst.get_unchecked_mut(0) = code as u8; + 8000226: f88d 1000 strb.w r1, [sp] + 800022a: f04f 0e01 mov.w lr, #1 + 800022e: e03d b.n 80002ac <<core::fmt::Write::write_fmt::Adapter<'a, T> as core::fmt::Write>::write_char+0x96> + 1 + } else if code < MAX_TWO_B && dst.len() >= 2 { + 8000230: ebb2 2fd1 cmp.w r2, r1, lsr #11 + 8000234: d10c bne.n 8000250 <<core::fmt::Write::write_fmt::Adapter<'a, T> as core::fmt::Write>::write_char+0x3a> + *dst.get_unchecked_mut(0) = (code >> 6 & 0x1F) as u8 | TAG_TWO_B; + 8000236: 098a lsrs r2, r1, #6 + 8000238: 2306 movs r3, #6 + 800023a: f04f 0e02 mov.w lr, #2 + 800023e: f363 125f bfi r2, r3, #5, #27 + *dst.get_unchecked_mut(1) = (code & 0x3F) as u8 | TAG_CONT; + 8000242: f36e 119f bfi r1, lr, #6, #26 + *dst.get_unchecked_mut(0) = (code >> 6 & 0x1F) as u8 | TAG_TWO_B; + 8000246: f88d 2000 strb.w r2, [sp] + *dst.get_unchecked_mut(1) = (code & 0x3F) as u8 | TAG_CONT; + 800024a: f88d 1001 strb.w r1, [sp, #1] + 800024e: e02d b.n 80002ac <<core::fmt::Write::write_fmt::Adapter<'a, T> as core::fmt::Write>::write_char+0x96> + 2 + } else if code < MAX_THREE_B && dst.len() >= 3 { + 8000250: 2200 movs r2, #0 + 8000252: ebb2 4f11 cmp.w r2, r1, lsr #16 + 8000256: d112 bne.n 800027e <<core::fmt::Write::write_fmt::Adapter<'a, T> as core::fmt::Write>::write_char+0x68> + *dst.get_unchecked_mut(0) = (code >> 12 & 0x0F) as u8 | TAG_THREE_B; + 8000258: 0b0a lsrs r2, r1, #12 + 800025a: 230e movs r3, #14 + 800025c: f04f 0e03 mov.w lr, #3 + 8000260: f363 121f bfi r2, r3, #4, #28 + 8000264: 2302 movs r3, #2 + 8000266: f88d 2000 strb.w r2, [sp] + *dst.get_unchecked_mut(1) = (code >> 6 & 0x3F) as u8 | TAG_CONT; + 800026a: 098a lsrs r2, r1, #6 + *dst.get_unchecked_mut(2) = (code & 0x3F) as u8 | TAG_CONT; + 800026c: f363 119f bfi r1, r3, #6, #26 + *dst.get_unchecked_mut(1) = (code >> 6 & 0x3F) as u8 | TAG_CONT; + 8000270: f363 129f bfi r2, r3, #6, #26 + 8000274: f88d 2001 strb.w r2, [sp, #1] + *dst.get_unchecked_mut(2) = (code & 0x3F) as u8 | TAG_CONT; + 8000278: f88d 1002 strb.w r1, [sp, #2] + 800027c: e016 b.n 80002ac <<core::fmt::Write::write_fmt::Adapter<'a, T> as core::fmt::Write>::write_char+0x96> + 3 + } else if dst.len() >= 4 { + *dst.get_unchecked_mut(0) = (code >> 18 & 0x07) as u8 | TAG_FOUR_B; + 800027e: 0c8a lsrs r2, r1, #18 + 8000280: 231e movs r3, #30 + 8000282: f04f 0e04 mov.w lr, #4 + 8000286: f363 02df bfi r2, r3, #3, #29 + 800028a: 2302 movs r3, #2 + 800028c: f88d 2000 strb.w r2, [sp] + *dst.get_unchecked_mut(1) = (code >> 12 & 0x3F) as u8 | TAG_CONT; + 8000290: 0b0a lsrs r2, r1, #12 + 8000292: f363 129f bfi r2, r3, #6, #26 + 8000296: f88d 2001 strb.w r2, [sp, #1] + *dst.get_unchecked_mut(2) = (code >> 6 & 0x3F) as u8 | TAG_CONT; + 800029a: 098a lsrs r2, r1, #6 + *dst.get_unchecked_mut(3) = (code & 0x3F) as u8 | TAG_CONT; + 800029c: f363 119f bfi r1, r3, #6, #26 + *dst.get_unchecked_mut(2) = (code >> 6 & 0x3F) as u8 | TAG_CONT; + 80002a0: f363 129f bfi r2, r3, #6, #26 + 80002a4: f88d 2002 strb.w r2, [sp, #2] + *dst.get_unchecked_mut(3) = (code & 0x3F) as u8 | TAG_CONT; + 80002a8: f88d 1003 strb.w r1, [sp, #3] +} + +impl HStdout { + /// Attempts to write an entire `buffer` into this sink + pub fn write_all(&mut self, buffer: &[u8]) -> Result<(), ()> { + write_all(self.fd, buffer) + 80002ac: f8d0 c000 ldr.w ip, [r0] + 80002b0: 4668 mov r0, sp + 80002b2: a901 add r1, sp, #4 + } +} + +fn write_all(fd: usize, mut buffer: &[u8]) -> Result<(), ()> { + while !buffer.is_empty() { + match unsafe { syscall!(WRITE, fd, buffer.as_ptr(), buffer.len()) } { + 80002b4: f8cd c004 str.w ip, [sp, #4] + 80002b8: e9cd 0e02 strd r0, lr, [sp, #8] + +/// Performs a semihosting operation, takes a pointer to an argument block +#[inline(always)] +#[cfg(target_arch = "arm")] +pub unsafe fn syscall<T>(mut nr: usize, arg: &T) -> usize { + asm!("bkpt 0xAB" + 80002bc: 2005 movs r0, #5 + 80002be: beab bkpt 0x00ab + // Done + 0 => return Ok(()), + 80002c0: 2800 cmp r0, #0 + 80002c2: d010 beq.n 80002e6 <<core::fmt::Write::write_fmt::Adapter<'a, T> as core::fmt::Write>::write_char+0xd0> + 80002c4: 466b mov r3, sp + 80002c6: a901 add r1, sp, #4 + 80002c8: 4602 mov r2, r0 + // `n` bytes were not written + n if n <= buffer.len() => { + 80002ca: 4596 cmp lr, r2 + 80002cc: d30e bcc.n 80002ec <<core::fmt::Write::write_fmt::Adapter<'a, T> as core::fmt::Write>::write_char+0xd6> + let offset = (buffer.len() - n) as isize; + 80002ce: ebae 0002 sub.w r0, lr, r2 + match unsafe { syscall!(WRITE, fd, buffer.as_ptr(), buffer.len()) } { + 80002d2: f8cd c004 str.w ip, [sp, #4] + 80002d6: 4696 mov lr, r2 + /// } + /// ``` + #[stable(feature = "rust1", since = "1.0.0")] + #[inline] + pub unsafe fn offset(self, count: isize) -> *const T where T: Sized { + intrinsics::offset(self, count) + 80002d8: 4403 add r3, r0 + 80002da: 2005 movs r0, #5 + 80002dc: e9cd 3202 strd r3, r2, [sp, #8] + 80002e0: beab bkpt 0x00ab + 0 => return Ok(()), + 80002e2: 2800 cmp r0, #0 + 80002e4: d1f0 bne.n 80002c8 <<core::fmt::Write::write_fmt::Adapter<'a, T> as core::fmt::Write>::write_char+0xb2> + 80002e6: 2000 movs r0, #0 + 80002e8: b004 add sp, #16 + 80002ea: bd80 pop {r7, pc} + 80002ec: 2001 movs r0, #1 + } + 80002ee: b004 add sp, #16 + 80002f0: bd80 pop {r7, pc} + +080002f2 <<core::fmt::Write::write_fmt::Adapter<'a, T> as core::fmt::Write>::write_fmt>: + + fn write_fmt(&mut self, args: Arguments) -> Result { + 80002f2: b5f0 push {r4, r5, r6, r7, lr} + 80002f4: af03 add r7, sp, #12 + 80002f6: f84d bd04 str.w fp, [sp, #-4]! + 80002fa: b088 sub sp, #32 + self.0.write_fmt(args) + 80002fc: 6800 ldr r0, [r0, #0] + 80002fe: aa02 add r2, sp, #8 + } + } + + write(&mut Adapter(self), args) + 8000300: 9001 str r0, [sp, #4] + 8000302: 4610 mov r0, r2 + 8000304: e891 5078 ldmia.w r1, {r3, r4, r5, r6, ip, lr} + 8000308: f643 5180 movw r1, #15744 ; 0x3d80 + 800030c: f6c0 0100 movt r1, #2048 ; 0x800 + 8000310: e880 5078 stmia.w r0, {r3, r4, r5, r6, ip, lr} + 8000314: a801 add r0, sp, #4 + 8000316: f000 fcf4 bl 8000d02 <core::fmt::write> + } + 800031a: b008 add sp, #32 + 800031c: f85d bb04 ldr.w fp, [sp], #4 + 8000320: bdf0 pop {r4, r5, r6, r7, pc} + +08000322 <<core::fmt::Write::write_fmt::Adapter<'a, T> as core::fmt::Write>::write_str>: + fn write_str(&mut self, s: &str) -> Result { + 8000322: b580 push {r7, lr} + 8000324: 466f mov r7, sp + 8000326: b083 sub sp, #12 + 8000328: 468e mov lr, r1 + 800032a: b1c2 cbz r2, 800035e <<core::fmt::Write::write_fmt::Adapter<'a, T> as core::fmt::Write>::write_str+0x3c> + self.0.write_str(s) + 800032c: 6800 ldr r0, [r0, #0] + 800032e: 4669 mov r1, sp + write_all(self.fd, buffer) + 8000330: f8d0 c000 ldr.w ip, [r0] + 8000334: 2005 movs r0, #5 + match unsafe { syscall!(WRITE, fd, buffer.as_ptr(), buffer.len()) } { + 8000336: e9cd ce00 strd ip, lr, [sp] + 800033a: 9202 str r2, [sp, #8] + 800033c: beab bkpt 0x00ab + 800033e: b170 cbz r0, 800035e <<core::fmt::Write::write_fmt::Adapter<'a, T> as core::fmt::Write>::write_str+0x3c> + 8000340: 4669 mov r1, sp + 8000342: 4603 mov r3, r0 + n if n <= buffer.len() => { + 8000344: 429a cmp r2, r3 + 8000346: d30d bcc.n 8000364 <<core::fmt::Write::write_fmt::Adapter<'a, T> as core::fmt::Write>::write_str+0x42> + let offset = (buffer.len() - n) as isize; + 8000348: 1ad0 subs r0, r2, r3 + match unsafe { syscall!(WRITE, fd, buffer.as_ptr(), buffer.len()) } { + 800034a: f8cd c000 str.w ip, [sp] + 800034e: 461a mov r2, r3 + 8000350: 4486 add lr, r0 + 8000352: 2005 movs r0, #5 + 8000354: e9cd e301 strd lr, r3, [sp, #4] + 8000358: beab bkpt 0x00ab + 0 => return Ok(()), + 800035a: 2800 cmp r0, #0 + 800035c: d1f1 bne.n 8000342 <<core::fmt::Write::write_fmt::Adapter<'a, T> as core::fmt::Write>::write_str+0x20> + 800035e: 2000 movs r0, #0 + 8000360: b003 add sp, #12 + 8000362: bd80 pop {r7, pc} + 8000364: 2001 movs r0, #1 + } + 8000366: b003 add sp, #12 + 8000368: bd80 pop {r7, pc} + +0800036a <main>: + 800036a: b580 push {r7, lr} + 800036c: 466f mov r7, sp + 800036e: b08c sub sp, #48 ; 0x30 + 8000370: f240 1088 movw r0, #392 ; 0x188 + 8000374: 2200 movs r2, #0 + 8000376: a906 add r1, sp, #24 + 8000378: 2301 movs r3, #1 + 800037a: f6c0 0000 movt r0, #2048 ; 0x800 + 800037e: 7800 ldrb r0, [r0, #0] +#[inline(always)] +pub fn disable() { + match () { + #[cfg(target_arch = "arm")] + () => unsafe { + asm!("cpsid i" + 8000380: b672 cpsid i +} + +fn init(_p: init::Peripherals) {} + +fn idle() -> ! { + let f = 1.0; + 8000382: 2000 movs r0, #0 +#[inline(always)] +pub unsafe fn enable() { + match () { + #[cfg(target_arch = "arm")] + () => { + asm!("cpsie i" + 8000384: b662 cpsie i + 8000386: f6c3 70f0 movt r0, #16368 ; 0x3ff0 + 800038a: 9001 str r0, [sp, #4] + match unsafe { syscall!(OPEN, name.as_ptr(), mode, name.len() - 1) } as + 800038c: f643 50b8 movw r0, #15800 ; 0x3db8 + 8000390: 9200 str r2, [sp, #0] + 8000392: f6c0 0000 movt r0, #2048 ; 0x800 + 8000396: 9006 str r0, [sp, #24] + 8000398: 2004 movs r0, #4 + 800039a: 9007 str r0, [sp, #28] + 800039c: 2003 movs r0, #3 + 800039e: 9008 str r0, [sp, #32] + 80003a0: 2001 movs r0, #1 + 80003a2: beab bkpt 0x00ab + Ok(t) => t, + 80003a4: 1c41 adds r1, r0, #1 + 80003a6: d023 beq.n 80003f0 <main+0x86> + println!("Hello, world! {}", f); + 80003a8: 9002 str r0, [sp, #8] + 80003aa: 4668 mov r0, sp + write(&mut Adapter(self), args) + 80003ac: f643 5180 movw r1, #15744 ; 0x3d80 + 80003b0: 9003 str r0, [sp, #12] + 80003b2: f643 2097 movw r0, #14999 ; 0x3a97 + 80003b6: f6c0 0100 movt r1, #2048 ; 0x800 + 80003ba: f6c0 0000 movt r0, #2048 ; 0x800 + 80003be: 9004 str r0, [sp, #16] + 80003c0: a802 add r0, sp, #8 + 80003c2: 9005 str r0, [sp, #20] + 80003c4: f643 50a8 movw r0, #15784 ; 0x3da8 + 80003c8: f6c0 0000 movt r0, #2048 ; 0x800 + 80003cc: 9006 str r0, [sp, #24] + 80003ce: 2002 movs r0, #2 + 80003d0: 9209 str r2, [sp, #36] ; 0x24 + 80003d2: e9cd 0207 strd r0, r2, [sp, #28] + 80003d6: a803 add r0, sp, #12 + 80003d8: aa06 add r2, sp, #24 + 80003da: e9cd 030a strd r0, r3, [sp, #40] ; 0x28 + 80003de: a805 add r0, sp, #20 + 80003e0: f000 fc8f bl 8000d02 <core::fmt::write> + 80003e4: f010 0fff tst.w r0, #255 ; 0xff + 80003e8: d104 bne.n 80003f4 <main+0x8a> +/// cause an exception +#[inline(always)] +pub fn bkpt() { + #[cfg(target_arch = "arm")] + unsafe { + asm!("bkpt" + 80003ea: be00 bkpt 0x0000 +#[inline(always)] +pub fn wfi() { + match () { + #[cfg(target_arch = "arm")] + () => unsafe{ + asm!("wfi" + 80003ec: bf30 wfi + + rtfm::bkpt(); + loop { + 80003ee: e7fd b.n 80003ec <main+0x82> + Err(e) => unwrap_failed("called `Result::unwrap()` on an `Err` value", e), + 80003f0: f7ff ff09 bl 8000206 <core::result::unwrap_failed> + 80003f4: f7ff ff0b bl 800020e <core::result::unwrap_failed> + +080003f8 <cortex_m_rt::default_handler>: + asm!("bkpt" + 80003f8: be00 bkpt 0x0000 +#[allow(unused_variables)] +#[cfg(target_arch = "arm")] +extern "C" fn default_handler(ef: &ExceptionFrame) -> ! { + asm::bkpt(); + + loop {} + 80003fa: e7fe b.n 80003fa <cortex_m_rt::default_handler+0x2> + +080003fc <BUS_FAULT>: + #[export_name = "DEFAULT_HANDLER"] + #[linkage = "weak"] + #[naked] + extern "C" fn trampoline() -> ! { + unsafe { + asm!("mrs r0, MSP + 80003fc: f3ef 8008 mrs r0, MSP + 8000400: f7ff bffa b.w 80003f8 <cortex_m_rt::default_handler> + +08000404 <cortex_m_rt::reset_handler::main>: + ::main(0, ::core::ptr::null()); + 8000404: f7ff bfb1 b.w 800036a <main> + +08000408 <core::num::flt2dec::strategy::dragon::mul_pow10>: + [0, 0, 0, 0, 0, 0, 0, 0, 0x982e7c01, 0xbed3875b, 0xd8d99f72, 0x12152f87, 0x6bde50c6, + 0xcf4a6e70, 0xd595d80f, 0x26b2716e, 0xadc666b0, 0x1d153624, 0x3c42d35a, 0x63ff540e, + 0xcc5573c0, 0x65f9ef17, 0x55bc28f2, 0x80dcc7f7, 0xf46eeddc, 0x5fdcefce, 0x553f7]; + +#[doc(hidden)] +pub fn mul_pow10(x: &mut Big, n: usize) -> &mut Big { + 8000408: b5f0 push {r4, r5, r6, r7, lr} + 800040a: af03 add r7, sp, #12 + 800040c: f84d 8d04 str.w r8, [sp, #-4]! + 8000410: 4688 mov r8, r1 + debug_assert!(n < 512); + if n & 7 != 0 { x.mul_small(POW10[n & 7]); } + 8000412: f018 0207 ands.w r2, r8, #7 + 8000416: d02a beq.n 800046e <core::num::flt2dec::strategy::dragon::mul_pow10+0x66> + /// Multiplies itself by a digit-sized `other` and returns its own + /// mutable reference. + pub fn mul_small(&mut self, other: $ty) -> &mut $name { + use num::bignum::FullOps; + + let mut sz = self.size; + 8000418: f8d0 e000 ldr.w lr, [r0] + + #[inline] + fn index_mut(self, slice: &mut [T]) -> &mut [T] { + if self.start > self.end { + slice_index_order_fail(self.start, self.end); + } else if self.end > slice.len() { + 800041c: f1be 0f29 cmp.w lr, #41 ; 0x29 + 8000420: f080 8085 bcs.w 800052e <core::num::flt2dec::strategy::dragon::mul_pow10+0x126> + 8000424: 2600 movs r6, #0 + unsafe { + if mem::size_of::<T>() != 0 { + assume(!self.ptr.is_null()); + assume(!self.end.is_null()); + } + if self.ptr == self.end { + 8000426: f1be 0f00 cmp.w lr, #0 + 800042a: d01f beq.n 800046c <core::num::flt2dec::strategy::dragon::mul_pow10+0x64> + &(*slice)[self] + 800042c: f244 23d0 movw r3, #17104 ; 0x42d0 + if self.ptr == self.end { + 8000430: ea4f 048e mov.w r4, lr, lsl #2 + let mut carry = 0; + for a in &mut self.base[..sz] { + 8000434: 1d05 adds r5, r0, #4 + &(*slice)[self] + 8000436: f6c0 0300 movt r3, #2048 ; 0x800 + 800043a: f853 3022 ldr.w r3, [r3, r2, lsl #2] + /// } + /// ``` + #[stable(feature = "rust1", since = "1.0.0")] + #[inline] + pub unsafe fn offset(self, count: isize) -> *mut T where T: Sized { + intrinsics::offset(self, count) as *mut T + 800043e: eb00 028e add.w r2, r0, lr, lsl #2 + 8000442: f102 0c04 add.w ip, r2, #4 + let v = (self as $bigty) * (other as $bigty) + (carry as $bigty); + 8000446: 6829 ldr r1, [r5, #0] + 8000448: 2200 movs r2, #0 + if self.ptr == self.end { + 800044a: 3c04 subs r4, #4 + 800044c: fbe1 6203 umlal r6, r2, r1, r3 + let (c, v) = (*a).full_mul(other, carry); + *a = v; + 8000450: f845 6b04 str.w r6, [r5], #4 + 8000454: 4616 mov r6, r2 + 8000456: d1f6 bne.n 8000446 <core::num::flt2dec::strategy::dragon::mul_pow10+0x3e> + 8000458: b13a cbz r2, 800046a <core::num::flt2dec::strategy::dragon::mul_pow10+0x62> + carry = c; + } + if carry > 0 { + self.base[sz] = carry; + 800045a: f1be 0f27 cmp.w lr, #39 ; 0x27 + 800045e: d86a bhi.n 8000536 <core::num::flt2dec::strategy::dragon::mul_pow10+0x12e> + sz += 1; + 8000460: f10e 0601 add.w r6, lr, #1 + self.base[sz] = carry; + 8000464: f8cc 2000 str.w r2, [ip] + 8000468: e000 b.n 800046c <core::num::flt2dec::strategy::dragon::mul_pow10+0x64> + 800046a: 4676 mov r6, lr + } + self.size = sz; + 800046c: 6006 str r6, [r0, #0] + if n & 8 != 0 { x.mul_small(POW10[8]); } + 800046e: ea5f 7108 movs.w r1, r8, lsl #28 + 8000472: d527 bpl.n 80004c4 <core::num::flt2dec::strategy::dragon::mul_pow10+0xbc> + let mut sz = self.size; + 8000474: f8d0 e000 ldr.w lr, [r0] + } else if self.end > slice.len() { + 8000478: f1be 0f29 cmp.w lr, #41 ; 0x29 + 800047c: d257 bcs.n 800052e <core::num::flt2dec::strategy::dragon::mul_pow10+0x126> + 800047e: 2600 movs r6, #0 + if self.ptr == self.end { + 8000480: f1be 0f00 cmp.w lr, #0 + 8000484: d01d beq.n 80004c2 <core::num::flt2dec::strategy::dragon::mul_pow10+0xba> + 8000486: f24e 1500 movw r5, #57600 ; 0xe100 + 800048a: eb00 028e add.w r2, r0, lr, lsl #2 + 800048e: ea4f 038e mov.w r3, lr, lsl #2 + for a in &mut self.base[..sz] { + 8000492: 1d04 adds r4, r0, #4 + 8000494: f102 0c04 add.w ip, r2, #4 + 8000498: f2c0 55f5 movt r5, #1525 ; 0x5f5 + let v = (self as $bigty) * (other as $bigty) + (carry as $bigty); + 800049c: 6821 ldr r1, [r4, #0] + 800049e: 2200 movs r2, #0 + 80004a0: 3b04 subs r3, #4 + 80004a2: fbe1 6205 umlal r6, r2, r1, r5 + *a = v; + 80004a6: f844 6b04 str.w r6, [r4], #4 + 80004aa: 4616 mov r6, r2 + 80004ac: d1f6 bne.n 800049c <core::num::flt2dec::strategy::dragon::mul_pow10+0x94> + 80004ae: b13a cbz r2, 80004c0 <core::num::flt2dec::strategy::dragon::mul_pow10+0xb8> + self.base[sz] = carry; + 80004b0: f1be 0f27 cmp.w lr, #39 ; 0x27 + 80004b4: d83f bhi.n 8000536 <core::num::flt2dec::strategy::dragon::mul_pow10+0x12e> + sz += 1; + 80004b6: f10e 0601 add.w r6, lr, #1 + self.base[sz] = carry; + 80004ba: f8cc 2000 str.w r2, [ip] + 80004be: e000 b.n 80004c2 <core::num::flt2dec::strategy::dragon::mul_pow10+0xba> + 80004c0: 4676 mov r6, lr + self.size = sz; + 80004c2: 6006 str r6, [r0, #0] + if n & 16 != 0 { x.mul_digits(&POW10TO16); } + 80004c4: ea5f 61c8 movs.w r1, r8, lsl #27 + 80004c8: d506 bpl.n 80004d8 <core::num::flt2dec::strategy::dragon::mul_pow10+0xd0> + 80004ca: f244 21f8 movw r1, #17144 ; 0x42f8 + 80004ce: 2202 movs r2, #2 + 80004d0: f6c0 0100 movt r1, #2048 ; 0x800 + 80004d4: f000 f83b bl 800054e <core::num::bignum::Big32x40::mul_digits> + if n & 32 != 0 { x.mul_digits(&POW10TO32); } + 80004d8: ea5f 6188 movs.w r1, r8, lsl #26 + 80004dc: d506 bpl.n 80004ec <core::num::flt2dec::strategy::dragon::mul_pow10+0xe4> + 80004de: f244 3100 movw r1, #17152 ; 0x4300 + 80004e2: 2204 movs r2, #4 + 80004e4: f6c0 0100 movt r1, #2048 ; 0x800 + 80004e8: f000 f831 bl 800054e <core::num::bignum::Big32x40::mul_digits> + if n & 64 != 0 { x.mul_digits(&POW10TO64); } + 80004ec: ea5f 6148 movs.w r1, r8, lsl #25 + 80004f0: d506 bpl.n 8000500 <core::num::flt2dec::strategy::dragon::mul_pow10+0xf8> + 80004f2: f244 3110 movw r1, #17168 ; 0x4310 + 80004f6: 2207 movs r2, #7 + 80004f8: f6c0 0100 movt r1, #2048 ; 0x800 + 80004fc: f000 f827 bl 800054e <core::num::bignum::Big32x40::mul_digits> + if n & 128 != 0 { x.mul_digits(&POW10TO128); } + 8000500: ea5f 6108 movs.w r1, r8, lsl #24 + 8000504: d506 bpl.n 8000514 <core::num::flt2dec::strategy::dragon::mul_pow10+0x10c> + 8000506: f244 312c movw r1, #17196 ; 0x432c + 800050a: 220e movs r2, #14 + 800050c: f6c0 0100 movt r1, #2048 ; 0x800 + 8000510: f000 f81d bl 800054e <core::num::bignum::Big32x40::mul_digits> + if n & 256 != 0 { x.mul_digits(&POW10TO256); } + 8000514: ea5f 51c8 movs.w r1, r8, lsl #23 + 8000518: d506 bpl.n 8000528 <core::num::flt2dec::strategy::dragon::mul_pow10+0x120> + 800051a: f244 3164 movw r1, #17252 ; 0x4364 + 800051e: 221b movs r2, #27 + 8000520: f6c0 0100 movt r1, #2048 ; 0x800 + 8000524: f000 f813 bl 800054e <core::num::bignum::Big32x40::mul_digits> + x +} + 8000528: f85d 8b04 ldr.w r8, [sp], #4 + 800052c: bdf0 pop {r4, r5, r6, r7, pc} + 800052e: 4670 mov r0, lr + 8000530: 2128 movs r1, #40 ; 0x28 + 8000532: f000 f804 bl 800053e <core::slice::slice_index_len_fail> + 8000536: 4670 mov r0, lr + 8000538: 2128 movs r1, #40 ; 0x28 + 800053a: f000 f804 bl 8000546 <core::panicking::panic_bounds_check> + +0800053e <core::slice::slice_index_len_fail>: +fn slice_index_len_fail(index: usize, len: usize) -> ! { + 800053e: b580 push {r7, lr} + 8000540: 466f mov r7, sp + panic!("index {} out of range for slice of length {}", index, len); + 8000542: f000 f8e5 bl 8000710 <core::panicking::panic_fmt> + +08000546 <core::panicking::panic_bounds_check>: + panic_fmt(fmt::Arguments::new_v1(&[expr], &[]), &(file, line, col)) +} + +#[cold] #[inline(never)] +#[lang = "panic_bounds_check"] +fn panic_bounds_check(file_line_col: &(&'static str, u32, u32), + 8000546: b580 push {r7, lr} + 8000548: 466f mov r7, sp + index: usize, len: usize) -> ! { + panic_fmt(format_args!("index out of bounds: the len is {} but the index is {}", + 800054a: f000 f8e1 bl 8000710 <core::panicking::panic_fmt> + +0800054e <core::num::bignum::Big32x40::mul_digits>: + + + /// Multiplies itself by a number described by `other[0] + other[1] * 2^W + + /// other[2] * 2^(2W) + ...` (where `W` is the number of bits in the digit type) + /// and returns its own mutable reference. + pub fn mul_digits<'a>(&'a mut self, other: &[$ty]) -> &'a mut $name { + 800054e: b5f0 push {r4, r5, r6, r7, lr} + 8000550: af03 add r7, sp, #12 + 8000552: e92d 0f00 stmdb sp!, {r8, r9, sl, fp} + 8000556: b0af sub sp, #188 ; 0xbc + 8000558: ac07 add r4, sp, #28 + 800055a: 460d mov r5, r1 + 800055c: 4681 mov r9, r0 + } + } + retsz + } + + let mut ret = [0; $n]; + 800055e: 21a0 movs r1, #160 ; 0xa0 + 8000560: 4616 mov r6, r2 + 8000562: 4620 mov r0, r4 + 8000564: f003 fb06 bl 8003b74 <__aeabi_memclr4> + let retsz = if self.size < other.len() { + 8000568: f8d9 8000 ldr.w r8, [r9] + } else if self.end > slice.len() { + 800056c: f1b8 0f29 cmp.w r8, #41 ; 0x29 + 8000570: f080 80ca bcs.w 8000708 <core::num::bignum::Big32x40::mul_digits+0x1ba> + &self.base[..self.size] + 8000574: f109 0004 add.w r0, r9, #4 + let retsz = if self.size < other.len() { + 8000578: 45b0 cmp r8, r6 + 800057a: d210 bcs.n 800059e <core::num::bignum::Big32x40::mul_digits+0x50> + 800057c: eb04 0186 add.w r1, r4, r6, lsl #2 + 8000580: 1c72 adds r2, r6, #1 + 8000582: f04f 0a00 mov.w sl, #0 + let mut retsz = 0; + 8000586: 3904 subs r1, #4 + 8000588: 9201 str r2, [sp, #4] + 800058a: 2200 movs r2, #0 + intrinsics::offset(self, count) + 800058c: 9102 str r1, [sp, #8] + 800058e: eb09 0188 add.w r1, r9, r8, lsl #2 + 8000592: f1a4 0804 sub.w r8, r4, #4 + 8000596: 4604 mov r4, r0 + 8000598: 1d0b adds r3, r1, #4 + 800059a: 00b1 lsls r1, r6, #2 + 800059c: e029 b.n 80005f2 <core::num::bignum::Big32x40::mul_digits+0xa4> + 800059e: eb05 0b86 add.w fp, r5, r6, lsl #2 + for (i, &a) in aa.iter().enumerate() { + 80005a2: f1b8 0f00 cmp.w r8, #0 + 80005a6: f000 808a beq.w 80006be <core::num::bignum::Big32x40::mul_digits+0x170> + 80005aa: f108 0101 add.w r1, r8, #1 + let mut retsz = 0; + 80005ae: 1f22 subs r2, r4, #4 + 80005b0: 2600 movs r6, #0 + 80005b2: f04f 0a00 mov.w sl, #0 + 80005b6: 9103 str r1, [sp, #12] + 80005b8: eb04 0188 add.w r1, r4, r8, lsl #2 + 80005bc: 3904 subs r1, #4 + 80005be: 9102 str r1, [sp, #8] + 80005c0: ea4f 0188 mov.w r1, r8, lsl #2 + 80005c4: e055 b.n 8000672 <core::num::bignum::Big32x40::mul_digits+0x124> + 80005c6: e9dd 8a05 ldrd r8, sl, [sp, #20] + if carry > 0 { + 80005ca: f1b9 0f00 cmp.w r9, #0 + 80005ce: 4631 mov r1, r6 + 80005d0: d008 beq.n 80005e4 <core::num::bignum::Big32x40::mul_digits+0x96> + &mut (*slice)[self] + 80005d2: 18b1 adds r1, r6, r2 + 80005d4: 3901 subs r1, #1 + 80005d6: 2928 cmp r1, #40 ; 0x28 + 80005d8: f080 808e bcs.w 80006f8 <core::num::bignum::Big32x40::mul_digits+0x1aa> + ret[i + sz] = carry; + 80005dc: 9902 ldr r1, [sp, #8] + 80005de: f841 9022 str.w r9, [r1, r2, lsl #2] + 80005e2: 9901 ldr r1, [sp, #4] + if retsz < i + sz { + 80005e4: 4411 add r1, r2 + 80005e6: 3901 subs r1, #1 + 80005e8: 458a cmp sl, r1 + 80005ea: bf38 it cc + 80005ec: 468a movcc sl, r1 + 80005ee: e9dd 1903 ldrd r1, r9, [sp, #12] + let mut retsz = 0; + 80005f2: eb08 0c82 add.w ip, r8, r2, lsl #2 + if self.ptr == self.end { + 80005f6: 429c cmp r4, r3 + 80005f8: d073 beq.n 80006e2 <core::num::bignum::Big32x40::mul_digits+0x194> + for (i, &a) in aa.iter().enumerate() { + 80005fa: f854 eb04 ldr.w lr, [r4], #4 + if a == 0 { continue; } + 80005fe: f10c 0c04 add.w ip, ip, #4 + #[rustc_inherit_overflow_checks] + fn next(&mut self) -> Option<(usize, <I as Iterator>::Item)> { + self.iter.next().map(|a| { + let ret = (self.count, a); + // Possible undefined overflow. + self.count += 1; + 8000602: 3201 adds r2, #1 + 8000604: f1be 0f00 cmp.w lr, #0 + 8000608: d0f5 beq.n 80005f6 <core::num::bignum::Big32x40::mul_digits+0xa8> + 800060a: f8cd a018 str.w sl, [sp, #24] + 800060e: e9cd 9804 strd r9, r8, [sp, #16] + 8000612: f04f 0900 mov.w r9, #0 + 8000616: 468a mov sl, r1 + 8000618: f04f 0800 mov.w r8, #0 + 800061c: 9103 str r1, [sp, #12] + &(*slice)[self] + 800061e: eb02 0108 add.w r1, r2, r8 + 8000622: 3901 subs r1, #1 + 8000624: 2928 cmp r1, #40 ; 0x28 + 8000626: d267 bcs.n 80006f8 <core::num::bignum::Big32x40::mul_digits+0x1aa> + let v = (self as $bigty) * (other as $bigty) + (other2 as $bigty) + + 8000628: f85c 1028 ldr.w r1, [ip, r8, lsl #2] + 800062c: f855 b028 ldr.w fp, [r5, r8, lsl #2] + if self.ptr == self.end { + 8000630: f1ba 0a04 subs.w sl, sl, #4 + 8000634: fbeb 196e umaal r1, r9, fp, lr + ret[i + j] = v; + 8000638: f84c 1028 str.w r1, [ip, r8, lsl #2] + 800063c: f108 0801 add.w r8, r8, #1 + 8000640: d1ed bne.n 800061e <core::num::bignum::Big32x40::mul_digits+0xd0> + 8000642: e7c0 b.n 80005c6 <core::num::bignum::Big32x40::mul_digits+0x78> + 8000644: 46d1 mov r9, sl + 8000646: f8dd a018 ldr.w sl, [sp, #24] + if carry > 0 { + 800064a: f1bc 0f00 cmp.w ip, #0 + 800064e: 4641 mov r1, r8 + 8000650: d008 beq.n 8000664 <core::num::bignum::Big32x40::mul_digits+0x116> + &mut (*slice)[self] + 8000652: eb08 0106 add.w r1, r8, r6 + 8000656: 1e4a subs r2, r1, #1 + 8000658: 2a28 cmp r2, #40 ; 0x28 + 800065a: d251 bcs.n 8000700 <core::num::bignum::Big32x40::mul_digits+0x1b2> + ret[i + sz] = carry; + 800065c: 9902 ldr r1, [sp, #8] + 800065e: f841 c026 str.w ip, [r1, r6, lsl #2] + 8000662: 9903 ldr r1, [sp, #12] + if retsz < i + sz { + 8000664: 4431 add r1, r6 + 8000666: 3901 subs r1, #1 + 8000668: 458a cmp sl, r1 + 800066a: bf38 it cc + 800066c: 468a movcc sl, r1 + 800066e: e9dd 2104 ldrd r2, r1, [sp, #16] + let mut retsz = 0; + 8000672: eb02 0486 add.w r4, r2, r6, lsl #2 + if self.ptr == self.end { + 8000676: 455d cmp r5, fp + 8000678: d033 beq.n 80006e2 <core::num::bignum::Big32x40::mul_digits+0x194> + for (i, &a) in aa.iter().enumerate() { + 800067a: f855 eb04 ldr.w lr, [r5], #4 + if a == 0 { continue; } + 800067e: 3404 adds r4, #4 + 8000680: 3601 adds r6, #1 + 8000682: f1be 0f00 cmp.w lr, #0 + 8000686: d0f6 beq.n 8000676 <core::num::bignum::Big32x40::mul_digits+0x128> + 8000688: f8cd a018 str.w sl, [sp, #24] + 800068c: 46ca mov sl, r9 + 800068e: f04f 0c00 mov.w ip, #0 + 8000692: 9105 str r1, [sp, #20] + 8000694: 4689 mov r9, r1 + 8000696: 2100 movs r1, #0 + 8000698: 9204 str r2, [sp, #16] + &(*slice)[self] + 800069a: 1872 adds r2, r6, r1 + 800069c: 3a01 subs r2, #1 + 800069e: 2a28 cmp r2, #40 ; 0x28 + 80006a0: d22e bcs.n 8000700 <core::num::bignum::Big32x40::mul_digits+0x1b2> + let v = (self as $bigty) * (other as $bigty) + (other2 as $bigty) + + 80006a2: f854 2021 ldr.w r2, [r4, r1, lsl #2] + 80006a6: f850 3021 ldr.w r3, [r0, r1, lsl #2] + if self.ptr == self.end { + 80006aa: f1b9 0904 subs.w r9, r9, #4 + 80006ae: fbe3 2c6e umaal r2, ip, r3, lr + ret[i + j] = v; + 80006b2: f844 2021 str.w r2, [r4, r1, lsl #2] + 80006b6: f101 0101 add.w r1, r1, #1 + 80006ba: d1ee bne.n 800069a <core::num::bignum::Big32x40::mul_digits+0x14c> + 80006bc: e7c2 b.n 8000644 <core::num::bignum::Big32x40::mul_digits+0xf6> + 80006be: 2100 movs r1, #0 + 80006c0: f04f 0a00 mov.w sl, #0 + 80006c4: 455d cmp r5, fp + 80006c6: d106 bne.n 80006d6 <core::num::bignum::Big32x40::mul_digits+0x188> + 80006c8: e00b b.n 80006e2 <core::num::bignum::Big32x40::mul_digits+0x194> + if retsz < i + sz { + 80006ca: 1e4a subs r2, r1, #1 + 80006cc: 4592 cmp sl, r2 + 80006ce: bf38 it cc + 80006d0: 4692 movcc sl, r2 + 80006d2: 455d cmp r5, fp + 80006d4: d005 beq.n 80006e2 <core::num::bignum::Big32x40::mul_digits+0x194> + for (i, &a) in aa.iter().enumerate() { + 80006d6: f855 2b04 ldr.w r2, [r5], #4 + 80006da: 3101 adds r1, #1 + if a == 0 { continue; } + 80006dc: 2a00 cmp r2, #0 + 80006de: d0f8 beq.n 80006d2 <core::num::bignum::Big32x40::mul_digits+0x184> + 80006e0: e7f3 b.n 80006ca <core::num::bignum::Big32x40::mul_digits+0x17c> + 80006e2: a907 add r1, sp, #28 + mul_inner(&mut ret, &self.digits(), other) + } else { + mul_inner(&mut ret, other, &self.digits()) + }; + self.base = ret; + 80006e4: 22a0 movs r2, #160 ; 0xa0 + 80006e6: f003 f9fd bl 8003ae4 <__aeabi_memcpy4> + self.size = retsz; + 80006ea: f8c9 a000 str.w sl, [r9] + self + } + 80006ee: 4648 mov r0, r9 + 80006f0: b02f add sp, #188 ; 0xbc + 80006f2: e8bd 0f00 ldmia.w sp!, {r8, r9, sl, fp} + 80006f6: bdf0 pop {r4, r5, r6, r7, pc} + 80006f8: 4608 mov r0, r1 + 80006fa: 2128 movs r1, #40 ; 0x28 + 80006fc: f7ff ff23 bl 8000546 <core::panicking::panic_bounds_check> + 8000700: 4610 mov r0, r2 + 8000702: 2128 movs r1, #40 ; 0x28 + 8000704: f7ff ff1f bl 8000546 <core::panicking::panic_bounds_check> + slice_index_len_fail(self.end, slice.len()); + 8000708: 4640 mov r0, r8 + 800070a: 2128 movs r1, #40 ; 0x28 + 800070c: f7ff ff17 bl 800053e <core::slice::slice_index_len_fail> + +08000710 <core::panicking::panic_fmt>: + _: ::core::fmt::Arguments, + _: &'static str, + _: u32, + _: u32, +) -> ! { + ::core::intrinsics::abort() + 8000710: defe udf #254 ; 0xfe + +08000712 <core::fmt::Formatter::pad_integral>: + /// * buf - the byte array that the number has been formatted into + /// + /// This function will correctly account for the flags provided as well as + /// the minimum width. It will not take precision into account. + #[stable(feature = "rust1", since = "1.0.0")] + pub fn pad_integral(&mut self, + 8000712: b5f0 push {r4, r5, r6, r7, lr} + 8000714: af03 add r7, sp, #12 + 8000716: e92d 0f00 stmdb sp!, {r8, r9, sl, fp} + 800071a: b087 sub sp, #28 + 800071c: 4681 mov r9, r0 + 800071e: 468b mov fp, r1 + 8000720: 4690 mov r8, r2 + 8000722: f8d9 0000 ldr.w r0, [r9] + + // The `width` field is more of a `min-width` parameter at this point. + match self.width { + // If there's no minimum length requirements then we can just + // write the bytes. + None => { + 8000726: f8d9 1008 ldr.w r1, [r9, #8] + } else if self.sign_plus() { + 800072a: 4645 mov r5, r8 + #[stable(feature = "fmt_flags", since = "1.5.0")] + pub fn precision(&self) -> Option<usize> { self.precision } + + /// Determines if the `+` flag was specified. + #[stable(feature = "fmt_flags", since = "1.5.0")] + pub fn sign_plus(&self) -> bool { self.flags & (1 << FlagV1::SignPlus as u32) != 0 } + 800072c: f010 0401 ands.w r4, r0, #1 + } else if self.sign_plus() { + 8000730: bf18 it ne + 8000732: 3501 addne r5, #1 + if self.alternate() { + 8000734: f3c0 0a80 ubfx sl, r0, #2, #1 + 8000738: b1d9 cbz r1, 8000772 <core::fmt::Formatter::pad_integral+0x60> + Some(min) if width >= min => { + 800073a: f8d9 600c ldr.w r6, [r9, #12] + 800073e: 42ae cmp r6, r5 + 8000740: d92c bls.n 800079c <core::fmt::Formatter::pad_integral+0x8a> + Some(min) if self.sign_aware_zero_pad() => { + 8000742: 0700 lsls r0, r0, #28 + 8000744: d455 bmi.n 80007f2 <core::fmt::Formatter::pad_integral+0xe0> + rt::v1::Alignment::Unknown => default, + 8000746: f899 0030 ldrb.w r0, [r9, #48] ; 0x30 + self.with_padding(min - width, rt::v1::Alignment::Right, |f| { + 800074a: 1b76 subs r6, r6, r5 + rt::v1::Alignment::Unknown => default, + 800074c: 2803 cmp r0, #3 + 800074e: bf08 it eq + 8000750: 2001 moveq r0, #1 + 8000752: f8cd 8010 str.w r8, [sp, #16] + 8000756: f010 0103 ands.w r1, r0, #3 + 800075a: f04f 0000 mov.w r0, #0 + 800075e: f000 8088 beq.w 8000872 <core::fmt::Formatter::pad_integral+0x160> + 8000762: 2902 cmp r1, #2 + 8000764: f040 8088 bne.w 8000878 <core::fmt::Formatter::pad_integral+0x166> + rt::v1::Alignment::Center => (padding / 2, (padding + 1) / 2), + 8000768: 1c71 adds r1, r6, #1 + 800076a: ea4f 0856 mov.w r8, r6, lsr #1 + 800076e: 084e lsrs r6, r1, #1 + 8000770: e084 b.n 800087c <core::fmt::Formatter::pad_integral+0x16a> + 8000772: b17c cbz r4, 8000794 <core::fmt::Formatter::pad_integral+0x82> + f.buf.write_str(c.encode_utf8(&mut [0; 4]))?; + 8000774: e9d9 0106 ldrd r0, r1, [r9, #24] + 8000778: 2200 movs r2, #0 + 800077a: 2401 movs r4, #1 + 800077c: 9206 str r2, [sp, #24] + *dst.get_unchecked_mut(0) = code as u8; + 800077e: 222b movs r2, #43 ; 0x2b + 8000780: f88d 2018 strb.w r2, [sp, #24] + 8000784: 2201 movs r2, #1 + 8000786: 68cb ldr r3, [r1, #12] + 8000788: a906 add r1, sp, #24 + 800078a: 4798 blx r3 + 800078c: f010 0fff tst.w r0, #255 ; 0xff + 8000790: f040 8193 bne.w 8000aba <core::fmt::Formatter::pad_integral+0x3a8> + if prefixed { f.buf.write_str(prefix) } + 8000794: f1ba 0f00 cmp.w sl, #0 + 8000798: d114 bne.n 80007c4 <core::fmt::Formatter::pad_integral+0xb2> + 800079a: e020 b.n 80007de <core::fmt::Formatter::pad_integral+0xcc> + 800079c: b17c cbz r4, 80007be <core::fmt::Formatter::pad_integral+0xac> + f.buf.write_str(c.encode_utf8(&mut [0; 4]))?; + 800079e: e9d9 0106 ldrd r0, r1, [r9, #24] + 80007a2: 2200 movs r2, #0 + 80007a4: 2401 movs r4, #1 + 80007a6: 9206 str r2, [sp, #24] + 80007a8: 222b movs r2, #43 ; 0x2b + 80007aa: f88d 2018 strb.w r2, [sp, #24] + 80007ae: 2201 movs r2, #1 + 80007b0: 68cb ldr r3, [r1, #12] + 80007b2: a906 add r1, sp, #24 + 80007b4: 4798 blx r3 + 80007b6: f010 0fff tst.w r0, #255 ; 0xff + 80007ba: f040 817e bne.w 8000aba <core::fmt::Formatter::pad_integral+0x3a8> + if prefixed { f.buf.write_str(prefix) } + 80007be: f1ba 0f00 cmp.w sl, #0 + 80007c2: d00c beq.n 80007de <core::fmt::Formatter::pad_integral+0xcc> + 80007c4: e9d9 0106 ldrd r0, r1, [r9, #24] + 80007c8: 2200 movs r2, #0 + 80007ca: 68cb ldr r3, [r1, #12] + 80007cc: f244 4198 movw r1, #17560 ; 0x4498 + 80007d0: f6c0 0100 movt r1, #2048 ; 0x800 + 80007d4: 4798 blx r3 + 80007d6: f010 0fff tst.w r0, #255 ; 0xff + 80007da: f040 816d bne.w 8000ab8 <core::fmt::Formatter::pad_integral+0x3a6> + 80007de: f8d9 101c ldr.w r1, [r9, #28] + 80007e2: f8d9 0018 ldr.w r0, [r9, #24] + 80007e6: 4642 mov r2, r8 + 80007e8: 68cb ldr r3, [r1, #12] + 80007ea: 4659 mov r1, fp + 80007ec: 4798 blx r3 + 80007ee: 4604 mov r4, r0 + 80007f0: e163 b.n 8000aba <core::fmt::Formatter::pad_integral+0x3a8> + 80007f2: 2030 movs r0, #48 ; 0x30 + if let Some(c) = sign { + 80007f4: 2c00 cmp r4, #0 + self.fill = '0'; + 80007f6: f8c9 0004 str.w r0, [r9, #4] + self.align = rt::v1::Alignment::Right; + 80007fa: f04f 0001 mov.w r0, #1 + 80007fe: f889 0030 strb.w r0, [r9, #48] ; 0x30 + 8000802: d00f beq.n 8000824 <core::fmt::Formatter::pad_integral+0x112> + f.buf.write_str(c.encode_utf8(&mut [0; 4]))?; + 8000804: e9d9 0106 ldrd r0, r1, [r9, #24] + 8000808: 2200 movs r2, #0 + 800080a: 2401 movs r4, #1 + 800080c: 9206 str r2, [sp, #24] + 800080e: 222b movs r2, #43 ; 0x2b + 8000810: f88d 2018 strb.w r2, [sp, #24] + 8000814: 2201 movs r2, #1 + 8000816: 68cb ldr r3, [r1, #12] + 8000818: a906 add r1, sp, #24 + 800081a: 4798 blx r3 + 800081c: f010 0fff tst.w r0, #255 ; 0xff + 8000820: f040 814b bne.w 8000aba <core::fmt::Formatter::pad_integral+0x3a8> + if prefixed { f.buf.write_str(prefix) } + 8000824: f1ba 0f00 cmp.w sl, #0 + 8000828: d00c beq.n 8000844 <core::fmt::Formatter::pad_integral+0x132> + 800082a: e9d9 0106 ldrd r0, r1, [r9, #24] + 800082e: 2200 movs r2, #0 + 8000830: 68cb ldr r3, [r1, #12] + 8000832: f244 4198 movw r1, #17560 ; 0x4498 + 8000836: f6c0 0100 movt r1, #2048 ; 0x800 + 800083a: 4798 blx r3 + write_prefix(self)?; + 800083c: f010 0fff tst.w r0, #255 ; 0xff + 8000840: f040 813a bne.w 8000ab8 <core::fmt::Formatter::pad_integral+0x3a6> + rt::v1::Alignment::Unknown => default, + 8000844: f899 0030 ldrb.w r0, [r9, #48] ; 0x30 + self.with_padding(min - width, rt::v1::Alignment::Right, |f| { + 8000848: eba6 0a05 sub.w sl, r6, r5 + rt::v1::Alignment::Unknown => default, + 800084c: 2803 cmp r0, #3 + 800084e: bf08 it eq + 8000850: 2001 moveq r0, #1 + 8000852: f8cd 8010 str.w r8, [sp, #16] + 8000856: f010 0103 ands.w r1, r0, #3 + 800085a: f04f 0000 mov.w r0, #0 + 800085e: d042 beq.n 80008e6 <core::fmt::Formatter::pad_integral+0x1d4> + 8000860: 2902 cmp r1, #2 + 8000862: d143 bne.n 80008ec <core::fmt::Formatter::pad_integral+0x1da> + rt::v1::Alignment::Center => (padding / 2, (padding + 1) / 2), + 8000864: f10a 0101 add.w r1, sl, #1 + 8000868: ea4f 085a mov.w r8, sl, lsr #1 + 800086c: ea4f 0a51 mov.w sl, r1, lsr #1 + 8000870: e03f b.n 80008f2 <core::fmt::Formatter::pad_integral+0x1e0> + 8000872: f04f 0800 mov.w r8, #0 + 8000876: e001 b.n 800087c <core::fmt::Formatter::pad_integral+0x16a> + 8000878: 46b0 mov r8, r6 + 800087a: 2600 movs r6, #0 + let mut fill = [0; 4]; + 800087c: 9005 str r0, [sp, #20] + let fill = self.fill.encode_utf8(&mut fill); + 800087e: f8d9 0004 ldr.w r0, [r9, #4] + if code < MAX_ONE_B && !dst.is_empty() { + 8000882: e9cd 6a00 strd r6, sl, [sp] + 8000886: e9cd 4b02 strd r4, fp, [sp, #8] + 800088a: 287f cmp r0, #127 ; 0x7f + 800088c: d804 bhi.n 8000898 <core::fmt::Formatter::pad_integral+0x186> + *dst.get_unchecked_mut(0) = code as u8; + 800088e: f88d 0014 strb.w r0, [sp, #20] + 8000892: f04f 0a01 mov.w sl, #1 + 8000896: e066 b.n 8000966 <core::fmt::Formatter::pad_integral+0x254> + } else if code < MAX_TWO_B && dst.len() >= 2 { + 8000898: 2100 movs r1, #0 + 800089a: ebb1 2fd0 cmp.w r1, r0, lsr #11 + 800089e: d10b bne.n 80008b8 <core::fmt::Formatter::pad_integral+0x1a6> + *dst.get_unchecked_mut(0) = (code >> 6 & 0x1F) as u8 | TAG_TWO_B; + 80008a0: f64f 72fe movw r2, #65534 ; 0xfffe + 80008a4: 0981 lsrs r1, r0, #6 + 80008a6: f04f 0a02 mov.w sl, #2 + 80008aa: ab05 add r3, sp, #20 + 80008ac: f2c0 72ff movt r2, #2047 ; 0x7ff + 80008b0: f362 115f bfi r1, r2, #5, #27 + 80008b4: 2201 movs r2, #1 + 80008b6: e050 b.n 800095a <core::fmt::Formatter::pad_integral+0x248> + } else if code < MAX_THREE_B && dst.len() >= 3 { + 80008b8: ebb1 4f10 cmp.w r1, r0, lsr #16 + 80008bc: d135 bne.n 800092a <core::fmt::Formatter::pad_integral+0x218> + *dst.get_unchecked_mut(0) = (code >> 12 & 0x0F) as u8 | TAG_THREE_B; + 80008be: 0b01 lsrs r1, r0, #12 + 80008c0: 220e movs r2, #14 + 80008c2: f04f 0a03 mov.w sl, #3 + 80008c6: f362 111f bfi r1, r2, #4, #28 + *dst.get_unchecked_mut(1) = (code >> 6 & 0x3F) as u8 | TAG_CONT; + 80008ca: f64f 72fe movw r2, #65534 ; 0xfffe + *dst.get_unchecked_mut(0) = (code >> 12 & 0x0F) as u8 | TAG_THREE_B; + 80008ce: f88d 1014 strb.w r1, [sp, #20] + *dst.get_unchecked_mut(1) = (code >> 6 & 0x3F) as u8 | TAG_CONT; + 80008d2: 0981 lsrs r1, r0, #6 + 80008d4: f2c0 32ff movt r2, #1023 ; 0x3ff + 80008d8: f362 119f bfi r1, r2, #6, #26 + 80008dc: aa05 add r2, sp, #20 + intrinsics::offset(self, count) as *mut T + 80008de: f042 0301 orr.w r3, r2, #1 + 80008e2: 2202 movs r2, #2 + 80008e4: e039 b.n 800095a <core::fmt::Formatter::pad_integral+0x248> + 80008e6: f04f 0800 mov.w r8, #0 + 80008ea: e002 b.n 80008f2 <core::fmt::Formatter::pad_integral+0x1e0> + 80008ec: 46d0 mov r8, sl + 80008ee: f04f 0a00 mov.w sl, #0 + let mut fill = [0; 4]; + 80008f2: 9006 str r0, [sp, #24] + let fill = self.fill.encode_utf8(&mut fill); + 80008f4: f8d9 0004 ldr.w r0, [r9, #4] + if code < MAX_ONE_B && !dst.is_empty() { + 80008f8: f8cd b00c str.w fp, [sp, #12] + 80008fc: 287f cmp r0, #127 ; 0x7f + 80008fe: d804 bhi.n 800090a <core::fmt::Formatter::pad_integral+0x1f8> + *dst.get_unchecked_mut(0) = code as u8; + 8000900: f88d 0018 strb.w r0, [sp, #24] + 8000904: f04f 0b01 mov.w fp, #1 + 8000908: e0b6 b.n 8000a78 <core::fmt::Formatter::pad_integral+0x366> + } else if code < MAX_TWO_B && dst.len() >= 2 { + 800090a: 2100 movs r1, #0 + 800090c: ebb1 2fd0 cmp.w r1, r0, lsr #11 + 8000910: d17b bne.n 8000a0a <core::fmt::Formatter::pad_integral+0x2f8> + *dst.get_unchecked_mut(0) = (code >> 6 & 0x1F) as u8 | TAG_TWO_B; + 8000912: f64f 72fe movw r2, #65534 ; 0xfffe + 8000916: 0981 lsrs r1, r0, #6 + 8000918: f04f 0b02 mov.w fp, #2 + 800091c: ab06 add r3, sp, #24 + 800091e: f2c0 72ff movt r2, #2047 ; 0x7ff + 8000922: f362 115f bfi r1, r2, #5, #27 + 8000926: 2201 movs r2, #1 + 8000928: e0a0 b.n 8000a6c <core::fmt::Formatter::pad_integral+0x35a> + *dst.get_unchecked_mut(0) = (code >> 18 & 0x07) as u8 | TAG_FOUR_B; + 800092a: 21f0 movs r1, #240 ; 0xf0 + 800092c: 2202 movs r2, #2 + 800092e: f04f 0a04 mov.w sl, #4 + 8000932: ea41 4190 orr.w r1, r1, r0, lsr #18 + 8000936: f88d 1014 strb.w r1, [sp, #20] + *dst.get_unchecked_mut(1) = (code >> 12 & 0x3F) as u8 | TAG_CONT; + 800093a: 0b01 lsrs r1, r0, #12 + 800093c: f362 119f bfi r1, r2, #6, #26 + *dst.get_unchecked_mut(2) = (code >> 6 & 0x3F) as u8 | TAG_CONT; + 8000940: f64f 72fe movw r2, #65534 ; 0xfffe + *dst.get_unchecked_mut(1) = (code >> 12 & 0x3F) as u8 | TAG_CONT; + 8000944: f88d 1015 strb.w r1, [sp, #21] + *dst.get_unchecked_mut(2) = (code >> 6 & 0x3F) as u8 | TAG_CONT; + 8000948: 0981 lsrs r1, r0, #6 + 800094a: f2c0 32ff movt r2, #1023 ; 0x3ff + 800094e: f362 119f bfi r1, r2, #6, #26 + 8000952: aa05 add r2, sp, #20 + 8000954: f042 0302 orr.w r3, r2, #2 + 8000958: 2203 movs r2, #3 + 800095a: 7019 strb r1, [r3, #0] + 800095c: 2102 movs r1, #2 + 800095e: f361 109f bfi r0, r1, #6, #26 + 8000962: a905 add r1, sp, #20 + 8000964: 5488 strb r0, [r1, r2] + 8000966: e9d9 b506 ldrd fp, r5, [r9, #24] + 800096a: 2000 movs r0, #0 + 800096c: ae05 add r6, sp, #20 +impl<A: Step> Iterator for ops::Range<A> { + type Item = A; + + #[inline] + fn next(&mut self) -> Option<A> { + if self.start < self.end { + 800096e: 4540 cmp r0, r8 + 8000970: d210 bcs.n 8000994 <core::fmt::Formatter::pad_integral+0x282> + /// ``` + #[inline] + #[stable(feature = "wrapping", since = "1.7.0")] + pub fn overflowing_add(self, rhs: Self) -> (Self, bool) { + unsafe { + let (a, b) = $add_with_overflow(self as $ActualT, + 8000972: 1c44 adds r4, r0, #1 + 8000974: 4284 cmp r4, r0 + 8000976: f04f 0001 mov.w r0, #1 + 800097a: bf28 it cs + 800097c: 2000 movcs r0, #0 + 800097e: b948 cbnz r0, 8000994 <core::fmt::Formatter::pad_integral+0x282> + self.buf.write_str(fill)?; + 8000980: 68eb ldr r3, [r5, #12] + 8000982: 4658 mov r0, fp + 8000984: 4631 mov r1, r6 + 8000986: 4652 mov r2, sl + 8000988: 4798 blx r3 + 800098a: f010 0fff tst.w r0, #255 ; 0xff + 800098e: 4620 mov r0, r4 + 8000990: d0ed beq.n 800096e <core::fmt::Formatter::pad_integral+0x25c> + 8000992: e091 b.n 8000ab8 <core::fmt::Formatter::pad_integral+0x3a6> + if let Some(c) = sign { + 8000994: 9802 ldr r0, [sp, #8] + 8000996: b908 cbnz r0, 800099c <core::fmt::Formatter::pad_integral+0x28a> + 8000998: 68ee ldr r6, [r5, #12] + 800099a: e00d b.n 80009b8 <core::fmt::Formatter::pad_integral+0x2a6> + 800099c: 2000 movs r0, #0 + 800099e: a906 add r1, sp, #24 + f.buf.write_str(c.encode_utf8(&mut [0; 4]))?; + 80009a0: 2201 movs r2, #1 + 80009a2: 9006 str r0, [sp, #24] + *dst.get_unchecked_mut(0) = code as u8; + 80009a4: 202b movs r0, #43 ; 0x2b + 80009a6: f88d 0018 strb.w r0, [sp, #24] + 80009aa: 4658 mov r0, fp + 80009ac: 68ee ldr r6, [r5, #12] + 80009ae: 47b0 blx r6 + 80009b0: f010 0fff tst.w r0, #255 ; 0xff + 80009b4: f040 8080 bne.w 8000ab8 <core::fmt::Formatter::pad_integral+0x3a6> + if prefixed { f.buf.write_str(prefix) } + 80009b8: 9801 ldr r0, [sp, #4] + 80009ba: b148 cbz r0, 80009d0 <core::fmt::Formatter::pad_integral+0x2be> + 80009bc: f244 4198 movw r1, #17560 ; 0x4498 + 80009c0: 4658 mov r0, fp + 80009c2: 2200 movs r2, #0 + 80009c4: f6c0 0100 movt r1, #2048 ; 0x800 + 80009c8: 47b0 blx r6 + write_prefix(f)?; f.buf.write_str(buf) + 80009ca: f010 0fff tst.w r0, #255 ; 0xff + 80009ce: d173 bne.n 8000ab8 <core::fmt::Formatter::pad_integral+0x3a6> + 80009d0: e9dd 1203 ldrd r1, r2, [sp, #12] + 80009d4: 4658 mov r0, fp + 80009d6: 47b0 blx r6 + f(self)?; + 80009d8: f010 0fff tst.w r0, #255 ; 0xff + 80009dc: d16c bne.n 8000ab8 <core::fmt::Formatter::pad_integral+0x3a6> + 80009de: 9d00 ldr r5, [sp, #0] + 80009e0: 2000 movs r0, #0 + 80009e2: f10d 0814 add.w r8, sp, #20 + 80009e6: 42a8 cmp r0, r5 + 80009e8: d226 bcs.n 8000a38 <core::fmt::Formatter::pad_integral+0x326> + 80009ea: 1c44 adds r4, r0, #1 + 80009ec: 4284 cmp r4, r0 + 80009ee: f04f 0001 mov.w r0, #1 + 80009f2: bf28 it cs + 80009f4: 2000 movcs r0, #0 + 80009f6: b9f8 cbnz r0, 8000a38 <core::fmt::Formatter::pad_integral+0x326> + self.buf.write_str(fill)?; + 80009f8: 4658 mov r0, fp + 80009fa: 4641 mov r1, r8 + 80009fc: 4652 mov r2, sl + 80009fe: 47b0 blx r6 + 8000a00: f010 0fff tst.w r0, #255 ; 0xff + 8000a04: 4620 mov r0, r4 + 8000a06: d0ee beq.n 80009e6 <core::fmt::Formatter::pad_integral+0x2d4> + 8000a08: e056 b.n 8000ab8 <core::fmt::Formatter::pad_integral+0x3a6> + } else if code < MAX_THREE_B && dst.len() >= 3 { + 8000a0a: ebb1 4f10 cmp.w r1, r0, lsr #16 + 8000a0e: d115 bne.n 8000a3c <core::fmt::Formatter::pad_integral+0x32a> + *dst.get_unchecked_mut(0) = (code >> 12 & 0x0F) as u8 | TAG_THREE_B; + 8000a10: 0b01 lsrs r1, r0, #12 + 8000a12: 220e movs r2, #14 + 8000a14: f04f 0b03 mov.w fp, #3 + 8000a18: f362 111f bfi r1, r2, #4, #28 + *dst.get_unchecked_mut(1) = (code >> 6 & 0x3F) as u8 | TAG_CONT; + 8000a1c: f64f 72fe movw r2, #65534 ; 0xfffe + *dst.get_unchecked_mut(0) = (code >> 12 & 0x0F) as u8 | TAG_THREE_B; + 8000a20: f88d 1018 strb.w r1, [sp, #24] + *dst.get_unchecked_mut(1) = (code >> 6 & 0x3F) as u8 | TAG_CONT; + 8000a24: 0981 lsrs r1, r0, #6 + 8000a26: f2c0 32ff movt r2, #1023 ; 0x3ff + 8000a2a: f362 119f bfi r1, r2, #6, #26 + 8000a2e: aa06 add r2, sp, #24 + 8000a30: f042 0301 orr.w r3, r2, #1 + 8000a34: 2202 movs r2, #2 + 8000a36: e019 b.n 8000a6c <core::fmt::Formatter::pad_integral+0x35a> + 8000a38: 2400 movs r4, #0 + 8000a3a: e03e b.n 8000aba <core::fmt::Formatter::pad_integral+0x3a8> + *dst.get_unchecked_mut(0) = (code >> 18 & 0x07) as u8 | TAG_FOUR_B; + 8000a3c: 21f0 movs r1, #240 ; 0xf0 + 8000a3e: 2202 movs r2, #2 + 8000a40: f04f 0b04 mov.w fp, #4 + 8000a44: ea41 4190 orr.w r1, r1, r0, lsr #18 + 8000a48: f88d 1018 strb.w r1, [sp, #24] + *dst.get_unchecked_mut(1) = (code >> 12 & 0x3F) as u8 | TAG_CONT; + 8000a4c: 0b01 lsrs r1, r0, #12 + 8000a4e: f362 119f bfi r1, r2, #6, #26 + *dst.get_unchecked_mut(2) = (code >> 6 & 0x3F) as u8 | TAG_CONT; + 8000a52: f64f 72fe movw r2, #65534 ; 0xfffe + *dst.get_unchecked_mut(1) = (code >> 12 & 0x3F) as u8 | TAG_CONT; + 8000a56: f88d 1019 strb.w r1, [sp, #25] + *dst.get_unchecked_mut(2) = (code >> 6 & 0x3F) as u8 | TAG_CONT; + 8000a5a: 0981 lsrs r1, r0, #6 + 8000a5c: f2c0 32ff movt r2, #1023 ; 0x3ff + 8000a60: f362 119f bfi r1, r2, #6, #26 + 8000a64: aa06 add r2, sp, #24 + 8000a66: f042 0302 orr.w r3, r2, #2 + 8000a6a: 2203 movs r2, #3 + 8000a6c: 7019 strb r1, [r3, #0] + 8000a6e: 2102 movs r1, #2 + 8000a70: f361 109f bfi r0, r1, #6, #26 + 8000a74: a906 add r1, sp, #24 + 8000a76: 5488 strb r0, [r1, r2] + 8000a78: e9d9 4506 ldrd r4, r5, [r9, #24] + 8000a7c: 2000 movs r0, #0 + 8000a7e: f10d 0918 add.w r9, sp, #24 + 8000a82: 4540 cmp r0, r8 + 8000a84: d210 bcs.n 8000aa8 <core::fmt::Formatter::pad_integral+0x396> + 8000a86: 1c46 adds r6, r0, #1 + 8000a88: 4286 cmp r6, r0 + 8000a8a: f04f 0001 mov.w r0, #1 + 8000a8e: bf28 it cs + 8000a90: 2000 movcs r0, #0 + 8000a92: b948 cbnz r0, 8000aa8 <core::fmt::Formatter::pad_integral+0x396> + self.buf.write_str(fill)?; + 8000a94: 68eb ldr r3, [r5, #12] + 8000a96: 4620 mov r0, r4 + 8000a98: 4649 mov r1, r9 + 8000a9a: 465a mov r2, fp + 8000a9c: 4798 blx r3 + 8000a9e: f010 0fff tst.w r0, #255 ; 0xff + 8000aa2: 4630 mov r0, r6 + 8000aa4: d0ed beq.n 8000a82 <core::fmt::Formatter::pad_integral+0x370> + 8000aa6: e007 b.n 8000ab8 <core::fmt::Formatter::pad_integral+0x3a6> + f.buf.write_str(buf) + 8000aa8: 68ee ldr r6, [r5, #12] + 8000aaa: e9dd 1203 ldrd r1, r2, [sp, #12] + 8000aae: 4620 mov r0, r4 + 8000ab0: 47b0 blx r6 + f(self)?; + 8000ab2: f010 0fff tst.w r0, #255 ; 0xff + 8000ab6: d005 beq.n 8000ac4 <core::fmt::Formatter::pad_integral+0x3b2> + 8000ab8: 2401 movs r4, #1 + } + 8000aba: 4620 mov r0, r4 + 8000abc: b007 add sp, #28 + 8000abe: e8bd 0f00 ldmia.w sp!, {r8, r9, sl, fp} + 8000ac2: bdf0 pop {r4, r5, r6, r7, pc} + 8000ac4: 2000 movs r0, #0 + 8000ac6: f10d 0818 add.w r8, sp, #24 + 8000aca: 4550 cmp r0, sl + 8000acc: d20f bcs.n 8000aee <core::fmt::Formatter::pad_integral+0x3dc> + 8000ace: 1c45 adds r5, r0, #1 + 8000ad0: 4285 cmp r5, r0 + 8000ad2: f04f 0001 mov.w r0, #1 + 8000ad6: bf28 it cs + 8000ad8: 2000 movcs r0, #0 + 8000ada: b940 cbnz r0, 8000aee <core::fmt::Formatter::pad_integral+0x3dc> + self.buf.write_str(fill)?; + 8000adc: 4620 mov r0, r4 + 8000ade: 4641 mov r1, r8 + 8000ae0: 465a mov r2, fp + 8000ae2: 47b0 blx r6 + 8000ae4: f010 0fff tst.w r0, #255 ; 0xff + 8000ae8: 4628 mov r0, r5 + 8000aea: d0ee beq.n 8000aca <core::fmt::Formatter::pad_integral+0x3b8> + 8000aec: e7e4 b.n 8000ab8 <core::fmt::Formatter::pad_integral+0x3a6> + 8000aee: 2400 movs r4, #0 + 8000af0: e7e3 b.n 8000aba <core::fmt::Formatter::pad_integral+0x3a8> + +08000af2 <core::panicking::panic>: +pub fn panic(expr_file_line_col: &(&'static str, &'static str, u32, u32)) -> ! { + 8000af2: b580 push {r7, lr} + 8000af4: 466f mov r7, sp + panic_fmt(fmt::Arguments::new_v1(&[expr], &[]), &(file, line, col)) + 8000af6: f7ff fe0b bl 8000710 <core::panicking::panic_fmt> + +08000afa <core::num::bignum::Big32x40::mul_pow2>: + pub fn mul_pow2(&mut self, bits: usize) -> &mut $name { + 8000afa: b5f0 push {r4, r5, r6, r7, lr} + 8000afc: af03 add r7, sp, #12 + 8000afe: e92d 0f00 stmdb sp!, {r8, r9, sl, fp} + 8000b02: b081 sub sp, #4 + assert!(digits < $n); + 8000b04: f5b1 6fa0 cmp.w r1, #1280 ; 0x500 + 8000b08: d273 bcs.n 8000bf2 <core::num::bignum::Big32x40::mul_pow2+0xf8> + for i in (0..self.size).rev() { + 8000b0a: 6806 ldr r6, [r0, #0] + let digits = bits / digitbits; + 8000b0c: ea4f 1c51 mov.w ip, r1, lsr #5 + 8000b10: b186 cbz r6, 8000b34 <core::num::bignum::Big32x40::mul_pow2+0x3a> +// Copyright 2012 The Rust Project Developers. See the COPYRIGHT + 8000b12: eb00 058c add.w r5, r0, ip, lsl #2 + impl Sub for $t { + type Output = $t; + + #[inline] + #[rustc_inherit_overflow_checks] + fn sub(self, other: $t) -> $t { self - other } + 8000b16: 1e72 subs r2, r6, #1 + self.base[i+digits] = self.base[i]; + 8000b18: 2a27 cmp r2, #39 ; 0x27 + 8000b1a: d85e bhi.n 8000bda <core::num::bignum::Big32x40::mul_pow2+0xe0> + &mut (*slice)[self] + 8000b1c: eb0c 0306 add.w r3, ip, r6 + 8000b20: 3b01 subs r3, #1 + 8000b22: 2b28 cmp r3, #40 ; 0x28 + 8000b24: d25d bcs.n 8000be2 <core::num::bignum::Big32x40::mul_pow2+0xe8> + 8000b26: f850 3026 ldr.w r3, [r0, r6, lsl #2] + +#[stable(feature = "rust1", since = "1.0.0")] +impl<A: Step> DoubleEndedIterator for ops::Range<A> { + #[inline] + fn next_back(&mut self) -> Option<A> { + if self.start < self.end { + 8000b2a: 2a00 cmp r2, #0 + 8000b2c: f845 3026 str.w r3, [r5, r6, lsl #2] + 8000b30: 4616 mov r6, r2 + 8000b32: d1f0 bne.n 8000b16 <core::num::bignum::Big32x40::mul_pow2+0x1c> + if self.start < self.end { + 8000b34: f1bc 0f00 cmp.w ip, #0 + 8000b38: d00a beq.n 8000b50 <core::num::bignum::Big32x40::mul_pow2+0x56> +// Copyright 2013-2016 The Rust Project Developers. See the COPYRIGHT + 8000b3a: 1d03 adds r3, r0, #4 + 8000b3c: 2600 movs r6, #0 + 8000b3e: 2200 movs r2, #0 + self.base[i] = 0; + 8000b40: 2a27 cmp r2, #39 ; 0x27 + 8000b42: d84a bhi.n 8000bda <core::num::bignum::Big32x40::mul_pow2+0xe0> + 8000b44: 1c55 adds r5, r2, #1 + 8000b46: f843 6022 str.w r6, [r3, r2, lsl #2] + if self.start < self.end { + 8000b4a: 4565 cmp r5, ip + 8000b4c: 462a mov r2, r5 + 8000b4e: d3f7 bcc.n 8000b40 <core::num::bignum::Big32x40::mul_pow2+0x46> + let mut sz = self.size + digits; + 8000b50: 6802 ldr r2, [r0, #0] + let bits = bits % digitbits; + 8000b52: f011 081f ands.w r8, r1, #31 + let mut sz = self.size + digits; + 8000b56: 4462 add r2, ip + 8000b58: d016 beq.n 8000b88 <core::num::bignum::Big32x40::mul_pow2+0x8e> + let overflow = self.base[last-1] >> (digitbits - bits); + 8000b5a: f1a2 0e01 sub.w lr, r2, #1 + &(*slice)[self] + 8000b5e: f1be 0f28 cmp.w lr, #40 ; 0x28 + 8000b62: d24c bcs.n 8000bfe <core::num::bignum::Big32x40::mul_pow2+0x104> + 8000b64: eb00 038e add.w r3, r0, lr, lsl #2 + 8000b68: 4249 negs r1, r1 + 8000b6a: f8d3 b004 ldr.w fp, [r3, #4] + 8000b6e: f001 091f and.w r9, r1, #31 + 8000b72: fa3b f109 lsrs.w r1, fp, r9 + 8000b76: d009 beq.n 8000b8c <core::num::bignum::Big32x40::mul_pow2+0x92> + self.base[last] = overflow; + 8000b78: 2a27 cmp r2, #39 ; 0x27 + 8000b7a: d82e bhi.n 8000bda <core::num::bignum::Big32x40::mul_pow2+0xe0> + 8000b7c: eb00 0682 add.w r6, r0, r2, lsl #2 + sz += 1; + 8000b80: f102 0e01 add.w lr, r2, #1 + self.base[last] = overflow; + 8000b84: 6071 str r1, [r6, #4] + 8000b86: e002 b.n 8000b8e <core::num::bignum::Big32x40::mul_pow2+0x94> + 8000b88: 4696 mov lr, r2 + 8000b8a: e020 b.n 8000bce <core::num::bignum::Big32x40::mul_pow2+0xd4> + 8000b8c: 4696 mov lr, r2 + for i in (digits+1..last).rev() { + 8000b8e: f10c 0a01 add.w sl, ip, #1 + if self.start < self.end { + 8000b92: 4592 cmp sl, r2 + 8000b94: d215 bcs.n 8000bc2 <core::num::bignum::Big32x40::mul_pow2+0xc8> +// Copyright 2012 The Rust Project Developers. See the COPYRIGHT + 8000b96: eb00 0682 add.w r6, r0, r2, lsl #2 + 8000b9a: 1e91 subs r1, r2, #2 + self.base[i] = (self.base[i] << bits) | + 8000b9c: 1c4a adds r2, r1, #1 + 8000b9e: 2a27 cmp r2, #39 ; 0x27 + 8000ba0: d81b bhi.n 8000bda <core::num::bignum::Big32x40::mul_pow2+0xe0> + 8000ba2: 2928 cmp r1, #40 ; 0x28 + 8000ba4: d221 bcs.n 8000bea <core::num::bignum::Big32x40::mul_pow2+0xf0> + (self.base[i-1] >> (digitbits - bits)); + 8000ba6: 4635 mov r5, r6 + self.base[i] = (self.base[i] << bits) | + 8000ba8: fa0b f308 lsl.w r3, fp, r8 + #[inline] + fn partial_cmp(&self, other: &$t) -> Option<Ordering> { + Some(self.cmp(other)) + } + #[inline] + fn lt(&self, other: &$t) -> bool { (*self) < (*other) } + 8000bac: 3901 subs r1, #1 + 8000bae: 4592 cmp sl, r2 + (self.base[i-1] >> (digitbits - bits)); + 8000bb0: f855 bd04 ldr.w fp, [r5, #-4]! + 8000bb4: fa2b f409 lsr.w r4, fp, r9 + self.base[i] = (self.base[i] << bits) | + 8000bb8: ea43 0304 orr.w r3, r3, r4 + 8000bbc: 6033 str r3, [r6, #0] + 8000bbe: 462e mov r6, r5 + 8000bc0: d3ec bcc.n 8000b9c <core::num::bignum::Big32x40::mul_pow2+0xa2> + self.base[digits] <<= bits; + 8000bc2: eb00 018c add.w r1, r0, ip, lsl #2 + 8000bc6: 684a ldr r2, [r1, #4] + 8000bc8: fa02 f208 lsl.w r2, r2, r8 + 8000bcc: 604a str r2, [r1, #4] + self.size = sz; + 8000bce: f8c0 e000 str.w lr, [r0] + } + 8000bd2: b001 add sp, #4 + 8000bd4: e8bd 0f00 ldmia.w sp!, {r8, r9, sl, fp} + 8000bd8: bdf0 pop {r4, r5, r6, r7, pc} + 8000bda: 4610 mov r0, r2 + 8000bdc: 2128 movs r1, #40 ; 0x28 + 8000bde: f7ff fcb2 bl 8000546 <core::panicking::panic_bounds_check> + &mut (*slice)[self] + 8000be2: 4618 mov r0, r3 + 8000be4: 2128 movs r1, #40 ; 0x28 + 8000be6: f7ff fcae bl 8000546 <core::panicking::panic_bounds_check> + &(*slice)[self] + 8000bea: 4608 mov r0, r1 + 8000bec: 2128 movs r1, #40 ; 0x28 + 8000bee: f7ff fcaa bl 8000546 <core::panicking::panic_bounds_check> + assert!(digits < $n); + 8000bf2: f244 604c movw r0, #17996 ; 0x464c + 8000bf6: f6c0 0000 movt r0, #2048 ; 0x800 + 8000bfa: f7ff ff7a bl 8000af2 <core::panicking::panic> + 8000bfe: 4670 mov r0, lr + 8000c00: 2128 movs r1, #40 ; 0x28 + 8000c02: f7ff fca0 bl 8000546 <core::panicking::panic_bounds_check> + +08000c06 <core::num::flt2dec::round_up>: +pub const MAX_SIG_DIGITS: usize = 17; + +/// When `d[..n]` contains decimal digits, increase the last digit and propagate carry. +/// Returns a next digit when it causes the length change. +#[doc(hidden)] +pub fn round_up(d: &mut [u8], n: usize) -> Option<u8> { + 8000c06: b5d0 push {r4, r6, r7, lr} + 8000c08: af02 add r7, sp, #8 + } else if self.end > slice.len() { + 8000c0a: 428a cmp r2, r1 + 8000c0c: d86f bhi.n 8000cee <core::num::flt2dec::round_up+0xe8> + 8000c0e: 4694 mov ip, r2 + fn rsearch_while<Acc, G>(&mut self, default: Acc, mut g: G) -> Acc + where Self: Sized, + G: FnMut($elem) -> SearchWhile<Acc> + { + unsafe { + while ptrdistance(self.ptr, self.end) >= 4 { + 8000c10: f1bc 0f03 cmp.w ip, #3 + 8000c14: d914 bls.n 8000c40 <core::num::flt2dec::round_up+0x3a> + let diff = (other as isize).wrapping_sub(self as isize); + 8000c16: eb00 0e0c add.w lr, r0, ip + 8000c1a: f81e 3c01 ldrb.w r3, [lr, #-1] + if predicate(elt) { + 8000c1e: 2b39 cmp r3, #57 ; 0x39 + 8000c20: d11a bne.n 8000c58 <core::num::flt2dec::round_up+0x52> + 8000c22: f81e 3c02 ldrb.w r3, [lr, #-2] + 8000c26: 2b39 cmp r3, #57 ; 0x39 + 8000c28: d11b bne.n 8000c62 <core::num::flt2dec::round_up+0x5c> + 8000c2a: f81e 3c03 ldrb.w r3, [lr, #-3] + 8000c2e: 2b39 cmp r3, #57 ; 0x39 + 8000c30: d11c bne.n 8000c6c <core::num::flt2dec::round_up+0x66> + 8000c32: f81e 3c04 ldrb.w r3, [lr, #-4] + index -= 1; + 8000c36: f1ac 0c04 sub.w ip, ip, #4 + if predicate(elt) { + 8000c3a: 2b39 cmp r3, #57 ; 0x39 + 8000c3c: d0e8 beq.n 8000c10 <core::num::flt2dec::round_up+0xa> + 8000c3e: e017 b.n 8000c70 <core::num::flt2dec::round_up+0x6a> + search_while!(g($mkref!(self.end.pre_dec()))); + search_while!(g($mkref!(self.end.pre_dec()))); + search_while!(g($mkref!(self.end.pre_dec()))); + search_while!(g($mkref!(self.end.pre_dec()))); + } + while self.ptr != self.end { + 8000c40: f1bc 0f00 cmp.w ip, #0 + 8000c44: d034 beq.n 8000cb0 <core::num::flt2dec::round_up+0xaa> + 8000c46: eb00 030c add.w r3, r0, ip + index -= 1; + 8000c4a: f1ac 0c01 sub.w ip, ip, #1 + 8000c4e: f813 3c01 ldrb.w r3, [r3, #-1] + if predicate(elt) { + 8000c52: 2b39 cmp r3, #57 ; 0x39 + 8000c54: d0f4 beq.n 8000c40 <core::num::flt2dec::round_up+0x3a> + 8000c56: e00b b.n 8000c70 <core::num::flt2dec::round_up+0x6a> + index -= 1; + 8000c58: f1ac 0c01 sub.w ip, ip, #1 + match d[..n].iter().rposition(|&c| c != b'9') { + Some(i) => { // d[i+1..n] is all nines + d[i] += 1; + 8000c5c: 458c cmp ip, r1 + 8000c5e: d309 bcc.n 8000c74 <core::num::flt2dec::round_up+0x6e> + 8000c60: e048 b.n 8000cf4 <core::num::flt2dec::round_up+0xee> + 8000c62: f1ac 0c02 sub.w ip, ip, #2 + 8000c66: 458c cmp ip, r1 + 8000c68: d304 bcc.n 8000c74 <core::num::flt2dec::round_up+0x6e> + 8000c6a: e043 b.n 8000cf4 <core::num::flt2dec::round_up+0xee> + 8000c6c: f1ac 0c03 sub.w ip, ip, #3 + 8000c70: 458c cmp ip, r1 + 8000c72: d23f bcs.n 8000cf4 <core::num::flt2dec::round_up+0xee> + 8000c74: f810 300c ldrb.w r3, [r0, ip] + for j in i+1..n { d[j] = b'0'; } + 8000c78: f10c 0e01 add.w lr, ip, #1 + if self.start < self.end { + 8000c7c: 4596 cmp lr, r2 + d[i] += 1; + 8000c7e: f103 0301 add.w r3, r3, #1 + 8000c82: f800 300c strb.w r3, [r0, ip] + 8000c86: d20f bcs.n 8000ca8 <core::num::flt2dec::round_up+0xa2> + 8000c88: f04f 0c30 mov.w ip, #48 ; 0x30 + 8000c8c: f10e 0301 add.w r3, lr, #1 + 8000c90: 2401 movs r4, #1 + 8000c92: 4573 cmp r3, lr + 8000c94: bf28 it cs + 8000c96: 2400 movcs r4, #0 + 8000c98: b934 cbnz r4, 8000ca8 <core::num::flt2dec::round_up+0xa2> + for j in i+1..n { d[j] = b'0'; } + 8000c9a: 458e cmp lr, r1 + 8000c9c: d221 bcs.n 8000ce2 <core::num::flt2dec::round_up+0xdc> + 8000c9e: f800 c00e strb.w ip, [r0, lr] + 8000ca2: 4293 cmp r3, r2 + 8000ca4: 469e mov lr, r3 + 8000ca6: d3f1 bcc.n 8000c8c <core::num::flt2dec::round_up+0x86> + 8000ca8: 2000 movs r0, #0 + 8000caa: 2100 movs r1, #0 + } + None => { // an empty buffer rounds up (a bit strange but reasonable) + Some(b'1') + } + } +} + 8000cac: 4308 orrs r0, r1 + 8000cae: bdd0 pop {r4, r6, r7, pc} + 8000cb0: b192 cbz r2, 8000cd8 <core::num::flt2dec::round_up+0xd2> + 8000cb2: b311 cbz r1, 8000cfa <core::num::flt2dec::round_up+0xf4> + d[0] = b'1'; + 8000cb4: 2331 movs r3, #49 ; 0x31 + 8000cb6: 2a02 cmp r2, #2 + 8000cb8: 7003 strb r3, [r0, #0] + 8000cba: d30a bcc.n 8000cd2 <core::num::flt2dec::round_up+0xcc> + 8000cbc: 2301 movs r3, #1 + 8000cbe: f04f 0c30 mov.w ip, #48 ; 0x30 + for j in 1..n { d[j] = b'0'; } + 8000cc2: 428b cmp r3, r1 + 8000cc4: d210 bcs.n 8000ce8 <core::num::flt2dec::round_up+0xe2> + 8000cc6: 1c5c adds r4, r3, #1 + 8000cc8: f800 c003 strb.w ip, [r0, r3] + 8000ccc: 4294 cmp r4, r2 + 8000cce: 4623 mov r3, r4 + 8000cd0: d3f7 bcc.n 8000cc2 <core::num::flt2dec::round_up+0xbc> + 8000cd2: f44f 5140 mov.w r1, #12288 ; 0x3000 + 8000cd6: e001 b.n 8000cdc <core::num::flt2dec::round_up+0xd6> + 8000cd8: f44f 5144 mov.w r1, #12544 ; 0x3100 + 8000cdc: 2001 movs r0, #1 +} + 8000cde: 4308 orrs r0, r1 + 8000ce0: bdd0 pop {r4, r6, r7, pc} + for j in i+1..n { d[j] = b'0'; } + 8000ce2: 4670 mov r0, lr + 8000ce4: f7ff fc2f bl 8000546 <core::panicking::panic_bounds_check> + for j in 1..n { d[j] = b'0'; } + 8000ce8: 4618 mov r0, r3 + 8000cea: f7ff fc2c bl 8000546 <core::panicking::panic_bounds_check> + slice_index_len_fail(self.end, slice.len()); + 8000cee: 4610 mov r0, r2 + 8000cf0: f7ff fc25 bl 800053e <core::slice::slice_index_len_fail> + d[i] += 1; + 8000cf4: 4660 mov r0, ip + 8000cf6: f7ff fc26 bl 8000546 <core::panicking::panic_bounds_check> + d[0] = b'1'; + 8000cfa: 2000 movs r0, #0 + 8000cfc: 2100 movs r1, #0 + 8000cfe: f7ff fc22 bl 8000546 <core::panicking::panic_bounds_check> + +08000d02 <core::fmt::write>: +pub fn write(output: &mut Write, args: Arguments) -> Result { + 8000d02: b5f0 push {r4, r5, r6, r7, lr} + 8000d04: af03 add r7, sp, #12 + 8000d06: e92d 0f00 stmdb sp!, {r8, r9, sl, fp} + 8000d0a: b08f sub sp, #60 ; 0x3c + 8000d0c: e9d2 5e00 ldrd r5, lr, [r2] + 8000d10: e9d2 6c02 ldrd r6, ip, [r2, #8] + 8000d14: e9d2 4204 ldrd r4, r2, [r2, #16] + 8000d18: f04f 0800 mov.w r8, #0 + let mut formatter = Formatter { + 8000d1c: 2320 movs r3, #32 + 8000d1e: f8cd 8008 str.w r8, [sp, #8] + 8000d22: 9303 str r3, [sp, #12] + 8000d24: 2303 movs r3, #3 + 8000d26: f88d 3038 strb.w r3, [sp, #56] ; 0x38 + 8000d2a: ab08 add r3, sp, #32 + 8000d2c: f8cd 8010 str.w r8, [sp, #16] + 8000d30: f8cd 8018 str.w r8, [sp, #24] + 8000d34: c313 stmia r3!, {r0, r1, r4} + intrinsics::offset(self, count) + 8000d36: eb04 08c2 add.w r8, r4, r2, lsl #3 + None => { + 8000d3a: 2e00 cmp r6, #0 + 8000d3c: eb05 00ce add.w r0, r5, lr, lsl #3 + let mut formatter = Formatter { + 8000d40: e9cd 840b strd r8, r4, [sp, #44] ; 0x2c + 8000d44: 920d str r2, [sp, #52] ; 0x34 + None => { + 8000d46: 9001 str r0, [sp, #4] + 8000d48: f000 80ab beq.w 8000ea2 <core::fmt::write+0x1a0> + 8000d4c: a802 add r0, sp, #8 + for (arg, piece) in fmt.iter().zip(pieces.by_ref()) { + 8000d4e: f106 0a04 add.w sl, r6, #4 + 8000d52: ea4f 04ce mov.w r4, lr, lsl #3 + 8000d56: f100 0b10 add.w fp, r0, #16 + 8000d5a: f100 0808 add.w r8, r0, #8 + 8000d5e: eb0c 00cc add.w r0, ip, ip, lsl #3 + 8000d62: ea4f 0980 mov.w r9, r0, lsl #2 + if self.ptr == self.end { + 8000d66: f1b9 0f00 cmp.w r9, #0 + 8000d6a: f000 80b7 beq.w 8000edc <core::fmt::write+0x1da> + 8000d6e: 2c00 cmp r4, #0 + 8000d70: f000 80b6 beq.w 8000ee0 <core::fmt::write+0x1de> + formatter.buf.write_str(*piece)?; + 8000d74: e9d5 1200 ldrd r1, r2, [r5] + 8000d78: e9dd 0308 ldrd r0, r3, [sp, #32] + 8000d7c: 68db ldr r3, [r3, #12] + 8000d7e: 4798 blx r3 + 8000d80: f010 0fff tst.w r0, #255 ; 0xff + 8000d84: f040 80bb bne.w 8000efe <core::fmt::write+0x1fc> + self.fill = arg.format.fill; + 8000d88: 68b0 ldr r0, [r6, #8] + 8000d8a: 9003 str r0, [sp, #12] + self.align = arg.format.align; + 8000d8c: f896 0020 ldrb.w r0, [r6, #32] + 8000d90: f88d 0038 strb.w r0, [sp, #56] ; 0x38 + self.flags = arg.format.flags; + 8000d94: 68f0 ldr r0, [r6, #12] + 8000d96: 9002 str r0, [sp, #8] + 8000d98: e9d6 1006 ldrd r1, r0, [r6, #24] + rt::v1::Count::Is(n) => Some(n), + 8000d9c: f011 0103 ands.w r1, r1, #3 + 8000da0: d024 beq.n 8000dec <core::fmt::write+0xea> + 8000da2: 2901 cmp r1, #1 + 8000da4: d011 beq.n 8000dca <core::fmt::write+0xc8> + 8000da6: 2902 cmp r1, #2 + 8000da8: d123 bne.n 8000df2 <core::fmt::write+0xf0> + assume(!self.ptr.is_null()); + 8000daa: e9dd 010a ldrd r0, r1, [sp, #40] ; 0x28 + if self.ptr == self.end { + 8000dae: 4288 cmp r0, r1 + 8000db0: d01f beq.n 8000df2 <core::fmt::write+0xf0> + 8000db2: f100 0108 add.w r1, r0, #8 + if self.formatter as usize == ArgumentV1::show_usize as usize { + 8000db6: f640 7225 movw r2, #3877 ; 0xf25 + + /// Increments `self` by 1, but returns the old value. + #[inline(always)] + unsafe fn post_inc(&mut self) -> Self { + let current = *self; + *self = self.slice_offset(1); + 8000dba: 910a str r1, [sp, #40] ; 0x28 + 8000dbc: f6c0 0200 movt r2, #2048 ; 0x800 + 8000dc0: 6841 ldr r1, [r0, #4] + 8000dc2: 4291 cmp r1, r2 + 8000dc4: d115 bne.n 8000df2 <core::fmt::write+0xf0> + Some(unsafe { *(self.value as *const _ as *const usize) }) + 8000dc6: 6800 ldr r0, [r0, #0] + 8000dc8: e00f b.n 8000dea <core::fmt::write+0xe8> + self.args[i].as_usize() + 8000dca: 990d ldr r1, [sp, #52] ; 0x34 + 8000dcc: 4281 cmp r1, r0 + 8000dce: f240 80a5 bls.w 8000f1c <core::fmt::write+0x21a> + 8000dd2: 990c ldr r1, [sp, #48] ; 0x30 + if self.formatter as usize == ArgumentV1::show_usize as usize { + 8000dd4: f640 7325 movw r3, #3877 ; 0xf25 + 8000dd8: f6c0 0300 movt r3, #2048 ; 0x800 + 8000ddc: eb01 02c0 add.w r2, r1, r0, lsl #3 + 8000de0: 6852 ldr r2, [r2, #4] + 8000de2: 429a cmp r2, r3 + 8000de4: d105 bne.n 8000df2 <core::fmt::write+0xf0> + Some(unsafe { *(self.value as *const _ as *const usize) }) + 8000de6: f851 0030 ldr.w r0, [r1, r0, lsl #3] + 8000dea: 6800 ldr r0, [r0, #0] + 8000dec: 2200 movs r2, #0 + 8000dee: 2101 movs r1, #1 + 8000df0: e001 b.n 8000df6 <core::fmt::write+0xf4> + 8000df2: 2100 movs r1, #0 + 8000df4: 2200 movs r2, #0 + self.width = self.getcount(&arg.format.width); + 8000df6: 4310 orrs r0, r2 + 8000df8: e9c8 1000 strd r1, r0, [r8] + 8000dfc: e9d6 1004 ldrd r1, r0, [r6, #16] + rt::v1::Count::Is(n) => Some(n), + 8000e00: f011 0103 ands.w r1, r1, #3 + 8000e04: d023 beq.n 8000e4e <core::fmt::write+0x14c> + 8000e06: 2901 cmp r1, #1 + 8000e08: d011 beq.n 8000e2e <core::fmt::write+0x12c> + 8000e0a: 2902 cmp r1, #2 + 8000e0c: d122 bne.n 8000e54 <core::fmt::write+0x152> + assume(!self.ptr.is_null()); + 8000e0e: e9dd 010a ldrd r0, r1, [sp, #40] ; 0x28 + if self.ptr == self.end { + 8000e12: 4288 cmp r0, r1 + 8000e14: d01e beq.n 8000e54 <core::fmt::write+0x152> + 8000e16: f100 0108 add.w r1, r0, #8 + if self.formatter as usize == ArgumentV1::show_usize as usize { + 8000e1a: f640 7225 movw r2, #3877 ; 0xf25 + *self = self.slice_offset(1); + 8000e1e: 910a str r1, [sp, #40] ; 0x28 + 8000e20: f6c0 0200 movt r2, #2048 ; 0x800 + 8000e24: 6841 ldr r1, [r0, #4] + 8000e26: 4291 cmp r1, r2 + 8000e28: d114 bne.n 8000e54 <core::fmt::write+0x152> + Some(unsafe { *(self.value as *const _ as *const usize) }) + 8000e2a: 6800 ldr r0, [r0, #0] + 8000e2c: e00e b.n 8000e4c <core::fmt::write+0x14a> + self.args[i].as_usize() + 8000e2e: 990d ldr r1, [sp, #52] ; 0x34 + 8000e30: 4281 cmp r1, r0 + 8000e32: d975 bls.n 8000f20 <core::fmt::write+0x21e> + 8000e34: 990c ldr r1, [sp, #48] ; 0x30 + if self.formatter as usize == ArgumentV1::show_usize as usize { + 8000e36: f640 7325 movw r3, #3877 ; 0xf25 + 8000e3a: f6c0 0300 movt r3, #2048 ; 0x800 + 8000e3e: eb01 02c0 add.w r2, r1, r0, lsl #3 + 8000e42: 6852 ldr r2, [r2, #4] + 8000e44: 429a cmp r2, r3 + 8000e46: d105 bne.n 8000e54 <core::fmt::write+0x152> + Some(unsafe { *(self.value as *const _ as *const usize) }) + 8000e48: f851 0030 ldr.w r0, [r1, r0, lsl #3] + 8000e4c: 6800 ldr r0, [r0, #0] + 8000e4e: 2200 movs r2, #0 + 8000e50: 2101 movs r1, #1 + 8000e52: e001 b.n 8000e58 <core::fmt::write+0x156> + 8000e54: 2100 movs r1, #0 + 8000e56: 2200 movs r2, #0 + self.precision = self.getcount(&arg.format.precision); + 8000e58: 4310 orrs r0, r2 + 8000e5a: e9cb 1000 strd r1, r0, [fp] + rt::v1::Position::Next => { *self.curarg.next().unwrap() } + 8000e5e: 6830 ldr r0, [r6, #0] + 8000e60: b140 cbz r0, 8000e74 <core::fmt::write+0x172> + rt::v1::Position::At(i) => self.args[i], + 8000e62: f8da 0000 ldr.w r0, [sl] + 8000e66: 990d ldr r1, [sp, #52] ; 0x34 + 8000e68: 4288 cmp r0, r1 + 8000e6a: d24f bcs.n 8000f0c <core::fmt::write+0x20a> + 8000e6c: 990c ldr r1, [sp, #48] ; 0x30 + 8000e6e: eb01 01c0 add.w r1, r1, r0, lsl #3 + 8000e72: e006 b.n 8000e82 <core::fmt::write+0x180> + assume(!self.ptr.is_null()); + 8000e74: e9dd 100a ldrd r1, r0, [sp, #40] ; 0x28 + if self.ptr == self.end { + 8000e78: 4281 cmp r1, r0 + 8000e7a: d049 beq.n 8000f10 <core::fmt::write+0x20e> + 8000e7c: f101 0008 add.w r0, r1, #8 + *self = self.slice_offset(1); + 8000e80: 900a str r0, [sp, #40] ; 0x28 + 8000e82: e9d1 0200 ldrd r0, r2, [r1] + (value.formatter)(value.value, self) + 8000e86: a902 add r1, sp, #8 + 8000e88: 3624 adds r6, #36 ; 0x24 + 8000e8a: 3508 adds r5, #8 + 8000e8c: 4790 blx r2 + formatter.run(arg)?; + 8000e8e: f1a9 0924 sub.w r9, r9, #36 ; 0x24 + 8000e92: f10a 0a24 add.w sl, sl, #36 ; 0x24 + 8000e96: 3c08 subs r4, #8 + 8000e98: f010 0fff tst.w r0, #255 ; 0xff + 8000e9c: f43f af63 beq.w 8000d66 <core::fmt::write+0x64> + 8000ea0: e02d b.n 8000efe <core::fmt::write+0x1fc> + for (arg, piece) in args.args.iter().zip(pieces.by_ref()) { + 8000ea2: ea4f 06ce mov.w r6, lr, lsl #3 + 8000ea6: f10d 0908 add.w r9, sp, #8 + if self.ptr == self.end { + 8000eaa: 4544 cmp r4, r8 + 8000eac: d016 beq.n 8000edc <core::fmt::write+0x1da> + 8000eae: b1be cbz r6, 8000ee0 <core::fmt::write+0x1de> + formatter.buf.write_str(*piece)?; + 8000eb0: e9d5 1200 ldrd r1, r2, [r5] + 8000eb4: e9dd 0308 ldrd r0, r3, [sp, #32] + 8000eb8: 68db ldr r3, [r3, #12] + 8000eba: 4798 blx r3 + 8000ebc: f010 0fff tst.w r0, #255 ; 0xff + 8000ec0: d11d bne.n 8000efe <core::fmt::write+0x1fc> + (arg.formatter)(arg.value, &mut formatter)?; + 8000ec2: e9d4 0200 ldrd r0, r2, [r4] + 8000ec6: 4649 mov r1, r9 + 8000ec8: f104 0a08 add.w sl, r4, #8 + 8000ecc: 4790 blx r2 + 8000ece: 3e08 subs r6, #8 + 8000ed0: 3508 adds r5, #8 + 8000ed2: f010 0fff tst.w r0, #255 ; 0xff + 8000ed6: 4654 mov r4, sl + 8000ed8: d0e7 beq.n 8000eaa <core::fmt::write+0x1a8> + 8000eda: e010 b.n 8000efe <core::fmt::write+0x1fc> + 8000edc: 9801 ldr r0, [sp, #4] + 8000ede: e001 b.n 8000ee4 <core::fmt::write+0x1e2> + 8000ee0: 9801 ldr r0, [sp, #4] + 8000ee2: 4605 mov r5, r0 + 8000ee4: 4285 cmp r5, r0 + 8000ee6: bf18 it ne + 8000ee8: 2d00 cmpne r5, #0 + 8000eea: d00a beq.n 8000f02 <core::fmt::write+0x200> + formatter.buf.write_str(*piece)?; + 8000eec: e9d5 1200 ldrd r1, r2, [r5] + 8000ef0: e9dd 0308 ldrd r0, r3, [sp, #32] + 8000ef4: 68db ldr r3, [r3, #12] + 8000ef6: 4798 blx r3 + 8000ef8: f010 0fff tst.w r0, #255 ; 0xff + 8000efc: d001 beq.n 8000f02 <core::fmt::write+0x200> + 8000efe: 2001 movs r0, #1 + 8000f00: e000 b.n 8000f04 <core::fmt::write+0x202> + 8000f02: 2000 movs r0, #0 +} + 8000f04: b00f add sp, #60 ; 0x3c + 8000f06: e8bd 0f00 ldmia.w sp!, {r8, r9, sl, fp} + 8000f0a: bdf0 pop {r4, r5, r6, r7, pc} + rt::v1::Position::At(i) => self.args[i], + 8000f0c: f7ff fb1b bl 8000546 <core::panicking::panic_bounds_check> + #[inline] + #[stable(feature = "rust1", since = "1.0.0")] + pub fn unwrap(self) -> T { + match self { + Some(val) => val, + None => panic!("called `Option::unwrap()` on a `None` value"), + 8000f10: f644 20b4 movw r0, #19124 ; 0x4ab4 + 8000f14: f6c0 0000 movt r0, #2048 ; 0x800 + 8000f18: f7ff fdeb bl 8000af2 <core::panicking::panic> + self.args[i].as_usize() + 8000f1c: f7ff fb13 bl 8000546 <core::panicking::panic_bounds_check> + 8000f20: f7ff fb11 bl 8000546 <core::panicking::panic_bounds_check> + +08000f24 <core::fmt::ArgumentV1::show_usize>: + fn show_usize(x: &usize, f: &mut Formatter) -> Result { + 8000f24: b5f0 push {r4, r5, r6, r7, lr} + 8000f26: af03 add r7, sp, #12 + 8000f28: e92d 0f00 stmdb sp!, {r8, r9, sl, fp} + 8000f2c: b08b sub sp, #44 ; 0x2c + ($($t:ident)*) => ($(impl Int for $t { + fn zero() -> $t { 0 } + fn from_u8(u: u8) -> $t { u as $t } + fn to_u8(&self) -> u8 { *self as u8 } + fn to_u16(&self) -> u16 { *self as u16 } + fn to_u32(&self) -> u32 { *self as u32 } + 8000f2e: 6804 ldr r4, [r0, #0] + let buf_ptr = buf.as_mut_ptr(); + let lut_ptr = DEC_DIGITS_LUT.as_ptr(); + + unsafe { + // need at least 16 bits for the 4-characters-at-a-time to work. + if ::mem::size_of::<$t>() >= 2 { + 8000f30: f242 7c10 movw ip, #10000 ; 0x2710 + 8000f34: 4564 cmp r4, ip + 8000f36: d339 bcc.n 8000fac <core::fmt::ArgumentV1::show_usize+0x88> + 8000f38: f241 7859 movw r8, #5977 ; 0x1759 + 8000f3c: f248 591f movw r9, #34079 ; 0x851f + 8000f40: f244 3ed0 movw lr, #17360 ; 0x43d0 + 8000f44: f24e 0bff movw fp, #57599 ; 0xe0ff + 8000f48: 2300 movs r3, #0 + 8000f4a: f04f 0a64 mov.w sl, #100 ; 0x64 + 8000f4e: 9100 str r1, [sp, #0] + 8000f50: f2cd 18b7 movt r8, #53687 ; 0xd1b7 + 8000f54: f2c5 19eb movt r9, #20971 ; 0x51eb + 8000f58: f6c0 0e00 movt lr, #2048 ; 0x800 + 8000f5c: f2c0 5bf5 movt fp, #1525 ; 0x5f5 + n /= 10000; + + let d1 = (rem / 100) << 1; + let d2 = (rem % 100) << 1; + curr -= 4; + ptr::copy_nonoverlapping(lut_ptr.offset(d1), buf_ptr.offset(curr), 2); + 8000f60: f1a7 0043 sub.w r0, r7, #67 ; 0x43 + while n >= 10000 { + 8000f64: 455c cmp r4, fp + ptr::copy_nonoverlapping(lut_ptr.offset(d1), buf_ptr.offset(curr), 2); + 8000f66: eb00 0603 add.w r6, r0, r3 + let rem = (n % 10000) as isize; + 8000f6a: fba4 0208 umull r0, r2, r4, r8 + while n >= 10000 { + 8000f6e: f1a3 0304 sub.w r3, r3, #4 + n /= 10000; + 8000f72: ea4f 3052 mov.w r0, r2, lsr #13 + let rem = (n % 10000) as isize; + 8000f76: fb00 421c mls r2, r0, ip, r4 + 8000f7a: 4604 mov r4, r0 + let d1 = (rem / 100) << 1; + 8000f7c: fba2 c109 umull ip, r1, r2, r9 + 8000f80: ea4f 1151 mov.w r1, r1, lsr #5 + if ::mem::size_of::<$t>() >= 2 { + 8000f84: f242 7c10 movw ip, #10000 ; 0x2710 + ptr::copy_nonoverlapping(lut_ptr.offset(d1), buf_ptr.offset(curr), 2); + 8000f88: f83e 5011 ldrh.w r5, [lr, r1, lsl #1] + let d2 = (rem % 100) << 1; + 8000f8c: fb01 211a mls r1, r1, sl, r2 + ptr::copy_nonoverlapping(lut_ptr.offset(d2), buf_ptr.offset(curr + 2), 2); + 8000f90: f83e 1011 ldrh.w r1, [lr, r1, lsl #1] + ptr::copy_nonoverlapping(lut_ptr.offset(d1), buf_ptr.offset(curr), 2); + 8000f94: f8a6 5023 strh.w r5, [r6, #35] ; 0x23 + ptr::copy_nonoverlapping(lut_ptr.offset(d2), buf_ptr.offset(curr + 2), 2); + 8000f98: f8a6 1025 strh.w r1, [r6, #37] ; 0x25 + while n >= 10000 { + 8000f9c: d8e0 bhi.n 8000f60 <core::fmt::ArgumentV1::show_usize+0x3c> + 8000f9e: 9900 ldr r1, [sp, #0] + let mut curr = buf.len() as isize; + 8000fa0: f103 0227 add.w r2, r3, #39 ; 0x27 + 8000fa4: 4604 mov r4, r0 + + // if we reach here numbers are <= 9999, so at most 4 chars long + let mut n = n as isize; // possibly reduce 64bit math + + // decode 2 more chars, if > 2 chars + if n >= 100 { + 8000fa6: 2c64 cmp r4, #100 ; 0x64 + 8000fa8: da03 bge.n 8000fb2 <core::fmt::ArgumentV1::show_usize+0x8e> + 8000faa: e019 b.n 8000fe0 <core::fmt::ArgumentV1::show_usize+0xbc> + 8000fac: 2227 movs r2, #39 ; 0x27 + 8000fae: 2c64 cmp r4, #100 ; 0x64 + 8000fb0: db16 blt.n 8000fe0 <core::fmt::ArgumentV1::show_usize+0xbc> + 8000fb2: f248 501f movw r0, #34079 ; 0x851f + 8000fb6: f244 36d0 movw r6, #17360 ; 0x43d0 + let d1 = (n % 100) << 1; + n /= 100; + curr -= 2; + 8000fba: 3a02 subs r2, #2 + 8000fbc: f2c5 10eb movt r0, #20971 ; 0x51eb + 8000fc0: f6c0 0600 movt r6, #2048 ; 0x800 + 8000fc4: fba4 0300 umull r0, r3, r4, r0 + 8000fc8: 095b lsrs r3, r3, #5 + 8000fca: 2064 movs r0, #100 ; 0x64 + 8000fcc: fb03 4010 mls r0, r3, r0, r4 + ptr::copy_nonoverlapping(lut_ptr.offset(d1), buf_ptr.offset(curr), 2); + 8000fd0: f836 0010 ldrh.w r0, [r6, r0, lsl #1] + 8000fd4: f1a7 0643 sub.w r6, r7, #67 ; 0x43 + 8000fd8: 52b0 strh r0, [r6, r2] + } + + // decode last 1 or 2 chars + if n < 10 { + 8000fda: 2b09 cmp r3, #9 + 8000fdc: dd03 ble.n 8000fe6 <core::fmt::ArgumentV1::show_usize+0xc2> + 8000fde: e008 b.n 8000ff2 <core::fmt::ArgumentV1::show_usize+0xce> + 8000fe0: 4623 mov r3, r4 + 8000fe2: 2b09 cmp r3, #9 + 8000fe4: dc05 bgt.n 8000ff2 <core::fmt::ArgumentV1::show_usize+0xce> + curr -= 1; + 8000fe6: 1e50 subs r0, r2, #1 + *buf_ptr.offset(curr) = (n as u8) + b'0'; + 8000fe8: 3330 adds r3, #48 ; 0x30 + 8000fea: f1a7 0243 sub.w r2, r7, #67 ; 0x43 + 8000fee: 5413 strb r3, [r2, r0] + 8000ff0: e009 b.n 8001006 <core::fmt::ArgumentV1::show_usize+0xe2> + 8000ff2: f244 30d0 movw r0, #17360 ; 0x43d0 + 8000ff6: f6c0 0000 movt r0, #2048 ; 0x800 + } else { + let d1 = n << 1; + curr -= 2; + ptr::copy_nonoverlapping(lut_ptr.offset(d1), buf_ptr.offset(curr), 2); + 8000ffa: f830 3013 ldrh.w r3, [r0, r3, lsl #1] + curr -= 2; + 8000ffe: 1e90 subs r0, r2, #2 + 8001000: f1a7 0243 sub.w r2, r7, #67 ; 0x43 + ptr::copy_nonoverlapping(lut_ptr.offset(d1), buf_ptr.offset(curr), 2); + 8001004: 5213 strh r3, [r2, r0] + 8001006: f1a7 0243 sub.w r2, r7, #67 ; 0x43 + intrinsics::offset(self, count) as *mut T + 800100a: 1813 adds r3, r2, r0 + } + } + + let buf_slice = unsafe { + str::from_utf8_unchecked( + slice::from_raw_parts(buf_ptr.offset(curr), buf.len() - curr as usize)) + 800100c: f1c0 0227 rsb r2, r0, #39 ; 0x27 + }; + f.pad_integral(is_nonnegative, "", buf_slice) + 8001010: 4608 mov r0, r1 + 8001012: 4619 mov r1, r3 + 8001014: f7ff fb7d bl 8000712 <core::fmt::Formatter::pad_integral> + } + 8001018: b00b add sp, #44 ; 0x2c + 800101a: e8bd 0f00 ldmia.w sp!, {r8, r9, sl, fp} + 800101e: bdf0 pop {r4, r5, r6, r7, pc} + +08001020 <core::fmt::Formatter::pad_formatted_parts>: + fn pad_formatted_parts(&mut self, formatted: &flt2dec::Formatted) -> Result { + 8001020: b5f0 push {r4, r5, r6, r7, lr} + 8001022: af03 add r7, sp, #12 + 8001024: e92d 0f00 stmdb sp!, {r8, r9, sl, fp} + 8001028: b089 sub sp, #36 ; 0x24 + 800102a: 4604 mov r4, r0 + 800102c: 460a mov r2, r1 + if let Some(mut width) = self.width { + 800102e: 68a0 ldr r0, [r4, #8] + 8001030: 2801 cmp r0, #1 + 8001032: d114 bne.n 800105e <core::fmt::Formatter::pad_formatted_parts+0x3e> + 8001034: f8d4 800c ldr.w r8, [r4, #12] + 8001038: e892 0222 ldmia.w r2, {r1, r5, r9} +} + +/// Formatted result containing one or more parts. +/// This can be written to the byte buffer or converted to the allocated string. +#[allow(missing_debug_implementations)] +#[derive(Clone)] + 800103c: a804 add r0, sp, #16 + 800103e: 68d6 ldr r6, [r2, #12] + 8001040: e880 0222 stmia.w r0, {r1, r5, r9} + 8001044: 9607 str r6, [sp, #28] + if self.sign_aware_zero_pad() { + 8001046: 7820 ldrb r0, [r4, #0] + let old_align = self.align; + 8001048: f894 a030 ldrb.w sl, [r4, #48] ; 0x30 + let old_fill = self.fill; + 800104c: f8d4 b004 ldr.w fp, [r4, #4] + if self.sign_aware_zero_pad() { + 8001050: 0700 lsls r0, r0, #28 + 8001052: d40d bmi.n 8001070 <core::fmt::Formatter::pad_formatted_parts+0x50> + let fill = self.fill.encode_utf8(&mut fill); + 8001054: 46dc mov ip, fp +} + +impl<'a> Formatted<'a> { + /// Returns the exact byte length of combined formatted result. + pub fn len(&self) -> usize { + let mut len = self.sign.len(); + 8001056: 462a mov r2, r5 + rt::v1::Alignment::Unknown => default, + 8001058: 46d6 mov lr, sl + 800105a: bb46 cbnz r6, 80010ae <core::fmt::Formatter::pad_formatted_parts+0x8e> + 800105c: e052 b.n 8001104 <core::fmt::Formatter::pad_formatted_parts+0xe4> + self.write_formatted_parts(formatted) + 800105e: 4620 mov r0, r4 + 8001060: 4611 mov r1, r2 + 8001062: b009 add sp, #36 ; 0x24 + 8001064: e8bd 0f00 ldmia.w sp!, {r8, r9, sl, fp} + 8001068: e8bd 40f0 ldmia.w sp!, {r4, r5, r6, r7, lr} + 800106c: f000 b908 b.w 8001280 <core::fmt::Formatter::write_formatted_parts> + self.buf.write_str(sign)?; + 8001070: e9d4 0206 ldrd r0, r2, [r4, #24] + 8001074: 68d3 ldr r3, [r2, #12] + 8001076: 462a mov r2, r5 + 8001078: 4798 blx r3 + 800107a: f010 0fff tst.w r0, #255 ; 0xff + 800107e: d001 beq.n 8001084 <core::fmt::Formatter::pad_formatted_parts+0x64> + 8001080: 2001 movs r0, #1 + 8001082: e0dd b.n 8001240 <core::fmt::Formatter::pad_formatted_parts+0x220> + formatted.sign = b""; + 8001084: f244 4098 movw r0, #17560 ; 0x4498 + 8001088: f04f 0c30 mov.w ip, #48 ; 0x30 + 800108c: 2200 movs r2, #0 + 800108e: f04f 0e01 mov.w lr, #1 + width = if width < sign.len() { 0 } else { width - sign.len() }; + 8001092: ebb8 0805 subs.w r8, r8, r5 + formatted.sign = b""; + 8001096: f6c0 0000 movt r0, #2048 ; 0x800 + self.fill = '0'; + 800109a: f8c4 c004 str.w ip, [r4, #4] + self.align = rt::v1::Alignment::Right; + 800109e: f884 e030 strb.w lr, [r4, #48] ; 0x30 + formatted.sign = b""; + 80010a2: 9004 str r0, [sp, #16] + 80010a4: 9205 str r2, [sp, #20] + width = if width < sign.len() { 0 } else { width - sign.len() }; + 80010a6: bf38 it cc + 80010a8: f04f 0800 movcc.w r8, #0 + 80010ac: b356 cbz r6, 8001104 <core::fmt::Formatter::pad_formatted_parts+0xe4> +// Copyright 2012-2017 The Rust Project Developers. See the COPYRIGHT + 80010ae: eb06 0046 add.w r0, r6, r6, lsl #1 + 80010b2: f109 0304 add.w r3, r9, #4 + 80010b6: 0085 lsls r5, r0, #2 + 80010b8: f242 7010 movw r0, #10000 ; 0x2710 + Part::Zero(nzeroes) => nzeroes, + 80010bc: f833 6c04 ldrh.w r6, [r3, #-4] + 80010c0: f006 0103 and.w r1, r6, #3 + 80010c4: 2901 cmp r1, #1 + 80010c6: d002 beq.n 80010ce <core::fmt::Formatter::pad_formatted_parts+0xae> + 80010c8: b956 cbnz r6, 80010e0 <core::fmt::Formatter::pad_formatted_parts+0xc0> + 80010ca: 681e ldr r6, [r3, #0] + 80010cc: e015 b.n 80010fa <core::fmt::Formatter::pad_formatted_parts+0xda> + Part::Num(v) => if v < 1_000 { if v < 10 { 1 } else if v < 100 { 2 } else { 3 } } + 80010ce: f833 6c02 ldrh.w r6, [r3, #-2] + 80010d2: f5b6 7f7a cmp.w r6, #1000 ; 0x3e8 + 80010d6: d205 bcs.n 80010e4 <core::fmt::Formatter::pad_formatted_parts+0xc4> + 80010d8: 2e0a cmp r6, #10 + 80010da: d209 bcs.n 80010f0 <core::fmt::Formatter::pad_formatted_parts+0xd0> + 80010dc: 2601 movs r6, #1 + 80010de: e00c b.n 80010fa <core::fmt::Formatter::pad_formatted_parts+0xda> + Part::Copy(buf) => buf.len(), + 80010e0: 685e ldr r6, [r3, #4] + 80010e2: e00a b.n 80010fa <core::fmt::Formatter::pad_formatted_parts+0xda> + else { if v < 10_000 { 4 } else { 5 } }, + 80010e4: 4286 cmp r6, r0 + 80010e6: f04f 0605 mov.w r6, #5 + 80010ea: bf38 it cc + 80010ec: 2604 movcc r6, #4 + 80010ee: e004 b.n 80010fa <core::fmt::Formatter::pad_formatted_parts+0xda> + Part::Num(v) => if v < 1_000 { if v < 10 { 1 } else if v < 100 { 2 } else { 3 } } + 80010f0: 2e64 cmp r6, #100 ; 0x64 + 80010f2: f04f 0603 mov.w r6, #3 + 80010f6: bf38 it cc + 80010f8: 2602 movcc r6, #2 + for part in self.parts { + len += part.len(); + 80010fa: 4432 add r2, r6 + if self.ptr == self.end { + 80010fc: 3d0c subs r5, #12 + 80010fe: f103 030c add.w r3, r3, #12 + 8001102: d1db bne.n 80010bc <core::fmt::Formatter::pad_formatted_parts+0x9c> + let ret = if width <= len { // no padding + 8001104: 4590 cmp r8, r2 + 8001106: d910 bls.n 800112a <core::fmt::Formatter::pad_formatted_parts+0x10a> + self.with_padding(width - len, align, |f| { + 8001108: eba8 0002 sub.w r0, r8, r2 + rt::v1::Alignment::Left => (0, padding), + 800110c: f1be 0f00 cmp.w lr, #0 + 8001110: 9003 str r0, [sp, #12] + 8001112: f04f 0000 mov.w r0, #0 + 8001116: d00d beq.n 8001134 <core::fmt::Formatter::pad_formatted_parts+0x114> + 8001118: f1be 0f02 cmp.w lr, #2 + 800111c: d10d bne.n 800113a <core::fmt::Formatter::pad_formatted_parts+0x11a> + 800111e: 9903 ldr r1, [sp, #12] + rt::v1::Alignment::Center => (padding / 2, (padding + 1) / 2), + 8001120: ea4f 0851 mov.w r8, r1, lsr #1 + 8001124: 3101 adds r1, #1 + 8001126: 0849 lsrs r1, r1, #1 + 8001128: e00a b.n 8001140 <core::fmt::Formatter::pad_formatted_parts+0x120> + 800112a: a904 add r1, sp, #16 + self.write_formatted_parts(&formatted) + 800112c: 4620 mov r0, r4 + 800112e: f000 f8a7 bl 8001280 <core::fmt::Formatter::write_formatted_parts> + 8001132: e081 b.n 8001238 <core::fmt::Formatter::pad_formatted_parts+0x218> + 8001134: f04f 0800 mov.w r8, #0 + 8001138: e003 b.n 8001142 <core::fmt::Formatter::pad_formatted_parts+0x122> + 800113a: f8dd 800c ldr.w r8, [sp, #12] + 800113e: 2100 movs r1, #0 + 8001140: 9103 str r1, [sp, #12] + if code < MAX_ONE_B && !dst.is_empty() { + 8001142: f1bc 0f7f cmp.w ip, #127 ; 0x7f + let mut fill = [0; 4]; + 8001146: 9008 str r0, [sp, #32] + 8001148: e9cd ba01 strd fp, sl, [sp, #4] + 800114c: d804 bhi.n 8001158 <core::fmt::Formatter::pad_formatted_parts+0x138> + *dst.get_unchecked_mut(0) = code as u8; + 800114e: f88d c020 strb.w ip, [sp, #32] + 8001152: f04f 0901 mov.w r9, #1 + 8001156: e04a b.n 80011ee <core::fmt::Formatter::pad_formatted_parts+0x1ce> + } else if code < MAX_TWO_B && dst.len() >= 2 { + 8001158: 2000 movs r0, #0 + 800115a: ebb0 2fdc cmp.w r0, ip, lsr #11 + 800115e: d10c bne.n 800117a <core::fmt::Formatter::pad_formatted_parts+0x15a> + *dst.get_unchecked_mut(0) = (code >> 6 & 0x1F) as u8 | TAG_TWO_B; + 8001160: f64f 71fe movw r1, #65534 ; 0xfffe + 8001164: ea4f 109c mov.w r0, ip, lsr #6 + 8001168: f04f 0902 mov.w r9, #2 + 800116c: aa08 add r2, sp, #32 + 800116e: f2c0 71ff movt r1, #2047 ; 0x7ff + 8001172: f361 105f bfi r0, r1, #5, #27 + 8001176: 2101 movs r1, #1 + 8001178: e032 b.n 80011e0 <core::fmt::Formatter::pad_formatted_parts+0x1c0> + } else if code < MAX_THREE_B && dst.len() >= 3 { + 800117a: ebb0 4f1c cmp.w r0, ip, lsr #16 + 800117e: d115 bne.n 80011ac <core::fmt::Formatter::pad_formatted_parts+0x18c> + *dst.get_unchecked_mut(0) = (code >> 12 & 0x0F) as u8 | TAG_THREE_B; + 8001180: ea4f 301c mov.w r0, ip, lsr #12 + 8001184: 210e movs r1, #14 + 8001186: f04f 0903 mov.w r9, #3 + 800118a: f361 101f bfi r0, r1, #4, #28 + *dst.get_unchecked_mut(1) = (code >> 6 & 0x3F) as u8 | TAG_CONT; + 800118e: f64f 71fe movw r1, #65534 ; 0xfffe + *dst.get_unchecked_mut(0) = (code >> 12 & 0x0F) as u8 | TAG_THREE_B; + 8001192: f88d 0020 strb.w r0, [sp, #32] + *dst.get_unchecked_mut(1) = (code >> 6 & 0x3F) as u8 | TAG_CONT; + 8001196: ea4f 109c mov.w r0, ip, lsr #6 + 800119a: f2c0 31ff movt r1, #1023 ; 0x3ff + 800119e: f361 109f bfi r0, r1, #6, #26 + 80011a2: a908 add r1, sp, #32 + 80011a4: f041 0201 orr.w r2, r1, #1 + 80011a8: 2102 movs r1, #2 + 80011aa: e019 b.n 80011e0 <core::fmt::Formatter::pad_formatted_parts+0x1c0> + *dst.get_unchecked_mut(0) = (code >> 18 & 0x07) as u8 | TAG_FOUR_B; + 80011ac: 20f0 movs r0, #240 ; 0xf0 + 80011ae: 2102 movs r1, #2 + 80011b0: f04f 0904 mov.w r9, #4 + 80011b4: ea40 409c orr.w r0, r0, ip, lsr #18 + 80011b8: f88d 0020 strb.w r0, [sp, #32] + *dst.get_unchecked_mut(1) = (code >> 12 & 0x3F) as u8 | TAG_CONT; + 80011bc: ea4f 301c mov.w r0, ip, lsr #12 + 80011c0: f361 109f bfi r0, r1, #6, #26 + *dst.get_unchecked_mut(2) = (code >> 6 & 0x3F) as u8 | TAG_CONT; + 80011c4: f64f 71fe movw r1, #65534 ; 0xfffe + *dst.get_unchecked_mut(1) = (code >> 12 & 0x3F) as u8 | TAG_CONT; + 80011c8: f88d 0021 strb.w r0, [sp, #33] ; 0x21 + *dst.get_unchecked_mut(2) = (code >> 6 & 0x3F) as u8 | TAG_CONT; + 80011cc: ea4f 109c mov.w r0, ip, lsr #6 + 80011d0: f2c0 31ff movt r1, #1023 ; 0x3ff + 80011d4: f361 109f bfi r0, r1, #6, #26 + 80011d8: a908 add r1, sp, #32 + 80011da: f041 0202 orr.w r2, r1, #2 + 80011de: 2103 movs r1, #3 + 80011e0: 7010 strb r0, [r2, #0] + 80011e2: 2002 movs r0, #2 + 80011e4: f360 1c9f bfi ip, r0, #6, #26 + 80011e8: a808 add r0, sp, #32 + 80011ea: f800 c001 strb.w ip, [r0, r1] + 80011ee: e9d4 6b06 ldrd r6, fp, [r4, #24] + 80011f2: 2000 movs r0, #0 + 80011f4: ad08 add r5, sp, #32 + 80011f6: 4540 cmp r0, r8 + 80011f8: d212 bcs.n 8001220 <core::fmt::Formatter::pad_formatted_parts+0x200> + 80011fa: f100 0a01 add.w sl, r0, #1 + 80011fe: 4582 cmp sl, r0 + 8001200: f04f 0001 mov.w r0, #1 + 8001204: bf28 it cs + 8001206: 2000 movcs r0, #0 + 8001208: b950 cbnz r0, 8001220 <core::fmt::Formatter::pad_formatted_parts+0x200> + self.buf.write_str(fill)?; + 800120a: f8db 300c ldr.w r3, [fp, #12] + 800120e: 4630 mov r0, r6 + 8001210: 4629 mov r1, r5 + 8001212: 464a mov r2, r9 + 8001214: 4798 blx r3 + 8001216: f010 0fff tst.w r0, #255 ; 0xff + 800121a: 4650 mov r0, sl + 800121c: d0eb beq.n 80011f6 <core::fmt::Formatter::pad_formatted_parts+0x1d6> + 800121e: e006 b.n 800122e <core::fmt::Formatter::pad_formatted_parts+0x20e> + 8001220: a904 add r1, sp, #16 + f.write_formatted_parts(&formatted) + 8001222: 4620 mov r0, r4 + 8001224: f000 f82c bl 8001280 <core::fmt::Formatter::write_formatted_parts> + f(self)?; + 8001228: f010 0fff tst.w r0, #255 ; 0xff + 800122c: d00c beq.n 8001248 <core::fmt::Formatter::pad_formatted_parts+0x228> + 800122e: f8dd a008 ldr.w sl, [sp, #8] + 8001232: 2001 movs r0, #1 + 8001234: f8dd b004 ldr.w fp, [sp, #4] + self.fill = old_fill; + 8001238: f8c4 b004 str.w fp, [r4, #4] + self.align = old_align; + 800123c: f884 a030 strb.w sl, [r4, #48] ; 0x30 + } + 8001240: b009 add sp, #36 ; 0x24 + 8001242: e8bd 0f00 ldmia.w sp!, {r8, r9, sl, fp} + 8001246: bdf0 pop {r4, r5, r6, r7, pc} + 8001248: f8dd a008 ldr.w sl, [sp, #8] + 800124c: 2000 movs r0, #0 + 800124e: f10d 0820 add.w r8, sp, #32 + 8001252: 9903 ldr r1, [sp, #12] + 8001254: 4288 cmp r0, r1 + 8001256: d211 bcs.n 800127c <core::fmt::Formatter::pad_formatted_parts+0x25c> + 8001258: 1c45 adds r5, r0, #1 + 800125a: 4285 cmp r5, r0 + 800125c: f04f 0001 mov.w r0, #1 + 8001260: bf28 it cs + 8001262: 2000 movcs r0, #0 + 8001264: b950 cbnz r0, 800127c <core::fmt::Formatter::pad_formatted_parts+0x25c> + self.buf.write_str(fill)?; + 8001266: f8db 300c ldr.w r3, [fp, #12] + 800126a: 4630 mov r0, r6 + 800126c: 4641 mov r1, r8 + 800126e: 464a mov r2, r9 + 8001270: 4798 blx r3 + 8001272: f010 0fff tst.w r0, #255 ; 0xff + 8001276: 4628 mov r0, r5 + 8001278: d0eb beq.n 8001252 <core::fmt::Formatter::pad_formatted_parts+0x232> + 800127a: e7da b.n 8001232 <core::fmt::Formatter::pad_formatted_parts+0x212> + 800127c: 2000 movs r0, #0 + 800127e: e7d9 b.n 8001234 <core::fmt::Formatter::pad_formatted_parts+0x214> + +08001280 <core::fmt::Formatter::write_formatted_parts>: + fn write_formatted_parts(&mut self, formatted: &flt2dec::Formatted) -> Result { + 8001280: b5f0 push {r4, r5, r6, r7, lr} + 8001282: af03 add r7, sp, #12 + 8001284: e92d 0f00 stmdb sp!, {r8, r9, sl, fp} + 8001288: b083 sub sp, #12 + 800128a: 460c mov r4, r1 + 800128c: 4682 mov sl, r0 + if !formatted.sign.is_empty() { + 800128e: 6862 ldr r2, [r4, #4] + 8001290: b142 cbz r2, 80012a4 <core::fmt::Formatter::write_formatted_parts+0x24> + write_bytes(self.buf, formatted.sign)?; + 8001292: 6821 ldr r1, [r4, #0] + 8001294: e9da 0306 ldrd r0, r3, [sl, #24] + buf.write_str(unsafe { str::from_utf8_unchecked(s) }) + 8001298: 68db ldr r3, [r3, #12] + 800129a: 4798 blx r3 + write_bytes(self.buf, formatted.sign)?; + 800129c: f010 0fff tst.w r0, #255 ; 0xff + 80012a0: f040 8094 bne.w 80013cc <core::fmt::Formatter::write_formatted_parts+0x14c> + for part in formatted.parts { + 80012a4: 68e0 ldr r0, [r4, #12] + 80012a6: f04f 0900 mov.w r9, #0 + 80012aa: 2800 cmp r0, #0 + 80012ac: f000 8090 beq.w 80013d0 <core::fmt::Formatter::write_formatted_parts+0x150> + 80012b0: f8d4 b008 ldr.w fp, [r4, #8] + 80012b4: f64c 48cd movw r8, #52429 ; 0xcccd + intrinsics::offset(self, count) + 80012b8: eb00 0040 add.w r0, r0, r0, lsl #1 + 80012bc: ae01 add r6, sp, #4 + 80012be: f6cc 48cc movt r8, #52428 ; 0xcccc + 80012c2: eb0b 0580 add.w r5, fp, r0, lsl #2 + 80012c6: 9500 str r5, [sp, #0] + 80012c8: 465a mov r2, fp + flt2dec::Part::Zero(mut nzeroes) => { + 80012ca: f83b 0b0c ldrh.w r0, [fp], #12 + 80012ce: f000 0103 and.w r1, r0, #3 + 80012d2: 2901 cmp r1, #1 + 80012d4: d015 beq.n 8001302 <core::fmt::Formatter::write_formatted_parts+0x82> + 80012d6: bb50 cbnz r0, 800132e <core::fmt::Formatter::write_formatted_parts+0xae> + 80012d8: 6854 ldr r4, [r2, #4] + while nzeroes > ZEROES.len() { + 80012da: 2c41 cmp r4, #65 ; 0x41 + 80012dc: d32d bcc.n 800133a <core::fmt::Formatter::write_formatted_parts+0xba> + 80012de: e9da 5006 ldrd r5, r0, [sl, #24] + 80012e2: f8d0 900c ldr.w r9, [r0, #12] + self.buf.write_str(ZEROES)?; + 80012e6: f644 3190 movw r1, #19344 ; 0x4b90 + 80012ea: 4628 mov r0, r5 + 80012ec: 2240 movs r2, #64 ; 0x40 + 80012ee: f6c0 0100 movt r1, #2048 ; 0x800 + 80012f2: 47c8 blx r9 + 80012f4: f010 0fff tst.w r0, #255 ; 0xff + 80012f8: d168 bne.n 80013cc <core::fmt::Formatter::write_formatted_parts+0x14c> + nzeroes -= ZEROES.len(); + 80012fa: 3c40 subs r4, #64 ; 0x40 + while nzeroes > ZEROES.len() { + 80012fc: 2c40 cmp r4, #64 ; 0x40 + 80012fe: d8f2 bhi.n 80012e6 <core::fmt::Formatter::write_formatted_parts+0x66> + 8001300: e021 b.n 8001346 <core::fmt::Formatter::write_formatted_parts+0xc6> + flt2dec::Part::Num(mut v) => { + 8001302: 8850 ldrh r0, [r2, #2] + let mut s = [0; 5]; + 8001304: f88d 9008 strb.w r9, [sp, #8] + 8001308: f8cd 9004 str.w r9, [sp, #4] + Part::Zero(nzeroes) => nzeroes, + 800130c: 8811 ldrh r1, [r2, #0] + 800130e: f001 0303 and.w r3, r1, #3 + 8001312: 2b01 cmp r3, #1 + 8001314: d025 beq.n 8001362 <core::fmt::Formatter::write_formatted_parts+0xe2> + 8001316: 2900 cmp r1, #0 + 8001318: bf0c ite eq + 800131a: 2100 moveq r1, #0 + 800131c: 2101 movne r1, #1 + 800131e: eb02 0181 add.w r1, r2, r1, lsl #2 + 8001322: 684a ldr r2, [r1, #4] + } else if self.end > slice.len() { + 8001324: 2a06 cmp r2, #6 + 8001326: d258 bcs.n 80013da <core::fmt::Formatter::write_formatted_parts+0x15a> + 8001328: bb82 cbnz r2, 800138c <core::fmt::Formatter::write_formatted_parts+0x10c> + 800132a: 2200 movs r2, #0 + 800132c: e040 b.n 80013b0 <core::fmt::Formatter::write_formatted_parts+0x130> + flt2dec::Part::Copy(buf) => { + 800132e: e9d2 1201 ldrd r1, r2, [r2, #4] + write_bytes(self.buf, buf)?; + 8001332: e9da 0306 ldrd r0, r3, [sl, #24] + buf.write_str(unsafe { str::from_utf8_unchecked(s) }) + 8001336: 68db ldr r3, [r3, #12] + 8001338: e03e b.n 80013b8 <core::fmt::Formatter::write_formatted_parts+0x138> + if nzeroes > 0 { + 800133a: 2c00 cmp r4, #0 + 800133c: d040 beq.n 80013c0 <core::fmt::Formatter::write_formatted_parts+0x140> + 800133e: e9da 5006 ldrd r5, r0, [sl, #24] + 8001342: f8d0 900c ldr.w r9, [r0, #12] + self.buf.write_str(&ZEROES[..nzeroes])?; + 8001346: f644 3190 movw r1, #19344 ; 0x4b90 + 800134a: 4628 mov r0, r5 + 800134c: 4622 mov r2, r4 + 800134e: f6c0 0100 movt r1, #2048 ; 0x800 + 8001352: 47c8 blx r9 + 8001354: 9d00 ldr r5, [sp, #0] + 8001356: f010 0fff tst.w r0, #255 ; 0xff + 800135a: f04f 0900 mov.w r9, #0 + 800135e: d02f beq.n 80013c0 <core::fmt::Formatter::write_formatted_parts+0x140> + 8001360: e034 b.n 80013cc <core::fmt::Formatter::write_formatted_parts+0x14c> + Part::Num(v) => if v < 1_000 { if v < 10 { 1 } else if v < 100 { 2 } else { 3 } } + 8001362: 8851 ldrh r1, [r2, #2] + 8001364: 08ca lsrs r2, r1, #3 + 8001366: 2a7c cmp r2, #124 ; 0x7c + 8001368: d803 bhi.n 8001372 <core::fmt::Formatter::write_formatted_parts+0xf2> + 800136a: 290a cmp r1, #10 + 800136c: d209 bcs.n 8001382 <core::fmt::Formatter::write_formatted_parts+0x102> + 800136e: 2201 movs r2, #1 + 8001370: e00c b.n 800138c <core::fmt::Formatter::write_formatted_parts+0x10c> + else { if v < 10_000 { 4 } else { 5 } }, + 8001372: f242 7210 movw r2, #10000 ; 0x2710 + 8001376: 4291 cmp r1, r2 + 8001378: f04f 0205 mov.w r2, #5 + 800137c: bf38 it cc + 800137e: 2204 movcc r2, #4 + 8001380: e004 b.n 800138c <core::fmt::Formatter::write_formatted_parts+0x10c> + Part::Num(v) => if v < 1_000 { if v < 10 { 1 } else if v < 100 { 2 } else { 3 } } + 8001382: 2964 cmp r1, #100 ; 0x64 + 8001384: f04f 0203 mov.w r2, #3 + 8001388: bf38 it cc + 800138a: 2202 movcc r2, #2 + 800138c: 4611 mov r1, r2 + *c = b'0' + (v % 10) as u8; + 800138e: b285 uxth r5, r0 + 8001390: 1873 adds r3, r6, r1 + if self.end == self.ptr { + 8001392: 3901 subs r1, #1 + 8001394: fba5 0408 umull r0, r4, r5, r8 + 8001398: ea4f 00d4 mov.w r0, r4, lsr #3 + 800139c: eb00 0480 add.w r4, r0, r0, lsl #2 + 80013a0: eba5 0544 sub.w r5, r5, r4, lsl #1 + 80013a4: f045 0530 orr.w r5, r5, #48 ; 0x30 + 80013a8: f803 5c01 strb.w r5, [r3, #-1] + 80013ac: d1ef bne.n 800138e <core::fmt::Formatter::write_formatted_parts+0x10e> + 80013ae: 9d00 ldr r5, [sp, #0] + write_bytes(self.buf, &s[..len])?; + 80013b0: e9da 0106 ldrd r0, r1, [sl, #24] + buf.write_str(unsafe { str::from_utf8_unchecked(s) }) + 80013b4: 68cb ldr r3, [r1, #12] + 80013b6: 4631 mov r1, r6 + 80013b8: 4798 blx r3 + 80013ba: f010 0fff tst.w r0, #255 ; 0xff + 80013be: d105 bne.n 80013cc <core::fmt::Formatter::write_formatted_parts+0x14c> + if self.ptr == self.end { + 80013c0: 45ab cmp fp, r5 + 80013c2: f47f af81 bne.w 80012c8 <core::fmt::Formatter::write_formatted_parts+0x48> + 80013c6: f04f 0900 mov.w r9, #0 + 80013ca: e001 b.n 80013d0 <core::fmt::Formatter::write_formatted_parts+0x150> + 80013cc: f04f 0901 mov.w r9, #1 + } + 80013d0: 4648 mov r0, r9 + 80013d2: b003 add sp, #12 + 80013d4: e8bd 0f00 ldmia.w sp!, {r8, r9, sl, fp} + 80013d8: bdf0 pop {r4, r5, r6, r7, pc} + slice_index_len_fail(self.end, slice.len()); + 80013da: 4610 mov r0, r2 + 80013dc: 2105 movs r1, #5 + 80013de: f7ff f8ae bl 800053e <core::slice::slice_index_len_fail> + +080013e2 <core::fmt::float::float_to_decimal_common_shortest>: +} + +// Don't inline this so callers that call both this and the above won't wind +// up using the combined stack space of both functions in some cases. +#[inline(never)] +fn float_to_decimal_common_shortest<T>(fmt: &mut Formatter, + 80013e2: b5f0 push {r4, r5, r6, r7, lr} + 80013e4: af03 add r7, sp, #12 + 80013e6: e92d 0f00 stmdb sp!, {r8, r9, sl, fp} + 80013ea: f5ad 6db3 sub.w sp, sp, #1432 ; 0x598 + 80013ee: b081 sub sp, #4 + const ZERO_CUTOFF: i64 = -326; + other_constants!(f64); + + /// Returns the mantissa, exponent and sign as integers. + fn integer_decode(self) -> (u64, i16, i8) { + let bits: u64 = unsafe { transmute(self) }; + 80013f0: ec56 3b10 vmov r3, r6, d0 + 80013f4: 4684 mov ip, r0 + 80013f6: 4630 mov r0, r6 + let sign: i8 = if bits >> 63 == 0 { 1 } else { -1 }; + let mut exponent: i16 = ((bits >> 52) & 0x7ff) as i16; + 80013f8: f3c6 520a ubfx r2, r6, #20, #11 + let mantissa = if exponent == 0 { + 80013fc: 469a mov sl, r3 + 80013fe: f36f 501f bfc r0, #20, #12 + 8001402: 2a00 cmp r2, #0 + (bits & 0xfffffffffffff) << 1 + 8001404: ea4f 0540 mov.w r5, r0, lsl #1 + } else { + (bits & 0xfffffffffffff) | 0x10000000000000 + 8001408: f440 1b80 orr.w fp, r0, #1048576 ; 0x100000 + let mantissa = if exponent == 0 { + 800140c: bf04 itt eq + 800140e: ea45 7bd3 orreq.w fp, r5, r3, lsr #31 + 8001412: ea4f 0a4a moveq.w sl, sl, lsl #1 + const EXP_MASK: u64 = 0x7ff0000000000000; + const MAN_MASK: u64 = 0x000fffffffffffff; + + let bits: u64 = unsafe { mem::transmute(self) }; + match (bits & MAN_MASK, bits & EXP_MASK) { + (0, 0) => Fp::Zero, + 8001416: f026 4500 bic.w r5, r6, #2147483648 ; 0x80000000 + 800141a: 431d orrs r5, r3 + 800141c: d011 beq.n 8001442 <core::fmt::float::float_to_decimal_common_shortest+0x60> + (_, 0) => Fp::Subnormal, + 800141e: 2400 movs r4, #0 + 8001420: f04f 0900 mov.w r9, #0 + 8001424: f6c7 74f0 movt r4, #32752 ; 0x7ff0 + 8001428: ea06 0504 and.w r5, r6, r4 + 800142c: 42a5 cmp r5, r4 + 800142e: d01c beq.n 800146a <core::fmt::float::float_to_decimal_common_shortest+0x88> + 8001430: 0068 lsls r0, r5, #1 + 8001432: d125 bne.n 8001480 <core::fmt::float::float_to_decimal_common_shortest+0x9e> + }; + // Exponent bias + mantissa shift + exponent -= 1023 + 52; + 8001434: f2a2 4e33 subw lr, r2, #1075 ; 0x433 + 8001438: f04f 0801 mov.w r8, #1 + 800143c: f8cd a03c str.w sl, [sp, #60] ; 0x3c + 8001440: e03a b.n 80014b8 <core::fmt::float::float_to_decimal_common_shortest+0xd6> + 8001442: f244 4598 movw r5, #17560 ; 0x4498 + 8001446: b2c8 uxtb r0, r1 + 8001448: f6c0 0500 movt r5, #2048 ; 0x800 +/// Returns the static byte string corresponding to the sign to be formatted. +/// It can be either `b""`, `b"+"` or `b"-"`. +fn determine_sign(sign: Sign, decoded: &FullDecoded, negative: bool) -> &'static [u8] { + match (*decoded, sign) { + (FullDecoded::Nan, _) => b"", + (FullDecoded::Zero, Sign::Minus) => b"", + 800144c: 2800 cmp r0, #0 + 800144e: f000 821c beq.w 800188a <core::fmt::float::float_to_decimal_common_shortest+0x4a8> + 8001452: 2801 cmp r0, #1 + 8001454: f000 821b beq.w 800188e <core::fmt::float::float_to_decimal_common_shortest+0x4ac> + 8001458: 2802 cmp r0, #2 + 800145a: f040 8220 bne.w 800189e <core::fmt::float::float_to_decimal_common_shortest+0x4bc> + 800145e: f644 25b0 movw r5, #19120 ; 0x4ab0 + 8001462: 2301 movs r3, #1 + 8001464: f6c0 0500 movt r5, #2048 ; 0x800 + 8001468: e226 b.n 80018b8 <core::fmt::float::float_to_decimal_common_shortest+0x4d6> +/// from given floating point number. +pub fn decode<T: DecodableFloat>(v: T) -> (/*negative?*/ bool, FullDecoded) { + let (mant, exp, sign) = v.integer_decode(); + let even = (mant & 1) == 0; + let decoded = match v.classify() { + FpCategory::Nan => FullDecoded::Nan, + 800146a: 4318 orrs r0, r3 + 800146c: bf08 it eq + 800146e: f04f 0901 moveq.w r9, #1 + (FullDecoded::Nan, _) => b"", + 8001472: 2800 cmp r0, #0 + 8001474: f040 8230 bne.w 80018d8 <core::fmt::float::float_to_decimal_common_shortest+0x4f6> + 8001478: 920f str r2, [sp, #60] ; 0x3c + buf: &'a mut [u8], parts: &'a mut [Part<'a>]) -> Formatted<'a> + where T: DecodableFloat, F: FnMut(&Decoded, &mut [u8]) -> (usize, i16) { + assert!(parts.len() >= 4); + assert!(buf.len() >= MAX_SIG_DIGITS); + + let (negative, full_decoded) = decode(v); + 800147a: 0ff0 lsrs r0, r6, #31 + 800147c: 464a mov r2, r9 + 800147e: e01d b.n 80014bc <core::fmt::float::float_to_decimal_common_shortest+0xda> + FullDecoded::Finite(Decoded { mant: mant, minus: 1, plus: 1, + exp: exp, inclusive: even }) + } + FpCategory::Normal => { + let minnorm = <T as DecodableFloat>::min_pos_norm_value().integer_decode(); + if mant == minnorm.0 { + 8001480: f48b 1080 eor.w r0, fp, #1048576 ; 0x100000 + 8001484: ea50 000a orrs.w r0, r0, sl + 8001488: d109 bne.n 800149e <core::fmt::float::float_to_decimal_common_shortest+0xbc> + 800148a: 2000 movs r0, #0 + // neighbors: (maxmant, exp - 1) -- (minnormmant, exp) -- (minnormmant + 1, exp) + // where maxmant = minnormmant * 2 - 1 + FullDecoded::Finite(Decoded { mant: mant << 2, minus: 1, plus: 2, + exp: exp - 2, inclusive: even }) + 800148c: f2a2 4e35 subw lr, r2, #1077 ; 0x435 + 8001490: f04f 0802 mov.w r8, #2 + 8001494: f44f 0b80 mov.w fp, #4194304 ; 0x400000 + 8001498: f04f 0900 mov.w r9, #0 + 800149c: e00b b.n 80014b6 <core::fmt::float::float_to_decimal_common_shortest+0xd4> + } else { + // neighbors: (mant - 1, exp) -- (mant, exp) -- (mant + 1, exp) + FullDecoded::Finite(Decoded { mant: mant << 1, minus: 1, plus: 1, + 800149e: ea4f 004b mov.w r0, fp, lsl #1 + exp: exp - 1, inclusive: even }) + 80014a2: f2a2 4e34 subw lr, r2, #1076 ; 0x434 + 80014a6: f04f 0900 mov.w r9, #0 + 80014aa: f04f 0801 mov.w r8, #1 + FullDecoded::Finite(Decoded { mant: mant << 1, minus: 1, plus: 1, + 80014ae: ea40 7bda orr.w fp, r0, sl, lsr #31 + 80014b2: ea4f 004a mov.w r0, sl, lsl #1 + 80014b6: 900f str r0, [sp, #60] ; 0x3c + 80014b8: 0ff0 lsrs r0, r6, #31 + 80014ba: 2203 movs r2, #3 + (_, Sign::Minus) | (_, Sign::MinusRaw) => if negative { b"-" } else { b"" }, + 80014bc: f244 4398 movw r3, #17560 ; 0x4498 + 80014c0: f644 26b0 movw r6, #19120 ; 0x4ab0 + 80014c4: b2c9 uxtb r1, r1 + 80014c6: f644 25af movw r5, #19119 ; 0x4aaf + 80014ca: f6c0 0300 movt r3, #2048 ; 0x800 + 80014ce: f6c0 0600 movt r6, #2048 ; 0x800 + 80014d2: 2902 cmp r1, #2 + 80014d4: f6c0 0500 movt r5, #2048 ; 0x800 + 80014d8: bf38 it cc + 80014da: 461e movcc r6, r3 + 80014dc: 2800 cmp r0, #0 + 80014de: f04f 0300 mov.w r3, #0 + 80014e2: bf08 it eq + 80014e4: 4635 moveq r5, r6 + 80014e6: 2901 cmp r1, #1 + 80014e8: bf88 it hi + 80014ea: 2301 movhi r3, #1 + 80014ec: 4303 orrs r3, r0 + let sign = determine_sign(sign, &full_decoded, negative); + match full_decoded { + FullDecoded::Nan => { + 80014ee: f002 0003 and.w r0, r2, #3 + 80014f2: 2801 cmp r0, #1 + 80014f4: d109 bne.n 800150a <core::fmt::float::float_to_decimal_common_shortest+0x128> + parts[0] = Part::Copy(b"NaN"); + Formatted { sign: sign, parts: &parts[..1] } + } + FullDecoded::Infinite => { + parts[0] = Part::Copy(b"inf"); + 80014f6: 2002 movs r0, #2 + 80014f8: f1a7 01c0 sub.w r1, r7, #192 ; 0xc0 + 80014fc: f827 0cc0 strh.w r0, [r7, #-192] + 8001500: f644 306b movw r0, #19307 ; 0x4b6b + 8001504: f6c0 0000 movt r0, #2048 ; 0x800 + 8001508: e1f4 b.n 80018f4 <core::fmt::float::float_to_decimal_common_shortest+0x512> + 800150a: 9c0f ldr r4, [sp, #60] ; 0x3c +/// The shortest mode implementation for Grisu. +/// +/// It returns `None` when it would return an inexact representation otherwise. +pub fn format_shortest_opt(d: &Decoded, + buf: &mut [u8]) -> Option<(/*#digits*/ usize, /*exp*/ i16)> { + assert!(d.mant > 0); + 800150c: ea54 000b orrs.w r0, r4, fp + 8001510: f001 8149 beq.w 80027a6 <core::fmt::float::float_to_decimal_common_shortest+0x13c4> + 8001514: eb14 0108 adds.w r1, r4, r8 + 8001518: f04f 0000 mov.w r0, #0 + 800151c: eb4b 0209 adc.w r2, fp, r9 + 8001520: 1b09 subs r1, r1, r4 + 8001522: eb72 010b sbcs.w r1, r2, fp + 8001526: f04f 0100 mov.w r1, #0 + 800152a: bf38 it cc + 800152c: 2101 movcc r1, #1 + if b {None} else {Some(a)} + 800152e: 2900 cmp r1, #0 + 8001530: f041 813f bne.w 80027b2 <core::fmt::float::float_to_decimal_common_shortest+0x13d0> + /// ``` + #[inline] + #[stable(feature = "wrapping", since = "1.7.0")] + pub fn overflowing_sub(self, rhs: Self) -> (Self, bool) { + unsafe { + let (a, b) = $sub_with_overflow(self as $ActualT, + 8001534: 1e61 subs r1, r4, #1 + 8001536: f16b 0200 sbc.w r2, fp, #0 + 800153a: 1a61 subs r1, r4, r1 + 800153c: eb7b 0102 sbcs.w r1, fp, r2 + 8001540: bf38 it cc + 8001542: 2001 movcc r0, #1 + if b {None} else {Some(a)} + 8001544: 2800 cmp r0, #0 + 8001546: f041 813a bne.w 80027be <core::fmt::float::float_to_decimal_common_shortest+0x13dc> + assert!(d.minus > 0); + assert!(d.plus > 0); + assert!(d.mant.checked_add(d.plus).is_some()); + assert!(d.mant.checked_sub(d.minus).is_some()); + assert!(buf.len() >= MAX_SIG_DIGITS); + assert!(d.mant + d.plus < (1 << 61)); // we need at least three bits of additional precision + 800154a: eb14 0208 adds.w r2, r4, r8 + 800154e: f8cd a060 str.w sl, [sp, #96] ; 0x60 + 8001552: e9cd 5c04 strd r5, ip, [sp, #16] + 8001556: 46a4 mov ip, r4 + 8001558: e9cd 8302 strd r8, r3, [sp, #8] + 800155c: eb4b 0609 adc.w r6, fp, r9 + 8001560: f1b6 5f00 cmp.w r6, #536870912 ; 0x20000000 + 8001564: f081 8131 bcs.w 80027ca <core::fmt::float::float_to_decimal_common_shortest+0x13e8> + + /// Normalizes itself so that the resulting mantissa is at least `2^63`. + pub fn normalize(&self) -> Fp { + let mut f = self.f; + let mut e = self.e; + if f >> (64 - 32) == 0 { + 8001568: 2e00 cmp r6, #0 + 800156a: 4634 mov r4, r6 + 800156c: bf04 itt eq + 800156e: 4614 moveq r4, r2 + 8001570: 4632 moveq r2, r6 + f <<= 32; + e -= 32; + } + if f >> (64 - 16) == 0 { + 8001572: f5b4 3f80 cmp.w r4, #65536 ; 0x10000 + 8001576: 4613 mov r3, r2 + f <<= 16; + 8001578: ea4f 4004 mov.w r0, r4, lsl #16 + if f >> (64 - 16) == 0 { + 800157c: 4625 mov r5, r4 + 800157e: bf38 it cc + 8001580: 041b lslcc r3, r3, #16 + 8001582: bf38 it cc + 8001584: ea40 4512 orrcc.w r5, r0, r2, lsr #16 + e -= 16; + } + if f >> (64 - 8) == 0 { + 8001588: f1b5 7f80 cmp.w r5, #16777216 ; 0x1000000 + 800158c: 461a mov r2, r3 + f <<= 8; + 800158e: ea4f 2105 mov.w r1, r5, lsl #8 + if f >> (64 - 8) == 0 { + 8001592: 4628 mov r0, r5 + 8001594: bf38 it cc + 8001596: 0212 lslcc r2, r2, #8 + 8001598: bf38 it cc + 800159a: ea41 6013 orrcc.w r0, r1, r3, lsr #24 + e -= 8; + } + if f >> (64 - 4) == 0 { + 800159e: f1b0 5f80 cmp.w r0, #268435456 ; 0x10000000 + 80015a2: 4692 mov sl, r2 + f <<= 4; + 80015a4: ea4f 1300 mov.w r3, r0, lsl #4 + if f >> (64 - 4) == 0 { + 80015a8: 4601 mov r1, r0 + 80015aa: bf38 it cc + 80015ac: ea4f 1a0a movcc.w sl, sl, lsl #4 + 80015b0: bf38 it cc + 80015b2: ea43 7112 orrcc.w r1, r3, r2, lsr #28 + e -= 4; + } + if f >> (64 - 2) == 0 { + f <<= 2; + 80015b6: 008a lsls r2, r1, #2 + if f >> (64 - 2) == 0 { + 80015b8: f1b1 4f80 cmp.w r1, #1073741824 ; 0x40000000 + 80015bc: 4688 mov r8, r1 + 80015be: bf3c itt cc + 80015c0: ea42 789a orrcc.w r8, r2, sl, lsr #30 + 80015c4: ea4f 0a8a movcc.w sl, sl, lsl #2 + if f >> (64 - 32) == 0 { + 80015c8: 2e00 cmp r6, #0 + 80015ca: 4672 mov r2, lr + 80015cc: bf08 it eq + 80015ce: 3a20 subeq r2, #32 + if f >> (64 - 16) == 0 { + 80015d0: f5b4 3f80 cmp.w r4, #65536 ; 0x10000 + 80015d4: bf38 it cc + 80015d6: 3a10 subcc r2, #16 + if f >> (64 - 8) == 0 { + 80015d8: f1b5 7f80 cmp.w r5, #16777216 ; 0x1000000 + 80015dc: bf38 it cc + 80015de: 3a08 subcc r2, #8 + if f >> (64 - 4) == 0 { + 80015e0: f1b0 5f80 cmp.w r0, #268435456 ; 0x10000000 + e -= 2; + } + if f >> (64 - 1) == 0 { + 80015e4: ea6f 70e8 mvn.w r0, r8, asr #31 + if f >> (64 - 4) == 0 { + 80015e8: bf38 it cc + 80015ea: 3a04 subcc r2, #4 + if f >> (64 - 2) == 0 { + 80015ec: f1b1 4f80 cmp.w r1, #1073741824 ; 0x40000000 + 80015f0: bf38 it cc + 80015f2: 3a02 subcc r2, #2 + if f >> (64 - 1) == 0 { + 80015f4: 4410 add r0, r2 + + // start with the normalized values with the shared exponent + let plus = Fp { f: d.mant + d.plus, e: d.exp }.normalize(); + let minus = Fp { f: d.mant - d.minus, e: d.exp }.normalize_to(plus.e); + 80015f6: f1bc 0201 subs.w r2, ip, #1 + 80015fa: 9019 str r0, [sp, #100] ; 0x64 + } + + /// Normalizes itself to have the shared exponent. + /// It can only decrease the exponent (and thus increase the mantissa). + pub fn normalize_to(&self, e: i16) -> Fp { + let edelta = self.e - e; + 80015fc: ebae 0000 sub.w r0, lr, r0 + 8001600: f16b 0100 sbc.w r1, fp, #0 + 8001604: b200 sxth r0, r0 + assert!(edelta >= 0); + 8001606: f1b0 3fff cmp.w r0, #4294967295 ; 0xffffffff + 800160a: f341 80e4 ble.w 80027d6 <core::fmt::float::float_to_decimal_common_shortest+0x13f4> + let edelta = edelta as usize; + assert_eq!(self.f << edelta >> edelta, self.f); + 800160e: f000 003f and.w r0, r0, #63 ; 0x3f + 8001612: f8cd 9038 str.w r9, [sp, #56] ; 0x38 + 8001616: f1c0 0420 rsb r4, r0, #32 + 800161a: fa01 f300 lsl.w r3, r1, r0 + 800161e: fa02 f900 lsl.w r9, r2, r0 + 8001622: fa22 f604 lsr.w r6, r2, r4 + 8001626: ea46 0c03 orr.w ip, r6, r3 + 800162a: f1a0 0320 sub.w r3, r0, #32 + 800162e: 2b00 cmp r3, #0 + 8001630: bfa8 it ge + 8001632: fa02 fc03 lslge.w ip, r2, r3 + 8001636: bfa8 it ge + 8001638: f04f 0900 movge.w r9, #0 + 800163c: 2b00 cmp r3, #0 + 800163e: fa0c f404 lsl.w r4, ip, r4 + 8001642: fa29 f500 lsr.w r5, r9, r0 + 8001646: ea44 0405 orr.w r4, r4, r5 + 800164a: bfa8 it ge + 800164c: fa2c f403 lsrge.w r4, ip, r3 + 8001650: fa2c f300 lsr.w r3, ip, r0 + 8001654: bfa8 it ge + 8001656: 2300 movge r3, #0 + 8001658: 4062 eors r2, r4 + 800165a: 4059 eors r1, r3 + 800165c: 4311 orrs r1, r2 + 800165e: f041 80a0 bne.w 80027a2 <core::fmt::float::float_to_decimal_common_shortest+0x13c0> + 8001662: 9e0f ldr r6, [sp, #60] ; 0x3c + 8001664: b283 uxth r3, r0 + 8001666: f1c3 0220 rsb r2, r3, #32 + 800166a: fa0b f103 lsl.w r1, fp, r3 + 800166e: fa26 f402 lsr.w r4, r6, r2 + 8001672: 4321 orrs r1, r4 + 8001674: f06f 041f mvn.w r4, #31 + 8001678: fa14 f080 uxtah r0, r4, r0 + 800167c: 2800 cmp r0, #0 + 800167e: bfa8 it ge + 8001680: fa06 f100 lslge.w r1, r6, r0 + 8001684: fa01 f402 lsl.w r4, r1, r2 + 8001688: fa06 f203 lsl.w r2, r6, r3 + 800168c: bfa8 it ge + 800168e: 2200 movge r2, #0 + 8001690: 2800 cmp r0, #0 + 8001692: fa22 f503 lsr.w r5, r2, r3 + 8001696: fa21 f303 lsr.w r3, r1, r3 + 800169a: ea44 0405 orr.w r4, r4, r5 + 800169e: bfa8 it ge + 80016a0: fa21 f400 lsrge.w r4, r1, r0 + 80016a4: bfa8 it ge + 80016a6: 2300 movge r3, #0 + 80016a8: ea84 0006 eor.w r0, r4, r6 + 80016ac: ea83 030b eor.w r3, r3, fp + 80016b0: 4318 orrs r0, r3 + 80016b2: f041 8076 bne.w 80027a2 <core::fmt::float::float_to_decimal_common_shortest+0x13c0> + 80016b6: a815 add r0, sp, #84 ; 0x54 + let idx = ((gamma as i32) - offset) * range / domain; + 80016b8: f245 33b0 movw r3, #21424 ; 0x53b0 + 80016bc: e880 1204 stmia.w r0, {r2, r9, ip} + 80016c0: e9cd be08 strd fp, lr, [sp, #32] + 80016c4: f04f 30ff mov.w r0, #4294967295 ; 0xffffffff + 80016c8: f2c0 0301 movt r3, #1 + 80016cc: f8dd 9064 ldr.w r9, [sp, #100] ; 0x64 + // 2. the remainder of `floor(plus * cached)` repeatedly gets multiplied by 10, + // and it should not overflow. + // + // the first gives `64 + GAMMA <= 32`, while the second gives `10 * 2^-ALPHA <= 2^64`; + // -60 and -32 is the maximal range with this constraint, and V8 also uses them. + let (minusk, cached) = cached_power(ALPHA - plus.e - 64, GAMMA - plus.e - 64); + 80016d0: 385f subs r0, #95 ; 0x5f + 80016d2: eba0 0009 sub.w r0, r0, r9 + let idx = ((gamma as i32) - offset) * range / domain; + 80016d6: b200 sxth r0, r0 + 80016d8: eb00 0080 add.w r0, r0, r0, lsl #2 + 80016dc: eb03 1000 add.w r0, r3, r0, lsl #4 + 80016e0: f64c 1393 movw r3, #51603 ; 0xc993 + 80016e4: f6c7 334d movt r3, #31565 ; 0x7b4d + 80016e8: fb50 f003 smmul r0, r0, r3 + 80016ec: 1283 asrs r3, r0, #10 + 80016ee: eb03 70d0 add.w r0, r3, r0, lsr #31 + let (f, e, k) = CACHED_POW10[idx as usize]; + 80016f2: 2851 cmp r0, #81 ; 0x51 + 80016f4: f081 8075 bcs.w 80027e2 <core::fmt::float::float_to_decimal_common_shortest+0x1400> + 80016f8: 231e movs r3, #30 + if f >> (64 - 1) == 0 { + 80016fa: ea4f 045a mov.w r4, sl, lsr #1 + 80016fe: ea43 73d8 orr.w r3, r3, r8, lsr #31 + 8001702: fa24 f303 lsr.w r3, r4, r3 + 8001706: 2401 movs r4, #1 + 8001708: ea84 74d8 eor.w r4, r4, r8, lsr #31 + 800170c: fa08 f504 lsl.w r5, r8, r4 + 8001710: f643 58c0 movw r8, #15808 ; 0x3dc0 + 8001714: f6c0 0800 movt r8, #2048 ; 0x800 + 8001718: 432b orrs r3, r5 + 800171a: fa0a f504 lsl.w r5, sl, r4 + 800171e: eb08 1200 add.w r2, r8, r0, lsl #4 + 8001722: 0100 lsls r0, r0, #4 + 8001724: 6856 ldr r6, [r2, #4] + 8001726: f858 0000 ldr.w r0, [r8, r0] + 800172a: 4614 mov r4, r2 + let bc = b * c; + 800172c: 9414 str r4, [sp, #80] ; 0x50 + 800172e: fba6 ae05 umull sl, lr, r6, r5 + let ad = a * d; + 8001732: fba0 2803 umull r2, r8, r0, r3 + let f = ac + (ad >> 32) + (bc >> 32) + (tmp >> 32); + 8001736: fbe6 8e63 umaal r8, lr, r6, r3 + let bd = b * d; + 800173a: fba0 3505 umull r3, r5, r0, r5 + let tmp = (bd >> 32) + (ad & MASK) + (bc & MASK) + (1 << 31) /* round */; + 800173e: 1953 adds r3, r2, r5 + 8001740: f04f 0200 mov.w r2, #0 + 8001744: f142 0500 adc.w r5, r2, #0 + 8001748: eb13 030a adds.w r3, r3, sl + 800174c: f145 0500 adc.w r5, r5, #0 + 8001750: f113 4300 adds.w r3, r3, #2147483648 ; 0x80000000 + 8001754: f145 0300 adc.w r3, r5, #0 + let f = ac + (ad >> 32) + (bc >> 32) + (tmp >> 32); + 8001758: eb13 0308 adds.w r3, r3, r8 + 800175c: f14e 0500 adc.w r5, lr, #0 + // + // the "unsafe region" is a liberal interval which we initially generate. + // the "safe region" is a conservative interval which we only accept. + // we start with the correct repr within the unsafe region, and try to find the closest repr + // to `v` which is also within the safe region. if we can't, we give up. + let plus1 = plus.f + 1; + 8001760: f113 0e01 adds.w lr, r3, #1 + let (f, e, k) = CACHED_POW10[idx as usize]; + 8001764: 8923 ldrh r3, [r4, #8] + let plus1 = plus.f + 1; + 8001766: f145 0c00 adc.w ip, r5, #0 + let e = self.e + other.e + 64; + 800176a: 444b add r3, r9 +// let plus0 = plus.f - 1; // only for explanation +// let minus0 = minus.f + 1; // only for explanation + let minus1 = minus.f - 1; + let e = -plus.e as usize; // shared exponent + 800176c: 425b negs r3, r3 + + // divide `plus1` into integral and fractional parts. + // integral parts are guaranteed to fit in u32, since cached power guarantees `plus < 2^32` + // and normalized `plus.f` is always less than `2^64 - 2^4` due to the precision requirement. + let plus1int = (plus1 >> e) as u32; + 800176e: f003 093f and.w r9, r3, #63 ; 0x3f + 8001772: f1c9 0220 rsb r2, r9, #32 + 8001776: 9219 str r2, [sp, #100] ; 0x64 + 8001778: fa0c f302 lsl.w r3, ip, r2 + 800177c: fa2e f209 lsr.w r2, lr, r9 + 8001780: ea42 0a03 orr.w sl, r2, r3 + 8001784: f1a9 0320 sub.w r3, r9, #32 + let ad = a * d; + 8001788: fba0 2b01 umull r2, fp, r0, r1 + 800178c: 2b00 cmp r3, #0 + 800178e: bfa8 it ge + 8001790: fa2c fa03 lsrge.w sl, ip, r3 + 8001794: 9c15 ldr r4, [sp, #84] ; 0x54 + let bc = b * c; + 8001796: fba6 8504 umull r8, r5, r6, r4 + let f = ac + (ad >> 32) + (bc >> 32) + (tmp >> 32); + 800179a: fbe6 b561 umaal fp, r5, r6, r1 + let bd = b * d; + 800179e: fba0 1404 umull r1, r4, r0, r4 + let tmp = (bd >> 32) + (ad & MASK) + (bc & MASK) + (1 << 31) /* round */; + 80017a2: 1911 adds r1, r2, r4 + 80017a4: f04f 0200 mov.w r2, #0 + 80017a8: f142 0200 adc.w r2, r2, #0 + 80017ac: eb11 0108 adds.w r1, r1, r8 + 80017b0: f142 0200 adc.w r2, r2, #0 + 80017b4: f111 4100 adds.w r1, r1, #2147483648 ; 0x80000000 + 80017b8: f142 0100 adc.w r1, r2, #0 + let f = ac + (ad >> 32) + (bc >> 32) + (tmp >> 32); + 80017bc: eb1b 0b01 adds.w fp, fp, r1 + 80017c0: 9916 ldr r1, [sp, #88] ; 0x58 + 80017c2: f145 0800 adc.w r8, r5, #0 + let bc = b * c; + 80017c6: fba6 2401 umull r2, r4, r6, r1 + let bd = b * d; + 80017ca: 9413 str r4, [sp, #76] ; 0x4c + 80017cc: fba0 1401 umull r1, r4, r0, r1 + 80017d0: 9917 ldr r1, [sp, #92] ; 0x5c + let ad = a * d; + 80017d2: fba0 0501 umull r0, r5, r0, r1 + let ac = a * c; + 80017d6: fba6 1601 umull r1, r6, r6, r1 + let tmp = (bd >> 32) + (ad & MASK) + (bc & MASK) + (1 << 31) /* round */; + 80017da: 1900 adds r0, r0, r4 + 80017dc: f04f 0400 mov.w r4, #0 + 80017e0: 9510 str r5, [sp, #64] ; 0x40 + 80017e2: f144 0400 adc.w r4, r4, #0 + 80017e6: 1880 adds r0, r0, r2 + 80017e8: f144 0200 adc.w r2, r4, #0 + 80017ec: f110 4000 adds.w r0, r0, #2147483648 ; 0x80000000 + 80017f0: f142 0000 adc.w r0, r2, #0 + 80017f4: 2201 movs r2, #1 + let plus1frac = plus1 & ((1 << e) - 1); + 80017f6: 2b00 cmp r3, #0 + 80017f8: 900d str r0, [sp, #52] ; 0x34 + 80017fa: 9819 ldr r0, [sp, #100] ; 0x64 + 80017fc: fa22 f400 lsr.w r4, r2, r0 + 8001800: bfa8 it ge + 8001802: fa02 f403 lslge.w r4, r2, r3 + 8001806: fa02 f209 lsl.w r2, r2, r9 + 800180a: f8cd 9054 str.w r9, [sp, #84] ; 0x54 + 800180e: bfa8 it ge + 8001810: 2200 movge r2, #0 + let (f, e, k) = CACHED_POW10[idx as usize]; + 8001812: 9814 ldr r0, [sp, #80] ; 0x50 + 8001814: f8cd e028 str.w lr, [sp, #40] ; 0x28 + 8001818: 9400 str r4, [sp, #0] + 800181a: f8cd c02c str.w ip, [sp, #44] ; 0x2c + let ac = a * c; + 800181e: 920c str r2, [sp, #48] ; 0x30 + let plus1frac = plus1 & ((1 << e) - 1); + 8001820: 3a01 subs r2, #1 + 8001822: 9214 str r2, [sp, #80] ; 0x50 + 8001824: ea02 020e and.w r2, r2, lr + 8001828: 9217 str r2, [sp, #92] ; 0x5c + 800182a: f164 0200 sbc.w r2, r4, #0 + let (f, e, k) = CACHED_POW10[idx as usize]; + 800182e: 8940 ldrh r0, [r0, #10] + 8001830: 9212 str r2, [sp, #72] ; 0x48 + let plus1frac = plus1 & ((1 << e) - 1); + 8001832: ea02 020c and.w r2, r2, ip + if x < X4 { + 8001836: 9219 str r2, [sp, #100] ; 0x64 + 8001838: f242 720f movw r2, #9999 ; 0x270f + 800183c: e9cd b806 strd fp, r8, [sp, #24] + 8001840: 9116 str r1, [sp, #88] ; 0x58 + 8001842: 4592 cmp sl, r2 + 8001844: 9011 str r0, [sp, #68] ; 0x44 + 8001846: d80e bhi.n 8001866 <core::fmt::float::float_to_decimal_common_shortest+0x484> + if x < X2 { if x < X1 {(0, 1)} else {(1, X1)} } + 8001848: f1ba 0f64 cmp.w sl, #100 ; 0x64 + 800184c: d25a bcs.n 8001904 <core::fmt::float::float_to_decimal_common_shortest+0x522> + 800184e: 250a movs r5, #10 + 8001850: f1ba 0f0a cmp.w sl, #10 + 8001854: f04f 0400 mov.w r4, #0 + 8001858: bf38 it cc + 800185a: 2501 movcc r5, #1 + 800185c: f1ba 0f09 cmp.w sl, #9 + 8001860: bf88 it hi + 8001862: 2401 movhi r4, #1 + 8001864: e058 b.n 8001918 <core::fmt::float::float_to_decimal_common_shortest+0x536> + 8001866: f244 2540 movw r5, #16960 ; 0x4240 + 800186a: f2c0 050f movt r5, #15 + if x < X6 { if x < X5 {(4, X4)} else {(5, X5)} } + 800186e: 45aa cmp sl, r5 + 8001870: f080 8202 bcs.w 8001c78 <core::fmt::float::float_to_decimal_common_shortest+0x896> + 8001874: f248 65a0 movw r5, #34464 ; 0x86a0 + 8001878: 2405 movs r4, #5 + 800187a: f2c0 0501 movt r5, #1 + 800187e: 45aa cmp sl, r5 + 8001880: bf3c itt cc + 8001882: 2404 movcc r4, #4 + 8001884: f242 7510 movwcc r5, #10000 ; 0x2710 + 8001888: e046 b.n 8001918 <core::fmt::float::float_to_decimal_common_shortest+0x536> + 800188a: 2300 movs r3, #0 + 800188c: e014 b.n 80018b8 <core::fmt::float::float_to_decimal_common_shortest+0x4d6> + (FullDecoded::Zero, Sign::MinusRaw) => if negative { b"-" } else { b"" }, + 800188e: f644 20af movw r0, #19119 ; 0x4aaf + 8001892: 2e00 cmp r6, #0 + let (negative, full_decoded) = decode(v); + 8001894: ea4f 73d6 mov.w r3, r6, lsr #31 + (FullDecoded::Zero, Sign::MinusRaw) => if negative { b"-" } else { b"" }, + 8001898: f6c0 0000 movt r0, #2048 ; 0x800 + 800189c: e00a b.n 80018b4 <core::fmt::float::float_to_decimal_common_shortest+0x4d2> + (FullDecoded::Zero, Sign::MinusPlusRaw) => if negative { b"-" } else { b"+" }, + 800189e: f644 20af movw r0, #19119 ; 0x4aaf + 80018a2: f644 25b0 movw r5, #19120 ; 0x4ab0 + 80018a6: 2e00 cmp r6, #0 + 80018a8: f04f 0301 mov.w r3, #1 + 80018ac: f6c0 0000 movt r0, #2048 ; 0x800 + 80018b0: f6c0 0500 movt r5, #2048 ; 0x800 + 80018b4: bfb8 it lt + 80018b6: 4605 movlt r5, r0 + if frac_digits > 0 { // [0.][0000] + parts[0] = Part::Copy(b"0."); + parts[1] = Part::Zero(frac_digits); + Formatted { sign: sign, parts: &parts[..2] } + } else { + parts[0] = Part::Copy(b"0"); + 80018b8: 2002 movs r0, #2 + 80018ba: f1a7 01c0 sub.w r1, r7, #192 ; 0xc0 + 80018be: f827 0cc0 strh.w r0, [r7, #-192] + 80018c2: f644 306e movw r0, #19310 ; 0x4b6e + 80018c6: f6c0 0000 movt r0, #2048 ; 0x800 + 80018ca: f847 0cbc str.w r0, [r7, #-188] + 80018ce: 2001 movs r0, #1 + 80018d0: f847 0cb8 str.w r0, [r7, #-184] + 80018d4: f000 bf19 b.w 800270a <core::fmt::float::float_to_decimal_common_shortest+0x1328> + parts[0] = Part::Copy(b"NaN"); + 80018d8: 2002 movs r0, #2 + 80018da: f244 4598 movw r5, #17560 ; 0x4498 + 80018de: f1a7 01c0 sub.w r1, r7, #192 ; 0xc0 + 80018e2: 2300 movs r3, #0 + 80018e4: f827 0cc0 strh.w r0, [r7, #-192] + 80018e8: f644 3068 movw r0, #19304 ; 0x4b68 + 80018ec: f6c0 0500 movt r5, #2048 ; 0x800 + 80018f0: f6c0 0000 movt r0, #2048 ; 0x800 + 80018f4: f847 0cbc str.w r0, [r7, #-188] + 80018f8: 2003 movs r0, #3 + 80018fa: f847 0cb8 str.w r0, [r7, #-184] + 80018fe: 2001 movs r0, #1 + 8001900: f000 bf03 b.w 800270a <core::fmt::float::float_to_decimal_common_shortest+0x1328> + else { if x < X3 {(2, X2)} else {(3, X3)} } + 8001904: f44f 757a mov.w r5, #1000 ; 0x3e8 + 8001908: f5ba 7f7a cmp.w sl, #1000 ; 0x3e8 + 800190c: f04f 0403 mov.w r4, #3 + 8001910: bf38 it cc + 8001912: 2564 movcc r5, #100 ; 0x64 + 8001914: bf38 it cc + 8001916: 2402 movcc r4, #2 + 8001918: f8dd e04c ldr.w lr, [sp, #76] ; 0x4c + 800191c: 9b10 ldr r3, [sp, #64] ; 0x40 + 800191e: 980d ldr r0, [sp, #52] ; 0x34 + 8001920: 2101 movs r1, #1 + let even = (mant & 1) == 0; + 8001922: 9a18 ldr r2, [sp, #96] ; 0x60 + 8001924: f04f 0c00 mov.w ip, #0 + 8001928: f10d 096b add.w r9, sp, #107 ; 0x6b + 800192c: ea21 0202 bic.w r2, r1, r2 + let f = ac + (ad >> 32) + (bc >> 32) + (tmp >> 32); + 8001930: 9916 ldr r1, [sp, #88] ; 0x58 + 8001932: 9213 str r2, [sp, #76] ; 0x4c + 8001934: f1d1 0201 rsbs r2, r1, #1 + 8001938: eb6c 0606 sbc.w r6, ip, r6 + 800193c: 1ad1 subs r1, r2, r3 + 800193e: f166 0200 sbc.w r2, r6, #0 + 8001942: ebb1 010e subs.w r1, r1, lr + 8001946: f162 0200 sbc.w r2, r2, #0 + let minus1 = minus.f - 1; + 800194a: 1a08 subs r0, r1, r0 + 800194c: f162 0100 sbc.w r1, r2, #0 + // + // find the digit length `kappa` between `(minus1, plus1)` as per Theorem 6.2. + // Theorem 6.2 can be adopted to exclude `x` by requiring `y mod 10^k < y - x` instead. + // (e.g. `x` = 32000, `y` = 32777; `kappa` = 2 since `y mod 10^3 = 777 < y - x = 777`.) + // the algorithm relies on the later verification phase to exclude `y`. + let delta1 = plus1 - minus1; + 8001950: 9a0a ldr r2, [sp, #40] ; 0x28 + 8001952: 1883 adds r3, r0, r2 + 8001954: 980b ldr r0, [sp, #44] ; 0x2c + 8001956: 4141 adcs r1, r0 +// let delta1int = (delta1 >> e) as usize; // only for explanation + let delta1frac = delta1 & ((1 << e) - 1); + 8001958: 9812 ldr r0, [sp, #72] ; 0x48 + 800195a: 9116 str r1, [sp, #88] ; 0x58 + 800195c: 4008 ands r0, r1 + let exp = max_kappa as i16 - minusk + 1; + 800195e: b2e1 uxtb r1, r4 + let delta1frac = delta1 & ((1 << e) - 1); + 8001960: 9010 str r0, [sp, #64] ; 0x40 + 8001962: 9814 ldr r0, [sp, #80] ; 0x50 + 8001964: 4688 mov r8, r1 + 8001966: 4018 ands r0, r3 + let exp = max_kappa as i16 - minusk + 1; + 8001968: 9001 str r0, [sp, #4] + 800196a: 9811 ldr r0, [sp, #68] ; 0x44 + 800196c: 1a09 subs r1, r1, r0 + 800196e: 9815 ldr r0, [sp, #84] ; 0x54 + 8001970: 3101 adds r1, #1 + 8001972: 910d str r1, [sp, #52] ; 0x34 + 8001974: f06f 011f mvn.w r1, #31 + 8001978: fa11 f180 uxtah r1, r1, r0 + let r = remainder % ten_kappa; + debug_assert!(q < 10); + buf[i] = b'0' + q as u8; + i += 1; + + let plus1rem = ((r as u64) << e) + plus1frac; // == (plus1 % 10^kappa) * 2^e + 800197c: 9815 ldr r0, [sp, #84] ; 0x54 + let r = remainder % ten_kappa; + 800197e: fbba f4f5 udiv r4, sl, r5 + let plus1rem = ((r as u64) << e) + plus1frac; // == (plus1 % 10^kappa) * 2^e + 8001982: 2900 cmp r1, #0 + let r = remainder % ten_kappa; + 8001984: fb04 aa15 mls sl, r4, r5, sl + buf[i] = b'0' + q as u8; + 8001988: f104 0e30 add.w lr, r4, #48 ; 0x30 + 800198c: f809 e00c strb.w lr, [r9, ip] + let plus1rem = ((r as u64) << e) + plus1frac; // == (plus1 % 10^kappa) * 2^e + 8001990: fa1f fb80 uxth.w fp, r0 + 8001994: f1cb 0020 rsb r0, fp, #32 + 8001998: fa0a f40b lsl.w r4, sl, fp + 800199c: fa2a f600 lsr.w r6, sl, r0 + 80019a0: 9018 str r0, [sp, #96] ; 0x60 + 80019a2: bfa8 it ge + 80019a4: fa0a f601 lslge.w r6, sl, r1 + 80019a8: bfa8 it ge + 80019aa: 2400 movge r4, #0 + 80019ac: 9817 ldr r0, [sp, #92] ; 0x5c + 80019ae: 1824 adds r4, r4, r0 + 80019b0: 9819 ldr r0, [sp, #100] ; 0x64 + 80019b2: 4146 adcs r6, r0 + if plus1rem < delta1 { + 80019b4: 1ae2 subs r2, r4, r3 + i += 1; + 80019b6: f10c 0001 add.w r0, ip, #1 + if plus1rem < delta1 { + 80019ba: 9a16 ldr r2, [sp, #88] ; 0x58 + 80019bc: eb76 0202 sbcs.w r2, r6, r2 + 80019c0: d314 bcc.n 80019ec <core::fmt::float::float_to_decimal_common_shortest+0x60a> + return round_and_weed(&mut buf[..i], exp, plus1rem, delta1, plus1 - v.f, ten_kappa, 1); + } + + // break the loop when we have rendered all integral digits. + // the exact number of digits is `max_kappa + 1` as `plus1 < 10^(max_kappa+1)`. + if i > max_kappa as usize { + 80019c2: 4540 cmp r0, r8 + 80019c4: f200 8092 bhi.w 8001aec <core::fmt::float::float_to_decimal_common_shortest+0x70a> + break; + } + + // restore invariants + kappa -= 1; + ten_kappa /= 10; + 80019c8: f64c 42cd movw r2, #52429 ; 0xcccd + let q = remainder / ten_kappa; + 80019cc: 2d0a cmp r5, #10 + 80019ce: 4684 mov ip, r0 + ten_kappa /= 10; + 80019d0: f6cc 42cc movt r2, #52428 ; 0xcccc + 80019d4: fba5 2602 umull r2, r6, r5, r2 + 80019d8: ea4f 02d6 mov.w r2, r6, lsr #3 + 80019dc: 4615 mov r5, r2 + 80019de: d2cd bcs.n 800197c <core::fmt::float::float_to_decimal_common_shortest+0x59a> + let q = remainder / ten_kappa; + 80019e0: f644 00b4 movw r0, #18612 ; 0x48b4 + 80019e4: f6c0 0000 movt r0, #2048 ; 0x800 + 80019e8: f7ff f883 bl 8000af2 <core::panicking::panic> + let ten_kappa = (ten_kappa as u64) << e; // scale 10^kappa back to the shared exponent + 80019ec: 9915 ldr r1, [sp, #84] ; 0x54 + 80019ee: 9017 str r0, [sp, #92] ; 0x5c + 80019f0: f06f 001f mvn.w r0, #31 + 80019f4: fa10 f081 uxtah r0, r0, r1 + 80019f8: 9918 ldr r1, [sp, #96] ; 0x60 + 80019fa: 2800 cmp r0, #0 + 80019fc: fa25 fa01 lsr.w sl, r5, r1 + 8001a00: f04f 0100 mov.w r1, #0 + 8001a04: bfa8 it ge + 8001a06: fa05 fa00 lslge.w sl, r5, r0 + 8001a0a: fa05 f50b lsl.w r5, r5, fp + 8001a0e: bfa8 it ge + 8001a10: 2500 movge r5, #0 + // combined with TC3a. + // + // consequently, we should stop when `TC1 || TC2 || (TC3a && TC3b)`. the following is + // equal to its inverse, `!TC1 && !TC2 && (!TC3a || !TC3b)`. + while plus1w < plus1v_up && + threshold - plus1w >= ten_kappa && + 8001a12: 9816 ldr r0, [sp, #88] ; 0x58 + 8001a14: ebb3 0904 subs.w r9, r3, r4 + 8001a18: 9318 str r3, [sp, #96] ; 0x60 + 8001a1a: eb60 0206 sbc.w r2, r0, r6 + 8001a1e: ebb9 0005 subs.w r0, r9, r5 + 8001a22: eb72 000a sbcs.w r0, r2, sl + 8001a26: 9211 str r2, [sp, #68] ; 0x44 + 8001a28: bf38 it cc + 8001a2a: 2101 movcc r1, #1 + return round_and_weed(&mut buf[..i], exp, plus1rem, delta1, plus1 - v.f, ten_kappa, 1); + 8001a2c: 980a ldr r0, [sp, #40] ; 0x28 + 8001a2e: 9a06 ldr r2, [sp, #24] + 8001a30: 9b07 ldr r3, [sp, #28] + 8001a32: f8cd a054 str.w sl, [sp, #84] ; 0x54 + 8001a36: 9519 str r5, [sp, #100] ; 0x64 + 8001a38: 1a80 subs r0, r0, r2 + 8001a3a: 9a0b ldr r2, [sp, #44] ; 0x2c + 8001a3c: 419a sbcs r2, r3 + let plus1v_down = plus1v + ulp; // plus1 - (v - 1 ulp) + 8001a3e: 1c43 adds r3, r0, #1 + 8001a40: 9314 str r3, [sp, #80] ; 0x50 + 8001a42: f142 0300 adc.w r3, r2, #0 + let plus1v_up = plus1v - ulp; // plus1 - (v + 1 ulp) + 8001a46: f1b0 0b01 subs.w fp, r0, #1 + 8001a4a: f162 0200 sbc.w r2, r2, #0 + while plus1w < plus1v_up && + 8001a4e: ebb4 080b subs.w r8, r4, fp + let plus1v_up = plus1v - ulp; // plus1 - (v + 1 ulp) + 8001a52: 9312 str r3, [sp, #72] ; 0x48 + while plus1w < plus1v_up && + 8001a54: eb76 0302 sbcs.w r3, r6, r2 + 8001a58: f080 810c bcs.w 8001c74 <core::fmt::float::float_to_decimal_common_shortest+0x892> + 8001a5c: 9811 ldr r0, [sp, #68] ; 0x44 + 8001a5e: ebb9 0305 subs.w r3, r9, r5 + 8001a62: eb70 030a sbcs.w r3, r0, sl + 8001a66: f0c0 8105 bcc.w 8001c74 <core::fmt::float::float_to_decimal_common_shortest+0x892> + 8001a6a: 9d0e ldr r5, [sp, #56] ; 0x38 + 8001a6c: f8dd 9064 ldr.w r9, [sp, #100] ; 0x64 + (plus1w + ten_kappa < plus1v_up || + 8001a70: eb14 0809 adds.w r8, r4, r9 + 8001a74: eb46 030a adc.w r3, r6, sl + 8001a78: ebb8 010b subs.w r1, r8, fp + 8001a7c: eb73 0102 sbcs.w r1, r3, r2 + 8001a80: d310 bcc.n 8001aa4 <core::fmt::float::float_to_decimal_common_shortest+0x6c2> + plus1v_up - plus1w >= plus1w + ten_kappa - plus1v_up) { + 8001a82: ebb8 090b subs.w r9, r8, fp + 8001a86: 9d0e ldr r5, [sp, #56] ; 0x38 + 8001a88: eb63 0002 sbc.w r0, r3, r2 + 8001a8c: ebbb 0104 subs.w r1, fp, r4 + 8001a90: eb62 0a06 sbc.w sl, r2, r6 + (plus1w + ten_kappa < plus1v_up || + 8001a94: ebb1 0109 subs.w r1, r1, r9 + 8001a98: eb7a 0100 sbcs.w r1, sl, r0 + 8001a9c: f8dd a054 ldr.w sl, [sp, #84] ; 0x54 + 8001aa0: f0c0 810e bcc.w 8001cc0 <core::fmt::float::float_to_decimal_common_shortest+0x8de> + *last -= 1; + 8001aa4: f1ae 0e01 sub.w lr, lr, #1 + 8001aa8: f10d 006b add.w r0, sp, #107 ; 0x6b + 8001aac: f8dd 9064 ldr.w r9, [sp, #100] ; 0x64 + 8001ab0: f800 e00c strb.w lr, [r0, ip] + threshold - plus1w >= ten_kappa && + 8001ab4: 9818 ldr r0, [sp, #96] ; 0x60 + 8001ab6: ebb0 0408 subs.w r4, r0, r8 + 8001aba: 9816 ldr r0, [sp, #88] ; 0x58 + 8001abc: eb60 0603 sbc.w r6, r0, r3 + 8001ac0: ebb4 0109 subs.w r1, r4, r9 + 8001ac4: eb76 010a sbcs.w r1, r6, sl + 8001ac8: f04f 0100 mov.w r1, #0 + 8001acc: bf38 it cc + 8001ace: 2101 movcc r1, #1 + while plus1w < plus1v_up && + 8001ad0: ebb8 000b subs.w r0, r8, fp + 8001ad4: eb73 0002 sbcs.w r0, r3, r2 + 8001ad8: f080 80f5 bcs.w 8001cc6 <core::fmt::float::float_to_decimal_common_shortest+0x8e4> + 8001adc: ebb4 0009 subs.w r0, r4, r9 + 8001ae0: 4644 mov r4, r8 + 8001ae2: eb76 000a sbcs.w r0, r6, sl + 8001ae6: 461e mov r6, r3 + 8001ae8: d2c2 bcs.n 8001a70 <core::fmt::float::float_to_decimal_common_shortest+0x68e> + 8001aea: e0ec b.n 8001cc6 <core::fmt::float::float_to_decimal_common_shortest+0x8e4> + 8001aec: 2100 movs r1, #0 + 8001aee: f8dd 9004 ldr.w r9, [sp, #4] + 8001af2: 9c17 ldr r4, [sp, #92] ; 0x5c + 8001af4: 9b10 ldr r3, [sp, #64] ; 0x40 + 8001af6: f06f 021f mvn.w r2, #31 + 8001afa: 2501 movs r5, #1 + 8001afc: 9116 str r1, [sp, #88] ; 0x58 + 8001afe: 9915 ldr r1, [sp, #84] ; 0x54 + 8001b00: fa12 f181 uxtah r1, r2, r1 + 8001b04: 9111 str r1, [sp, #68] ; 0x44 + 8001b06: 46ae mov lr, r5 + buf[i] = b'0' + q as u8; + 8001b08: 2810 cmp r0, #16 + 8001b0a: f200 8638 bhi.w 800277e <core::fmt::float::float_to_decimal_common_shortest+0x139c> + let r = remainder & ((1 << e) - 1); + 8001b0e: 9914 ldr r1, [sp, #80] ; 0x50 + 8001b10: f04f 0c0a mov.w ip, #10 + 8001b14: 46ca mov sl, r9 + threshold *= 10; + 8001b16: eb03 0383 add.w r3, r3, r3, lsl #2 + remainder *= 10; // won't overflow, `2^e * 10 < 2^64` + 8001b1a: fba4 250c umull r2, r5, r4, ip + let r = remainder & ((1 << e) - 1); + 8001b1e: ea02 0601 and.w r6, r2, r1 + ulp *= 10; + 8001b22: fbae 140c umull r1, r4, lr, ip + let q = remainder >> e; + 8001b26: fa22 f20b lsr.w r2, r2, fp + ulp *= 10; + 8001b2a: 9115 str r1, [sp, #84] ; 0x54 + 8001b2c: 9916 ldr r1, [sp, #88] ; 0x58 + 8001b2e: eb01 0881 add.w r8, r1, r1, lsl #2 + 8001b32: eb04 0148 add.w r1, r4, r8, lsl #1 + threshold *= 10; + 8001b36: fbaa a40c umull sl, r4, sl, ip + 8001b3a: eb04 0c43 add.w ip, r4, r3, lsl #1 + remainder *= 10; // won't overflow, `2^e * 10 < 2^64` + 8001b3e: 9b19 ldr r3, [sp, #100] ; 0x64 + 8001b40: 9116 str r1, [sp, #88] ; 0x58 + 8001b42: 9911 ldr r1, [sp, #68] ; 0x44 + 8001b44: 4634 mov r4, r6 + let r = remainder & ((1 << e) - 1); + 8001b46: 9e12 ldr r6, [sp, #72] ; 0x48 + 8001b48: 46d1 mov r9, sl + remainder *= 10; // won't overflow, `2^e * 10 < 2^64` + 8001b4a: eb03 0383 add.w r3, r3, r3, lsl #2 + let q = remainder >> e; + 8001b4e: 2900 cmp r1, #0 + remainder *= 10; // won't overflow, `2^e * 10 < 2^64` + 8001b50: eb05 0343 add.w r3, r5, r3, lsl #1 + let q = remainder >> e; + 8001b54: 9d18 ldr r5, [sp, #96] ; 0x60 + let r = remainder & ((1 << e) - 1); + 8001b56: ea06 0603 and.w r6, r6, r3 + let q = remainder >> e; + 8001b5a: fa03 f505 lsl.w r5, r3, r5 + 8001b5e: ea42 0205 orr.w r2, r2, r5 + 8001b62: 9d15 ldr r5, [sp, #84] ; 0x54 + 8001b64: bfa8 it ge + 8001b66: fa23 f201 lsrge.w r2, r3, r1 + 8001b6a: 4663 mov r3, ip + 8001b6c: 9619 str r6, [sp, #100] ; 0x64 + buf[i] = b'0' + q as u8; + 8001b6e: f102 0c30 add.w ip, r2, #48 ; 0x30 + 8001b72: f10d 026b add.w r2, sp, #107 ; 0x6b + 8001b76: f802 c000 strb.w ip, [r2, r0] + if r < threshold { + 8001b7a: ebb4 020a subs.w r2, r4, sl + i += 1; + 8001b7e: f100 0001 add.w r0, r0, #1 + if r < threshold { + 8001b82: eb76 0203 sbcs.w r2, r6, r3 + 8001b86: d2be bcs.n 8001b06 <core::fmt::float::float_to_decimal_common_shortest+0x724> + (plus1 - v.f) * ulp, ten_kappa, ulp); + 8001b88: 9017 str r0, [sp, #92] ; 0x5c + 8001b8a: 980a ldr r0, [sp, #40] ; 0x28 + 8001b8c: 9906 ldr r1, [sp, #24] + 8001b8e: 4626 mov r6, r4 + 8001b90: f8cd 8050 str.w r8, [sp, #80] ; 0x50 + 8001b94: 46c8 mov r8, r9 + 8001b96: f8cd e048 str.w lr, [sp, #72] ; 0x48 + 8001b9a: 1a42 subs r2, r0, r1 + 8001b9c: 4619 mov r1, r3 + 8001b9e: 980b ldr r0, [sp, #44] ; 0x2c + 8001ba0: 9b07 ldr r3, [sp, #28] + 8001ba2: 9110 str r1, [sp, #64] ; 0x40 + 8001ba4: eb60 0303 sbc.w r3, r0, r3 + 8001ba8: fba5 0402 umull r0, r4, r5, r2 + 8001bac: fb05 4303 mla r3, r5, r3, r4 + 8001bb0: 4634 mov r4, r6 + 8001bb2: 9e16 ldr r6, [sp, #88] ; 0x58 + let plus1v_up = plus1v - ulp; // plus1 - (v + 1 ulp) + 8001bb4: ebb0 0a05 subs.w sl, r0, r5 + (plus1 - v.f) * ulp, ten_kappa, ulp); + 8001bb8: fb06 3202 mla r2, r6, r2, r3 + let plus1v_up = plus1v - ulp; // plus1 - (v + 1 ulp) + 8001bbc: eb62 0b06 sbc.w fp, r2, r6 + let plus1v_down = plus1v + ulp; // plus1 - (v - 1 ulp) + 8001bc0: 1940 adds r0, r0, r5 + 8001bc2: 9d0c ldr r5, [sp, #48] ; 0x30 + 8001bc4: 9015 str r0, [sp, #84] ; 0x54 + 8001bc6: eb42 0006 adc.w r0, r2, r6 + 8001bca: 9e19 ldr r6, [sp, #100] ; 0x64 + threshold - plus1w >= ten_kappa && + 8001bcc: ebb8 0204 subs.w r2, r8, r4 + 8001bd0: 9016 str r0, [sp, #88] ; 0x58 + 8001bd2: 9800 ldr r0, [sp, #0] + 8001bd4: eb61 0306 sbc.w r3, r1, r6 + 8001bd8: 1b52 subs r2, r2, r5 + 8001bda: f04f 0100 mov.w r1, #0 + 8001bde: eb73 0200 sbcs.w r2, r3, r0 + 8001be2: 4681 mov r9, r0 + 8001be4: bf38 it cc + 8001be6: 2101 movcc r1, #1 + while plus1w < plus1v_up && + 8001be8: 2900 cmp r1, #0 + 8001bea: d15b bne.n 8001ca4 <core::fmt::float::float_to_decimal_common_shortest+0x8c2> + 8001bec: ebb4 020a subs.w r2, r4, sl + 8001bf0: eb76 020b sbcs.w r2, r6, fp + 8001bf4: d256 bcs.n 8001ca4 <core::fmt::float::float_to_decimal_common_shortest+0x8c2> + 8001bf6: 9a17 ldr r2, [sp, #92] ; 0x5c + 8001bf8: f10d 016b add.w r1, sp, #107 ; 0x6b + 8001bfc: 464b mov r3, r9 + 8001bfe: 1888 adds r0, r1, r2 + 8001c00: 9018 str r0, [sp, #96] ; 0x60 + (plus1w + ten_kappa < plus1v_up || + 8001c02: 1960 adds r0, r4, r5 + 8001c04: eb46 0203 adc.w r2, r6, r3 + 8001c08: ebb0 010a subs.w r1, r0, sl + 8001c0c: eb72 010b sbcs.w r1, r2, fp + 8001c10: d30d bcc.n 8001c2e <core::fmt::float::float_to_decimal_common_shortest+0x84c> + plus1v_up - plus1w >= plus1w + ten_kappa - plus1v_up) { + 8001c12: ebb0 010a subs.w r1, r0, sl + 8001c16: 4623 mov r3, r4 + 8001c18: eb62 0e0b sbc.w lr, r2, fp + 8001c1c: ebba 0504 subs.w r5, sl, r4 + 8001c20: eb6b 0406 sbc.w r4, fp, r6 + (plus1w + ten_kappa < plus1v_up || + 8001c24: 1a69 subs r1, r5, r1 + 8001c26: 9d0c ldr r5, [sp, #48] ; 0x30 + 8001c28: eb74 010e sbcs.w r1, r4, lr + 8001c2c: d37c bcc.n 8001d28 <core::fmt::float::float_to_decimal_common_shortest+0x946> + *last -= 1; + 8001c2e: 9918 ldr r1, [sp, #96] ; 0x60 + 8001c30: f1ac 0c01 sub.w ip, ip, #1 + threshold - plus1w >= ten_kappa && + 8001c34: ebb8 0300 subs.w r3, r8, r0 + 8001c38: 464e mov r6, r9 + 8001c3a: 46ae mov lr, r5 + *last -= 1; + 8001c3c: f801 cc01 strb.w ip, [r1, #-1] + threshold - plus1w >= ten_kappa && + 8001c40: 9910 ldr r1, [sp, #64] ; 0x40 + 8001c42: eb61 0402 sbc.w r4, r1, r2 + 8001c46: 1b59 subs r1, r3, r5 + 8001c48: eb74 0106 sbcs.w r1, r4, r6 + 8001c4c: f04f 0100 mov.w r1, #0 + 8001c50: bf38 it cc + 8001c52: 2101 movcc r1, #1 + while plus1w < plus1v_up && + 8001c54: ebb0 050a subs.w r5, r0, sl + 8001c58: eb72 050b sbcs.w r5, r2, fp + 8001c5c: f080 84de bcs.w 800261c <core::fmt::float::float_to_decimal_common_shortest+0x123a> + 8001c60: ebb3 030e subs.w r3, r3, lr + 8001c64: 4675 mov r5, lr + 8001c66: eb74 0306 sbcs.w r3, r4, r6 + 8001c6a: 4604 mov r4, r0 + 8001c6c: 4633 mov r3, r6 + 8001c6e: 4616 mov r6, r2 + 8001c70: d2c7 bcs.n 8001c02 <core::fmt::float::float_to_decimal_common_shortest+0x820> + 8001c72: e05c b.n 8001d2e <core::fmt::float::float_to_decimal_common_shortest+0x94c> + 8001c74: 9d0e ldr r5, [sp, #56] ; 0x38 + 8001c76: e024 b.n 8001cc2 <core::fmt::float::float_to_decimal_common_shortest+0x8e0> + 8001c78: f8dd e04c ldr.w lr, [sp, #76] ; 0x4c + 8001c7c: 9b10 ldr r3, [sp, #64] ; 0x40 + 8001c7e: 980d ldr r0, [sp, #52] ; 0x34 + 8001c80: f24e 1200 movw r2, #57600 ; 0xe100 + 8001c84: 2101 movs r1, #1 + 8001c86: f2c0 52f5 movt r2, #1525 ; 0x5f5 + else if x < X8 { if x < X7 {(6, X6)} else {(7, X7)} } + 8001c8a: 4592 cmp sl, r2 + 8001c8c: d20c bcs.n 8001ca8 <core::fmt::float::float_to_decimal_common_shortest+0x8c6> + 8001c8e: f249 6280 movw r2, #38528 ; 0x9680 + 8001c92: 2407 movs r4, #7 + 8001c94: f2c0 0298 movt r2, #152 ; 0x98 + 8001c98: 4592 cmp sl, r2 + 8001c9a: bf28 it cs + 8001c9c: 4615 movcs r5, r2 + 8001c9e: bf38 it cc + 8001ca0: 2406 movcc r4, #6 + 8001ca2: e63e b.n 8001922 <core::fmt::float::float_to_decimal_common_shortest+0x540> + 8001ca4: 4620 mov r0, r4 + 8001ca6: e041 b.n 8001d2c <core::fmt::float::float_to_decimal_common_shortest+0x94a> + else { if x < X9 {(8, X8)} else {(9, X9)} } + 8001ca8: f64c 2500 movw r5, #51712 ; 0xca00 + 8001cac: 2409 movs r4, #9 + 8001cae: f6c3 359a movt r5, #15258 ; 0x3b9a + 8001cb2: 45aa cmp sl, r5 + 8001cb4: bf28 it cs + 8001cb6: 462a movcs r2, r5 + 8001cb8: bf38 it cc + 8001cba: 2408 movcc r4, #8 + 8001cbc: 4615 mov r5, r2 + 8001cbe: e630 b.n 8001922 <core::fmt::float::float_to_decimal_common_shortest+0x540> + 8001cc0: 2100 movs r1, #0 + 8001cc2: 46a0 mov r8, r4 + 8001cc4: 4633 mov r3, r6 + 8001cc6: 9e14 ldr r6, [sp, #80] ; 0x50 + 8001cc8: f8dd c048 ldr.w ip, [sp, #72] ; 0x48 + 8001ccc: f8dd a05c ldr.w sl, [sp, #92] ; 0x5c + 8001cd0: 9c08 ldr r4, [sp, #32] + + // check if this representation is also the closest representation to `v - 1 ulp`. + // + // this is simply same to the terminating conditions for `v + 1 ulp`, with all `plus1v_up` + // replaced by `plus1v_down` instead. overflow analysis equally holds. + if plus1w < plus1v_down && + 8001cd2: ebb8 0006 subs.w r0, r8, r6 + 8001cd6: eb73 000c sbcs.w r0, r3, ip + 8001cda: d214 bcs.n 8001d06 <core::fmt::float::float_to_decimal_common_shortest+0x924> + 8001cdc: b999 cbnz r1, 8001d06 <core::fmt::float::float_to_decimal_common_shortest+0x924> + threshold - plus1w >= ten_kappa && + (plus1w + ten_kappa < plus1v_down || + 8001cde: 9819 ldr r0, [sp, #100] ; 0x64 + 8001ce0: 9915 ldr r1, [sp, #84] ; 0x54 + 8001ce2: eb10 0008 adds.w r0, r0, r8 + 8001ce6: 4159 adcs r1, r3 + 8001ce8: 1b82 subs r2, r0, r6 + 8001cea: eb71 020c sbcs.w r2, r1, ip + 8001cee: d362 bcc.n 8001db6 <core::fmt::float::float_to_decimal_common_shortest+0x9d4> + plus1v_down - plus1w >= plus1w + ten_kappa - plus1v_down) { + 8001cf0: 1b80 subs r0, r0, r6 + 8001cf2: eb61 010c sbc.w r1, r1, ip + 8001cf6: ebb6 0208 subs.w r2, r6, r8 + 8001cfa: eb6c 0603 sbc.w r6, ip, r3 + (plus1w + ten_kappa < plus1v_down || + 8001cfe: 1a10 subs r0, r2, r0 + 8001d00: eb76 0001 sbcs.w r0, r6, r1 + 8001d04: d257 bcs.n 8001db6 <core::fmt::float::float_to_decimal_common_shortest+0x9d4> + + // now we have the closest representation to `v` between `plus1` and `minus1`. + // this is too liberal, though, so we reject any `w(n)` not between `plus0` and `minus0`, + // i.e. `plus1 - plus1w(n) <= minus0` or `plus1 - plus1w(n) >= plus0`. we utilize the facts + // that `threshold = plus1 - minus1` and `plus1 - plus0 = minus0 - minus1 = 2 ulp`. + if 2 * ulp <= plus1w && plus1w <= threshold - 4 * ulp { + 8001d06: 9818 ldr r0, [sp, #96] ; 0x60 + 8001d08: 9916 ldr r1, [sp, #88] ; 0x58 + 8001d0a: 3804 subs r0, #4 + 8001d0c: f161 0100 sbc.w r1, r1, #0 + 8001d10: f1b8 0202 subs.w r2, r8, #2 + 8001d14: f173 0200 sbcs.w r2, r3, #0 + 8001d18: d34d bcc.n 8001db6 <core::fmt::float::float_to_decimal_common_shortest+0x9d4> + 8001d1a: ebb0 0008 subs.w r0, r0, r8 + 8001d1e: eb71 0003 sbcs.w r0, r1, r3 + 8001d22: f080 8495 bcs.w 8002650 <core::fmt::float::float_to_decimal_common_shortest+0x126e> + 8001d26: e046 b.n 8001db6 <core::fmt::float::float_to_decimal_common_shortest+0x9d4> + 8001d28: 2100 movs r1, #0 + 8001d2a: 4618 mov r0, r3 + 8001d2c: 4632 mov r2, r6 + 8001d2e: 9e15 ldr r6, [sp, #84] ; 0x54 + 8001d30: f8dd a058 ldr.w sl, [sp, #88] ; 0x58 + if plus1w < plus1v_down && + 8001d34: 1b83 subs r3, r0, r6 + 8001d36: eb72 030a sbcs.w r3, r2, sl + 8001d3a: d21c bcs.n 8001d76 <core::fmt::float::float_to_decimal_common_shortest+0x994> + 8001d3c: b9d9 cbnz r1, 8001d76 <core::fmt::float::float_to_decimal_common_shortest+0x994> + (plus1w + ten_kappa < plus1v_down || + 8001d3e: 1941 adds r1, r0, r5 + 8001d40: 9c08 ldr r4, [sp, #32] + 8001d42: f8dd b050 ldr.w fp, [sp, #80] ; 0x50 + 8001d46: eb42 0309 adc.w r3, r2, r9 + 8001d4a: 1b8d subs r5, r1, r6 + 8001d4c: eb73 050a sbcs.w r5, r3, sl + 8001d50: 9d0e ldr r5, [sp, #56] ; 0x38 + 8001d52: d330 bcc.n 8001db6 <core::fmt::float::float_to_decimal_common_shortest+0x9d4> + plus1v_down - plus1w >= plus1w + ten_kappa - plus1v_down) { + 8001d54: ebb1 0c06 subs.w ip, r1, r6 + 8001d58: eb63 0e0a sbc.w lr, r3, sl + 8001d5c: 1a31 subs r1, r6, r0 + 8001d5e: 9e12 ldr r6, [sp, #72] ; 0x48 + 8001d60: eb6a 0302 sbc.w r3, sl, r2 + 8001d64: f8dd a05c ldr.w sl, [sp, #92] ; 0x5c + (plus1w + ten_kappa < plus1v_down || + 8001d68: ebb1 010c subs.w r1, r1, ip + 8001d6c: eb73 010e sbcs.w r1, r3, lr + 8001d70: d221 bcs.n 8001db6 <core::fmt::float::float_to_decimal_common_shortest+0x9d4> + if 2 * ulp <= plus1w && plus1w <= threshold - 4 * ulp { + 8001d72: 2114 movs r1, #20 + 8001d74: e007 b.n 8001d86 <core::fmt::float::float_to_decimal_common_shortest+0x9a4> + 8001d76: 9e12 ldr r6, [sp, #72] ; 0x48 + 8001d78: f8dd b050 ldr.w fp, [sp, #80] ; 0x50 + 8001d7c: 2114 movs r1, #20 + 8001d7e: 9d0e ldr r5, [sp, #56] ; 0x38 + 8001d80: f8dd a05c ldr.w sl, [sp, #92] ; 0x5c + 8001d84: 9c08 ldr r4, [sp, #32] + 8001d86: fba6 1301 umull r1, r3, r6, r1 + 8001d8a: eb03 038b add.w r3, r3, fp, lsl #2 + 8001d8e: 1a41 subs r1, r0, r1 + 8001d90: eb72 0103 sbcs.w r1, r2, r3 + 8001d94: d30f bcc.n 8001db6 <core::fmt::float::float_to_decimal_common_shortest+0x9d4> + 8001d96: f06f 0127 mvn.w r1, #39 ; 0x27 + 8001d9a: fba6 1301 umull r1, r3, r6, r1 + 8001d9e: 1b9b subs r3, r3, r6 + 8001da0: eb11 0608 adds.w r6, r1, r8 + 8001da4: 9910 ldr r1, [sp, #64] ; 0x40 + 8001da6: eba3 03cb sub.w r3, r3, fp, lsl #3 + 8001daa: 4159 adcs r1, r3 +/// +/// This should be used for most cases. +pub fn format_shortest(d: &Decoded, buf: &mut [u8]) -> (/*#digits*/ usize, /*exp*/ i16) { + use num::flt2dec::strategy::dragon::format_shortest as fallback; + match format_shortest_opt(d, buf) { + Some(ret) => ret, + 8001dac: 1a30 subs r0, r6, r0 + 8001dae: eb71 0002 sbcs.w r0, r1, r2 + 8001db2: f080 844d bcs.w 8002650 <core::fmt::float::float_to_decimal_common_shortest+0x126e> + 8001db6: f1a7 08c0 sub.w r8, r7, #192 ; 0xc0 + let mut base = [0; $n]; + 8001dba: 21a0 movs r1, #160 ; 0xa0 + 8001dbc: 4640 mov r0, r8 + 8001dbe: f001 fed9 bl 8003b74 <__aeabi_memclr4> + 8001dc2: 9e02 ldr r6, [sp, #8] + 8001dc4: 9a0f ldr r2, [sp, #60] ; 0x3c + // `a.cmp(&b) < rounding` is `if d.inclusive {a <= b} else {a < b}` + let rounding = if d.inclusive {Ordering::Greater} else {Ordering::Equal}; + + // estimate `k_0` from original inputs satisfying `10^(k_0-1) < high <= 10^(k_0+1)`. + // the tight bound `k` satisfying `10^(k-1) < high <= 10^k` is calculated later. + let mut k = estimate_scaling_factor(d.mant + d.plus, d.exp); + 8001dc6: 1990 adds r0, r2, r6 + 8001dc8: eb44 0105 adc.w r1, r4, r5 +/// This is used to approximate `k = ceil(log_10 (mant * 2^exp))`; +/// the true `k` is either `k_0` or `k_0+1`. +#[doc(hidden)] +pub fn estimate_scaling_factor(mant: u64, exp: i16) -> i16 { + // 2^(nbits-1) < mant <= 2^nbits if mant > 0 + let nbits = 64 - (mant - 1).leading_zeros() as i64; + 8001dcc: 3801 subs r0, #1 + unsafe { $ctlz(self as $ActualT) as u32 } + 8001dce: fab0 f080 clz r0, r0 + 8001dd2: f171 0100 sbcs.w r1, r1, #0 + 8001dd6: f100 0020 add.w r0, r0, #32 + 8001dda: bf18 it ne + 8001ddc: fab1 f081 clzne r0, r1 + // 1292913986 = floor(2^32 * log_10 2) + // therefore this always underestimates (or is exact), but not much. + (((nbits + exp as i64) * 1292913986) >> 32) as i16 + 8001de0: 9909 ldr r1, [sp, #36] ; 0x24 + 8001de2: fa0f fa81 sxth.w sl, r1 + let nbits = 64 - (mant - 1).leading_zeros() as i64; + 8001de6: f10a 0140 add.w r1, sl, #64 ; 0x40 + (((nbits + exp as i64) * 1292913986) >> 32) as i16 + 8001dea: 1a08 subs r0, r1, r0 + 8001dec: f644 5142 movw r1, #19778 ; 0x4d42 + 8001df0: f6c4 5110 movt r1, #19728 ; 0x4d10 + 8001df4: fb50 f001 smmul r0, r0, r1 + 8001df8: b200 sxth r0, r0 + 8001dfa: 900d str r0, [sp, #52] ; 0x34 + 8001dfc: 2000 movs r0, #0 + base[sz] = v as $ty; + 8001dfe: 2827 cmp r0, #39 ; 0x27 + 8001e00: f200 8496 bhi.w 8002730 <core::fmt::float::float_to_decimal_common_shortest+0x134e> + 8001e04: f848 2020 str.w r2, [r8, r0, lsl #2] + sz += 1; + 8001e08: 3001 adds r0, #1 + while v > 0 { + 8001e0a: 2c00 cmp r4, #0 + 8001e0c: 4622 mov r2, r4 + 8001e0e: f04f 0400 mov.w r4, #0 + 8001e12: d1f4 bne.n 8001dfe <core::fmt::float::float_to_decimal_common_shortest+0xa1c> + $name { size: sz, base: base } + 8001e14: 901f str r0, [sp, #124] ; 0x7c + 8001e16: a81f add r0, sp, #124 ; 0x7c + 8001e18: 4641 mov r1, r8 + 8001e1a: 22a0 movs r2, #160 ; 0xa0 + 8001e1c: f100 0b04 add.w fp, r0, #4 + 8001e20: 4658 mov r0, fp + 8001e22: f001 fe5f bl 8003ae4 <__aeabi_memcpy4> + let mut base = [0; $n]; + 8001e26: 4640 mov r0, r8 + 8001e28: 21a0 movs r1, #160 ; 0xa0 + 8001e2a: f001 fea3 bl 8003b74 <__aeabi_memclr4> + base[sz] = v as $ty; + 8001e2e: 2001 movs r0, #1 + $name { size: sz, base: base } + 8001e30: 4641 mov r1, r8 + 8001e32: 22a0 movs r2, #160 ; 0xa0 + base[sz] = v as $ty; + 8001e34: f847 0cc0 str.w r0, [r7, #-192] + $name { size: sz, base: base } + 8001e38: 9048 str r0, [sp, #288] ; 0x120 + 8001e3a: a848 add r0, sp, #288 ; 0x120 + 8001e3c: 3004 adds r0, #4 + 8001e3e: 900e str r0, [sp, #56] ; 0x38 + 8001e40: f001 fe50 bl 8003ae4 <__aeabi_memcpy4> + let mut base = [0; $n]; + 8001e44: 4640 mov r0, r8 + 8001e46: 21a0 movs r1, #160 ; 0xa0 + 8001e48: f001 fe94 bl 8003b74 <__aeabi_memclr4> + 8001e4c: 2000 movs r0, #0 + base[sz] = v as $ty; + 8001e4e: 2827 cmp r0, #39 ; 0x27 + 8001e50: f200 846e bhi.w 8002730 <core::fmt::float::float_to_decimal_common_shortest+0x134e> + 8001e54: f848 6020 str.w r6, [r8, r0, lsl #2] + sz += 1; + 8001e58: 3001 adds r0, #1 + while v > 0 { + 8001e5a: 2d00 cmp r5, #0 + 8001e5c: 462e mov r6, r5 + 8001e5e: f04f 0500 mov.w r5, #0 + 8001e62: d1f4 bne.n 8001e4e <core::fmt::float::float_to_decimal_common_shortest+0xa6c> + $name { size: sz, base: base } + 8001e64: 9071 str r0, [sp, #452] ; 0x1c4 + 8001e66: a871 add r0, sp, #452 ; 0x1c4 + 8001e68: f1a7 01c0 sub.w r1, r7, #192 ; 0xc0 + 8001e6c: 22a0 movs r2, #160 ; 0xa0 + 8001e6e: 3004 adds r0, #4 + 8001e70: 9014 str r0, [sp, #80] ; 0x50 + 8001e72: f001 fe37 bl 8003ae4 <__aeabi_memcpy4> + $name { size: 1, base: base } + 8001e76: 2001 movs r0, #1 + 8001e78: ad9a add r5, sp, #616 ; 0x268 + 8001e7a: 219c movs r1, #156 ; 0x9c + 8001e7c: e9cd 009a strd r0, r0, [sp, #616] ; 0x268 + 8001e80: f105 0008 add.w r0, r5, #8 + 8001e84: f001 fe76 bl 8003b74 <__aeabi_memclr4> + // - `high = (mant + plus) / scale` + let mut mant = Big::from_u64(d.mant); + let mut minus = Big::from_u64(d.minus); + let mut plus = Big::from_u64(d.plus); + let mut scale = Big::from_small(1); + if d.exp < 0 { + 8001e88: f1ba 3fff cmp.w sl, #4294967295 ; 0xffffffff + 8001e8c: dd0a ble.n 8001ea4 <core::fmt::float::float_to_decimal_common_shortest+0xac2> + 8001e8e: a81f add r0, sp, #124 ; 0x7c + scale.mul_pow2(-d.exp as usize); + } else { + mant.mul_pow2(d.exp as usize); + 8001e90: 4651 mov r1, sl + 8001e92: f7fe fe32 bl 8000afa <core::num::bignum::Big32x40::mul_pow2> + 8001e96: a848 add r0, sp, #288 ; 0x120 + minus.mul_pow2(d.exp as usize); + 8001e98: 4651 mov r1, sl + 8001e9a: f7fe fe2e bl 8000afa <core::num::bignum::Big32x40::mul_pow2> + 8001e9e: a871 add r0, sp, #452 ; 0x1c4 + plus.mul_pow2(d.exp as usize); + 8001ea0: 4651 mov r1, sl + 8001ea2: e003 b.n 8001eac <core::fmt::float::float_to_decimal_common_shortest+0xaca> + scale.mul_pow2(-d.exp as usize); + 8001ea4: 9809 ldr r0, [sp, #36] ; 0x24 + 8001ea6: 4240 negs r0, r0 + 8001ea8: b201 sxth r1, r0 + 8001eaa: a89a add r0, sp, #616 ; 0x268 + 8001eac: f7fe fe25 bl 8000afa <core::num::bignum::Big32x40::mul_pow2> + 8001eb0: f8dd 8034 ldr.w r8, [sp, #52] ; 0x34 + } + + // divide `mant` by `10^k`. now `scale / 10 < mant + plus <= scale * 10`. + if k >= 0 { + 8001eb4: f04f 30ff mov.w r0, #4294967295 ; 0xffffffff + 8001eb8: 4580 cmp r8, r0 + 8001eba: dd02 ble.n 8001ec2 <core::fmt::float::float_to_decimal_common_shortest+0xae0> + 8001ebc: a89a add r0, sp, #616 ; 0x268 + mul_pow10(&mut scale, k as usize); + 8001ebe: 4641 mov r1, r8 + 8001ec0: e00c b.n 8001edc <core::fmt::float::float_to_decimal_common_shortest+0xafa> + } else { + mul_pow10(&mut mant, -k as usize); + 8001ec2: f1c8 0000 rsb r0, r8, #0 + 8001ec6: b204 sxth r4, r0 + 8001ec8: a81f add r0, sp, #124 ; 0x7c + 8001eca: 4621 mov r1, r4 + 8001ecc: f7fe fa9c bl 8000408 <core::num::flt2dec::strategy::dragon::mul_pow10> + 8001ed0: a848 add r0, sp, #288 ; 0x120 + mul_pow10(&mut minus, -k as usize); + 8001ed2: 4621 mov r1, r4 + 8001ed4: f7fe fa98 bl 8000408 <core::num::flt2dec::strategy::dragon::mul_pow10> + 8001ed8: a871 add r0, sp, #452 ; 0x1c4 + mul_pow10(&mut plus, -k as usize); + 8001eda: 4621 mov r1, r4 + 8001edc: f7fe fa94 bl 8000408 <core::num::flt2dec::strategy::dragon::mul_pow10> + } + } + + impl ::clone::Clone for $name { + fn clone(&self) -> $name { + $name { size: self.size, base: self.base } + 8001ee0: f8dd 907c ldr.w r9, [sp, #124] ; 0x7c + 8001ee4: f1a7 00c0 sub.w r0, r7, #192 ; 0xc0 + 8001ee8: 4659 mov r1, fp + 8001eea: 22a0 movs r2, #160 ; 0xa0 + 8001eec: 3004 adds r0, #4 + 8001eee: 9015 str r0, [sp, #84] ; 0x54 + 8001ef0: f847 9cc0 str.w r9, [r7, #-192] + 8001ef4: f001 fdf6 bl 8003ae4 <__aeabi_memcpy4> + let mut sz = cmp::max(self.size, other.size); + 8001ef8: 9871 ldr r0, [sp, #452] ; 0x1c4 + if other >= self { other } else { self } + 8001efa: 46cc mov ip, r9 + 8001efc: 4548 cmp r0, r9 + 8001efe: bf28 it cs + 8001f00: 4684 movcs ip, r0 + } else if self.end > slice.len() { + 8001f02: f1bc 0f29 cmp.w ip, #41 ; 0x29 + 8001f06: f080 8420 bcs.w 800274a <core::fmt::float::float_to_decimal_common_shortest+0x1368> + Some(diff / size as isize) + 8001f0a: f34c 0e1d sbfx lr, ip, #0, #30 + 8001f0e: 9914 ldr r1, [sp, #80] ; 0x50 + if self.index < self.len { + 8001f10: 2203 movs r2, #3 + 8001f12: ea42 038c orr.w r3, r2, ip, lsl #2 + 8001f16: 2b07 cmp r3, #7 + 8001f18: d32d bcc.n 8001f76 <core::fmt::float::float_to_decimal_common_shortest+0xb94> + 8001f1a: 9a15 ldr r2, [sp, #84] ; 0x54 + 8001f1c: 2400 movs r4, #0 + 8001f1e: 2300 movs r3, #0 + let (c, v) = (*a).full_add(*b, carry); + 8001f20: f851 6023 ldr.w r6, [r1, r3, lsl #2] + 8001f24: f852 5023 ldr.w r5, [r2, r3, lsl #2] + intrinsics::add_with_overflow(v, if carry {1} else {0}) + 8001f28: f004 0401 and.w r4, r4, #1 + let (v, carry1) = unsafe { intrinsics::add_with_overflow(self, other) }; + 8001f2c: 442e add r6, r5 + intrinsics::add_with_overflow(v, if carry {1} else {0}) + 8001f2e: 4434 add r4, r6 + *a = v; + 8001f30: f842 4023 str.w r4, [r2, r3, lsl #2] + intrinsics::add_with_overflow(v, if carry {1} else {0}) + 8001f34: 42b4 cmp r4, r6 + 8001f36: f04f 0401 mov.w r4, #1 + self.index += 1; + 8001f3a: f103 0301 add.w r3, r3, #1 + 8001f3e: bf28 it cs + 8001f40: 2400 movcs r4, #0 + let (v, carry1) = unsafe { intrinsics::add_with_overflow(self, other) }; + 8001f42: 42ae cmp r6, r5 + 8001f44: f04f 0601 mov.w r6, #1 + 8001f48: bf28 it cs + 8001f4a: 2600 movcs r6, #0 + if self.index < self.len { + 8001f4c: 4573 cmp r3, lr + (carry1 || carry2, v) + 8001f4e: ea44 0406 orr.w r4, r4, r6 + 8001f52: d3e5 bcc.n 8001f20 <core::fmt::float::float_to_decimal_common_shortest+0xb3e> + if carry { + 8001f54: 2c01 cmp r4, #1 + 8001f56: d10d bne.n 8001f74 <core::fmt::float::float_to_decimal_common_shortest+0xb92> + self.base[sz] = 1; + 8001f58: f1bc 0f27 cmp.w ip, #39 ; 0x27 + 8001f5c: ad9a add r5, sp, #616 ; 0x268 + 8001f5e: f200 841c bhi.w 800279a <core::fmt::float::float_to_decimal_common_shortest+0x13b8> + 8001f62: f1a7 01c0 sub.w r1, r7, #192 ; 0xc0 + 8001f66: 2301 movs r3, #1 + 8001f68: eb01 028c add.w r2, r1, ip, lsl #2 + sz += 1; + 8001f6c: f10c 0c01 add.w ip, ip, #1 + self.base[sz] = 1; + 8001f70: 6053 str r3, [r2, #4] + 8001f72: e000 b.n 8001f76 <core::fmt::float::float_to_decimal_common_shortest+0xb94> + 8001f74: ad9a add r5, sp, #616 ; 0x268 + let sz = max(self.size, other.size); + 8001f76: f8dd e268 ldr.w lr, [sp, #616] ; 0x268 + self.size = sz; + 8001f7a: f847 ccc0 str.w ip, [r7, #-192] + 8001f7e: 45f4 cmp ip, lr + 8001f80: bf38 it cc + 8001f82: 46f4 movcc ip, lr + } else if self.end > slice.len() { + 8001f84: f1bc 0f29 cmp.w ip, #41 ; 0x29 + 8001f88: f080 83df bcs.w 800274a <core::fmt::float::float_to_decimal_common_shortest+0x1368> + Self::Item: Ord, + Self: Sized, + { + let mut other = other.into_iter(); + + loop { + 8001f8c: ea4f 018c mov.w r1, ip, lsl #2 + 8001f90: ae48 add r6, sp, #288 ; 0x120 + if self.end == self.ptr { + 8001f92: 2900 cmp r1, #0 + 8001f94: d00d beq.n 8001fb2 <core::fmt::float::float_to_decimal_common_shortest+0xbd0> + 8001f96: d018 beq.n 8001fca <core::fmt::float::float_to_decimal_common_shortest+0xbe8> + 8001f98: f1a7 03c0 sub.w r3, r7, #192 ; 0xc0 + 8001f9c: 586a ldr r2, [r5, r1] + 8001f9e: 585b ldr r3, [r3, r1] + None => return Ordering::Greater, + Some(val) => val, + }; + + match x.cmp(&y) { + Ordering::Equal => (), + 8001fa0: 3904 subs r1, #4 + 8001fa2: 429a cmp r2, r3 + 8001fa4: d0f5 beq.n 8001f92 <core::fmt::float::float_to_decimal_common_shortest+0xbb0> + #[stable(feature = "rust1", since = "1.0.0")] + impl Ord for $t { + #[inline] + fn cmp(&self, other: &$t) -> Ordering { + if *self == *other { Equal } + else if *self < *other { Less } + 8001fa6: f04f 0101 mov.w r1, #1 + 8001faa: bf38 it cc + 8001fac: f04f 31ff movcc.w r1, #4294967295 ; 0xffffffff + 8001fb0: e002 b.n 8001fb8 <core::fmt::float::float_to_decimal_common_shortest+0xbd6> + return Ordering::Equal + 8001fb2: bf18 it ne + 8001fb4: f04f 31ff movne.w r1, #4294967295 ; 0xffffffff + // we are not actually modifying `scale`, since we can skip the initial multiplication instead. + // now `scale < mant + plus <= scale * 10` and we are ready to generate digits. + // + // note that `d[0]` *can* be zero, when `scale - plus < mant < scale`. + // in this case rounding-up condition (`up` below) will be triggered immediately. + if scale.cmp(mant.clone().add(&plus)) < rounding { + 8001fb8: 9a13 ldr r2, [sp, #76] ; 0x4c + 8001fba: b249 sxtb r1, r1 + 8001fbc: 4291 cmp r1, r2 + 8001fbe: da04 bge.n 8001fca <core::fmt::float::float_to_decimal_common_shortest+0xbe8> + // equivalent to scaling `scale` by 10 + k += 1; + 8001fc0: f108 0801 add.w r8, r8, #1 + 8001fc4: f8cd 8034 str.w r8, [sp, #52] ; 0x34 + 8001fc8: e075 b.n 80020b6 <core::fmt::float::float_to_decimal_common_shortest+0xcd4> + } else if self.end > slice.len() { + 8001fca: f1b9 0f29 cmp.w r9, #41 ; 0x29 + 8001fce: f080 83c0 bcs.w 8002752 <core::fmt::float::float_to_decimal_common_shortest+0x1370> + 8001fd2: 2100 movs r1, #0 + if self.ptr == self.end { + 8001fd4: f1b9 0f00 cmp.w r9, #0 + 8001fd8: d020 beq.n 800201c <core::fmt::float::float_to_decimal_common_shortest+0xc3a> + intrinsics::offset(self, count) as *mut T + 8001fda: aa1f add r2, sp, #124 ; 0x7c + 8001fdc: ea4f 0489 mov.w r4, r9, lsl #2 + 8001fe0: 230a movs r3, #10 + 8001fe2: 465e mov r6, fp + 8001fe4: eb02 0289 add.w r2, r2, r9, lsl #2 + 8001fe8: f102 0c04 add.w ip, r2, #4 + let v = (self as $bigty) * (other as $bigty) + (carry as $bigty); + 8001fec: 6835 ldr r5, [r6, #0] + 8001fee: 2200 movs r2, #0 + 8001ff0: 3c04 subs r4, #4 + 8001ff2: fbe5 1203 umlal r1, r2, r5, r3 + *a = v; + 8001ff6: f846 1b04 str.w r1, [r6], #4 + 8001ffa: 4611 mov r1, r2 + 8001ffc: d1f6 bne.n 8001fec <core::fmt::float::float_to_decimal_common_shortest+0xc0a> + if carry > 0 { + 8001ffe: 2a00 cmp r2, #0 + 8002000: ac48 add r4, sp, #288 ; 0x120 + 8002002: d008 beq.n 8002016 <core::fmt::float::float_to_decimal_common_shortest+0xc34> + self.base[sz] = carry; + 8002004: f1b9 0f27 cmp.w r9, #39 ; 0x27 + 8002008: f200 8405 bhi.w 8002816 <core::fmt::float::float_to_decimal_common_shortest+0x1434> + 800200c: f8cc 2000 str.w r2, [ip] + sz += 1; + 8002010: f109 0101 add.w r1, r9, #1 + 8002014: e000 b.n 8002018 <core::fmt::float::float_to_decimal_common_shortest+0xc36> + 8002016: 4649 mov r1, r9 + 8002018: ad9a add r5, sp, #616 ; 0x268 + 800201a: 4626 mov r6, r4 + let mut sz = self.size; + 800201c: f8dd 8120 ldr.w r8, [sp, #288] ; 0x120 + self.size = sz; + 8002020: 911f str r1, [sp, #124] ; 0x7c + } else if self.end > slice.len() { + 8002022: f1b8 0f29 cmp.w r8, #41 ; 0x29 + 8002026: f080 83ef bcs.w 8002808 <core::fmt::float::float_to_decimal_common_shortest+0x1426> + 800202a: 2100 movs r1, #0 + if self.ptr == self.end { + 800202c: f1b8 0f00 cmp.w r8, #0 + 8002030: d01d beq.n 800206e <core::fmt::float::float_to_decimal_common_shortest+0xc8c> + 8002032: eb06 0288 add.w r2, r6, r8, lsl #2 + 8002036: 9e0e ldr r6, [sp, #56] ; 0x38 + 8002038: ea4f 0488 mov.w r4, r8, lsl #2 + 800203c: f102 0c04 add.w ip, r2, #4 + 8002040: 220a movs r2, #10 + let v = (self as $bigty) * (other as $bigty) + (carry as $bigty); + 8002042: 6835 ldr r5, [r6, #0] + 8002044: 2300 movs r3, #0 + 8002046: 3c04 subs r4, #4 + 8002048: fbe5 1302 umlal r1, r3, r5, r2 + *a = v; + 800204c: f846 1b04 str.w r1, [r6], #4 + 8002050: 4619 mov r1, r3 + 8002052: d1f6 bne.n 8002042 <core::fmt::float::float_to_decimal_common_shortest+0xc60> + 8002054: b14b cbz r3, 800206a <core::fmt::float::float_to_decimal_common_shortest+0xc88> + self.base[sz] = carry; + 8002056: f1b8 0f27 cmp.w r8, #39 ; 0x27 + 800205a: ad9a add r5, sp, #616 ; 0x268 + 800205c: f200 83df bhi.w 800281e <core::fmt::float::float_to_decimal_common_shortest+0x143c> + sz += 1; + 8002060: f108 0101 add.w r1, r8, #1 + self.base[sz] = carry; + 8002064: f8cc 3000 str.w r3, [ip] + 8002068: e001 b.n 800206e <core::fmt::float::float_to_decimal_common_shortest+0xc8c> + 800206a: 4641 mov r1, r8 + 800206c: ad9a add r5, sp, #616 ; 0x268 + } else if self.end > slice.len() { + 800206e: 2829 cmp r0, #41 ; 0x29 + self.size = sz; + 8002070: 9148 str r1, [sp, #288] ; 0x120 + 8002072: f080 83cd bcs.w 8002810 <core::fmt::float::float_to_decimal_common_shortest+0x142e> + 8002076: 2300 movs r3, #0 + if self.ptr == self.end { + 8002078: 2800 cmp r0, #0 + 800207a: d01b beq.n 80020b4 <core::fmt::float::float_to_decimal_common_shortest+0xcd2> + 800207c: 9e14 ldr r6, [sp, #80] ; 0x50 + 800207e: a971 add r1, sp, #452 ; 0x1c4 + 8002080: 0084 lsls r4, r0, #2 + 8002082: 220a movs r2, #10 + 8002084: eb01 0180 add.w r1, r1, r0, lsl #2 + 8002088: f101 0c04 add.w ip, r1, #4 + let v = (self as $bigty) * (other as $bigty) + (carry as $bigty); + 800208c: 6835 ldr r5, [r6, #0] + 800208e: 2100 movs r1, #0 + 8002090: 3c04 subs r4, #4 + 8002092: fbe5 3102 umlal r3, r1, r5, r2 + *a = v; + 8002096: f846 3b04 str.w r3, [r6], #4 + 800209a: 460b mov r3, r1 + 800209c: d1f6 bne.n 800208c <core::fmt::float::float_to_decimal_common_shortest+0xcaa> + 800209e: b139 cbz r1, 80020b0 <core::fmt::float::float_to_decimal_common_shortest+0xcce> + self.base[sz] = carry; + 80020a0: 2827 cmp r0, #39 ; 0x27 + 80020a2: ad9a add r5, sp, #616 ; 0x268 + 80020a4: f200 83bf bhi.w 8002826 <core::fmt::float::float_to_decimal_common_shortest+0x1444> + sz += 1; + 80020a8: 1c43 adds r3, r0, #1 + self.base[sz] = carry; + 80020aa: f8cc 1000 str.w r1, [ip] + 80020ae: e001 b.n 80020b4 <core::fmt::float::float_to_decimal_common_shortest+0xcd2> + 80020b0: 4603 mov r3, r0 + 80020b2: ad9a add r5, sp, #616 ; 0x268 + self.size = sz; + 80020b4: 9371 str r3, [sp, #452] ; 0x1c4 + 80020b6: f50d 7843 add.w r8, sp, #780 ; 0x30c + $name { size: self.size, base: self.base } + 80020ba: 1d2e adds r6, r5, #4 + 80020bc: 22a0 movs r2, #160 ; 0xa0 + 80020be: f8cd e30c str.w lr, [sp, #780] ; 0x30c + 80020c2: f108 0904 add.w r9, r8, #4 + 80020c6: 4631 mov r1, r6 + 80020c8: 4648 mov r0, r9 + 80020ca: f001 fd0b bl 8003ae4 <__aeabi_memcpy4> + minus.mul_small(10); + plus.mul_small(10); + } + + // cache `(2, 4, 8) * scale` for digit generation. + let mut scale2 = scale.clone(); scale2.mul_pow2(1); + 80020ce: 4640 mov r0, r8 + 80020d0: 2101 movs r1, #1 + 80020d2: f7fe fd12 bl 8000afa <core::num::bignum::Big32x40::mul_pow2> + 80020d6: 989a ldr r0, [sp, #616] ; 0x268 + 80020d8: f50d 7a6c add.w sl, sp, #944 ; 0x3b0 + 80020dc: 4631 mov r1, r6 + 80020de: 22a0 movs r2, #160 ; 0xa0 + 80020e0: 90ec str r0, [sp, #944] ; 0x3b0 + 80020e2: f10a 0004 add.w r0, sl, #4 + 80020e6: 9012 str r0, [sp, #72] ; 0x48 + 80020e8: f001 fcfc bl 8003ae4 <__aeabi_memcpy4> + let mut scale4 = scale.clone(); scale4.mul_pow2(2); + 80020ec: 4650 mov r0, sl + 80020ee: 2102 movs r1, #2 + 80020f0: f7fe fd03 bl 8000afa <core::num::bignum::Big32x40::mul_pow2> + 80020f4: 989a ldr r0, [sp, #616] ; 0x268 + 80020f6: f20d 4454 addw r4, sp, #1108 ; 0x454 + 80020fa: 4631 mov r1, r6 + 80020fc: 22a0 movs r2, #160 ; 0xa0 + 80020fe: 9611 str r6, [sp, #68] ; 0x44 + 8002100: f8cd 0454 str.w r0, [sp, #1108] ; 0x454 + 8002104: 1d20 adds r0, r4, #4 + 8002106: 9018 str r0, [sp, #96] ; 0x60 + 8002108: f001 fcec bl 8003ae4 <__aeabi_memcpy4> + let mut scale8 = scale.clone(); scale8.mul_pow2(3); + 800210c: 4620 mov r0, r4 + 800210e: 2103 movs r1, #3 + 8002110: f7fe fcf3 bl 8000afa <core::num::bignum::Big32x40::mul_pow2> + let sz = max(self.size, other.size); + 8002114: f8dd 1454 ldr.w r1, [sp, #1108] ; 0x454 + 8002118: f8dd a07c ldr.w sl, [sp, #124] ; 0x7c + if other >= self { other } else { self } + 800211c: 4551 cmp r1, sl + 800211e: 4650 mov r0, sl + 8002120: 910f str r1, [sp, #60] ; 0x3c + 8002122: bf28 it cs + 8002124: 4608 movcs r0, r1 + } else if self.end > slice.len() { + 8002126: 2828 cmp r0, #40 ; 0x28 + 8002128: f200 824f bhi.w 80025ca <core::fmt::float::float_to_decimal_common_shortest+0x11e8> + 800212c: f8dd c060 ldr.w ip, [sp, #96] ; 0x60 + 8002130: 2100 movs r1, #0 + 8002132: f10d 0e7c add.w lr, sp, #124 ; 0x7c + 8002136: f8cd 9040 str.w r9, [sp, #64] ; 0x40 + 800213a: 9117 str r1, [sp, #92] ; 0x5c + 800213c: 9917 ldr r1, [sp, #92] ; 0x5c + loop { + 800213e: 9116 str r1, [sp, #88] ; 0x58 + 8002140: 0081 lsls r1, r0, #2 + if self.end == self.ptr { + 8002142: 2900 cmp r1, #0 + 8002144: d008 beq.n 8002158 <core::fmt::float::float_to_decimal_common_shortest+0xd76> + 8002146: d00f beq.n 8002168 <core::fmt::float::float_to_decimal_common_shortest+0xd86> + 8002148: f85e 2001 ldr.w r2, [lr, r1] + 800214c: 5863 ldr r3, [r4, r1] + Ordering::Equal => (), + 800214e: 3904 subs r1, #4 + 8002150: 429a cmp r2, r3 + 8002152: d0f6 beq.n 8002142 <core::fmt::float::float_to_decimal_common_shortest+0xd60> + 8002154: d301 bcc.n 800215a <core::fmt::float::float_to_decimal_common_shortest+0xd78> + 8002156: e007 b.n 8002168 <core::fmt::float::float_to_decimal_common_shortest+0xd86> + 8002158: d006 beq.n 8002168 <core::fmt::float::float_to_decimal_common_shortest+0xd86> + 800215a: 4650 mov r0, sl + 800215c: f8dd a048 ldr.w sl, [sp, #72] ; 0x48 + 8002160: f04f 0c00 mov.w ip, #0 + 8002164: acec add r4, sp, #944 ; 0x3b0 + 8002166: e02d b.n 80021c4 <core::fmt::float::float_to_decimal_common_shortest+0xde2> + 8002168: 2103 movs r1, #3 + 800216a: acec add r4, sp, #944 ; 0x3b0 + 800216c: ea41 0280 orr.w r2, r1, r0, lsl #2 + Some(diff / size as isize) + 8002170: f340 011d sbfx r1, r0, #0, #30 + 8002174: f8dd a048 ldr.w sl, [sp, #72] ; 0x48 + 8002178: 2a07 cmp r2, #7 + 800217a: d320 bcc.n 80021be <core::fmt::float::float_to_decimal_common_shortest+0xddc> + 800217c: 2200 movs r2, #0 + 800217e: 2301 movs r3, #1 + let (c, v) = (*a).full_add(!*b, noborrow); + 8002180: f85c 5022 ldr.w r5, [ip, r2, lsl #2] + 8002184: f85b 6022 ldr.w r6, [fp, r2, lsl #2] + intrinsics::add_with_overflow(v, if carry {1} else {0}) + 8002188: f003 0301 and.w r3, r3, #1 + let (c, v) = (*a).full_add(!*b, noborrow); + 800218c: 43ed mvns r5, r5 + let (v, carry1) = unsafe { intrinsics::add_with_overflow(self, other) }; + 800218e: 4435 add r5, r6 + intrinsics::add_with_overflow(v, if carry {1} else {0}) + 8002190: 442b add r3, r5 + *a = v; + 8002192: f84b 3022 str.w r3, [fp, r2, lsl #2] + intrinsics::add_with_overflow(v, if carry {1} else {0}) + 8002196: 42ab cmp r3, r5 + 8002198: f04f 0301 mov.w r3, #1 + self.index += 1; + 800219c: f102 0201 add.w r2, r2, #1 + 80021a0: bf28 it cs + 80021a2: 2300 movcs r3, #0 + let (v, carry1) = unsafe { intrinsics::add_with_overflow(self, other) }; + 80021a4: 42b5 cmp r5, r6 + 80021a6: f04f 0601 mov.w r6, #1 + 80021aa: bf28 it cs + 80021ac: 2600 movcs r6, #0 + if self.index < self.len { + 80021ae: 428a cmp r2, r1 + (carry1 || carry2, v) + 80021b0: ea43 0306 orr.w r3, r3, r6 + 80021b4: d3e4 bcc.n 8002180 <core::fmt::float::float_to_decimal_common_shortest+0xd9e> + assert!(noborrow); + 80021b6: 2b00 cmp r3, #0 + 80021b8: ad9a add r5, sp, #616 ; 0x268 + 80021ba: f000 82c0 beq.w 800273e <core::fmt::float::float_to_decimal_common_shortest+0x135c> + 80021be: f04f 0c08 mov.w ip, #8 + self.size = sz; + 80021c2: 901f str r0, [sp, #124] ; 0x7c + let sz = max(self.size, other.size); + 80021c4: 99ec ldr r1, [sp, #944] ; 0x3b0 + 80021c6: 4281 cmp r1, r0 + 80021c8: bf38 it cc + 80021ca: 4601 movcc r1, r0 + } else if self.end > slice.len() { + 80021cc: 2929 cmp r1, #41 ; 0x29 + 80021ce: f080 82c4 bcs.w 800275a <core::fmt::float::float_to_decimal_common_shortest+0x1378> + loop { + 80021d2: 008a lsls r2, r1, #2 + if self.end == self.ptr { + 80021d4: 2a00 cmp r2, #0 + 80021d6: d009 beq.n 80021ec <core::fmt::float::float_to_decimal_common_shortest+0xe0a> + 80021d8: d00b beq.n 80021f2 <core::fmt::float::float_to_decimal_common_shortest+0xe10> + 80021da: f85e 3002 ldr.w r3, [lr, r2] + 80021de: 58a6 ldr r6, [r4, r2] + Ordering::Equal => (), + 80021e0: 3a04 subs r2, #4 + 80021e2: 42b3 cmp r3, r6 + 80021e4: d0f6 beq.n 80021d4 <core::fmt::float::float_to_decimal_common_shortest+0xdf2> + 80021e6: d204 bcs.n 80021f2 <core::fmt::float::float_to_decimal_common_shortest+0xe10> + let sz = cmp::max(self.size, other.size); + 80021e8: 4601 mov r1, r0 + 80021ea: e02d b.n 8002248 <core::fmt::float::float_to_decimal_common_shortest+0xe66> + 80021ec: d001 beq.n 80021f2 <core::fmt::float::float_to_decimal_common_shortest+0xe10> + 80021ee: 4601 mov r1, r0 + 80021f0: e02a b.n 8002248 <core::fmt::float::float_to_decimal_common_shortest+0xe66> + 80021f2: 2003 movs r0, #3 + 80021f4: ea40 0281 orr.w r2, r0, r1, lsl #2 + 80021f8: f341 001d sbfx r0, r1, #0, #30 + 80021fc: 2a07 cmp r2, #7 + 80021fe: d320 bcc.n 8002242 <core::fmt::float::float_to_decimal_common_shortest+0xe60> + 8002200: 2300 movs r3, #0 + 8002202: 2201 movs r2, #1 + let (c, v) = (*a).full_add(!*b, noborrow); + 8002204: f85a 5023 ldr.w r5, [sl, r3, lsl #2] + 8002208: f85b 6023 ldr.w r6, [fp, r3, lsl #2] + intrinsics::add_with_overflow(v, if carry {1} else {0}) + 800220c: f002 0201 and.w r2, r2, #1 + let (c, v) = (*a).full_add(!*b, noborrow); + 8002210: 43ed mvns r5, r5 + let (v, carry1) = unsafe { intrinsics::add_with_overflow(self, other) }; + 8002212: 4435 add r5, r6 + intrinsics::add_with_overflow(v, if carry {1} else {0}) + 8002214: 442a add r2, r5 + *a = v; + 8002216: f84b 2023 str.w r2, [fp, r3, lsl #2] + intrinsics::add_with_overflow(v, if carry {1} else {0}) + 800221a: 42aa cmp r2, r5 + 800221c: f04f 0201 mov.w r2, #1 + self.index += 1; + 8002220: f103 0301 add.w r3, r3, #1 + 8002224: bf28 it cs + 8002226: 2200 movcs r2, #0 + let (v, carry1) = unsafe { intrinsics::add_with_overflow(self, other) }; + 8002228: 42b5 cmp r5, r6 + 800222a: f04f 0601 mov.w r6, #1 + 800222e: bf28 it cs + 8002230: 2600 movcs r6, #0 + if self.index < self.len { + 8002232: 4283 cmp r3, r0 + (carry1 || carry2, v) + 8002234: ea42 0206 orr.w r2, r2, r6 + 8002238: d3e4 bcc.n 8002204 <core::fmt::float::float_to_decimal_common_shortest+0xe22> + assert!(noborrow); + 800223a: 2a00 cmp r2, #0 + 800223c: ad9a add r5, sp, #616 ; 0x268 + 800223e: f000 827e beq.w 800273e <core::fmt::float::float_to_decimal_common_shortest+0x135c> + if *x >= *scale4 { x.sub(scale4); d += 4; } + 8002242: f04c 0c04 orr.w ip, ip, #4 + self.size = sz; + 8002246: 911f str r1, [sp, #124] ; 0x7c + let sz = max(self.size, other.size); + 8002248: 98c3 ldr r0, [sp, #780] ; 0x30c + 800224a: 4288 cmp r0, r1 + 800224c: bf38 it cc + 800224e: 4608 movcc r0, r1 + } else if self.end > slice.len() { + 8002250: 2829 cmp r0, #41 ; 0x29 + 8002252: f080 8283 bcs.w 800275c <core::fmt::float::float_to_decimal_common_shortest+0x137a> + loop { + 8002256: 0082 lsls r2, r0, #2 + if self.end == self.ptr { + 8002258: 2a00 cmp r2, #0 + 800225a: d009 beq.n 8002270 <core::fmt::float::float_to_decimal_common_shortest+0xe8e> + 800225c: d00e beq.n 800227c <core::fmt::float::float_to_decimal_common_shortest+0xe9a> + 800225e: f85e 3002 ldr.w r3, [lr, r2] + 8002262: f858 6002 ldr.w r6, [r8, r2] + Ordering::Equal => (), + 8002266: 3a04 subs r2, #4 + 8002268: 42b3 cmp r3, r6 + 800226a: d0f5 beq.n 8002258 <core::fmt::float::float_to_decimal_common_shortest+0xe76> + 800226c: d301 bcc.n 8002272 <core::fmt::float::float_to_decimal_common_shortest+0xe90> + 800226e: e005 b.n 800227c <core::fmt::float::float_to_decimal_common_shortest+0xe9a> + 8002270: d004 beq.n 800227c <core::fmt::float::float_to_decimal_common_shortest+0xe9a> + 8002272: 9c11 ldr r4, [sp, #68] ; 0x44 + 8002274: f8dd 8058 ldr.w r8, [sp, #88] ; 0x58 + 8002278: 4608 mov r0, r1 + 800227a: e02d b.n 80022d8 <core::fmt::float::float_to_decimal_common_shortest+0xef6> + 800227c: 2103 movs r1, #3 + 800227e: ea41 0280 orr.w r2, r1, r0, lsl #2 + 8002282: f340 011d sbfx r1, r0, #0, #30 + 8002286: 9c11 ldr r4, [sp, #68] ; 0x44 + 8002288: f8dd 8058 ldr.w r8, [sp, #88] ; 0x58 + 800228c: 2a07 cmp r2, #7 + 800228e: d320 bcc.n 80022d2 <core::fmt::float::float_to_decimal_common_shortest+0xef0> + 8002290: 2300 movs r3, #0 + 8002292: 2201 movs r2, #1 + let (c, v) = (*a).full_add(!*b, noborrow); + 8002294: f859 5023 ldr.w r5, [r9, r3, lsl #2] + 8002298: f85b 6023 ldr.w r6, [fp, r3, lsl #2] + intrinsics::add_with_overflow(v, if carry {1} else {0}) + 800229c: f002 0201 and.w r2, r2, #1 + let (c, v) = (*a).full_add(!*b, noborrow); + 80022a0: 43ed mvns r5, r5 + let (v, carry1) = unsafe { intrinsics::add_with_overflow(self, other) }; + 80022a2: 4435 add r5, r6 + intrinsics::add_with_overflow(v, if carry {1} else {0}) + 80022a4: 442a add r2, r5 + *a = v; + 80022a6: f84b 2023 str.w r2, [fp, r3, lsl #2] + intrinsics::add_with_overflow(v, if carry {1} else {0}) + 80022aa: 42aa cmp r2, r5 + 80022ac: f04f 0201 mov.w r2, #1 + self.index += 1; + 80022b0: f103 0301 add.w r3, r3, #1 + 80022b4: bf28 it cs + 80022b6: 2200 movcs r2, #0 + let (v, carry1) = unsafe { intrinsics::add_with_overflow(self, other) }; + 80022b8: 42b5 cmp r5, r6 + 80022ba: f04f 0601 mov.w r6, #1 + 80022be: bf28 it cs + 80022c0: 2600 movcs r6, #0 + if self.index < self.len { + 80022c2: 428b cmp r3, r1 + (carry1 || carry2, v) + 80022c4: ea42 0206 orr.w r2, r2, r6 + 80022c8: d3e4 bcc.n 8002294 <core::fmt::float::float_to_decimal_common_shortest+0xeb2> + assert!(noborrow); + 80022ca: 2a00 cmp r2, #0 + 80022cc: ad9a add r5, sp, #616 ; 0x268 + 80022ce: f000 8236 beq.w 800273e <core::fmt::float::float_to_decimal_common_shortest+0x135c> + if *x >= *scale2 { x.sub(scale2); d += 2; } + 80022d2: f10c 0c02 add.w ip, ip, #2 + self.size = sz; + 80022d6: 901f str r0, [sp, #124] ; 0x7c + let sz = max(self.size, other.size); + 80022d8: f8dd 9268 ldr.w r9, [sp, #616] ; 0x268 + 80022dc: 4682 mov sl, r0 + 80022de: 4581 cmp r9, r0 + 80022e0: bf28 it cs + 80022e2: 46ca movcs sl, r9 + } else if self.end > slice.len() { + 80022e4: f1ba 0f29 cmp.w sl, #41 ; 0x29 + 80022e8: f080 8225 bcs.w 8002736 <core::fmt::float::float_to_decimal_common_shortest+0x1354> + loop { + 80022ec: ea4f 018a mov.w r1, sl, lsl #2 + if self.end == self.ptr { + 80022f0: 2900 cmp r1, #0 + 80022f2: d009 beq.n 8002308 <core::fmt::float::float_to_decimal_common_shortest+0xf26> + 80022f4: d00b beq.n 800230e <core::fmt::float::float_to_decimal_common_shortest+0xf2c> + 80022f6: f85e 2001 ldr.w r2, [lr, r1] + 80022fa: 586b ldr r3, [r5, r1] + Ordering::Equal => (), + 80022fc: 3904 subs r1, #4 + 80022fe: 429a cmp r2, r3 + 8002300: d0f6 beq.n 80022f0 <core::fmt::float::float_to_decimal_common_shortest+0xf0e> + 8002302: d204 bcs.n 800230e <core::fmt::float::float_to_decimal_common_shortest+0xf2c> + let mut sz = self.size; + 8002304: 4682 mov sl, r0 + 8002306: e02d b.n 8002364 <core::fmt::float::float_to_decimal_common_shortest+0xf82> + 8002308: d001 beq.n 800230e <core::fmt::float::float_to_decimal_common_shortest+0xf2c> + 800230a: 4682 mov sl, r0 + 800230c: e02a b.n 8002364 <core::fmt::float::float_to_decimal_common_shortest+0xf82> + 800230e: 2003 movs r0, #3 + 8002310: ea40 018a orr.w r1, r0, sl, lsl #2 + 8002314: f34a 001d sbfx r0, sl, #0, #30 + 8002318: 2907 cmp r1, #7 + 800231a: d31f bcc.n 800235c <core::fmt::float::float_to_decimal_common_shortest+0xf7a> + 800231c: 2100 movs r1, #0 + 800231e: 2201 movs r2, #1 + let (c, v) = (*a).full_add(!*b, noborrow); + 8002320: f854 6021 ldr.w r6, [r4, r1, lsl #2] + 8002324: f85b 3021 ldr.w r3, [fp, r1, lsl #2] + intrinsics::add_with_overflow(v, if carry {1} else {0}) + 8002328: f002 0201 and.w r2, r2, #1 + let (c, v) = (*a).full_add(!*b, noborrow); + 800232c: 43f6 mvns r6, r6 + let (v, carry1) = unsafe { intrinsics::add_with_overflow(self, other) }; + 800232e: 441e add r6, r3 + intrinsics::add_with_overflow(v, if carry {1} else {0}) + 8002330: 4432 add r2, r6 + *a = v; + 8002332: f84b 2021 str.w r2, [fp, r1, lsl #2] + intrinsics::add_with_overflow(v, if carry {1} else {0}) + 8002336: 42b2 cmp r2, r6 + 8002338: f04f 0201 mov.w r2, #1 + self.index += 1; + 800233c: f101 0101 add.w r1, r1, #1 + 8002340: bf28 it cs + 8002342: 2200 movcs r2, #0 + let (v, carry1) = unsafe { intrinsics::add_with_overflow(self, other) }; + 8002344: 429e cmp r6, r3 + 8002346: f04f 0301 mov.w r3, #1 + 800234a: bf28 it cs + 800234c: 2300 movcs r3, #0 + if self.index < self.len { + 800234e: 4281 cmp r1, r0 + (carry1 || carry2, v) + 8002350: ea42 0203 orr.w r2, r2, r3 + 8002354: d3e4 bcc.n 8002320 <core::fmt::float::float_to_decimal_common_shortest+0xf3e> + assert!(noborrow); + 8002356: 2a00 cmp r2, #0 + 8002358: f000 81f1 beq.w 800273e <core::fmt::float::float_to_decimal_common_shortest+0x135c> + if *x >= *scale { x.sub(scale); d += 1; } + 800235c: f10c 0c01 add.w ip, ip, #1 + self.size = sz; + 8002360: f8cd a07c str.w sl, [sp, #124] ; 0x7c + // where `d[i..j]` is a shorthand for `d[i] * 10^(j-i) + ... + d[j-1] * 10 + d[j]`. + + // generate one digit: `d[n] = floor(mant / scale) < 10`. + let (d, _) = div_rem_upto_16(&mut mant, &scale, &scale2, &scale4, &scale8); + debug_assert!(d < 10); + buf[i] = b'0' + d; + 8002364: f1b8 0f10 cmp.w r8, #16 + 8002368: f10d 016b add.w r1, sp, #107 ; 0x6b + 800236c: f20d 4454 addw r4, sp, #1108 ; 0x454 + 8002370: f200 81f7 bhi.w 8002762 <core::fmt::float::float_to_decimal_common_shortest+0x1380> + 8002374: f10c 0030 add.w r0, ip, #48 ; 0x30 + 8002378: f801 0008 strb.w r0, [r1, r8] + let sz = max(self.size, other.size); + 800237c: 9948 ldr r1, [sp, #288] ; 0x120 + 800237e: 4650 mov r0, sl + 8002380: 4551 cmp r1, sl + 8002382: 9119 str r1, [sp, #100] ; 0x64 + 8002384: bf28 it cs + 8002386: 4608 movcs r0, r1 + } else if self.end > slice.len() { + 8002388: 2829 cmp r0, #41 ; 0x29 + 800238a: f080 81ee bcs.w 800276a <core::fmt::float::float_to_decimal_common_shortest+0x1388> + i += 1; + 800238e: f108 0101 add.w r1, r8, #1 + loop { + 8002392: ea4f 0880 mov.w r8, r0, lsl #2 + 8002396: aa48 add r2, sp, #288 ; 0x120 + 8002398: 9117 str r1, [sp, #92] ; 0x5c + if self.end == self.ptr { + 800239a: f1b8 0f00 cmp.w r8, #0 + 800239e: d011 beq.n 80023c4 <core::fmt::float::float_to_decimal_common_shortest+0xfe2> + 80023a0: f1b8 0f00 cmp.w r8, #0 + 80023a4: d012 beq.n 80023cc <core::fmt::float::float_to_decimal_common_shortest+0xfea> + 80023a6: f85e 0008 ldr.w r0, [lr, r8] + 80023aa: f852 1008 ldr.w r1, [r2, r8] + Ordering::Equal => (), + 80023ae: f1a8 0804 sub.w r8, r8, #4 + else if *self < *other { Less } + 80023b2: 4288 cmp r0, r1 + 80023b4: f04f 0001 mov.w r0, #1 + 80023b8: bf38 it cc + 80023ba: f04f 30ff movcc.w r0, #4294967295 ; 0xffffffff + 80023be: d0ec beq.n 800239a <core::fmt::float::float_to_decimal_common_shortest+0xfb8> + 80023c0: 4680 mov r8, r0 + 80023c2: e005 b.n 80023d0 <core::fmt::float::float_to_decimal_common_shortest+0xfee> + return Ordering::Equal + 80023c4: bf18 it ne + 80023c6: f04f 38ff movne.w r8, #4294967295 ; 0xffffffff + 80023ca: e001 b.n 80023d0 <core::fmt::float::float_to_decimal_common_shortest+0xfee> + 80023cc: f04f 0801 mov.w r8, #1 + $name { size: self.size, base: self.base } + 80023d0: 9815 ldr r0, [sp, #84] ; 0x54 + 80023d2: 4659 mov r1, fp + 80023d4: 22a0 movs r2, #160 ; 0xa0 + 80023d6: f847 acc0 str.w sl, [r7, #-192] + 80023da: f001 fb83 bl 8003ae4 <__aeabi_memcpy4> + let mut sz = cmp::max(self.size, other.size); + 80023de: 9871 ldr r0, [sp, #452] ; 0x1c4 + if other >= self { other } else { self } + 80023e0: 46d4 mov ip, sl + 80023e2: 4550 cmp r0, sl + 80023e4: bf28 it cs + 80023e6: 4684 movcs ip, r0 + } else if self.end > slice.len() { + 80023e8: f1bc 0f29 cmp.w ip, #41 ; 0x29 + 80023ec: f080 81ad bcs.w 800274a <core::fmt::float::float_to_decimal_common_shortest+0x1368> + 80023f0: 2103 movs r1, #3 + 80023f2: f34c 0e1d sbfx lr, ip, #0, #30 + 80023f6: ea41 038c orr.w r3, r1, ip, lsl #2 + 80023fa: 2b07 cmp r3, #7 + 80023fc: d202 bcs.n 8002404 <core::fmt::float::float_to_decimal_common_shortest+0x1022> + 80023fe: f10d 0e7c add.w lr, sp, #124 ; 0x7c + 8002402: e032 b.n 800246a <core::fmt::float::float_to_decimal_common_shortest+0x1088> + 8002404: e9dd 1214 ldrd r1, r2, [sp, #80] ; 0x50 + 8002408: 2500 movs r5, #0 + 800240a: 2300 movs r3, #0 + let (c, v) = (*a).full_add(*b, carry); + 800240c: f851 6023 ldr.w r6, [r1, r3, lsl #2] + 8002410: f852 4023 ldr.w r4, [r2, r3, lsl #2] + intrinsics::add_with_overflow(v, if carry {1} else {0}) + 8002414: f005 0501 and.w r5, r5, #1 + let (v, carry1) = unsafe { intrinsics::add_with_overflow(self, other) }; + 8002418: 4426 add r6, r4 + intrinsics::add_with_overflow(v, if carry {1} else {0}) + 800241a: 4435 add r5, r6 + *a = v; + 800241c: f842 5023 str.w r5, [r2, r3, lsl #2] + intrinsics::add_with_overflow(v, if carry {1} else {0}) + 8002420: 42b5 cmp r5, r6 + 8002422: f04f 0501 mov.w r5, #1 + self.index += 1; + 8002426: f103 0301 add.w r3, r3, #1 + 800242a: bf28 it cs + 800242c: 2500 movcs r5, #0 + let (v, carry1) = unsafe { intrinsics::add_with_overflow(self, other) }; + 800242e: 42a6 cmp r6, r4 + 8002430: f04f 0601 mov.w r6, #1 + 8002434: bf28 it cs + 8002436: 2600 movcs r6, #0 + if self.index < self.len { + 8002438: 4573 cmp r3, lr + (carry1 || carry2, v) + 800243a: ea45 0506 orr.w r5, r5, r6 + 800243e: d3e5 bcc.n 800240c <core::fmt::float::float_to_decimal_common_shortest+0x102a> + if carry { + 8002440: 2d01 cmp r5, #1 + 8002442: f10d 0e7c add.w lr, sp, #124 ; 0x7c + 8002446: d10d bne.n 8002464 <core::fmt::float::float_to_decimal_common_shortest+0x1082> + self.base[sz] = 1; + 8002448: f1bc 0f27 cmp.w ip, #39 ; 0x27 + 800244c: ad9a add r5, sp, #616 ; 0x268 + 800244e: f200 81a4 bhi.w 800279a <core::fmt::float::float_to_decimal_common_shortest+0x13b8> + 8002452: f1a7 01c0 sub.w r1, r7, #192 ; 0xc0 + 8002456: eb01 028c add.w r2, r1, ip, lsl #2 + 800245a: 2101 movs r1, #1 + sz += 1; + 800245c: f10c 0c01 add.w ip, ip, #1 + self.base[sz] = 1; + 8002460: 6051 str r1, [r2, #4] + 8002462: e000 b.n 8002466 <core::fmt::float::float_to_decimal_common_shortest+0x1084> + 8002464: ad9a add r5, sp, #616 ; 0x268 + 8002466: f20d 4454 addw r4, sp, #1108 ; 0x454 + 800246a: 45cc cmp ip, r9 + self.size = sz; + 800246c: f847 ccc0 str.w ip, [r7, #-192] + 8002470: bf28 it cs + 8002472: 46e1 movcs r9, ip + } else if self.end > slice.len() { + 8002474: f1b9 0f29 cmp.w r9, #41 ; 0x29 + 8002478: f080 816b bcs.w 8002752 <core::fmt::float::float_to_decimal_common_shortest+0x1370> + loop { + 800247c: ea4f 0189 mov.w r1, r9, lsl #2 + 8002480: f8dd 9040 ldr.w r9, [sp, #64] ; 0x40 + 8002484: f8dd c060 ldr.w ip, [sp, #96] ; 0x60 + 8002488: f1a7 06c0 sub.w r6, r7, #192 ; 0xc0 + if self.end == self.ptr { + 800248c: 2900 cmp r1, #0 + 800248e: d00c beq.n 80024aa <core::fmt::float::float_to_decimal_common_shortest+0x10c8> + 8002490: b179 cbz r1, 80024b2 <core::fmt::float::float_to_decimal_common_shortest+0x10d0> + 8002492: 586a ldr r2, [r5, r1] + 8002494: 5873 ldr r3, [r6, r1] + Ordering::Equal => (), + 8002496: 3904 subs r1, #4 + else if *self < *other { Less } + 8002498: 429a cmp r2, r3 + 800249a: f04f 0201 mov.w r2, #1 + 800249e: bf38 it cc + 80024a0: f04f 32ff movcc.w r2, #4294967295 ; 0xffffffff + 80024a4: d0f2 beq.n 800248c <core::fmt::float::float_to_decimal_common_shortest+0x10aa> + 80024a6: 4611 mov r1, r2 + 80024a8: e004 b.n 80024b4 <core::fmt::float::float_to_decimal_common_shortest+0x10d2> + return Ordering::Equal + 80024aa: bf18 it ne + 80024ac: f04f 31ff movne.w r1, #4294967295 ; 0xffffffff + 80024b0: e000 b.n 80024b4 <core::fmt::float::float_to_decimal_common_shortest+0x10d2> + 80024b2: 2101 movs r1, #1 + 80024b4: 9e13 ldr r6, [sp, #76] ; 0x4c + 80024b6: fa4f f288 sxtb.w r2, r8 + // - stop and round `down` (keep digits as is) when `mant < minus` (or `<=`). + // - stop and round `up` (increase the last digit) when `scale < mant + plus` (or `<=`). + // - keep generating otherwise. + down = mant.cmp(&minus) < rounding; + up = scale.cmp(mant.clone().add(&plus)) < rounding; + if down || up { break; } // we have the shortest representation, proceed to the rounding + 80024ba: 42b2 cmp r2, r6 + 80024bc: bfa4 itt ge + 80024be: b24b sxtbge r3, r1 + 80024c0: 42b3 cmpge r3, r6 + 80024c2: f2c0 8085 blt.w 80025d0 <core::fmt::float::float_to_decimal_common_shortest+0x11ee> + } else if self.end > slice.len() { + 80024c6: f1ba 0f29 cmp.w sl, #41 ; 0x29 + 80024ca: f080 8134 bcs.w 8002736 <core::fmt::float::float_to_decimal_common_shortest+0x1354> + if self.ptr == self.end { + 80024ce: f1ba 0f00 cmp.w sl, #0 + 80024d2: f50d 7843 add.w r8, sp, #780 ; 0x30c + 80024d6: d01f beq.n 8002518 <core::fmt::float::float_to_decimal_common_shortest+0x1136> + intrinsics::offset(self, count) as *mut T + 80024d8: eb0e 018a add.w r1, lr, sl, lsl #2 +// Copyright 2012-2017 The Rust Project Developers. See the COPYRIGHT + 80024dc: ea4f 028a mov.w r2, sl, lsl #2 + 80024e0: 2300 movs r3, #0 + 80024e2: 465d mov r5, fp + 80024e4: f04f 0c0a mov.w ip, #10 + 80024e8: 3104 adds r1, #4 + 80024ea: 9116 str r1, [sp, #88] ; 0x58 + let v = (self as $bigty) * (other as $bigty) + (carry as $bigty); + 80024ec: 682e ldr r6, [r5, #0] + 80024ee: 2100 movs r1, #0 + if self.ptr == self.end { + 80024f0: 3a04 subs r2, #4 + 80024f2: fbe6 310c umlal r3, r1, r6, ip + *a = v; + 80024f6: f845 3b04 str.w r3, [r5], #4 + 80024fa: 460b mov r3, r1 + 80024fc: d1f6 bne.n 80024ec <core::fmt::float::float_to_decimal_common_shortest+0x110a> + 80024fe: 9a19 ldr r2, [sp, #100] ; 0x64 + 8002500: b139 cbz r1, 8002512 <core::fmt::float::float_to_decimal_common_shortest+0x1130> + self.base[sz] = carry; + 8002502: f1ba 0f27 cmp.w sl, #39 ; 0x27 + 8002506: f200 813d bhi.w 8002784 <core::fmt::float::float_to_decimal_common_shortest+0x13a2> + 800250a: 9b16 ldr r3, [sp, #88] ; 0x58 + sz += 1; + 800250c: f10a 0a01 add.w sl, sl, #1 + self.base[sz] = carry; + 8002510: 6019 str r1, [r3, #0] + 8002512: f8dd c060 ldr.w ip, [sp, #96] ; 0x60 + 8002516: e002 b.n 800251e <core::fmt::float::float_to_decimal_common_shortest+0x113c> + 8002518: 9a19 ldr r2, [sp, #100] ; 0x64 + 800251a: f04f 0a00 mov.w sl, #0 + } else if self.end > slice.len() { + 800251e: 2a29 cmp r2, #41 ; 0x29 + self.size = sz; + 8002520: f8cd a07c str.w sl, [sp, #124] ; 0x7c + 8002524: f080 8124 bcs.w 8002770 <core::fmt::float::float_to_decimal_common_shortest+0x138e> + if self.ptr == self.end { + 8002528: 2a00 cmp r2, #0 + 800252a: d01d beq.n 8002568 <core::fmt::float::float_to_decimal_common_shortest+0x1186> + 800252c: 9d0e ldr r5, [sp, #56] ; 0x38 + 800252e: a948 add r1, sp, #288 ; 0x120 + 8002530: f04f 0c0a mov.w ip, #10 + 8002534: 2300 movs r3, #0 + 8002536: eb01 0182 add.w r1, r1, r2, lsl #2 +// Copyright 2012-2017 The Rust Project Developers. See the COPYRIGHT + 800253a: 0092 lsls r2, r2, #2 + 800253c: 3104 adds r1, #4 + 800253e: 9116 str r1, [sp, #88] ; 0x58 + let v = (self as $bigty) * (other as $bigty) + (carry as $bigty); + 8002540: 682e ldr r6, [r5, #0] + 8002542: 2100 movs r1, #0 + if self.ptr == self.end { + 8002544: 3a04 subs r2, #4 + 8002546: fbe6 310c umlal r3, r1, r6, ip + *a = v; + 800254a: f845 3b04 str.w r3, [r5], #4 + 800254e: 460b mov r3, r1 + 8002550: d1f6 bne.n 8002540 <core::fmt::float::float_to_decimal_common_shortest+0x115e> + 8002552: b159 cbz r1, 800256c <core::fmt::float::float_to_decimal_common_shortest+0x118a> + 8002554: 9a19 ldr r2, [sp, #100] ; 0x64 + self.base[sz] = carry; + 8002556: 2a27 cmp r2, #39 ; 0x27 + 8002558: f200 8118 bhi.w 800278c <core::fmt::float::float_to_decimal_common_shortest+0x13aa> + 800255c: 9b16 ldr r3, [sp, #88] ; 0x58 + 800255e: f8dd c060 ldr.w ip, [sp, #96] ; 0x60 + sz += 1; + 8002562: 3201 adds r2, #1 + self.base[sz] = carry; + 8002564: 6019 str r1, [r3, #0] + 8002566: e003 b.n 8002570 <core::fmt::float::float_to_decimal_common_shortest+0x118e> + 8002568: 2200 movs r2, #0 + 800256a: e001 b.n 8002570 <core::fmt::float::float_to_decimal_common_shortest+0x118e> + 800256c: e9dd c218 ldrd ip, r2, [sp, #96] ; 0x60 + } else if self.end > slice.len() { + 8002570: 2829 cmp r0, #41 ; 0x29 + self.size = sz; + 8002572: 9248 str r2, [sp, #288] ; 0x120 + 8002574: f080 8100 bcs.w 8002778 <core::fmt::float::float_to_decimal_common_shortest+0x1396> + if self.ptr == self.end { + 8002578: 2800 cmp r0, #0 + 800257a: d01b beq.n 80025b4 <core::fmt::float::float_to_decimal_common_shortest+0x11d2> + 800257c: a971 add r1, sp, #452 ; 0x1c4 + 800257e: 9e14 ldr r6, [sp, #80] ; 0x50 +// Copyright 2012-2017 The Rust Project Developers. See the COPYRIGHT + 8002580: 0082 lsls r2, r0, #2 + 8002582: 2300 movs r3, #0 + 8002584: eb01 0180 add.w r1, r1, r0, lsl #2 + 8002588: 3104 adds r1, #4 + 800258a: 9119 str r1, [sp, #100] ; 0x64 + 800258c: 210a movs r1, #10 + let v = (self as $bigty) * (other as $bigty) + (carry as $bigty); + 800258e: 6834 ldr r4, [r6, #0] + 8002590: 2500 movs r5, #0 + if self.ptr == self.end { + 8002592: 3a04 subs r2, #4 + 8002594: fbe4 3501 umlal r3, r5, r4, r1 + *a = v; + 8002598: f846 3b04 str.w r3, [r6], #4 + 800259c: 462b mov r3, r5 + 800259e: d1f6 bne.n 800258e <core::fmt::float::float_to_decimal_common_shortest+0x11ac> + 80025a0: b12d cbz r5, 80025ae <core::fmt::float::float_to_decimal_common_shortest+0x11cc> + self.base[sz] = carry; + 80025a2: 2827 cmp r0, #39 ; 0x27 + 80025a4: f200 80f6 bhi.w 8002794 <core::fmt::float::float_to_decimal_common_shortest+0x13b2> + 80025a8: 9919 ldr r1, [sp, #100] ; 0x64 + sz += 1; + 80025aa: 3001 adds r0, #1 + self.base[sz] = carry; + 80025ac: 600d str r5, [r1, #0] + 80025ae: f20d 4454 addw r4, sp, #1108 ; 0x454 + 80025b2: e000 b.n 80025b6 <core::fmt::float::float_to_decimal_common_shortest+0x11d4> + 80025b4: 2000 movs r0, #0 + 80025b6: 990f ldr r1, [sp, #60] ; 0x3c + self.size = sz; + 80025b8: 9071 str r0, [sp, #452] ; 0x1c4 + if other >= self { other } else { self } + 80025ba: 4650 mov r0, sl + 80025bc: ad9a add r5, sp, #616 ; 0x268 + 80025be: 4551 cmp r1, sl + 80025c0: bf28 it cs + 80025c2: 4608 movcs r0, r1 + } else if self.end > slice.len() { + 80025c4: 2828 cmp r0, #40 ; 0x28 + 80025c6: f67f adb9 bls.w 800213c <core::fmt::float::float_to_decimal_common_shortest+0xd5a> + slice_index_len_fail(self.end, slice.len()); + 80025ca: 2128 movs r1, #40 ; 0x28 + 80025cc: f7fd ffb7 bl 800053e <core::slice::slice_index_len_fail> + else if *self < *other { Less } + 80025d0: b248 sxtb r0, r1 + } + + // rounding up happens when + // i) only the rounding-up condition was triggered, or + // ii) both conditions were triggered and tie breaking prefers rounding up. + if up && (!down || *mant.mul_pow2(1) >= scale) { + 80025d2: 42b0 cmp r0, r6 + 80025d4: da1c bge.n 8002610 <core::fmt::float::float_to_decimal_common_shortest+0x122e> + 80025d6: 9d0d ldr r5, [sp, #52] ; 0x34 + 80025d8: e9dd 8a16 ldrd r8, sl, [sp, #88] ; 0x58 + 80025dc: 42b2 cmp r2, r6 + 80025de: da21 bge.n 8002624 <core::fmt::float::float_to_decimal_common_shortest+0x1242> + 80025e0: a81f add r0, sp, #124 ; 0x7c + 80025e2: 2101 movs r1, #1 + 80025e4: f7fe fa89 bl 8000afa <core::num::bignum::Big32x40::mul_pow2> + let sz = max(self.size, other.size); + 80025e8: 9a9a ldr r2, [sp, #616] ; 0x268 + 80025ea: 991f ldr r1, [sp, #124] ; 0x7c + if other >= self { other } else { self } + 80025ec: 428a cmp r2, r1 + 80025ee: bf28 it cs + 80025f0: 4611 movcs r1, r2 + } else if self.end > slice.len() { + 80025f2: 2929 cmp r1, #41 ; 0x29 + 80025f4: f080 80b1 bcs.w 800275a <core::fmt::float::float_to_decimal_common_shortest+0x1378> + loop { + 80025f8: 0089 lsls r1, r1, #2 + if self.end == self.ptr { + 80025fa: 2900 cmp r1, #0 + 80025fc: d011 beq.n 8002622 <core::fmt::float::float_to_decimal_common_shortest+0x1240> + 80025fe: d011 beq.n 8002624 <core::fmt::float::float_to_decimal_common_shortest+0x1242> + 8002600: ab9a add r3, sp, #616 ; 0x268 + 8002602: 5842 ldr r2, [r0, r1] + 8002604: 585b ldr r3, [r3, r1] + Ordering::Equal => (), + 8002606: 3904 subs r1, #4 + 8002608: 429a cmp r2, r3 + 800260a: d0f6 beq.n 80025fa <core::fmt::float::float_to_decimal_common_shortest+0x1218> + 800260c: d20a bcs.n 8002624 <core::fmt::float::float_to_decimal_common_shortest+0x1242> + 800260e: e01f b.n 8002650 <core::fmt::float::float_to_decimal_common_shortest+0x126e> + 8002610: f8dd a05c ldr.w sl, [sp, #92] ; 0x5c + } else if self.end > slice.len() { + 8002614: f1ba 0f12 cmp.w sl, #18 + 8002618: d31e bcc.n 8002658 <core::fmt::float::float_to_decimal_common_shortest+0x1276> + 800261a: e0e5 b.n 80027e8 <core::fmt::float::float_to_decimal_common_shortest+0x1406> + 800261c: 4675 mov r5, lr + 800261e: f7ff bb86 b.w 8001d2e <core::fmt::float::float_to_decimal_common_shortest+0x94c> + 8002622: d115 bne.n 8002650 <core::fmt::float::float_to_decimal_common_shortest+0x126e> + 8002624: f10d 046b add.w r4, sp, #107 ; 0x6b + // if rounding up changes the length, the exponent should also change. + // it seems that this condition is very hard to satisfy (possibly impossible), + // but we are just being safe and consistent here. + if let Some(c) = round_up(buf, i) { + 8002628: 2111 movs r1, #17 + 800262a: 4652 mov r2, sl + 800262c: 4620 mov r0, r4 + 800262e: f7fe faea bl 8000c06 <core::num::flt2dec::round_up> + 8002632: f3c0 2107 ubfx r1, r0, #8, #8 + 8002636: b2c0 uxtb r0, r0 + 8002638: 2801 cmp r0, #1 + 800263a: d109 bne.n 8002650 <core::fmt::float::float_to_decimal_common_shortest+0x126e> + buf[i] = c; + 800263c: f1ba 0f10 cmp.w sl, #16 + 8002640: f200 80f4 bhi.w 800282c <core::fmt::float::float_to_decimal_common_shortest+0x144a> + i += 1; + k += 1; + 8002644: 3501 adds r5, #1 + buf[i] = c; + 8002646: f804 100a strb.w r1, [r4, sl] + i += 1; + 800264a: f108 0a02 add.w sl, r8, #2 + 800264e: 950d str r5, [sp, #52] ; 0x34 + 8002650: f1ba 0f12 cmp.w sl, #18 + 8002654: f080 80c8 bcs.w 80027e8 <core::fmt::float::float_to_decimal_common_shortest+0x1406> + 8002658: f10d 0c0c add.w ip, sp, #12 + assert!(!buf.is_empty()); + 800265c: f1ba 0f00 cmp.w sl, #0 + 8002660: e89c 1028 ldmia.w ip, {r3, r5, ip} + 8002664: 990d ldr r1, [sp, #52] ; 0x34 + 8002666: f000 80c3 beq.w 80027f0 <core::fmt::float::float_to_decimal_common_shortest+0x140e> + assert!(buf[0] > b'0'); + 800266a: f89d 006b ldrb.w r0, [sp, #107] ; 0x6b + 800266e: 2830 cmp r0, #48 ; 0x30 + 8002670: f240 80c4 bls.w 80027fc <core::fmt::float::float_to_decimal_common_shortest+0x141a> + if exp <= 0 { + 8002674: b208 sxth r0, r1 + parts[0] = Part::Copy(b"0."); + 8002676: 2102 movs r1, #2 + if exp <= 0 { + 8002678: 2801 cmp r0, #1 + 800267a: db1c blt.n 80026b6 <core::fmt::float::float_to_decimal_common_shortest+0x12d4> + 800267c: f10d 066b add.w r6, sp, #107 ; 0x6b + if exp < buf.len() { + 8002680: 4550 cmp r0, sl + 8002682: f827 1cc0 strh.w r1, [r7, #-192] + 8002686: f847 6cbc str.w r6, [r7, #-188] + 800268a: d22e bcs.n 80026ea <core::fmt::float::float_to_decimal_common_shortest+0x1308> + parts[1] = Part::Copy(b"."); + 800268c: f644 2286 movw r2, #19078 ; 0x4a86 + parts[0] = Part::Copy(&buf[..exp]); + 8002690: f847 0cb8 str.w r0, [r7, #-184] + parts[1] = Part::Copy(b"."); + 8002694: f827 1cb4 strh.w r1, [r7, #-180] + from_raw_parts(slice.as_ptr().offset(self.start as isize), self.end - self.start) + 8002698: ebaa 0a00 sub.w sl, sl, r0 + 800269c: f6c0 0200 movt r2, #2048 ; 0x800 + 80026a0: f847 2cb0 str.w r2, [r7, #-176] + 80026a4: 2201 movs r2, #1 + 80026a6: f847 2cac str.w r2, [r7, #-172] + parts[2] = Part::Copy(&buf[exp..]); + 80026aa: f827 1ca8 strh.w r1, [r7, #-168] + intrinsics::offset(self, count) + 80026ae: 1831 adds r1, r6, r0 + 80026b0: f847 1ca4 str.w r1, [r7, #-164] + 80026b4: e013 b.n 80026de <core::fmt::float::float_to_decimal_common_shortest+0x12fc> + parts[0] = Part::Copy(b"0."); + 80026b6: f644 2284 movw r2, #19076 ; 0x4a84 + 80026ba: f827 1cc0 strh.w r1, [r7, #-192] + let minus_exp = -(exp as i32) as usize; + 80026be: 4240 negs r0, r0 + parts[0] = Part::Copy(b"0."); + 80026c0: f6c0 0200 movt r2, #2048 ; 0x800 + 80026c4: e947 212f strd r2, r1, [r7, #-188] ; 0xbc + 80026c8: 2200 movs r2, #0 + parts[1] = Part::Zero(minus_exp); + 80026ca: f827 2cb4 strh.w r2, [r7, #-180] + 80026ce: f847 0cb0 str.w r0, [r7, #-176] + parts[2] = Part::Copy(buf); + 80026d2: f10d 006b add.w r0, sp, #107 ; 0x6b + 80026d6: f827 1ca8 strh.w r1, [r7, #-168] + 80026da: f847 0ca4 str.w r0, [r7, #-164] + 80026de: f1a7 00c0 sub.w r0, r7, #192 ; 0xc0 + 80026e2: f100 0120 add.w r1, r0, #32 + 80026e6: 2003 movs r0, #3 + 80026e8: e00b b.n 8002702 <core::fmt::float::float_to_decimal_common_shortest+0x1320> + parts[0] = Part::Copy(buf); + 80026ea: f847 acb8 str.w sl, [r7, #-184] + parts[1] = Part::Zero(exp - buf.len()); + 80026ee: 2100 movs r1, #0 + 80026f0: eba0 0a0a sub.w sl, r0, sl + 80026f4: f1a7 00c0 sub.w r0, r7, #192 ; 0xc0 + 80026f8: f827 1cb4 strh.w r1, [r7, #-180] + 80026fc: f100 0110 add.w r1, r0, #16 + 8002700: 2002 movs r0, #2 + 8002702: f8c1 a000 str.w sl, [r1] + 8002706: f1a7 01c0 sub.w r1, r7, #192 ; 0xc0 + 800270a: f8cd 5454 str.w r5, [sp, #1108] ; 0x454 + 800270e: f8cd 3458 str.w r3, [sp, #1112] ; 0x458 + 8002712: f8cd 145c str.w r1, [sp, #1116] ; 0x45c + 8002716: f8cd 0460 str.w r0, [sp, #1120] ; 0x460 + 800271a: f20d 4154 addw r1, sp, #1108 ; 0x454 + // enough for f32 and f64 + let mut buf: [u8; flt2dec::MAX_SIG_DIGITS] = mem::uninitialized(); + let mut parts: [flt2dec::Part; 4] = mem::uninitialized(); + let formatted = flt2dec::to_shortest_str(flt2dec::strategy::grisu::format_shortest, + *num, sign, 0, false, &mut buf, &mut parts); + fmt.pad_formatted_parts(&formatted) + 800271e: 4660 mov r0, ip + 8002720: f7fe fc7e bl 8001020 <core::fmt::Formatter::pad_formatted_parts> + } +} + 8002724: f50d 6db3 add.w sp, sp, #1432 ; 0x598 + 8002728: b001 add sp, #4 + 800272a: e8bd 0f00 ldmia.w sp!, {r8, r9, sl, fp} + 800272e: bdf0 pop {r4, r5, r6, r7, pc} + 8002730: 2128 movs r1, #40 ; 0x28 + 8002732: f7fd ff08 bl 8000546 <core::panicking::panic_bounds_check> + 8002736: 4650 mov r0, sl + 8002738: 2128 movs r1, #40 ; 0x28 + 800273a: f7fd ff00 bl 800053e <core::slice::slice_index_len_fail> + 800273e: f244 500c movw r0, #17676 ; 0x450c + 8002742: f6c0 0000 movt r0, #2048 ; 0x800 + 8002746: f7fe f9d4 bl 8000af2 <core::panicking::panic> + 800274a: 4660 mov r0, ip + 800274c: 2128 movs r1, #40 ; 0x28 + 800274e: f7fd fef6 bl 800053e <core::slice::slice_index_len_fail> + 8002752: 4648 mov r0, r9 + 8002754: 2128 movs r1, #40 ; 0x28 + 8002756: f7fd fef2 bl 800053e <core::slice::slice_index_len_fail> + 800275a: 4608 mov r0, r1 + 800275c: 2128 movs r1, #40 ; 0x28 + 800275e: f7fd feee bl 800053e <core::slice::slice_index_len_fail> + buf[i] = b'0' + d; + 8002762: 4640 mov r0, r8 + 8002764: 2111 movs r1, #17 + 8002766: f7fd feee bl 8000546 <core::panicking::panic_bounds_check> + slice_index_len_fail(self.end, slice.len()); + 800276a: 2128 movs r1, #40 ; 0x28 + 800276c: f7fd fee7 bl 800053e <core::slice::slice_index_len_fail> + slice_index_len_fail(self.end, slice.len()); + 8002770: 4610 mov r0, r2 + 8002772: 2128 movs r1, #40 ; 0x28 + 8002774: f7fd fee3 bl 800053e <core::slice::slice_index_len_fail> + 8002778: 2128 movs r1, #40 ; 0x28 + 800277a: f7fd fee0 bl 800053e <core::slice::slice_index_len_fail> + buf[i] = b'0' + q as u8; + 800277e: 2111 movs r1, #17 + 8002780: f7fd fee1 bl 8000546 <core::panicking::panic_bounds_check> + self.base[sz] = carry; + 8002784: 4650 mov r0, sl + 8002786: 2128 movs r1, #40 ; 0x28 + 8002788: f7fd fedd bl 8000546 <core::panicking::panic_bounds_check> + 800278c: 4610 mov r0, r2 + 800278e: 2128 movs r1, #40 ; 0x28 + 8002790: f7fd fed9 bl 8000546 <core::panicking::panic_bounds_check> + 8002794: 2128 movs r1, #40 ; 0x28 + 8002796: f7fd fed6 bl 8000546 <core::panicking::panic_bounds_check> + 800279a: 4660 mov r0, ip + 800279c: 2128 movs r1, #40 ; 0x28 + 800279e: f7fd fed2 bl 8000546 <core::panicking::panic_bounds_check> + 80027a2: f7fd ffb5 bl 8000710 <core::panicking::panic_fmt> + assert!(d.mant > 0); + 80027a6: f644 003c movw r0, #18492 ; 0x483c + 80027aa: f6c0 0000 movt r0, #2048 ; 0x800 + 80027ae: f7fe f9a0 bl 8000af2 <core::panicking::panic> + assert!(d.mant.checked_add(d.plus).is_some()); + 80027b2: f644 0054 movw r0, #18516 ; 0x4854 + 80027b6: f6c0 0000 movt r0, #2048 ; 0x800 + 80027ba: f7fe f99a bl 8000af2 <core::panicking::panic> + assert!(d.mant.checked_sub(d.minus).is_some()); + 80027be: f644 006c movw r0, #18540 ; 0x486c + 80027c2: f6c0 0000 movt r0, #2048 ; 0x800 + 80027c6: f7fe f994 bl 8000af2 <core::panicking::panic> + assert!(d.mant + d.plus < (1 << 61)); // we need at least three bits of additional precision + 80027ca: f644 0084 movw r0, #18564 ; 0x4884 + 80027ce: f6c0 0000 movt r0, #2048 ; 0x800 + 80027d2: f7fe f98e bl 8000af2 <core::panicking::panic> + assert!(edelta >= 0); + 80027d6: f644 009c movw r0, #18588 ; 0x489c + 80027da: f6c0 0000 movt r0, #2048 ; 0x800 + 80027de: f7fe f988 bl 8000af2 <core::panicking::panic> + let (f, e, k) = CACHED_POW10[idx as usize]; + 80027e2: 2151 movs r1, #81 ; 0x51 + 80027e4: f7fd feaf bl 8000546 <core::panicking::panic_bounds_check> + slice_index_len_fail(self.end, slice.len()); + 80027e8: 4650 mov r0, sl + 80027ea: 2111 movs r1, #17 + 80027ec: f7fd fea7 bl 800053e <core::slice::slice_index_len_fail> + assert!(!buf.is_empty()); + 80027f0: f644 2054 movw r0, #19028 ; 0x4a54 + 80027f4: f6c0 0000 movt r0, #2048 ; 0x800 + 80027f8: f7fe f97b bl 8000af2 <core::panicking::panic> + assert!(buf[0] > b'0'); + 80027fc: f644 206c movw r0, #19052 ; 0x4a6c + 8002800: f6c0 0000 movt r0, #2048 ; 0x800 + 8002804: f7fe f975 bl 8000af2 <core::panicking::panic> + slice_index_len_fail(self.end, slice.len()); + 8002808: 4640 mov r0, r8 + 800280a: 2128 movs r1, #40 ; 0x28 + 800280c: f7fd fe97 bl 800053e <core::slice::slice_index_len_fail> + 8002810: 2128 movs r1, #40 ; 0x28 + 8002812: f7fd fe94 bl 800053e <core::slice::slice_index_len_fail> + 8002816: 4648 mov r0, r9 + 8002818: 2128 movs r1, #40 ; 0x28 + 800281a: f7fd fe94 bl 8000546 <core::panicking::panic_bounds_check> + 800281e: 4640 mov r0, r8 + 8002820: 2128 movs r1, #40 ; 0x28 + 8002822: f7fd fe90 bl 8000546 <core::panicking::panic_bounds_check> + 8002826: 2128 movs r1, #40 ; 0x28 + 8002828: f7fd fe8d bl 8000546 <core::panicking::panic_bounds_check> + buf[i] = c; + 800282c: 4650 mov r0, sl + 800282e: 2111 movs r1, #17 + 8002830: f7fd fe89 bl 8000546 <core::panicking::panic_bounds_check> + +08002834 <core::fmt::float::float_to_decimal_common_exact>: +fn float_to_decimal_common_exact<T>(fmt: &mut Formatter, num: &T, + 8002834: b5f0 push {r4, r5, r6, r7, lr} + 8002836: af03 add r7, sp, #12 + 8002838: e92d 0f00 stmdb sp!, {r8, r9, sl, fp} + 800283c: f5ad 6df2 sub.w sp, sp, #1936 ; 0x790 + 8002840: b081 sub sp, #4 + let bits: u64 = unsafe { transmute(self) }; + 8002842: ec55 3b10 vmov r3, r5, d0 + 8002846: 4681 mov r9, r0 + 8002848: 4628 mov r0, r5 + let mut exponent: i16 = ((bits >> 52) & 0x7ff) as i16; + 800284a: f3c5 5c0a ubfx ip, r5, #20, #11 + let mantissa = if exponent == 0 { + 800284e: 469a mov sl, r3 + 8002850: f36f 501f bfc r0, #20, #12 + 8002854: f1bc 0f00 cmp.w ip, #0 + (bits & 0xfffffffffffff) << 1 + 8002858: ea4f 0440 mov.w r4, r0, lsl #1 + (bits & 0xfffffffffffff) | 0x10000000000000 + 800285c: f440 1680 orr.w r6, r0, #1048576 ; 0x100000 + let mantissa = if exponent == 0 { + 8002860: bf04 itt eq + 8002862: ea44 76d3 orreq.w r6, r4, r3, lsr #31 + 8002866: ea4f 0a4a moveq.w sl, sl, lsl #1 + (0, 0) => Fp::Zero, + 800286a: f025 4400 bic.w r4, r5, #2147483648 ; 0x80000000 + 800286e: 431c orrs r4, r3 + 8002870: d00f beq.n 8002892 <core::fmt::float::float_to_decimal_common_exact+0x5e> + (_, 0) => Fp::Subnormal, + 8002872: f240 0e00 movw lr, #0 + 8002876: f04f 0800 mov.w r8, #0 + 800287a: f6c7 7ef0 movt lr, #32752 ; 0x7ff0 + 800287e: ea05 040e and.w r4, r5, lr + 8002882: 4574 cmp r4, lr + 8002884: d019 beq.n 80028ba <core::fmt::float::float_to_decimal_common_exact+0x86> + 8002886: 0060 lsls r0, r4, #1 + 8002888: d123 bne.n 80028d2 <core::fmt::float::float_to_decimal_common_exact+0x9e> + 800288a: 2000 movs r0, #0 + exponent -= 1023 + 52; + 800288c: f2ac 4b33 subw fp, ip, #1075 ; 0x433 + 8002890: e037 b.n 8002902 <core::fmt::float::float_to_decimal_common_exact+0xce> + 8002892: f244 4e98 movw lr, #17560 ; 0x4498 + 8002896: b2c8 uxtb r0, r1 + 8002898: f6c0 0e00 movt lr, #2048 ; 0x800 + (FullDecoded::Zero, Sign::Minus) => b"", + 800289c: 2800 cmp r0, #0 + 800289e: f000 817c beq.w 8002b9a <core::fmt::float::float_to_decimal_common_exact+0x366> + 80028a2: 2801 cmp r0, #1 + 80028a4: f000 817b beq.w 8002b9e <core::fmt::float::float_to_decimal_common_exact+0x36a> + 80028a8: 2802 cmp r0, #2 + 80028aa: f040 8180 bne.w 8002bae <core::fmt::float::float_to_decimal_common_exact+0x37a> + 80028ae: f644 2eb0 movw lr, #19120 ; 0x4ab0 + 80028b2: 2301 movs r3, #1 + 80028b4: f6c0 0e00 movt lr, #2048 ; 0x800 + 80028b8: e186 b.n 8002bc8 <core::fmt::float::float_to_decimal_common_exact+0x394> + FpCategory::Nan => FullDecoded::Nan, + 80028ba: 4318 orrs r0, r3 + 80028bc: bf08 it eq + 80028be: f04f 0801 moveq.w r8, #1 + (FullDecoded::Nan, _) => b"", + 80028c2: 2800 cmp r0, #0 + 80028c4: f040 819f bne.w 8002c06 <core::fmt::float::float_to_decimal_common_exact+0x3d2> + 80028c8: 4643 mov r3, r8 + sign: Sign, frac_digits: usize, _upper: bool, + buf: &'a mut [u8], parts: &'a mut [Part<'a>]) -> Formatted<'a> + where T: DecodableFloat, F: FnMut(&Decoded, &mut [u8], i16) -> (usize, i16) { + assert!(parts.len() >= 4); + + let (negative, full_decoded) = decode(v); + 80028ca: 0fe8 lsrs r0, r5, #31 + 80028cc: 4644 mov r4, r8 + 80028ce: 930a str r3, [sp, #40] ; 0x28 + 80028d0: e01c b.n 800290c <core::fmt::float::float_to_decimal_common_exact+0xd8> + if mant == minnorm.0 { + 80028d2: f486 1080 eor.w r0, r6, #1048576 ; 0x100000 + 80028d6: ea50 000a orrs.w r0, r0, sl + 80028da: d10a bne.n 80028f2 <core::fmt::float::float_to_decimal_common_exact+0xbe> + 80028dc: 2000 movs r0, #0 + exp: exp - 2, inclusive: even }) + 80028de: f2ac 4b35 subw fp, ip, #1077 ; 0x435 + 80028e2: f04f 0a00 mov.w sl, #0 + 80028e6: f04f 0c02 mov.w ip, #2 + 80028ea: f44f 0680 mov.w r6, #4194304 ; 0x400000 + if mant == minnorm.0 { + 80028ee: 900a str r0, [sp, #40] ; 0x28 + 80028f0: e00a b.n 8002908 <core::fmt::float::float_to_decimal_common_exact+0xd4> + FullDecoded::Finite(Decoded { mant: mant << 1, minus: 1, plus: 1, + 80028f2: 0070 lsls r0, r6, #1 + exp: exp - 1, inclusive: even }) + 80028f4: f2ac 4b34 subw fp, ip, #1076 ; 0x434 + FullDecoded::Finite(Decoded { mant: mant << 1, minus: 1, plus: 1, + 80028f8: ea40 76da orr.w r6, r0, sl, lsr #31 + 80028fc: ea4f 0a4a mov.w sl, sl, lsl #1 + 8002900: 2000 movs r0, #0 + 8002902: 900a str r0, [sp, #40] ; 0x28 + 8002904: f04f 0c01 mov.w ip, #1 + 8002908: 0fe8 lsrs r0, r5, #31 + 800290a: 2403 movs r4, #3 + (_, Sign::Minus) | (_, Sign::MinusRaw) => if negative { b"-" } else { b"" }, + 800290c: f244 4398 movw r3, #17560 ; 0x4498 + 8002910: f644 25b0 movw r5, #19120 ; 0x4ab0 + 8002914: b2c9 uxtb r1, r1 + 8002916: f644 2eaf movw lr, #19119 ; 0x4aaf + 800291a: f6c0 0300 movt r3, #2048 ; 0x800 + 800291e: f6c0 0500 movt r5, #2048 ; 0x800 + 8002922: 2902 cmp r1, #2 + 8002924: f6c0 0e00 movt lr, #2048 ; 0x800 + 8002928: bf38 it cc + 800292a: 461d movcc r5, r3 + 800292c: 2800 cmp r0, #0 + 800292e: f04f 0300 mov.w r3, #0 + 8002932: bf08 it eq + 8002934: 46ae moveq lr, r5 + 8002936: 2901 cmp r1, #1 + 8002938: bf88 it hi + 800293a: 2301 movhi r3, #1 + 800293c: 4318 orrs r0, r3 + let sign = determine_sign(sign, &full_decoded, negative); + match full_decoded { + FullDecoded::Nan => { + 800293e: 900c str r0, [sp, #48] ; 0x30 + 8002940: f004 0003 and.w r0, r4, #3 + 8002944: 2801 cmp r0, #1 + 8002946: d10e bne.n 8002966 <core::fmt::float::float_to_decimal_common_exact+0x132> + parts[0] = Part::Copy(b"NaN"); + Formatted { sign: sign, parts: &parts[..1] } + } + FullDecoded::Infinite => { + parts[0] = Part::Copy(b"inf"); + 8002948: 2002 movs r0, #2 + 800294a: f827 0cc4 strh.w r0, [r7, #-196] + 800294e: f644 306b movw r0, #19307 ; 0x4b6b + 8002952: f6c0 0000 movt r0, #2048 ; 0x800 + 8002956: f847 0cc0 str.w r0, [r7, #-192] + 800295a: 2003 movs r0, #3 + 800295c: f847 0cbc str.w r0, [r7, #-188] +/// ``` +#[inline] +#[stable(feature = "rust1", since = "1.0.0")] +pub unsafe fn from_raw_parts<'a, T>(p: *const T, len: usize) -> &'a [T] { + mem::transmute(Repr { data: p, len: len }) +} + 8002960: 2001 movs r0, #1 + 8002962: f000 bfe0 b.w 8003926 <core::fmt::float::float_to_decimal_common_exact+0x10f2> + 21 + ((if exp < 0 { -12 } else { 5 } * exp as i32) as usize >> 4) + 8002966: fa0f f38b sxth.w r3, fp + 800296a: 2005 movs r0, #5 + 800296c: f8cd c010 str.w ip, [sp, #16] + 8002970: 2115 movs r1, #21 + 8002972: 2b00 cmp r3, #0 + 8002974: bfb8 it lt + 8002976: f06f 000b mvnlt.w r0, #11 + 800297a: 4358 muls r0, r3 + 800297c: eb01 1110 add.w r1, r1, r0, lsr #4 + 8002980: 4608 mov r0, r1 + Formatted { sign: sign, parts: &parts[..1] } + } + } + FullDecoded::Finite(ref decoded) => { + let maxlen = estimate_max_buf_len(decoded.exp); + assert!(buf.len() >= maxlen); + 8002982: f5b1 6f80 cmp.w r1, #1024 ; 0x400 + 8002986: 9015 str r0, [sp, #84] ; 0x54 + 8002988: f201 802f bhi.w 80039ea <core::fmt::float::float_to_decimal_common_exact+0x11b6> + + // it *is* possible that `frac_digits` is ridiculously large. + // `format_exact` will end rendering digits much earlier in this case, + // because we are strictly limited by `maxlen`. + let limit = if frac_digits < 0x8000 { -(frac_digits as i16) } else { i16::MIN }; + 800298c: f248 0c00 movw ip, #32768 ; 0x8000 + 8002990: f5b2 4f00 cmp.w r2, #32768 ; 0x8000 + 8002994: f6cf 7cff movt ip, #65535 ; 0xffff + 8002998: bf38 it cc + 800299a: f1c2 0c00 rsbcc ip, r2, #0 +/// The exact and fixed mode implementation for Grisu. +/// +/// It returns `None` when it would return an inexact representation otherwise. +pub fn format_exact_opt(d: &Decoded, buf: &mut [u8], limit: i16) + -> Option<(/*#digits*/ usize, /*exp*/ i16)> { + assert!(d.mant > 0); + 800299e: ea5a 0006 orrs.w r0, sl, r6 + 80029a2: f001 8028 beq.w 80039f6 <core::fmt::float::float_to_decimal_common_exact+0x11c2> + assert!(d.mant < (1 << 61)); // we need at least three bits of additional precision + 80029a6: f1b6 5f00 cmp.w r6, #536870912 ; 0x20000000 + 80029aa: 9301 str r3, [sp, #4] + 80029ac: f8cd e01c str.w lr, [sp, #28] + 80029b0: f081 8027 bcs.w 8003a02 <core::fmt::float::float_to_decimal_common_exact+0x11ce> + 80029b4: e9cd 2902 strd r2, r9, [sp, #8] + if f >> (64 - 32) == 0 { + 80029b8: 2e00 cmp r6, #0 + 80029ba: 46b6 mov lr, r6 + 80029bc: 4632 mov r2, r6 + 80029be: bf0c ite eq + 80029c0: 46d6 moveq lr, sl + 80029c2: 4652 movne r2, sl + if f >> (64 - 16) == 0 { + 80029c4: f5be 3f80 cmp.w lr, #65536 ; 0x10000 + 80029c8: 4613 mov r3, r2 + f <<= 16; + 80029ca: ea4f 450e mov.w r5, lr, lsl #16 + if f >> (64 - 16) == 0 { + 80029ce: 46f0 mov r8, lr + 80029d0: bf38 it cc + 80029d2: 041b lslcc r3, r3, #16 + 80029d4: bf38 it cc + 80029d6: ea45 4812 orrcc.w r8, r5, r2, lsr #16 + if f >> (64 - 8) == 0 { + 80029da: f1b8 7f80 cmp.w r8, #16777216 ; 0x1000000 + 80029de: 461d mov r5, r3 + f <<= 8; + 80029e0: ea4f 2208 mov.w r2, r8, lsl #8 + if f >> (64 - 8) == 0 { + 80029e4: 4641 mov r1, r8 + 80029e6: bf38 it cc + 80029e8: 022d lslcc r5, r5, #8 + 80029ea: bf38 it cc + 80029ec: ea42 6113 orrcc.w r1, r2, r3, lsr #24 + if f >> (64 - 4) == 0 { + 80029f0: f1b1 5f80 cmp.w r1, #268435456 ; 0x10000000 + 80029f4: 462a mov r2, r5 + f <<= 4; + 80029f6: ea4f 1301 mov.w r3, r1, lsl #4 + if f >> (64 - 4) == 0 { + 80029fa: 4608 mov r0, r1 + 80029fc: bf38 it cc + 80029fe: 0112 lslcc r2, r2, #4 + 8002a00: bf38 it cc + 8002a02: ea43 7015 orrcc.w r0, r3, r5, lsr #28 + f <<= 2; + 8002a06: 0083 lsls r3, r0, #2 + if f >> (64 - 2) == 0 { + 8002a08: f1b0 4f80 cmp.w r0, #1073741824 ; 0x40000000 + 8002a0c: 4605 mov r5, r0 + 8002a0e: bf3c itt cc + 8002a10: ea43 7592 orrcc.w r5, r3, r2, lsr #30 + 8002a14: 0092 lslcc r2, r2, #2 + if f >> (64 - 32) == 0 { + 8002a16: 2e00 cmp r6, #0 + 8002a18: 465b mov r3, fp + 8002a1a: f8cd b018 str.w fp, [sp, #24] + 8002a1e: bf08 it eq + 8002a20: 3b20 subeq r3, #32 + if f >> (64 - 16) == 0 { + 8002a22: f5be 3f80 cmp.w lr, #65536 ; 0x10000 + 8002a26: bf38 it cc + 8002a28: 3b10 subcc r3, #16 + if f >> (64 - 8) == 0 { + 8002a2a: f1b8 7f80 cmp.w r8, #16777216 ; 0x1000000 + 8002a2e: bf38 it cc + 8002a30: 3b08 subcc r3, #8 + if f >> (64 - 4) == 0 { + 8002a32: f1b1 5f80 cmp.w r1, #268435456 ; 0x10000000 + let idx = ((gamma as i32) - offset) * range / domain; + 8002a36: f245 31b0 movw r1, #21424 ; 0x53b0 + 8002a3a: bf38 it cc + 8002a3c: 3b04 subcc r3, #4 + if f >> (64 - 2) == 0 { + 8002a3e: f1b0 4f80 cmp.w r0, #1073741824 ; 0x40000000 + if f >> (64 - 1) == 0 { + 8002a42: ea6f 70e5 mvn.w r0, r5, asr #31 + 8002a46: f2c0 0101 movt r1, #1 + if f >> (64 - 2) == 0 { + 8002a4a: bf38 it cc + 8002a4c: 3b02 subcc r3, #2 + if f >> (64 - 1) == 0 { + 8002a4e: eb03 0e00 add.w lr, r3, r0 + 8002a52: f04f 30ff mov.w r0, #4294967295 ; 0xffffffff + assert!(!buf.is_empty()); + + // normalize and scale `v`. + let v = Fp { f: d.mant, e: d.exp }.normalize(); + let (minusk, cached) = cached_power(ALPHA - v.e - 64, GAMMA - v.e - 64); + 8002a56: 385f subs r0, #95 ; 0x5f + 8002a58: eba0 000e sub.w r0, r0, lr + let idx = ((gamma as i32) - offset) * range / domain; + 8002a5c: b200 sxth r0, r0 + 8002a5e: eb00 0080 add.w r0, r0, r0, lsl #2 + 8002a62: eb01 1000 add.w r0, r1, r0, lsl #4 + 8002a66: f64c 1193 movw r1, #51603 ; 0xc993 + 8002a6a: f6c7 314d movt r1, #31565 ; 0x7b4d + 8002a6e: fb50 f001 smmul r0, r0, r1 + 8002a72: 1281 asrs r1, r0, #10 + 8002a74: eb01 70d0 add.w r0, r1, r0, lsr #31 + let (f, e, k) = CACHED_POW10[idx as usize]; + 8002a78: 2851 cmp r0, #81 ; 0x51 + 8002a7a: f080 87c8 bcs.w 8003a0e <core::fmt::float::float_to_decimal_common_exact+0x11da> + 8002a7e: fa0f f18c sxth.w r1, ip + 8002a82: f643 58c0 movw r8, #15808 ; 0x3dc0 + 8002a86: 0853 lsrs r3, r2, #1 + 8002a88: f04f 0c01 mov.w ip, #1 + 8002a8c: 910b str r1, [sp, #44] ; 0x2c + 8002a8e: 211e movs r1, #30 + 8002a90: f6c0 0800 movt r8, #2048 ; 0x800 + 8002a94: ea41 71d5 orr.w r1, r1, r5, lsr #31 + 8002a98: eb08 1b00 add.w fp, r8, r0, lsl #4 + 8002a9c: 0100 lsls r0, r0, #4 + 8002a9e: fa23 f101 lsr.w r1, r3, r1 + 8002aa2: ea8c 73d5 eor.w r3, ip, r5, lsr #31 + 8002aa6: f858 0000 ldr.w r0, [r8, r0] + 8002aaa: 409d lsls r5, r3 + 8002aac: fa02 f303 lsl.w r3, r2, r3 + 8002ab0: ea45 0401 orr.w r4, r5, r1 + 8002ab4: f8db 5004 ldr.w r5, [fp, #4] + let ad = a * d; + 8002ab8: fba0 8104 umull r8, r1, r0, r4 + let bc = b * c; + 8002abc: fba5 9203 umull r9, r2, r5, r3 + let bd = b * d; + 8002ac0: fba0 0303 umull r0, r3, r0, r3 + 8002ac4: 2000 movs r0, #0 + let tmp = (bd >> 32) + (ad & MASK) + (bc & MASK) + (1 << 31) /* round */; + 8002ac6: eb13 0308 adds.w r3, r3, r8 + let f = ac + (ad >> 32) + (bc >> 32) + (tmp >> 32); + 8002aca: fbe5 1264 umaal r1, r2, r5, r4 + let v = v.mul(&cached); + + // divide `v` into integral and fractional parts. + let e = -v.e as usize; + 8002ace: f06f 053f mvn.w r5, #63 ; 0x3f + let tmp = (bd >> 32) + (ad & MASK) + (bc & MASK) + (1 << 31) /* round */; + 8002ad2: f140 0000 adc.w r0, r0, #0 + 8002ad6: eb13 0309 adds.w r3, r3, r9 + 8002ada: f140 0000 adc.w r0, r0, #0 + 8002ade: f113 4300 adds.w r3, r3, #2147483648 ; 0x80000000 + let (f, e, k) = CACHED_POW10[idx as usize]; + 8002ae2: f8bb 3008 ldrh.w r3, [fp, #8] + 8002ae6: f140 0000 adc.w r0, r0, #0 + let f = ac + (ad >> 32) + (bc >> 32) + (tmp >> 32); + 8002aea: 1840 adds r0, r0, r1 + 8002aec: f142 0100 adc.w r1, r2, #0 + let e = self.e + other.e + 64; + 8002af0: 4473 add r3, lr + let e = -v.e as usize; + 8002af2: 1aeb subs r3, r5, r3 + 8002af4: fa0f f983 sxth.w r9, r3 + let vint = (v.f >> e) as u32; + 8002af8: f009 043f and.w r4, r9, #63 ; 0x3f + 8002afc: f1c4 0320 rsb r3, r4, #32 + 8002b00: fa20 f504 lsr.w r5, r0, r4 + 8002b04: fa01 f203 lsl.w r2, r1, r3 + let vfrac = v.f & ((1 << e) - 1); + 8002b08: fa2c fe03 lsr.w lr, ip, r3 + let vint = (v.f >> e) as u32; + 8002b0c: 4315 orrs r5, r2 + 8002b0e: f1a4 0220 sub.w r2, r4, #32 + 8002b12: 2a00 cmp r2, #0 + 8002b14: bfa8 it ge + 8002b16: fa21 f502 lsrge.w r5, r1, r2 + 8002b1a: 9311 str r3, [sp, #68] ; 0x44 + let vfrac = v.f & ((1 << e) - 1); + 8002b1c: bfa8 it ge + 8002b1e: fa0c fe02 lslge.w lr, ip, r2 + 8002b22: fa0c f304 lsl.w r3, ip, r4 + 8002b26: 2a00 cmp r2, #0 + 8002b28: 9413 str r4, [sp, #76] ; 0x4c + 8002b2a: 9212 str r2, [sp, #72] ; 0x48 + let (f, e, k) = CACHED_POW10[idx as usize]; + 8002b2c: f8bb c00a ldrh.w ip, [fp, #10] + let vfrac = v.f & ((1 << e) - 1); + 8002b30: f8cd e020 str.w lr, [sp, #32] + 8002b34: bfa8 it ge + 8002b36: 2300 movge r3, #0 + if x < X4 { + 8002b38: f8cd 9038 str.w r9, [sp, #56] ; 0x38 + let vfrac = v.f & ((1 << e) - 1); + 8002b3c: 1e5a subs r2, r3, #1 + 8002b3e: 9305 str r3, [sp, #20] + 8002b40: 9210 str r2, [sp, #64] ; 0x40 + 8002b42: f16e 0200 sbc.w r2, lr, #0 + if x < X4 { + 8002b46: 920f str r2, [sp, #60] ; 0x3c + 8002b48: f242 720f movw r2, #9999 ; 0x270f + 8002b4c: 4295 cmp r5, r2 + 8002b4e: d810 bhi.n 8002b72 <core::fmt::float::float_to_decimal_common_exact+0x33e> + 8002b50: f8dd b028 ldr.w fp, [sp, #40] ; 0x28 + if x < X2 { if x < X1 {(0, 1)} else {(1, X1)} } + 8002b54: 2d64 cmp r5, #100 ; 0x64 + 8002b56: d26c bcs.n 8002c32 <core::fmt::float::float_to_decimal_common_exact+0x3fe> + 8002b58: f04f 080a mov.w r8, #10 + 8002b5c: 2d0a cmp r5, #10 + 8002b5e: f04f 0300 mov.w r3, #0 + 8002b62: bf38 it cc + 8002b64: f04f 0801 movcc.w r8, #1 + 8002b68: 2d09 cmp r5, #9 + 8002b6a: bf88 it hi + 8002b6c: 2301 movhi r3, #1 + 8002b6e: 9c06 ldr r4, [sp, #24] + 8002b70: e08a b.n 8002c88 <core::fmt::float::float_to_decimal_common_exact+0x454> + 8002b72: f8dd b028 ldr.w fp, [sp, #40] ; 0x28 + 8002b76: f244 2840 movw r8, #16960 ; 0x4240 + 8002b7a: f2c0 080f movt r8, #15 + if x < X6 { if x < X5 {(4, X4)} else {(5, X5)} } + 8002b7e: 4545 cmp r5, r8 + 8002b80: d264 bcs.n 8002c4c <core::fmt::float::float_to_decimal_common_exact+0x418> + 8002b82: f248 68a0 movw r8, #34464 ; 0x86a0 + 8002b86: 2305 movs r3, #5 + 8002b88: f2c0 0801 movt r8, #1 + 8002b8c: 4545 cmp r5, r8 + 8002b8e: bf3c itt cc + 8002b90: 2304 movcc r3, #4 + 8002b92: f242 7810 movwcc r8, #10000 ; 0x2710 + 8002b96: 9c06 ldr r4, [sp, #24] + 8002b98: e076 b.n 8002c88 <core::fmt::float::float_to_decimal_common_exact+0x454> + 8002b9a: 2300 movs r3, #0 + 8002b9c: e014 b.n 8002bc8 <core::fmt::float::float_to_decimal_common_exact+0x394> + (FullDecoded::Zero, Sign::MinusRaw) => if negative { b"-" } else { b"" }, + 8002b9e: f644 20af movw r0, #19119 ; 0x4aaf + 8002ba2: 2d00 cmp r5, #0 + let (negative, full_decoded) = decode(v); + 8002ba4: ea4f 73d5 mov.w r3, r5, lsr #31 + (FullDecoded::Zero, Sign::MinusRaw) => if negative { b"-" } else { b"" }, + 8002ba8: f6c0 0000 movt r0, #2048 ; 0x800 + 8002bac: e00a b.n 8002bc4 <core::fmt::float::float_to_decimal_common_exact+0x390> + (FullDecoded::Zero, Sign::MinusPlusRaw) => if negative { b"-" } else { b"+" }, + 8002bae: f644 20af movw r0, #19119 ; 0x4aaf + 8002bb2: f644 2eb0 movw lr, #19120 ; 0x4ab0 + 8002bb6: 2d00 cmp r5, #0 + 8002bb8: f04f 0301 mov.w r3, #1 + 8002bbc: f6c0 0000 movt r0, #2048 ; 0x800 + 8002bc0: f6c0 0e00 movt lr, #2048 ; 0x800 + 8002bc4: bfb8 it lt + 8002bc6: 4686 movlt lr, r0 + 8002bc8: 2002 movs r0, #2 + if frac_digits > 0 { // [0.][0000] + 8002bca: 2a00 cmp r2, #0 + 8002bcc: f827 0cc4 strh.w r0, [r7, #-196] + 8002bd0: d00c beq.n 8002bec <core::fmt::float::float_to_decimal_common_exact+0x3b8> + parts[0] = Part::Copy(b"0."); + 8002bd2: f644 2184 movw r1, #19076 ; 0x4a84 + 8002bd6: f6c0 0100 movt r1, #2048 ; 0x800 + 8002bda: e947 1030 strd r1, r0, [r7, #-192] ; 0xc0 + parts[1] = Part::Zero(frac_digits); + 8002bde: 2100 movs r1, #0 + 8002be0: f827 1cb8 strh.w r1, [r7, #-184] + 8002be4: f847 2cb4 str.w r2, [r7, #-180] + 8002be8: f000 be9e b.w 8003928 <core::fmt::float::float_to_decimal_common_exact+0x10f4> + parts[0] = Part::Copy(b"0"); + 8002bec: f644 306e movw r0, #19310 ; 0x4b6e + 8002bf0: f1a7 01c4 sub.w r1, r7, #196 ; 0xc4 + 8002bf4: f6c0 0000 movt r0, #2048 ; 0x800 + 8002bf8: f847 0cc0 str.w r0, [r7, #-192] + 8002bfc: 2001 movs r0, #1 + 8002bfe: f847 0cbc str.w r0, [r7, #-188] + 8002c02: f000 be93 b.w 800392c <core::fmt::float::float_to_decimal_common_exact+0x10f8> + parts[0] = Part::Copy(b"NaN"); + 8002c06: 2002 movs r0, #2 + 8002c08: f244 4e98 movw lr, #17560 ; 0x4498 + 8002c0c: f1a7 01c4 sub.w r1, r7, #196 ; 0xc4 + 8002c10: 2300 movs r3, #0 + 8002c12: f827 0cc4 strh.w r0, [r7, #-196] + 8002c16: f644 3068 movw r0, #19304 ; 0x4b68 + 8002c1a: f6c0 0e00 movt lr, #2048 ; 0x800 + 8002c1e: f6c0 0000 movt r0, #2048 ; 0x800 + 8002c22: f847 0cc0 str.w r0, [r7, #-192] + 8002c26: 2003 movs r0, #3 + 8002c28: f847 0cbc str.w r0, [r7, #-188] + 8002c2c: 2001 movs r0, #1 + 8002c2e: f000 be7d b.w 800392c <core::fmt::float::float_to_decimal_common_exact+0x10f8> + else { if x < X3 {(2, X2)} else {(3, X3)} } + 8002c32: f44f 787a mov.w r8, #1000 ; 0x3e8 + 8002c36: f5b5 7f7a cmp.w r5, #1000 ; 0x3e8 + 8002c3a: f04f 0303 mov.w r3, #3 + 8002c3e: bf38 it cc + 8002c40: f04f 0864 movcc.w r8, #100 ; 0x64 + 8002c44: bf38 it cc + 8002c46: 2302 movcc r3, #2 + 8002c48: 9c06 ldr r4, [sp, #24] + 8002c4a: e01d b.n 8002c88 <core::fmt::float::float_to_decimal_common_exact+0x454> + 8002c4c: 9c06 ldr r4, [sp, #24] + 8002c4e: f24e 1200 movw r2, #57600 ; 0xe100 + 8002c52: f2c0 52f5 movt r2, #1525 ; 0x5f5 + else if x < X8 { if x < X7 {(6, X6)} else {(7, X7)} } + 8002c56: 4295 cmp r5, r2 + 8002c58: d20a bcs.n 8002c70 <core::fmt::float::float_to_decimal_common_exact+0x43c> + 8002c5a: f249 6280 movw r2, #38528 ; 0x9680 + 8002c5e: 2307 movs r3, #7 + 8002c60: f2c0 0298 movt r2, #152 ; 0x98 + 8002c64: 4295 cmp r5, r2 + 8002c66: bf28 it cs + 8002c68: 4690 movcs r8, r2 + 8002c6a: bf38 it cc + 8002c6c: 2306 movcc r3, #6 + 8002c6e: e00b b.n 8002c88 <core::fmt::float::float_to_decimal_common_exact+0x454> + else { if x < X9 {(8, X8)} else {(9, X9)} } + 8002c70: f64c 2300 movw r3, #51712 ; 0xca00 + 8002c74: f6c3 339a movt r3, #15258 ; 0x3b9a + 8002c78: 429d cmp r5, r3 + 8002c7a: bf28 it cs + 8002c7c: 461a movcs r2, r3 + 8002c7e: f04f 0309 mov.w r3, #9 + 8002c82: bf38 it cc + 8002c84: 2308 movcc r3, #8 + 8002c86: 4690 mov r8, r2 + // calculate the largest `10^max_kappa` no more than `v` (thus `v < 10^(max_kappa+1)`). + // this is an upper bound of `kappa` below. + let (max_kappa, max_ten_kappa) = max_pow10_no_more_than(vint); + + let mut i = 0; + let exp = max_kappa as i16 - minusk + 1; + 8002c88: fa5f f983 uxtb.w r9, r3 + 8002c8c: eba9 020c sub.w r2, r9, ip + 8002c90: 9200 str r2, [sp, #0] + 8002c92: 3201 adds r2, #1 + 8002c94: b213 sxth r3, r2 + 8002c96: 9a0b ldr r2, [sp, #44] ; 0x2c + + // if we are working with the last-digit limitation, we need to shorten the buffer + // before the actual rendering in order to avoid double rounding. + // note that we have to enlarge the buffer again when rounding up happens! + let len = if exp <= limit { + 8002c98: 9309 str r3, [sp, #36] ; 0x24 + 8002c9a: 4293 cmp r3, r2 + 8002c9c: dd30 ble.n 8002d00 <core::fmt::float::float_to_decimal_common_exact+0x4cc> + let vfrac = v.f & ((1 << e) - 1); + 8002c9e: 9c10 ldr r4, [sp, #64] ; 0x40 + 8002ca0: f64c 4ccd movw ip, #52429 ; 0xcccd + 8002ca4: f10d 0b5c add.w fp, sp, #92 ; 0x5c + 8002ca8: f6cc 4ccc movt ip, #52428 ; 0xcccc + 8002cac: 4020 ands r0, r4 + 8002cae: 9016 str r0, [sp, #88] ; 0x58 + 8002cb0: 980f ldr r0, [sp, #60] ; 0x3c + 8002cb2: ea01 0e00 and.w lr, r1, r0 + 8002cb6: 9915 ldr r1, [sp, #84] ; 0x54 + // but scaling `max_ten_kappa << e` by 10 can result in overflow. + // thus we are being sloppy here and widen the error range by a factor of 10. + // this will increase the false negative rate, but only very, *very* slightly; + // it can only matter noticeably when the mantissa is bigger than 60 bits. + return possibly_round(buf, 0, exp, limit, v.f / 10, (max_ten_kappa as u64) << e, err << e); + } else if ((exp as i32 - limit as i32) as usize) < buf.len() { + 8002cb8: 1a98 subs r0, r3, r2 + 8002cba: 4288 cmp r0, r1 + 8002cbc: 460c mov r4, r1 + 8002cbe: bf38 it cc + 8002cc0: b204 sxthcc r4, r0 + 8002cc2: 2001 movs r0, #1 + // - `vint = d[0..n-1] * 10^(kappa+1) + remainder` + // (it follows that `remainder = vint % 10^(kappa+1)`) + + // divide `remainder` by `10^kappa`. both are scaled by `2^-e`. + let q = remainder / ten_kappa; + let r = remainder % ten_kappa; + 8002cc4: fbb5 f2f8 udiv r2, r5, r8 + debug_assert!(q < 10); + buf[i] = b'0' + q as u8; + 8002cc8: eb0b 0100 add.w r1, fp, r0 + i += 1; + + // is the buffer full? run the rounding pass with the remainder. + if i == len { + 8002ccc: 4284 cmp r4, r0 + buf[i] = b'0' + q as u8; + 8002cce: f102 0330 add.w r3, r2, #48 ; 0x30 + let r = remainder % ten_kappa; + 8002cd2: fb02 5518 mls r5, r2, r8, r5 + buf[i] = b'0' + q as u8; + 8002cd6: f801 3c01 strb.w r3, [r1, #-1] + 8002cda: d07b beq.n 8002dd4 <core::fmt::float::float_to_decimal_common_exact+0x5a0> + return possibly_round(buf, len, exp, limit, vrem, (ten_kappa as u64) << e, err << e); + } + + // break the loop when we have rendered all integral digits. + // the exact number of digits is `max_kappa + 1` as `plus1 < 10^(max_kappa+1)`. + if i > max_kappa as usize { + 8002cdc: 4548 cmp r0, r9 + 8002cde: f200 80fc bhi.w 8002eda <core::fmt::float::float_to_decimal_common_exact+0x6a6> + break; + } + + // restore invariants + kappa -= 1; + ten_kappa /= 10; + 8002ce2: fba8 120c umull r1, r2, r8, ip + let q = remainder / ten_kappa; + 8002ce6: 3001 adds r0, #1 + 8002ce8: f1b8 0f0a cmp.w r8, #10 + ten_kappa /= 10; + 8002cec: ea4f 01d2 mov.w r1, r2, lsr #3 + 8002cf0: 4688 mov r8, r1 + 8002cf2: d2e7 bcs.n 8002cc4 <core::fmt::float::float_to_decimal_common_exact+0x490> + let q = remainder / ten_kappa; + 8002cf4: f644 10e0 movw r0, #18912 ; 0x49e0 + 8002cf8: f6c0 0000 movt r0, #2048 ; 0x800 + 8002cfc: f7fd fef9 bl 8000af2 <core::panicking::panic> + return possibly_round(buf, 0, exp, limit, v.f / 10, (max_ten_kappa as u64) << e, err << e); + 8002d00: 220a movs r2, #10 + 8002d02: 2300 movs r3, #0 + 8002d04: 46a1 mov r9, r4 + 8002d06: f000 fed9 bl 8003abc <__aeabi_uldivmod> + 8002d0a: 9a11 ldr r2, [sp, #68] ; 0x44 + 8002d0c: 9b12 ldr r3, [sp, #72] ; 0x48 + 8002d0e: fa28 f202 lsr.w r2, r8, r2 + 8002d12: 2b00 cmp r3, #0 + 8002d14: bfa8 it ge + 8002d16: fa08 f203 lslge.w r2, r8, r3 + 8002d1a: 9b13 ldr r3, [sp, #76] ; 0x4c + 8002d1c: fa08 f303 lsl.w r3, r8, r3 + 8002d20: bfa8 it ge + 8002d22: 2300 movge r3, #0 + 8002d24: 9c05 ldr r4, [sp, #20] + 8002d26: f8dd 8020 ldr.w r8, [sp, #32] + // v - 1 ulp v + 1 ulp + // + // in fact, 1/2 ulp is enough to introduce two possible representations. + // (remember that we need a unique representation for both `v - 1 ulp` and `v + 1 ulp`.) + // this won't overflow, as `ulp < ten_kappa` from the first check. + if ten_kappa - ulp <= ulp { return None; } + 8002d2a: ebb3 0e04 subs.w lr, r3, r4 + 8002d2e: eb62 0c08 sbc.w ip, r2, r8 + if ulp >= ten_kappa { return None; } + 8002d32: 1ae5 subs r5, r4, r3 + 8002d34: eb78 0502 sbcs.w r5, r8, r2 + 8002d38: f080 8164 bcs.w 8003004 <core::fmt::float::float_to_decimal_common_exact+0x7d0> + 8002d3c: ebb4 050e subs.w r5, r4, lr + 8002d40: eb78 050c sbcs.w r5, r8, ip + 8002d44: f080 815e bcs.w 8003004 <core::fmt::float::float_to_decimal_common_exact+0x7d0> + // + // the condition equals to `remainder + ulp < 10^kappa / 2`. + // since this can easily overflow, first check if `remainder < 10^kappa / 2`. + // we've already verified that `ulp < 10^kappa / 2`, so as long as + // `10^kappa` did not overflow after all, the second check is fine. + if ten_kappa - remainder > remainder && ten_kappa - 2 * remainder >= 2 * ulp { + 8002d48: 1a1d subs r5, r3, r0 + 8002d4a: eb62 0c01 sbc.w ip, r2, r1 + 8002d4e: 1b45 subs r5, r0, r5 + 8002d50: eb71 050c sbcs.w r5, r1, ip + 8002d54: d210 bcs.n 8002d78 <core::fmt::float::float_to_decimal_common_exact+0x544> + 8002d56: 004d lsls r5, r1, #1 + 8002d58: ebb3 0c40 subs.w ip, r3, r0, lsl #1 + 8002d5c: ea45 75d0 orr.w r5, r5, r0, lsr #31 + 8002d60: eb62 0e05 sbc.w lr, r2, r5 + 8002d64: 9d08 ldr r5, [sp, #32] + 8002d66: 006d lsls r5, r5, #1 + 8002d68: ea45 78d4 orr.w r8, r5, r4, lsr #31 + 8002d6c: ebbc 0544 subs.w r5, ip, r4, lsl #1 + 8002d70: eb7e 0508 sbcs.w r5, lr, r8 + 8002d74: f080 852c bcs.w 80037d0 <core::fmt::float::float_to_decimal_common_exact+0xf9c> + 8002d78: f8dd c020 ldr.w ip, [sp, #32] + // + // the condition equals to `remainder - ulp >= 10^kappa / 2`. + // again we first check if `remainder > ulp` (note that this is not `remainder >= ulp`, + // as `10^kappa` is never zero). also note that `remainder - ulp <= 10^kappa`, + // so the second check does not overflow. + if remainder > ulp && ten_kappa - (remainder - ulp) <= remainder - ulp { + 8002d7c: 1a25 subs r5, r4, r0 + 8002d7e: eb7c 0501 sbcs.w r5, ip, r1 + 8002d82: f080 813f bcs.w 8003004 <core::fmt::float::float_to_decimal_common_exact+0x7d0> + 8002d86: 1b00 subs r0, r0, r4 + 8002d88: eb61 010c sbc.w r1, r1, ip + 8002d8c: 1a1b subs r3, r3, r0 + 8002d8e: 418a sbcs r2, r1 + 8002d90: 1ac0 subs r0, r0, r3 + 8002d92: eb71 0002 sbcs.w r0, r1, r2 + 8002d96: f0c0 8135 bcc.w 8003004 <core::fmt::float::float_to_decimal_common_exact+0x7d0> + if let Some(c) = round_up(buf, len) { + 8002d9a: 9915 ldr r1, [sp, #84] ; 0x54 + 8002d9c: a817 add r0, sp, #92 ; 0x5c + 8002d9e: 2200 movs r2, #0 + 8002da0: 2400 movs r4, #0 + 8002da2: f7fd ff30 bl 8000c06 <core::num::flt2dec::round_up> + 8002da6: f3c0 2107 ubfx r1, r0, #8, #8 + 8002daa: f8dd e01c ldr.w lr, [sp, #28] + 8002dae: 9e0b ldr r6, [sp, #44] ; 0x2c + 8002db0: e9dd 8902 ldrd r8, r9, [sp, #8] + 8002db4: b2c0 uxtb r0, r0 + 8002db6: 2801 cmp r0, #1 + 8002db8: f040 8522 bne.w 8003800 <core::fmt::float::float_to_decimal_common_exact+0xfcc> + // only add an additional digit when we've been requested the fixed precision. + // we also need to check that, if the original buffer was empty, + // the additional digit can only be added when `exp == limit` (edge case). + exp += 1; + 8002dbc: 9800 ldr r0, [sp, #0] + 8002dbe: 3002 adds r0, #2 + 8002dc0: b200 sxth r0, r0 + if exp > limit && len < buf.len() { + 8002dc2: 42b0 cmp r0, r6 + 8002dc4: 9009 str r0, [sp, #36] ; 0x24 + buf[len] = c; + 8002dc6: bfc6 itte gt + 8002dc8: f88d 105c strbgt.w r1, [sp, #92] ; 0x5c + 8002dcc: 2401 movgt r4, #1 + 8002dce: 2400 movle r4, #0 + 8002dd0: f000 bd16 b.w 8003800 <core::fmt::float::float_to_decimal_common_exact+0xfcc> + 8002dd4: 46a3 mov fp, r4 + 8002dd6: 9c11 ldr r4, [sp, #68] ; 0x44 + 8002dd8: 9b12 ldr r3, [sp, #72] ; 0x48 + let vrem = ((r as u64) << e) + vfrac; // == (v % 10^kappa) * 2^e + 8002dda: fa25 f004 lsr.w r0, r5, r4 + 8002dde: 2b00 cmp r3, #0 + 8002de0: bfa8 it ge + 8002de2: fa05 f003 lslge.w r0, r5, r3 + 8002de6: 9a13 ldr r2, [sp, #76] ; 0x4c + 8002de8: fa05 f102 lsl.w r1, r5, r2 + 8002dec: bfa8 it ge + 8002dee: 2100 movge r1, #0 + 8002df0: 9d16 ldr r5, [sp, #88] ; 0x58 + 8002df2: eb11 0905 adds.w r9, r1, r5 + 8002df6: eb40 0c0e adc.w ip, r0, lr + return possibly_round(buf, len, exp, limit, vrem, (ten_kappa as u64) << e, err << e); + 8002dfa: fa28 f004 lsr.w r0, r8, r4 + 8002dfe: 2b00 cmp r3, #0 + 8002e00: bfa8 it ge + 8002e02: fa08 f003 lslge.w r0, r8, r3 + 8002e06: fa08 f302 lsl.w r3, r8, r2 + 8002e0a: bfa8 it ge + 8002e0c: 2300 movge r3, #0 + 8002e0e: 9905 ldr r1, [sp, #20] + 8002e10: 9c08 ldr r4, [sp, #32] + if ten_kappa - ulp <= ulp { return None; } + 8002e12: 1a5d subs r5, r3, r1 + 8002e14: eb60 0204 sbc.w r2, r0, r4 + if ulp >= ten_kappa { return None; } + 8002e18: 1ac9 subs r1, r1, r3 + 8002e1a: eb74 0100 sbcs.w r1, r4, r0 + 8002e1e: f080 80e8 bcs.w 8002ff2 <core::fmt::float::float_to_decimal_common_exact+0x7be> + 8002e22: 9905 ldr r1, [sp, #20] + 8002e24: 1b49 subs r1, r1, r5 + 8002e26: 9908 ldr r1, [sp, #32] + 8002e28: 4191 sbcs r1, r2 + 8002e2a: f080 80e2 bcs.w 8002ff2 <core::fmt::float::float_to_decimal_common_exact+0x7be> + 8002e2e: f8dd e01c ldr.w lr, [sp, #28] + if ten_kappa - remainder > remainder && ten_kappa - 2 * remainder >= 2 * ulp { + 8002e32: ebb3 0109 subs.w r1, r3, r9 + 8002e36: eb60 020c sbc.w r2, r0, ip + 8002e3a: ebb9 0101 subs.w r1, r9, r1 + 8002e3e: eb7c 0102 sbcs.w r1, ip, r2 + 8002e42: d211 bcs.n 8002e68 <core::fmt::float::float_to_decimal_common_exact+0x634> + 8002e44: 9c08 ldr r4, [sp, #32] + 8002e46: ea4f 014c mov.w r1, ip, lsl #1 + 8002e4a: ebb3 0249 subs.w r2, r3, r9, lsl #1 + 8002e4e: ea41 71d9 orr.w r1, r1, r9, lsr #31 + 8002e52: eb60 0101 sbc.w r1, r0, r1 + 8002e56: 0065 lsls r5, r4, #1 + 8002e58: 9c05 ldr r4, [sp, #20] + 8002e5a: ea45 75d4 orr.w r5, r5, r4, lsr #31 + 8002e5e: ebb2 0244 subs.w r2, r2, r4, lsl #1 + 8002e62: 41a9 sbcs r1, r5 + 8002e64: f080 84bb bcs.w 80037de <core::fmt::float::float_to_decimal_common_exact+0xfaa> + if remainder > ulp && ten_kappa - (remainder - ulp) <= remainder - ulp { + 8002e68: 9905 ldr r1, [sp, #20] + 8002e6a: ebb1 0109 subs.w r1, r1, r9 + 8002e6e: 9908 ldr r1, [sp, #32] + 8002e70: eb71 010c sbcs.w r1, r1, ip + 8002e74: f080 80bd bcs.w 8002ff2 <core::fmt::float::float_to_decimal_common_exact+0x7be> + 8002e78: 9905 ldr r1, [sp, #20] + 8002e7a: 9a08 ldr r2, [sp, #32] + 8002e7c: ebb9 0101 subs.w r1, r9, r1 + 8002e80: eb6c 0202 sbc.w r2, ip, r2 + 8002e84: 1a5b subs r3, r3, r1 + 8002e86: 4190 sbcs r0, r2 + 8002e88: 1ac9 subs r1, r1, r3 + 8002e8a: eb72 0000 sbcs.w r0, r2, r0 + 8002e8e: f0c0 80b0 bcc.w 8002ff2 <core::fmt::float::float_to_decimal_common_exact+0x7be> + 8002e92: f8dd a054 ldr.w sl, [sp, #84] ; 0x54 + 8002e96: f10d 085c add.w r8, sp, #92 ; 0x5c + 8002e9a: 465c mov r4, fp + if let Some(c) = round_up(buf, len) { + 8002e9c: 4640 mov r0, r8 + 8002e9e: 4622 mov r2, r4 + 8002ea0: 4651 mov r1, sl + 8002ea2: f7fd feb0 bl 8000c06 <core::num::flt2dec::round_up> + 8002ea6: f3c0 2107 ubfx r1, r0, #8, #8 + 8002eaa: b2c0 uxtb r0, r0 + 8002eac: 2801 cmp r0, #1 + 8002eae: f040 84a2 bne.w 80037f6 <core::fmt::float::float_to_decimal_common_exact+0xfc2> + exp += 1; + 8002eb2: 9800 ldr r0, [sp, #0] + 8002eb4: 9e0b ldr r6, [sp, #44] ; 0x2c + 8002eb6: 3002 adds r0, #2 + 8002eb8: b200 sxth r0, r0 + 8002eba: 9009 str r0, [sp, #36] ; 0x24 + if exp > limit && len < buf.len() { + 8002ebc: 42b0 cmp r0, r6 + 8002ebe: e9dd 0902 ldrd r0, r9, [sp, #8] + 8002ec2: f8dd e01c ldr.w lr, [sp, #28] + 8002ec6: f340 856a ble.w 800399e <core::fmt::float::float_to_decimal_common_exact+0x116a> + 8002eca: 4554 cmp r4, sl + buf[len] = c; + 8002ecc: bf3c itt cc + 8002ece: f808 1004 strbcc.w r1, [r8, r4] + len += 1; + 8002ed2: 3401 addcc r4, #1 + 8002ed4: 4680 mov r8, r0 + 8002ed6: f000 bc93 b.w 8003800 <core::fmt::float::float_to_decimal_common_exact+0xfcc> + let maxerr = 1 << (e - 1); + 8002eda: 990e ldr r1, [sp, #56] ; 0x38 + 8002edc: f04f 0b01 mov.w fp, #1 + 8002ee0: 9414 str r4, [sp, #80] ; 0x50 + 8002ee2: 313f adds r1, #63 ; 0x3f + 8002ee4: f001 023f and.w r2, r1, #63 ; 0x3f + 8002ee8: f1a2 0320 sub.w r3, r2, #32 + 8002eec: f1c2 0520 rsb r5, r2, #32 + 8002ef0: fa2b f105 lsr.w r1, fp, r5 + 8002ef4: 2b00 cmp r3, #0 + 8002ef6: f04f 0500 mov.w r5, #0 + 8002efa: bfa8 it ge + 8002efc: fa0b f103 lslge.w r1, fp, r3 + 8002f00: 910e str r1, [sp, #56] ; 0x38 + 8002f02: fa0b f102 lsl.w r1, fp, r2 + 8002f06: bfa8 it ge + 8002f08: 2100 movge r1, #0 + 8002f0a: 910d str r1, [sp, #52] ; 0x34 + while err < maxerr { + 8002f0c: 990d ldr r1, [sp, #52] ; 0x34 + 8002f0e: 465b mov r3, fp + 8002f10: 1a59 subs r1, r3, r1 + 8002f12: 990e ldr r1, [sp, #56] ; 0x38 + 8002f14: eb75 0101 sbcs.w r1, r5, r1 + 8002f18: d26b bcs.n 8002ff2 <core::fmt::float::float_to_decimal_common_exact+0x7be> + buf[i] = b'0' + q as u8; + 8002f1a: 9915 ldr r1, [sp, #84] ; 0x54 + 8002f1c: 4288 cmp r0, r1 + 8002f1e: f080 8545 bcs.w 80039ac <core::fmt::float::float_to_decimal_common_exact+0x1178> + remainder *= 10; // won't overflow, `2^e * 10 < 2^64` + 8002f22: 9916 ldr r1, [sp, #88] ; 0x58 + 8002f24: 240a movs r4, #10 + err *= 10; // won't overflow, `err * 10 < 2^e * 5 < 2^64` + 8002f26: eb05 0985 add.w r9, r5, r5, lsl #2 + 8002f2a: fba3 b804 umull fp, r8, r3, r4 + 8002f2e: eb08 0549 add.w r5, r8, r9, lsl #1 + remainder *= 10; // won't overflow, `2^e * 10 < 2^64` + 8002f32: fba1 2c04 umull r2, ip, r1, r4 + let r = remainder & ((1 << e) - 1); + 8002f36: 9910 ldr r1, [sp, #64] ; 0x40 + 8002f38: 9c0f ldr r4, [sp, #60] ; 0x3c + 8002f3a: 4011 ands r1, r2 + err *= 10; // won't overflow, `err * 10 < 2^e * 5 < 2^64` + 8002f3c: 9116 str r1, [sp, #88] ; 0x58 + remainder *= 10; // won't overflow, `2^e * 10 < 2^64` + 8002f3e: eb0e 018e add.w r1, lr, lr, lsl #2 + 8002f42: eb0c 0141 add.w r1, ip, r1, lsl #1 + let r = remainder & ((1 << e) - 1); + 8002f46: ea01 0e04 and.w lr, r1, r4 + let q = remainder >> e; + 8002f4a: 9c13 ldr r4, [sp, #76] ; 0x4c + 8002f4c: 40e2 lsrs r2, r4 + 8002f4e: 9c11 ldr r4, [sp, #68] ; 0x44 + 8002f50: fa01 f404 lsl.w r4, r1, r4 + 8002f54: 4322 orrs r2, r4 + 8002f56: 9c12 ldr r4, [sp, #72] ; 0x48 + 8002f58: 2c00 cmp r4, #0 + 8002f5a: bfa8 it ge + 8002f5c: fa21 f204 lsrge.w r2, r1, r4 + buf[i] = b'0' + q as u8; + 8002f60: f102 0130 add.w r1, r2, #48 ; 0x30 + 8002f64: aa17 add r2, sp, #92 ; 0x5c + 8002f66: 5411 strb r1, [r2, r0] + if i == len { + 8002f68: 9914 ldr r1, [sp, #80] ; 0x50 + i += 1; + 8002f6a: 3001 adds r0, #1 + if i == len { + 8002f6c: 4281 cmp r1, r0 + 8002f6e: d1cd bne.n 8002f0c <core::fmt::float::float_to_decimal_common_exact+0x6d8> + 8002f70: 9905 ldr r1, [sp, #20] + 8002f72: 9a08 ldr r2, [sp, #32] + if ten_kappa - ulp <= ulp { return None; } + 8002f74: ebb1 000b subs.w r0, r1, fp + 8002f78: eb62 0c05 sbc.w ip, r2, r5 + if ulp >= ten_kappa { return None; } + 8002f7c: ebbb 0101 subs.w r1, fp, r1 + 8002f80: eb75 0102 sbcs.w r1, r5, r2 + 8002f84: d235 bcs.n 8002ff2 <core::fmt::float::float_to_decimal_common_exact+0x7be> + 8002f86: ebbb 0000 subs.w r0, fp, r0 + 8002f8a: eb75 000c sbcs.w r0, r5, ip + 8002f8e: d230 bcs.n 8002ff2 <core::fmt::float::float_to_decimal_common_exact+0x7be> + 8002f90: 9c05 ldr r4, [sp, #20] + 8002f92: 9a08 ldr r2, [sp, #32] + 8002f94: 46f0 mov r8, lr + 8002f96: 46a4 mov ip, r4 + 8002f98: 9c16 ldr r4, [sp, #88] ; 0x58 + if ten_kappa - remainder > remainder && ten_kappa - 2 * remainder >= 2 * ulp { + 8002f9a: ebbc 0004 subs.w r0, ip, r4 + 8002f9e: eb62 0108 sbc.w r1, r2, r8 + 8002fa2: 1a20 subs r0, r4, r0 + 8002fa4: eb78 0001 sbcs.w r0, r8, r1 + 8002fa8: d210 bcs.n 8002fcc <core::fmt::float::float_to_decimal_common_exact+0x798> + 8002faa: ea4f 0048 mov.w r0, r8, lsl #1 + 8002fae: ebbc 0144 subs.w r1, ip, r4, lsl #1 + 8002fb2: ea40 70d4 orr.w r0, r0, r4, lsr #31 + 8002fb6: eb62 0000 sbc.w r0, r2, r0 + 8002fba: 2214 movs r2, #20 + 8002fbc: fba3 2302 umull r2, r3, r3, r2 + 8002fc0: eb03 0389 add.w r3, r3, r9, lsl #2 + 8002fc4: 1a89 subs r1, r1, r2 + 8002fc6: 4198 sbcs r0, r3 + 8002fc8: f080 840e bcs.w 80037e8 <core::fmt::float::float_to_decimal_common_exact+0xfb4> + if remainder > ulp && ten_kappa - (remainder - ulp) <= remainder - ulp { + 8002fcc: ebbb 0004 subs.w r0, fp, r4 + 8002fd0: eb75 0008 sbcs.w r0, r5, r8 + 8002fd4: d20d bcs.n 8002ff2 <core::fmt::float::float_to_decimal_common_exact+0x7be> + 8002fd6: 9816 ldr r0, [sp, #88] ; 0x58 + 8002fd8: 9a05 ldr r2, [sp, #20] + 8002fda: 9b08 ldr r3, [sp, #32] + 8002fdc: ebb0 000b subs.w r0, r0, fp + 8002fe0: eb6e 0105 sbc.w r1, lr, r5 + 8002fe4: 1a12 subs r2, r2, r0 + 8002fe6: 418b sbcs r3, r1 + 8002fe8: 1a80 subs r0, r0, r2 + 8002fea: eb71 0003 sbcs.w r0, r1, r3 + 8002fee: f080 84b0 bcs.w 8003952 <core::fmt::float::float_to_decimal_common_exact+0x111e> + 8002ff2: f8dd b028 ldr.w fp, [sp, #40] ; 0x28 + +/// The exact and fixed mode implementation for Dragon. +pub fn format_exact(d: &Decoded, buf: &mut [u8], limit: i16) -> (/*#digits*/ usize, /*exp*/ i16) { + assert!(d.mant > 0); + assert!(d.minus > 0); + assert!(d.plus > 0); + 8002ff6: 9804 ldr r0, [sp, #16] + 8002ff8: f8dd 9018 ldr.w r9, [sp, #24] + 8002ffc: ea50 000b orrs.w r0, r0, fp + 8003000: f000 852f beq.w 8003a62 <core::fmt::float::float_to_decimal_common_exact+0x122e> + let (a, b) = $add_with_overflow(self as $ActualT, + 8003004: 9804 ldr r0, [sp, #16] + 8003006: eb1a 0100 adds.w r1, sl, r0 + 800300a: f04f 0000 mov.w r0, #0 + 800300e: eb46 020b adc.w r2, r6, fp + 8003012: ebb1 010a subs.w r1, r1, sl + 8003016: eb72 0106 sbcs.w r1, r2, r6 + 800301a: f04f 0100 mov.w r1, #0 + 800301e: bf38 it cc + 8003020: 2101 movcc r1, #1 + if b {None} else {Some(a)} + 8003022: 2900 cmp r1, #0 + 8003024: f040 84f6 bne.w 8003a14 <core::fmt::float::float_to_decimal_common_exact+0x11e0> + let (a, b) = $sub_with_overflow(self as $ActualT, + 8003028: f1ba 0101 subs.w r1, sl, #1 + 800302c: 464c mov r4, r9 + 800302e: f166 0200 sbc.w r2, r6, #0 + 8003032: ebba 0101 subs.w r1, sl, r1 + 8003036: eb76 0102 sbcs.w r1, r6, r2 + 800303a: bf38 it cc + 800303c: 2001 movcc r0, #1 + if b {None} else {Some(a)} + 800303e: 2800 cmp r0, #0 + 8003040: f040 84ee bne.w 8003a20 <core::fmt::float::float_to_decimal_common_exact+0x11ec> + 8003044: f1a7 05c4 sub.w r5, r7, #196 ; 0xc4 + let mut base = [0; $n]; + 8003048: 21a0 movs r1, #160 ; 0xa0 + 800304a: 4628 mov r0, r5 + 800304c: f000 fd92 bl 8003b74 <__aeabi_memclr4> + let nbits = 64 - (mant - 1).leading_zeros() as i64; + 8003050: f1ba 0001 subs.w r0, sl, #1 + unsafe { $ctlz(self as $ActualT) as u32 } + 8003054: fab0 f080 clz r0, r0 + 8003058: f176 0100 sbcs.w r1, r6, #0 + 800305c: f100 0020 add.w r0, r0, #32 + 8003060: bf18 it ne + 8003062: fab1 f081 clzne r0, r1 + (((nbits + exp as i64) * 1292913986) >> 32) as i16 + 8003066: f644 5142 movw r1, #19778 ; 0x4d42 + let nbits = 64 - (mant - 1).leading_zeros() as i64; + 800306a: f1c0 0040 rsb r0, r0, #64 ; 0x40 + (((nbits + exp as i64) * 1292913986) >> 32) as i16 + 800306e: f6c4 5110 movt r1, #19728 ; 0x4d10 + 8003072: fa00 f084 sxtah r0, r0, r4 + 8003076: fb50 f001 smmul r0, r0, r1 + 800307a: b201 sxth r1, r0 + 800307c: 2000 movs r0, #0 + base[sz] = v as $ty; + 800307e: 2827 cmp r0, #39 ; 0x27 + 8003080: f200 8491 bhi.w 80039a6 <core::fmt::float::float_to_decimal_common_exact+0x1172> + 8003084: f845 a020 str.w sl, [r5, r0, lsl #2] + sz += 1; + 8003088: 3001 adds r0, #1 + while v > 0 { + 800308a: 2e00 cmp r6, #0 + 800308c: 46b2 mov sl, r6 + 800308e: f04f 0600 mov.w r6, #0 + 8003092: d1f4 bne.n 800307e <core::fmt::float::float_to_decimal_common_exact+0x84a> + $name { size: sz, base: base } + 8003094: f8cd 045c str.w r0, [sp, #1116] ; 0x45c + 8003098: f20d 405c addw r0, sp, #1116 ; 0x45c + 800309c: f1a7 08c4 sub.w r8, r7, #196 ; 0xc4 + 80030a0: 468a mov sl, r1 + 80030a2: 22a0 movs r2, #160 ; 0xa0 + 80030a4: f100 0904 add.w r9, r0, #4 + 80030a8: 4641 mov r1, r8 + 80030aa: 4648 mov r0, r9 + 80030ac: f000 fd1a bl 8003ae4 <__aeabi_memcpy4> + $name { size: 1, base: base } + 80030b0: 2001 movs r0, #1 + 80030b2: 219c movs r1, #156 ; 0x9c + 80030b4: f8cd 0500 str.w r0, [sp, #1280] ; 0x500 + 80030b8: f8cd 0504 str.w r0, [sp, #1284] ; 0x504 + 80030bc: f50d 60a0 add.w r0, sp, #1280 ; 0x500 + 80030c0: 3008 adds r0, #8 + 80030c2: f000 fd57 bl 8003b74 <__aeabi_memclr4> + 80030c6: 9901 ldr r1, [sp, #4] + let mut k = estimate_scaling_factor(d.mant, d.exp); + + // `v = mant / scale`. + let mut mant = Big::from_u64(d.mant); + let mut scale = Big::from_small(1); + if d.exp < 0 { + 80030c8: f1b1 3fff cmp.w r1, #4294967295 ; 0xffffffff + 80030cc: dd02 ble.n 80030d4 <core::fmt::float::float_to_decimal_common_exact+0x8a0> + 80030ce: f20d 405c addw r0, sp, #1116 ; 0x45c + 80030d2: e003 b.n 80030dc <core::fmt::float::float_to_decimal_common_exact+0x8a8> + scale.mul_pow2(-d.exp as usize); + 80030d4: 4260 negs r0, r4 + 80030d6: b201 sxth r1, r0 + 80030d8: f50d 60a0 add.w r0, sp, #1280 ; 0x500 + 80030dc: f7fd fd0d bl 8000afa <core::num::bignum::Big32x40::mul_pow2> + 80030e0: f50d 60a0 add.w r0, sp, #1280 ; 0x500 + 80030e4: f04f 32ff mov.w r2, #4294967295 ; 0xffffffff + 80030e8: 4651 mov r1, sl + 80030ea: f100 0b04 add.w fp, r0, #4 + } else { + mant.mul_pow2(d.exp as usize); + } + + // divide `mant` by `10^k`. now `scale / 10 < mant <= scale * 10`. + if k >= 0 { + 80030ee: 4291 cmp r1, r2 + 80030f0: dd02 ble.n 80030f8 <core::fmt::float::float_to_decimal_common_exact+0x8c4> + 80030f2: f50d 60a0 add.w r0, sp, #1280 ; 0x500 + 80030f6: e003 b.n 8003100 <core::fmt::float::float_to_decimal_common_exact+0x8cc> + mul_pow10(&mut scale, k as usize); + } else { + mul_pow10(&mut mant, -k as usize); + 80030f8: 4248 negs r0, r1 + 80030fa: b201 sxth r1, r0 + 80030fc: f20d 405c addw r0, sp, #1116 ; 0x45c + 8003100: f7fd f982 bl 8000408 <core::num::flt2dec::strategy::dragon::mul_pow10> + $name { size: self.size, base: self.base } + 8003104: f8dd 5500 ldr.w r5, [sp, #1280] ; 0x500 + 8003108: f108 0004 add.w r0, r8, #4 + 800310c: 4659 mov r1, fp + 800310e: 22a0 movs r2, #160 ; 0xa0 + 8003110: 9016 str r0, [sp, #88] ; 0x58 + 8003112: f847 5cc4 str.w r5, [r7, #-196] + 8003116: f000 fce5 bl 8003ae4 <__aeabi_memcpy4> + } else if self.end > slice.len() { + 800311a: 2d28 cmp r5, #40 ; 0x28 + 800311c: d81e bhi.n 800315c <core::fmt::float::float_to_decimal_common_exact+0x928> + 800311e: e9dd 6c15 ldrd r6, ip, [sp, #84] ; 0x54 + 8003122: f64c 2400 movw r4, #51712 ; 0xca00 + 8003126: f6c3 349a movt r4, #15258 ; 0x3b9a + 800312a: b18d cbz r5, 8003150 <core::fmt::float::float_to_decimal_common_exact+0x91c> + if self.end == self.ptr { + 800312c: 00ad lsls r5, r5, #2 + 800312e: 2200 movs r2, #0 + let lhs = ((borrow as $bigty) << nbits) | (self as $bigty); + 8003130: f858 0005 ldr.w r0, [r8, r5] + ((lhs / rhs) as $ty, (lhs % rhs) as $ty) + 8003134: 4611 mov r1, r2 + 8003136: 4622 mov r2, r4 + 8003138: 2300 movs r3, #0 + 800313a: f000 fcbf bl 8003abc <__aeabi_uldivmod> + *a = q; + 800313e: f848 0005 str.w r0, [r8, r5] + 8003142: 3d04 subs r5, #4 + 8003144: d1f4 bne.n 8003130 <core::fmt::float::float_to_decimal_common_exact+0x8fc> + 8003146: f857 5cc4 ldr.w r5, [r7, #-196] + 800314a: f8dd c058 ldr.w ip, [sp, #88] ; 0x58 + 800314e: e000 b.n 8003152 <core::fmt::float::float_to_decimal_common_exact+0x91e> + 8003150: 2500 movs r5, #0 + n -= largest; + 8003152: 3e09 subs r6, #9 + while n > largest { + 8003154: 2e0a cmp r6, #10 + 8003156: d305 bcc.n 8003164 <core::fmt::float::float_to_decimal_common_exact+0x930> + } else if self.end > slice.len() { + 8003158: 2d28 cmp r5, #40 ; 0x28 + 800315a: d9e6 bls.n 800312a <core::fmt::float::float_to_decimal_common_exact+0x8f6> + 800315c: 4628 mov r0, r5 + 800315e: 2128 movs r1, #40 ; 0x28 + 8003160: f7fd f9ed bl 800053e <core::slice::slice_index_len_fail> + 8003164: 2d29 cmp r5, #41 ; 0x29 + 8003166: d2f9 bcs.n 800315c <core::fmt::float::float_to_decimal_common_exact+0x928> + 8003168: b1bd cbz r5, 800319a <core::fmt::float::float_to_decimal_common_exact+0x966> + x.div_rem_small(TWOPOW10[n]); + 800316a: f244 7094 movw r0, #18324 ; 0x4794 + if self.end == self.ptr { + 800316e: 00ad lsls r5, r5, #2 + 8003170: 2200 movs r2, #0 + 8003172: f6c0 0000 movt r0, #2048 ; 0x800 + 8003176: f850 4026 ldr.w r4, [r0, r6, lsl #2] + let lhs = ((borrow as $bigty) << nbits) | (self as $bigty); + 800317a: f858 0005 ldr.w r0, [r8, r5] + ((lhs / rhs) as $ty, (lhs % rhs) as $ty) + 800317e: 4611 mov r1, r2 + 8003180: 4622 mov r2, r4 + 8003182: 2300 movs r3, #0 + 8003184: f000 fc9a bl 8003abc <__aeabi_uldivmod> + *a = q; + 8003188: f848 0005 str.w r0, [r8, r5] + 800318c: 3d04 subs r5, #4 + 800318e: d1f4 bne.n 800317a <core::fmt::float::float_to_decimal_common_exact+0x946> + 8003190: f857 1cc4 ldr.w r1, [r7, #-196] + 8003194: f8dd c058 ldr.w ip, [sp, #88] ; 0x58 + 8003198: e000 b.n 800319c <core::fmt::float::float_to_decimal_common_exact+0x968> + 800319a: 2100 movs r1, #0 + let mut sz = cmp::max(self.size, other.size); + 800319c: f8dd 045c ldr.w r0, [sp, #1116] ; 0x45c + 80031a0: f20d 455c addw r5, sp, #1116 ; 0x45c + 80031a4: 4288 cmp r0, r1 + 80031a6: bf28 it cs + 80031a8: 4601 movcs r1, r0 + } else if self.end > slice.len() { + 80031aa: 2929 cmp r1, #41 ; 0x29 + 80031ac: f080 8407 bcs.w 80039be <core::fmt::float::float_to_decimal_common_exact+0x118a> + 80031b0: 2203 movs r2, #3 + 80031b2: ea42 0381 orr.w r3, r2, r1, lsl #2 + Some(diff / size as isize) + 80031b6: f341 021d sbfx r2, r1, #0, #30 + 80031ba: 2b07 cmp r3, #7 + 80031bc: d32a bcc.n 8003214 <core::fmt::float::float_to_decimal_common_exact+0x9e0> + 80031be: 2600 movs r6, #0 + 80031c0: 2300 movs r3, #0 + let (c, v) = (*a).full_add(*b, carry); + 80031c2: f859 5023 ldr.w r5, [r9, r3, lsl #2] + 80031c6: f85c 4023 ldr.w r4, [ip, r3, lsl #2] + intrinsics::add_with_overflow(v, if carry {1} else {0}) + 80031ca: f006 0601 and.w r6, r6, #1 + let (v, carry1) = unsafe { intrinsics::add_with_overflow(self, other) }; + 80031ce: 4425 add r5, r4 + intrinsics::add_with_overflow(v, if carry {1} else {0}) + 80031d0: 442e add r6, r5 + *a = v; + 80031d2: f84c 6023 str.w r6, [ip, r3, lsl #2] + intrinsics::add_with_overflow(v, if carry {1} else {0}) + 80031d6: 42ae cmp r6, r5 + 80031d8: f04f 0601 mov.w r6, #1 + self.index += 1; + 80031dc: f103 0301 add.w r3, r3, #1 + 80031e0: bf28 it cs + 80031e2: 2600 movcs r6, #0 + let (v, carry1) = unsafe { intrinsics::add_with_overflow(self, other) }; + 80031e4: 42a5 cmp r5, r4 + 80031e6: f04f 0501 mov.w r5, #1 + 80031ea: bf28 it cs + 80031ec: 2500 movcs r5, #0 + if self.index < self.len { + 80031ee: 4293 cmp r3, r2 + (carry1 || carry2, v) + 80031f0: ea46 0605 orr.w r6, r6, r5 + 80031f4: d3e5 bcc.n 80031c2 <core::fmt::float::float_to_decimal_common_exact+0x98e> + if carry { + 80031f6: 2e01 cmp r6, #1 + 80031f8: d10a bne.n 8003210 <core::fmt::float::float_to_decimal_common_exact+0x9dc> + self.base[sz] = 1; + 80031fa: 2927 cmp r1, #39 ; 0x27 + 80031fc: f20d 455c addw r5, sp, #1116 ; 0x45c + 8003200: f200 843f bhi.w 8003a82 <core::fmt::float::float_to_decimal_common_exact+0x124e> + 8003204: eb08 0281 add.w r2, r8, r1, lsl #2 + 8003208: 2301 movs r3, #1 + sz += 1; + 800320a: 3101 adds r1, #1 + self.base[sz] = 1; + 800320c: 6053 str r3, [r2, #4] + 800320e: e001 b.n 8003214 <core::fmt::float::float_to_decimal_common_exact+0x9e0> + 8003210: f20d 455c addw r5, sp, #1116 ; 0x45c + let sz = max(self.size, other.size); + 8003214: f8dd e500 ldr.w lr, [sp, #1280] ; 0x500 + self.size = sz; + 8003218: f847 1cc4 str.w r1, [r7, #-196] + 800321c: 458e cmp lr, r1 + 800321e: bf28 it cs + 8003220: 4671 movcs r1, lr + } else if self.end > slice.len() { + 8003222: 2929 cmp r1, #41 ; 0x29 + 8003224: f080 83cb bcs.w 80039be <core::fmt::float::float_to_decimal_common_exact+0x118a> + loop { + 8003228: 0089 lsls r1, r1, #2 + if self.end == self.ptr { + 800322a: 2900 cmp r1, #0 + 800322c: d00a beq.n 8003244 <core::fmt::float::float_to_decimal_common_exact+0xa10> + 800322e: d02f beq.n 8003290 <core::fmt::float::float_to_decimal_common_exact+0xa5c> + 8003230: f50d 62a0 add.w r2, sp, #1280 ; 0x500 + 8003234: f858 3001 ldr.w r3, [r8, r1] + 8003238: 5856 ldr r6, [r2, r1] + Ordering::Equal => (), + 800323a: 3904 subs r1, #4 + 800323c: 42b3 cmp r3, r6 + 800323e: d0f4 beq.n 800322a <core::fmt::float::float_to_decimal_common_exact+0x9f6> + 8003240: d301 bcc.n 8003246 <core::fmt::float::float_to_decimal_common_exact+0xa12> + 8003242: e025 b.n 8003290 <core::fmt::float::float_to_decimal_common_exact+0xa5c> + 8003244: d024 beq.n 8003290 <core::fmt::float::float_to_decimal_common_exact+0xa5c> + } else if self.end > slice.len() { + 8003246: 2829 cmp r0, #41 ; 0x29 + 8003248: 4651 mov r1, sl + 800324a: f080 8410 bcs.w 8003a6e <core::fmt::float::float_to_decimal_common_exact+0x123a> + 800324e: 2400 movs r4, #0 + 8003250: b310 cbz r0, 8003298 <core::fmt::float::float_to_decimal_common_exact+0xa64> + intrinsics::offset(self, count) as *mut T + 8003252: eb05 0180 add.w r1, r5, r0, lsl #2 + if self.ptr == self.end { + 8003256: 0086 lsls r6, r0, #2 + 8003258: 250a movs r5, #10 + 800325a: f101 0c04 add.w ip, r1, #4 + 800325e: 4649 mov r1, r9 + let v = (self as $bigty) * (other as $bigty) + (carry as $bigty); + 8003260: 680a ldr r2, [r1, #0] + 8003262: 2300 movs r3, #0 + 8003264: 3e04 subs r6, #4 + 8003266: fbe2 4305 umlal r4, r3, r2, r5 + *a = v; + 800326a: f841 4b04 str.w r4, [r1], #4 + 800326e: 461c mov r4, r3 + 8003270: d1f6 bne.n 8003260 <core::fmt::float::float_to_decimal_common_exact+0xa2c> + if carry > 0 { + 8003272: 2b00 cmp r3, #0 + 8003274: 4651 mov r1, sl + 8003276: d012 beq.n 800329e <core::fmt::float::float_to_decimal_common_exact+0xa6a> + 8003278: 9c0b ldr r4, [sp, #44] ; 0x2c + self.base[sz] = carry; + 800327a: 2827 cmp r0, #39 ; 0x27 + 800327c: f20d 455c addw r5, sp, #1116 ; 0x45c + 8003280: f200 8403 bhi.w 8003a8a <core::fmt::float::float_to_decimal_common_exact+0x1256> + 8003284: f8cc 3000 str.w r3, [ip] + 8003288: f8dd c058 ldr.w ip, [sp, #88] ; 0x58 + sz += 1; + 800328c: 3001 adds r0, #1 + 800328e: e00b b.n 80032a8 <core::fmt::float::float_to_decimal_common_exact+0xa74> + 8003290: 9c0b ldr r4, [sp, #44] ; 0x2c + 8003292: 4651 mov r1, sl + // in order to keep the fixed-size bignum, we actually use `mant + floor(plus) >= scale`. + // we are not actually modifying `scale`, since we can skip the initial multiplication instead. + // again with the shortest algorithm, `d[0]` can be zero but will be eventually rounded up. + if *div_2pow10(&mut scale.clone(), buf.len()).add(&mant) >= scale { + // equivalent to scaling `scale` by 10 + k += 1; + 8003294: 3101 adds r1, #1 + 8003296: e009 b.n 80032ac <core::fmt::float::float_to_decimal_common_exact+0xa78> + 8003298: 9c0b ldr r4, [sp, #44] ; 0x2c + 800329a: 2000 movs r0, #0 + 800329c: e004 b.n 80032a8 <core::fmt::float::float_to_decimal_common_exact+0xa74> + 800329e: f8dd c058 ldr.w ip, [sp, #88] ; 0x58 + 80032a2: 9c0b ldr r4, [sp, #44] ; 0x2c + 80032a4: f20d 455c addw r5, sp, #1116 ; 0x45c + self.size = sz; + 80032a8: f8cd 045c str.w r0, [sp, #1116] ; 0x45c + 80032ac: 460a mov r2, r1 + } + + // if we are working with the last-digit limitation, we need to shorten the buffer + // before the actual rendering in order to avoid double rounding. + // note that we have to enlarge the buffer again when rounding up happens! + let mut len = if k < limit { + 80032ae: b211 sxth r1, r2 + 80032b0: 9209 str r2, [sp, #36] ; 0x24 + 80032b2: 42a1 cmp r1, r4 + 80032b4: da03 bge.n 80032be <core::fmt::float::float_to_decimal_common_exact+0xa8a> + 80032b6: 2101 movs r1, #1 + 80032b8: 2400 movs r4, #0 + 80032ba: 9113 str r1, [sp, #76] ; 0x4c + 80032bc: e20d b.n 80036da <core::fmt::float::float_to_decimal_common_exact+0xea6> + 80032be: 9b15 ldr r3, [sp, #84] ; 0x54 + // oops, we cannot even produce *one* digit. + // this is possible when, say, we've got something like 9.5 and it's being rounded to 10. + // we return an empty buffer, with an exception of the later rounding-up case + // which occurs when `k == limit` and has to produce exactly one digit. + 0 + } else if ((k as i32 - limit as i32) as usize) < buf.len() { + 80032c0: 1b09 subs r1, r1, r4 + (k - limit) as usize + 80032c2: 1b12 subs r2, r2, r4 + 80032c4: 2400 movs r4, #0 + } else if ((k as i32 - limit as i32) as usize) < buf.len() { + 80032c6: 4299 cmp r1, r3 + 80032c8: f04f 0101 mov.w r1, #1 + 80032cc: bf38 it cc + 80032ce: b213 sxthcc r3, r2 + } else { + buf.len() + }; + + if len > 0 { + 80032d0: 2b00 cmp r3, #0 + 80032d2: e9cd 1313 strd r1, r3, [sp, #76] ; 0x4c + 80032d6: f000 8200 beq.w 80036da <core::fmt::float::float_to_decimal_common_exact+0xea6> + 80032da: f20d 56a4 addw r6, sp, #1444 ; 0x5a4 + $name { size: self.size, base: self.base } + 80032de: 4659 mov r1, fp + 80032e0: 22a0 movs r2, #160 ; 0xa0 + 80032e2: f8cd e5a4 str.w lr, [sp, #1444] ; 0x5a4 + 80032e6: 4664 mov r4, ip + 80032e8: 1d30 adds r0, r6, #4 + 80032ea: 9010 str r0, [sp, #64] ; 0x40 + 80032ec: f000 fbfa bl 8003ae4 <__aeabi_memcpy4> + // cache `(2, 4, 8) * scale` for digit generation. + // (this can be expensive, so do not calculate them when the buffer is empty.) + let mut scale2 = scale.clone(); scale2.mul_pow2(1); + 80032f0: 4630 mov r0, r6 + 80032f2: 2101 movs r1, #1 + 80032f4: f7fd fc01 bl 8000afa <core::num::bignum::Big32x40::mul_pow2> + 80032f8: f8dd 0500 ldr.w r0, [sp, #1280] ; 0x500 + 80032fc: f50d 66c9 add.w r6, sp, #1608 ; 0x648 + 8003300: 4659 mov r1, fp + 8003302: 22a0 movs r2, #160 ; 0xa0 + 8003304: f8cd 0648 str.w r0, [sp, #1608] ; 0x648 + 8003308: 1d30 adds r0, r6, #4 + 800330a: 900e str r0, [sp, #56] ; 0x38 + 800330c: f000 fbea bl 8003ae4 <__aeabi_memcpy4> + let mut scale4 = scale.clone(); scale4.mul_pow2(2); + 8003310: 4630 mov r0, r6 + 8003312: 2102 movs r1, #2 + 8003314: f7fd fbf1 bl 8000afa <core::num::bignum::Big32x40::mul_pow2> + 8003318: f8dd 0500 ldr.w r0, [sp, #1280] ; 0x500 + 800331c: 4659 mov r1, fp + 800331e: 22a0 movs r2, #160 ; 0xa0 + 8003320: f847 0cc4 str.w r0, [r7, #-196] + 8003324: 4620 mov r0, r4 + 8003326: f000 fbdd bl 8003ae4 <__aeabi_memcpy4> + let mut scale8 = scale.clone(); scale8.mul_pow2(3); + 800332a: 4640 mov r0, r8 + 800332c: 2103 movs r1, #3 + 800332e: f7fd fbe4 bl 8000afa <core::num::bignum::Big32x40::mul_pow2> + 8003332: f105 0008 add.w r0, r5, #8 + 8003336: f1a7 041e sub.w r4, r7, #30 + 800333a: 2100 movs r1, #0 + 800333c: 9011 str r0, [sp, #68] ; 0x44 + 800333e: f8dd 045c ldr.w r0, [sp, #1116] ; 0x45c + } else if self.end > slice.len() { + 8003342: 2829 cmp r0, #41 ; 0x29 + 8003344: f080 833f bcs.w 80039c6 <core::fmt::float::float_to_decimal_common_exact+0x1192> + 8003348: 9113 str r1, [sp, #76] ; 0x4c + 800334a: 3101 adds r1, #1 + 800334c: f8dd c058 ldr.w ip, [sp, #88] ; 0x58 + intrinsics::offset(self, count) + 8003350: 0082 lsls r2, r0, #2 + 8003352: f04f 0e01 mov.w lr, #1 + 8003356: 9112 str r1, [sp, #72] ; 0x48 + 8003358: eb05 0180 add.w r1, r5, r0, lsl #2 + while ptrdistance(self.ptr, self.end) >= 4 { + 800335c: 9d11 ldr r5, [sp, #68] ; 0x44 + 800335e: 1d0b adds r3, r1, #4 +// Copyright 2012-2017 The Rust Project Developers. See the COPYRIGHT + 8003360: 1f2e subs r6, r5, #4 + 8003362: 46a2 mov sl, r4 + intrinsics::overflowing_sub(self, rhs) + 8003364: 1b99 subs r1, r3, r6 + Some(diff / size as isize) + 8003366: 17cc asrs r4, r1, #31 + 8003368: eb01 7194 add.w r1, r1, r4, lsr #30 + 800336c: 1089 asrs r1, r1, #2 + while ptrdistance(self.ptr, self.end) >= 4 { + 800336e: 2903 cmp r1, #3 + 8003370: f240 818e bls.w 8003690 <core::fmt::float::float_to_decimal_common_exact+0xe5c> + 8003374: f855 1c04 ldr.w r1, [r5, #-4] + 8003378: 4654 mov r4, sl + 800337a: 2600 movs r6, #0 + if predicate(elt) { + 800337c: 2900 cmp r1, #0 + SearchWhile::Done(false) + 800337e: bf1a itte ne + 8003380: f807 ec1d strbne.w lr, [r7, #-29] + 8003384: 4621 movne r1, r4 + 8003386: f1a7 011d subeq.w r1, r7, #29 + 800338a: 700e strb r6, [r1, #0] + }) + 800338c: f817 1c1d ldrb.w r1, [r7, #-29] + 8003390: bb31 cbnz r1, 80033e0 <core::fmt::float::float_to_decimal_common_exact+0xbac> + 8003392: 6829 ldr r1, [r5, #0] + if predicate(elt) { + 8003394: 2900 cmp r1, #0 + SearchWhile::Done(false) + 8003396: bf1a itte ne + 8003398: f807 ec1d strbne.w lr, [r7, #-29] + 800339c: 4621 movne r1, r4 + 800339e: f1a7 011d subeq.w r1, r7, #29 + 80033a2: 700e strb r6, [r1, #0] + }) + 80033a4: f817 1c1d ldrb.w r1, [r7, #-29] + 80033a8: b9d1 cbnz r1, 80033e0 <core::fmt::float::float_to_decimal_common_exact+0xbac> + 80033aa: 6869 ldr r1, [r5, #4] + if predicate(elt) { + 80033ac: 2900 cmp r1, #0 + SearchWhile::Done(false) + 80033ae: bf1a itte ne + 80033b0: f807 ec1d strbne.w lr, [r7, #-29] + 80033b4: 4621 movne r1, r4 + 80033b6: f1a7 011d subeq.w r1, r7, #29 + 80033ba: 700e strb r6, [r1, #0] + }) + 80033bc: f817 1c1d ldrb.w r1, [r7, #-29] + 80033c0: b971 cbnz r1, 80033e0 <core::fmt::float::float_to_decimal_common_exact+0xbac> + 80033c2: 68a9 ldr r1, [r5, #8] + search_while!(g($mkref!(self.ptr.post_inc()))); + 80033c4: 3a10 subs r2, #16 + 80033c6: 3510 adds r5, #16 + if predicate(elt) { + 80033c8: 2900 cmp r1, #0 + SearchWhile::Done(false) + 80033ca: bf1a itte ne + 80033cc: f807 ec1d strbne.w lr, [r7, #-29] + 80033d0: 4621 movne r1, r4 + 80033d2: f1a7 011d subeq.w r1, r7, #29 + 80033d6: 700e strb r6, [r1, #0] + }) + 80033d8: f817 1c1d ldrb.w r1, [r7, #-29] + search_while!(g($mkref!(self.ptr.post_inc()))); + 80033dc: 2900 cmp r1, #0 + 80033de: d0bf beq.n 8003360 <core::fmt::float::float_to_decimal_common_exact+0xb2c> + 80033e0: f817 2c1e ldrb.w r2, [r7, #-30] + 80033e4: f20d 455c addw r5, sp, #1116 ; 0x45c + 80033e8: ea41 2202 orr.w r2, r1, r2, lsl #8 + 80033ec: 05d1 lsls r1, r2, #23 + 80033ee: f100 819e bmi.w 800372e <core::fmt::float::float_to_decimal_common_exact+0xefa> + let sz = max(self.size, other.size); + 80033f2: f857 2cc4 ldr.w r2, [r7, #-196] + 80033f6: 4282 cmp r2, r0 + 80033f8: bf38 it cc + 80033fa: 4602 movcc r2, r0 + } else if self.end > slice.len() { + 80033fc: 2a29 cmp r2, #41 ; 0x29 + 80033fe: f080 82e5 bcs.w 80039cc <core::fmt::float::float_to_decimal_common_exact+0x1198> + 8003402: f20d 54a4 addw r4, sp, #1444 ; 0x5a4 + loop { + 8003406: 0091 lsls r1, r2, #2 + 8003408: 46a6 mov lr, r4 + 800340a: 9c10 ldr r4, [sp, #64] ; 0x40 + if self.end == self.ptr { + 800340c: 2900 cmp r1, #0 + 800340e: d008 beq.n 8003422 <core::fmt::float::float_to_decimal_common_exact+0xbee> + 8003410: d00c beq.n 800342c <core::fmt::float::float_to_decimal_common_exact+0xbf8> + 8003412: 586b ldr r3, [r5, r1] + 8003414: f858 6001 ldr.w r6, [r8, r1] + Ordering::Equal => (), + 8003418: 3904 subs r1, #4 + 800341a: 42b3 cmp r3, r6 + 800341c: d0f6 beq.n 800340c <core::fmt::float::float_to_decimal_common_exact+0xbd8> + 800341e: d301 bcc.n 8003424 <core::fmt::float::float_to_decimal_common_exact+0xbf0> + 8003420: e004 b.n 800342c <core::fmt::float::float_to_decimal_common_exact+0xbf8> + 8003422: d003 beq.n 800342c <core::fmt::float::float_to_decimal_common_exact+0xbf8> + 8003424: f04f 0c00 mov.w ip, #0 + 8003428: 4602 mov r2, r0 + 800342a: e02c b.n 8003486 <core::fmt::float::float_to_decimal_common_exact+0xc52> + 800342c: 2003 movs r0, #3 + 800342e: ea40 0182 orr.w r1, r0, r2, lsl #2 + 8003432: f342 001d sbfx r0, r2, #0, #30 + 8003436: 2907 cmp r1, #7 + 8003438: d321 bcc.n 800347e <core::fmt::float::float_to_decimal_common_exact+0xc4a> + 800343a: 2300 movs r3, #0 + 800343c: 2601 movs r6, #1 + let (c, v) = (*a).full_add(!*b, noborrow); + 800343e: f85c 5023 ldr.w r5, [ip, r3, lsl #2] + 8003442: f859 1023 ldr.w r1, [r9, r3, lsl #2] + intrinsics::add_with_overflow(v, if carry {1} else {0}) + 8003446: f006 0601 and.w r6, r6, #1 + let (c, v) = (*a).full_add(!*b, noborrow); + 800344a: 43ed mvns r5, r5 + let (v, carry1) = unsafe { intrinsics::add_with_overflow(self, other) }; + 800344c: 440d add r5, r1 + intrinsics::add_with_overflow(v, if carry {1} else {0}) + 800344e: 442e add r6, r5 + *a = v; + 8003450: f849 6023 str.w r6, [r9, r3, lsl #2] + intrinsics::add_with_overflow(v, if carry {1} else {0}) + 8003454: 42ae cmp r6, r5 + 8003456: f04f 0601 mov.w r6, #1 + self.index += 1; + 800345a: f103 0301 add.w r3, r3, #1 + 800345e: bf28 it cs + 8003460: 2600 movcs r6, #0 + let (v, carry1) = unsafe { intrinsics::add_with_overflow(self, other) }; + 8003462: 428d cmp r5, r1 + 8003464: f04f 0101 mov.w r1, #1 + 8003468: bf28 it cs + 800346a: 2100 movcs r1, #0 + if self.index < self.len { + 800346c: 4283 cmp r3, r0 + (carry1 || carry2, v) + 800346e: ea46 0601 orr.w r6, r6, r1 + 8003472: d3e4 bcc.n 800343e <core::fmt::float::float_to_decimal_common_exact+0xc0a> + assert!(noborrow); + 8003474: 2e00 cmp r6, #0 + 8003476: f20d 455c addw r5, sp, #1116 ; 0x45c + 800347a: f000 829a beq.w 80039b2 <core::fmt::float::float_to_decimal_common_exact+0x117e> + 800347e: f04f 0c08 mov.w ip, #8 + self.size = sz; + 8003482: f8cd 245c str.w r2, [sp, #1116] ; 0x45c + let sz = max(self.size, other.size); + 8003486: f8dd 0648 ldr.w r0, [sp, #1608] ; 0x648 + 800348a: 4290 cmp r0, r2 + 800348c: bf38 it cc + 800348e: 4610 movcc r0, r2 + } else if self.end > slice.len() { + 8003490: 2829 cmp r0, #41 ; 0x29 + 8003492: f080 829c bcs.w 80039ce <core::fmt::float::float_to_decimal_common_exact+0x119a> + loop { + 8003496: 0081 lsls r1, r0, #2 + if self.end == self.ptr { + 8003498: 2900 cmp r1, #0 + 800349a: d00a beq.n 80034b2 <core::fmt::float::float_to_decimal_common_exact+0xc7e> + 800349c: d00c beq.n 80034b8 <core::fmt::float::float_to_decimal_common_exact+0xc84> + 800349e: f50d 66c9 add.w r6, sp, #1608 ; 0x648 + 80034a2: 586b ldr r3, [r5, r1] + 80034a4: 5876 ldr r6, [r6, r1] + Ordering::Equal => (), + 80034a6: 3904 subs r1, #4 + 80034a8: 42b3 cmp r3, r6 + 80034aa: d0f5 beq.n 8003498 <core::fmt::float::float_to_decimal_common_exact+0xc64> + 80034ac: d204 bcs.n 80034b8 <core::fmt::float::float_to_decimal_common_exact+0xc84> + let sz = cmp::max(self.size, other.size); + 80034ae: 4610 mov r0, r2 + 80034b0: e035 b.n 800351e <core::fmt::float::float_to_decimal_common_exact+0xcea> + 80034b2: d001 beq.n 80034b8 <core::fmt::float::float_to_decimal_common_exact+0xc84> + 80034b4: 4610 mov r0, r2 + 80034b6: e032 b.n 800351e <core::fmt::float::float_to_decimal_common_exact+0xcea> + 80034b8: 2103 movs r1, #3 + 80034ba: f340 021d sbfx r2, r0, #0, #30 + 80034be: ea41 0180 orr.w r1, r1, r0, lsl #2 + 80034c2: 2907 cmp r1, #7 + 80034c4: d327 bcc.n 8003516 <core::fmt::float::float_to_decimal_common_exact+0xce2> + 80034c6: f8cd c03c str.w ip, [sp, #60] ; 0x3c + 80034ca: f8dd c038 ldr.w ip, [sp, #56] ; 0x38 + 80034ce: 2300 movs r3, #0 + 80034d0: 2501 movs r5, #1 + let (c, v) = (*a).full_add(!*b, noborrow); + 80034d2: f85c 6023 ldr.w r6, [ip, r3, lsl #2] + 80034d6: f859 1023 ldr.w r1, [r9, r3, lsl #2] + intrinsics::add_with_overflow(v, if carry {1} else {0}) + 80034da: f005 0501 and.w r5, r5, #1 + let (c, v) = (*a).full_add(!*b, noborrow); + 80034de: 43f6 mvns r6, r6 + let (v, carry1) = unsafe { intrinsics::add_with_overflow(self, other) }; + 80034e0: 440e add r6, r1 + intrinsics::add_with_overflow(v, if carry {1} else {0}) + 80034e2: 4435 add r5, r6 + *a = v; + 80034e4: f849 5023 str.w r5, [r9, r3, lsl #2] + intrinsics::add_with_overflow(v, if carry {1} else {0}) + 80034e8: 42b5 cmp r5, r6 + 80034ea: f04f 0501 mov.w r5, #1 + self.index += 1; + 80034ee: f103 0301 add.w r3, r3, #1 + 80034f2: bf28 it cs + 80034f4: 2500 movcs r5, #0 + let (v, carry1) = unsafe { intrinsics::add_with_overflow(self, other) }; + 80034f6: 428e cmp r6, r1 + 80034f8: f04f 0101 mov.w r1, #1 + 80034fc: bf28 it cs + 80034fe: 2100 movcs r1, #0 + if self.index < self.len { + 8003500: 4293 cmp r3, r2 + (carry1 || carry2, v) + 8003502: ea45 0501 orr.w r5, r5, r1 + 8003506: d3e4 bcc.n 80034d2 <core::fmt::float::float_to_decimal_common_exact+0xc9e> + 8003508: f8dd c03c ldr.w ip, [sp, #60] ; 0x3c + assert!(noborrow); + 800350c: 2d00 cmp r5, #0 + 800350e: f20d 455c addw r5, sp, #1116 ; 0x45c + 8003512: f000 824e beq.w 80039b2 <core::fmt::float::float_to_decimal_common_exact+0x117e> + return (len, k); + } + + let mut d = 0; + if mant >= scale8 { mant.sub(&scale8); d += 8; } + if mant >= scale4 { mant.sub(&scale4); d += 4; } + 8003516: f04c 0c04 orr.w ip, ip, #4 + self.size = sz; + 800351a: f8cd 045c str.w r0, [sp, #1116] ; 0x45c + let sz = max(self.size, other.size); + 800351e: f8dd 35a4 ldr.w r3, [sp, #1444] ; 0x5a4 + 8003522: 4283 cmp r3, r0 + 8003524: bf38 it cc + 8003526: 4603 movcc r3, r0 + } else if self.end > slice.len() { + 8003528: 2b29 cmp r3, #41 ; 0x29 + 800352a: f080 8253 bcs.w 80039d4 <core::fmt::float::float_to_decimal_common_exact+0x11a0> + loop { + 800352e: 0099 lsls r1, r3, #2 + if self.end == self.ptr { + 8003530: 2900 cmp r1, #0 + 8003532: d009 beq.n 8003548 <core::fmt::float::float_to_decimal_common_exact+0xd14> + 8003534: d00b beq.n 800354e <core::fmt::float::float_to_decimal_common_exact+0xd1a> + 8003536: 586a ldr r2, [r5, r1] + 8003538: f85e 6001 ldr.w r6, [lr, r1] + Ordering::Equal => (), + 800353c: 3904 subs r1, #4 + 800353e: 42b2 cmp r2, r6 + 8003540: d0f6 beq.n 8003530 <core::fmt::float::float_to_decimal_common_exact+0xcfc> + 8003542: d204 bcs.n 800354e <core::fmt::float::float_to_decimal_common_exact+0xd1a> + let sz = cmp::max(self.size, other.size); + 8003544: 4603 mov r3, r0 + 8003546: e02f b.n 80035a8 <core::fmt::float::float_to_decimal_common_exact+0xd74> + 8003548: d001 beq.n 800354e <core::fmt::float::float_to_decimal_common_exact+0xd1a> + 800354a: 4603 mov r3, r0 + 800354c: e02c b.n 80035a8 <core::fmt::float::float_to_decimal_common_exact+0xd74> + 800354e: 2003 movs r0, #3 + 8003550: ea40 0183 orr.w r1, r0, r3, lsl #2 + 8003554: f343 001d sbfx r0, r3, #0, #30 + 8003558: 2907 cmp r1, #7 + 800355a: d321 bcc.n 80035a0 <core::fmt::float::float_to_decimal_common_exact+0xd6c> + 800355c: 2200 movs r2, #0 + 800355e: 2501 movs r5, #1 + let (c, v) = (*a).full_add(!*b, noborrow); + 8003560: f854 6022 ldr.w r6, [r4, r2, lsl #2] + 8003564: f859 1022 ldr.w r1, [r9, r2, lsl #2] + intrinsics::add_with_overflow(v, if carry {1} else {0}) + 8003568: f005 0501 and.w r5, r5, #1 + let (c, v) = (*a).full_add(!*b, noborrow); + 800356c: 43f6 mvns r6, r6 + let (v, carry1) = unsafe { intrinsics::add_with_overflow(self, other) }; + 800356e: 440e add r6, r1 + intrinsics::add_with_overflow(v, if carry {1} else {0}) + 8003570: 4435 add r5, r6 + *a = v; + 8003572: f849 5022 str.w r5, [r9, r2, lsl #2] + intrinsics::add_with_overflow(v, if carry {1} else {0}) + 8003576: 42b5 cmp r5, r6 + 8003578: f04f 0501 mov.w r5, #1 + self.index += 1; + 800357c: f102 0201 add.w r2, r2, #1 + 8003580: bf28 it cs + 8003582: 2500 movcs r5, #0 + let (v, carry1) = unsafe { intrinsics::add_with_overflow(self, other) }; + 8003584: 428e cmp r6, r1 + 8003586: f04f 0101 mov.w r1, #1 + 800358a: bf28 it cs + 800358c: 2100 movcs r1, #0 + if self.index < self.len { + 800358e: 4282 cmp r2, r0 + (carry1 || carry2, v) + 8003590: ea45 0501 orr.w r5, r5, r1 + 8003594: d3e4 bcc.n 8003560 <core::fmt::float::float_to_decimal_common_exact+0xd2c> + assert!(noborrow); + 8003596: 2d00 cmp r5, #0 + 8003598: f20d 455c addw r5, sp, #1116 ; 0x45c + 800359c: f000 8209 beq.w 80039b2 <core::fmt::float::float_to_decimal_common_exact+0x117e> + if mant >= scale2 { mant.sub(&scale2); d += 2; } + 80035a0: f10c 0c02 add.w ip, ip, #2 + self.size = sz; + 80035a4: f8cd 345c str.w r3, [sp, #1116] ; 0x45c + let sz = max(self.size, other.size); + 80035a8: f8dd e500 ldr.w lr, [sp, #1280] ; 0x500 + 80035ac: 4618 mov r0, r3 + 80035ae: 459e cmp lr, r3 + 80035b0: bf28 it cs + 80035b2: 4670 movcs r0, lr + } else if self.end > slice.len() { + 80035b4: 2829 cmp r0, #41 ; 0x29 + 80035b6: f080 820e bcs.w 80039d6 <core::fmt::float::float_to_decimal_common_exact+0x11a2> + loop { + 80035ba: 0081 lsls r1, r0, #2 + if self.end == self.ptr { + 80035bc: 2900 cmp r1, #0 + 80035be: d00a beq.n 80035d6 <core::fmt::float::float_to_decimal_common_exact+0xda2> + 80035c0: d00c beq.n 80035dc <core::fmt::float::float_to_decimal_common_exact+0xda8> + 80035c2: f50d 64a0 add.w r4, sp, #1280 ; 0x500 + 80035c6: 586a ldr r2, [r5, r1] + 80035c8: 5864 ldr r4, [r4, r1] + Ordering::Equal => (), + 80035ca: 3904 subs r1, #4 + 80035cc: 42a2 cmp r2, r4 + 80035ce: d0f5 beq.n 80035bc <core::fmt::float::float_to_decimal_common_exact+0xd88> + 80035d0: d204 bcs.n 80035dc <core::fmt::float::float_to_decimal_common_exact+0xda8> + let mut sz = self.size; + 80035d2: 4618 mov r0, r3 + 80035d4: e02f b.n 8003636 <core::fmt::float::float_to_decimal_common_exact+0xe02> + 80035d6: d001 beq.n 80035dc <core::fmt::float::float_to_decimal_common_exact+0xda8> + 80035d8: 4618 mov r0, r3 + 80035da: e02c b.n 8003636 <core::fmt::float::float_to_decimal_common_exact+0xe02> + 80035dc: 2103 movs r1, #3 + 80035de: f340 031d sbfx r3, r0, #0, #30 + 80035e2: ea41 0180 orr.w r1, r1, r0, lsl #2 + 80035e6: 2907 cmp r1, #7 + 80035e8: d321 bcc.n 800362e <core::fmt::float::float_to_decimal_common_exact+0xdfa> + 80035ea: 2500 movs r5, #0 + 80035ec: 2601 movs r6, #1 + let (c, v) = (*a).full_add(!*b, noborrow); + 80035ee: f85b 2025 ldr.w r2, [fp, r5, lsl #2] + 80035f2: f859 1025 ldr.w r1, [r9, r5, lsl #2] + intrinsics::add_with_overflow(v, if carry {1} else {0}) + 80035f6: f006 0401 and.w r4, r6, #1 + let (c, v) = (*a).full_add(!*b, noborrow); + 80035fa: 43d2 mvns r2, r2 + let (v, carry1) = unsafe { intrinsics::add_with_overflow(self, other) }; + 80035fc: 440a add r2, r1 + intrinsics::add_with_overflow(v, if carry {1} else {0}) + 80035fe: 4414 add r4, r2 + *a = v; + 8003600: f849 4025 str.w r4, [r9, r5, lsl #2] + intrinsics::add_with_overflow(v, if carry {1} else {0}) + 8003604: 4294 cmp r4, r2 + 8003606: f04f 0401 mov.w r4, #1 + self.index += 1; + 800360a: f105 0501 add.w r5, r5, #1 + 800360e: bf28 it cs + 8003610: 2400 movcs r4, #0 + let (v, carry1) = unsafe { intrinsics::add_with_overflow(self, other) }; + 8003612: 428a cmp r2, r1 + 8003614: f04f 0101 mov.w r1, #1 + 8003618: bf28 it cs + 800361a: 2100 movcs r1, #0 + if self.index < self.len { + 800361c: 429d cmp r5, r3 + (carry1 || carry2, v) + 800361e: ea41 0604 orr.w r6, r1, r4 + 8003622: d3e4 bcc.n 80035ee <core::fmt::float::float_to_decimal_common_exact+0xdba> + assert!(noborrow); + 8003624: 2e00 cmp r6, #0 + 8003626: f20d 455c addw r5, sp, #1116 ; 0x45c + 800362a: f000 81c2 beq.w 80039b2 <core::fmt::float::float_to_decimal_common_exact+0x117e> + if mant >= scale { mant.sub(&scale); d += 1; } + 800362e: f10c 0c01 add.w ip, ip, #1 + self.size = sz; + 8003632: f8cd 045c str.w r0, [sp, #1116] ; 0x45c + debug_assert!(mant < scale); + debug_assert!(d < 10); + buf[i] = b'0' + d; + 8003636: 9915 ldr r1, [sp, #84] ; 0x54 + 8003638: 9b13 ldr r3, [sp, #76] ; 0x4c + 800363a: 4654 mov r4, sl + 800363c: 428b cmp r3, r1 + 800363e: f080 81cd bcs.w 80039dc <core::fmt::float::float_to_decimal_common_exact+0x11a8> + 8003642: f10c 0130 add.w r1, ip, #48 ; 0x30 + 8003646: aa17 add r2, sp, #92 ; 0x5c + } else if self.end > slice.len() { + 8003648: 2829 cmp r0, #41 ; 0x29 + 800364a: f04f 0a0a mov.w sl, #10 + 800364e: 54d1 strb r1, [r2, r3] + 8003650: f080 81c8 bcs.w 80039e4 <core::fmt::float::float_to_decimal_common_exact+0x11b0> + if self.ptr == self.end { + 8003654: 2800 cmp r0, #0 + 8003656: d019 beq.n 800368c <core::fmt::float::float_to_decimal_common_exact+0xe58> + intrinsics::offset(self, count) as *mut T + 8003658: eb05 0180 add.w r1, r5, r0, lsl #2 +// Copyright 2012-2017 The Rust Project Developers. See the COPYRIGHT + 800365c: 0086 lsls r6, r0, #2 + 800365e: 2500 movs r5, #0 + 8003660: f101 0c04 add.w ip, r1, #4 + 8003664: 4649 mov r1, r9 + let v = (self as $bigty) * (other as $bigty) + (carry as $bigty); + 8003666: 680a ldr r2, [r1, #0] + 8003668: 2300 movs r3, #0 + if self.ptr == self.end { + 800366a: 3e04 subs r6, #4 + 800366c: fbe2 530a umlal r5, r3, r2, sl + *a = v; + 8003670: f841 5b04 str.w r5, [r1], #4 + 8003674: 461d mov r5, r3 + 8003676: d1f6 bne.n 8003666 <core::fmt::float::float_to_decimal_common_exact+0xe32> + 8003678: b313 cbz r3, 80036c0 <core::fmt::float::float_to_decimal_common_exact+0xe8c> + self.base[sz] = carry; + 800367a: 2827 cmp r0, #39 ; 0x27 + 800367c: f20d 455c addw r5, sp, #1116 ; 0x45c + 8003680: f200 81db bhi.w 8003a3a <core::fmt::float::float_to_decimal_common_exact+0x1206> + sz += 1; + 8003684: 3001 adds r0, #1 + self.base[sz] = carry; + 8003686: f8cc 3000 str.w r3, [ip] + 800368a: e01b b.n 80036c4 <core::fmt::float::float_to_decimal_common_exact+0xe90> + 800368c: 2000 movs r0, #0 + 800368e: e019 b.n 80036c4 <core::fmt::float::float_to_decimal_common_exact+0xe90> + 8003690: f20d 455c addw r5, sp, #1116 ; 0x45c + 8003694: 4653 mov r3, sl + while self.ptr != self.end { + 8003696: 2a00 cmp r2, #0 + 8003698: d049 beq.n 800372e <core::fmt::float::float_to_decimal_common_exact+0xefa> + 800369a: f856 1b04 ldr.w r1, [r6], #4 + 800369e: b119 cbz r1, 80036a8 <core::fmt::float::float_to_decimal_common_exact+0xe74> + 80036a0: 4619 mov r1, r3 + SearchWhile::Done(false) + 80036a2: f807 ec1d strb.w lr, [r7, #-29] + 80036a6: e001 b.n 80036ac <core::fmt::float::float_to_decimal_common_exact+0xe78> + 80036a8: f1a7 011d sub.w r1, r7, #29 + 80036ac: 2400 movs r4, #0 + search_while!(g($mkref!(self.ptr.post_inc()))); + 80036ae: 3a04 subs r2, #4 + 80036b0: 700c strb r4, [r1, #0] + }) + 80036b2: f817 1c1d ldrb.w r1, [r7, #-29] + search_while!(g($mkref!(self.ptr.post_inc()))); + 80036b6: 2900 cmp r1, #0 + 80036b8: d0ed beq.n 8003696 <core::fmt::float::float_to_decimal_common_exact+0xe62> + }) + 80036ba: f817 2c1e ldrb.w r2, [r7, #-30] + 80036be: e693 b.n 80033e8 <core::fmt::float::float_to_decimal_common_exact+0xbb4> + 80036c0: f20d 455c addw r5, sp, #1116 ; 0x45c + 80036c4: 9914 ldr r1, [sp, #80] ; 0x50 + 80036c6: 9a12 ldr r2, [sp, #72] ; 0x48 + self.size = sz; + 80036c8: f8cd 045c str.w r0, [sp, #1116] ; 0x45c + 80036cc: 4291 cmp r1, r2 + 80036ce: 4611 mov r1, r2 + 80036d0: f63f ae37 bhi.w 8003342 <core::fmt::float::float_to_decimal_common_exact+0xb0e> + 80036d4: 9c14 ldr r4, [sp, #80] ; 0x50 + 80036d6: 2100 movs r1, #0 + 80036d8: e5ef b.n 80032ba <core::fmt::float::float_to_decimal_common_exact+0xa86> + 80036da: e9dd 8902 ldrd r8, r9, [sp, #8] + } else if self.end > slice.len() { + 80036de: f1be 0f29 cmp.w lr, #41 ; 0x29 + 80036e2: f080 81a3 bcs.w 8003a2c <core::fmt::float::float_to_decimal_common_exact+0x11f8> + 80036e6: 2300 movs r3, #0 + if self.ptr == self.end { + 80036e8: f1be 0f00 cmp.w lr, #0 + 80036ec: d033 beq.n 8003756 <core::fmt::float::float_to_decimal_common_exact+0xf22> + 80036ee: f50d 61a0 add.w r1, sp, #1280 ; 0x500 +// Copyright 2012-2017 The Rust Project Developers. See the COPYRIGHT + 80036f2: ea4f 068e mov.w r6, lr, lsl #2 + 80036f6: 2505 movs r5, #5 + 80036f8: eb01 018e add.w r1, r1, lr, lsl #2 + 80036fc: f101 0c04 add.w ip, r1, #4 + let v = (self as $bigty) * (other as $bigty) + (carry as $bigty); + 8003700: f8db 2000 ldr.w r2, [fp] + 8003704: 2100 movs r1, #0 + if self.ptr == self.end { + 8003706: 3e04 subs r6, #4 + 8003708: fbe2 3105 umlal r3, r1, r2, r5 + *a = v; + 800370c: f84b 3b04 str.w r3, [fp], #4 + 8003710: 460b mov r3, r1 + 8003712: d1f5 bne.n 8003700 <core::fmt::float::float_to_decimal_common_exact+0xecc> + if carry > 0 { + 8003714: 2900 cmp r1, #0 + 8003716: f20d 455c addw r5, sp, #1116 ; 0x45c + 800371a: d01b beq.n 8003754 <core::fmt::float::float_to_decimal_common_exact+0xf20> + self.base[sz] = carry; + 800371c: f1be 0f27 cmp.w lr, #39 ; 0x27 + 8003720: f200 81a8 bhi.w 8003a74 <core::fmt::float::float_to_decimal_common_exact+0x1240> + sz += 1; + 8003724: f10e 0301 add.w r3, lr, #1 + self.base[sz] = carry; + 8003728: f8cc 1000 str.w r1, [ip] + 800372c: e013 b.n 8003756 <core::fmt::float::float_to_decimal_common_exact+0xf22> + 800372e: e9dd 4114 ldrd r4, r1, [sp, #80] ; 0x50 + } else if self.end > slice.len() { + 8003732: 428c cmp r4, r1 + 8003734: f200 81a2 bhi.w 8003a7c <core::fmt::float::float_to_decimal_common_exact+0x1248> + 8003738: 9a13 ldr r2, [sp, #76] ; 0x4c + 800373a: e9dd 8902 ldrd r8, r9, [sp, #8] + 800373e: 9e0b ldr r6, [sp, #44] ; 0x2c + from_raw_parts_mut(slice.as_mut_ptr().offset(self.start as isize), self.end - self.start) + 8003740: 1aa1 subs r1, r4, r2 + 8003742: d004 beq.n 800374e <core::fmt::float::float_to_decimal_common_exact+0xf1a> + 8003744: a817 add r0, sp, #92 ; 0x5c + 8003746: 4410 add r0, r2 + for c in &mut buf[i..len] { *c = b'0'; } + 8003748: 2230 movs r2, #48 ; 0x30 + 800374a: f000 f9ea bl 8003b22 <__aeabi_memset> + 800374e: f8dd e01c ldr.w lr, [sp, #28] + 8003752: e055 b.n 8003800 <core::fmt::float::float_to_decimal_common_exact+0xfcc> + 8003754: 4673 mov r3, lr + 8003756: 4283 cmp r3, r0 + self.size = sz; + 8003758: f8cd 3500 str.w r3, [sp, #1280] ; 0x500 + 800375c: bf28 it cs + 800375e: 4618 movcs r0, r3 + 8003760: f8dd e01c ldr.w lr, [sp, #28] + } else if self.end > slice.len() { + 8003764: 2829 cmp r0, #41 ; 0x29 + 8003766: f080 8165 bcs.w 8003a34 <core::fmt::float::float_to_decimal_common_exact+0x1200> + loop { + 800376a: 0080 lsls r0, r0, #2 + if self.end == self.ptr { + 800376c: 2800 cmp r0, #0 + 800376e: d009 beq.n 8003784 <core::fmt::float::float_to_decimal_common_exact+0xf50> + 8003770: d014 beq.n 800379c <core::fmt::float::float_to_decimal_common_exact+0xf68> + 8003772: f50d 62a0 add.w r2, sp, #1280 ; 0x500 + 8003776: 5829 ldr r1, [r5, r0] + 8003778: 5812 ldr r2, [r2, r0] + Ordering::Equal => (), + 800377a: 3804 subs r0, #4 + 800377c: 4291 cmp r1, r2 + 800377e: d0f5 beq.n 800376c <core::fmt::float::float_to_decimal_common_exact+0xf38> + 8003780: d20c bcs.n 800379c <core::fmt::float::float_to_decimal_common_exact+0xf68> + 8003782: e03c b.n 80037fe <core::fmt::float::float_to_decimal_common_exact+0xfca> + 8003784: d13b bne.n 80037fe <core::fmt::float::float_to_decimal_common_exact+0xfca> + // rounding up if we stop in the middle of digits + // if the following digits are exactly 5000..., check the prior digit and try to + // round to even (i.e. avoid rounding up when the prior digit is even). + let order = mant.cmp(scale.mul_small(5)); + if order == Ordering::Greater || (order == Ordering::Equal && + (len == 0 || buf[len-1] & 1 == 1)) { + 8003786: 9813 ldr r0, [sp, #76] ; 0x4c + 8003788: b940 cbnz r0, 800379c <core::fmt::float::float_to_decimal_common_exact+0xf68> + &(*slice)[self] + 800378a: 9915 ldr r1, [sp, #84] ; 0x54 + 800378c: 1e60 subs r0, r4, #1 + 800378e: 4288 cmp r0, r1 + 8003790: f080 817e bcs.w 8003a90 <core::fmt::float::float_to_decimal_common_exact+0x125c> + 8003794: a917 add r1, sp, #92 ; 0x5c + 8003796: 5c08 ldrb r0, [r1, r0] + if order == Ordering::Greater || (order == Ordering::Equal && + 8003798: 07c0 lsls r0, r0, #31 + 800379a: d030 beq.n 80037fe <core::fmt::float::float_to_decimal_common_exact+0xfca> + // if rounding up changes the length, the exponent should also change. + // but we've been requested a fixed number of digits, so do not alter the buffer... + if let Some(c) = round_up(buf, len) { + 800379c: 9915 ldr r1, [sp, #84] ; 0x54 + 800379e: ad17 add r5, sp, #92 ; 0x5c + 80037a0: 4622 mov r2, r4 + 80037a2: 4628 mov r0, r5 + 80037a4: f7fd fa2f bl 8000c06 <core::num::flt2dec::round_up> + 80037a8: f3c0 2107 ubfx r1, r0, #8, #8 + 80037ac: b2c0 uxtb r0, r0 + 80037ae: 2801 cmp r0, #1 + 80037b0: d123 bne.n 80037fa <core::fmt::float::float_to_decimal_common_exact+0xfc6> + // ...unless we've been requested the fixed precision instead. + // we also need to check that, if the original buffer was empty, + // the additional digit can only be added when `k == limit` (edge case). + k += 1; + 80037b2: 9809 ldr r0, [sp, #36] ; 0x24 + 80037b4: f8dd e01c ldr.w lr, [sp, #28] + 80037b8: 3001 adds r0, #1 + 80037ba: b202 sxth r2, r0 + if k > limit && len < buf.len() { + 80037bc: 980b ldr r0, [sp, #44] ; 0x2c + 80037be: 9209 str r2, [sp, #36] ; 0x24 + 80037c0: 4282 cmp r2, r0 + 80037c2: dd1c ble.n 80037fe <core::fmt::float::float_to_decimal_common_exact+0xfca> + 80037c4: 9815 ldr r0, [sp, #84] ; 0x54 + 80037c6: 4284 cmp r4, r0 + buf[len] = c; + 80037c8: bf3c itt cc + 80037ca: 5529 strbcc r1, [r5, r4] + len += 1; + 80037cc: 3401 addcc r4, #1 + 80037ce: e016 b.n 80037fe <core::fmt::float::float_to_decimal_common_exact+0xfca> + 80037d0: f8dd e01c ldr.w lr, [sp, #28] + 80037d4: 9e0b ldr r6, [sp, #44] ; 0x2c + 80037d6: e9dd 8902 ldrd r8, r9, [sp, #8] + 80037da: 2400 movs r4, #0 + 80037dc: e010 b.n 8003800 <core::fmt::float::float_to_decimal_common_exact+0xfcc> + 80037de: e9dd 8902 ldrd r8, r9, [sp, #8] + 80037e2: 9e0b ldr r6, [sp, #44] ; 0x2c + 80037e4: 465c mov r4, fp + 80037e6: e00b b.n 8003800 <core::fmt::float::float_to_decimal_common_exact+0xfcc> + 80037e8: e9dd 8902 ldrd r8, r9, [sp, #8] + 80037ec: f8dd e01c ldr.w lr, [sp, #28] + 80037f0: 9e0b ldr r6, [sp, #44] ; 0x2c + 80037f2: 9c14 ldr r4, [sp, #80] ; 0x50 + 80037f4: e004 b.n 8003800 <core::fmt::float::float_to_decimal_common_exact+0xfcc> + 80037f6: e9dd 8902 ldrd r8, r9, [sp, #8] + 80037fa: f8dd e01c ldr.w lr, [sp, #28] + 80037fe: 9e0b ldr r6, [sp, #44] ; 0x2c + let (len, exp) = format_exact(decoded, &mut buf[..maxlen], limit); + if exp <= limit { + 8003800: 9809 ldr r0, [sp, #36] ; 0x24 + 8003802: b200 sxth r0, r0 + 8003804: 42b0 cmp r0, r6 + 8003806: dd30 ble.n 800386a <core::fmt::float::float_to_decimal_common_exact+0x1036> + } else if self.end > slice.len() { + 8003808: f5b4 6f80 cmp.w r4, #1024 ; 0x400 + 800380c: f200 8118 bhi.w 8003a40 <core::fmt::float::float_to_decimal_common_exact+0x120c> + assert!(!buf.is_empty()); + 8003810: 2c00 cmp r4, #0 + 8003812: f000 811a beq.w 8003a4a <core::fmt::float::float_to_decimal_common_exact+0x1216> + assert!(buf[0] > b'0'); + 8003816: f89d 105c ldrb.w r1, [sp, #92] ; 0x5c + 800381a: 2930 cmp r1, #48 ; 0x30 + 800381c: f240 811b bls.w 8003a56 <core::fmt::float::float_to_decimal_common_exact+0x1222> + if exp <= 0 { + 8003820: 2801 cmp r0, #1 + 8003822: db3e blt.n 80038a2 <core::fmt::float::float_to_decimal_common_exact+0x106e> + 8003824: 2102 movs r1, #2 + 8003826: aa17 add r2, sp, #92 ; 0x5c + if exp < buf.len() { + 8003828: 42a0 cmp r0, r4 + 800382a: f827 1cc4 strh.w r1, [r7, #-196] + 800382e: f847 2cc0 str.w r2, [r7, #-192] + 8003832: d25b bcs.n 80038ec <core::fmt::float::float_to_decimal_common_exact+0x10b8> + parts[1] = Part::Copy(b"."); + 8003834: f644 2386 movw r3, #19078 ; 0x4a86 + parts[0] = Part::Copy(&buf[..exp]); + 8003838: f847 0cbc str.w r0, [r7, #-188] + parts[1] = Part::Copy(b"."); + 800383c: f827 1cb8 strh.w r1, [r7, #-184] + 8003840: f6c0 0300 movt r3, #2048 ; 0x800 + 8003844: f847 3cb4 str.w r3, [r7, #-180] + 8003848: 2301 movs r3, #1 + 800384a: f847 3cb0 str.w r3, [r7, #-176] + parts[2] = Part::Copy(&buf[exp..]); + 800384e: f827 1cac strh.w r1, [r7, #-172] + intrinsics::offset(self, count) + 8003852: 1811 adds r1, r2, r0 + 8003854: f847 1ca8 str.w r1, [r7, #-168] + from_raw_parts(slice.as_ptr().offset(self.start as isize), self.end - self.start) + 8003858: 1a21 subs r1, r4, r0 + if frac_digits > buf.len() - exp { + 800385a: 4541 cmp r1, r8 + parts[2] = Part::Copy(&buf[exp..]); + 800385c: f847 1ca4 str.w r1, [r7, #-164] + 8003860: d242 bcs.n 80038e8 <core::fmt::float::float_to_decimal_common_exact+0x10b4> + parts[3] = Part::Zero(frac_digits - (buf.len() - exp)); + 8003862: 4440 add r0, r8 + 8003864: 2100 movs r1, #0 + 8003866: 1b00 subs r0, r0, r4 + 8003868: e039 b.n 80038de <core::fmt::float::float_to_decimal_common_exact+0x10aa> + 800386a: 2002 movs r0, #2 + // the restriction couldn't been met, so this should render like zero no matter + // `exp` was. this does not include the case that the restriction has been met + // only after the final rounding-up; it's a regular case with `exp = limit + 1`. + debug_assert_eq!(len, 0); + if frac_digits > 0 { // [0.][0000] + 800386c: f1b8 0f00 cmp.w r8, #0 + 8003870: f827 0cc4 strh.w r0, [r7, #-196] + 8003874: d00b beq.n 800388e <core::fmt::float::float_to_decimal_common_exact+0x105a> + parts[0] = Part::Copy(b"0."); + 8003876: f644 2184 movw r1, #19076 ; 0x4a84 + 800387a: f6c0 0100 movt r1, #2048 ; 0x800 + 800387e: e947 1030 strd r1, r0, [r7, #-192] ; 0xc0 + parts[1] = Part::Zero(frac_digits); + 8003882: 2100 movs r1, #0 + 8003884: f827 1cb8 strh.w r1, [r7, #-184] + 8003888: f847 8cb4 str.w r8, [r7, #-180] + 800388c: e04b b.n 8003926 <core::fmt::float::float_to_decimal_common_exact+0x10f2> + Formatted { sign: sign, parts: &parts[..2] } + } else { + parts[0] = Part::Copy(b"0"); + 800388e: f644 306e movw r0, #19310 ; 0x4b6e + 8003892: f6c0 0000 movt r0, #2048 ; 0x800 + 8003896: f847 0cc0 str.w r0, [r7, #-192] + 800389a: 2001 movs r0, #1 + 800389c: f847 0cbc str.w r0, [r7, #-188] + 80038a0: e041 b.n 8003926 <core::fmt::float::float_to_decimal_common_exact+0x10f2> + parts[0] = Part::Copy(b"0."); + 80038a2: f644 2184 movw r1, #19076 ; 0x4a84 + 80038a6: 2202 movs r2, #2 + if frac_digits > buf.len() && frac_digits - buf.len() > minus_exp { + 80038a8: 4544 cmp r4, r8 + parts[0] = Part::Copy(b"0."); + 80038aa: f6c0 0100 movt r1, #2048 ; 0x800 + 80038ae: f827 2cc4 strh.w r2, [r7, #-196] + 80038b2: e947 1230 strd r1, r2, [r7, #-192] ; 0xc0 + 80038b6: f04f 0100 mov.w r1, #0 + parts[1] = Part::Zero(minus_exp); + 80038ba: f827 1cb8 strh.w r1, [r7, #-184] + let minus_exp = -(exp as i32) as usize; + 80038be: f1c0 0100 rsb r1, r0, #0 + parts[1] = Part::Zero(minus_exp); + 80038c2: f847 1cb4 str.w r1, [r7, #-180] + parts[2] = Part::Copy(buf); + 80038c6: f827 2cac strh.w r2, [r7, #-172] + 80038ca: aa17 add r2, sp, #92 ; 0x5c + 80038cc: e947 242a strd r2, r4, [r7, #-168] ; 0xa8 + 80038d0: d20a bcs.n 80038e8 <core::fmt::float::float_to_decimal_common_exact+0x10b4> + if frac_digits > buf.len() && frac_digits - buf.len() > minus_exp { + 80038d2: eba8 0204 sub.w r2, r8, r4 + 80038d6: 428a cmp r2, r1 + 80038d8: d906 bls.n 80038e8 <core::fmt::float::float_to_decimal_common_exact+0x10b4> + parts[3] = Part::Zero((frac_digits - buf.len()) - minus_exp); + 80038da: 2100 movs r1, #0 + 80038dc: 4410 add r0, r2 + 80038de: f827 1ca0 strh.w r1, [r7, #-160] + 80038e2: f847 0c9c str.w r0, [r7, #-156] + 80038e6: e01d b.n 8003924 <core::fmt::float::float_to_decimal_common_exact+0x10f0> + 80038e8: 2003 movs r0, #3 + 80038ea: e01c b.n 8003926 <core::fmt::float::float_to_decimal_common_exact+0x10f2> + 80038ec: 2100 movs r1, #0 + parts[1] = Part::Zero(exp - buf.len()); + 80038ee: 1b00 subs r0, r0, r4 + parts[0] = Part::Copy(buf); + 80038f0: f847 4cbc str.w r4, [r7, #-188] + if frac_digits > 0 { + 80038f4: f1b8 0f00 cmp.w r8, #0 + parts[1] = Part::Zero(exp - buf.len()); + 80038f8: f827 1cb8 strh.w r1, [r7, #-184] + 80038fc: f847 0cb4 str.w r0, [r7, #-180] + 8003900: f04f 0002 mov.w r0, #2 + 8003904: d00f beq.n 8003926 <core::fmt::float::float_to_decimal_common_exact+0x10f2> + parts[2] = Part::Copy(b"."); + 8003906: f827 0cac strh.w r0, [r7, #-172] + 800390a: f644 2086 movw r0, #19078 ; 0x4a86 + 800390e: f6c0 0000 movt r0, #2048 ; 0x800 + 8003912: f847 0ca8 str.w r0, [r7, #-168] + 8003916: 2001 movs r0, #1 + 8003918: f847 0ca4 str.w r0, [r7, #-164] + parts[3] = Part::Zero(frac_digits); + 800391c: f827 1ca0 strh.w r1, [r7, #-160] + 8003920: f847 8c9c str.w r8, [r7, #-156] + 8003924: 2004 movs r0, #4 + 8003926: 9b0c ldr r3, [sp, #48] ; 0x30 + 8003928: f1a7 01c4 sub.w r1, r7, #196 ; 0xc4 + 800392c: f8cd e648 str.w lr, [sp, #1608] ; 0x648 + 8003930: f8cd 364c str.w r3, [sp, #1612] ; 0x64c + 8003934: f8cd 1650 str.w r1, [sp, #1616] ; 0x650 + 8003938: f8cd 0654 str.w r0, [sp, #1620] ; 0x654 + 800393c: f50d 61c9 add.w r1, sp, #1608 ; 0x648 + fmt.pad_formatted_parts(&formatted) + 8003940: 4648 mov r0, r9 + 8003942: f7fd fb6d bl 8001020 <core::fmt::Formatter::pad_formatted_parts> +} + 8003946: f50d 6df2 add.w sp, sp, #1936 ; 0x790 + 800394a: b001 add sp, #4 + 800394c: e8bd 0f00 ldmia.w sp!, {r8, r9, sl, fp} + 8003950: bdf0 pop {r4, r5, r6, r7, pc} + 8003952: f8dd a054 ldr.w sl, [sp, #84] ; 0x54 + 8003956: 9c14 ldr r4, [sp, #80] ; 0x50 + 8003958: f10d 085c add.w r8, sp, #92 ; 0x5c + if let Some(c) = round_up(buf, len) { + 800395c: 4640 mov r0, r8 + 800395e: 4651 mov r1, sl + 8003960: 4622 mov r2, r4 + 8003962: f7fd f950 bl 8000c06 <core::num::flt2dec::round_up> + 8003966: f3c0 2107 ubfx r1, r0, #8, #8 + 800396a: e9dd 2902 ldrd r2, r9, [sp, #8] + 800396e: b2c0 uxtb r0, r0 + 8003970: 2801 cmp r0, #1 + 8003972: d10f bne.n 8003994 <core::fmt::float::float_to_decimal_common_exact+0x1160> + exp += 1; + 8003974: 9800 ldr r0, [sp, #0] + 8003976: 9e0b ldr r6, [sp, #44] ; 0x2c + 8003978: f8dd e01c ldr.w lr, [sp, #28] + 800397c: 3002 adds r0, #2 + 800397e: b200 sxth r0, r0 + if exp > limit && len < buf.len() { + 8003980: 42b0 cmp r0, r6 + 8003982: 9009 str r0, [sp, #36] ; 0x24 + 8003984: dd0d ble.n 80039a2 <core::fmt::float::float_to_decimal_common_exact+0x116e> + 8003986: 4554 cmp r4, sl + buf[len] = c; + 8003988: bf3c itt cc + 800398a: f808 1004 strbcc.w r1, [r8, r4] + len += 1; + 800398e: 3401 addcc r4, #1 + 8003990: 4690 mov r8, r2 + 8003992: e735 b.n 8003800 <core::fmt::float::float_to_decimal_common_exact+0xfcc> + 8003994: f8dd e01c ldr.w lr, [sp, #28] + 8003998: 9e0b ldr r6, [sp, #44] ; 0x2c + 800399a: 4690 mov r8, r2 + 800399c: e730 b.n 8003800 <core::fmt::float::float_to_decimal_common_exact+0xfcc> + 800399e: 4680 mov r8, r0 + 80039a0: e72e b.n 8003800 <core::fmt::float::float_to_decimal_common_exact+0xfcc> + 80039a2: 4690 mov r8, r2 + 80039a4: e72c b.n 8003800 <core::fmt::float::float_to_decimal_common_exact+0xfcc> + base[sz] = v as $ty; + 80039a6: 2128 movs r1, #40 ; 0x28 + 80039a8: f7fc fdcd bl 8000546 <core::panicking::panic_bounds_check> + buf[i] = b'0' + q as u8; + 80039ac: 9915 ldr r1, [sp, #84] ; 0x54 + 80039ae: f7fc fdca bl 8000546 <core::panicking::panic_bounds_check> + 80039b2: f244 500c movw r0, #17676 ; 0x450c + 80039b6: f6c0 0000 movt r0, #2048 ; 0x800 + 80039ba: f7fd f89a bl 8000af2 <core::panicking::panic> + 80039be: 4608 mov r0, r1 + 80039c0: 2128 movs r1, #40 ; 0x28 + 80039c2: f7fc fdbc bl 800053e <core::slice::slice_index_len_fail> + slice_index_len_fail(self.end, slice.len()); + 80039c6: 2128 movs r1, #40 ; 0x28 + 80039c8: f7fc fdb9 bl 800053e <core::slice::slice_index_len_fail> + 80039cc: 4610 mov r0, r2 + 80039ce: 2128 movs r1, #40 ; 0x28 + 80039d0: f7fc fdb5 bl 800053e <core::slice::slice_index_len_fail> + 80039d4: 4618 mov r0, r3 + 80039d6: 2128 movs r1, #40 ; 0x28 + 80039d8: f7fc fdb1 bl 800053e <core::slice::slice_index_len_fail> + buf[i] = b'0' + d; + 80039dc: 9915 ldr r1, [sp, #84] ; 0x54 + 80039de: 4618 mov r0, r3 + 80039e0: f7fc fdb1 bl 8000546 <core::panicking::panic_bounds_check> + slice_index_len_fail(self.end, slice.len()); + 80039e4: 2128 movs r1, #40 ; 0x28 + 80039e6: f7fc fdaa bl 800053e <core::slice::slice_index_len_fail> + assert!(buf.len() >= maxlen); + 80039ea: f644 3070 movw r0, #19312 ; 0x4b70 + 80039ee: f6c0 0000 movt r0, #2048 ; 0x800 + 80039f2: f7fd f87e bl 8000af2 <core::panicking::panic> + assert!(d.mant > 0); + 80039f6: f644 10b0 movw r0, #18864 ; 0x49b0 + 80039fa: f6c0 0000 movt r0, #2048 ; 0x800 + 80039fe: f7fd f878 bl 8000af2 <core::panicking::panic> + assert!(d.mant < (1 << 61)); // we need at least three bits of additional precision + 8003a02: f644 10c8 movw r0, #18888 ; 0x49c8 + 8003a06: f6c0 0000 movt r0, #2048 ; 0x800 + 8003a0a: f7fd f872 bl 8000af2 <core::panicking::panic> + let (f, e, k) = CACHED_POW10[idx as usize]; + 8003a0e: 2151 movs r1, #81 ; 0x51 + 8003a10: f7fc fd99 bl 8000546 <core::panicking::panic_bounds_check> + assert!(d.mant.checked_add(d.plus).is_some()); + 8003a14: f244 7064 movw r0, #18276 ; 0x4764 + 8003a18: f6c0 0000 movt r0, #2048 ; 0x800 + 8003a1c: f7fd f869 bl 8000af2 <core::panicking::panic> + assert!(d.mant.checked_sub(d.minus).is_some()); + 8003a20: f244 707c movw r0, #18300 ; 0x477c + 8003a24: f6c0 0000 movt r0, #2048 ; 0x800 + 8003a28: f7fd f863 bl 8000af2 <core::panicking::panic> + 8003a2c: 4670 mov r0, lr + 8003a2e: 2128 movs r1, #40 ; 0x28 + 8003a30: f7fc fd85 bl 800053e <core::slice::slice_index_len_fail> + slice_index_len_fail(self.end, slice.len()); + 8003a34: 2128 movs r1, #40 ; 0x28 + 8003a36: f7fc fd82 bl 800053e <core::slice::slice_index_len_fail> + self.base[sz] = carry; + 8003a3a: 2128 movs r1, #40 ; 0x28 + 8003a3c: f7fc fd83 bl 8000546 <core::panicking::panic_bounds_check> + 8003a40: 4620 mov r0, r4 + 8003a42: f44f 6180 mov.w r1, #1024 ; 0x400 + 8003a46: f7fc fd7a bl 800053e <core::slice::slice_index_len_fail> + assert!(!buf.is_empty()); + 8003a4a: f644 2054 movw r0, #19028 ; 0x4a54 + 8003a4e: f6c0 0000 movt r0, #2048 ; 0x800 + 8003a52: f7fd f84e bl 8000af2 <core::panicking::panic> + assert!(buf[0] > b'0'); + 8003a56: f644 206c movw r0, #19052 ; 0x4a6c + 8003a5a: f6c0 0000 movt r0, #2048 ; 0x800 + 8003a5e: f7fd f848 bl 8000af2 <core::panicking::panic> + assert!(d.plus > 0); + 8003a62: f244 704c movw r0, #18252 ; 0x474c + 8003a66: f6c0 0000 movt r0, #2048 ; 0x800 + 8003a6a: f7fd f842 bl 8000af2 <core::panicking::panic> + slice_index_len_fail(self.end, slice.len()); + 8003a6e: 2128 movs r1, #40 ; 0x28 + 8003a70: f7fc fd65 bl 800053e <core::slice::slice_index_len_fail> + 8003a74: 4670 mov r0, lr + 8003a76: 2128 movs r1, #40 ; 0x28 + 8003a78: f7fc fd65 bl 8000546 <core::panicking::panic_bounds_check> + 8003a7c: 4620 mov r0, r4 + 8003a7e: f7fc fd5e bl 800053e <core::slice::slice_index_len_fail> + self.base[sz] = 1; + 8003a82: 4608 mov r0, r1 + 8003a84: 2128 movs r1, #40 ; 0x28 + 8003a86: f7fc fd5e bl 8000546 <core::panicking::panic_bounds_check> + self.base[sz] = carry; + 8003a8a: 2128 movs r1, #40 ; 0x28 + 8003a8c: f7fc fd5b bl 8000546 <core::panicking::panic_bounds_check> + &(*slice)[self] + 8003a90: 9915 ldr r1, [sp, #84] ; 0x54 + 8003a92: f7fc fd58 bl 8000546 <core::panicking::panic_bounds_check> + +08003a96 <core::fmt::float::<impl core::fmt::Display for f64>::fmt>: + pub fn sign_plus(&self) -> bool { self.flags & (1 << FlagV1::SignPlus as u32) != 0 } + 8003a96: 680a ldr r2, [r1, #0] + (false, true) => flt2dec::Sign::MinusRaw, + (true, false) => flt2dec::Sign::MinusPlus, + (true, true) => flt2dec::Sign::MinusPlusRaw, + }; + + if let Some(precision) = fmt.precision { + 8003a98: 690b ldr r3, [r1, #16] + 8003a9a: ed90 0b00 vldr d0, [r0] + 8003a9e: f002 0001 and.w r0, r2, #1 + 8003aa2: 2b01 cmp r3, #1 + (false, false) => flt2dec::Sign::Minus, + 8003aa4: ea4f 0c40 mov.w ip, r0, lsl #1 + 8003aa8: d104 bne.n 8003ab4 <core::fmt::float::<impl core::fmt::Display for f64>::fmt+0x1e> + if let Some(precision) = fmt.precision { + 8003aaa: 694a ldr r2, [r1, #20] + float_to_decimal_common_exact(fmt, num, sign, precision) + 8003aac: 4608 mov r0, r1 + 8003aae: 4661 mov r1, ip + 8003ab0: f7fe bec0 b.w 8002834 <core::fmt::float::float_to_decimal_common_exact> + } else { + float_to_decimal_common_shortest(fmt, num, sign) + 8003ab4: 4608 mov r0, r1 + 8003ab6: 4661 mov r1, ip + 8003ab8: f7fd bc93 b.w 80013e2 <core::fmt::float::float_to_decimal_common_shortest> + +08003abc <__aeabi_uldivmod>: +} + +#[naked] +#[cfg_attr(not(feature = "mangled-names"), no_mangle)] +pub unsafe fn __aeabi_uldivmod() { + asm!("push {r4, lr} + 8003abc: b510 push {r4, lr} + 8003abe: b084 sub sp, #16 + 8003ac0: ac02 add r4, sp, #8 + 8003ac2: 9400 str r4, [sp, #0] + 8003ac4: f000 f859 bl 8003b7a <__udivmoddi4> + 8003ac8: 9a02 ldr r2, [sp, #8] + 8003aca: 9b03 ldr r3, [sp, #12] + 8003acc: b004 add sp, #16 + 8003ace: bd10 pop {r4, pc} + +08003ad0 <__aeabi_memcpy>: +pub unsafe extern "C" fn memcpy(dest: *mut u8, + src: *const u8, + n: usize) + -> *mut u8 { + let mut i = 0; + while i < n { + 8003ad0: 2a00 cmp r2, #0 +#[cfg(not(target_os = "ios"))] +#[cfg_attr(not(feature = "mangled-names"), no_mangle)] +#[cfg_attr(thumb, linkage = "weak")] +pub unsafe extern "aapcs" fn __aeabi_memcpy(dest: *mut u8, src: *const u8, n: usize) { + ::mem::memcpy(dest, src, n); +} + 8003ad2: bf08 it eq + 8003ad4: 4770 bxeq lr + *dest.offset(i as isize) = *src.offset(i as isize); + 8003ad6: f811 3b01 ldrb.w r3, [r1], #1 + while i < n { + 8003ada: 3a01 subs r2, #1 + *dest.offset(i as isize) = *src.offset(i as isize); + 8003adc: f800 3b01 strb.w r3, [r0], #1 + 8003ae0: d1f9 bne.n 8003ad6 <__aeabi_memcpy+0x6> + 8003ae2: 4770 bx lr + +08003ae4 <__aeabi_memcpy4>: + +#[cfg(not(target_os = "ios"))] +#[cfg_attr(not(feature = "mangled-names"), no_mangle)] +#[cfg_attr(thumb, linkage = "weak")] +pub unsafe extern "aapcs" fn __aeabi_memcpy4(dest: *mut u8, src: *const u8, mut n: usize) { + 8003ae4: 468c mov ip, r1 + 8003ae6: 4603 mov r3, r0 + use core::ptr; + + let mut dest = dest as *mut u32; + let mut src = src as *mut u32; + + while n >= 4 { + 8003ae8: 2a04 cmp r2, #4 + 8003aea: d316 bcc.n 8003b1a <__aeabi_memcpy4+0x36> + 8003aec: b5b0 push {r4, r5, r7, lr} + 8003aee: af02 add r7, sp, #8 + 8003af0: f1a2 0e04 sub.w lr, r2, #4 + 8003af4: f02e 0403 bic.w r4, lr, #3 + 8003af8: 1d20 adds r0, r4, #4 + 8003afa: eb0c 0100 add.w r1, ip, r0 + 8003afe: 4418 add r0, r3 + 8003b00: f85c 5b04 ldr.w r5, [ip], #4 + ptr::write(dest, ptr::read(src)); + dest = dest.offset(1); + src = src.offset(1); + n -= 4; + 8003b04: 3a04 subs r2, #4 + while n >= 4 { + 8003b06: 2a03 cmp r2, #3 + intrinsics::move_val_init(&mut *dst, src) + 8003b08: f843 5b04 str.w r5, [r3], #4 + 8003b0c: d8f8 bhi.n 8003b00 <__aeabi_memcpy4+0x1c> + 8003b0e: ebae 0204 sub.w r2, lr, r4 + 8003b12: e8bd 40b0 ldmia.w sp!, {r4, r5, r7, lr} + } + + __aeabi_memcpy(dest as *mut u8, src as *const u8, n); + 8003b16: f7ff bfdb b.w 8003ad0 <__aeabi_memcpy> + 8003b1a: 4618 mov r0, r3 + 8003b1c: 4661 mov r1, ip + 8003b1e: f7ff bfd7 b.w 8003ad0 <__aeabi_memcpy> + +08003b22 <__aeabi_memset>: +} + +#[cfg_attr(all(feature = "mem", not(feature = "mangled-names")), no_mangle)] +pub unsafe extern "C" fn memset(s: *mut u8, c: c_int, n: usize) -> *mut u8 { + let mut i = 0; + while i < n { + 8003b22: 2900 cmp r1, #0 +#[cfg_attr(not(feature = "mangled-names"), no_mangle)] +#[cfg_attr(thumb, linkage = "weak")] +pub unsafe extern "aapcs" fn __aeabi_memset(dest: *mut u8, n: usize, c: i32) { + // Note the different argument order + ::mem::memset(dest, c, n); +} + 8003b24: bf08 it eq + 8003b26: 4770 bxeq lr + *s.offset(i as isize) = c as u8; + 8003b28: f800 2b01 strb.w r2, [r0], #1 + while i < n { + 8003b2c: 3901 subs r1, #1 + 8003b2e: d1fb bne.n 8003b28 <__aeabi_memset+0x6> + 8003b30: 4770 bx lr + +08003b32 <__aeabi_memset4>: + +#[cfg(not(target_os = "ios"))] +#[cfg_attr(not(feature = "mangled-names"), no_mangle)] +#[cfg_attr(thumb, linkage = "weak")] +pub unsafe extern "aapcs" fn __aeabi_memset4(dest: *mut u8, mut n: usize, c: i32) { + 8003b32: 4613 mov r3, r2 + let mut dest = dest as *mut u32; + + let byte = (c as u32) & 0xff; + let c = (byte << 24) | (byte << 16) | (byte << 8) | byte; + + while n >= 4 { + 8003b34: 2904 cmp r1, #4 + let byte = (c as u32) & 0xff; + 8003b36: b2da uxtb r2, r3 + 8003b38: bf38 it cc + 8003b3a: f7ff bff2 bcc.w 8003b22 <__aeabi_memset> + 8003b3e: b5b0 push {r4, r5, r7, lr} + 8003b40: af02 add r7, sp, #8 +// Copyright 2012-2014 The Rust Project Developers. See the COPYRIGHT + 8003b42: f1a1 0e04 sub.w lr, r1, #4 + let c = (byte << 24) | (byte << 16) | (byte << 8) | byte; + 8003b46: ea42 6303 orr.w r3, r2, r3, lsl #24 + 8003b4a: f02e 0503 bic.w r5, lr, #3 + 8003b4e: ea43 4302 orr.w r3, r3, r2, lsl #16 + let mut dest = dest as *mut u32; + 8003b52: 1944 adds r4, r0, r5 + let c = (byte << 24) | (byte << 16) | (byte << 8) | byte; + 8003b54: ea43 2302 orr.w r3, r3, r2, lsl #8 + 8003b58: f104 0c04 add.w ip, r4, #4 + ptr::write(dest, c); + dest = dest.offset(1); + n -= 4; + 8003b5c: 3904 subs r1, #4 + intrinsics::move_val_init(&mut *dst, src) + 8003b5e: f840 3b04 str.w r3, [r0], #4 + while n >= 4 { + 8003b62: 2903 cmp r1, #3 + 8003b64: d8fa bhi.n 8003b5c <__aeabi_memset4+0x2a> +// Copyright 2012-2014 The Rust Project Developers. See the COPYRIGHT + 8003b66: ebae 0105 sub.w r1, lr, r5 + 8003b6a: e8bd 40b0 ldmia.w sp!, {r4, r5, r7, lr} + } + + __aeabi_memset(dest as *mut u8, n, byte as i32); + 8003b6e: 4660 mov r0, ip + 8003b70: f7ff bfd7 b.w 8003b22 <__aeabi_memset> + +08003b74 <__aeabi_memclr4>: + +#[cfg(not(target_os = "ios"))] +#[cfg_attr(not(feature = "mangled-names"), no_mangle)] +#[cfg_attr(thumb, linkage = "weak")] +pub unsafe extern "aapcs" fn __aeabi_memclr4(dest: *mut u8, n: usize) { + __aeabi_memset4(dest, n, 0); + 8003b74: 2200 movs r2, #0 + 8003b76: f7ff bfdc b.w 8003b32 <__aeabi_memset4> + +08003b7a <__udivmoddi4>: + + $($rest:tt)* + ) => ( + $(#[$($attr)*])* + #[cfg_attr(not(feature = "mangled-names"), no_mangle)] + pub extern $abi fn $name( $($argname: $ty),* ) -> $ret { + 8003b7a: b5f0 push {r4, r5, r6, r7, lr} + 8003b7c: af03 add r7, sp, #12 + 8003b7e: e92d 0f00 stmdb sp!, {r8, r9, sl, fp} + 8003b82: b082 sub sp, #8 + 8003b84: 68bc ldr r4, [r7, #8] + 8003b86: b151 cbz r1, 8003b9e <__udivmoddi4+0x24> + rem + } + + /// Returns `n / d` and sets `*rem = n % d` + pub extern "C" fn __udivmoddi4(n: u64, d: u64, rem: Option<&mut u64>) -> u64 { + udivmod_inner!(n, d, rem, u64) + 8003b88: 2a00 cmp r2, #0 + 8003b8a: d017 beq.n 8003bbc <__udivmoddi4+0x42> + 8003b8c: b393 cbz r3, 8003bf4 <__udivmoddi4+0x7a> + unsafe { $ctlz(self as $ActualT) as u32 } + 8003b8e: fab1 f681 clz r6, r1 + 8003b92: fab3 f583 clz r5, r3 + intrinsics::overflowing_sub(self, rhs) + 8003b96: 1bad subs r5, r5, r6 + 8003b98: 2d1f cmp r5, #31 + 8003b9a: d820 bhi.n 8003bde <__udivmoddi4+0x64> + 8003b9c: e025 b.n 8003bea <__udivmoddi4+0x70> + 8003b9e: b9f3 cbnz r3, 8003bde <__udivmoddi4+0x64> + 8003ba0: 2c00 cmp r4, #0 + 8003ba2: f000 80b1 beq.w 8003d08 <__udivmoddi4+0x18e> + if other == 0 { + 8003ba6: 2a00 cmp r2, #0 + 8003ba8: f000 80e2 beq.w 8003d70 <__udivmoddi4+0x1f6> + Some(unsafe { intrinsics::unchecked_rem(self, other) }) + 8003bac: fbb0 f3f2 udiv r3, r0, r2 + ($Small: ty, $Large: ty, #[$attr:meta]) => { + #[$attr] + impl From<$Small> for $Large { + #[inline] + fn from(small: $Small) -> $Large { + small as $Large + 8003bb0: 2100 movs r1, #0 + Some(unsafe { intrinsics::unchecked_rem(self, other) }) + 8003bb2: fb03 0312 mls r3, r3, r2, r0 + 8003bb6: e9c4 3100 strd r3, r1, [r4] + 8003bba: e0a6 b.n 8003d0a <__udivmoddi4+0x190> + 8003bbc: 2b00 cmp r3, #0 + 8003bbe: f000 80d7 beq.w 8003d70 <__udivmoddi4+0x1f6> + 8003bc2: 2800 cmp r0, #0 + 8003bc4: f000 8094 beq.w 8003cf0 <__udivmoddi4+0x176> + intrinsics::overflowing_sub(self, rhs) + 8003bc8: 1e5e subs r6, r3, #1 + 8003bca: 421e tst r6, r3 + 8003bcc: f000 80bd beq.w 8003d4a <__udivmoddi4+0x1d0> + unsafe { $ctlz(self as $ActualT) as u32 } + 8003bd0: fab1 f681 clz r6, r1 + 8003bd4: fab3 f583 clz r5, r3 + intrinsics::overflowing_sub(self, rhs) + 8003bd8: 1bad subs r5, r5, r6 + 8003bda: 2d1e cmp r5, #30 + 8003bdc: d905 bls.n 8003bea <__udivmoddi4+0x70> + 8003bde: 2c00 cmp r4, #0 + 8003be0: bf18 it ne + 8003be2: e9c4 0100 strdne r0, r1, [r4] + 8003be6: 2000 movs r0, #0 + 8003be8: e0bd b.n 8003d66 <__udivmoddi4+0x1ec> + 8003bea: f1c5 063f rsb r6, r5, #63 ; 0x3f + 8003bee: f105 0e01 add.w lr, r5, #1 + 8003bf2: e00c b.n 8003c0e <__udivmoddi4+0x94> + 8003bf4: 1e56 subs r6, r2, #1 + 8003bf6: 4216 tst r6, r2 + 8003bf8: f000 808a beq.w 8003d10 <__udivmoddi4+0x196> + unsafe { $ctlz(self as $ActualT) as u32 } + 8003bfc: fab2 f582 clz r5, r2 + 8003c00: fab1 f681 clz r6, r1 + 8003c04: 3521 adds r5, #33 ; 0x21 + 8003c06: eba5 0e06 sub.w lr, r5, r6 + 8003c0a: f1ce 0600 rsb r6, lr, #0 + 8003c0e: f006 093f and.w r9, r6, #63 ; 0x3f + 8003c12: f1c9 0420 rsb r4, r9, #32 + 8003c16: fa01 f509 lsl.w r5, r1, r9 + 8003c1a: f1a9 0c20 sub.w ip, r9, #32 + 8003c1e: fa00 fa09 lsl.w sl, r0, r9 + 8003c22: fa20 f404 lsr.w r4, r0, r4 + 8003c26: f1bc 0f00 cmp.w ip, #0 + 8003c2a: ea44 0b05 orr.w fp, r4, r5 + 8003c2e: f00e 043f and.w r4, lr, #63 ; 0x3f + 8003c32: f1c4 0520 rsb r5, r4, #32 + 8003c36: f1a4 0620 sub.w r6, r4, #32 + 8003c3a: bfa8 it ge + 8003c3c: fa00 fb0c lslge.w fp, r0, ip + 8003c40: fa01 f805 lsl.w r8, r1, r5 + 8003c44: fa20 f504 lsr.w r5, r0, r4 + 8003c48: 2e00 cmp r6, #0 + 8003c4a: fa21 f004 lsr.w r0, r1, r4 + 8003c4e: ea45 0508 orr.w r5, r5, r8 + 8003c52: bfa8 it ge + 8003c54: fa21 f506 lsrge.w r5, r1, r6 + 8003c58: f1bc 0f00 cmp.w ip, #0 + 8003c5c: bfa8 it ge + 8003c5e: f04f 0a00 movge.w sl, #0 + 8003c62: 2e00 cmp r6, #0 + 8003c64: bfa8 it ge + 8003c66: 2000 movge r0, #0 + 8003c68: f1be 0f00 cmp.w lr, #0 + 8003c6c: d02f beq.n 8003cce <__udivmoddi4+0x154> + 8003c6e: 1e51 subs r1, r2, #1 + 8003c70: f04f 0c00 mov.w ip, #0 + 8003c74: f04f 0800 mov.w r8, #0 + 8003c78: 4656 mov r6, sl + 8003c7a: 4691 mov r9, r2 + 8003c7c: 9101 str r1, [sp, #4] + 8003c7e: f163 0100 sbc.w r1, r3, #0 + 8003c82: 9100 str r1, [sp, #0] + intrinsics::overflowing_sub(self, rhs) + 8003c84: 9901 ldr r1, [sp, #4] + 8003c86: 0040 lsls r0, r0, #1 + 8003c88: 461c mov r4, r3 + 8003c8a: ea4c 0a46 orr.w sl, ip, r6, lsl #1 + 8003c8e: ea40 70d5 orr.w r0, r0, r5, lsr #31 + 8003c92: 006d lsls r5, r5, #1 + 8003c94: ea45 75db orr.w r5, r5, fp, lsr #31 + 8003c98: 1b49 subs r1, r1, r5 + 8003c9a: 9900 ldr r1, [sp, #0] + 8003c9c: 4181 sbcs r1, r0 + 8003c9e: ea03 72e1 and.w r2, r3, r1, asr #31 + 8003ca2: ea09 73e1 and.w r3, r9, r1, asr #31 + 8003ca6: 1aed subs r5, r5, r3 + 8003ca8: 4623 mov r3, r4 + 8003caa: 4190 sbcs r0, r2 + 8003cac: 2201 movs r2, #1 + 8003cae: f1be 0e01 subs.w lr, lr, #1 + 8003cb2: ea02 72e1 and.w r2, r2, r1, asr #31 + 8003cb6: ea4f 014b mov.w r1, fp, lsl #1 + 8003cba: ea41 71d6 orr.w r1, r1, r6, lsr #31 + 8003cbe: 4694 mov ip, r2 + 8003cc0: 4656 mov r6, sl + 8003cc2: ea48 0b01 orr.w fp, r8, r1 + 8003cc6: f04f 0800 mov.w r8, #0 + 8003cca: d1db bne.n 8003c84 <__udivmoddi4+0x10a> + 8003ccc: e002 b.n 8003cd4 <__udivmoddi4+0x15a> + 8003cce: 2200 movs r2, #0 + 8003cd0: f04f 0800 mov.w r8, #0 + 8003cd4: 68b9 ldr r1, [r7, #8] + 8003cd6: 2900 cmp r1, #0 + 8003cd8: bf18 it ne + 8003cda: e9c1 5000 strdne r5, r0, [r1] + 8003cde: ea4f 014b mov.w r1, fp, lsl #1 + 8003ce2: ea42 004a orr.w r0, r2, sl, lsl #1 + 8003ce6: ea41 71da orr.w r1, r1, sl, lsr #31 + 8003cea: ea41 0108 orr.w r1, r1, r8 + 8003cee: e03b b.n 8003d68 <__udivmoddi4+0x1ee> + 8003cf0: 2c00 cmp r4, #0 + } + fn high_as_low(high: $tyhigh) -> $tylow { + high as $tylow + } + fn from_parts(low: $tylow, high: $tyhigh) -> $ty { + low as $ty | ((high as $ty) << $halfbits) + 8003cf2: bf1f itttt ne + 8003cf4: 2000 movne r0, #0 + Some(unsafe { intrinsics::unchecked_rem(self, other) }) + 8003cf6: fbb1 f2f3 udivne r2, r1, r3 + 8003cfa: fb02 1213 mlsne r2, r2, r3, r1 + 8003cfe: e9c4 0200 strdne r0, r2, [r4] + other => Some(unsafe { intrinsics::unchecked_div(self, other) }), + 8003d02: fbb1 f0f3 udiv r0, r1, r3 + 8003d06: e02e b.n 8003d66 <__udivmoddi4+0x1ec> + 8003d08: b39a cbz r2, 8003d72 <__udivmoddi4+0x1f8> + 8003d0a: fbb0 f0f2 udiv r0, r0, r2 + 8003d0e: e02a b.n 8003d66 <__udivmoddi4+0x1ec> + 8003d10: 2c00 cmp r4, #0 + small as $Large + 8003d12: bf1e ittt ne + 8003d14: 2300 movne r3, #0 + 8003d16: 4006 andne r6, r0 + 8003d18: e9c4 6300 strdne r6, r3, [r4] + 8003d1c: 2a01 cmp r2, #1 + 8003d1e: d023 beq.n 8003d68 <__udivmoddi4+0x1ee> + intrinsics::cttz(self) as u32 + 8003d20: fa92 f2a2 rbit r2, r2 + 8003d24: fab2 f282 clz r2, r2 + 8003d28: f1c2 0320 rsb r3, r2, #32 + 8003d2c: 40d0 lsrs r0, r2 + 8003d2e: fa01 f303 lsl.w r3, r1, r3 + 8003d32: 4318 orrs r0, r3 + 8003d34: f1a2 0320 sub.w r3, r2, #32 + 8003d38: 2b00 cmp r3, #0 + 8003d3a: bfa8 it ge + 8003d3c: fa21 f003 lsrge.w r0, r1, r3 + 8003d40: fa21 f102 lsr.w r1, r1, r2 + 8003d44: bfa8 it ge + 8003d46: 2100 movge r1, #0 + 8003d48: e00e b.n 8003d68 <__udivmoddi4+0x1ee> + 8003d4a: 2c00 cmp r4, #0 + 8003d4c: bf1c itt ne + 8003d4e: ea06 0201 andne.w r2, r6, r1 + 8003d52: e9c4 0200 strdne r0, r2, [r4] + 8003d56: fa93 f0a3 rbit r0, r3 + 8003d5a: fab0 f080 clz r0, r0 + 8003d5e: f000 001f and.w r0, r0, #31 + 8003d62: fa21 f000 lsr.w r0, r1, r0 + 8003d66: 2100 movs r1, #0 + $($body)* + } + 8003d68: b002 add sp, #8 + 8003d6a: e8bd 0f00 ldmia.w sp!, {r8, r9, sl, fp} + 8003d6e: bdf0 pop {r4, r5, r6, r7, pc} + 8003d70: defe udf #254 ; 0xfe + +#[cfg(test)] +extern crate core; + +fn abort() -> ! { + unsafe { core::intrinsics::abort() } + 8003d72: defe udf #254 ; 0xfe diff --git a/src/lib.rs b/src/lib.rs index 1d7c4405199821bf38eaa0e86c7c4fe987c0c59e..70c44ca02002f5bec956b7c699f93613b33a5fc3 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -34,7 +34,7 @@ pub mod gpio; // pub mod pwm; // pub mod qei; // pub mod rtc; -// pub mod serial; +pub mod serial; // pub mod spi; pub mod time; // pub mod timer; @@ -53,7 +53,12 @@ macro_rules! frequency { use time::*; /// Frequency - pub const FREQUENCY: u32 = $FREQUENCY; + static mut FREQUENCY: u32 = $FREQUENCY; + + /// Set Frequency + pub fn set_frequency(f: u32) { + unsafe {FREQUENCY = f }; + } /// Unit of time #[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd)] @@ -70,43 +75,43 @@ macro_rules! frequency { impl From<Ticks> for Microseconds { fn from(ticks: Ticks) -> Self { - Microseconds(ticks.0 / (FREQUENCY / 1_000_000)) + Microseconds(ticks.0 / (unsafe { FREQUENCY }/ 1_000_000)) } } impl From<Ticks> for Milliseconds { fn from(ticks: Ticks) -> Self { - Milliseconds(ticks.0 / (FREQUENCY / 1_000)) + Milliseconds(ticks.0 / (unsafe { FREQUENCY }/ 1_000)) } } impl From<Ticks> for Seconds { fn from(ticks: Ticks) -> Self { - Seconds(ticks.0 / FREQUENCY) + Seconds(ticks.0 / unsafe { FREQUENCY }) } } impl From<IHertz> for Ticks { fn from(ihz: IHertz) -> Ticks { - Ticks(FREQUENCY / ihz.0) + Ticks(unsafe { FREQUENCY } / ihz.0) } } impl From<Microseconds> for Ticks { fn from(us: Microseconds) -> Ticks { - Ticks(us.0 * (FREQUENCY / 1_000_000)) + Ticks(us.0 * (unsafe { FREQUENCY } / 1_000_000)) } } impl From<Milliseconds> for Ticks { fn from(ms: Milliseconds) -> Ticks { - Ticks(ms.0 * (FREQUENCY / 1_000)) + Ticks(ms.0 * (unsafe { FREQUENCY } / 1_000)) } } impl From<Seconds> for Ticks { fn from(s: Seconds) -> Ticks { - Ticks(s.0 * FREQUENCY) + Ticks(s.0 * unsafe { FREQUENCY }) } } @@ -120,8 +125,7 @@ macro_rules! frequency { /// Advance High-performance Bus (AHB1) pub mod ahb1 { - //frequency!(16_000_000); - frequency!(42_000_000); + frequency!(16_000_000); } /// Advance High-performance Bus (AHB2) diff --git a/src/serial.rs b/src/serial.rs index ef86e05dea2274530f9ff009821fb61cdb6dbf5b..189827771c44259f55f3695137f8c547b890efc7 100644 --- a/src/serial.rs +++ b/src/serial.rs @@ -29,8 +29,7 @@ use cast::u16; use hal; use nb; use static_ref::Static; -use stm32f40x::{gpioa, DMA1, USART1, USART2, USART3, usart6, - /*AFIO, */ GPIOA, GPIOB, RCC}; +use stm32f40x::{gpioa, DMA1, USART1, USART2, USART3, usart6, /*AFIO, */ GPIOA, GPIOB, RCC}; //use dma::{self, Buffer, Dma1Channel4, Dma1Channel5}; @@ -55,10 +54,11 @@ unsafe impl Usart for USART2 { type Ticks = ::apb1::Ticks; } -unsafe impl Usart for USART3 { - type GPIO = GPIOB; - type Ticks = ::apb1::Ticks; -} + +// unsafe impl Usart for USART3 { +// type GPIO = GPIOB; +// type Ticks = ::apb1::Ticks; +// } /// An error #[derive(Debug)] @@ -106,6 +106,7 @@ where { } +/* impl<'a, U> Serial<'a, U> where U: Any + Usart, @@ -115,19 +116,17 @@ where /// /// The serial interface will be configured to use 8 bits of data, 1 stop /// bit, no hardware control and to omit parity checking - pub fn init<B>( - &self, - baud_rate: B, - afio: &AFIO, - dma1: Option<&DMA1>, - gpio: &U::GPIO, - rcc: &RCC, - ) where + /// + /// + + pub fn init<B>(&self, baud_rate: B, dma1: Option<&DMA1>, p::init::Peripherals) + where B: Into<U::Ticks>, { - self._init(baud_rate.into(), afio, dma1, gpio, rcc) + //self._init(baud_rate.into(), afio, dma1, gpio, rcc) } + fn _init( &self, baud_rate: U::Ticks, @@ -335,6 +334,7 @@ where } } } + */ impl<'a, U> hal::serial::Read<u8> for Serial<'a, U> where @@ -343,26 +343,26 @@ where type Error = Error; fn read(&self) -> Result<u8> { - let usart1 = self.0; - let sr = usart1.sr.read(); - - if sr.ore().bit_is_set() { - Err(nb::Error::Other(Error::Overrun)) - } else if sr.ne().bit_is_set() { - Err(nb::Error::Other(Error::Noise)) - } else if sr.fe().bit_is_set() { - Err(nb::Error::Other(Error::Framing)) - } else if sr.rxne().bit_is_set() { - // NOTE(read_volatile) the register is 9 bits big but we'll only - // work with the first 8 bits - Ok(unsafe { - ptr::read_volatile(&usart1.dr as *const _ as *const u8) - }) - } else { - Err(nb::Error::WouldBlock) - } + let usart = self.0; + let sr = usart.sr.read(); + + if sr.ore().bit_is_set() { + Err(nb::Error::Other(Error::Overrun)) + } else if sr.nf().bit_is_set() { + Err(nb::Error::Other(Error::Noise)) + } else if sr.fe().bit_is_set() { + Err(nb::Error::Other(Error::Framing)) + } else if sr.rxne().bit_is_set() { + // NOTE(read_volatile) the register is 9 bits big but we'll only + // work with the first 8 bits + Ok(unsafe { + ptr::read_volatile(&usart.dr as *const _ as *const u8) + }) + } else { + Err(nb::Error::WouldBlock) } } +} impl<'a, U> hal::serial::Write<u8> for Serial<'a, U> where @@ -371,27 +371,26 @@ where type Error = Error; fn write(&self, byte: u8) -> Result<()> { - let usart1 = self.0; - let sr = usart1.sr.read(); - - if sr.ore().bit_is_set() { - Err(nb::Error::Other(Error::Overrun)) - } else if sr.ne().bit_is_set() { - Err(nb::Error::Other(Error::Noise)) - } else if sr.fe().bit_is_set() { - Err(nb::Error::Other(Error::Framing)) - } else if sr.txe().bit_is_set() { - // NOTE(write_volatile) see NOTE in the `read` method - unsafe { - ptr::write_volatile(&usart1.dr as *const _ as *mut u8, byte) - } - Ok(()) - } else { - Err(nb::Error::WouldBlock) - } + let usart = self.0; + let sr = usart.sr.read(); + + if sr.ore().bit_is_set() { + Err(nb::Error::Other(Error::Overrun)) + } else if sr.nf().bit_is_set() { + Err(nb::Error::Other(Error::Noise)) + } else if sr.fe().bit_is_set() { + Err(nb::Error::Other(Error::Framing)) + } else if sr.txe().bit_is_set() { + // NOTE(write_volatile) see NOTE in the `read` method + unsafe { ptr::write_volatile(&usart.dr as *const _ as *mut u8, byte) } + Ok(()) + } else { + Err(nb::Error::WouldBlock) + } } } + /* impl<'a> Serial<'a, USART1> { /// Starts a DMA transfer to receive serial data into a `buffer` /// @@ -399,6 +398,7 @@ impl<'a> Serial<'a, USART1> { /// The `buffer` can be `release`d after the DMA transfer finishes // TODO support circular mode + half transfer interrupt as a double // buffering mode + pub fn read_exact<B>( &self, dma1: &DMA1, @@ -425,7 +425,7 @@ impl<'a> Serial<'a, USART1> { Ok(()) } - + /// Starts a DMA transfer to send `buffer` through this serial port /// /// This will immutably lock the `buffer` preventing mutably borrowing its @@ -457,3 +457,4 @@ impl<'a> Serial<'a, USART1> { Ok(()) } } + */ diff --git a/stlink-v2-1.cfg b/stlink-v2-1.cfg new file mode 100644 index 0000000000000000000000000000000000000000..093e80177078667dbc03e166ac5d7e997086b4f2 --- /dev/null +++ b/stlink-v2-1.cfg @@ -0,0 +1,16 @@ +# +# STMicroelectronics ST-LINK/V2-1 in-circuit debugger/programmer +# + +interface hla +hla_layout stlink +hla_device_desc "ST-LINK/V2-1" +hla_vid_pid 0x0483 0x374b + +# Optionally specify the serial number of ST-LINK/V2 usb device. ST-LINK/V2 +# devices seem to have serial numbers with unreadable characters. ST-LINK/V2 +# firmware version >= V2.J21.S4 recommended to avoid issues with adapter serial +# number reset issues. +# eg. +#hla_serial "\xaa\xbc\x6e\x06\x50\x75\xff\x55\x17\x42\x19\x3f" + diff --git a/stm32f4x.cfg b/stm32f4x.cfg new file mode 100644 index 0000000000000000000000000000000000000000..7a0af9fba0d24845b101207283327c766aacf22b --- /dev/null +++ b/stm32f4x.cfg @@ -0,0 +1,106 @@ +# script for stm32f4x family + +# +# stm32 devices support both JTAG and SWD transports. +# +source [find target/swj-dp.tcl] +source [find mem_helper.tcl] + +if { [info exists CHIPNAME] } { + set _CHIPNAME $CHIPNAME +} else { + set _CHIPNAME stm32f4x +} + +set _ENDIAN little + +# Work-area is a space in RAM used for flash programming +# By default use 32kB (Available RAM in smallest device STM32F410) +if { [info exists WORKAREASIZE] } { + set _WORKAREASIZE $WORKAREASIZE +} else { + set _WORKAREASIZE 0x8000 +} + +#jtag scan chain +if { [info exists CPUTAPID] } { + set _CPUTAPID $CPUTAPID +} else { + if { [using_jtag] } { + # See STM Document RM0090 + # Section 38.6.3 - corresponds to Cortex-M4 r0p1 + set _CPUTAPID 0x4ba00477 + } { + set _CPUTAPID 0x2ba01477 + } +} + +swj_newdap $_CHIPNAME cpu -irlen 4 -ircapture 0x1 -irmask 0xf -expected-id $_CPUTAPID + +if {[using_jtag]} { + jtag newtap $_CHIPNAME bs -irlen 5 +} + +set _TARGETNAME $_CHIPNAME.cpu +target create $_TARGETNAME cortex_m -endian $_ENDIAN -chain-position $_TARGETNAME + +$_TARGETNAME configure -work-area-phys 0x20000000 -work-area-size $_WORKAREASIZE -work-area-backup 0 + +set _FLASHNAME $_CHIPNAME.flash +flash bank $_FLASHNAME stm32f2x 0 0 0 0 $_TARGETNAME + +# JTAG speed should be <= F_CPU/6. F_CPU after reset is 16MHz, so use F_JTAG = 2MHz +# +# Since we may be running of an RC oscilator, we crank down the speed a +# bit more to be on the safe side. Perhaps superstition, but if are +# running off a crystal, we can run closer to the limit. Note +# that there can be a pretty wide band where things are more or less stable. +adapter_khz 2000 + +adapter_nsrst_delay 100 +if {[using_jtag]} { + jtag_ntrst_delay 100 +} + +reset_config srst_nogate + +if {![using_hla]} { + # if srst is not fitted use SYSRESETREQ to + # perform a soft reset + cortex_m reset_config sysresetreq +} + +$_TARGETNAME configure -event examine-end { + # Enable debug during low power modes (uses more power) + # DBGMCU_CR |= DBG_STANDBY | DBG_STOP | DBG_SLEEP + mmw 0xE0042004 0x00000007 0 + + # Stop watchdog counters during halt + # DBGMCU_APB1_FZ |= DBG_IWDG_STOP | DBG_WWDG_STOP + mmw 0xE0042008 0x00001800 0 +} + +$_TARGETNAME configure -event trace-config { + # Set TRACE_IOEN; TRACE_MODE is set to async; when using sync + # change this value accordingly to configure trace pins + # assignment + mmw 0xE0042004 0x00000020 0 +} + +$_TARGETNAME configure -event reset-init { + # Configure PLL to boost clock to HSI x 4 (64 MHz) + mww 0x40023804 0x08012008 ;# RCC_PLLCFGR 16 Mhz /8 (M) * 128 (N) /4(P) + mww 0x40023C00 0x00000102 ;# FLASH_ACR = PRFTBE | 2(Latency) + mmw 0x40023800 0x01000000 0 ;# RCC_CR |= PLLON + sleep 10 ;# Wait for PLL to lock + mmw 0x40023808 0x00001000 0 ;# RCC_CFGR |= RCC_CFGR_PPRE1_DIV2 + mmw 0x40023808 0x00000002 0 ;# RCC_CFGR |= RCC_CFGR_SW_PLL + + # Boost JTAG frequency + adapter_khz 8000 +} + +$_TARGETNAME configure -event reset-start { + # Reduce speed since CPU speed will slow down to 16MHz with the reset + adapter_khz 2000 +}