-
Notifications
You must be signed in to change notification settings - Fork 1.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
cranelift: 32bit div_s, rem_u, rem_s for aarch64 #9850
base: main
Are you sure you want to change the base?
Conversation
63ec4cf
to
99fa5b2
Compare
99fa5b2
to
bf30367
Compare
26cc570
to
048e050
Compare
1c6ea59
to
ae4061b
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks good, thanks a bunch! Very nice to see the test expectations get shorter. A few thoughts below but nothing major.
(load_constant64_full $I64 extend n)) | ||
|
||
;; Fallback for integral 32-bit constants | ||
(rule -1 (imm (integral_ty ty) extend n) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can we say (fits_in_32 ty)
rather than ty
here, and make this the higher-priority case (so 64-bit is the fallback)? That seems a little cleaner to me than the implicit "everything not I64
is smaller than 64 bits" here (and less likely to break if we try to do other things like support I128
more fully in the future).
@@ -758,7 +758,7 @@ impl MachInstEmit for Inst { | |||
ALUOp::EorNot => 0b01001010_001, | |||
ALUOp::AddS => 0b00101011_000, | |||
ALUOp::SubS => 0b01101011_000, | |||
ALUOp::SDiv => 0b10011010_110, | |||
ALUOp::SDiv => 0b00011010_110, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can we merge the SDiv
and UDiv
cases now?
;; Helper for placing a `Value` into a `Reg` and validating that it's nonzero. | ||
(decl put_nonzero_in_reg (Value) Reg) | ||
;; It takes a value and entension type, and perform emits the appropriate checks. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
s/entension/extension/
s/perform/performs/
;; Helper for placing a `Value` into a `Reg` and validating that it's nonzero. | ||
(decl put_nonzero_in_reg (Value) Reg) | ||
;; It takes a value and entension type, and perform emits the appropriate checks. | ||
;; TODO: restore spec |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
cc @avanhatt @mmcloughlin -- maybe the first instance of active work on the aarch64 backend that needs to update a spec. I definitely don't think we should block this PR on it (so don't worry about this, @MarinPostma!) but it's worth thinking what our short and medium term approaches will be to this since we're upstreamed but don't have a nice CI-integrated workflow yet -- should we keep a queue of such TODOs somewhere?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
about that: I meant to restore them at some point, but I don't know how to run the verification
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yep, the integration with the normal dev workflow is still very much an open question; we could have you ramp up on that but I don't think it's at the point that we want to require that of everyone yet.
let value = match extend_to { | ||
OperandSize::Size32 => { | ||
if bits < 32 { | ||
if *extend == generated_code::ImmExtend::Sign { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
can we make this a match
(with Sign
and Zero
cases)?
}, | ||
OperandSize::Size64 => { | ||
if bits < 64 { | ||
if *extend == generated_code::ImmExtend::Sign { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Likewise here, and we can pull the if bits < 64
in as a guard on one of the match arms as well.
@@ -438,6 +438,7 @@ fn check_addr<'a>( | |||
if ctx.subsumes_fact_optionals(loaded_fact.as_ref(), result_fact) { | |||
Ok(()) | |||
} else { | |||
dbg!(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Debugging code left in?
hey @cfallin, fixing a bunch of stuff, that's why I put it in draft, but I'll include your review, as soon I manage to fix the tests :) |
Subscribe to Label Action
This issue or pull request has been labeled: "cranelift", "cranelift:area:aarch64", "isle"
Thus the following users have been cc'd because of the following labels:
To subscribe or unsubscribe from this label, edit the |
followup to #9798 where I did the ground work for 32bit division, this PR extends 32bits optimizations to rem_u, rem_s and div_s.
This should close #9766.