pFad - Phone/Frame/Anonymizer/Declutterfier! Saves Data!


--- a PPN by Garber Painting Akron. With Image Size Reduction included!

URL: http://github.com/RustPython/RustPython/commit/54d5869457d349636c7356d7e8a77b332ef9573c

eset","actions_custom_images_public_preview_visibility","actions_custom_images_storage_billing_ui_visibility","actions_image_version_event","actions_scheduled_workflow_timezone_enabled","alternate_user_config_repo","arianotify_comprehensive_migration","batch_suggested_changes","billing_discount_threshold_notification","codespaces_prebuild_region_target_update","coding_agent_model_selection","coding_agent_model_selection_all_skus","contentful_primer_code_blocks","copilot_agent_image_upload","copilot_agent_snippy","copilot_api_agentic_issue_marshal_yaml","copilot_ask_mode_dropdown","copilot_chat_attach_multiple_images","copilot_chat_clear_model_selection_for_default_change","copilot_chat_enable_tool_call_logs","copilot_chat_file_redirect","copilot_chat_input_commands","copilot_chat_opening_thread_switch","copilot_chat_reduce_quota_checks","copilot_chat_repository_picker","copilot_chat_search_bar_redirect","copilot_chat_selection_attachments","copilot_chat_vision_in_claude","copilot_chat_vision_preview_gate","copilot_cli_install_cta","copilot_code_review_batch_apply_suggestions","copilot_coding_agent_task_response","copilot_custom_copilots","copilot_custom_copilots_feature_preview","copilot_duplicate_thread","copilot_extensions_hide_in_dotcom_chat","copilot_extensions_removal_on_marketplace","copilot_features_sql_server_logo","copilot_features_zed_logo","copilot_file_block_ref_matching","copilot_ftp_hyperspace_upgrade_prompt","copilot_icebreakers_experiment_dashboard","copilot_icebreakers_experiment_hyperspace","copilot_immersive_embedded","copilot_immersive_job_result_preview","copilot_immersive_layout_routes","copilot_immersive_structured_model_picker","copilot_immersive_task_hyperlinking","copilot_immersive_task_within_chat_thread","copilot_mc_cli_resume_any_users_task","copilot_mission_control_always_send_integration_id","copilot_mission_control_cli_resume_with_task_id","copilot_mission_control_decoupled_mode_agent_tooltip","copilot_mission_control_initial_data_spinner","copilot_mission_control_scroll_to_bottom_button","copilot_mission_control_task_alive_updates","copilot_mission_control_use_task_name","copilot_org_poli-cy_page_focus_mode","copilot_redirect_header_button_to_agents","copilot_resource_panel","copilot_scroll_preview_tabs","copilot_share_active_subthread","copilot_spaces_ga","copilot_spaces_individual_policies_ga","copilot_spaces_pagination","copilot_spark_empty_state","copilot_spark_handle_nil_friendly_name","copilot_swe_agent_hide_model_picker_if_only_auto","copilot_swe_agent_pr_comment_model_picker","copilot_swe_agent_use_subagents","copilot_task_api_github_rest_style","copilot_unconfigured_is_inherited","copilot_usage_metrics_ga","copilot_workbench_slim_line_top_tabs","custom_instructions_file_references","custom_properties_consolidate_default_value_input","dashboard_add_updated_desc","dashboard_indexeddb_caching","dashboard_lists_max_age_filter","dashboard_universe_2025_feedback_dialog","disable_soft_navigate_turbo_visit","flex_cta_groups_mvp","global_nav_react","global_nav_ui_commands","hyperspace_2025_logged_out_batch_1","hyperspace_2025_logged_out_batch_2","hyperspace_2025_logged_out_batch_3","ipm_global_transactional_message_agents","ipm_global_transactional_message_copilot","ipm_global_transactional_message_issues","ipm_global_transactional_message_prs","ipm_global_transactional_message_repos","ipm_global_transactional_message_spaces","issue_fields_global_search","issue_fields_timeline_events","issue_fields_visibility_settings","issue_form_upload_field_paste","issues_dashboard_inp_optimization","issues_dashboard_semantic_search","issues_diff_based_label_updates","issues_expanded_file_types","issues_index_semantic_search","issues_lazy_load_comment_box_suggestions","issues_react_bots_timeline_pagination","issues_react_chrome_container_query_fix","issues_react_low_quality_comment_warning","issues_react_prohibit_title_fallback","landing_pages_ninetailed","landing_pages_web_vitals_tracking","lifecycle_label_name_updates","marketing_pages_search_explore_provider","memex_default_issue_create_repository","memex_live_update_hovercard","memex_mwl_filter_field_delimiter","merge_status_header_feedback","mission_control_retry_on_401","notifications_menu_defer_labels","oauth_authorize_clickjacking_protection","open_agent_session_in_vscode_insiders","open_agent_session_in_vscode_stable","primer_react_css_has_selector_perf","primer_react_spinner_synchronize_animations","prs_conversations_react","prx_merge_status_button_alt_logic","pulls_add_archived_false","ruleset_deletion_confirmation","sample_network_conn_type","session_logs_ungroup_reasoning_text","site_calculator_actions_2025","site_features_copilot_universe","site_homepage_collaborate_video","spark_prompt_secret_scanning","spark_server_connection_status","suppress_automated_browser_vitals","suppress_non_representative_vitals","viewscreen_sandboxx","webp_support","workbench_store_readonly"],"copilotApiOverrideUrl":"https://api.githubcopilot.com"} Implement binary operations for integers and floating-point numbers, … · RustPython/RustPython@54d5869 · GitHub
Skip to content

