UINT64 __aeabi_uldivmod(unsigned numerator, unsigned denominator) { UINT64 Return; Return = __udivsi3 (numerator, denominator); Return |= LShiftU64 (__umodsi3 (numerator, denominator), 32); return Return; }
int test__umodsi3(su_int a, su_int b, su_int expected_r) { su_int r = __umodsi3(a, b); if (r != expected_r) printf("error in __umodsi3: %X %% %X = %X, expected %X\n", a, b, r, expected_r); return r != expected_r; }
void final_damagecalc_cmd7() { battlescripts_curr_instruction++; if (damage_loc == 0) damage_loc = 1; if (!affected_by_substitute(bank_target)) { u16 target_hp = battle_participants[bank_target].current_hp; if (protect_structs[bank_target].flag0_endure && damage_loc > target_hp) { damage_loc = target_hp - 1; move_outcome.endured = 1; } else if ((current_move == MOVE_FALSE_SWIPE || current_move == MOVE_HOLD_BACK) && damage_loc > target_hp && !(move_outcome.failed || move_outcome.missed || move_outcome.not_affected)) { damage_loc = target_hp - 1; } else if (battle_participants[bank_target].ability_id == ABILITY_STURDY && has_ability_effect(bank_target, 1, 1) && damage_loc > target_hp && target_hp == battle_participants[bank_target].max_hp) { damage_loc = target_hp - 1; move_outcome.sturdied = 1; } else { switch (get_item_effect(bank_target, 1)) { case ITEM_EFFECT_FOCUSSASH: if (damage_loc > target_hp && target_hp == battle_participants[bank_target].max_hp) { damage_loc = target_hp - 1; move_outcome.hanged_on_using_item = 1; last_used_item = battle_participants[bank_target].held_item; battle_participants[bank_target].held_item = 0; active_bank = bank_target; prepare_setattributes_in_battle(0, 2, 0, 2, &battle_participants[bank_target].held_item); mark_buffer_bank_for_execution(bank_target); } break; case ITEM_EFFECT_FOCUSBAND: if (damage_loc > target_hp && (__umodsi3(rng(), 100) + 1) < get_all_item_quality(bank_target)) { damage_loc = target_hp - 1; move_outcome.hanged_on_using_item = 1; last_used_item = battle_participants[bank_target].held_item; } break; } } } return; }
void atk07_final_dmg_calc(void) { if (battle_execution_buffer) {return;} battlescripts_curr_instruction++; if(battle_participants[bank_target].species == POKE_MIMIKKYU && check_ability(bank_target,ABILITY_DISGUISE) && has_ability_effect(bank_target, 1, 1) && MOVE_WORKED && !affected_by_substitute(bank_target)) { new_battlestruct->various.bust_mimikyu = 1; damage_loc = 0; move_outcome.super_effective = 0; move_outcome.not_very_effective = 0; move_outcome.one_hit_ko = 0; } else { if (new_battlestruct->various.berry_damage_redux) { u16 item = battle_participants[bank_target].held_item; new_battlestruct->various.berry_damage_redux = 0; if (MOVE_WORKED && DAMAGING_MOVE(current_move) && item) { battle_scripting.active_bank = bank_target; last_used_item = item; bs_push_current(BS_BERRY_DMG_REDUCE); setup_berry_consume_buffers(bank_target); } } damage_loc = ATLEAST_ONE(damage_loc); if (!affected_by_substitute(bank_target)) { u16 target_hp = battle_participants[bank_target].current_hp; if (protect_structs[bank_target].flag0_endure && damage_loc > target_hp) { damage_loc = target_hp - 1; move_outcome.endured = 1; } else if ((current_move == MOVE_FALSE_SWIPE || current_move == MOVE_HOLD_BACK) && damage_loc > target_hp && !(move_outcome.failed || move_outcome.missed || move_outcome.not_affected)) { damage_loc = target_hp - 1; } else if (battle_participants[bank_target].ability_id == ABILITY_STURDY && has_ability_effect(bank_target, 1, 1) && damage_loc > target_hp && target_hp == battle_participants[bank_target].max_hp) { damage_loc = target_hp - 1; move_outcome.sturdied = 1; } else { switch (get_item_effect(bank_target, 1)) { case ITEM_EFFECT_FOCUSSASH: if (damage_loc > target_hp && target_hp == battle_participants[bank_target].max_hp) { damage_loc = target_hp - 1; move_outcome.hanged_on_using_item = 1; last_used_item = battle_participants[bank_target].held_item; battle_participants[bank_target].held_item = 0; active_bank = bank_target; bb2_setattributes_in_battle(0, 2, 0, 2, &battle_participants[bank_target].held_item); mark_buffer_bank_for_execution(bank_target); } break; case ITEM_EFFECT_FOCUSBAND: if (damage_loc > target_hp && (__umodsi3(rng(), 100) + 1) < get_all_item_quality(bank_target)) { damage_loc = target_hp - 1; move_outcome.hanged_on_using_item = 1; last_used_item = battle_participants[bank_target].held_item; } break; } } } } }
int main() { // Shift left 64 bits, less than 32 bit shift, unsigned value print64bit(__ashldi3(0x1257493827394374LL, 3)); // CHECK: 0x92ba49c139ca1ba0 // Shift left 64 bits, more than 32 bit shift, unsigned value print64bit(__ashldi3(0x1257493827394374LL, 34)); // CHECK: 0x9ce50dd000000000 // Logical shift right 64 bits, less than 32 bit shift, unsigned value print64bit(__lshrdi3(0x1d348856d51c4737LL, 7)); // CHECK: 0x003a6910adaa388e // Signed value print64bit(__lshrdi3(0xfd348856d51c4737LL, 7)); // CHECK: 0x01fa6910adaa388e // Logical shift right 64 bits, more than 32 bit shift, unsigned value print64bit(__lshrdi3(0x1d348856d51c4737LL, 37)); // CHECK: 0x0000000000e9a442 // Signed value print64bit(__lshrdi3(0xfd348856d51c4737LL, 37)); // CHECK: 0x0000000007e9a442 // Unsigned 32 bit integer division, signed value printf("0x%08x\n", __udivsi3(0xf39eca1b, 17)); // CHECK: 0x0e54a27a // Unsigned value printf("0x%08x\n", __udivsi3(0x5b0a6c63, 17)); // CHECK: 0x055af751 // Signed 32 bit integer division, signed value printf("0x%08x\n", __divsi3(0xf39eca1b, 17)); // CHECK: 0xff45936b // Unsigned value printf("0x%08x\n", __divsi3(0x539eca1b, 17)); // CHECK: 0x04eb3910 // Unsigned 32 bit integer modulus, signed value printf("0x%08x\n", __umodsi3(0xf39eca1b, 495)); // CHECK: 0x000001d1 // Unsigned value printf("0x%08x\n", __umodsi3(0x539eca1b, 495)); // CHECK: 0x000000d7 // Signed 32 bit integer modulus, signed value printf("0x%08x\n", __modsi3(0xf39eca1b, 495)); // CHECK: 0xfffffeb5 // Unsigned value printf("0x%08x\n", __modsi3(0x539eca1b, 495)); // CHECK: 0x000000d7 // Unsigned 64 bit integer division, signed value print64bit(__udivdi3(0xf3c367523e29230aLL, 495)); // CHECK: 0x007e114680625881 // Unsigned value print64bit(__udivdi3(0x53c367523e29230aLL, 495)); // CHECK: 0x002b51ebff175b17 // Signed 64 bit integer division, signed value print64bit(__divdi3(0xf3c367523e29230aLL, 495)); // CHECK: 0xfff9abe8e4b72972 // Unsigned value print64bit(__divdi3(0x53c367523e29230aLL, 495)); // CHECK: 0x002b51ebff175b17 // Unsigned 64 bit integer modulus, signed value print64bit(__umoddi3(0xf3c367523e29230aLL, 495)); // CHECK: 0x000000000000019b // Unsigned value print64bit(__umoddi3(0x53c367523e29230aLL, 495)); // CHECK: 0x0000000000000191 // Signed 64 bit integer modulus, signed value print64bit(__moddi3(0xf3c367523e29230aLL, 495)); // CHECK: 0xffffffffffffff9c // Unsigned value print64bit(__moddi3(0x53c367523e29230aLL, 495)); // CHECK: 0x0000000000000191 // Convert 64 bit value to float, greater than > 32 bits printfloathex(__floatundisf(1674874919848732277LL)); // CHECK: 0x5db9f2cf // < 32 bits printfloathex(__floatundisf(1674877LL)); // CHECK: 0x49cc73e8 }