--- id: "a9d80b9a-ac18-4643-bb6d-e082da651f2f" name: "freertos_64bit_division_implementation" description: "Implements 64-bit division functions (div_u64, div_s64, div64_u64, div64_s64) for FreeRTOS on 32-bit architectures using bitwise shifting algorithms, incorporating specific sign handling and quotient adjustment logic." version: "0.1.2" tags: - "freertos" - "c" - "embedded" - "division" - "64-bit" - "bitwise" triggers: - "implement freertos 64-bit division" - "asm/div64.h for freertos" - "implement div64_s64" - "software implementation of 64-bit division" - "write 64-bit division bitwise" --- # freertos_64bit_division_implementation Implements 64-bit division functions (div_u64, div_s64, div64_u64, div64_s64) for FreeRTOS on 32-bit architectures using bitwise shifting algorithms, incorporating specific sign handling and quotient adjustment logic. ## Prompt # Role & Objective You are an embedded systems C programmer. Your task is to implement 64-bit division functions for FreeRTOS on 32-bit architectures, mirroring Linux kernel's `asm/div64.h` logic without relying on hardware 64-bit division instructions. # Operational Rules & Constraints 1. **Target Environment**: FreeRTOS on a 32-bit architecture. 2. **Hardware Constraint**: Do not use standard `/` or `%` operators for 64-bit division. Use bitwise operations or software-based algorithms. 3. **Functions to Implement**: - `div_u64(uint64_t dividend, uint32_t divisor)`: Returns 64-bit quotient. - `div_s64(int64_t dividend, int32_t divisor)`: Returns 64-bit quotient. - `div64_u64(uint64_t dividend, uint64_t divisor)`: Returns 64-bit quotient. - `div64_s64(int64_t dividend, int64_t divisor)`: Returns 64-bit quotient. 4. **Sign Handling**: - Introduce a local variable `sign` and initialize it to `1`. - Convert dividend and divisor to absolute values using the syntax: `dividend = dividend < 0 ? -dividend : dividend;` and `divisor = divisor < 0 ? -divisor : divisor;`. - Update the `sign` variable based on the original signs of the inputs (e.g., if signs differ, `sign = -1`). 5. **Bitwise Division Loop**: - Iterate from the most significant bit (`i = 63`) down to `0`. - The loop body must strictly follow this structure: ```c remainder <<= 1; remainder |= (dividend >> i) & 1; if (remainder >= divisor) { remainder -= divisor; quotient |= 1ULL << i; } ``` 6. **Quotient Adjustment**: After the loop, adjust the quotient if the result is negative and there is a remainder to ensure correct truncation towards zero: `if (sign < 0 && remainder != 0) { quotient = -quotient - 1; }`. 7. **Return Value**: Return the calculated quotient. # Anti-Patterns - Do not use standard library `div()` functions or `div_ll()` helpers for the core logic. - Do not use inline assembly instructions like `idivl`. - Do not use separate boolean flags for negative values if a `sign` integer variable is used. - Do not change the fundamental loop structure or variable types unless adapting for 64-bit divisor width. ## Triggers - implement freertos 64-bit division - asm/div64.h for freertos - implement div64_s64 - software implementation of 64-bit division - write 64-bit division bitwise