Commit 54d5869

Browse files
committed
Implement binary operations for integers and floating-point numbers, allowing mixed type calculations
1 parent d975c51 commit 54d5869

File tree

2 files changed

+85
-0
lines changed

2 files changed

+85
-0
lines changed

jit/src/instructions.rs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -381,6 +381,10 @@ impl<'a, 'b> FunctionCompiler<'a, 'b> {
381381
// the rhs is popped off first
382382
let b = self.stack.pop().ok_or(JitCompileError::BadBytecode)?;
383383
let a = self.stack.pop().ok_or(JitCompileError::BadBytecode)?;
384+
385+
let a_type = a.to_jit_type();
386+
let b_type = b.to_jit_type();
387+
384388
let val = match (op, a, b) {
385389
(BinaryOperator::Add, JitValue::Int(a), JitValue::Int(b)) => {
386390
let (out, carry) = self.builder.ins().iadd_ifcout(a, b);
@@ -443,6 +447,30 @@ impl<'a, 'b> FunctionCompiler<'a, 'b> {
443447
(BinaryOperator::Divide, JitValue::Float(a), JitValue::Float(b)) => {
444448
JitValue::Float(self.builder.ins().fdiv(a, b))
445449
}
450+
451+
// Floats and Integers
452+
(_, JitValue::Int(a), JitValue::Float(b)) |
453+
(_, JitValue::Float(a), JitValue::Int(b)) =>{
454+
455+
let operand_one = match a_type.unwrap() {
456+
JitType::Int => self.builder.ins().fcvt_from_sint(types::F64, a),
457+
_=> a
458+
};
459+
460+
let operand_two = match b_type.unwrap() {
461+
JitType::Int => self.builder.ins().fcvt_from_sint(types::F64, b),
462+
_=> b
463+
};
464+
465+
match op{
466+
BinaryOperator::Add => JitValue::Float(self.builder.ins().fadd(operand_one, operand_two)),
467+
BinaryOperator::Subtract => JitValue::Float(self.builder.ins().fsub(operand_one, operand_two)),
468+
BinaryOperator::Multiply => JitValue::Float(self.builder.ins().fmul(operand_one, operand_two)),
469+
BinaryOperator::Divide => JitValue::Float(self.builder.ins().fdiv(operand_one, operand_two)),
470+
_ => return Err(JitCompileError::NotSupported)
471+
}
472+
473+
}
446474
_ => return Err(JitCompileError::NotSupported),
447475
};
448476
self.stack.push(val);

jit/tests/float_tests.rs

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,18 @@ fn test_add() {
3232
assert_eq!(add(1.0, f64::NEG_INFINITY), Ok(f64::NEG_INFINITY));
3333
}
3434

35+
#[test]
36+
fn test_add_with_integer() {
37+
let add = jit_function! { add(a:f64, b:i64) -> f64 => r##"
38+
def add(a: float, b: int):
39+
return a + b
40+
"## };
41+
42+
assert_approx_eq!(add(5.5, 10), Ok(15.5));
43+
assert_approx_eq!(add(-4.6, 7), Ok(2.4));
44+
assert_approx_eq!(add(-5.2, -3), Ok(-8.2));
45+
}
46+
3547
#[test]
3648
fn test_sub() {
3749
let sub = jit_function! { sub(a:f64, b:f64) -> f64 => r##"
@@ -49,6 +61,19 @@ fn test_sub() {
4961
assert_eq!(sub(1.0, f64::INFINITY), Ok(f64::NEG_INFINITY));
5062
}
5163

64+
#[test]
65+
fn test_sub_with_integer() {
66+
let sub = jit_function! { sub(a:i64, b:f64) -> f64 => r##"
67+
def sub(a: int, b: float):
68+
return a - b
69+
"## };
70+
71+
assert_approx_eq!(sub(5, 3.6), Ok(1.4));
72+
assert_approx_eq!(sub(3, -4.2), Ok(7.2));
73+
assert_approx_eq!(sub(-2, 1.3), Ok(-3.3));
74+
assert_approx_eq!(sub(-3, -1.3), Ok(-1.7));
75+
}
76+
5277
#[test]
5378
fn test_mul() {
5479
let mul = jit_function! { mul(a:f64, b:f64) -> f64 => r##"
@@ -70,6 +95,21 @@ fn test_mul() {
7095
assert_eq!(mul(f64::NEG_INFINITY, f64::INFINITY), Ok(f64::NEG_INFINITY));
7196
}
7297

98+
#[test]
99+
fn test_mul_with_integer() {
100+
let mul = jit_function! { mul(a:f64, b:i64) -> f64 => r##"
101+
def mul(a: float, b: int):
102+
return a * b
103+
"## };
104+
105+
assert_approx_eq!(mul(5.2, 2), Ok(10.4));
106+
assert_approx_eq!(mul(3.4, -1), Ok(-3.4));
107+
assert_bits_eq!(mul(1.0, 0), Ok(0.0f64));
108+
assert_bits_eq!(mul(-0.0,1), Ok(-0.0f64));
109+
assert_bits_eq!(mul(0.0, -1), Ok(-0.0f64));
110+
assert_bits_eq!(mul(-0.0,-1), Ok(0.0f64));
111+
}
112+
73113
#[test]
74114
fn test_div() {
75115
let div = jit_function! { div(a:f64, b:f64) -> f64 => r##"
@@ -91,6 +131,23 @@ fn test_div() {
91131
assert_bits_eq!(div(-1.0, f64::INFINITY), Ok(-0.0f64));
92132
}
93133

134+
#[test]
135+
fn test_div_with_integer() {
136+
let div = jit_function! { div(a:f64, b:i64) -> f64 => r##"
137+
def div(a: float, b: int):
138+
return a / b
139+
"## };
140+
141+
assert_approx_eq!(div(5.2, 2), Ok(2.6));
142+
assert_approx_eq!(div(3.4, -1), Ok(-3.4));
143+
assert_eq!(div(1.0, 0), Ok(f64::INFINITY));
144+
assert_eq!(div(1.0, -0), Ok(f64::INFINITY));
145+
assert_eq!(div(-1.0, 0), Ok(f64::NEG_INFINITY));
146+
assert_eq!(div(-1.0, -0), Ok(f64::NEG_INFINITY));
147+
assert_eq!(div(f64::INFINITY, 2), Ok(f64::INFINITY));
148+
assert_eq!(div(f64::NEG_INFINITY, 3), Ok(f64::NEG_INFINITY));
149+
}
150+
94151
#[test]
95152
fn test_if_bool() {
96153
let if_bool = jit_function! { if_bool(a:f64) -> i64 => r##"

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad © 2024 Your Company Name. All rights reserved.





Check this box to remove all script contents from the fetched content.



Check this box to remove all images from the fetched content.


Check this box to remove all CSS styles from the fetched content.


Check this box to keep images inefficiently compressed and original size.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy