Skip to content
This repository has been archived by the owner on Jan 29, 2025. It is now read-only.

Commit

Permalink
[msl-out] Move Statement::Store handling into its own function.
Browse files Browse the repository at this point in the history
  • Loading branch information
jimblandy committed Dec 3, 2021
1 parent 5887772 commit 4f6ecda
Showing 1 changed file with 55 additions and 43 deletions.
98 changes: 55 additions & 43 deletions src/back/msl/writer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1587,49 +1587,7 @@ impl<W: Write> Writer<W> {
}
}
crate::Statement::Store { pointer, value } => {
let pointer_info = &context.expression.info[pointer];
let (array_size, is_atomic) =
match *pointer_info.ty.inner_with(&context.expression.module.types) {
crate::TypeInner::Pointer { base, .. } => {
match context.expression.module.types[base].inner {
crate::TypeInner::Array {
size: crate::ArraySize::Constant(ch),
..
} => (Some(ch), false),
crate::TypeInner::Atomic { .. } => (None, true),
_ => (None, false),
}
}
_ => (None, false),
};

// we can't assign fixed-size arrays
if let Some(const_handle) = array_size {
let size = context.expression.module.constants[const_handle]
.to_array_length()
.unwrap();
write!(self.out, "{}for(int _i=0; _i<{}; ++_i) ", level, size)?;
self.put_expression(pointer, &context.expression, true)?;
write!(self.out, ".{}[_i] = ", WRAPPED_ARRAY_FIELD)?;
self.put_expression(value, &context.expression, true)?;
writeln!(self.out, ".{}[_i];", WRAPPED_ARRAY_FIELD)?;
} else if is_atomic {
write!(
self.out,
"{}{}::atomic_store_explicit({}",
level, NAMESPACE, ATOMIC_REFERENCE
)?;
self.put_expression(pointer, &context.expression, true)?;
write!(self.out, ", ")?;
self.put_expression(value, &context.expression, true)?;
writeln!(self.out, ", {}::memory_order_relaxed);", NAMESPACE)?;
} else {
write!(self.out, "{}", level)?;
self.put_expression(pointer, &context.expression, true)?;
write!(self.out, " = ")?;
self.put_expression(value, &context.expression, true)?;
writeln!(self.out, ";")?;
}
self.put_store(pointer, value, level, context)?
}
crate::Statement::ImageStore {
image,
Expand Down Expand Up @@ -1766,6 +1724,60 @@ impl<W: Write> Writer<W> {
Ok(())
}

fn put_store(
&mut self,
pointer: Handle<crate::Expression>,
value: Handle<crate::Expression>,
level: back::Level,
context: &StatementContext,
) -> BackendResult {
let pointer_info = &context.expression.info[pointer];
let (array_size, is_atomic) =
match *pointer_info.ty.inner_with(&context.expression.module.types) {
crate::TypeInner::Pointer { base, .. } => {
match context.expression.module.types[base].inner {
crate::TypeInner::Array {
size: crate::ArraySize::Constant(ch),
..
} => (Some(ch), false),
crate::TypeInner::Atomic { .. } => (None, true),
_ => (None, false),
}
}
_ => (None, false),
};

// we can't assign fixed-size arrays
if let Some(const_handle) = array_size {
let size = context.expression.module.constants[const_handle]
.to_array_length()
.unwrap();
write!(self.out, "{}for(int _i=0; _i<{}; ++_i) ", level, size)?;
self.put_expression(pointer, &context.expression, true)?;
write!(self.out, ".{}[_i] = ", WRAPPED_ARRAY_FIELD)?;
self.put_expression(value, &context.expression, true)?;
writeln!(self.out, ".{}[_i];", WRAPPED_ARRAY_FIELD)?;
} else if is_atomic {
write!(
self.out,
"{}{}::atomic_store_explicit({}",
level, NAMESPACE, ATOMIC_REFERENCE
)?;
self.put_expression(pointer, &context.expression, true)?;
write!(self.out, ", ")?;
self.put_expression(value, &context.expression, true)?;
writeln!(self.out, ", {}::memory_order_relaxed);", NAMESPACE)?;
} else {
write!(self.out, "{}", level)?;
self.put_expression(pointer, &context.expression, true)?;
write!(self.out, " = ")?;
self.put_expression(value, &context.expression, true)?;
writeln!(self.out, ";")?;
}

Ok(())
}

pub fn write(
&mut self,
module: &crate::Module,
Expand Down

0 comments on commit 4f6ecda

Please sign in to comment.