Jlm
slice.hpp
Go to the documentation of this file.
1 /*
2  * Copyright 2014 Helge Bahmann <hcb@chaoticmind.net>
3  * Copyright 2011 2012 2013 2014 Nico Reißmann <nico.reissmann@gmail.com>
4  * See COPYING for terms of redistribution.
5  */
6 
7 #ifndef JLM_RVSDG_BITSTRING_SLICE_HPP
8 #define JLM_RVSDG_BITSTRING_SLICE_HPP
9 
11 #include <jlm/rvsdg/node.hpp>
12 #include <jlm/rvsdg/unary.hpp>
13 
14 namespace jlm::rvsdg
15 {
16 
17 class BitSliceOperation final : public UnaryOperation
18 {
19 public:
20  ~BitSliceOperation() noexcept override;
21 
23  const std::shared_ptr<const BitType> & argument,
24  size_t low,
25  size_t high) noexcept
26  : UnaryOperation(argument, BitType::Create(high - low)),
27  low_(low)
28  {}
29 
30  bool
31  operator==(const Operation & other) const noexcept override;
32 
33  [[nodiscard]] std::string
34  debug_string() const override;
35 
37  can_reduce_operand(const jlm::rvsdg::Output * arg) const noexcept override;
38 
40  reduce_operand(unop_reduction_path_t path, jlm::rvsdg::Output * arg) const override;
41 
42  inline size_t
43  low() const noexcept
44  {
45  return low_;
46  }
47 
48  inline size_t
49  high() const noexcept
50  {
51  return low_ + std::static_pointer_cast<const BitType>(result(0))->nbits();
52  }
53 
54  [[nodiscard]] std::unique_ptr<Operation>
55  copy() const override;
56 
57  inline const Type &
58  argument_type() const noexcept
59  {
60  return *std::static_pointer_cast<const BitType>(argument(0));
61  }
62 
63 private:
64  size_t low_;
65 };
66 
78 bitslice(jlm::rvsdg::Output * operand, size_t low, size_t high);
79 
80 }
81 
82 #endif
unop_reduction_path_t can_reduce_operand(const jlm::rvsdg::Output *arg) const noexcept override
Definition: slice.cpp:31
bool operator==(const Operation &other) const noexcept override
Definition: slice.cpp:18
std::unique_ptr< Operation > copy() const override
Definition: slice.cpp:100
~BitSliceOperation() noexcept override
jlm::rvsdg::Output * reduce_operand(unop_reduction_path_t path, jlm::rvsdg::Output *arg) const override
Definition: slice.cpp:52
std::string debug_string() const override
Definition: slice.cpp:25
const Type & argument_type() const noexcept
Definition: slice.hpp:58
size_t high() const noexcept
Definition: slice.hpp:49
size_t low() const noexcept
Definition: slice.hpp:43
const std::shared_ptr< const rvsdg::Type > & argument(size_t index) const noexcept
Definition: operation.cpp:23
const std::shared_ptr< const rvsdg::Type > & result(size_t index) const noexcept
Definition: operation.cpp:36
Unary operator.
Definition: unary.hpp:26
size_t unop_reduction_path_t
Definition: unary.hpp:18
jlm::rvsdg::Output * bitslice(jlm::rvsdg::Output *argument, size_t low, size_t high)
Create bitslice.
Definition: slice.cpp:106