| ... | @@ -81,6 +81,14 @@ pub const Register = struct { | ... | @@ -81,6 +81,14 @@ pub const Register = struct { |
| 81 | .@"16b", .@"8b" => .byte, | 81 | .@"16b", .@"8b" => .byte, |
| 82 | }; | 82 | }; |
| 83 | } | 83 | } |
| | 84 | |
| | 85 | pub fn elemSz(arrangement: Arrangement) Instruction.DataProcessingVector.Sz { |
| | 86 | return switch (arrangement) { |
| | 87 | else => unreachable, |
| | 88 | .@"2d", .@"1d" => .double, |
| | 89 | .@"4s", .@"2s" => .single, |
| | 90 | }; |
| | 91 | } |
| 84 | }; | 92 | }; |
| 85 | | 93 | |
| 86 | pub const x0: Register = .{ .alias = .r0, .format = .{ .integer = .doubleword } }; | 94 | pub const x0: Register = .{ .alias = .r0, .format = .{ .integer = .doubleword } }; |
| ... | @@ -6817,7 +6825,7 @@ pub const Instruction = packed union { | ... | @@ -6817,7 +6825,7 @@ pub const Instruction = packed union { |
| 6817 | o0: AddSubtractOp = .add, | 6825 | o0: AddSubtractOp = .add, |
| 6818 | Rm: Register.Encoded, | 6826 | Rm: Register.Encoded, |
| 6819 | op21: u2 = 0b01, | 6827 | op21: u2 = 0b01, |
| 6820 | U: bool = false, | 6828 | U: std.builtin.Signedness = .signed, |
| 6821 | decoded24: u5 = 0b11011, | 6829 | decoded24: u5 = 0b11011, |
| 6822 | op54: u2 = 0b00, | 6830 | op54: u2 = 0b00, |
| 6823 | sf: Register.IntegerSize = .doubleword, | 6831 | sf: Register.IntegerSize = .doubleword, |
| ... | @@ -6831,7 +6839,7 @@ pub const Instruction = packed union { | ... | @@ -6831,7 +6839,7 @@ pub const Instruction = packed union { |
| 6831 | o0: AddSubtractOp = .sub, | 6839 | o0: AddSubtractOp = .sub, |
| 6832 | Rm: Register.Encoded, | 6840 | Rm: Register.Encoded, |
| 6833 | op21: u2 = 0b01, | 6841 | op21: u2 = 0b01, |
| 6834 | U: bool = false, | 6842 | U: std.builtin.Signedness = .signed, |
| 6835 | decoded24: u5 = 0b11011, | 6843 | decoded24: u5 = 0b11011, |
| 6836 | op54: u2 = 0b00, | 6844 | op54: u2 = 0b00, |
| 6837 | sf: Register.IntegerSize = .doubleword, | 6845 | sf: Register.IntegerSize = .doubleword, |
| ... | @@ -6845,7 +6853,7 @@ pub const Instruction = packed union { | ... | @@ -6845,7 +6853,7 @@ pub const Instruction = packed union { |
| 6845 | o0: AddSubtractOp = .add, | 6853 | o0: AddSubtractOp = .add, |
| 6846 | Rm: Register.Encoded, | 6854 | Rm: Register.Encoded, |
| 6847 | op21: u2 = 0b10, | 6855 | op21: u2 = 0b10, |
| 6848 | U: bool = false, | 6856 | U: std.builtin.Signedness = .signed, |
| 6849 | decoded24: u5 = 0b11011, | 6857 | decoded24: u5 = 0b11011, |
| 6850 | op54: u2 = 0b00, | 6858 | op54: u2 = 0b00, |
| 6851 | sf: Register.IntegerSize = .doubleword, | 6859 | sf: Register.IntegerSize = .doubleword, |
| ... | @@ -6859,7 +6867,7 @@ pub const Instruction = packed union { | ... | @@ -6859,7 +6867,7 @@ pub const Instruction = packed union { |
| 6859 | o0: AddSubtractOp = .add, | 6867 | o0: AddSubtractOp = .add, |
| 6860 | Rm: Register.Encoded, | 6868 | Rm: Register.Encoded, |
| 6861 | op21: u2 = 0b01, | 6869 | op21: u2 = 0b01, |
| 6862 | U: bool = true, | 6870 | U: std.builtin.Signedness = .unsigned, |
| 6863 | decoded24: u5 = 0b11011, | 6871 | decoded24: u5 = 0b11011, |
| 6864 | op54: u2 = 0b00, | 6872 | op54: u2 = 0b00, |
| 6865 | sf: Register.IntegerSize = .doubleword, | 6873 | sf: Register.IntegerSize = .doubleword, |
| ... | @@ -6873,7 +6881,7 @@ pub const Instruction = packed union { | ... | @@ -6873,7 +6881,7 @@ pub const Instruction = packed union { |
| 6873 | o0: AddSubtractOp = .sub, | 6881 | o0: AddSubtractOp = .sub, |
| 6874 | Rm: Register.Encoded, | 6882 | Rm: Register.Encoded, |
| 6875 | op21: u2 = 0b01, | 6883 | op21: u2 = 0b01, |
| 6876 | U: bool = true, | 6884 | U: std.builtin.Signedness = .unsigned, |
| 6877 | decoded24: u5 = 0b11011, | 6885 | decoded24: u5 = 0b11011, |
| 6878 | op54: u2 = 0b00, | 6886 | op54: u2 = 0b00, |
| 6879 | sf: Register.IntegerSize = .doubleword, | 6887 | sf: Register.IntegerSize = .doubleword, |
| ... | @@ -6887,7 +6895,7 @@ pub const Instruction = packed union { | ... | @@ -6887,7 +6895,7 @@ pub const Instruction = packed union { |
| 6887 | o0: AddSubtractOp = .add, | 6895 | o0: AddSubtractOp = .add, |
| 6888 | Rm: Register.Encoded, | 6896 | Rm: Register.Encoded, |
| 6889 | op21: u2 = 0b10, | 6897 | op21: u2 = 0b10, |
| 6890 | U: bool = true, | 6898 | U: std.builtin.Signedness = .unsigned, |
| 6891 | decoded24: u5 = 0b11011, | 6899 | decoded24: u5 = 0b11011, |
| 6892 | op54: u2 = 0b00, | 6900 | op54: u2 = 0b00, |
| 6893 | sf: Register.IntegerSize = .doubleword, | 6901 | sf: Register.IntegerSize = .doubleword, |
| ... | @@ -7009,8 +7017,12 @@ pub const Instruction = packed union { | ... | @@ -7009,8 +7017,12 @@ pub const Instruction = packed union { |
| 7009 | /// C4.1.90 Data Processing -- Scalar Floating-Point and Advanced SIMD | 7017 | /// C4.1.90 Data Processing -- Scalar Floating-Point and Advanced SIMD |
| 7010 | pub const DataProcessingVector = packed union { | 7018 | pub const DataProcessingVector = packed union { |
| 7011 | group: @This().Group, | 7019 | group: @This().Group, |
| | 7020 | simd_scalar_copy: SimdScalarCopy, |
| | 7021 | simd_scalar_two_register_miscellaneous_fp16: SimdScalarTwoRegisterMiscellaneousFp16, |
| | 7022 | simd_scalar_two_register_miscellaneous: SimdScalarTwoRegisterMiscellaneous, |
| 7012 | simd_scalar_pairwise: SimdScalarPairwise, | 7023 | simd_scalar_pairwise: SimdScalarPairwise, |
| 7013 | simd_copy: SimdCopy, | 7024 | simd_copy: SimdCopy, |
| | 7025 | simd_two_register_miscellaneous_fp16: SimdTwoRegisterMiscellaneousFp16, |
| 7014 | simd_two_register_miscellaneous: SimdTwoRegisterMiscellaneous, | 7026 | simd_two_register_miscellaneous: SimdTwoRegisterMiscellaneous, |
| 7015 | simd_across_lanes: SimdAcrossLanes, | 7027 | simd_across_lanes: SimdAcrossLanes, |
| 7016 | simd_three_same: SimdThreeSame, | 7028 | simd_three_same: SimdThreeSame, |
| ... | @@ -7020,6 +7032,7 @@ pub const Instruction = packed union { | ... | @@ -7020,6 +7032,7 @@ pub const Instruction = packed union { |
| 7020 | float_compare: FloatCompare, | 7032 | float_compare: FloatCompare, |
| 7021 | float_immediate: FloatImmediate, | 7033 | float_immediate: FloatImmediate, |
| 7022 | float_data_processing_two_source: FloatDataProcessingTwoSource, | 7034 | float_data_processing_two_source: FloatDataProcessingTwoSource, |
| | 7035 | float_conditional_select: FloatConditionalSelect, |
| 7023 | float_data_processing_three_source: FloatDataProcessingThreeSource, | 7036 | float_data_processing_three_source: FloatDataProcessingThreeSource, |
| 7024 | | 7037 | |
| 7025 | /// Table C4-91 Encoding table for the Data Processing -- Scalar Floating-Point and Advanced SIMD group | 7038 | /// Table C4-91 Encoding table for the Data Processing -- Scalar Floating-Point and Advanced SIMD group |
| ... | @@ -7032,42 +7045,10 @@ pub const Instruction = packed union { | ... | @@ -7032,42 +7045,10 @@ pub const Instruction = packed union { |
| 7032 | op0: u4, | 7045 | op0: u4, |
| 7033 | }; | 7046 | }; |
| 7034 | | 7047 | |
| 7035 | /// Advanced SIMD scalar pairwise | 7048 | /// Advanced SIMD scalar copy |
| 7036 | pub const SimdScalarPairwise = packed union { | 7049 | pub const SimdScalarCopy = packed union { |
| 7037 | group: @This().Group, | | |
| 7038 | addp: Addp, | | |
| 7039 | | | |
| 7040 | pub const Group = packed struct { | | |
| 7041 | Rd: Register.Encoded, | | |
| 7042 | Rn: Register.Encoded, | | |
| 7043 | decoded10: u2 = 0b10, | | |
| 7044 | opcode: u5, | | |
| 7045 | decoded17: u5 = 0b11000, | | |
| 7046 | size: Size, | | |
| 7047 | decoded24: u5 = 0b11110, | | |
| 7048 | U: u1, | | |
| 7049 | decoded30: u2 = 0b01, | | |
| 7050 | }; | | |
| 7051 | | | |
| 7052 | /// C7.2.4 ADDP (scalar) | | |
| 7053 | pub const Addp = packed struct { | | |
| 7054 | Rd: Register.Encoded, | | |
| 7055 | Rn: Register.Encoded, | | |
| 7056 | decoded10: u2 = 0b10, | | |
| 7057 | opcode: u5 = 0b11011, | | |
| 7058 | decoded17: u5 = 0b11000, | | |
| 7059 | size: Size, | | |
| 7060 | decoded24: u5 = 0b11110, | | |
| 7061 | U: u1 = 0b0, | | |
| 7062 | decoded30: u2 = 0b01, | | |
| 7063 | }; | | |
| 7064 | }; | | |
| 7065 | | | |
| 7066 | /// Advanced SIMD copy | | |
| 7067 | pub const SimdCopy = packed union { | | |
| 7068 | group: @This().Group, | 7050 | group: @This().Group, |
| 7069 | smov: Smov, | 7051 | dup: Dup, |
| 7070 | umov: Umov, | | |
| 7071 | | 7052 | |
| 7072 | pub const Group = packed struct { | 7053 | pub const Group = packed struct { |
| 7073 | Rd: Register.Encoded, | 7054 | Rd: Register.Encoded, |
| ... | @@ -7076,1127 +7057,3375 @@ pub const Instruction = packed union { | ... | @@ -7076,1127 +7057,3375 @@ pub const Instruction = packed union { |
| 7076 | imm4: u4, | 7057 | imm4: u4, |
| 7077 | decoded15: u1 = 0b0, | 7058 | decoded15: u1 = 0b0, |
| 7078 | imm5: u5, | 7059 | imm5: u5, |
| 7079 | decoded21: u8 = 0b01110000, | 7060 | decoded21: u8 = 0b11110000, |
| 7080 | op: u1, | 7061 | op: u1, |
| 7081 | Q: Register.IntegerSize, | 7062 | decoded30: u2 = 0b01, |
| 7082 | decoded31: u1 = 0b0, | | |
| 7083 | }; | 7063 | }; |
| 7084 | | 7064 | |
| 7085 | /// C7.2.279 SMOV | 7065 | /// C7.2.39 DUP (element) |
| 7086 | pub const Smov = packed struct { | 7066 | pub const Dup = packed struct { |
| 7087 | Rd: Register.Encoded, | 7067 | Rd: Register.Encoded, |
| 7088 | Rn: Register.Encoded, | 7068 | Rn: Register.Encoded, |
| 7089 | decoded10: u1 = 0b1, | 7069 | decoded10: u1 = 0b1, |
| 7090 | decoded11: u1 = 0b1, | 7070 | imm4: u4 = 0b0000, |
| 7091 | decoded12: u1 = 0b0, | | |
| 7092 | decoded13: u2 = 0b01, | | |
| 7093 | decoded15: u1 = 0b0, | 7071 | decoded15: u1 = 0b0, |
| 7094 | imm5: u5, | 7072 | imm5: u5, |
| 7095 | decoded21: u8 = 0b01110000, | 7073 | decoded21: u8 = 0b11110000, |
| 7096 | decoded29: u1 = 0b0, | 7074 | op: u1 = 0b0, |
| 7097 | Q: Register.IntegerSize, | 7075 | decoded30: u2 = 0b01, |
| 7098 | decoded31: u1 = 0b0, | | |
| 7099 | }; | 7076 | }; |
| 7100 | | 7077 | |
| 7101 | /// C7.2.371 UMOV | 7078 | pub const Decoded = union(enum) { |
| 7102 | pub const Umov = packed struct { | 7079 | unallocated, |
| 7103 | Rd: Register.Encoded, | 7080 | dup: Dup, |
| 7104 | Rn: Register.Encoded, | | |
| 7105 | decoded10: u1 = 0b1, | | |
| 7106 | decoded11: u1 = 0b1, | | |
| 7107 | decoded12: u1 = 0b1, | | |
| 7108 | decoded13: u2 = 0b01, | | |
| 7109 | decoded15: u1 = 0b0, | | |
| 7110 | imm5: u5, | | |
| 7111 | decoded21: u8 = 0b01110000, | | |
| 7112 | decoded29: u1 = 0b0, | | |
| 7113 | Q: Register.IntegerSize, | | |
| 7114 | decoded31: u1 = 0b0, | | |
| 7115 | }; | 7081 | }; |
| | 7082 | pub fn decode(inst: @This()) @This().Decoded { |
| | 7083 | return switch (inst.group.op) { |
| | 7084 | 0b0 => switch (inst.group.imm4) { |
| | 7085 | else => .unallocated, |
| | 7086 | 0b0000 => .{ .dup = inst.dup }, |
| | 7087 | }, |
| | 7088 | 0b1 => .unallocated, |
| | 7089 | }; |
| | 7090 | } |
| 7116 | }; | 7091 | }; |
| 7117 | | 7092 | |
| 7118 | /// Advanced SIMD two-register miscellaneous | 7093 | /// Advanced SIMD scalar two-register miscellaneous FP16 |
| 7119 | pub const SimdTwoRegisterMiscellaneous = packed union { | 7094 | pub const SimdScalarTwoRegisterMiscellaneousFp16 = packed union { |
| 7120 | group: @This().Group, | 7095 | group: @This().Group, |
| 7121 | cnt: Cnt, | 7096 | fcvtns: Fcvtns, |
| | 7097 | fcvtms: Fcvtms, |
| | 7098 | fcvtas: Fcvtas, |
| | 7099 | scvtf: Scvtf, |
| | 7100 | fcmgt: Fcmgt, |
| | 7101 | fcmeq: Fcmeq, |
| | 7102 | fcmlt: Fcmlt, |
| | 7103 | fcvtps: Fcvtps, |
| | 7104 | fcvtzs: Fcvtzs, |
| | 7105 | frecpe: Frecpe, |
| | 7106 | frecpx: Frecpx, |
| | 7107 | fcvtnu: Fcvtnu, |
| | 7108 | fcvtmu: Fcvtmu, |
| | 7109 | fcvtau: Fcvtau, |
| | 7110 | ucvtf: Ucvtf, |
| | 7111 | fcmge: Fcmge, |
| | 7112 | fcmle: Fcmle, |
| | 7113 | fcvtpu: Fcvtpu, |
| | 7114 | fcvtzu: Fcvtzu, |
| | 7115 | frsqrte: Frsqrte, |
| 7122 | | 7116 | |
| 7123 | pub const Group = packed struct { | 7117 | pub const Group = packed struct { |
| 7124 | Rd: Register.Encoded, | 7118 | Rd: Register.Encoded, |
| 7125 | Rn: Register.Encoded, | 7119 | Rn: Register.Encoded, |
| 7126 | decoded10: u2 = 0b10, | 7120 | decoded10: u2 = 0b10, |
| 7127 | opcode: u5, | 7121 | opcode: u5, |
| 7128 | decoded17: u5 = 0b10000, | 7122 | decoded17: u6 = 0b111100, |
| 7129 | size: Size, | 7123 | a: u1, |
| 7130 | decoded24: u5 = 0b01110, | 7124 | decoded24: u5 = 0b11110, |
| 7131 | U: u1, | 7125 | U: std.builtin.Signedness, |
| 7132 | Q: Q, | 7126 | decoded30: u2 = 0b01, |
| 7133 | decoded31: u1 = 0b0, | | |
| 7134 | }; | 7127 | }; |
| 7135 | | 7128 | |
| 7136 | /// C7.2.38 CNT | 7129 | /// C7.2.80 FCVTNS (vector) |
| 7137 | pub const Cnt = packed struct { | 7130 | pub const Fcvtns = packed struct { |
| 7138 | Rd: Register.Encoded, | 7131 | Rd: Register.Encoded, |
| 7139 | Rn: Register.Encoded, | 7132 | Rn: Register.Encoded, |
| 7140 | decoded10: u2 = 0b10, | 7133 | decoded10: u2 = 0b10, |
| 7141 | opcode: u5 = 0b00101, | 7134 | opcode: u5 = 0b11010, |
| 7142 | decoded17: u5 = 0b10000, | 7135 | decoded17: u6 = 0b111100, |
| 7143 | size: Size, | 7136 | o2: u1 = 0b0, |
| 7144 | decoded24: u5 = 0b01110, | 7137 | decoded24: u5 = 0b11110, |
| 7145 | U: u1 = 0b0, | 7138 | U: std.builtin.Signedness = .signed, |
| 7146 | Q: Q, | 7139 | decoded30: u2 = 0b01, |
| 7147 | decoded31: u1 = 0b0, | | |
| 7148 | }; | 7140 | }; |
| 7149 | }; | | |
| 7150 | | | |
| 7151 | /// Advanced SIMD across lanes | | |
| 7152 | pub const SimdAcrossLanes = packed union { | | |
| 7153 | group: @This().Group, | | |
| 7154 | addv: Addv, | | |
| 7155 | | 7141 | |
| 7156 | pub const Group = packed struct { | 7142 | /// C7.2.75 FCVTMS (vector) |
| | 7143 | pub const Fcvtms = packed struct { |
| 7157 | Rd: Register.Encoded, | 7144 | Rd: Register.Encoded, |
| 7158 | Rn: Register.Encoded, | 7145 | Rn: Register.Encoded, |
| 7159 | decoded10: u2 = 0b10, | 7146 | decoded10: u2 = 0b10, |
| 7160 | opcode: u5, | 7147 | opcode: u5 = 0b11011, |
| 7161 | decoded17: u5 = 0b11000, | 7148 | decoded17: u6 = 0b111100, |
| 7162 | size: Size, | 7149 | o2: u1 = 0b0, |
| 7163 | decoded24: u5 = 0b01110, | 7150 | decoded24: u5 = 0b11110, |
| 7164 | U: u1, | 7151 | U: std.builtin.Signedness = .signed, |
| 7165 | Q: Q, | 7152 | decoded30: u2 = 0b01, |
| 7166 | decoded31: u1 = 0b0, | | |
| 7167 | }; | 7153 | }; |
| 7168 | | 7154 | |
| 7169 | /// C7.2.6 ADDV | 7155 | /// C7.2.70 FCVTAS (vector) |
| 7170 | pub const Addv = packed struct { | 7156 | pub const Fcvtas = packed struct { |
| 7171 | Rd: Register.Encoded, | 7157 | Rd: Register.Encoded, |
| 7172 | Rn: Register.Encoded, | 7158 | Rn: Register.Encoded, |
| 7173 | decoded10: u2 = 0b10, | 7159 | decoded10: u2 = 0b10, |
| 7174 | opcode: u5 = 0b11011, | 7160 | opcode: u5 = 0b11100, |
| 7175 | decoded17: u5 = 0b11000, | 7161 | decoded17: u6 = 0b111100, |
| 7176 | size: Size, | 7162 | o2: u1 = 0b0, |
| 7177 | decoded24: u5 = 0b01110, | 7163 | decoded24: u5 = 0b11110, |
| 7178 | U: u1 = 0b0, | 7164 | U: std.builtin.Signedness = .signed, |
| 7179 | Q: Q, | 7165 | decoded30: u2 = 0b01, |
| 7180 | decoded31: u1 = 0b0, | | |
| 7181 | }; | 7166 | }; |
| 7182 | }; | | |
| 7183 | | 7167 | |
| 7184 | /// Advanced SIMD three same | 7168 | /// C7.2.234 SCVTF (vector, integer) |
| 7185 | pub const SimdThreeSame = packed union { | 7169 | pub const Scvtf = packed struct { |
| 7186 | group: @This().Group, | 7170 | Rd: Register.Encoded, |
| 7187 | addp: Addp, | 7171 | Rn: Register.Encoded, |
| 7188 | @"and": And, | 7172 | decoded10: u2 = 0b10, |
| 7189 | bic: Bic, | 7173 | opcode: u5 = 0b11101, |
| 7190 | orr: Orr, | 7174 | decoded17: u6 = 0b111100, |
| 7191 | orn: Orn, | 7175 | o2: u1 = 0b0, |
| 7192 | eor: Eor, | 7176 | decoded24: u5 = 0b11110, |
| | 7177 | U: std.builtin.Signedness = .signed, |
| | 7178 | decoded30: u2 = 0b01, |
| | 7179 | }; |
| 7193 | | 7180 | |
| 7194 | pub const Group = packed struct { | 7181 | /// C7.2.61 FCMGT (zero) |
| | 7182 | pub const Fcmgt = packed struct { |
| 7195 | Rd: Register.Encoded, | 7183 | Rd: Register.Encoded, |
| 7196 | Rn: Register.Encoded, | 7184 | Rn: Register.Encoded, |
| 7197 | decoded10: u1 = 0b1, | 7185 | decoded10: u2 = 0b10, |
| 7198 | opcode: u5, | 7186 | opcode: u5 = 0b01100, |
| 7199 | Rm: Register.Encoded, | 7187 | decoded17: u6 = 0b111100, |
| 7200 | decoded21: u1 = 0b1, | 7188 | o2: u1 = 0b1, |
| 7201 | size: Size, | 7189 | decoded24: u5 = 0b11110, |
| 7202 | decoded24: u5 = 0b01110, | 7190 | U: std.builtin.Signedness = .signed, |
| 7203 | U: u1, | 7191 | decoded30: u2 = 0b01, |
| 7204 | Q: Q, | | |
| 7205 | decoded31: u1 = 0b0, | | |
| 7206 | }; | 7192 | }; |
| 7207 | | 7193 | |
| 7208 | /// C7.2.5 ADDP (vector) | 7194 | /// C7.2.57 FCMEQ (zero) |
| 7209 | pub const Addp = packed struct { | 7195 | pub const Fcmeq = packed struct { |
| 7210 | Rd: Register.Encoded, | 7196 | Rd: Register.Encoded, |
| 7211 | Rn: Register.Encoded, | 7197 | Rn: Register.Encoded, |
| 7212 | decoded10: u1 = 0b1, | 7198 | decoded10: u2 = 0b10, |
| 7213 | opcode: u5 = 0b10111, | 7199 | opcode: u5 = 0b01101, |
| 7214 | Rm: Register.Encoded, | 7200 | decoded17: u6 = 0b111100, |
| 7215 | decoded21: u1 = 0b1, | 7201 | o2: u1 = 0b1, |
| 7216 | size: Size, | 7202 | decoded24: u5 = 0b11110, |
| 7217 | decoded24: u5 = 0b01110, | 7203 | U: std.builtin.Signedness = .signed, |
| 7218 | U: u1 = 0b0, | 7204 | decoded30: u2 = 0b01, |
| 7219 | Q: Q, | | |
| 7220 | decoded31: u1 = 0b0, | | |
| 7221 | }; | 7205 | }; |
| 7222 | | 7206 | |
| 7223 | /// C7.2.11 AND (vector) | 7207 | /// C7.2.65 FCMLT (zero) |
| 7224 | pub const And = packed struct { | 7208 | pub const Fcmlt = packed struct { |
| 7225 | Rd: Register.Encoded, | 7209 | Rd: Register.Encoded, |
| 7226 | Rn: Register.Encoded, | 7210 | Rn: Register.Encoded, |
| 7227 | decoded10: u1 = 0b1, | 7211 | decoded10: u2 = 0b10, |
| 7228 | opcode: u5 = 0b00011, | 7212 | opcode: u5 = 0b01110, |
| 7229 | Rm: Register.Encoded, | 7213 | decoded17: u6 = 0b111100, |
| 7230 | decoded21: u1 = 0b1, | 7214 | o2: u1 = 0b1, |
| 7231 | size: Size = .byte, | 7215 | decoded24: u5 = 0b11110, |
| 7232 | decoded24: u5 = 0b01110, | 7216 | U: std.builtin.Signedness = .signed, |
| 7233 | U: u1 = 0b0, | 7217 | decoded30: u2 = 0b01, |
| 7234 | Q: Q, | | |
| 7235 | decoded31: u1 = 0b0, | | |
| 7236 | }; | 7218 | }; |
| 7237 | | 7219 | |
| 7238 | /// C7.2.21 BIC (vector, register) | 7220 | /// C7.2.84 FCVTPS (vector) |
| 7239 | pub const Bic = packed struct { | 7221 | pub const Fcvtps = packed struct { |
| 7240 | Rd: Register.Encoded, | 7222 | Rd: Register.Encoded, |
| 7241 | Rn: Register.Encoded, | 7223 | Rn: Register.Encoded, |
| 7242 | decoded10: u1 = 0b1, | 7224 | decoded10: u2 = 0b10, |
| 7243 | opcode: u5 = 0b00011, | 7225 | opcode: u5 = 0b11010, |
| 7244 | Rm: Register.Encoded, | 7226 | decoded17: u6 = 0b111100, |
| 7245 | decoded21: u1 = 0b1, | 7227 | o2: u1 = 0b1, |
| 7246 | size: Size = .half, | 7228 | decoded24: u5 = 0b11110, |
| 7247 | decoded24: u5 = 0b01110, | 7229 | U: std.builtin.Signedness = .signed, |
| 7248 | U: u1 = 0b0, | 7230 | decoded30: u2 = 0b01, |
| 7249 | Q: Q, | | |
| 7250 | decoded31: u1 = 0b0, | | |
| 7251 | }; | 7231 | }; |
| 7252 | | 7232 | |
| 7253 | /// C7.2.213 ORR (vector, register) | 7233 | /// C7.2.90 FCVTZS (vector, integer) |
| 7254 | pub const Orr = packed struct { | 7234 | pub const Fcvtzs = packed struct { |
| 7255 | Rd: Register.Encoded, | 7235 | Rd: Register.Encoded, |
| 7256 | Rn: Register.Encoded, | 7236 | Rn: Register.Encoded, |
| 7257 | decoded10: u1 = 0b1, | 7237 | decoded10: u2 = 0b10, |
| 7258 | opcode: u5 = 0b00011, | 7238 | opcode: u5 = 0b11011, |
| 7259 | Rm: Register.Encoded, | 7239 | decoded17: u6 = 0b111100, |
| 7260 | decoded21: u1 = 0b1, | 7240 | o2: u1 = 0b1, |
| 7261 | size: Size = .single, | 7241 | decoded24: u5 = 0b11110, |
| 7262 | decoded24: u5 = 0b01110, | 7242 | U: std.builtin.Signedness = .signed, |
| 7263 | U: u1 = 0b0, | 7243 | decoded30: u2 = 0b01, |
| 7264 | Q: Q, | | |
| 7265 | decoded31: u1 = 0b0, | | |
| 7266 | }; | 7244 | }; |
| 7267 | | 7245 | |
| 7268 | /// C7.2.211 ORN (vector) | 7246 | /// C7.2.144 FRECPE |
| 7269 | pub const Orn = packed struct { | 7247 | pub const Frecpe = packed struct { |
| 7270 | Rd: Register.Encoded, | 7248 | Rd: Register.Encoded, |
| 7271 | Rn: Register.Encoded, | 7249 | Rn: Register.Encoded, |
| 7272 | decoded10: u1 = 0b1, | 7250 | decoded10: u2 = 0b10, |
| 7273 | opcode: u5 = 0b00011, | 7251 | opcode: u5 = 0b11101, |
| 7274 | Rm: Register.Encoded, | 7252 | decoded17: u6 = 0b111100, |
| 7275 | decoded21: u1 = 0b1, | 7253 | o2: u1 = 0b1, |
| 7276 | size: Size = .double, | 7254 | decoded24: u5 = 0b11110, |
| 7277 | decoded24: u5 = 0b01110, | 7255 | U: std.builtin.Signedness = .signed, |
| 7278 | U: u1 = 0b0, | 7256 | decoded30: u2 = 0b01, |
| 7279 | Q: Q, | | |
| 7280 | decoded31: u1 = 0b0, | | |
| 7281 | }; | 7257 | }; |
| 7282 | | 7258 | |
| 7283 | /// C7.2.41 EOR (vector) | 7259 | /// C7.2.146 FRECPX |
| 7284 | pub const Eor = packed struct { | 7260 | pub const Frecpx = packed struct { |
| 7285 | Rd: Register.Encoded, | 7261 | Rd: Register.Encoded, |
| 7286 | Rn: Register.Encoded, | 7262 | Rn: Register.Encoded, |
| 7287 | decoded10: u1 = 0b1, | 7263 | decoded10: u2 = 0b10, |
| 7288 | opcode: u5 = 0b00011, | 7264 | opcode: u5 = 0b11111, |
| 7289 | Rm: Register.Encoded, | 7265 | decoded17: u6 = 0b111100, |
| 7290 | decoded21: u1 = 0b1, | 7266 | o2: u1 = 0b1, |
| 7291 | size: Size = .byte, | 7267 | decoded24: u5 = 0b11110, |
| 7292 | decoded24: u5 = 0b01110, | 7268 | U: std.builtin.Signedness = .signed, |
| 7293 | U: u1 = 0b1, | 7269 | decoded30: u2 = 0b01, |
| 7294 | Q: Q, | | |
| 7295 | decoded31: u1 = 0b0, | | |
| 7296 | }; | 7270 | }; |
| 7297 | }; | | |
| 7298 | | 7271 | |
| 7299 | /// Advanced SIMD modified immediate | 7272 | /// C7.2.82 FCVTNU (vector) |
| 7300 | pub const SimdModifiedImmediate = packed union { | 7273 | pub const Fcvtnu = packed struct { |
| 7301 | group: @This().Group, | 7274 | Rd: Register.Encoded, |
| 7302 | movi: Movi, | 7275 | Rn: Register.Encoded, |
| 7303 | orr: Orr, | 7276 | decoded10: u2 = 0b10, |
| 7304 | fmov: Fmov, | 7277 | opcode: u5 = 0b11010, |
| 7305 | mvni: Mvni, | 7278 | decoded17: u6 = 0b111100, |
| 7306 | bic: Bic, | 7279 | o2: u1 = 0b0, |
| | 7280 | decoded24: u5 = 0b11110, |
| | 7281 | U: std.builtin.Signedness = .unsigned, |
| | 7282 | decoded30: u2 = 0b01, |
| | 7283 | }; |
| 7307 | | 7284 | |
| 7308 | pub const Group = packed struct { | 7285 | /// C7.2.77 FCVTMU (vector) |
| | 7286 | pub const Fcvtmu = packed struct { |
| 7309 | Rd: Register.Encoded, | 7287 | Rd: Register.Encoded, |
| 7310 | imm5: u5, | 7288 | Rn: Register.Encoded, |
| 7311 | decoded10: u1 = 0b1, | 7289 | decoded10: u2 = 0b10, |
| 7312 | o2: u1, | 7290 | opcode: u5 = 0b11011, |
| 7313 | cmode: u4, | 7291 | decoded17: u6 = 0b111100, |
| 7314 | imm3: u3, | 7292 | o2: u1 = 0b0, |
| 7315 | decoded19: u10 = 0b0111100000, | 7293 | decoded24: u5 = 0b11110, |
| 7316 | op: u1, | 7294 | U: std.builtin.Signedness = .unsigned, |
| 7317 | Q: Q, | 7295 | decoded30: u2 = 0b01, |
| 7318 | decoded31: u1 = 0b0, | | |
| 7319 | }; | 7296 | }; |
| 7320 | | 7297 | |
| 7321 | /// C7.2.204 MOVI | 7298 | /// C7.2.72 FCVTAU (vector) |
| 7322 | pub const Movi = packed struct { | 7299 | pub const Fcvtau = packed struct { |
| 7323 | Rd: Register.Encoded, | 7300 | Rd: Register.Encoded, |
| 7324 | imm5: u5, | 7301 | Rn: Register.Encoded, |
| 7325 | decoded10: u1 = 0b1, | 7302 | decoded10: u2 = 0b10, |
| | 7303 | opcode: u5 = 0b11100, |
| | 7304 | decoded17: u6 = 0b111100, |
| 7326 | o2: u1 = 0b0, | 7305 | o2: u1 = 0b0, |
| 7327 | cmode: u4, | 7306 | decoded24: u5 = 0b11110, |
| 7328 | imm3: u3, | 7307 | U: std.builtin.Signedness = .unsigned, |
| 7329 | decoded19: u10 = 0b0111100000, | 7308 | decoded30: u2 = 0b01, |
| 7330 | op: u1, | | |
| 7331 | Q: Q, | | |
| 7332 | decoded31: u1 = 0b0, | | |
| 7333 | }; | 7309 | }; |
| 7334 | | 7310 | |
| 7335 | /// C7.2.212 ORR (vector, immediate) | 7311 | /// C7.2.353 UCVTF (vector, integer) |
| 7336 | pub const Orr = packed struct { | 7312 | pub const Ucvtf = packed struct { |
| 7337 | Rd: Register.Encoded, | 7313 | Rd: Register.Encoded, |
| 7338 | imm5: u5, | 7314 | Rn: Register.Encoded, |
| 7339 | decoded10: u1 = 0b1, | 7315 | decoded10: u2 = 0b10, |
| | 7316 | opcode: u5 = 0b11101, |
| | 7317 | decoded17: u6 = 0b111100, |
| 7340 | o2: u1 = 0b0, | 7318 | o2: u1 = 0b0, |
| 7341 | cmode0: u1 = 0b1, | 7319 | decoded24: u5 = 0b11110, |
| 7342 | cmode: u3, | 7320 | U: std.builtin.Signedness = .unsigned, |
| 7343 | imm3: u3, | 7321 | decoded30: u2 = 0b01, |
| 7344 | decoded19: u10 = 0b0111100000, | | |
| 7345 | op: u1 = 0b0, | | |
| 7346 | Q: Q, | | |
| 7347 | decoded31: u1 = 0b0, | | |
| 7348 | }; | 7322 | }; |
| 7349 | | 7323 | |
| 7350 | /// C7.2.129 FMOV (vector, immediate) | 7324 | /// C7.2.59 FCMGE (zero) |
| 7351 | pub const Fmov = packed struct { | 7325 | pub const Fcmge = packed struct { |
| 7352 | Rd: Register.Encoded, | 7326 | Rd: Register.Encoded, |
| 7353 | imm5: u5, | 7327 | Rn: Register.Encoded, |
| 7354 | decoded10: u1 = 0b1, | 7328 | decoded10: u2 = 0b10, |
| | 7329 | opcode: u5 = 0b01100, |
| | 7330 | decoded17: u6 = 0b111100, |
| 7355 | o2: u1 = 0b1, | 7331 | o2: u1 = 0b1, |
| 7356 | cmode: u4 = 0b1111, | 7332 | decoded24: u5 = 0b11110, |
| 7357 | imm3: u3, | 7333 | U: std.builtin.Signedness = .unsigned, |
| 7358 | decoded19: u10 = 0b0111100000, | 7334 | decoded30: u2 = 0b01, |
| 7359 | op: u1 = 0b0, | | |
| 7360 | Q: Q, | | |
| 7361 | decoded31: u1 = 0b0, | | |
| 7362 | }; | 7335 | }; |
| 7363 | | 7336 | |
| 7364 | /// C7.2.208 MVNI | 7337 | /// C7.2.64 FCMLE (zero) |
| 7365 | pub const Mvni = packed struct { | 7338 | pub const Fcmle = packed struct { |
| 7366 | Rd: Register.Encoded, | 7339 | Rd: Register.Encoded, |
| 7367 | imm5: u5, | 7340 | Rn: Register.Encoded, |
| 7368 | decoded10: u1 = 0b1, | 7341 | decoded10: u2 = 0b10, |
| 7369 | o2: u1 = 0b0, | 7342 | opcode: u5 = 0b01101, |
| 7370 | cmode: u4, | 7343 | decoded17: u6 = 0b111100, |
| 7371 | imm3: u3, | 7344 | o2: u1 = 0b1, |
| 7372 | decoded19: u10 = 0b0111100000, | 7345 | decoded24: u5 = 0b11110, |
| 7373 | op: u1 = 0b1, | 7346 | U: std.builtin.Signedness = .unsigned, |
| 7374 | Q: Q, | 7347 | decoded30: u2 = 0b01, |
| 7375 | decoded31: u1 = 0b0, | | |
| 7376 | }; | 7348 | }; |
| 7377 | | 7349 | |
| 7378 | /// C7.2.20 BIC (vector, immediate) | 7350 | /// C7.2.86 FCVTPU (vector) |
| 7379 | pub const Bic = packed struct { | 7351 | pub const Fcvtpu = packed struct { |
| 7380 | Rd: Register.Encoded, | 7352 | Rd: Register.Encoded, |
| 7381 | imm5: u5, | 7353 | Rn: Register.Encoded, |
| 7382 | decoded10: u1 = 0b1, | 7354 | decoded10: u2 = 0b10, |
| 7383 | o2: u1 = 0b0, | 7355 | opcode: u5 = 0b11010, |
| 7384 | cmode0: u1 = 0b1, | 7356 | decoded17: u6 = 0b111100, |
| 7385 | cmode: u3, | 7357 | o2: u1 = 0b1, |
| 7386 | imm3: u3, | 7358 | decoded24: u5 = 0b11110, |
| 7387 | decoded19: u10 = 0b0111100000, | 7359 | U: std.builtin.Signedness = .unsigned, |
| 7388 | op: u1 = 0b1, | 7360 | decoded30: u2 = 0b01, |
| 7389 | Q: Q, | 7361 | }; |
| 7390 | decoded31: u1 = 0b0, | 7362 | |
| | 7363 | /// C7.2.94 FCVTZU (vector, integer) |
| | 7364 | pub const Fcvtzu = packed struct { |
| | 7365 | Rd: Register.Encoded, |
| | 7366 | Rn: Register.Encoded, |
| | 7367 | decoded10: u2 = 0b10, |
| | 7368 | opcode: u5 = 0b11011, |
| | 7369 | decoded17: u6 = 0b111100, |
| | 7370 | o2: u1 = 0b1, |
| | 7371 | decoded24: u5 = 0b11110, |
| | 7372 | U: std.builtin.Signedness = .unsigned, |
| | 7373 | decoded30: u2 = 0b01, |
| | 7374 | }; |
| | 7375 | |
| | 7376 | /// C7.2.169 FRSQRTE |
| | 7377 | pub const Frsqrte = packed struct { |
| | 7378 | Rd: Register.Encoded, |
| | 7379 | Rn: Register.Encoded, |
| | 7380 | decoded10: u2 = 0b10, |
| | 7381 | opcode: u5 = 0b11101, |
| | 7382 | decoded17: u6 = 0b111100, |
| | 7383 | o2: u1 = 0b1, |
| | 7384 | decoded24: u5 = 0b11110, |
| | 7385 | U: std.builtin.Signedness = .unsigned, |
| | 7386 | decoded30: u2 = 0b01, |
| 7391 | }; | 7387 | }; |
| 7392 | }; | 7388 | }; |
| 7393 | | 7389 | |
| 7394 | /// Conversion between floating-point and integer | 7390 | /// Advanced SIMD scalar two-register miscellaneous |
| 7395 | pub const ConvertFloatInteger = packed union { | 7391 | pub const SimdScalarTwoRegisterMiscellaneous = packed union { |
| 7396 | group: @This().Group, | 7392 | group: @This().Group, |
| | 7393 | suqadd: Suqadd, |
| | 7394 | sqabs: Sqabs, |
| | 7395 | cmgt: Cmgt, |
| | 7396 | cmeq: Cmeq, |
| | 7397 | cmlt: Cmlt, |
| | 7398 | abs: Abs, |
| | 7399 | sqxtn: Sqxtn, |
| 7397 | fcvtns: Fcvtns, | 7400 | fcvtns: Fcvtns, |
| 7398 | fcvtnu: Fcvtnu, | 7401 | fcvtms: Fcvtms, |
| 7399 | scvtf: Scvtf, | | |
| 7400 | ucvtf: Ucvtf, | | |
| 7401 | fcvtas: Fcvtas, | 7402 | fcvtas: Fcvtas, |
| 7402 | fcvtau: Fcvtau, | 7403 | scvtf: Scvtf, |
| 7403 | fmov: Fmov, | 7404 | fcmgt: Fcmgt, |
| | 7405 | fcmeq: Fcmeq, |
| | 7406 | fcmlt: Fcmlt, |
| 7404 | fcvtps: Fcvtps, | 7407 | fcvtps: Fcvtps, |
| 7405 | fcvtpu: Fcvtpu, | | |
| 7406 | fcvtms: Fcvtms, | | |
| 7407 | fcvtmu: Fcvtmu, | | |
| 7408 | fcvtzs: Fcvtzs, | 7408 | fcvtzs: Fcvtzs, |
| | 7409 | frecpe: Frecpe, |
| | 7410 | frecpx: Frecpx, |
| | 7411 | usqadd: Usqadd, |
| | 7412 | sqneg: Sqneg, |
| | 7413 | cmge: Cmge, |
| | 7414 | cmle: Cmle, |
| | 7415 | neg: Neg, |
| | 7416 | sqxtun: Sqxtun, |
| | 7417 | uqxtn: Uqxtn, |
| | 7418 | fcvtxn: Fcvtxn, |
| | 7419 | fcvtnu: Fcvtnu, |
| | 7420 | fcvtmu: Fcvtmu, |
| | 7421 | fcvtau: Fcvtau, |
| | 7422 | ucvtf: Ucvtf, |
| | 7423 | fcmge: Fcmge, |
| | 7424 | fcmle: Fcmle, |
| | 7425 | fcvtpu: Fcvtpu, |
| 7409 | fcvtzu: Fcvtzu, | 7426 | fcvtzu: Fcvtzu, |
| 7410 | fjcvtzs: Fjcvtzs, | 7427 | frsqrte: Frsqrte, |
| 7411 | | 7428 | |
| 7412 | pub const Group = packed struct { | 7429 | pub const Group = packed struct { |
| 7413 | Rd: Register.Encoded, | 7430 | Rd: Register.Encoded, |
| 7414 | Rn: Register.Encoded, | 7431 | Rn: Register.Encoded, |
| 7415 | decoded10: u6 = 0b000000, | 7432 | decoded10: u2 = 0b10, |
| 7416 | opcode: u3, | 7433 | opcode: u5, |
| 7417 | rmode: u2, | 7434 | decoded17: u5 = 0b10000, |
| 7418 | decoded21: u1 = 0b1, | 7435 | size: Size, |
| 7419 | ptype: Ftype, | | |
| 7420 | decoded24: u5 = 0b11110, | 7436 | decoded24: u5 = 0b11110, |
| 7421 | S: bool, | 7437 | U: std.builtin.Signedness, |
| 7422 | decoded30: u1 = 0b0, | 7438 | decoded30: u2 = 0b01, |
| 7423 | sf: Register.IntegerSize, | | |
| 7424 | }; | 7439 | }; |
| 7425 | | 7440 | |
| 7426 | /// C7.2.81 FCVTNS (scalar) | 7441 | /// C7.2.337 SUQADD |
| 7427 | pub const Fcvtns = packed struct { | 7442 | pub const Suqadd = packed struct { |
| 7428 | Rd: Register.Encoded, | 7443 | Rd: Register.Encoded, |
| 7429 | Rn: Register.Encoded, | 7444 | Rn: Register.Encoded, |
| 7430 | decoded10: u6 = 0b000000, | 7445 | decoded10: u2 = 0b10, |
| 7431 | opcode: u3 = 0b000, | 7446 | opcode: u5 = 0b00011, |
| 7432 | rmode: Rmode = .n, | 7447 | decoded17: u5 = 0b10000, |
| 7433 | decoded21: u1 = 0b1, | 7448 | size: Size, |
| 7434 | ftype: Ftype, | | |
| 7435 | decoded24: u5 = 0b11110, | 7449 | decoded24: u5 = 0b11110, |
| 7436 | S: bool = false, | 7450 | U: std.builtin.Signedness = .signed, |
| 7437 | decoded30: u1 = 0b0, | 7451 | decoded30: u2 = 0b01, |
| 7438 | sf: Register.IntegerSize, | | |
| 7439 | }; | 7452 | }; |
| 7440 | | 7453 | |
| 7441 | /// C7.2.83 FCVTNU (scalar) | 7454 | /// C7.2.282 SQABS |
| 7442 | pub const Fcvtnu = packed struct { | 7455 | pub const Sqabs = packed struct { |
| 7443 | Rd: Register.Encoded, | 7456 | Rd: Register.Encoded, |
| 7444 | Rn: Register.Encoded, | 7457 | Rn: Register.Encoded, |
| 7445 | decoded10: u6 = 0b000000, | 7458 | decoded10: u2 = 0b10, |
| 7446 | opcode: u3 = 0b001, | 7459 | opcode: u5 = 0b00111, |
| 7447 | rmode: Rmode = .n, | 7460 | decoded17: u5 = 0b10000, |
| 7448 | decoded21: u1 = 0b1, | 7461 | size: Size, |
| 7449 | ftype: Ftype, | | |
| 7450 | decoded24: u5 = 0b11110, | 7462 | decoded24: u5 = 0b11110, |
| 7451 | S: bool = false, | 7463 | U: std.builtin.Signedness = .signed, |
| 7452 | decoded30: u1 = 0b0, | 7464 | decoded30: u2 = 0b01, |
| 7453 | sf: Register.IntegerSize, | | |
| 7454 | }; | 7465 | }; |
| 7455 | | 7466 | |
| 7456 | /// C7.2.236 SCVTF (scalar, integer) | 7467 | /// C7.2.32 CMGT (zero) |
| 7457 | pub const Scvtf = packed struct { | 7468 | pub const Cmgt = packed struct { |
| 7458 | Rd: Register.Encoded, | 7469 | Rd: Register.Encoded, |
| 7459 | Rn: Register.Encoded, | 7470 | Rn: Register.Encoded, |
| 7460 | decoded10: u6 = 0b000000, | 7471 | decoded10: u2 = 0b10, |
| 7461 | opcode: u3 = 0b010, | 7472 | opcode: u5 = 0b01000, |
| 7462 | rmode: Rmode = .n, | 7473 | decoded17: u5 = 0b10000, |
| 7463 | decoded21: u1 = 0b1, | 7474 | size: Size, |
| 7464 | ftype: Ftype, | | |
| 7465 | decoded24: u5 = 0b11110, | 7475 | decoded24: u5 = 0b11110, |
| 7466 | S: bool = false, | 7476 | U: std.builtin.Signedness = .signed, |
| 7467 | decoded30: u1 = 0b0, | 7477 | decoded30: u2 = 0b01, |
| 7468 | sf: Register.IntegerSize, | | |
| 7469 | }; | 7478 | }; |
| 7470 | | 7479 | |
| 7471 | /// C7.2.355 UCVTF (scalar, integer) | 7480 | /// C7.2.28 CMEQ (zero) |
| 7472 | pub const Ucvtf = packed struct { | 7481 | pub const Cmeq = packed struct { |
| 7473 | Rd: Register.Encoded, | 7482 | Rd: Register.Encoded, |
| 7474 | Rn: Register.Encoded, | 7483 | Rn: Register.Encoded, |
| 7475 | decoded10: u6 = 0b000000, | 7484 | decoded10: u2 = 0b10, |
| 7476 | opcode: u3 = 0b011, | 7485 | opcode: u5 = 0b01001, |
| 7477 | rmode: Rmode = .n, | 7486 | decoded17: u5 = 0b10000, |
| 7478 | decoded21: u1 = 0b1, | 7487 | size: Size, |
| 7479 | ftype: Ftype, | | |
| 7480 | decoded24: u5 = 0b11110, | 7488 | decoded24: u5 = 0b11110, |
| 7481 | S: bool = false, | 7489 | U: std.builtin.Signedness = .signed, |
| 7482 | decoded30: u1 = 0b0, | 7490 | decoded30: u2 = 0b01, |
| 7483 | sf: Register.IntegerSize, | | |
| 7484 | }; | 7491 | }; |
| 7485 | | 7492 | |
| 7486 | /// C7.2.71 FCVTAS (scalar) | 7493 | /// C7.2.36 CMLT (zero) |
| 7487 | pub const Fcvtas = packed struct { | 7494 | pub const Cmlt = packed struct { |
| 7488 | Rd: Register.Encoded, | 7495 | Rd: Register.Encoded, |
| 7489 | Rn: Register.Encoded, | 7496 | Rn: Register.Encoded, |
| 7490 | decoded10: u6 = 0b000000, | 7497 | decoded10: u2 = 0b10, |
| 7491 | opcode: u3 = 0b100, | 7498 | opcode: u5 = 0b01010, |
| 7492 | rmode: Rmode = .n, | 7499 | decoded17: u5 = 0b10000, |
| 7493 | decoded21: u1 = 0b1, | 7500 | size: Size, |
| 7494 | ftype: Ftype, | | |
| 7495 | decoded24: u5 = 0b11110, | 7501 | decoded24: u5 = 0b11110, |
| 7496 | S: bool = false, | 7502 | U: std.builtin.Signedness = .signed, |
| 7497 | decoded30: u1 = 0b0, | 7503 | decoded30: u2 = 0b01, |
| 7498 | sf: Register.IntegerSize, | | |
| 7499 | }; | 7504 | }; |
| 7500 | | 7505 | |
| 7501 | /// C7.2.73 FCVTAU (scalar) | 7506 | /// C7.2.1 ABS |
| 7502 | pub const Fcvtau = packed struct { | 7507 | pub const Abs = packed struct { |
| 7503 | Rd: Register.Encoded, | 7508 | Rd: Register.Encoded, |
| 7504 | Rn: Register.Encoded, | 7509 | Rn: Register.Encoded, |
| 7505 | decoded10: u6 = 0b000000, | 7510 | decoded10: u2 = 0b10, |
| 7506 | opcode: u3 = 0b101, | 7511 | opcode: u5 = 0b01011, |
| 7507 | rmode: Rmode = .n, | 7512 | decoded17: u5 = 0b10000, |
| 7508 | decoded21: u1 = 0b1, | 7513 | size: Size, |
| 7509 | ftype: Ftype, | | |
| 7510 | decoded24: u5 = 0b11110, | 7514 | decoded24: u5 = 0b11110, |
| 7511 | S: bool = false, | 7515 | U: std.builtin.Signedness = .signed, |
| 7512 | decoded30: u1 = 0b0, | 7516 | decoded30: u2 = 0b01, |
| 7513 | sf: Register.IntegerSize, | | |
| 7514 | }; | 7517 | }; |
| 7515 | | 7518 | |
| 7516 | /// C7.2.131 FMOV (general) | 7519 | /// C7.2.308 SQXTN |
| 7517 | pub const Fmov = packed struct { | 7520 | pub const Sqxtn = packed struct { |
| 7518 | Rd: Register.Encoded, | 7521 | Rd: Register.Encoded, |
| 7519 | Rn: Register.Encoded, | 7522 | Rn: Register.Encoded, |
| 7520 | decoded10: u6 = 0b000000, | 7523 | decoded10: u2 = 0b10, |
| 7521 | opcode: Opcode, | 7524 | opcode: u5 = 0b10100, |
| 7522 | rmode: Fmov.Rmode, | 7525 | decoded17: u5 = 0b10000, |
| 7523 | decoded21: u1 = 0b1, | 7526 | size: Size, |
| 7524 | ftype: Ftype, | | |
| 7525 | decoded24: u5 = 0b11110, | 7527 | decoded24: u5 = 0b11110, |
| 7526 | S: bool = false, | 7528 | U: std.builtin.Signedness = .signed, |
| 7527 | decoded30: u1 = 0b0, | 7529 | decoded30: u2 = 0b01, |
| 7528 | sf: Register.IntegerSize, | | |
| 7529 | | | |
| 7530 | pub const Opcode = enum(u3) { | | |
| 7531 | float_to_integer = 0b110, | | |
| 7532 | integer_to_float = 0b111, | | |
| 7533 | _, | | |
| 7534 | }; | | |
| 7535 | | | |
| 7536 | pub const Rmode = enum(u2) { | | |
| 7537 | @"0" = 0b00, | | |
| 7538 | @"1" = 0b01, | | |
| 7539 | _, | | |
| 7540 | }; | | |
| 7541 | }; | 7530 | }; |
| 7542 | | 7531 | |
| 7543 | /// C7.2.85 FCVTPS (scalar) | 7532 | /// C7.2.80 FCVTNS (vector) |
| 7544 | pub const Fcvtps = packed struct { | 7533 | pub const Fcvtns = packed struct { |
| 7545 | Rd: Register.Encoded, | 7534 | Rd: Register.Encoded, |
| 7546 | Rn: Register.Encoded, | 7535 | Rn: Register.Encoded, |
| 7547 | decoded10: u6 = 0b000000, | 7536 | decoded10: u2 = 0b10, |
| 7548 | opcode: u3 = 0b000, | 7537 | opcode: u5 = 0b11010, |
| 7549 | rmode: Rmode = .p, | 7538 | decoded17: u5 = 0b10000, |
| 7550 | decoded21: u1 = 0b1, | 7539 | sz: Sz, |
| 7551 | ftype: Ftype, | 7540 | o2: u1 = 0b0, |
| 7552 | decoded24: u5 = 0b11110, | 7541 | decoded24: u5 = 0b11110, |
| 7553 | S: bool = false, | 7542 | U: std.builtin.Signedness = .signed, |
| 7554 | decoded30: u1 = 0b0, | 7543 | decoded30: u2 = 0b01, |
| 7555 | sf: Register.IntegerSize, | | |
| 7556 | }; | 7544 | }; |
| 7557 | | 7545 | |
| 7558 | /// C7.2.87 FCVTPU (scalar) | 7546 | /// C7.2.75 FCVTMS (vector) |
| 7559 | pub const Fcvtpu = packed struct { | 7547 | pub const Fcvtms = packed struct { |
| 7560 | Rd: Register.Encoded, | 7548 | Rd: Register.Encoded, |
| 7561 | Rn: Register.Encoded, | 7549 | Rn: Register.Encoded, |
| 7562 | decoded10: u6 = 0b000000, | 7550 | decoded10: u2 = 0b10, |
| 7563 | opcode: u3 = 0b001, | 7551 | opcode: u5 = 0b11011, |
| 7564 | rmode: Rmode = .p, | 7552 | decoded17: u5 = 0b10000, |
| 7565 | decoded21: u1 = 0b1, | 7553 | sz: Sz, |
| 7566 | ftype: Ftype, | 7554 | o2: u1 = 0b0, |
| 7567 | decoded24: u5 = 0b11110, | 7555 | decoded24: u5 = 0b11110, |
| 7568 | S: bool = false, | 7556 | U: std.builtin.Signedness = .signed, |
| 7569 | decoded30: u1 = 0b0, | 7557 | decoded30: u2 = 0b01, |
| 7570 | sf: Register.IntegerSize, | | |
| 7571 | }; | 7558 | }; |
| 7572 | | 7559 | |
| 7573 | /// C7.2.76 FCVTMS (scalar) | 7560 | /// C7.2.70 FCVTAS (vector) |
| 7574 | pub const Fcvtms = packed struct { | 7561 | pub const Fcvtas = packed struct { |
| 7575 | Rd: Register.Encoded, | 7562 | Rd: Register.Encoded, |
| 7576 | Rn: Register.Encoded, | 7563 | Rn: Register.Encoded, |
| 7577 | decoded10: u6 = 0b000000, | 7564 | decoded10: u2 = 0b10, |
| 7578 | opcode: u3 = 0b000, | 7565 | opcode: u5 = 0b11100, |
| 7579 | rmode: Rmode = .m, | 7566 | decoded17: u5 = 0b10000, |
| 7580 | decoded21: u1 = 0b1, | 7567 | sz: Sz, |
| 7581 | ftype: Ftype, | 7568 | o2: u1 = 0b0, |
| 7582 | decoded24: u5 = 0b11110, | 7569 | decoded24: u5 = 0b11110, |
| 7583 | S: bool = false, | 7570 | U: std.builtin.Signedness = .signed, |
| 7584 | decoded30: u1 = 0b0, | 7571 | decoded30: u2 = 0b01, |
| 7585 | sf: Register.IntegerSize, | | |
| 7586 | }; | 7572 | }; |
| 7587 | | 7573 | |
| 7588 | /// C7.2.78 FCVTMU (scalar) | 7574 | /// C7.2.234 SCVTF (vector, integer) |
| 7589 | pub const Fcvtmu = packed struct { | 7575 | pub const Scvtf = packed struct { |
| 7590 | Rd: Register.Encoded, | 7576 | Rd: Register.Encoded, |
| 7591 | Rn: Register.Encoded, | 7577 | Rn: Register.Encoded, |
| 7592 | decoded10: u6 = 0b000000, | 7578 | decoded10: u2 = 0b10, |
| 7593 | opcode: u3 = 0b001, | 7579 | opcode: u5 = 0b11101, |
| 7594 | rmode: Rmode = .m, | 7580 | decoded17: u5 = 0b10000, |
| 7595 | decoded21: u1 = 0b1, | 7581 | sz: Sz, |
| 7596 | ftype: Ftype, | 7582 | o2: u1 = 0b0, |
| 7597 | decoded24: u5 = 0b11110, | 7583 | decoded24: u5 = 0b11110, |
| 7598 | S: bool = false, | 7584 | U: std.builtin.Signedness = .signed, |
| 7599 | decoded30: u1 = 0b0, | 7585 | decoded30: u2 = 0b01, |
| 7600 | sf: Register.IntegerSize, | | |
| 7601 | }; | 7586 | }; |
| 7602 | | 7587 | |
| 7603 | /// C7.2.92 FCVTZS (scalar, integer) | 7588 | /// C7.2.61 FCMGT (zero) |
| 7604 | pub const Fcvtzs = packed struct { | 7589 | pub const Fcmgt = packed struct { |
| 7605 | Rd: Register.Encoded, | 7590 | Rd: Register.Encoded, |
| 7606 | Rn: Register.Encoded, | 7591 | Rn: Register.Encoded, |
| 7607 | decoded10: u6 = 0b000000, | 7592 | decoded10: u2 = 0b10, |
| 7608 | opcode: u3 = 0b000, | 7593 | opcode: u5 = 0b01100, |
| 7609 | rmode: Rmode = .z, | 7594 | decoded17: u5 = 0b10000, |
| 7610 | decoded21: u1 = 0b1, | 7595 | sz: Sz, |
| 7611 | ftype: Ftype, | 7596 | o2: u1 = 0b1, |
| 7612 | decoded24: u5 = 0b11110, | 7597 | decoded24: u5 = 0b11110, |
| 7613 | S: bool = false, | 7598 | U: std.builtin.Signedness = .signed, |
| 7614 | decoded30: u1 = 0b0, | 7599 | decoded30: u2 = 0b01, |
| 7615 | sf: Register.IntegerSize, | | |
| 7616 | }; | 7600 | }; |
| 7617 | | 7601 | |
| 7618 | /// C7.2.96 FCVTZU (scalar, integer) | 7602 | /// C7.2.57 FCMEQ (zero) |
| 7619 | pub const Fcvtzu = packed struct { | 7603 | pub const Fcmeq = packed struct { |
| 7620 | Rd: Register.Encoded, | 7604 | Rd: Register.Encoded, |
| 7621 | Rn: Register.Encoded, | 7605 | Rn: Register.Encoded, |
| 7622 | decoded10: u6 = 0b000000, | 7606 | decoded10: u2 = 0b10, |
| 7623 | opcode: u3 = 0b001, | 7607 | opcode: u5 = 0b01101, |
| 7624 | rmode: Rmode = .z, | 7608 | decoded17: u5 = 0b10000, |
| 7625 | decoded21: u1 = 0b1, | 7609 | sz: Sz, |
| 7626 | ftype: Ftype, | 7610 | o2: u1 = 0b1, |
| 7627 | decoded24: u5 = 0b11110, | 7611 | decoded24: u5 = 0b11110, |
| 7628 | S: bool = false, | 7612 | U: std.builtin.Signedness = .signed, |
| 7629 | decoded30: u1 = 0b0, | 7613 | decoded30: u2 = 0b01, |
| 7630 | sf: Register.IntegerSize, | | |
| 7631 | }; | 7614 | }; |
| 7632 | | 7615 | |
| 7633 | /// C7.2.99 FJCVTZS | 7616 | /// C7.2.65 FCMLT (zero) |
| 7634 | pub const Fjcvtzs = packed struct { | 7617 | pub const Fcmlt = packed struct { |
| 7635 | Rd: Register.Encoded, | 7618 | Rd: Register.Encoded, |
| 7636 | Rn: Register.Encoded, | 7619 | Rn: Register.Encoded, |
| 7637 | decoded10: u6 = 0b000000, | 7620 | decoded10: u2 = 0b10, |
| 7638 | opcode: u3 = 0b110, | 7621 | opcode: u5 = 0b01110, |
| 7639 | rmode: Rmode = .z, | 7622 | decoded17: u5 = 0b10000, |
| 7640 | decoded21: u1 = 0b1, | 7623 | sz: Sz, |
| 7641 | ftype: Ftype = .double, | 7624 | o2: u1 = 0b1, |
| 7642 | decoded24: u5 = 0b11110, | 7625 | decoded24: u5 = 0b11110, |
| 7643 | S: bool = false, | 7626 | U: std.builtin.Signedness = .signed, |
| 7644 | decoded30: u1 = 0b0, | 7627 | decoded30: u2 = 0b01, |
| 7645 | sf: Register.IntegerSize = .word, | | |
| 7646 | }; | 7628 | }; |
| 7647 | | 7629 | |
| 7648 | pub const Rmode = enum(u2) { | 7630 | /// C7.2.84 FCVTPS (vector) |
| 7649 | /// to nearest | 7631 | pub const Fcvtps = packed struct { |
| 7650 | n = 0b00, | 7632 | Rd: Register.Encoded, |
| 7651 | /// toward plus infinity | 7633 | Rn: Register.Encoded, |
| 7652 | p = 0b01, | 7634 | decoded10: u2 = 0b10, |
| 7653 | /// toward minus infinity | 7635 | opcode: u5 = 0b11010, |
| 7654 | m = 0b10, | 7636 | decoded17: u5 = 0b10000, |
| 7655 | /// toward zero | 7637 | sz: Sz, |
| 7656 | z = 0b11, | 7638 | o2: u1 = 0b1, |
| | 7639 | decoded24: u5 = 0b11110, |
| | 7640 | U: std.builtin.Signedness = .signed, |
| | 7641 | decoded30: u2 = 0b01, |
| 7657 | }; | 7642 | }; |
| 7658 | }; | | |
| 7659 | | | |
| 7660 | /// Floating-point data-processing (1 source) | | |
| 7661 | pub const FloatDataProcessingOneSource = packed union { | | |
| 7662 | group: @This().Group, | | |
| 7663 | fmov: Fmov, | | |
| 7664 | fabs: Fabs, | | |
| 7665 | fneg: Fneg, | | |
| 7666 | fsqrt: Fsqrt, | | |
| 7667 | fcvt: Fcvt, | | |
| 7668 | frintn: Frintn, | | |
| 7669 | frintp: Frintp, | | |
| 7670 | frintm: Frintm, | | |
| 7671 | frintz: Frintz, | | |
| 7672 | frinta: Frinta, | | |
| 7673 | frintx: Frintx, | | |
| 7674 | frinti: Frinti, | | |
| 7675 | | 7643 | |
| 7676 | pub const Group = packed struct { | 7644 | /// C7.2.90 FCVTZS (vector, integer) |
| | 7645 | pub const Fcvtzs = packed struct { |
| 7677 | Rd: Register.Encoded, | 7646 | Rd: Register.Encoded, |
| 7678 | Rn: Register.Encoded, | 7647 | Rn: Register.Encoded, |
| 7679 | decoded10: u5 = 0b10000, | 7648 | decoded10: u2 = 0b10, |
| 7680 | opcode: u6, | 7649 | opcode: u5 = 0b11011, |
| 7681 | decoded21: u1 = 0b1, | 7650 | decoded17: u5 = 0b10000, |
| 7682 | ptype: Ftype, | 7651 | sz: Sz, |
| | 7652 | o2: u1 = 0b1, |
| 7683 | decoded24: u5 = 0b11110, | 7653 | decoded24: u5 = 0b11110, |
| 7684 | S: bool, | 7654 | U: std.builtin.Signedness = .signed, |
| 7685 | decoded30: u1 = 0b0, | 7655 | decoded30: u2 = 0b01, |
| 7686 | M: u1, | | |
| 7687 | }; | 7656 | }; |
| 7688 | | 7657 | |
| 7689 | /// C7.2.130 FMOV (register) | 7658 | /// C7.2.144 FRECPE |
| 7690 | pub const Fmov = packed struct { | 7659 | pub const Frecpe = packed struct { |
| 7691 | Rd: Register.Encoded, | 7660 | Rd: Register.Encoded, |
| 7692 | Rn: Register.Encoded, | 7661 | Rn: Register.Encoded, |
| 7693 | decoded10: u5 = 0b10000, | 7662 | decoded10: u2 = 0b10, |
| 7694 | opc: u2 = 0b00, | 7663 | opcode: u5 = 0b11101, |
| 7695 | decoded17: u4 = 0b0000, | 7664 | decoded17: u5 = 0b10000, |
| 7696 | decoded21: u1 = 0b1, | 7665 | sz: Sz, |
| 7697 | ftype: Ftype, | 7666 | o2: u1 = 0b1, |
| 7698 | decoded24: u5 = 0b11110, | 7667 | decoded24: u5 = 0b11110, |
| 7699 | S: bool = false, | 7668 | U: std.builtin.Signedness = .signed, |
| 7700 | decoded30: u1 = 0b0, | 7669 | decoded30: u2 = 0b01, |
| 7701 | M: u1 = 0b0, | | |
| 7702 | }; | 7670 | }; |
| 7703 | | 7671 | |
| 7704 | /// C7.2.46 FABS (scalar) | 7672 | /// C7.2.146 FRECPX |
| 7705 | pub const Fabs = packed struct { | 7673 | pub const Frecpx = packed struct { |
| 7706 | Rd: Register.Encoded, | 7674 | Rd: Register.Encoded, |
| 7707 | Rn: Register.Encoded, | 7675 | Rn: Register.Encoded, |
| 7708 | decoded10: u5 = 0b10000, | 7676 | decoded10: u2 = 0b10, |
| 7709 | opc: u2 = 0b01, | 7677 | opcode: u5 = 0b11111, |
| 7710 | decoded17: u4 = 0b0000, | 7678 | decoded17: u5 = 0b10000, |
| 7711 | decoded21: u1 = 0b1, | 7679 | sz: Sz, |
| 7712 | ftype: Ftype, | 7680 | o2: u1 = 0b1, |
| 7713 | decoded24: u5 = 0b11110, | 7681 | decoded24: u5 = 0b11110, |
| 7714 | S: bool = false, | 7682 | U: std.builtin.Signedness = .signed, |
| 7715 | decoded30: u1 = 0b0, | 7683 | decoded30: u2 = 0b01, |
| 7716 | M: u1 = 0b0, | | |
| 7717 | }; | 7684 | }; |
| 7718 | | 7685 | |
| 7719 | /// C7.2.140 FNEG (scalar) | 7686 | /// C7.2.394 USQADD |
| 7720 | pub const Fneg = packed struct { | 7687 | pub const Usqadd = packed struct { |
| 7721 | Rd: Register.Encoded, | 7688 | Rd: Register.Encoded, |
| 7722 | Rn: Register.Encoded, | 7689 | Rn: Register.Encoded, |
| 7723 | decoded10: u5 = 0b10000, | 7690 | decoded10: u2 = 0b10, |
| 7724 | opc: u2 = 0b10, | 7691 | opcode: u5 = 0b00011, |
| 7725 | decoded17: u4 = 0b0000, | 7692 | decoded17: u5 = 0b10000, |
| 7726 | decoded21: u1 = 0b1, | 7693 | size: Size, |
| 7727 | ftype: Ftype, | | |
| 7728 | decoded24: u5 = 0b11110, | 7694 | decoded24: u5 = 0b11110, |
| 7729 | S: bool = false, | 7695 | U: std.builtin.Signedness = .unsigned, |
| 7730 | decoded30: u1 = 0b0, | 7696 | decoded30: u2 = 0b01, |
| 7731 | M: u1 = 0b0, | | |
| 7732 | }; | 7697 | }; |
| 7733 | | 7698 | |
| 7734 | /// C7.2.172 FSQRT (scalar) | 7699 | /// C7.2.292 SQNEG |
| 7735 | pub const Fsqrt = packed struct { | 7700 | pub const Sqneg = packed struct { |
| 7736 | Rd: Register.Encoded, | 7701 | Rd: Register.Encoded, |
| 7737 | Rn: Register.Encoded, | 7702 | Rn: Register.Encoded, |
| 7738 | decoded10: u5 = 0b10000, | 7703 | decoded10: u2 = 0b10, |
| 7739 | opc: u2 = 0b11, | 7704 | opcode: u5 = 0b00111, |
| 7740 | decoded17: u4 = 0b0000, | 7705 | decoded17: u5 = 0b10000, |
| 7741 | decoded21: u1 = 0b1, | 7706 | size: Size, |
| 7742 | ftype: Ftype, | | |
| 7743 | decoded24: u5 = 0b11110, | 7707 | decoded24: u5 = 0b11110, |
| 7744 | S: bool = false, | 7708 | U: std.builtin.Signedness = .unsigned, |
| 7745 | decoded30: u1 = 0b0, | 7709 | decoded30: u2 = 0b01, |
| 7746 | M: u1 = 0b0, | | |
| 7747 | }; | 7710 | }; |
| 7748 | | 7711 | |
| 7749 | /// C7.2.69 FCVT | 7712 | /// C7.2.30 CMGE (zero) |
| 7750 | pub const Fcvt = packed struct { | 7713 | pub const Cmge = packed struct { |
| 7751 | Rd: Register.Encoded, | 7714 | Rd: Register.Encoded, |
| 7752 | Rn: Register.Encoded, | 7715 | Rn: Register.Encoded, |
| 7753 | decoded10: u5 = 0b10000, | 7716 | decoded10: u2 = 0b10, |
| 7754 | opc: Ftype, | 7717 | opcode: u5 = 0b01000, |
| 7755 | decoded17: u4 = 0b0001, | 7718 | decoded17: u5 = 0b10000, |
| 7756 | decoded21: u1 = 0b1, | 7719 | size: Size, |
| 7757 | ftype: Ftype, | | |
| 7758 | decoded24: u5 = 0b11110, | 7720 | decoded24: u5 = 0b11110, |
| 7759 | S: bool = false, | 7721 | U: std.builtin.Signedness = .unsigned, |
| 7760 | decoded30: u1 = 0b0, | 7722 | decoded30: u2 = 0b01, |
| 7761 | M: u1 = 0b0, | | |
| 7762 | }; | 7723 | }; |
| 7763 | | 7724 | |
| 7764 | /// C7.2.162 FRINTN (scalar) | 7725 | /// C7.2.35 CMLE (zero) |
| 7765 | pub const Frintn = packed struct { | 7726 | pub const Cmle = packed struct { |
| 7766 | Rd: Register.Encoded, | 7727 | Rd: Register.Encoded, |
| 7767 | Rn: Register.Encoded, | 7728 | Rn: Register.Encoded, |
| 7768 | decoded10: u5 = 0b10000, | 7729 | decoded10: u2 = 0b10, |
| 7769 | rmode: Rmode = .n, | 7730 | opcode: u5 = 0b01001, |
| 7770 | decoded18: u3 = 0b001, | 7731 | decoded17: u5 = 0b10000, |
| 7771 | decoded21: u1 = 0b1, | 7732 | size: Size, |
| 7772 | ftype: Ftype, | | |
| 7773 | decoded24: u5 = 0b11110, | 7733 | decoded24: u5 = 0b11110, |
| 7774 | S: bool = false, | 7734 | U: std.builtin.Signedness = .unsigned, |
| 7775 | decoded30: u1 = 0b0, | 7735 | decoded30: u2 = 0b01, |
| 7776 | M: u1 = 0b0, | | |
| 7777 | }; | 7736 | }; |
| 7778 | | 7737 | |
| 7779 | /// C7.2.164 FRINTP (scalar) | 7738 | /// C7.2.209 NEG (vector) |
| 7780 | pub const Frintp = packed struct { | 7739 | pub const Neg = packed struct { |
| 7781 | Rd: Register.Encoded, | 7740 | Rd: Register.Encoded, |
| 7782 | Rn: Register.Encoded, | 7741 | Rn: Register.Encoded, |
| 7783 | decoded10: u5 = 0b10000, | 7742 | decoded10: u2 = 0b10, |
| 7784 | rmode: Rmode = .p, | 7743 | opcode: u5 = 0b01011, |
| 7785 | decoded18: u3 = 0b001, | 7744 | decoded17: u5 = 0b10000, |
| 7786 | decoded21: u1 = 0b1, | 7745 | size: Size, |
| 7787 | ftype: Ftype, | | |
| 7788 | decoded24: u5 = 0b11110, | 7746 | decoded24: u5 = 0b11110, |
| 7789 | S: bool = false, | 7747 | U: std.builtin.Signedness = .unsigned, |
| 7790 | decoded30: u1 = 0b0, | 7748 | decoded30: u2 = 0b01, |
| 7791 | M: u1 = 0b0, | | |
| 7792 | }; | 7749 | }; |
| 7793 | | 7750 | |
| 7794 | /// C7.2.160 FRINTM (scalar) | 7751 | /// C7.2.309 SQXTUN |
| 7795 | pub const Frintm = packed struct { | 7752 | pub const Sqxtun = packed struct { |
| 7796 | Rd: Register.Encoded, | 7753 | Rd: Register.Encoded, |
| 7797 | Rn: Register.Encoded, | 7754 | Rn: Register.Encoded, |
| 7798 | decoded10: u5 = 0b10000, | 7755 | decoded10: u2 = 0b10, |
| 7799 | rmode: Rmode = .m, | 7756 | opcode: u5 = 0b10010, |
| 7800 | decoded18: u3 = 0b001, | 7757 | decoded17: u5 = 0b10000, |
| 7801 | decoded21: u1 = 0b1, | 7758 | size: Size, |
| 7802 | ftype: Ftype, | | |
| 7803 | decoded24: u5 = 0b11110, | 7759 | decoded24: u5 = 0b11110, |
| 7804 | S: bool = false, | 7760 | U: std.builtin.Signedness = .unsigned, |
| 7805 | decoded30: u1 = 0b0, | 7761 | decoded30: u2 = 0b01, |
| 7806 | M: u1 = 0b0, | | |
| 7807 | }; | 7762 | }; |
| 7808 | | 7763 | |
| 7809 | /// C7.2.168 FRINTZ (scalar) | 7764 | /// C7.2.381 UQXTN |
| 7810 | pub const Frintz = packed struct { | 7765 | pub const Uqxtn = packed struct { |
| 7811 | Rd: Register.Encoded, | 7766 | Rd: Register.Encoded, |
| 7812 | Rn: Register.Encoded, | 7767 | Rn: Register.Encoded, |
| 7813 | decoded10: u5 = 0b10000, | 7768 | decoded10: u2 = 0b10, |
| 7814 | rmode: Rmode = .z, | 7769 | opcode: u5 = 0b10100, |
| 7815 | decoded18: u3 = 0b001, | 7770 | decoded17: u5 = 0b10000, |
| 7816 | decoded21: u1 = 0b1, | 7771 | size: Size, |
| 7817 | ftype: Ftype, | | |
| 7818 | decoded24: u5 = 0b11110, | 7772 | decoded24: u5 = 0b11110, |
| 7819 | S: bool = false, | 7773 | U: std.builtin.Signedness = .unsigned, |
| 7820 | decoded30: u1 = 0b0, | 7774 | decoded30: u2 = 0b01, |
| 7821 | M: u1 = 0b0, | | |
| 7822 | }; | 7775 | }; |
| 7823 | | 7776 | |
| 7824 | /// C7.2.156 FRINTA (scalar) | 7777 | /// C7.2.88 FCVTXN |
| 7825 | pub const Frinta = packed struct { | 7778 | pub const Fcvtxn = packed struct { |
| 7826 | Rd: Register.Encoded, | 7779 | Rd: Register.Encoded, |
| 7827 | Rn: Register.Encoded, | 7780 | Rn: Register.Encoded, |
| 7828 | decoded10: u5 = 0b10000, | 7781 | decoded10: u2 = 0b10, |
| 7829 | rmode: Rmode = .a, | 7782 | opcode: u5 = 0b10110, |
| 7830 | decoded18: u3 = 0b001, | 7783 | decoded17: u5 = 0b10000, |
| 7831 | decoded21: u1 = 0b1, | 7784 | sz: Sz, |
| 7832 | ftype: Ftype, | 7785 | o2: u1 = 0b0, |
| 7833 | decoded24: u5 = 0b11110, | 7786 | decoded24: u5 = 0b11110, |
| 7834 | S: bool = false, | 7787 | U: std.builtin.Signedness = .unsigned, |
| 7835 | decoded30: u1 = 0b0, | 7788 | decoded30: u2 = 0b01, |
| 7836 | M: u1 = 0b0, | | |
| 7837 | }; | 7789 | }; |
| 7838 | | 7790 | |
| 7839 | /// C7.2.166 FRINTX (scalar) | 7791 | /// C7.2.82 FCVTNU (vector) |
| 7840 | pub const Frintx = packed struct { | 7792 | pub const Fcvtnu = packed struct { |
| 7841 | Rd: Register.Encoded, | 7793 | Rd: Register.Encoded, |
| 7842 | Rn: Register.Encoded, | 7794 | Rn: Register.Encoded, |
| 7843 | decoded10: u5 = 0b10000, | 7795 | decoded10: u2 = 0b10, |
| 7844 | rmode: Rmode = .x, | 7796 | opcode: u5 = 0b11010, |
| 7845 | decoded18: u3 = 0b001, | 7797 | decoded17: u5 = 0b10000, |
| 7846 | decoded21: u1 = 0b1, | 7798 | sz: Sz, |
| 7847 | ftype: Ftype, | 7799 | o2: u1 = 0b0, |
| 7848 | decoded24: u5 = 0b11110, | 7800 | decoded24: u5 = 0b11110, |
| 7849 | S: bool = false, | 7801 | U: std.builtin.Signedness = .unsigned, |
| 7850 | decoded30: u1 = 0b0, | 7802 | decoded30: u2 = 0b01, |
| 7851 | M: u1 = 0b0, | | |
| 7852 | }; | 7803 | }; |
| 7853 | | 7804 | |
| 7854 | /// C7.2.158 FRINTI (scalar) | 7805 | /// C7.2.77 FCVTMU (vector) |
| 7855 | pub const Frinti = packed struct { | 7806 | pub const Fcvtmu = packed struct { |
| 7856 | Rd: Register.Encoded, | 7807 | Rd: Register.Encoded, |
| 7857 | Rn: Register.Encoded, | 7808 | Rn: Register.Encoded, |
| 7858 | decoded10: u5 = 0b10000, | 7809 | decoded10: u2 = 0b10, |
| 7859 | rmode: Rmode = .i, | 7810 | opcode: u5 = 0b11011, |
| 7860 | decoded18: u3 = 0b001, | 7811 | decoded17: u5 = 0b10000, |
| 7861 | decoded21: u1 = 0b1, | 7812 | sz: Sz, |
| 7862 | ftype: Ftype, | 7813 | o2: u1 = 0b0, |
| 7863 | decoded24: u5 = 0b11110, | 7814 | decoded24: u5 = 0b11110, |
| 7864 | S: bool = false, | 7815 | U: std.builtin.Signedness = .unsigned, |
| 7865 | decoded30: u1 = 0b0, | 7816 | decoded30: u2 = 0b01, |
| 7866 | M: u1 = 0b0, | | |
| 7867 | }; | 7817 | }; |
| 7868 | | 7818 | |
| 7869 | pub const Rmode = enum(u3) { | 7819 | /// C7.2.72 FCVTAU (vector) |
| 7870 | /// to nearest with ties to even | 7820 | pub const Fcvtau = packed struct { |
| 7871 | n = 0b000, | 7821 | Rd: Register.Encoded, |
| 7872 | /// toward plus infinity | 7822 | Rn: Register.Encoded, |
| 7873 | p = 0b001, | 7823 | decoded10: u2 = 0b10, |
| 7874 | /// toward minus infinity | 7824 | opcode: u5 = 0b11100, |
| 7875 | m = 0b010, | 7825 | decoded17: u5 = 0b10000, |
| 7876 | /// toward zero | 7826 | sz: Sz, |
| 7877 | z = 0b011, | 7827 | o2: u1 = 0b0, |
| 7878 | /// to nearest with ties to away | 7828 | decoded24: u5 = 0b11110, |
| 7879 | a = 0b100, | 7829 | U: std.builtin.Signedness = .unsigned, |
| 7880 | /// exact, using current rounding mode | 7830 | decoded30: u2 = 0b01, |
| 7881 | x = 0b110, | | |
| 7882 | /// using current rounding mode | | |
| 7883 | i = 0b111, | | |
| 7884 | _, | | |
| 7885 | }; | 7831 | }; |
| 7886 | }; | | |
| 7887 | | | |
| 7888 | /// Floating-point compare | | |
| 7889 | pub const FloatCompare = packed union { | | |
| 7890 | group: @This().Group, | | |
| 7891 | fcmp: Fcmp, | | |
| 7892 | fcmpe: Fcmpe, | | |
| 7893 | | 7832 | |
| 7894 | pub const Group = packed struct { | 7833 | /// C7.2.353 UCVTF (vector, integer) |
| 7895 | opcode2: u5, | 7834 | pub const Ucvtf = packed struct { |
| | 7835 | Rd: Register.Encoded, |
| 7896 | Rn: Register.Encoded, | 7836 | Rn: Register.Encoded, |
| 7897 | decoded10: u4 = 0b1000, | 7837 | decoded10: u2 = 0b10, |
| 7898 | op: u2, | 7838 | opcode: u5 = 0b11101, |
| 7899 | Rm: Register.Encoded, | 7839 | decoded17: u5 = 0b10000, |
| 7900 | decoded21: u1 = 0b1, | 7840 | sz: Sz, |
| 7901 | ptype: Ftype, | 7841 | o2: u1 = 0b0, |
| 7902 | decoded24: u5 = 0b11110, | 7842 | decoded24: u5 = 0b11110, |
| 7903 | S: bool, | 7843 | U: std.builtin.Signedness = .unsigned, |
| 7904 | decoded30: u1 = 0b0, | 7844 | decoded30: u2 = 0b01, |
| 7905 | M: u1, | | |
| 7906 | }; | 7845 | }; |
| 7907 | | 7846 | |
| 7908 | /// C7.2.66 FCMP | 7847 | /// C7.2.59 FCMGE (zero) |
| 7909 | pub const Fcmp = packed struct { | 7848 | pub const Fcmge = packed struct { |
| 7910 | decoded0: u3 = 0b000, | 7849 | Rd: Register.Encoded, |
| 7911 | opc0: Opc0, | | |
| 7912 | opc1: u1 = 0b0, | | |
| 7913 | Rn: Register.Encoded, | 7850 | Rn: Register.Encoded, |
| 7914 | decoded10: u4 = 0b1000, | 7851 | decoded10: u2 = 0b10, |
| 7915 | op: u2 = 0b00, | 7852 | opcode: u5 = 0b01100, |
| 7916 | Rm: Register.Encoded, | 7853 | decoded17: u5 = 0b10000, |
| 7917 | decoded21: u1 = 0b1, | 7854 | sz: Sz, |
| 7918 | ftype: Ftype, | 7855 | o2: u1 = 0b1, |
| 7919 | decoded24: u5 = 0b11110, | 7856 | decoded24: u5 = 0b11110, |
| 7920 | S: bool = false, | 7857 | U: std.builtin.Signedness = .unsigned, |
| 7921 | decoded30: u1 = 0b0, | 7858 | decoded30: u2 = 0b01, |
| 7922 | M: u1 = 0b0, | | |
| 7923 | }; | 7859 | }; |
| 7924 | | 7860 | |
| 7925 | /// C7.2.67 FCMPE | 7861 | /// C7.2.64 FCMLE (zero) |
| 7926 | pub const Fcmpe = packed struct { | 7862 | pub const Fcmle = packed struct { |
| 7927 | decoded0: u3 = 0b000, | 7863 | Rd: Register.Encoded, |
| 7928 | opc0: Opc0, | | |
| 7929 | opc1: u1 = 0b1, | | |
| 7930 | Rn: Register.Encoded, | 7864 | Rn: Register.Encoded, |
| 7931 | decoded10: u4 = 0b1000, | 7865 | decoded10: u2 = 0b10, |
| 7932 | op: u2 = 0b00, | 7866 | opcode: u5 = 0b01101, |
| 7933 | Rm: Register.Encoded, | 7867 | decoded17: u5 = 0b10000, |
| 7934 | decoded21: u1 = 0b1, | 7868 | sz: Sz, |
| 7935 | ftype: Ftype, | 7869 | o2: u1 = 0b1, |
| 7936 | decoded24: u5 = 0b11110, | 7870 | decoded24: u5 = 0b11110, |
| 7937 | S: bool = false, | 7871 | U: std.builtin.Signedness = .unsigned, |
| 7938 | decoded30: u1 = 0b0, | 7872 | decoded30: u2 = 0b01, |
| 7939 | M: u1 = 0b0, | | |
| 7940 | }; | 7873 | }; |
| 7941 | | 7874 | |
| 7942 | pub const Opc0 = enum(u1) { | 7875 | /// C7.2.86 FCVTPU (vector) |
| 7943 | register = 0b00, | 7876 | pub const Fcvtpu = packed struct { |
| 7944 | zero = 0b01, | 7877 | Rd: Register.Encoded, |
| | 7878 | Rn: Register.Encoded, |
| | 7879 | decoded10: u2 = 0b10, |
| | 7880 | opcode: u5 = 0b11010, |
| | 7881 | decoded17: u5 = 0b10000, |
| | 7882 | sz: Sz, |
| | 7883 | o2: u1 = 0b1, |
| | 7884 | decoded24: u5 = 0b11110, |
| | 7885 | U: std.builtin.Signedness = .unsigned, |
| | 7886 | decoded30: u2 = 0b01, |
| 7945 | }; | 7887 | }; |
| 7946 | }; | | |
| 7947 | | | |
| 7948 | /// Floating-point immediate | | |
| 7949 | pub const FloatImmediate = packed union { | | |
| 7950 | group: @This().Group, | | |
| 7951 | fmov: Fmov, | | |
| 7952 | | 7888 | |
| 7953 | pub const Group = packed struct { | 7889 | /// C7.2.94 FCVTZU (vector, integer) |
| | 7890 | pub const Fcvtzu = packed struct { |
| 7954 | Rd: Register.Encoded, | 7891 | Rd: Register.Encoded, |
| 7955 | imm5: u5, | 7892 | Rn: Register.Encoded, |
| 7956 | decoded10: u3 = 0b100, | 7893 | decoded10: u2 = 0b10, |
| 7957 | imm8: u8, | 7894 | opcode: u5 = 0b11011, |
| 7958 | decoded21: u1 = 0b1, | 7895 | decoded17: u5 = 0b10000, |
| 7959 | ptype: Ftype, | 7896 | sz: Sz, |
| | 7897 | o2: u1 = 0b1, |
| 7960 | decoded24: u5 = 0b11110, | 7898 | decoded24: u5 = 0b11110, |
| 7961 | S: bool, | 7899 | U: std.builtin.Signedness = .unsigned, |
| 7962 | decoded30: u1 = 0b0, | 7900 | decoded30: u2 = 0b01, |
| 7963 | M: u1, | | |
| 7964 | }; | 7901 | }; |
| 7965 | | 7902 | |
| 7966 | /// C7.2.132 FMOV (scalar, immediate) | 7903 | /// C7.2.169 FRSQRTE |
| 7967 | pub const Fmov = packed struct { | 7904 | pub const Frsqrte = packed struct { |
| 7968 | Rd: Register.Encoded, | 7905 | Rd: Register.Encoded, |
| 7969 | imm5: u5 = 0b00000, | 7906 | Rn: Register.Encoded, |
| 7970 | decoded10: u3 = 0b100, | 7907 | decoded10: u2 = 0b10, |
| 7971 | imm8: u8, | 7908 | opcode: u5 = 0b11101, |
| 7972 | decoded21: u1 = 0b1, | 7909 | decoded17: u5 = 0b10000, |
| 7973 | ftype: Ftype, | 7910 | sz: Sz, |
| | 7911 | o2: u1 = 0b1, |
| 7974 | decoded24: u5 = 0b11110, | 7912 | decoded24: u5 = 0b11110, |
| 7975 | S: bool = false, | 7913 | U: std.builtin.Signedness = .unsigned, |
| 7976 | decoded30: u1 = 0b0, | 7914 | decoded30: u2 = 0b01, |
| 7977 | M: u1 = 0b0, | | |
| 7978 | }; | 7915 | }; |
| 7979 | }; | 7916 | }; |
| 7980 | | 7917 | |
| 7981 | /// Floating-point data-processing (2 source) | 7918 | /// Advanced SIMD scalar pairwise |
| 7982 | pub const FloatDataProcessingTwoSource = packed union { | 7919 | pub const SimdScalarPairwise = packed union { |
| 7983 | group: @This().Group, | 7920 | group: @This().Group, |
| 7984 | fmul: Fmul, | 7921 | addp: Addp, |
| 7985 | fdiv: Fdiv, | | |
| 7986 | fadd: Fadd, | | |
| 7987 | fsub: Fsub, | | |
| 7988 | fmax: Fmax, | | |
| 7989 | fmin: Fmin, | | |
| 7990 | fmaxnm: Fmaxnm, | | |
| 7991 | fminnm: Fminnm, | | |
| 7992 | fnmul: Fnmul, | | |
| 7993 | | 7922 | |
| 7994 | pub const Group = packed struct { | 7923 | pub const Group = packed struct { |
| 7995 | Rd: Register.Encoded, | 7924 | Rd: Register.Encoded, |
| 7996 | Rn: Register.Encoded, | 7925 | Rn: Register.Encoded, |
| 7997 | decoded10: u2 = 0b10, | 7926 | decoded10: u2 = 0b10, |
| 7998 | opcode: Opcode, | 7927 | opcode: u5, |
| 7999 | Rm: Register.Encoded, | 7928 | decoded17: u5 = 0b11000, |
| 8000 | decoded21: u1 = 0b1, | 7929 | size: Size, |
| 8001 | ptype: Ftype, | | |
| 8002 | decoded24: u5 = 0b11110, | 7930 | decoded24: u5 = 0b11110, |
| 8003 | S: bool, | 7931 | U: std.builtin.Signedness, |
| 8004 | decoded30: u1 = 0b0, | 7932 | decoded30: u2 = 0b01, |
| 8005 | M: u1, | | |
| 8006 | }; | 7933 | }; |
| 8007 | | 7934 | |
| 8008 | /// C7.2.136 FMUL (scalar) | 7935 | /// C7.2.4 ADDP (scalar) |
| 8009 | pub const Fmul = packed struct { | 7936 | pub const Addp = packed struct { |
| 8010 | Rd: Register.Encoded, | 7937 | Rd: Register.Encoded, |
| 8011 | Rn: Register.Encoded, | 7938 | Rn: Register.Encoded, |
| 8012 | decoded10: u2 = 0b10, | 7939 | decoded10: u2 = 0b10, |
| 8013 | opcode: Opcode = .fmul, | 7940 | opcode: u5 = 0b11011, |
| 8014 | Rm: Register.Encoded, | 7941 | decoded17: u5 = 0b11000, |
| 8015 | decoded21: u1 = 0b1, | 7942 | size: Size, |
| 8016 | ftype: Ftype, | | |
| 8017 | decoded24: u5 = 0b11110, | 7943 | decoded24: u5 = 0b11110, |
| 8018 | S: bool = false, | 7944 | U: std.builtin.Signedness = .signed, |
| 8019 | decoded30: u1 = 0b0, | 7945 | decoded30: u2 = 0b01, |
| 8020 | M: u1 = 0b0, | | |
| 8021 | }; | 7946 | }; |
| | 7947 | }; |
| 8022 | | 7948 | |
| 8023 | /// C7.2.98 FDIV (scalar) | 7949 | /// Advanced SIMD copy |
| 8024 | pub const Fdiv = packed struct { | 7950 | pub const SimdCopy = packed union { |
| | 7951 | group: @This().Group, |
| | 7952 | dup: Dup, |
| | 7953 | smov: Smov, |
| | 7954 | umov: Umov, |
| | 7955 | ins: Ins, |
| | 7956 | |
| | 7957 | pub const Group = packed struct { |
| 8025 | Rd: Register.Encoded, | 7958 | Rd: Register.Encoded, |
| 8026 | Rn: Register.Encoded, | 7959 | Rn: Register.Encoded, |
| 8027 | decoded10: u2 = 0b10, | 7960 | decoded10: u1 = 0b1, |
| 8028 | opcode: Opcode = .fdiv, | 7961 | imm4: u4, |
| 8029 | Rm: Register.Encoded, | 7962 | decoded15: u1 = 0b0, |
| 8030 | decoded21: u1 = 0b1, | 7963 | imm5: u5, |
| 8031 | ftype: Ftype, | 7964 | decoded21: u8 = 0b01110000, |
| 8032 | decoded24: u5 = 0b11110, | 7965 | op: u1, |
| 8033 | S: bool = false, | 7966 | Q: u1, |
| 8034 | decoded30: u1 = 0b0, | 7967 | decoded31: u1 = 0b0, |
| 8035 | M: u1 = 0b0, | | |
| 8036 | }; | 7968 | }; |
| 8037 | | 7969 | |
| 8038 | /// C7.2.50 FADD (scalar) | 7970 | /// C7.2.39 DUP (element) |
| 8039 | pub const Fadd = packed struct { | 7971 | /// C7.2.40 DUP (general) |
| | 7972 | pub const Dup = packed struct { |
| 8040 | Rd: Register.Encoded, | 7973 | Rd: Register.Encoded, |
| 8041 | Rn: Register.Encoded, | 7974 | Rn: Register.Encoded, |
| 8042 | decoded10: u2 = 0b10, | 7975 | decoded10: u1 = 0b1, |
| 8043 | opcode: Opcode = .fadd, | 7976 | imm4: Imm4, |
| 8044 | Rm: Register.Encoded, | 7977 | decoded15: u1 = 0b0, |
| 8045 | decoded21: u1 = 0b1, | 7978 | imm5: u5, |
| 8046 | ftype: Ftype, | 7979 | decoded21: u8 = 0b01110000, |
| 8047 | decoded24: u5 = 0b11110, | 7980 | op: u1 = 0b0, |
| 8048 | S: bool = false, | 7981 | Q: Q, |
| 8049 | decoded30: u1 = 0b0, | 7982 | decoded31: u1 = 0b0, |
| 8050 | M: u1 = 0b0, | 7983 | |
| | 7984 | pub const Imm4 = enum(u4) { |
| | 7985 | element = 0b0000, |
| | 7986 | general = 0b0001, |
| | 7987 | _, |
| | 7988 | }; |
| 8051 | }; | 7989 | }; |
| 8052 | | 7990 | |
| 8053 | /// C7.2.174 FSUB (scalar) | 7991 | /// C7.2.279 SMOV |
| 8054 | pub const Fsub = packed struct { | 7992 | pub const Smov = packed struct { |
| 8055 | Rd: Register.Encoded, | 7993 | Rd: Register.Encoded, |
| 8056 | Rn: Register.Encoded, | 7994 | Rn: Register.Encoded, |
| 8057 | decoded10: u2 = 0b10, | 7995 | decoded10: u1 = 0b1, |
| 8058 | opcode: Opcode = .fsub, | 7996 | imm4: u4 = 0b0101, |
| 8059 | Rm: Register.Encoded, | 7997 | decoded15: u1 = 0b0, |
| 8060 | decoded21: u1 = 0b1, | 7998 | imm5: u5, |
| 8061 | ftype: Ftype, | 7999 | decoded21: u8 = 0b01110000, |
| 8062 | decoded24: u5 = 0b11110, | 8000 | op: u1 = 0b0, |
| 8063 | S: bool = false, | 8001 | Q: Register.IntegerSize, |
| 8064 | decoded30: u1 = 0b0, | 8002 | decoded31: u1 = 0b0, |
| 8065 | M: u1 = 0b0, | | |
| 8066 | }; | 8003 | }; |
| 8067 | | 8004 | |
| 8068 | /// C7.2.102 FMAX (scalar) | 8005 | /// C7.2.371 UMOV |
| 8069 | pub const Fmax = packed struct { | 8006 | pub const Umov = packed struct { |
| 8070 | Rd: Register.Encoded, | 8007 | Rd: Register.Encoded, |
| 8071 | Rn: Register.Encoded, | 8008 | Rn: Register.Encoded, |
| 8072 | decoded10: u2 = 0b10, | 8009 | decoded10: u1 = 0b1, |
| 8073 | opcode: Opcode = .fmax, | 8010 | imm4: u4 = 0b0111, |
| 8074 | Rm: Register.Encoded, | 8011 | decoded15: u1 = 0b0, |
| 8075 | decoded21: u1 = 0b1, | 8012 | imm5: u5, |
| 8076 | ftype: Ftype, | 8013 | decoded21: u8 = 0b01110000, |
| 8077 | decoded24: u5 = 0b11110, | 8014 | op: u1 = 0b0, |
| 8078 | S: bool = false, | 8015 | Q: Register.IntegerSize, |
| 8079 | decoded30: u1 = 0b0, | 8016 | decoded31: u1 = 0b0, |
| 8080 | M: u1 = 0b0, | | |
| 8081 | }; | 8017 | }; |
| 8082 | | 8018 | |
| 8083 | /// C7.2.112 FMIN (scalar) | 8019 | /// C7.2.175 INS (element) |
| 8084 | pub const Fmin = packed struct { | 8020 | /// C7.2.176 INS (general) |
| | 8021 | pub const Ins = packed struct { |
| 8085 | Rd: Register.Encoded, | 8022 | Rd: Register.Encoded, |
| 8086 | Rn: Register.Encoded, | 8023 | Rn: Register.Encoded, |
| 8087 | decoded10: u2 = 0b10, | 8024 | decoded10: u1 = 0b1, |
| 8088 | opcode: Opcode = .fmin, | 8025 | imm4: Imm4, |
| 8089 | Rm: Register.Encoded, | 8026 | decoded15: u1 = 0b0, |
| 8090 | decoded21: u1 = 0b1, | 8027 | imm5: u5, |
| 8091 | ftype: Ftype, | 8028 | decoded21: u8 = 0b01110000, |
| 8092 | decoded24: u5 = 0b11110, | 8029 | op: Op, |
| 8093 | S: bool = false, | 8030 | Q: u1 = 0b1, |
| 8094 | decoded30: u1 = 0b0, | 8031 | decoded31: u1 = 0b0, |
| 8095 | M: u1 = 0b0, | 8032 | |
| | 8033 | pub const Imm4 = packed union { |
| | 8034 | general: General, |
| | 8035 | element: u4, |
| | 8036 | |
| | 8037 | pub const General = enum(u4) { |
| | 8038 | general = 0b0011, |
| | 8039 | _, |
| | 8040 | }; |
| | 8041 | }; |
| | 8042 | |
| | 8043 | pub const Op = enum(u1) { |
| | 8044 | general = 0b0, |
| | 8045 | element = 0b1, |
| | 8046 | }; |
| 8096 | }; | 8047 | }; |
| 8097 | | 8048 | |
| 8098 | /// C7.2.104 FMAXNM (scalar) | 8049 | pub const Decoded = union(enum) { |
| 8099 | pub const Fmaxnm = packed struct { | 8050 | unallocated, |
| | 8051 | dup: Dup, |
| | 8052 | smov: Smov, |
| | 8053 | umov: Umov, |
| | 8054 | ins: Ins, |
| | 8055 | }; |
| | 8056 | pub fn decode(inst: @This()) @This().Decoded { |
| | 8057 | return switch (inst.group.op) { |
| | 8058 | 0b0 => switch (inst.group.imm4) { |
| | 8059 | 0b0000, 0b0001 => .{ .dup = inst.dup }, |
| | 8060 | else => .unallocated, |
| | 8061 | 0b0101 => switch (@ctz(inst.group.imm5)) { |
| | 8062 | 0, 1 => .{ .smov = inst.smov }, |
| | 8063 | 2 => switch (inst.group.Q) { |
| | 8064 | 0b1 => .{ .smov = inst.smov }, |
| | 8065 | 0b0 => .unallocated, |
| | 8066 | }, |
| | 8067 | else => .unallocated, |
| | 8068 | }, |
| | 8069 | 0b0111 => switch (@ctz(inst.group.imm5)) { |
| | 8070 | 0, 1, 2 => switch (inst.group.Q) { |
| | 8071 | 0b0 => .{ .umov = inst.umov }, |
| | 8072 | 0b1 => .unallocated, |
| | 8073 | }, |
| | 8074 | 3 => switch (inst.group.Q) { |
| | 8075 | 0b1 => .{ .umov = inst.umov }, |
| | 8076 | 0b0 => .unallocated, |
| | 8077 | }, |
| | 8078 | else => .unallocated, |
| | 8079 | }, |
| | 8080 | }, |
| | 8081 | 0b1 => switch (inst.group.Q) { |
| | 8082 | 0b0 => .unallocated, |
| | 8083 | 0b1 => .{ .ins = inst.ins }, |
| | 8084 | }, |
| | 8085 | }; |
| | 8086 | } |
| | 8087 | }; |
| | 8088 | |
| | 8089 | /// Advanced SIMD two-register miscellaneous (FP16) |
| | 8090 | pub const SimdTwoRegisterMiscellaneousFp16 = packed union { |
| | 8091 | group: @This().Group, |
| | 8092 | frintn: Frintn, |
| | 8093 | frintm: Frintm, |
| | 8094 | fcvtns: Fcvtns, |
| | 8095 | fcvtms: Fcvtms, |
| | 8096 | fcvtas: Fcvtas, |
| | 8097 | scvtf: Scvtf, |
| | 8098 | fcmgt: Fcmgt, |
| | 8099 | fcmeq: Fcmeq, |
| | 8100 | fcmlt: Fcmlt, |
| | 8101 | fabs: Fabs, |
| | 8102 | frintp: Frintp, |
| | 8103 | frintz: Frintz, |
| | 8104 | fcvtps: Fcvtps, |
| | 8105 | fcvtzs: Fcvtzs, |
| | 8106 | frecpe: Frecpe, |
| | 8107 | frinta: Frinta, |
| | 8108 | frintx: Frintx, |
| | 8109 | fcvtnu: Fcvtnu, |
| | 8110 | fcvtmu: Fcvtmu, |
| | 8111 | fcvtau: Fcvtau, |
| | 8112 | ucvtf: Ucvtf, |
| | 8113 | fcmge: Fcmge, |
| | 8114 | fcmle: Fcmle, |
| | 8115 | fneg: Fneg, |
| | 8116 | frinti: Frinti, |
| | 8117 | fcvtpu: Fcvtpu, |
| | 8118 | fcvtzu: Fcvtzu, |
| | 8119 | frsqrte: Frsqrte, |
| | 8120 | fsqrt: Fsqrt, |
| | 8121 | |
| | 8122 | pub const Group = packed struct { |
| 8100 | Rd: Register.Encoded, | 8123 | Rd: Register.Encoded, |
| 8101 | Rn: Register.Encoded, | 8124 | Rn: Register.Encoded, |
| 8102 | decoded10: u2 = 0b10, | 8125 | decoded10: u2 = 0b10, |
| 8103 | opcode: Opcode = .fmaxnm, | 8126 | opcode: u5, |
| 8104 | Rm: Register.Encoded, | 8127 | decoded17: u6 = 0b111100, |
| 8105 | decoded21: u1 = 0b1, | 8128 | a: u1, |
| 8106 | ftype: Ftype, | 8129 | decoded24: u5 = 0b01110, |
| 8107 | decoded24: u5 = 0b11110, | 8130 | U: std.builtin.Signedness, |
| 8108 | S: bool = false, | 8131 | Q: Q, |
| 8109 | decoded30: u1 = 0b0, | 8132 | decoded31: u1 = 0b0, |
| 8110 | M: u1 = 0b0, | | |
| 8111 | }; | 8133 | }; |
| 8112 | | 8134 | |
| 8113 | /// C7.2.114 FMINNM (scalar) | 8135 | /// C7.2.161 FRINTN (vector) |
| 8114 | pub const Fminnm = packed struct { | 8136 | pub const Frintn = packed struct { |
| 8115 | Rd: Register.Encoded, | 8137 | Rd: Register.Encoded, |
| 8116 | Rn: Register.Encoded, | 8138 | Rn: Register.Encoded, |
| 8117 | decoded10: u2 = 0b10, | 8139 | decoded10: u2 = 0b10, |
| 8118 | opcode: Opcode = .fminnm, | 8140 | opcode: u5 = 0b11000, |
| 8119 | Rm: Register.Encoded, | 8141 | decoded17: u6 = 0b111100, |
| 8120 | decoded21: u1 = 0b1, | 8142 | o2: u1 = 0b0, |
| 8121 | ftype: Ftype, | 8143 | decoded24: u5 = 0b01110, |
| 8122 | decoded24: u5 = 0b11110, | 8144 | U: std.builtin.Signedness = .signed, |
| 8123 | S: bool = false, | 8145 | Q: Q, |
| 8124 | decoded30: u1 = 0b0, | 8146 | decoded31: u1 = 0b0, |
| 8125 | M: u1 = 0b0, | | |
| 8126 | }; | 8147 | }; |
| 8127 | | 8148 | |
| 8128 | /// C7.2.143 FNMUL (scalar) | 8149 | /// C7.2.159 FRINTM (vector) |
| 8129 | pub const Fnmul = packed struct { | 8150 | pub const Frintm = packed struct { |
| 8130 | Rd: Register.Encoded, | 8151 | Rd: Register.Encoded, |
| 8131 | Rn: Register.Encoded, | 8152 | Rn: Register.Encoded, |
| 8132 | decoded10: u2 = 0b10, | 8153 | decoded10: u2 = 0b10, |
| 8133 | opcode: Opcode = .fnmul, | 8154 | opcode: u5 = 0b11001, |
| 8134 | Rm: Register.Encoded, | 8155 | decoded17: u6 = 0b111100, |
| 8135 | decoded21: u1 = 0b1, | 8156 | o2: u1 = 0b0, |
| 8136 | ftype: Ftype, | 8157 | decoded24: u5 = 0b01110, |
| 8137 | decoded24: u5 = 0b11110, | 8158 | U: std.builtin.Signedness = .signed, |
| 8138 | S: bool = false, | 8159 | Q: Q, |
| 8139 | decoded30: u1 = 0b0, | 8160 | decoded31: u1 = 0b0, |
| 8140 | M: u1 = 0b0, | | |
| 8141 | }; | | |
| 8142 | | | |
| 8143 | pub const Opcode = enum(u4) { | | |
| 8144 | fmul = 0b0000, | | |
| 8145 | fdiv = 0b0001, | | |
| 8146 | fadd = 0b0010, | | |
| 8147 | fsub = 0b0011, | | |
| 8148 | fmax = 0b0100, | | |
| 8149 | fmin = 0b0101, | | |
| 8150 | fmaxnm = 0b0110, | | |
| 8151 | fminnm = 0b0111, | | |
| 8152 | fnmul = 0b1000, | | |
| 8153 | _, | | |
| 8154 | }; | 8161 | }; |
| 8155 | }; | | |
| 8156 | | | |
| 8157 | /// Floating-point data-processing (3 source) | | |
| 8158 | pub const FloatDataProcessingThreeSource = packed union { | | |
| 8159 | group: @This().Group, | | |
| 8160 | fmadd: Fmadd, | | |
| 8161 | fmsub: Fmsub, | | |
| 8162 | fnmadd: Fnmadd, | | |
| 8163 | fnmsub: Fnmsub, | | |
| 8164 | | 8162 | |
| 8165 | pub const Group = packed struct { | 8163 | /// C7.2.80 FCVTNS (vector) |
| | 8164 | pub const Fcvtns = packed struct { |
| 8166 | Rd: Register.Encoded, | 8165 | Rd: Register.Encoded, |
| 8167 | Rn: Register.Encoded, | 8166 | Rn: Register.Encoded, |
| 8168 | Ra: Register.Encoded, | 8167 | decoded10: u2 = 0b10, |
| 8169 | o0: AddSubtractOp, | 8168 | opcode: u5 = 0b11010, |
| 8170 | Rm: Register.Encoded, | 8169 | decoded17: u6 = 0b111100, |
| 8171 | o1: u1, | 8170 | o2: u1 = 0b0, |
| 8172 | ptype: Ftype, | 8171 | decoded24: u5 = 0b01110, |
| 8173 | decoded24: u5 = 0b11111, | 8172 | U: std.builtin.Signedness = .signed, |
| 8174 | S: bool, | 8173 | Q: Q, |
| 8175 | decoded30: u1 = 0b0, | 8174 | decoded31: u1 = 0b0, |
| 8176 | M: u1, | | |
| 8177 | }; | 8175 | }; |
| 8178 | | 8176 | |
| 8179 | /// C7.2.100 FMADD | 8177 | /// C7.2.75 FCVTMS (vector) |
| 8180 | pub const Fmadd = packed struct { | 8178 | pub const Fcvtms = packed struct { |
| 8181 | Rd: Register.Encoded, | 8179 | Rd: Register.Encoded, |
| 8182 | Rn: Register.Encoded, | 8180 | Rn: Register.Encoded, |
| 8183 | Ra: Register.Encoded, | 8181 | decoded10: u2 = 0b10, |
| 8184 | o0: AddSubtractOp = .add, | 8182 | opcode: u5 = 0b11011, |
| 8185 | Rm: Register.Encoded, | 8183 | decoded17: u6 = 0b111100, |
| 8186 | o1: O1 = .fm, | 8184 | o2: u1 = 0b0, |
| 8187 | ftype: Ftype, | 8185 | decoded24: u5 = 0b01110, |
| 8188 | decoded24: u5 = 0b11111, | 8186 | U: std.builtin.Signedness = .signed, |
| 8189 | S: bool = false, | 8187 | Q: Q, |
| 8190 | decoded30: u1 = 0b0, | 8188 | decoded31: u1 = 0b0, |
| 8191 | M: u1 = 0b0, | | |
| 8192 | }; | 8189 | }; |
| 8193 | | 8190 | |
| 8194 | /// C7.2.133 FMSUB | 8191 | /// C7.2.70 FCVTAS (vector) |
| 8195 | pub const Fmsub = packed struct { | 8192 | pub const Fcvtas = packed struct { |
| 8196 | Rd: Register.Encoded, | 8193 | Rd: Register.Encoded, |
| 8197 | Rn: Register.Encoded, | 8194 | Rn: Register.Encoded, |
| 8198 | Ra: Register.Encoded, | 8195 | decoded10: u2 = 0b10, |
| 8199 | o0: AddSubtractOp = .sub, | 8196 | opcode: u5 = 0b11100, |
| | 8197 | decoded17: u6 = 0b111100, |
| | 8198 | o2: u1 = 0b0, |
| | 8199 | decoded24: u5 = 0b01110, |
| | 8200 | U: std.builtin.Signedness = .signed, |
| | 8201 | Q: Q, |
| | 8202 | decoded31: u1 = 0b0, |
| | 8203 | }; |
| | 8204 | |
| | 8205 | /// C7.2.234 SCVTF (vector, integer) |
| | 8206 | pub const Scvtf = packed struct { |
| | 8207 | Rd: Register.Encoded, |
| | 8208 | Rn: Register.Encoded, |
| | 8209 | decoded10: u2 = 0b10, |
| | 8210 | opcode: u5 = 0b11101, |
| | 8211 | decoded17: u6 = 0b111100, |
| | 8212 | o2: u1 = 0b0, |
| | 8213 | decoded24: u5 = 0b01110, |
| | 8214 | U: std.builtin.Signedness = .signed, |
| | 8215 | Q: Q, |
| | 8216 | decoded31: u1 = 0b0, |
| | 8217 | }; |
| | 8218 | |
| | 8219 | /// C7.2.61 FCMGT (zero) |
| | 8220 | pub const Fcmgt = packed struct { |
| | 8221 | Rd: Register.Encoded, |
| | 8222 | Rn: Register.Encoded, |
| | 8223 | decoded10: u2 = 0b10, |
| | 8224 | opcode: u5 = 0b01100, |
| | 8225 | decoded17: u6 = 0b111100, |
| | 8226 | o2: u1 = 0b1, |
| | 8227 | decoded24: u5 = 0b01110, |
| | 8228 | U: std.builtin.Signedness = .signed, |
| | 8229 | Q: Q, |
| | 8230 | decoded31: u1 = 0b0, |
| | 8231 | }; |
| | 8232 | |
| | 8233 | /// C7.2.57 FCMEQ (zero) |
| | 8234 | pub const Fcmeq = packed struct { |
| | 8235 | Rd: Register.Encoded, |
| | 8236 | Rn: Register.Encoded, |
| | 8237 | decoded10: u2 = 0b10, |
| | 8238 | opcode: u5 = 0b01101, |
| | 8239 | decoded17: u6 = 0b111100, |
| | 8240 | o2: u1 = 0b1, |
| | 8241 | decoded24: u5 = 0b01110, |
| | 8242 | U: std.builtin.Signedness = .signed, |
| | 8243 | Q: Q, |
| | 8244 | decoded31: u1 = 0b0, |
| | 8245 | }; |
| | 8246 | |
| | 8247 | /// C7.2.65 FCMLT (zero) |
| | 8248 | pub const Fcmlt = packed struct { |
| | 8249 | Rd: Register.Encoded, |
| | 8250 | Rn: Register.Encoded, |
| | 8251 | decoded10: u2 = 0b10, |
| | 8252 | opcode: u5 = 0b01110, |
| | 8253 | decoded17: u6 = 0b111100, |
| | 8254 | o2: u1 = 0b1, |
| | 8255 | decoded24: u5 = 0b01110, |
| | 8256 | U: std.builtin.Signedness = .signed, |
| | 8257 | Q: Q, |
| | 8258 | decoded31: u1 = 0b0, |
| | 8259 | }; |
| | 8260 | |
| | 8261 | /// C7.2.45 FABS (vector) |
| | 8262 | pub const Fabs = packed struct { |
| | 8263 | Rd: Register.Encoded, |
| | 8264 | Rn: Register.Encoded, |
| | 8265 | decoded10: u2 = 0b10, |
| | 8266 | opcode: u5 = 0b01111, |
| | 8267 | decoded17: u6 = 0b111100, |
| | 8268 | o2: u1 = 0b1, |
| | 8269 | decoded24: u5 = 0b01110, |
| | 8270 | U: std.builtin.Signedness = .signed, |
| | 8271 | Q: Q, |
| | 8272 | decoded31: u1 = 0b0, |
| | 8273 | }; |
| | 8274 | |
| | 8275 | /// C7.2.163 FRINTP (vector) |
| | 8276 | pub const Frintp = packed struct { |
| | 8277 | Rd: Register.Encoded, |
| | 8278 | Rn: Register.Encoded, |
| | 8279 | decoded10: u2 = 0b10, |
| | 8280 | opcode: u5 = 0b11000, |
| | 8281 | decoded17: u6 = 0b111100, |
| | 8282 | o2: u1 = 0b1, |
| | 8283 | decoded24: u5 = 0b01110, |
| | 8284 | U: std.builtin.Signedness = .signed, |
| | 8285 | Q: Q, |
| | 8286 | decoded31: u1 = 0b0, |
| | 8287 | }; |
| | 8288 | |
| | 8289 | /// C7.2.167 FRINTZ (vector) |
| | 8290 | pub const Frintz = packed struct { |
| | 8291 | Rd: Register.Encoded, |
| | 8292 | Rn: Register.Encoded, |
| | 8293 | decoded10: u2 = 0b10, |
| | 8294 | opcode: u5 = 0b11001, |
| | 8295 | decoded17: u6 = 0b111100, |
| | 8296 | o2: u1 = 0b1, |
| | 8297 | decoded24: u5 = 0b01110, |
| | 8298 | U: std.builtin.Signedness = .signed, |
| | 8299 | Q: Q, |
| | 8300 | decoded31: u1 = 0b0, |
| | 8301 | }; |
| | 8302 | |
| | 8303 | /// C7.2.84 FCVTPS (vector) |
| | 8304 | pub const Fcvtps = packed struct { |
| | 8305 | Rd: Register.Encoded, |
| | 8306 | Rn: Register.Encoded, |
| | 8307 | decoded10: u2 = 0b10, |
| | 8308 | opcode: u5 = 0b11010, |
| | 8309 | decoded17: u6 = 0b111100, |
| | 8310 | o2: u1 = 0b1, |
| | 8311 | decoded24: u5 = 0b01110, |
| | 8312 | U: std.builtin.Signedness = .signed, |
| | 8313 | Q: Q, |
| | 8314 | decoded31: u1 = 0b0, |
| | 8315 | }; |
| | 8316 | |
| | 8317 | /// C7.2.90 FCVTZS (vector, integer) |
| | 8318 | pub const Fcvtzs = packed struct { |
| | 8319 | Rd: Register.Encoded, |
| | 8320 | Rn: Register.Encoded, |
| | 8321 | decoded10: u2 = 0b10, |
| | 8322 | opcode: u5 = 0b11011, |
| | 8323 | decoded17: u6 = 0b111100, |
| | 8324 | o2: u1 = 0b1, |
| | 8325 | decoded24: u5 = 0b01110, |
| | 8326 | U: std.builtin.Signedness = .signed, |
| | 8327 | Q: Q, |
| | 8328 | decoded31: u1 = 0b0, |
| | 8329 | }; |
| | 8330 | |
| | 8331 | /// C7.2.144 FRECPE |
| | 8332 | pub const Frecpe = packed struct { |
| | 8333 | Rd: Register.Encoded, |
| | 8334 | Rn: Register.Encoded, |
| | 8335 | decoded10: u2 = 0b10, |
| | 8336 | opcode: u5 = 0b11101, |
| | 8337 | decoded17: u6 = 0b111100, |
| | 8338 | o2: u1 = 0b1, |
| | 8339 | decoded24: u5 = 0b01110, |
| | 8340 | U: std.builtin.Signedness = .signed, |
| | 8341 | Q: Q, |
| | 8342 | decoded31: u1 = 0b0, |
| | 8343 | }; |
| | 8344 | |
| | 8345 | /// C7.2.155 FRINTA (vector) |
| | 8346 | pub const Frinta = packed struct { |
| | 8347 | Rd: Register.Encoded, |
| | 8348 | Rn: Register.Encoded, |
| | 8349 | decoded10: u2 = 0b10, |
| | 8350 | opcode: u5 = 0b11000, |
| | 8351 | decoded17: u6 = 0b111100, |
| | 8352 | o2: u1 = 0b0, |
| | 8353 | decoded24: u5 = 0b01110, |
| | 8354 | U: std.builtin.Signedness = .unsigned, |
| | 8355 | Q: Q, |
| | 8356 | decoded31: u1 = 0b0, |
| | 8357 | }; |
| | 8358 | |
| | 8359 | /// C7.2.159 FRINTX (vector) |
| | 8360 | pub const Frintx = packed struct { |
| | 8361 | Rd: Register.Encoded, |
| | 8362 | Rn: Register.Encoded, |
| | 8363 | decoded10: u2 = 0b10, |
| | 8364 | opcode: u5 = 0b11001, |
| | 8365 | decoded17: u6 = 0b111100, |
| | 8366 | o2: u1 = 0b0, |
| | 8367 | decoded24: u5 = 0b01110, |
| | 8368 | U: std.builtin.Signedness = .unsigned, |
| | 8369 | Q: Q, |
| | 8370 | decoded31: u1 = 0b0, |
| | 8371 | }; |
| | 8372 | |
| | 8373 | /// C7.2.82 FCVTNU (vector) |
| | 8374 | pub const Fcvtnu = packed struct { |
| | 8375 | Rd: Register.Encoded, |
| | 8376 | Rn: Register.Encoded, |
| | 8377 | decoded10: u2 = 0b10, |
| | 8378 | opcode: u5 = 0b11010, |
| | 8379 | decoded17: u6 = 0b111100, |
| | 8380 | o2: u1 = 0b0, |
| | 8381 | decoded24: u5 = 0b01110, |
| | 8382 | U: std.builtin.Signedness = .unsigned, |
| | 8383 | Q: Q, |
| | 8384 | decoded31: u1 = 0b0, |
| | 8385 | }; |
| | 8386 | |
| | 8387 | /// C7.2.77 FCVTMU (vector) |
| | 8388 | pub const Fcvtmu = packed struct { |
| | 8389 | Rd: Register.Encoded, |
| | 8390 | Rn: Register.Encoded, |
| | 8391 | decoded10: u2 = 0b10, |
| | 8392 | opcode: u5 = 0b11011, |
| | 8393 | decoded17: u6 = 0b111100, |
| | 8394 | o2: u1 = 0b0, |
| | 8395 | decoded24: u5 = 0b01110, |
| | 8396 | U: std.builtin.Signedness = .unsigned, |
| | 8397 | Q: Q, |
| | 8398 | decoded31: u1 = 0b0, |
| | 8399 | }; |
| | 8400 | |
| | 8401 | /// C7.2.72 FCVTAU (vector) |
| | 8402 | pub const Fcvtau = packed struct { |
| | 8403 | Rd: Register.Encoded, |
| | 8404 | Rn: Register.Encoded, |
| | 8405 | decoded10: u2 = 0b10, |
| | 8406 | opcode: u5 = 0b11100, |
| | 8407 | decoded17: u6 = 0b111100, |
| | 8408 | o2: u1 = 0b0, |
| | 8409 | decoded24: u5 = 0b01110, |
| | 8410 | U: std.builtin.Signedness = .unsigned, |
| | 8411 | Q: Q, |
| | 8412 | decoded31: u1 = 0b0, |
| | 8413 | }; |
| | 8414 | |
| | 8415 | /// C7.2.353 UCVTF (vector, integer) |
| | 8416 | pub const Ucvtf = packed struct { |
| | 8417 | Rd: Register.Encoded, |
| | 8418 | Rn: Register.Encoded, |
| | 8419 | decoded10: u2 = 0b10, |
| | 8420 | opcode: u5 = 0b11101, |
| | 8421 | decoded17: u6 = 0b111100, |
| | 8422 | o2: u1 = 0b0, |
| | 8423 | decoded24: u5 = 0b01110, |
| | 8424 | U: std.builtin.Signedness = .unsigned, |
| | 8425 | Q: Q, |
| | 8426 | decoded31: u1 = 0b0, |
| | 8427 | }; |
| | 8428 | |
| | 8429 | /// C7.2.59 FCMGE (zero) |
| | 8430 | pub const Fcmge = packed struct { |
| | 8431 | Rd: Register.Encoded, |
| | 8432 | Rn: Register.Encoded, |
| | 8433 | decoded10: u2 = 0b10, |
| | 8434 | opcode: u5 = 0b01100, |
| | 8435 | decoded17: u6 = 0b111100, |
| | 8436 | o2: u1 = 0b1, |
| | 8437 | decoded24: u5 = 0b01110, |
| | 8438 | U: std.builtin.Signedness = .unsigned, |
| | 8439 | Q: Q, |
| | 8440 | decoded31: u1 = 0b0, |
| | 8441 | }; |
| | 8442 | |
| | 8443 | /// C7.2.64 FCMLE (zero) |
| | 8444 | pub const Fcmle = packed struct { |
| | 8445 | Rd: Register.Encoded, |
| | 8446 | Rn: Register.Encoded, |
| | 8447 | decoded10: u2 = 0b10, |
| | 8448 | opcode: u5 = 0b01101, |
| | 8449 | decoded17: u6 = 0b111100, |
| | 8450 | o2: u1 = 0b1, |
| | 8451 | decoded24: u5 = 0b01110, |
| | 8452 | U: std.builtin.Signedness = .unsigned, |
| | 8453 | Q: Q, |
| | 8454 | decoded31: u1 = 0b0, |
| | 8455 | }; |
| | 8456 | |
| | 8457 | /// C7.2.139 FNEG (vector) |
| | 8458 | pub const Fneg = packed struct { |
| | 8459 | Rd: Register.Encoded, |
| | 8460 | Rn: Register.Encoded, |
| | 8461 | decoded10: u2 = 0b10, |
| | 8462 | opcode: u5 = 0b01111, |
| | 8463 | decoded17: u6 = 0b111100, |
| | 8464 | o2: u1 = 0b1, |
| | 8465 | decoded24: u5 = 0b01110, |
| | 8466 | U: std.builtin.Signedness = .unsigned, |
| | 8467 | Q: Q, |
| | 8468 | decoded31: u1 = 0b0, |
| | 8469 | }; |
| | 8470 | |
| | 8471 | /// C7.2.157 FRINTI (vector) |
| | 8472 | pub const Frinti = packed struct { |
| | 8473 | Rd: Register.Encoded, |
| | 8474 | Rn: Register.Encoded, |
| | 8475 | decoded10: u2 = 0b10, |
| | 8476 | opcode: u5 = 0b11001, |
| | 8477 | decoded17: u6 = 0b111100, |
| | 8478 | o2: u1 = 0b1, |
| | 8479 | decoded24: u5 = 0b01110, |
| | 8480 | U: std.builtin.Signedness = .unsigned, |
| | 8481 | Q: Q, |
| | 8482 | decoded31: u1 = 0b0, |
| | 8483 | }; |
| | 8484 | |
| | 8485 | /// C7.2.86 FCVTPU (vector) |
| | 8486 | pub const Fcvtpu = packed struct { |
| | 8487 | Rd: Register.Encoded, |
| | 8488 | Rn: Register.Encoded, |
| | 8489 | decoded10: u2 = 0b10, |
| | 8490 | opcode: u5 = 0b11010, |
| | 8491 | decoded17: u6 = 0b111100, |
| | 8492 | o2: u1 = 0b1, |
| | 8493 | decoded24: u5 = 0b01110, |
| | 8494 | U: std.builtin.Signedness = .unsigned, |
| | 8495 | Q: Q, |
| | 8496 | decoded31: u1 = 0b0, |
| | 8497 | }; |
| | 8498 | |
| | 8499 | /// C7.2.94 FCVTZU (vector, integer) |
| | 8500 | pub const Fcvtzu = packed struct { |
| | 8501 | Rd: Register.Encoded, |
| | 8502 | Rn: Register.Encoded, |
| | 8503 | decoded10: u2 = 0b10, |
| | 8504 | opcode: u5 = 0b11011, |
| | 8505 | decoded17: u6 = 0b111100, |
| | 8506 | o2: u1 = 0b1, |
| | 8507 | decoded24: u5 = 0b01110, |
| | 8508 | U: std.builtin.Signedness = .unsigned, |
| | 8509 | Q: Q, |
| | 8510 | decoded31: u1 = 0b0, |
| | 8511 | }; |
| | 8512 | |
| | 8513 | /// C7.2.169 FRSQRTE |
| | 8514 | pub const Frsqrte = packed struct { |
| | 8515 | Rd: Register.Encoded, |
| | 8516 | Rn: Register.Encoded, |
| | 8517 | decoded10: u2 = 0b10, |
| | 8518 | opcode: u5 = 0b11101, |
| | 8519 | decoded17: u6 = 0b111100, |
| | 8520 | o2: u1 = 0b1, |
| | 8521 | decoded24: u5 = 0b01110, |
| | 8522 | U: std.builtin.Signedness = .unsigned, |
| | 8523 | Q: Q, |
| | 8524 | decoded31: u1 = 0b0, |
| | 8525 | }; |
| | 8526 | |
| | 8527 | /// C7.2.171 FSQRT |
| | 8528 | pub const Fsqrt = packed struct { |
| | 8529 | Rd: Register.Encoded, |
| | 8530 | Rn: Register.Encoded, |
| | 8531 | decoded10: u2 = 0b10, |
| | 8532 | opcode: u5 = 0b11111, |
| | 8533 | decoded17: u6 = 0b111100, |
| | 8534 | o2: u1 = 0b1, |
| | 8535 | decoded24: u5 = 0b01110, |
| | 8536 | U: std.builtin.Signedness = .unsigned, |
| | 8537 | Q: Q, |
| | 8538 | decoded31: u1 = 0b0, |
| | 8539 | }; |
| | 8540 | }; |
| | 8541 | |
| | 8542 | /// Advanced SIMD two-register miscellaneous |
| | 8543 | pub const SimdTwoRegisterMiscellaneous = packed union { |
| | 8544 | group: @This().Group, |
| | 8545 | suqadd: Suqadd, |
| | 8546 | cnt: Cnt, |
| | 8547 | sqabs: Sqabs, |
| | 8548 | cmgt: Cmgt, |
| | 8549 | cmeq: Cmeq, |
| | 8550 | cmlt: Cmlt, |
| | 8551 | abs: Abs, |
| | 8552 | sqxtn: Sqxtn, |
| | 8553 | frintn: Frintn, |
| | 8554 | frintm: Frintm, |
| | 8555 | fcvtns: Fcvtns, |
| | 8556 | fcvtms: Fcvtms, |
| | 8557 | fcvtas: Fcvtas, |
| | 8558 | scvtf: Scvtf, |
| | 8559 | fcmgt: Fcmgt, |
| | 8560 | fcmeq: Fcmeq, |
| | 8561 | fcmlt: Fcmlt, |
| | 8562 | fabs: Fabs, |
| | 8563 | frintp: Frintp, |
| | 8564 | frintz: Frintz, |
| | 8565 | fcvtps: Fcvtps, |
| | 8566 | fcvtzs: Fcvtzs, |
| | 8567 | frecpe: Frecpe, |
| | 8568 | usqadd: Usqadd, |
| | 8569 | sqneg: Sqneg, |
| | 8570 | cmge: Cmge, |
| | 8571 | cmle: Cmle, |
| | 8572 | neg: Neg, |
| | 8573 | sqxtun: Sqxtun, |
| | 8574 | uqxtn: Uqxtn, |
| | 8575 | fcvtxn: Fcvtxn, |
| | 8576 | frinta: Frinta, |
| | 8577 | frintx: Frintx, |
| | 8578 | fcvtnu: Fcvtnu, |
| | 8579 | fcvtmu: Fcvtmu, |
| | 8580 | fcvtau: Fcvtau, |
| | 8581 | ucvtf: Ucvtf, |
| | 8582 | not: Not, |
| | 8583 | fcmge: Fcmge, |
| | 8584 | fcmle: Fcmle, |
| | 8585 | fneg: Fneg, |
| | 8586 | frinti: Frinti, |
| | 8587 | fcvtpu: Fcvtpu, |
| | 8588 | fcvtzu: Fcvtzu, |
| | 8589 | frsqrte: Frsqrte, |
| | 8590 | fsqrt: Fsqrt, |
| | 8591 | |
| | 8592 | pub const Group = packed struct { |
| | 8593 | Rd: Register.Encoded, |
| | 8594 | Rn: Register.Encoded, |
| | 8595 | decoded10: u2 = 0b10, |
| | 8596 | opcode: u5, |
| | 8597 | decoded17: u5 = 0b10000, |
| | 8598 | size: Size, |
| | 8599 | decoded24: u5 = 0b01110, |
| | 8600 | U: std.builtin.Signedness, |
| | 8601 | Q: Q, |
| | 8602 | decoded31: u1 = 0b0, |
| | 8603 | }; |
| | 8604 | |
| | 8605 | /// C7.2.337 SUQADD |
| | 8606 | pub const Suqadd = packed struct { |
| | 8607 | Rd: Register.Encoded, |
| | 8608 | Rn: Register.Encoded, |
| | 8609 | decoded10: u2 = 0b10, |
| | 8610 | opcode: u5 = 0b00011, |
| | 8611 | decoded17: u5 = 0b10000, |
| | 8612 | size: Size, |
| | 8613 | decoded24: u5 = 0b01110, |
| | 8614 | U: std.builtin.Signedness = .signed, |
| | 8615 | Q: Q, |
| | 8616 | decoded31: u1 = 0b0, |
| | 8617 | }; |
| | 8618 | |
| | 8619 | /// C7.2.38 CNT |
| | 8620 | pub const Cnt = packed struct { |
| | 8621 | Rd: Register.Encoded, |
| | 8622 | Rn: Register.Encoded, |
| | 8623 | decoded10: u2 = 0b10, |
| | 8624 | opcode: u5 = 0b00101, |
| | 8625 | decoded17: u5 = 0b10000, |
| | 8626 | size: Size, |
| | 8627 | decoded24: u5 = 0b01110, |
| | 8628 | U: std.builtin.Signedness = .signed, |
| | 8629 | Q: Q, |
| | 8630 | decoded31: u1 = 0b0, |
| | 8631 | }; |
| | 8632 | |
| | 8633 | /// C7.2.282 SQABS |
| | 8634 | pub const Sqabs = packed struct { |
| | 8635 | Rd: Register.Encoded, |
| | 8636 | Rn: Register.Encoded, |
| | 8637 | decoded10: u2 = 0b10, |
| | 8638 | opcode: u5 = 0b00111, |
| | 8639 | decoded17: u5 = 0b10000, |
| | 8640 | size: Size, |
| | 8641 | decoded24: u5 = 0b01110, |
| | 8642 | U: std.builtin.Signedness = .signed, |
| | 8643 | Q: Q, |
| | 8644 | decoded31: u1 = 0b0, |
| | 8645 | }; |
| | 8646 | |
| | 8647 | /// C7.2.32 CMGT (zero) |
| | 8648 | pub const Cmgt = packed struct { |
| | 8649 | Rd: Register.Encoded, |
| | 8650 | Rn: Register.Encoded, |
| | 8651 | decoded10: u2 = 0b10, |
| | 8652 | opcode: u5 = 0b01000, |
| | 8653 | decoded17: u5 = 0b10000, |
| | 8654 | size: Size, |
| | 8655 | decoded24: u5 = 0b01110, |
| | 8656 | U: std.builtin.Signedness = .signed, |
| | 8657 | Q: Q, |
| | 8658 | decoded31: u1 = 0b0, |
| | 8659 | }; |
| | 8660 | |
| | 8661 | /// C7.2.28 CMEQ (zero) |
| | 8662 | pub const Cmeq = packed struct { |
| | 8663 | Rd: Register.Encoded, |
| | 8664 | Rn: Register.Encoded, |
| | 8665 | decoded10: u2 = 0b10, |
| | 8666 | opcode: u5 = 0b01001, |
| | 8667 | decoded17: u5 = 0b10000, |
| | 8668 | size: Size, |
| | 8669 | decoded24: u5 = 0b01110, |
| | 8670 | U: std.builtin.Signedness = .signed, |
| | 8671 | Q: Q, |
| | 8672 | decoded31: u1 = 0b0, |
| | 8673 | }; |
| | 8674 | |
| | 8675 | /// C7.2.36 CMLT (zero) |
| | 8676 | pub const Cmlt = packed struct { |
| | 8677 | Rd: Register.Encoded, |
| | 8678 | Rn: Register.Encoded, |
| | 8679 | decoded10: u2 = 0b10, |
| | 8680 | opcode: u5 = 0b01010, |
| | 8681 | decoded17: u5 = 0b10000, |
| | 8682 | size: Size, |
| | 8683 | decoded24: u5 = 0b01110, |
| | 8684 | U: std.builtin.Signedness = .signed, |
| | 8685 | Q: Q, |
| | 8686 | decoded31: u1 = 0b0, |
| | 8687 | }; |
| | 8688 | |
| | 8689 | /// C7.2.1 ABS |
| | 8690 | pub const Abs = packed struct { |
| | 8691 | Rd: Register.Encoded, |
| | 8692 | Rn: Register.Encoded, |
| | 8693 | decoded10: u2 = 0b10, |
| | 8694 | opcode: u5 = 0b01011, |
| | 8695 | decoded17: u5 = 0b10000, |
| | 8696 | size: Size, |
| | 8697 | decoded24: u5 = 0b01110, |
| | 8698 | U: std.builtin.Signedness = .signed, |
| | 8699 | Q: Q, |
| | 8700 | decoded31: u1 = 0b0, |
| | 8701 | }; |
| | 8702 | |
| | 8703 | /// C7.2.308 SQXTN |
| | 8704 | pub const Sqxtn = packed struct { |
| | 8705 | Rd: Register.Encoded, |
| | 8706 | Rn: Register.Encoded, |
| | 8707 | decoded10: u2 = 0b10, |
| | 8708 | opcode: u5 = 0b10100, |
| | 8709 | decoded17: u5 = 0b10000, |
| | 8710 | size: Size, |
| | 8711 | decoded24: u5 = 0b01110, |
| | 8712 | U: std.builtin.Signedness = .signed, |
| | 8713 | Q: Q, |
| | 8714 | decoded31: u1 = 0b0, |
| | 8715 | }; |
| | 8716 | |
| | 8717 | /// C7.2.161 FRINTN (vector) |
| | 8718 | pub const Frintn = packed struct { |
| | 8719 | Rd: Register.Encoded, |
| | 8720 | Rn: Register.Encoded, |
| | 8721 | decoded10: u2 = 0b10, |
| | 8722 | opcode: u5 = 0b11000, |
| | 8723 | decoded17: u5 = 0b10000, |
| | 8724 | sz: Sz, |
| | 8725 | o2: u1 = 0b0, |
| | 8726 | decoded24: u5 = 0b01110, |
| | 8727 | U: std.builtin.Signedness = .signed, |
| | 8728 | Q: Q, |
| | 8729 | decoded31: u1 = 0b0, |
| | 8730 | }; |
| | 8731 | |
| | 8732 | /// C7.2.159 FRINTM (vector) |
| | 8733 | pub const Frintm = packed struct { |
| | 8734 | Rd: Register.Encoded, |
| | 8735 | Rn: Register.Encoded, |
| | 8736 | decoded10: u2 = 0b10, |
| | 8737 | opcode: u5 = 0b11001, |
| | 8738 | decoded17: u5 = 0b10000, |
| | 8739 | sz: Sz, |
| | 8740 | o2: u1 = 0b0, |
| | 8741 | decoded24: u5 = 0b01110, |
| | 8742 | U: std.builtin.Signedness = .signed, |
| | 8743 | Q: Q, |
| | 8744 | decoded31: u1 = 0b0, |
| | 8745 | }; |
| | 8746 | |
| | 8747 | /// C7.2.80 FCVTNS (vector) |
| | 8748 | pub const Fcvtns = packed struct { |
| | 8749 | Rd: Register.Encoded, |
| | 8750 | Rn: Register.Encoded, |
| | 8751 | decoded10: u2 = 0b10, |
| | 8752 | opcode: u5 = 0b11010, |
| | 8753 | decoded17: u5 = 0b10000, |
| | 8754 | sz: Sz, |
| | 8755 | o2: u1 = 0b0, |
| | 8756 | decoded24: u5 = 0b01110, |
| | 8757 | U: std.builtin.Signedness = .signed, |
| | 8758 | Q: Q, |
| | 8759 | decoded31: u1 = 0b0, |
| | 8760 | }; |
| | 8761 | |
| | 8762 | /// C7.2.75 FCVTMS (vector) |
| | 8763 | pub const Fcvtms = packed struct { |
| | 8764 | Rd: Register.Encoded, |
| | 8765 | Rn: Register.Encoded, |
| | 8766 | decoded10: u2 = 0b10, |
| | 8767 | opcode: u5 = 0b11011, |
| | 8768 | decoded17: u5 = 0b10000, |
| | 8769 | sz: Sz, |
| | 8770 | o2: u1 = 0b0, |
| | 8771 | decoded24: u5 = 0b01110, |
| | 8772 | U: std.builtin.Signedness = .signed, |
| | 8773 | Q: Q, |
| | 8774 | decoded31: u1 = 0b0, |
| | 8775 | }; |
| | 8776 | |
| | 8777 | /// C7.2.70 FCVTAS (vector) |
| | 8778 | pub const Fcvtas = packed struct { |
| | 8779 | Rd: Register.Encoded, |
| | 8780 | Rn: Register.Encoded, |
| | 8781 | decoded10: u2 = 0b10, |
| | 8782 | opcode: u5 = 0b11100, |
| | 8783 | decoded17: u5 = 0b10000, |
| | 8784 | sz: Sz, |
| | 8785 | o2: u1 = 0b0, |
| | 8786 | decoded24: u5 = 0b01110, |
| | 8787 | U: std.builtin.Signedness = .signed, |
| | 8788 | Q: Q, |
| | 8789 | decoded31: u1 = 0b0, |
| | 8790 | }; |
| | 8791 | |
| | 8792 | /// C7.2.234 SCVTF (vector, integer) |
| | 8793 | pub const Scvtf = packed struct { |
| | 8794 | Rd: Register.Encoded, |
| | 8795 | Rn: Register.Encoded, |
| | 8796 | decoded10: u2 = 0b10, |
| | 8797 | opcode: u5 = 0b11101, |
| | 8798 | decoded17: u5 = 0b10000, |
| | 8799 | sz: Sz, |
| | 8800 | o2: u1 = 0b0, |
| | 8801 | decoded24: u5 = 0b01110, |
| | 8802 | U: std.builtin.Signedness = .signed, |
| | 8803 | Q: Q, |
| | 8804 | decoded31: u1 = 0b0, |
| | 8805 | }; |
| | 8806 | |
| | 8807 | /// C7.2.61 FCMGT (zero) |
| | 8808 | pub const Fcmgt = packed struct { |
| | 8809 | Rd: Register.Encoded, |
| | 8810 | Rn: Register.Encoded, |
| | 8811 | decoded10: u2 = 0b10, |
| | 8812 | opcode: u5 = 0b01100, |
| | 8813 | decoded17: u5 = 0b10000, |
| | 8814 | sz: Sz, |
| | 8815 | o2: u1 = 0b1, |
| | 8816 | decoded24: u5 = 0b01110, |
| | 8817 | U: std.builtin.Signedness = .signed, |
| | 8818 | Q: Q, |
| | 8819 | decoded31: u1 = 0b0, |
| | 8820 | }; |
| | 8821 | |
| | 8822 | /// C7.2.57 FCMEQ (zero) |
| | 8823 | pub const Fcmeq = packed struct { |
| | 8824 | Rd: Register.Encoded, |
| | 8825 | Rn: Register.Encoded, |
| | 8826 | decoded10: u2 = 0b10, |
| | 8827 | opcode: u5 = 0b01101, |
| | 8828 | decoded17: u5 = 0b10000, |
| | 8829 | sz: Sz, |
| | 8830 | o2: u1 = 0b1, |
| | 8831 | decoded24: u5 = 0b01110, |
| | 8832 | U: std.builtin.Signedness = .signed, |
| | 8833 | Q: Q, |
| | 8834 | decoded31: u1 = 0b0, |
| | 8835 | }; |
| | 8836 | |
| | 8837 | /// C7.2.65 FCMLT (zero) |
| | 8838 | pub const Fcmlt = packed struct { |
| | 8839 | Rd: Register.Encoded, |
| | 8840 | Rn: Register.Encoded, |
| | 8841 | decoded10: u2 = 0b10, |
| | 8842 | opcode: u5 = 0b01110, |
| | 8843 | decoded17: u5 = 0b10000, |
| | 8844 | sz: Sz, |
| | 8845 | o2: u1 = 0b1, |
| | 8846 | decoded24: u5 = 0b01110, |
| | 8847 | U: std.builtin.Signedness = .signed, |
| | 8848 | Q: Q, |
| | 8849 | decoded31: u1 = 0b0, |
| | 8850 | }; |
| | 8851 | |
| | 8852 | /// C7.2.45 FABS (vector) |
| | 8853 | pub const Fabs = packed struct { |
| | 8854 | Rd: Register.Encoded, |
| | 8855 | Rn: Register.Encoded, |
| | 8856 | decoded10: u2 = 0b10, |
| | 8857 | opcode: u5 = 0b01111, |
| | 8858 | decoded17: u5 = 0b10000, |
| | 8859 | sz: Sz, |
| | 8860 | o2: u1 = 0b1, |
| | 8861 | decoded24: u5 = 0b01110, |
| | 8862 | U: std.builtin.Signedness = .signed, |
| | 8863 | Q: Q, |
| | 8864 | decoded31: u1 = 0b0, |
| | 8865 | }; |
| | 8866 | |
| | 8867 | /// C7.2.163 FRINTP (vector) |
| | 8868 | pub const Frintp = packed struct { |
| | 8869 | Rd: Register.Encoded, |
| | 8870 | Rn: Register.Encoded, |
| | 8871 | decoded10: u2 = 0b10, |
| | 8872 | opcode: u5 = 0b11000, |
| | 8873 | decoded17: u5 = 0b10000, |
| | 8874 | sz: Sz, |
| | 8875 | o2: u1 = 0b1, |
| | 8876 | decoded24: u5 = 0b01110, |
| | 8877 | U: std.builtin.Signedness = .signed, |
| | 8878 | Q: Q, |
| | 8879 | decoded31: u1 = 0b0, |
| | 8880 | }; |
| | 8881 | |
| | 8882 | /// C7.2.167 FRINTZ (vector) |
| | 8883 | pub const Frintz = packed struct { |
| | 8884 | Rd: Register.Encoded, |
| | 8885 | Rn: Register.Encoded, |
| | 8886 | decoded10: u2 = 0b10, |
| | 8887 | opcode: u5 = 0b11001, |
| | 8888 | decoded17: u5 = 0b10000, |
| | 8889 | sz: Sz, |
| | 8890 | o2: u1 = 0b1, |
| | 8891 | decoded24: u5 = 0b01110, |
| | 8892 | U: std.builtin.Signedness = .signed, |
| | 8893 | Q: Q, |
| | 8894 | decoded31: u1 = 0b0, |
| | 8895 | }; |
| | 8896 | |
| | 8897 | /// C7.2.84 FCVTPS (vector) |
| | 8898 | pub const Fcvtps = packed struct { |
| | 8899 | Rd: Register.Encoded, |
| | 8900 | Rn: Register.Encoded, |
| | 8901 | decoded10: u2 = 0b10, |
| | 8902 | opcode: u5 = 0b11010, |
| | 8903 | decoded17: u5 = 0b10000, |
| | 8904 | sz: Sz, |
| | 8905 | o2: u1 = 0b1, |
| | 8906 | decoded24: u5 = 0b01110, |
| | 8907 | U: std.builtin.Signedness = .signed, |
| | 8908 | Q: Q, |
| | 8909 | decoded31: u1 = 0b0, |
| | 8910 | }; |
| | 8911 | |
| | 8912 | /// C7.2.90 FCVTZS (vector, integer) |
| | 8913 | pub const Fcvtzs = packed struct { |
| | 8914 | Rd: Register.Encoded, |
| | 8915 | Rn: Register.Encoded, |
| | 8916 | decoded10: u2 = 0b10, |
| | 8917 | opcode: u5 = 0b11011, |
| | 8918 | decoded17: u5 = 0b10000, |
| | 8919 | sz: Sz, |
| | 8920 | o2: u1 = 0b1, |
| | 8921 | decoded24: u5 = 0b01110, |
| | 8922 | U: std.builtin.Signedness = .signed, |
| | 8923 | Q: Q, |
| | 8924 | decoded31: u1 = 0b0, |
| | 8925 | }; |
| | 8926 | |
| | 8927 | /// C7.2.144 FRECPE |
| | 8928 | pub const Frecpe = packed struct { |
| | 8929 | Rd: Register.Encoded, |
| | 8930 | Rn: Register.Encoded, |
| | 8931 | decoded10: u2 = 0b10, |
| | 8932 | opcode: u5 = 0b11101, |
| | 8933 | decoded17: u5 = 0b10000, |
| | 8934 | sz: Sz, |
| | 8935 | o2: u1 = 0b1, |
| | 8936 | decoded24: u5 = 0b01110, |
| | 8937 | U: std.builtin.Signedness = .signed, |
| | 8938 | Q: Q, |
| | 8939 | decoded31: u1 = 0b0, |
| | 8940 | }; |
| | 8941 | |
| | 8942 | /// C7.2.394 USQADD |
| | 8943 | pub const Usqadd = packed struct { |
| | 8944 | Rd: Register.Encoded, |
| | 8945 | Rn: Register.Encoded, |
| | 8946 | decoded10: u2 = 0b10, |
| | 8947 | opcode: u5 = 0b00011, |
| | 8948 | decoded17: u5 = 0b10000, |
| | 8949 | size: Size, |
| | 8950 | decoded24: u5 = 0b01110, |
| | 8951 | U: std.builtin.Signedness = .unsigned, |
| | 8952 | Q: Q, |
| | 8953 | decoded31: u1 = 0b0, |
| | 8954 | }; |
| | 8955 | |
| | 8956 | /// C7.2.292 SQNEG |
| | 8957 | pub const Sqneg = packed struct { |
| | 8958 | Rd: Register.Encoded, |
| | 8959 | Rn: Register.Encoded, |
| | 8960 | decoded10: u2 = 0b10, |
| | 8961 | opcode: u5 = 0b00111, |
| | 8962 | decoded17: u5 = 0b10000, |
| | 8963 | size: Size, |
| | 8964 | decoded24: u5 = 0b01110, |
| | 8965 | U: std.builtin.Signedness = .unsigned, |
| | 8966 | Q: Q, |
| | 8967 | decoded31: u1 = 0b0, |
| | 8968 | }; |
| | 8969 | |
| | 8970 | /// C7.2.30 CMGE (zero) |
| | 8971 | pub const Cmge = packed struct { |
| | 8972 | Rd: Register.Encoded, |
| | 8973 | Rn: Register.Encoded, |
| | 8974 | decoded10: u2 = 0b10, |
| | 8975 | opcode: u5 = 0b01000, |
| | 8976 | decoded17: u5 = 0b10000, |
| | 8977 | size: Size, |
| | 8978 | decoded24: u5 = 0b01110, |
| | 8979 | U: std.builtin.Signedness = .unsigned, |
| | 8980 | Q: Q, |
| | 8981 | decoded31: u1 = 0b0, |
| | 8982 | }; |
| | 8983 | |
| | 8984 | /// C7.2.35 CMLE (zero) |
| | 8985 | pub const Cmle = packed struct { |
| | 8986 | Rd: Register.Encoded, |
| | 8987 | Rn: Register.Encoded, |
| | 8988 | decoded10: u2 = 0b10, |
| | 8989 | opcode: u5 = 0b01001, |
| | 8990 | decoded17: u5 = 0b10000, |
| | 8991 | size: Size, |
| | 8992 | decoded24: u5 = 0b01110, |
| | 8993 | U: std.builtin.Signedness = .unsigned, |
| | 8994 | Q: Q, |
| | 8995 | decoded31: u1 = 0b0, |
| | 8996 | }; |
| | 8997 | |
| | 8998 | /// C7.2.209 NEG (vector) |
| | 8999 | pub const Neg = packed struct { |
| | 9000 | Rd: Register.Encoded, |
| | 9001 | Rn: Register.Encoded, |
| | 9002 | decoded10: u2 = 0b10, |
| | 9003 | opcode: u5 = 0b01011, |
| | 9004 | decoded17: u5 = 0b10000, |
| | 9005 | size: Size, |
| | 9006 | decoded24: u5 = 0b01110, |
| | 9007 | U: std.builtin.Signedness = .unsigned, |
| | 9008 | Q: Q, |
| | 9009 | decoded31: u1 = 0b0, |
| | 9010 | }; |
| | 9011 | |
| | 9012 | /// C7.2.309 SQXTUN |
| | 9013 | pub const Sqxtun = packed struct { |
| | 9014 | Rd: Register.Encoded, |
| | 9015 | Rn: Register.Encoded, |
| | 9016 | decoded10: u2 = 0b10, |
| | 9017 | opcode: u5 = 0b10010, |
| | 9018 | decoded17: u5 = 0b10000, |
| | 9019 | size: Size, |
| | 9020 | decoded24: u5 = 0b01110, |
| | 9021 | U: std.builtin.Signedness = .unsigned, |
| | 9022 | Q: Q, |
| | 9023 | decoded31: u1 = 0b0, |
| | 9024 | }; |
| | 9025 | |
| | 9026 | /// C7.2.381 UQXTN |
| | 9027 | pub const Uqxtn = packed struct { |
| | 9028 | Rd: Register.Encoded, |
| | 9029 | Rn: Register.Encoded, |
| | 9030 | decoded10: u2 = 0b10, |
| | 9031 | opcode: u5 = 0b10100, |
| | 9032 | decoded17: u5 = 0b10000, |
| | 9033 | size: Size, |
| | 9034 | decoded24: u5 = 0b01110, |
| | 9035 | U: std.builtin.Signedness = .unsigned, |
| | 9036 | Q: Q, |
| | 9037 | decoded31: u1 = 0b0, |
| | 9038 | }; |
| | 9039 | |
| | 9040 | /// C7.2.88 FCVTXN |
| | 9041 | pub const Fcvtxn = packed struct { |
| | 9042 | Rd: Register.Encoded, |
| | 9043 | Rn: Register.Encoded, |
| | 9044 | decoded10: u2 = 0b10, |
| | 9045 | opcode: u5 = 0b10110, |
| | 9046 | decoded17: u5 = 0b10000, |
| | 9047 | sz: Sz, |
| | 9048 | o2: u1 = 0b0, |
| | 9049 | decoded24: u5 = 0b01110, |
| | 9050 | U: std.builtin.Signedness = .unsigned, |
| | 9051 | Q: Q, |
| | 9052 | decoded31: u1 = 0b0, |
| | 9053 | }; |
| | 9054 | |
| | 9055 | /// C7.2.155 FRINTA (vector) |
| | 9056 | pub const Frinta = packed struct { |
| | 9057 | Rd: Register.Encoded, |
| | 9058 | Rn: Register.Encoded, |
| | 9059 | decoded10: u2 = 0b10, |
| | 9060 | opcode: u5 = 0b11000, |
| | 9061 | decoded17: u5 = 0b10000, |
| | 9062 | sz: Sz, |
| | 9063 | o2: u1 = 0b0, |
| | 9064 | decoded24: u5 = 0b01110, |
| | 9065 | U: std.builtin.Signedness = .unsigned, |
| | 9066 | Q: Q, |
| | 9067 | decoded31: u1 = 0b0, |
| | 9068 | }; |
| | 9069 | |
| | 9070 | /// C7.2.165 FRINTX (vector) |
| | 9071 | pub const Frintx = packed struct { |
| | 9072 | Rd: Register.Encoded, |
| | 9073 | Rn: Register.Encoded, |
| | 9074 | decoded10: u2 = 0b10, |
| | 9075 | opcode: u5 = 0b11001, |
| | 9076 | decoded17: u5 = 0b10000, |
| | 9077 | sz: Sz, |
| | 9078 | o2: u1 = 0b0, |
| | 9079 | decoded24: u5 = 0b01110, |
| | 9080 | U: std.builtin.Signedness = .unsigned, |
| | 9081 | Q: Q, |
| | 9082 | decoded31: u1 = 0b0, |
| | 9083 | }; |
| | 9084 | |
| | 9085 | /// C7.2.82 FCVTNU (vector) |
| | 9086 | pub const Fcvtnu = packed struct { |
| | 9087 | Rd: Register.Encoded, |
| | 9088 | Rn: Register.Encoded, |
| | 9089 | decoded10: u2 = 0b10, |
| | 9090 | opcode: u5 = 0b11010, |
| | 9091 | decoded17: u5 = 0b10000, |
| | 9092 | sz: Sz, |
| | 9093 | o2: u1 = 0b0, |
| | 9094 | decoded24: u5 = 0b01110, |
| | 9095 | U: std.builtin.Signedness = .unsigned, |
| | 9096 | Q: Q, |
| | 9097 | decoded31: u1 = 0b0, |
| | 9098 | }; |
| | 9099 | |
| | 9100 | /// C7.2.77 FCVTMU (vector) |
| | 9101 | pub const Fcvtmu = packed struct { |
| | 9102 | Rd: Register.Encoded, |
| | 9103 | Rn: Register.Encoded, |
| | 9104 | decoded10: u2 = 0b10, |
| | 9105 | opcode: u5 = 0b11011, |
| | 9106 | decoded17: u5 = 0b10000, |
| | 9107 | sz: Sz, |
| | 9108 | o2: u1 = 0b0, |
| | 9109 | decoded24: u5 = 0b01110, |
| | 9110 | U: std.builtin.Signedness = .unsigned, |
| | 9111 | Q: Q, |
| | 9112 | decoded31: u1 = 0b0, |
| | 9113 | }; |
| | 9114 | |
| | 9115 | /// C7.2.72 FCVTAU (vector) |
| | 9116 | pub const Fcvtau = packed struct { |
| | 9117 | Rd: Register.Encoded, |
| | 9118 | Rn: Register.Encoded, |
| | 9119 | decoded10: u2 = 0b10, |
| | 9120 | opcode: u5 = 0b11100, |
| | 9121 | decoded17: u5 = 0b10000, |
| | 9122 | sz: Sz, |
| | 9123 | o2: u1 = 0b0, |
| | 9124 | decoded24: u5 = 0b01110, |
| | 9125 | U: std.builtin.Signedness = .unsigned, |
| | 9126 | Q: Q, |
| | 9127 | decoded31: u1 = 0b0, |
| | 9128 | }; |
| | 9129 | |
| | 9130 | /// C7.2.353 UCVTF (vector, integer) |
| | 9131 | pub const Ucvtf = packed struct { |
| | 9132 | Rd: Register.Encoded, |
| | 9133 | Rn: Register.Encoded, |
| | 9134 | decoded10: u2 = 0b10, |
| | 9135 | opcode: u5 = 0b11101, |
| | 9136 | decoded17: u5 = 0b10000, |
| | 9137 | sz: Sz, |
| | 9138 | o2: u1 = 0b0, |
| | 9139 | decoded24: u5 = 0b01110, |
| | 9140 | U: std.builtin.Signedness = .unsigned, |
| | 9141 | Q: Q, |
| | 9142 | decoded31: u1 = 0b0, |
| | 9143 | }; |
| | 9144 | |
| | 9145 | /// C7.2.210 NOT |
| | 9146 | pub const Not = packed struct { |
| | 9147 | Rd: Register.Encoded, |
| | 9148 | Rn: Register.Encoded, |
| | 9149 | decoded10: u2 = 0b10, |
| | 9150 | opcode: u5 = 0b00101, |
| | 9151 | decoded17: u5 = 0b10000, |
| | 9152 | size: Size = .byte, |
| | 9153 | decoded24: u5 = 0b01110, |
| | 9154 | U: std.builtin.Signedness = .unsigned, |
| | 9155 | Q: Q, |
| | 9156 | decoded31: u1 = 0b0, |
| | 9157 | }; |
| | 9158 | |
| | 9159 | /// C7.2.59 FCMGE (zero) |
| | 9160 | pub const Fcmge = packed struct { |
| | 9161 | Rd: Register.Encoded, |
| | 9162 | Rn: Register.Encoded, |
| | 9163 | decoded10: u2 = 0b10, |
| | 9164 | opcode: u5 = 0b01100, |
| | 9165 | decoded17: u5 = 0b10000, |
| | 9166 | sz: Sz, |
| | 9167 | o2: u1 = 0b1, |
| | 9168 | decoded24: u5 = 0b01110, |
| | 9169 | U: std.builtin.Signedness = .unsigned, |
| | 9170 | Q: Q, |
| | 9171 | decoded31: u1 = 0b0, |
| | 9172 | }; |
| | 9173 | |
| | 9174 | /// C7.2.64 FCMLE (zero) |
| | 9175 | pub const Fcmle = packed struct { |
| | 9176 | Rd: Register.Encoded, |
| | 9177 | Rn: Register.Encoded, |
| | 9178 | decoded10: u2 = 0b10, |
| | 9179 | opcode: u5 = 0b01101, |
| | 9180 | decoded17: u5 = 0b10000, |
| | 9181 | sz: Sz, |
| | 9182 | o2: u1 = 0b1, |
| | 9183 | decoded24: u5 = 0b01110, |
| | 9184 | U: std.builtin.Signedness = .unsigned, |
| | 9185 | Q: Q, |
| | 9186 | decoded31: u1 = 0b0, |
| | 9187 | }; |
| | 9188 | |
| | 9189 | /// C7.2.139 FNEG (vector) |
| | 9190 | pub const Fneg = packed struct { |
| | 9191 | Rd: Register.Encoded, |
| | 9192 | Rn: Register.Encoded, |
| | 9193 | decoded10: u2 = 0b10, |
| | 9194 | opcode: u5 = 0b01111, |
| | 9195 | decoded17: u5 = 0b10000, |
| | 9196 | sz: Sz, |
| | 9197 | o2: u1 = 0b1, |
| | 9198 | decoded24: u5 = 0b01110, |
| | 9199 | U: std.builtin.Signedness = .unsigned, |
| | 9200 | Q: Q, |
| | 9201 | decoded31: u1 = 0b0, |
| | 9202 | }; |
| | 9203 | |
| | 9204 | /// C7.2.157 FRINTI (vector) |
| | 9205 | pub const Frinti = packed struct { |
| | 9206 | Rd: Register.Encoded, |
| | 9207 | Rn: Register.Encoded, |
| | 9208 | decoded10: u2 = 0b10, |
| | 9209 | opcode: u5 = 0b11001, |
| | 9210 | decoded17: u5 = 0b10000, |
| | 9211 | sz: Sz, |
| | 9212 | o2: u1 = 0b1, |
| | 9213 | decoded24: u5 = 0b01110, |
| | 9214 | U: std.builtin.Signedness = .unsigned, |
| | 9215 | Q: Q, |
| | 9216 | decoded31: u1 = 0b0, |
| | 9217 | }; |
| | 9218 | |
| | 9219 | /// C7.2.86 FCVTPU (vector) |
| | 9220 | pub const Fcvtpu = packed struct { |
| | 9221 | Rd: Register.Encoded, |
| | 9222 | Rn: Register.Encoded, |
| | 9223 | decoded10: u2 = 0b10, |
| | 9224 | opcode: u5 = 0b11010, |
| | 9225 | decoded17: u5 = 0b10000, |
| | 9226 | sz: Sz, |
| | 9227 | o2: u1 = 0b1, |
| | 9228 | decoded24: u5 = 0b01110, |
| | 9229 | U: std.builtin.Signedness = .unsigned, |
| | 9230 | Q: Q, |
| | 9231 | decoded31: u1 = 0b0, |
| | 9232 | }; |
| | 9233 | |
| | 9234 | /// C7.2.94 FCVTZU (vector, integer) |
| | 9235 | pub const Fcvtzu = packed struct { |
| | 9236 | Rd: Register.Encoded, |
| | 9237 | Rn: Register.Encoded, |
| | 9238 | decoded10: u2 = 0b10, |
| | 9239 | opcode: u5 = 0b11011, |
| | 9240 | decoded17: u5 = 0b10000, |
| | 9241 | sz: Sz, |
| | 9242 | o2: u1 = 0b1, |
| | 9243 | decoded24: u5 = 0b01110, |
| | 9244 | U: std.builtin.Signedness = .unsigned, |
| | 9245 | Q: Q, |
| | 9246 | decoded31: u1 = 0b0, |
| | 9247 | }; |
| | 9248 | |
| | 9249 | /// C7.2.169 FRSQRTE |
| | 9250 | pub const Frsqrte = packed struct { |
| | 9251 | Rd: Register.Encoded, |
| | 9252 | Rn: Register.Encoded, |
| | 9253 | decoded10: u2 = 0b10, |
| | 9254 | opcode: u5 = 0b11101, |
| | 9255 | decoded17: u5 = 0b10000, |
| | 9256 | sz: Sz, |
| | 9257 | o2: u1 = 0b1, |
| | 9258 | decoded24: u5 = 0b01110, |
| | 9259 | U: std.builtin.Signedness = .unsigned, |
| | 9260 | Q: Q, |
| | 9261 | decoded31: u1 = 0b0, |
| | 9262 | }; |
| | 9263 | |
| | 9264 | /// C7.2.171 FSQRT (vector) |
| | 9265 | pub const Fsqrt = packed struct { |
| | 9266 | Rd: Register.Encoded, |
| | 9267 | Rn: Register.Encoded, |
| | 9268 | decoded10: u2 = 0b10, |
| | 9269 | opcode: u5 = 0b11111, |
| | 9270 | decoded17: u5 = 0b10000, |
| | 9271 | sz: Sz, |
| | 9272 | o2: u1 = 0b1, |
| | 9273 | decoded24: u5 = 0b01110, |
| | 9274 | U: std.builtin.Signedness = .unsigned, |
| | 9275 | Q: Q, |
| | 9276 | decoded31: u1 = 0b0, |
| | 9277 | }; |
| | 9278 | }; |
| | 9279 | |
| | 9280 | /// Advanced SIMD across lanes |
| | 9281 | pub const SimdAcrossLanes = packed union { |
| | 9282 | group: @This().Group, |
| | 9283 | addv: Addv, |
| | 9284 | |
| | 9285 | pub const Group = packed struct { |
| | 9286 | Rd: Register.Encoded, |
| | 9287 | Rn: Register.Encoded, |
| | 9288 | decoded10: u2 = 0b10, |
| | 9289 | opcode: u5, |
| | 9290 | decoded17: u5 = 0b11000, |
| | 9291 | size: Size, |
| | 9292 | decoded24: u5 = 0b01110, |
| | 9293 | U: std.builtin.Signedness, |
| | 9294 | Q: Q, |
| | 9295 | decoded31: u1 = 0b0, |
| | 9296 | }; |
| | 9297 | |
| | 9298 | /// C7.2.6 ADDV |
| | 9299 | pub const Addv = packed struct { |
| | 9300 | Rd: Register.Encoded, |
| | 9301 | Rn: Register.Encoded, |
| | 9302 | decoded10: u2 = 0b10, |
| | 9303 | opcode: u5 = 0b11011, |
| | 9304 | decoded17: u5 = 0b11000, |
| | 9305 | size: Size, |
| | 9306 | decoded24: u5 = 0b01110, |
| | 9307 | U: std.builtin.Signedness = .signed, |
| | 9308 | Q: Q, |
| | 9309 | decoded31: u1 = 0b0, |
| | 9310 | }; |
| | 9311 | }; |
| | 9312 | |
| | 9313 | /// Advanced SIMD three same |
| | 9314 | pub const SimdThreeSame = packed union { |
| | 9315 | group: @This().Group, |
| | 9316 | addp: Addp, |
| | 9317 | @"and": And, |
| | 9318 | bic: Bic, |
| | 9319 | orr: Orr, |
| | 9320 | orn: Orn, |
| | 9321 | eor: Eor, |
| | 9322 | bsl: Bsl, |
| | 9323 | bit: Bit, |
| | 9324 | bif: Bif, |
| | 9325 | |
| | 9326 | pub const Group = packed struct { |
| | 9327 | Rd: Register.Encoded, |
| | 9328 | Rn: Register.Encoded, |
| | 9329 | decoded10: u1 = 0b1, |
| | 9330 | opcode: u5, |
| | 9331 | Rm: Register.Encoded, |
| | 9332 | decoded21: u1 = 0b1, |
| | 9333 | size: Size, |
| | 9334 | decoded24: u5 = 0b01110, |
| | 9335 | U: std.builtin.Signedness, |
| | 9336 | Q: Q, |
| | 9337 | decoded31: u1 = 0b0, |
| | 9338 | }; |
| | 9339 | |
| | 9340 | /// C7.2.5 ADDP (vector) |
| | 9341 | pub const Addp = packed struct { |
| | 9342 | Rd: Register.Encoded, |
| | 9343 | Rn: Register.Encoded, |
| | 9344 | decoded10: u1 = 0b1, |
| | 9345 | opcode: u5 = 0b10111, |
| | 9346 | Rm: Register.Encoded, |
| | 9347 | decoded21: u1 = 0b1, |
| | 9348 | size: Size, |
| | 9349 | decoded24: u5 = 0b01110, |
| | 9350 | U: std.builtin.Signedness = .signed, |
| | 9351 | Q: Q, |
| | 9352 | decoded31: u1 = 0b0, |
| | 9353 | }; |
| | 9354 | |
| | 9355 | /// C7.2.11 AND (vector) |
| | 9356 | pub const And = packed struct { |
| | 9357 | Rd: Register.Encoded, |
| | 9358 | Rn: Register.Encoded, |
| | 9359 | decoded10: u1 = 0b1, |
| | 9360 | opcode: u5 = 0b00011, |
| | 9361 | Rm: Register.Encoded, |
| | 9362 | decoded21: u1 = 0b1, |
| | 9363 | size: Size = .byte, |
| | 9364 | decoded24: u5 = 0b01110, |
| | 9365 | U: std.builtin.Signedness = .signed, |
| | 9366 | Q: Q, |
| | 9367 | decoded31: u1 = 0b0, |
| | 9368 | }; |
| | 9369 | |
| | 9370 | /// C7.2.21 BIC (vector, register) |
| | 9371 | pub const Bic = packed struct { |
| | 9372 | Rd: Register.Encoded, |
| | 9373 | Rn: Register.Encoded, |
| | 9374 | decoded10: u1 = 0b1, |
| | 9375 | opcode: u5 = 0b00011, |
| | 9376 | Rm: Register.Encoded, |
| | 9377 | decoded21: u1 = 0b1, |
| | 9378 | size: Size = .half, |
| | 9379 | decoded24: u5 = 0b01110, |
| | 9380 | U: std.builtin.Signedness = .signed, |
| | 9381 | Q: Q, |
| | 9382 | decoded31: u1 = 0b0, |
| | 9383 | }; |
| | 9384 | |
| | 9385 | /// C7.2.213 ORR (vector, register) |
| | 9386 | pub const Orr = packed struct { |
| | 9387 | Rd: Register.Encoded, |
| | 9388 | Rn: Register.Encoded, |
| | 9389 | decoded10: u1 = 0b1, |
| | 9390 | opcode: u5 = 0b00011, |
| | 9391 | Rm: Register.Encoded, |
| | 9392 | decoded21: u1 = 0b1, |
| | 9393 | size: Size = .single, |
| | 9394 | decoded24: u5 = 0b01110, |
| | 9395 | U: std.builtin.Signedness = .signed, |
| | 9396 | Q: Q, |
| | 9397 | decoded31: u1 = 0b0, |
| | 9398 | }; |
| | 9399 | |
| | 9400 | /// C7.2.211 ORN (vector) |
| | 9401 | pub const Orn = packed struct { |
| | 9402 | Rd: Register.Encoded, |
| | 9403 | Rn: Register.Encoded, |
| | 9404 | decoded10: u1 = 0b1, |
| | 9405 | opcode: u5 = 0b00011, |
| | 9406 | Rm: Register.Encoded, |
| | 9407 | decoded21: u1 = 0b1, |
| | 9408 | size: Size = .double, |
| | 9409 | decoded24: u5 = 0b01110, |
| | 9410 | U: std.builtin.Signedness = .signed, |
| | 9411 | Q: Q, |
| | 9412 | decoded31: u1 = 0b0, |
| | 9413 | }; |
| | 9414 | |
| | 9415 | /// C7.2.41 EOR (vector) |
| | 9416 | pub const Eor = packed struct { |
| | 9417 | Rd: Register.Encoded, |
| | 9418 | Rn: Register.Encoded, |
| | 9419 | decoded10: u1 = 0b1, |
| | 9420 | opcode: u5 = 0b00011, |
| | 9421 | Rm: Register.Encoded, |
| | 9422 | decoded21: u1 = 0b1, |
| | 9423 | size: Size = .byte, |
| | 9424 | decoded24: u5 = 0b01110, |
| | 9425 | U: std.builtin.Signedness = .unsigned, |
| | 9426 | Q: Q, |
| | 9427 | decoded31: u1 = 0b0, |
| | 9428 | }; |
| | 9429 | |
| | 9430 | /// C7.2.24 BSL |
| | 9431 | pub const Bsl = packed struct { |
| | 9432 | Rd: Register.Encoded, |
| | 9433 | Rn: Register.Encoded, |
| | 9434 | decoded10: u1 = 0b1, |
| | 9435 | opcode: u5 = 0b00011, |
| | 9436 | Rm: Register.Encoded, |
| | 9437 | decoded21: u1 = 0b1, |
| | 9438 | size: Size = .half, |
| | 9439 | decoded24: u5 = 0b01110, |
| | 9440 | U: std.builtin.Signedness = .unsigned, |
| | 9441 | Q: Q, |
| | 9442 | decoded31: u1 = 0b0, |
| | 9443 | }; |
| | 9444 | |
| | 9445 | /// C7.2.23 BIT |
| | 9446 | pub const Bit = packed struct { |
| | 9447 | Rd: Register.Encoded, |
| | 9448 | Rn: Register.Encoded, |
| | 9449 | decoded10: u1 = 0b1, |
| | 9450 | opcode: u5 = 0b00011, |
| | 9451 | Rm: Register.Encoded, |
| | 9452 | decoded21: u1 = 0b1, |
| | 9453 | size: Size = .single, |
| | 9454 | decoded24: u5 = 0b01110, |
| | 9455 | U: std.builtin.Signedness = .unsigned, |
| | 9456 | Q: Q, |
| | 9457 | decoded31: u1 = 0b0, |
| | 9458 | }; |
| | 9459 | |
| | 9460 | /// C7.2.22 BIF |
| | 9461 | pub const Bif = packed struct { |
| | 9462 | Rd: Register.Encoded, |
| | 9463 | Rn: Register.Encoded, |
| | 9464 | decoded10: u1 = 0b1, |
| | 9465 | opcode: u5 = 0b00011, |
| | 9466 | Rm: Register.Encoded, |
| | 9467 | decoded21: u1 = 0b1, |
| | 9468 | size: Size = .double, |
| | 9469 | decoded24: u5 = 0b01110, |
| | 9470 | U: std.builtin.Signedness = .unsigned, |
| | 9471 | Q: Q, |
| | 9472 | decoded31: u1 = 0b0, |
| | 9473 | }; |
| | 9474 | }; |
| | 9475 | |
| | 9476 | /// Advanced SIMD modified immediate |
| | 9477 | pub const SimdModifiedImmediate = packed union { |
| | 9478 | group: @This().Group, |
| | 9479 | movi: Movi, |
| | 9480 | orr: Orr, |
| | 9481 | fmov: Fmov, |
| | 9482 | mvni: Mvni, |
| | 9483 | bic: Bic, |
| | 9484 | |
| | 9485 | pub const Group = packed struct { |
| | 9486 | Rd: Register.Encoded, |
| | 9487 | imm5: u5, |
| | 9488 | decoded10: u1 = 0b1, |
| | 9489 | o2: u1, |
| | 9490 | cmode: u4, |
| | 9491 | imm3: u3, |
| | 9492 | decoded19: u10 = 0b0111100000, |
| | 9493 | op: u1, |
| | 9494 | Q: Q, |
| | 9495 | decoded31: u1 = 0b0, |
| | 9496 | }; |
| | 9497 | |
| | 9498 | /// C7.2.204 MOVI |
| | 9499 | pub const Movi = packed struct { |
| | 9500 | Rd: Register.Encoded, |
| | 9501 | imm5: u5, |
| | 9502 | decoded10: u1 = 0b1, |
| | 9503 | o2: u1 = 0b0, |
| | 9504 | cmode: u4, |
| | 9505 | imm3: u3, |
| | 9506 | decoded19: u10 = 0b0111100000, |
| | 9507 | op: u1, |
| | 9508 | Q: Q, |
| | 9509 | decoded31: u1 = 0b0, |
| | 9510 | }; |
| | 9511 | |
| | 9512 | /// C7.2.212 ORR (vector, immediate) |
| | 9513 | pub const Orr = packed struct { |
| | 9514 | Rd: Register.Encoded, |
| | 9515 | imm5: u5, |
| | 9516 | decoded10: u1 = 0b1, |
| | 9517 | o2: u1 = 0b0, |
| | 9518 | cmode0: u1 = 0b1, |
| | 9519 | cmode: u3, |
| | 9520 | imm3: u3, |
| | 9521 | decoded19: u10 = 0b0111100000, |
| | 9522 | op: u1 = 0b0, |
| | 9523 | Q: Q, |
| | 9524 | decoded31: u1 = 0b0, |
| | 9525 | }; |
| | 9526 | |
| | 9527 | /// C7.2.129 FMOV (vector, immediate) |
| | 9528 | pub const Fmov = packed struct { |
| | 9529 | Rd: Register.Encoded, |
| | 9530 | imm5: u5, |
| | 9531 | decoded10: u1 = 0b1, |
| | 9532 | o2: u1 = 0b1, |
| | 9533 | cmode: u4 = 0b1111, |
| | 9534 | imm3: u3, |
| | 9535 | decoded19: u10 = 0b0111100000, |
| | 9536 | op: u1 = 0b0, |
| | 9537 | Q: Q, |
| | 9538 | decoded31: u1 = 0b0, |
| | 9539 | }; |
| | 9540 | |
| | 9541 | /// C7.2.208 MVNI |
| | 9542 | pub const Mvni = packed struct { |
| | 9543 | Rd: Register.Encoded, |
| | 9544 | imm5: u5, |
| | 9545 | decoded10: u1 = 0b1, |
| | 9546 | o2: u1 = 0b0, |
| | 9547 | cmode: u4, |
| | 9548 | imm3: u3, |
| | 9549 | decoded19: u10 = 0b0111100000, |
| | 9550 | op: u1 = 0b1, |
| | 9551 | Q: Q, |
| | 9552 | decoded31: u1 = 0b0, |
| | 9553 | }; |
| | 9554 | |
| | 9555 | /// C7.2.20 BIC (vector, immediate) |
| | 9556 | pub const Bic = packed struct { |
| | 9557 | Rd: Register.Encoded, |
| | 9558 | imm5: u5, |
| | 9559 | decoded10: u1 = 0b1, |
| | 9560 | o2: u1 = 0b0, |
| | 9561 | cmode0: u1 = 0b1, |
| | 9562 | cmode: u3, |
| | 9563 | imm3: u3, |
| | 9564 | decoded19: u10 = 0b0111100000, |
| | 9565 | op: u1 = 0b1, |
| | 9566 | Q: Q, |
| | 9567 | decoded31: u1 = 0b0, |
| | 9568 | }; |
| | 9569 | }; |
| | 9570 | |
| | 9571 | /// Conversion between floating-point and integer |
| | 9572 | pub const ConvertFloatInteger = packed union { |
| | 9573 | group: @This().Group, |
| | 9574 | fcvtns: Fcvtns, |
| | 9575 | fcvtnu: Fcvtnu, |
| | 9576 | scvtf: Scvtf, |
| | 9577 | ucvtf: Ucvtf, |
| | 9578 | fcvtas: Fcvtas, |
| | 9579 | fcvtau: Fcvtau, |
| | 9580 | fmov: Fmov, |
| | 9581 | fcvtps: Fcvtps, |
| | 9582 | fcvtpu: Fcvtpu, |
| | 9583 | fcvtms: Fcvtms, |
| | 9584 | fcvtmu: Fcvtmu, |
| | 9585 | fcvtzs: Fcvtzs, |
| | 9586 | fcvtzu: Fcvtzu, |
| | 9587 | fjcvtzs: Fjcvtzs, |
| | 9588 | |
| | 9589 | pub const Group = packed struct { |
| | 9590 | Rd: Register.Encoded, |
| | 9591 | Rn: Register.Encoded, |
| | 9592 | decoded10: u6 = 0b000000, |
| | 9593 | opcode: u3, |
| | 9594 | rmode: u2, |
| | 9595 | decoded21: u1 = 0b1, |
| | 9596 | ptype: Ftype, |
| | 9597 | decoded24: u5 = 0b11110, |
| | 9598 | S: bool, |
| | 9599 | decoded30: u1 = 0b0, |
| | 9600 | sf: Register.IntegerSize, |
| | 9601 | }; |
| | 9602 | |
| | 9603 | /// C7.2.81 FCVTNS (scalar) |
| | 9604 | pub const Fcvtns = packed struct { |
| | 9605 | Rd: Register.Encoded, |
| | 9606 | Rn: Register.Encoded, |
| | 9607 | decoded10: u6 = 0b000000, |
| | 9608 | opcode: u3 = 0b000, |
| | 9609 | rmode: Rmode = .n, |
| | 9610 | decoded21: u1 = 0b1, |
| | 9611 | ftype: Ftype, |
| | 9612 | decoded24: u5 = 0b11110, |
| | 9613 | S: bool = false, |
| | 9614 | decoded30: u1 = 0b0, |
| | 9615 | sf: Register.IntegerSize, |
| | 9616 | }; |
| | 9617 | |
| | 9618 | /// C7.2.83 FCVTNU (scalar) |
| | 9619 | pub const Fcvtnu = packed struct { |
| | 9620 | Rd: Register.Encoded, |
| | 9621 | Rn: Register.Encoded, |
| | 9622 | decoded10: u6 = 0b000000, |
| | 9623 | opcode: u3 = 0b001, |
| | 9624 | rmode: Rmode = .n, |
| | 9625 | decoded21: u1 = 0b1, |
| | 9626 | ftype: Ftype, |
| | 9627 | decoded24: u5 = 0b11110, |
| | 9628 | S: bool = false, |
| | 9629 | decoded30: u1 = 0b0, |
| | 9630 | sf: Register.IntegerSize, |
| | 9631 | }; |
| | 9632 | |
| | 9633 | /// C7.2.236 SCVTF (scalar, integer) |
| | 9634 | pub const Scvtf = packed struct { |
| | 9635 | Rd: Register.Encoded, |
| | 9636 | Rn: Register.Encoded, |
| | 9637 | decoded10: u6 = 0b000000, |
| | 9638 | opcode: u3 = 0b010, |
| | 9639 | rmode: Rmode = .n, |
| | 9640 | decoded21: u1 = 0b1, |
| | 9641 | ftype: Ftype, |
| | 9642 | decoded24: u5 = 0b11110, |
| | 9643 | S: bool = false, |
| | 9644 | decoded30: u1 = 0b0, |
| | 9645 | sf: Register.IntegerSize, |
| | 9646 | }; |
| | 9647 | |
| | 9648 | /// C7.2.355 UCVTF (scalar, integer) |
| | 9649 | pub const Ucvtf = packed struct { |
| | 9650 | Rd: Register.Encoded, |
| | 9651 | Rn: Register.Encoded, |
| | 9652 | decoded10: u6 = 0b000000, |
| | 9653 | opcode: u3 = 0b011, |
| | 9654 | rmode: Rmode = .n, |
| | 9655 | decoded21: u1 = 0b1, |
| | 9656 | ftype: Ftype, |
| | 9657 | decoded24: u5 = 0b11110, |
| | 9658 | S: bool = false, |
| | 9659 | decoded30: u1 = 0b0, |
| | 9660 | sf: Register.IntegerSize, |
| | 9661 | }; |
| | 9662 | |
| | 9663 | /// C7.2.71 FCVTAS (scalar) |
| | 9664 | pub const Fcvtas = packed struct { |
| | 9665 | Rd: Register.Encoded, |
| | 9666 | Rn: Register.Encoded, |
| | 9667 | decoded10: u6 = 0b000000, |
| | 9668 | opcode: u3 = 0b100, |
| | 9669 | rmode: Rmode = .n, |
| | 9670 | decoded21: u1 = 0b1, |
| | 9671 | ftype: Ftype, |
| | 9672 | decoded24: u5 = 0b11110, |
| | 9673 | S: bool = false, |
| | 9674 | decoded30: u1 = 0b0, |
| | 9675 | sf: Register.IntegerSize, |
| | 9676 | }; |
| | 9677 | |
| | 9678 | /// C7.2.73 FCVTAU (scalar) |
| | 9679 | pub const Fcvtau = packed struct { |
| | 9680 | Rd: Register.Encoded, |
| | 9681 | Rn: Register.Encoded, |
| | 9682 | decoded10: u6 = 0b000000, |
| | 9683 | opcode: u3 = 0b101, |
| | 9684 | rmode: Rmode = .n, |
| | 9685 | decoded21: u1 = 0b1, |
| | 9686 | ftype: Ftype, |
| | 9687 | decoded24: u5 = 0b11110, |
| | 9688 | S: bool = false, |
| | 9689 | decoded30: u1 = 0b0, |
| | 9690 | sf: Register.IntegerSize, |
| | 9691 | }; |
| | 9692 | |
| | 9693 | /// C7.2.131 FMOV (general) |
| | 9694 | pub const Fmov = packed struct { |
| | 9695 | Rd: Register.Encoded, |
| | 9696 | Rn: Register.Encoded, |
| | 9697 | decoded10: u6 = 0b000000, |
| | 9698 | opcode: Opcode, |
| | 9699 | rmode: Fmov.Rmode, |
| | 9700 | decoded21: u1 = 0b1, |
| | 9701 | ftype: Ftype, |
| | 9702 | decoded24: u5 = 0b11110, |
| | 9703 | S: bool = false, |
| | 9704 | decoded30: u1 = 0b0, |
| | 9705 | sf: Register.IntegerSize, |
| | 9706 | |
| | 9707 | pub const Opcode = enum(u3) { |
| | 9708 | float_to_integer = 0b110, |
| | 9709 | integer_to_float = 0b111, |
| | 9710 | _, |
| | 9711 | }; |
| | 9712 | |
| | 9713 | pub const Rmode = enum(u2) { |
| | 9714 | @"0" = 0b00, |
| | 9715 | @"1" = 0b01, |
| | 9716 | _, |
| | 9717 | }; |
| | 9718 | }; |
| | 9719 | |
| | 9720 | /// C7.2.85 FCVTPS (scalar) |
| | 9721 | pub const Fcvtps = packed struct { |
| | 9722 | Rd: Register.Encoded, |
| | 9723 | Rn: Register.Encoded, |
| | 9724 | decoded10: u6 = 0b000000, |
| | 9725 | opcode: u3 = 0b000, |
| | 9726 | rmode: Rmode = .p, |
| | 9727 | decoded21: u1 = 0b1, |
| | 9728 | ftype: Ftype, |
| | 9729 | decoded24: u5 = 0b11110, |
| | 9730 | S: bool = false, |
| | 9731 | decoded30: u1 = 0b0, |
| | 9732 | sf: Register.IntegerSize, |
| | 9733 | }; |
| | 9734 | |
| | 9735 | /// C7.2.87 FCVTPU (scalar) |
| | 9736 | pub const Fcvtpu = packed struct { |
| | 9737 | Rd: Register.Encoded, |
| | 9738 | Rn: Register.Encoded, |
| | 9739 | decoded10: u6 = 0b000000, |
| | 9740 | opcode: u3 = 0b001, |
| | 9741 | rmode: Rmode = .p, |
| | 9742 | decoded21: u1 = 0b1, |
| | 9743 | ftype: Ftype, |
| | 9744 | decoded24: u5 = 0b11110, |
| | 9745 | S: bool = false, |
| | 9746 | decoded30: u1 = 0b0, |
| | 9747 | sf: Register.IntegerSize, |
| | 9748 | }; |
| | 9749 | |
| | 9750 | /// C7.2.76 FCVTMS (scalar) |
| | 9751 | pub const Fcvtms = packed struct { |
| | 9752 | Rd: Register.Encoded, |
| | 9753 | Rn: Register.Encoded, |
| | 9754 | decoded10: u6 = 0b000000, |
| | 9755 | opcode: u3 = 0b000, |
| | 9756 | rmode: Rmode = .m, |
| | 9757 | decoded21: u1 = 0b1, |
| | 9758 | ftype: Ftype, |
| | 9759 | decoded24: u5 = 0b11110, |
| | 9760 | S: bool = false, |
| | 9761 | decoded30: u1 = 0b0, |
| | 9762 | sf: Register.IntegerSize, |
| | 9763 | }; |
| | 9764 | |
| | 9765 | /// C7.2.78 FCVTMU (scalar) |
| | 9766 | pub const Fcvtmu = packed struct { |
| | 9767 | Rd: Register.Encoded, |
| | 9768 | Rn: Register.Encoded, |
| | 9769 | decoded10: u6 = 0b000000, |
| | 9770 | opcode: u3 = 0b001, |
| | 9771 | rmode: Rmode = .m, |
| | 9772 | decoded21: u1 = 0b1, |
| | 9773 | ftype: Ftype, |
| | 9774 | decoded24: u5 = 0b11110, |
| | 9775 | S: bool = false, |
| | 9776 | decoded30: u1 = 0b0, |
| | 9777 | sf: Register.IntegerSize, |
| | 9778 | }; |
| | 9779 | |
| | 9780 | /// C7.2.92 FCVTZS (scalar, integer) |
| | 9781 | pub const Fcvtzs = packed struct { |
| | 9782 | Rd: Register.Encoded, |
| | 9783 | Rn: Register.Encoded, |
| | 9784 | decoded10: u6 = 0b000000, |
| | 9785 | opcode: u3 = 0b000, |
| | 9786 | rmode: Rmode = .z, |
| | 9787 | decoded21: u1 = 0b1, |
| | 9788 | ftype: Ftype, |
| | 9789 | decoded24: u5 = 0b11110, |
| | 9790 | S: bool = false, |
| | 9791 | decoded30: u1 = 0b0, |
| | 9792 | sf: Register.IntegerSize, |
| | 9793 | }; |
| | 9794 | |
| | 9795 | /// C7.2.96 FCVTZU (scalar, integer) |
| | 9796 | pub const Fcvtzu = packed struct { |
| | 9797 | Rd: Register.Encoded, |
| | 9798 | Rn: Register.Encoded, |
| | 9799 | decoded10: u6 = 0b000000, |
| | 9800 | opcode: u3 = 0b001, |
| | 9801 | rmode: Rmode = .z, |
| | 9802 | decoded21: u1 = 0b1, |
| | 9803 | ftype: Ftype, |
| | 9804 | decoded24: u5 = 0b11110, |
| | 9805 | S: bool = false, |
| | 9806 | decoded30: u1 = 0b0, |
| | 9807 | sf: Register.IntegerSize, |
| | 9808 | }; |
| | 9809 | |
| | 9810 | /// C7.2.99 FJCVTZS |
| | 9811 | pub const Fjcvtzs = packed struct { |
| | 9812 | Rd: Register.Encoded, |
| | 9813 | Rn: Register.Encoded, |
| | 9814 | decoded10: u6 = 0b000000, |
| | 9815 | opcode: u3 = 0b110, |
| | 9816 | rmode: Rmode = .z, |
| | 9817 | decoded21: u1 = 0b1, |
| | 9818 | ftype: Ftype = .double, |
| | 9819 | decoded24: u5 = 0b11110, |
| | 9820 | S: bool = false, |
| | 9821 | decoded30: u1 = 0b0, |
| | 9822 | sf: Register.IntegerSize = .word, |
| | 9823 | }; |
| | 9824 | |
| | 9825 | pub const Rmode = enum(u2) { |
| | 9826 | /// to nearest |
| | 9827 | n = 0b00, |
| | 9828 | /// toward plus infinity |
| | 9829 | p = 0b01, |
| | 9830 | /// toward minus infinity |
| | 9831 | m = 0b10, |
| | 9832 | /// toward zero |
| | 9833 | z = 0b11, |
| | 9834 | }; |
| | 9835 | }; |
| | 9836 | |
| | 9837 | /// Floating-point data-processing (1 source) |
| | 9838 | pub const FloatDataProcessingOneSource = packed union { |
| | 9839 | group: @This().Group, |
| | 9840 | fmov: Fmov, |
| | 9841 | fabs: Fabs, |
| | 9842 | fneg: Fneg, |
| | 9843 | fsqrt: Fsqrt, |
| | 9844 | fcvt: Fcvt, |
| | 9845 | frintn: Frintn, |
| | 9846 | frintp: Frintp, |
| | 9847 | frintm: Frintm, |
| | 9848 | frintz: Frintz, |
| | 9849 | frinta: Frinta, |
| | 9850 | frintx: Frintx, |
| | 9851 | frinti: Frinti, |
| | 9852 | |
| | 9853 | pub const Group = packed struct { |
| | 9854 | Rd: Register.Encoded, |
| | 9855 | Rn: Register.Encoded, |
| | 9856 | decoded10: u5 = 0b10000, |
| | 9857 | opcode: u6, |
| | 9858 | decoded21: u1 = 0b1, |
| | 9859 | ptype: Ftype, |
| | 9860 | decoded24: u5 = 0b11110, |
| | 9861 | S: bool, |
| | 9862 | decoded30: u1 = 0b0, |
| | 9863 | M: u1, |
| | 9864 | }; |
| | 9865 | |
| | 9866 | /// C7.2.130 FMOV (register) |
| | 9867 | pub const Fmov = packed struct { |
| | 9868 | Rd: Register.Encoded, |
| | 9869 | Rn: Register.Encoded, |
| | 9870 | decoded10: u5 = 0b10000, |
| | 9871 | opc: u2 = 0b00, |
| | 9872 | decoded17: u4 = 0b0000, |
| | 9873 | decoded21: u1 = 0b1, |
| | 9874 | ftype: Ftype, |
| | 9875 | decoded24: u5 = 0b11110, |
| | 9876 | S: bool = false, |
| | 9877 | decoded30: u1 = 0b0, |
| | 9878 | M: u1 = 0b0, |
| | 9879 | }; |
| | 9880 | |
| | 9881 | /// C7.2.46 FABS (scalar) |
| | 9882 | pub const Fabs = packed struct { |
| | 9883 | Rd: Register.Encoded, |
| | 9884 | Rn: Register.Encoded, |
| | 9885 | decoded10: u5 = 0b10000, |
| | 9886 | opc: u2 = 0b01, |
| | 9887 | decoded17: u4 = 0b0000, |
| | 9888 | decoded21: u1 = 0b1, |
| | 9889 | ftype: Ftype, |
| | 9890 | decoded24: u5 = 0b11110, |
| | 9891 | S: bool = false, |
| | 9892 | decoded30: u1 = 0b0, |
| | 9893 | M: u1 = 0b0, |
| | 9894 | }; |
| | 9895 | |
| | 9896 | /// C7.2.140 FNEG (scalar) |
| | 9897 | pub const Fneg = packed struct { |
| | 9898 | Rd: Register.Encoded, |
| | 9899 | Rn: Register.Encoded, |
| | 9900 | decoded10: u5 = 0b10000, |
| | 9901 | opc: u2 = 0b10, |
| | 9902 | decoded17: u4 = 0b0000, |
| | 9903 | decoded21: u1 = 0b1, |
| | 9904 | ftype: Ftype, |
| | 9905 | decoded24: u5 = 0b11110, |
| | 9906 | S: bool = false, |
| | 9907 | decoded30: u1 = 0b0, |
| | 9908 | M: u1 = 0b0, |
| | 9909 | }; |
| | 9910 | |
| | 9911 | /// C7.2.172 FSQRT (scalar) |
| | 9912 | pub const Fsqrt = packed struct { |
| | 9913 | Rd: Register.Encoded, |
| | 9914 | Rn: Register.Encoded, |
| | 9915 | decoded10: u5 = 0b10000, |
| | 9916 | opc: u2 = 0b11, |
| | 9917 | decoded17: u4 = 0b0000, |
| | 9918 | decoded21: u1 = 0b1, |
| | 9919 | ftype: Ftype, |
| | 9920 | decoded24: u5 = 0b11110, |
| | 9921 | S: bool = false, |
| | 9922 | decoded30: u1 = 0b0, |
| | 9923 | M: u1 = 0b0, |
| | 9924 | }; |
| | 9925 | |
| | 9926 | /// C7.2.69 FCVT |
| | 9927 | pub const Fcvt = packed struct { |
| | 9928 | Rd: Register.Encoded, |
| | 9929 | Rn: Register.Encoded, |
| | 9930 | decoded10: u5 = 0b10000, |
| | 9931 | opc: Ftype, |
| | 9932 | decoded17: u4 = 0b0001, |
| | 9933 | decoded21: u1 = 0b1, |
| | 9934 | ftype: Ftype, |
| | 9935 | decoded24: u5 = 0b11110, |
| | 9936 | S: bool = false, |
| | 9937 | decoded30: u1 = 0b0, |
| | 9938 | M: u1 = 0b0, |
| | 9939 | }; |
| | 9940 | |
| | 9941 | /// C7.2.162 FRINTN (scalar) |
| | 9942 | pub const Frintn = packed struct { |
| | 9943 | Rd: Register.Encoded, |
| | 9944 | Rn: Register.Encoded, |
| | 9945 | decoded10: u5 = 0b10000, |
| | 9946 | rmode: Rmode = .n, |
| | 9947 | decoded18: u3 = 0b001, |
| | 9948 | decoded21: u1 = 0b1, |
| | 9949 | ftype: Ftype, |
| | 9950 | decoded24: u5 = 0b11110, |
| | 9951 | S: bool = false, |
| | 9952 | decoded30: u1 = 0b0, |
| | 9953 | M: u1 = 0b0, |
| | 9954 | }; |
| | 9955 | |
| | 9956 | /// C7.2.164 FRINTP (scalar) |
| | 9957 | pub const Frintp = packed struct { |
| | 9958 | Rd: Register.Encoded, |
| | 9959 | Rn: Register.Encoded, |
| | 9960 | decoded10: u5 = 0b10000, |
| | 9961 | rmode: Rmode = .p, |
| | 9962 | decoded18: u3 = 0b001, |
| | 9963 | decoded21: u1 = 0b1, |
| | 9964 | ftype: Ftype, |
| | 9965 | decoded24: u5 = 0b11110, |
| | 9966 | S: bool = false, |
| | 9967 | decoded30: u1 = 0b0, |
| | 9968 | M: u1 = 0b0, |
| | 9969 | }; |
| | 9970 | |
| | 9971 | /// C7.2.160 FRINTM (scalar) |
| | 9972 | pub const Frintm = packed struct { |
| | 9973 | Rd: Register.Encoded, |
| | 9974 | Rn: Register.Encoded, |
| | 9975 | decoded10: u5 = 0b10000, |
| | 9976 | rmode: Rmode = .m, |
| | 9977 | decoded18: u3 = 0b001, |
| | 9978 | decoded21: u1 = 0b1, |
| | 9979 | ftype: Ftype, |
| | 9980 | decoded24: u5 = 0b11110, |
| | 9981 | S: bool = false, |
| | 9982 | decoded30: u1 = 0b0, |
| | 9983 | M: u1 = 0b0, |
| | 9984 | }; |
| | 9985 | |
| | 9986 | /// C7.2.168 FRINTZ (scalar) |
| | 9987 | pub const Frintz = packed struct { |
| | 9988 | Rd: Register.Encoded, |
| | 9989 | Rn: Register.Encoded, |
| | 9990 | decoded10: u5 = 0b10000, |
| | 9991 | rmode: Rmode = .z, |
| | 9992 | decoded18: u3 = 0b001, |
| | 9993 | decoded21: u1 = 0b1, |
| | 9994 | ftype: Ftype, |
| | 9995 | decoded24: u5 = 0b11110, |
| | 9996 | S: bool = false, |
| | 9997 | decoded30: u1 = 0b0, |
| | 9998 | M: u1 = 0b0, |
| | 9999 | }; |
| | 10000 | |
| | 10001 | /// C7.2.156 FRINTA (scalar) |
| | 10002 | pub const Frinta = packed struct { |
| | 10003 | Rd: Register.Encoded, |
| | 10004 | Rn: Register.Encoded, |
| | 10005 | decoded10: u5 = 0b10000, |
| | 10006 | rmode: Rmode = .a, |
| | 10007 | decoded18: u3 = 0b001, |
| | 10008 | decoded21: u1 = 0b1, |
| | 10009 | ftype: Ftype, |
| | 10010 | decoded24: u5 = 0b11110, |
| | 10011 | S: bool = false, |
| | 10012 | decoded30: u1 = 0b0, |
| | 10013 | M: u1 = 0b0, |
| | 10014 | }; |
| | 10015 | |
| | 10016 | /// C7.2.166 FRINTX (scalar) |
| | 10017 | pub const Frintx = packed struct { |
| | 10018 | Rd: Register.Encoded, |
| | 10019 | Rn: Register.Encoded, |
| | 10020 | decoded10: u5 = 0b10000, |
| | 10021 | rmode: Rmode = .x, |
| | 10022 | decoded18: u3 = 0b001, |
| | 10023 | decoded21: u1 = 0b1, |
| | 10024 | ftype: Ftype, |
| | 10025 | decoded24: u5 = 0b11110, |
| | 10026 | S: bool = false, |
| | 10027 | decoded30: u1 = 0b0, |
| | 10028 | M: u1 = 0b0, |
| | 10029 | }; |
| | 10030 | |
| | 10031 | /// C7.2.158 FRINTI (scalar) |
| | 10032 | pub const Frinti = packed struct { |
| | 10033 | Rd: Register.Encoded, |
| | 10034 | Rn: Register.Encoded, |
| | 10035 | decoded10: u5 = 0b10000, |
| | 10036 | rmode: Rmode = .i, |
| | 10037 | decoded18: u3 = 0b001, |
| | 10038 | decoded21: u1 = 0b1, |
| | 10039 | ftype: Ftype, |
| | 10040 | decoded24: u5 = 0b11110, |
| | 10041 | S: bool = false, |
| | 10042 | decoded30: u1 = 0b0, |
| | 10043 | M: u1 = 0b0, |
| | 10044 | }; |
| | 10045 | |
| | 10046 | pub const Rmode = enum(u3) { |
| | 10047 | /// to nearest with ties to even |
| | 10048 | n = 0b000, |
| | 10049 | /// toward plus infinity |
| | 10050 | p = 0b001, |
| | 10051 | /// toward minus infinity |
| | 10052 | m = 0b010, |
| | 10053 | /// toward zero |
| | 10054 | z = 0b011, |
| | 10055 | /// to nearest with ties to away |
| | 10056 | a = 0b100, |
| | 10057 | /// exact, using current rounding mode |
| | 10058 | x = 0b110, |
| | 10059 | /// using current rounding mode |
| | 10060 | i = 0b111, |
| | 10061 | _, |
| | 10062 | }; |
| | 10063 | }; |
| | 10064 | |
| | 10065 | /// Floating-point compare |
| | 10066 | pub const FloatCompare = packed union { |
| | 10067 | group: @This().Group, |
| | 10068 | fcmp: Fcmp, |
| | 10069 | fcmpe: Fcmpe, |
| | 10070 | |
| | 10071 | pub const Group = packed struct { |
| | 10072 | opcode2: u5, |
| | 10073 | Rn: Register.Encoded, |
| | 10074 | decoded10: u4 = 0b1000, |
| | 10075 | op: u2, |
| | 10076 | Rm: Register.Encoded, |
| | 10077 | decoded21: u1 = 0b1, |
| | 10078 | ptype: Ftype, |
| | 10079 | decoded24: u5 = 0b11110, |
| | 10080 | S: bool, |
| | 10081 | decoded30: u1 = 0b0, |
| | 10082 | M: u1, |
| | 10083 | }; |
| | 10084 | |
| | 10085 | /// C7.2.66 FCMP |
| | 10086 | pub const Fcmp = packed struct { |
| | 10087 | decoded0: u3 = 0b000, |
| | 10088 | opc0: Opc0, |
| | 10089 | opc1: u1 = 0b0, |
| | 10090 | Rn: Register.Encoded, |
| | 10091 | decoded10: u4 = 0b1000, |
| | 10092 | op: u2 = 0b00, |
| | 10093 | Rm: Register.Encoded, |
| | 10094 | decoded21: u1 = 0b1, |
| | 10095 | ftype: Ftype, |
| | 10096 | decoded24: u5 = 0b11110, |
| | 10097 | S: bool = false, |
| | 10098 | decoded30: u1 = 0b0, |
| | 10099 | M: u1 = 0b0, |
| | 10100 | }; |
| | 10101 | |
| | 10102 | /// C7.2.67 FCMPE |
| | 10103 | pub const Fcmpe = packed struct { |
| | 10104 | decoded0: u3 = 0b000, |
| | 10105 | opc0: Opc0, |
| | 10106 | opc1: u1 = 0b1, |
| | 10107 | Rn: Register.Encoded, |
| | 10108 | decoded10: u4 = 0b1000, |
| | 10109 | op: u2 = 0b00, |
| | 10110 | Rm: Register.Encoded, |
| | 10111 | decoded21: u1 = 0b1, |
| | 10112 | ftype: Ftype, |
| | 10113 | decoded24: u5 = 0b11110, |
| | 10114 | S: bool = false, |
| | 10115 | decoded30: u1 = 0b0, |
| | 10116 | M: u1 = 0b0, |
| | 10117 | }; |
| | 10118 | |
| | 10119 | pub const Opc0 = enum(u1) { |
| | 10120 | register = 0b00, |
| | 10121 | zero = 0b01, |
| | 10122 | }; |
| | 10123 | }; |
| | 10124 | |
| | 10125 | /// Floating-point immediate |
| | 10126 | pub const FloatImmediate = packed union { |
| | 10127 | group: @This().Group, |
| | 10128 | fmov: Fmov, |
| | 10129 | |
| | 10130 | pub const Group = packed struct { |
| | 10131 | Rd: Register.Encoded, |
| | 10132 | imm5: u5, |
| | 10133 | decoded10: u3 = 0b100, |
| | 10134 | imm8: u8, |
| | 10135 | decoded21: u1 = 0b1, |
| | 10136 | ptype: Ftype, |
| | 10137 | decoded24: u5 = 0b11110, |
| | 10138 | S: bool, |
| | 10139 | decoded30: u1 = 0b0, |
| | 10140 | M: u1, |
| | 10141 | }; |
| | 10142 | |
| | 10143 | /// C7.2.132 FMOV (scalar, immediate) |
| | 10144 | pub const Fmov = packed struct { |
| | 10145 | Rd: Register.Encoded, |
| | 10146 | imm5: u5 = 0b00000, |
| | 10147 | decoded10: u3 = 0b100, |
| | 10148 | imm8: u8, |
| | 10149 | decoded21: u1 = 0b1, |
| | 10150 | ftype: Ftype, |
| | 10151 | decoded24: u5 = 0b11110, |
| | 10152 | S: bool = false, |
| | 10153 | decoded30: u1 = 0b0, |
| | 10154 | M: u1 = 0b0, |
| | 10155 | }; |
| | 10156 | }; |
| | 10157 | |
| | 10158 | /// Floating-point data-processing (2 source) |
| | 10159 | pub const FloatDataProcessingTwoSource = packed union { |
| | 10160 | group: @This().Group, |
| | 10161 | fmul: Fmul, |
| | 10162 | fdiv: Fdiv, |
| | 10163 | fadd: Fadd, |
| | 10164 | fsub: Fsub, |
| | 10165 | fmax: Fmax, |
| | 10166 | fmin: Fmin, |
| | 10167 | fmaxnm: Fmaxnm, |
| | 10168 | fminnm: Fminnm, |
| | 10169 | fnmul: Fnmul, |
| | 10170 | |
| | 10171 | pub const Group = packed struct { |
| | 10172 | Rd: Register.Encoded, |
| | 10173 | Rn: Register.Encoded, |
| | 10174 | decoded10: u2 = 0b10, |
| | 10175 | opcode: Opcode, |
| | 10176 | Rm: Register.Encoded, |
| | 10177 | decoded21: u1 = 0b1, |
| | 10178 | ptype: Ftype, |
| | 10179 | decoded24: u5 = 0b11110, |
| | 10180 | S: bool, |
| | 10181 | decoded30: u1 = 0b0, |
| | 10182 | M: u1, |
| | 10183 | }; |
| | 10184 | |
| | 10185 | /// C7.2.136 FMUL (scalar) |
| | 10186 | pub const Fmul = packed struct { |
| | 10187 | Rd: Register.Encoded, |
| | 10188 | Rn: Register.Encoded, |
| | 10189 | decoded10: u2 = 0b10, |
| | 10190 | opcode: Opcode = .fmul, |
| | 10191 | Rm: Register.Encoded, |
| | 10192 | decoded21: u1 = 0b1, |
| | 10193 | ftype: Ftype, |
| | 10194 | decoded24: u5 = 0b11110, |
| | 10195 | S: bool = false, |
| | 10196 | decoded30: u1 = 0b0, |
| | 10197 | M: u1 = 0b0, |
| | 10198 | }; |
| | 10199 | |
| | 10200 | /// C7.2.98 FDIV (scalar) |
| | 10201 | pub const Fdiv = packed struct { |
| | 10202 | Rd: Register.Encoded, |
| | 10203 | Rn: Register.Encoded, |
| | 10204 | decoded10: u2 = 0b10, |
| | 10205 | opcode: Opcode = .fdiv, |
| | 10206 | Rm: Register.Encoded, |
| | 10207 | decoded21: u1 = 0b1, |
| | 10208 | ftype: Ftype, |
| | 10209 | decoded24: u5 = 0b11110, |
| | 10210 | S: bool = false, |
| | 10211 | decoded30: u1 = 0b0, |
| | 10212 | M: u1 = 0b0, |
| | 10213 | }; |
| | 10214 | |
| | 10215 | /// C7.2.50 FADD (scalar) |
| | 10216 | pub const Fadd = packed struct { |
| | 10217 | Rd: Register.Encoded, |
| | 10218 | Rn: Register.Encoded, |
| | 10219 | decoded10: u2 = 0b10, |
| | 10220 | opcode: Opcode = .fadd, |
| | 10221 | Rm: Register.Encoded, |
| | 10222 | decoded21: u1 = 0b1, |
| | 10223 | ftype: Ftype, |
| | 10224 | decoded24: u5 = 0b11110, |
| | 10225 | S: bool = false, |
| | 10226 | decoded30: u1 = 0b0, |
| | 10227 | M: u1 = 0b0, |
| | 10228 | }; |
| | 10229 | |
| | 10230 | /// C7.2.174 FSUB (scalar) |
| | 10231 | pub const Fsub = packed struct { |
| | 10232 | Rd: Register.Encoded, |
| | 10233 | Rn: Register.Encoded, |
| | 10234 | decoded10: u2 = 0b10, |
| | 10235 | opcode: Opcode = .fsub, |
| | 10236 | Rm: Register.Encoded, |
| | 10237 | decoded21: u1 = 0b1, |
| | 10238 | ftype: Ftype, |
| | 10239 | decoded24: u5 = 0b11110, |
| | 10240 | S: bool = false, |
| | 10241 | decoded30: u1 = 0b0, |
| | 10242 | M: u1 = 0b0, |
| | 10243 | }; |
| | 10244 | |
| | 10245 | /// C7.2.102 FMAX (scalar) |
| | 10246 | pub const Fmax = packed struct { |
| | 10247 | Rd: Register.Encoded, |
| | 10248 | Rn: Register.Encoded, |
| | 10249 | decoded10: u2 = 0b10, |
| | 10250 | opcode: Opcode = .fmax, |
| | 10251 | Rm: Register.Encoded, |
| | 10252 | decoded21: u1 = 0b1, |
| | 10253 | ftype: Ftype, |
| | 10254 | decoded24: u5 = 0b11110, |
| | 10255 | S: bool = false, |
| | 10256 | decoded30: u1 = 0b0, |
| | 10257 | M: u1 = 0b0, |
| | 10258 | }; |
| | 10259 | |
| | 10260 | /// C7.2.112 FMIN (scalar) |
| | 10261 | pub const Fmin = packed struct { |
| | 10262 | Rd: Register.Encoded, |
| | 10263 | Rn: Register.Encoded, |
| | 10264 | decoded10: u2 = 0b10, |
| | 10265 | opcode: Opcode = .fmin, |
| | 10266 | Rm: Register.Encoded, |
| | 10267 | decoded21: u1 = 0b1, |
| | 10268 | ftype: Ftype, |
| | 10269 | decoded24: u5 = 0b11110, |
| | 10270 | S: bool = false, |
| | 10271 | decoded30: u1 = 0b0, |
| | 10272 | M: u1 = 0b0, |
| | 10273 | }; |
| | 10274 | |
| | 10275 | /// C7.2.104 FMAXNM (scalar) |
| | 10276 | pub const Fmaxnm = packed struct { |
| | 10277 | Rd: Register.Encoded, |
| | 10278 | Rn: Register.Encoded, |
| | 10279 | decoded10: u2 = 0b10, |
| | 10280 | opcode: Opcode = .fmaxnm, |
| | 10281 | Rm: Register.Encoded, |
| | 10282 | decoded21: u1 = 0b1, |
| | 10283 | ftype: Ftype, |
| | 10284 | decoded24: u5 = 0b11110, |
| | 10285 | S: bool = false, |
| | 10286 | decoded30: u1 = 0b0, |
| | 10287 | M: u1 = 0b0, |
| | 10288 | }; |
| | 10289 | |
| | 10290 | /// C7.2.114 FMINNM (scalar) |
| | 10291 | pub const Fminnm = packed struct { |
| | 10292 | Rd: Register.Encoded, |
| | 10293 | Rn: Register.Encoded, |
| | 10294 | decoded10: u2 = 0b10, |
| | 10295 | opcode: Opcode = .fminnm, |
| | 10296 | Rm: Register.Encoded, |
| | 10297 | decoded21: u1 = 0b1, |
| | 10298 | ftype: Ftype, |
| | 10299 | decoded24: u5 = 0b11110, |
| | 10300 | S: bool = false, |
| | 10301 | decoded30: u1 = 0b0, |
| | 10302 | M: u1 = 0b0, |
| | 10303 | }; |
| | 10304 | |
| | 10305 | /// C7.2.143 FNMUL (scalar) |
| | 10306 | pub const Fnmul = packed struct { |
| | 10307 | Rd: Register.Encoded, |
| | 10308 | Rn: Register.Encoded, |
| | 10309 | decoded10: u2 = 0b10, |
| | 10310 | opcode: Opcode = .fnmul, |
| | 10311 | Rm: Register.Encoded, |
| | 10312 | decoded21: u1 = 0b1, |
| | 10313 | ftype: Ftype, |
| | 10314 | decoded24: u5 = 0b11110, |
| | 10315 | S: bool = false, |
| | 10316 | decoded30: u1 = 0b0, |
| | 10317 | M: u1 = 0b0, |
| | 10318 | }; |
| | 10319 | |
| | 10320 | pub const Opcode = enum(u4) { |
| | 10321 | fmul = 0b0000, |
| | 10322 | fdiv = 0b0001, |
| | 10323 | fadd = 0b0010, |
| | 10324 | fsub = 0b0011, |
| | 10325 | fmax = 0b0100, |
| | 10326 | fmin = 0b0101, |
| | 10327 | fmaxnm = 0b0110, |
| | 10328 | fminnm = 0b0111, |
| | 10329 | fnmul = 0b1000, |
| | 10330 | _, |
| | 10331 | }; |
| | 10332 | }; |
| | 10333 | |
| | 10334 | /// Floating-point conditional select |
| | 10335 | pub const FloatConditionalSelect = packed union { |
| | 10336 | group: @This().Group, |
| | 10337 | fcsel: Fcsel, |
| | 10338 | |
| | 10339 | pub const Group = packed struct { |
| | 10340 | Rd: Register.Encoded, |
| | 10341 | Rn: Register.Encoded, |
| | 10342 | decoded10: u2 = 0b11, |
| | 10343 | cond: ConditionCode, |
| | 10344 | Rm: Register.Encoded, |
| | 10345 | decoded21: u1 = 0b1, |
| | 10346 | ptype: Ftype, |
| | 10347 | decoded24: u5 = 0b11110, |
| | 10348 | S: bool, |
| | 10349 | decoded30: u1 = 0b0, |
| | 10350 | M: u1, |
| | 10351 | }; |
| | 10352 | |
| | 10353 | /// C7.2.68 FCSEL |
| | 10354 | pub const Fcsel = packed struct { |
| | 10355 | Rd: Register.Encoded, |
| | 10356 | Rn: Register.Encoded, |
| | 10357 | decoded10: u2 = 0b11, |
| | 10358 | cond: ConditionCode, |
| | 10359 | Rm: Register.Encoded, |
| | 10360 | decoded21: u1 = 0b1, |
| | 10361 | ftype: Ftype, |
| | 10362 | decoded24: u5 = 0b11110, |
| | 10363 | S: bool = false, |
| | 10364 | decoded30: u1 = 0b0, |
| | 10365 | M: u1 = 0b0, |
| | 10366 | }; |
| | 10367 | |
| | 10368 | pub const Decoded = union(enum) { |
| | 10369 | unallocated, |
| | 10370 | fcsel: Fcsel, |
| | 10371 | }; |
| | 10372 | pub fn decode(inst: @This()) @This().Decoded { |
| | 10373 | return switch (inst.group.ptype) { |
| | 10374 | .quad => .unallocated, |
| | 10375 | .single, .double, .half => switch (inst.group.S) { |
| | 10376 | true => .unallocated, |
| | 10377 | false => switch (inst.group.M) { |
| | 10378 | 0b0 => .{ .fcsel = inst.fcsel }, |
| | 10379 | 0b1 => .unallocated, |
| | 10380 | }, |
| | 10381 | }, |
| | 10382 | }; |
| | 10383 | } |
| | 10384 | }; |
| | 10385 | |
| | 10386 | /// Floating-point data-processing (3 source) |
| | 10387 | pub const FloatDataProcessingThreeSource = packed union { |
| | 10388 | group: @This().Group, |
| | 10389 | fmadd: Fmadd, |
| | 10390 | fmsub: Fmsub, |
| | 10391 | fnmadd: Fnmadd, |
| | 10392 | fnmsub: Fnmsub, |
| | 10393 | |
| | 10394 | pub const Group = packed struct { |
| | 10395 | Rd: Register.Encoded, |
| | 10396 | Rn: Register.Encoded, |
| | 10397 | Ra: Register.Encoded, |
| | 10398 | o0: AddSubtractOp, |
| | 10399 | Rm: Register.Encoded, |
| | 10400 | o1: u1, |
| | 10401 | ptype: Ftype, |
| | 10402 | decoded24: u5 = 0b11111, |
| | 10403 | S: bool, |
| | 10404 | decoded30: u1 = 0b0, |
| | 10405 | M: u1, |
| | 10406 | }; |
| | 10407 | |
| | 10408 | /// C7.2.100 FMADD |
| | 10409 | pub const Fmadd = packed struct { |
| | 10410 | Rd: Register.Encoded, |
| | 10411 | Rn: Register.Encoded, |
| | 10412 | Ra: Register.Encoded, |
| | 10413 | o0: AddSubtractOp = .add, |
| | 10414 | Rm: Register.Encoded, |
| | 10415 | o1: O1 = .fm, |
| | 10416 | ftype: Ftype, |
| | 10417 | decoded24: u5 = 0b11111, |
| | 10418 | S: bool = false, |
| | 10419 | decoded30: u1 = 0b0, |
| | 10420 | M: u1 = 0b0, |
| | 10421 | }; |
| | 10422 | |
| | 10423 | /// C7.2.133 FMSUB |
| | 10424 | pub const Fmsub = packed struct { |
| | 10425 | Rd: Register.Encoded, |
| | 10426 | Rn: Register.Encoded, |
| | 10427 | Ra: Register.Encoded, |
| | 10428 | o0: AddSubtractOp = .sub, |
| 8200 | Rm: Register.Encoded, | 10429 | Rm: Register.Encoded, |
| 8201 | o1: O1 = .fm, | 10430 | o1: O1 = .fm, |
| 8202 | ftype: Ftype, | 10431 | ftype: Ftype, |
| ... | @@ -8242,42 +10471,81 @@ pub const Instruction = packed union { | ... | @@ -8242,42 +10471,81 @@ pub const Instruction = packed union { |
| 8242 | }; | 10471 | }; |
| 8243 | }; | 10472 | }; |
| 8244 | | 10473 | |
| 8245 | pub const Q = enum(u1) { | | |
| 8246 | double = 0b0, | | |
| 8247 | quad = 0b1, | | |
| 8248 | }; | | |
| 8249 | | | |
| 8250 | pub const Size = enum(u2) { | 10474 | pub const Size = enum(u2) { |
| 8251 | byte = 0b00, | 10475 | byte = 0b00, |
| 8252 | half = 0b01, | 10476 | half = 0b01, |
| 8253 | single = 0b10, | 10477 | single = 0b10, |
| 8254 | double = 0b11, | 10478 | double = 0b11, |
| 8255 | | 10479 | |
| 8256 | pub fn toVectorSize(s: Size) Register.VectorSize { | 10480 | pub fn toVectorSize(s: Size) Register.VectorSize { |
| 8257 | return switch (s) { | 10481 | return switch (s) { |
| 8258 | .byte => .byte, | 10482 | .byte => .byte, |
| 8259 | .half => .half, | 10483 | .half => .half, |
| | 10484 | .single => .single, |
| | 10485 | .double => .double, |
| | 10486 | }; |
| | 10487 | } |
| | 10488 | |
| | 10489 | pub fn fromVectorSize(vs: Register.VectorSize) Size { |
| | 10490 | return switch (vs) { |
| | 10491 | else => unreachable, |
| | 10492 | .byte => .byte, |
| | 10493 | .half => .half, |
| | 10494 | .single => .single, |
| | 10495 | .double => .double, |
| | 10496 | }; |
| | 10497 | } |
| | 10498 | }; |
| | 10499 | |
| | 10500 | pub const Sz = enum(u1) { |
| | 10501 | single = 0b0, |
| | 10502 | double = 0b1, |
| | 10503 | |
| | 10504 | pub fn toVectorSize(sz: Sz) Register.VectorSize { |
| | 10505 | return switch (sz) { |
| | 10506 | .single => .single, |
| | 10507 | .double => .double, |
| | 10508 | }; |
| | 10509 | } |
| | 10510 | |
| | 10511 | pub fn fromVectorSize(vs: Register.VectorSize) Sz { |
| | 10512 | return switch (vs) { |
| | 10513 | else => unreachable, |
| | 10514 | .single => .single, |
| | 10515 | .double => .double, |
| | 10516 | }; |
| | 10517 | } |
| | 10518 | }; |
| | 10519 | |
| | 10520 | pub const Q = enum(u1) { |
| | 10521 | double = 0b0, |
| | 10522 | quad = 0b1, |
| | 10523 | }; |
| | 10524 | |
| | 10525 | pub const Ftype = enum(u2) { |
| | 10526 | single = 0b00, |
| | 10527 | double = 0b01, |
| | 10528 | quad = 0b10, |
| | 10529 | half = 0b11, |
| | 10530 | |
| | 10531 | pub fn toVectorSize(ftype: Ftype) Register.VectorSize { |
| | 10532 | return switch (ftype) { |
| | 10533 | _ => unreachable, |
| 8260 | .single => .single, | 10534 | .single => .single, |
| 8261 | .double => .double, | 10535 | .double => .double, |
| | 10536 | .half => .half, |
| 8262 | }; | 10537 | }; |
| 8263 | } | 10538 | } |
| 8264 | | 10539 | |
| 8265 | pub fn fromVectorSize(vs: Register.VectorSize) Size { | 10540 | pub fn fromVectorSize(vs: Register.VectorSize) Ftype { |
| 8266 | return switch (vs) { | 10541 | return switch (vs) { |
| 8267 | .byte => .byte, | 10542 | else => unreachable, |
| 8268 | .half => .half, | | |
| 8269 | .single => .single, | 10543 | .single => .single, |
| 8270 | .double => .double, | 10544 | .double => .double, |
| | 10545 | .half => .half, |
| 8271 | }; | 10546 | }; |
| 8272 | } | 10547 | } |
| 8273 | }; | 10548 | }; |
| 8274 | | | |
| 8275 | pub const Ftype = enum(u2) { | | |
| 8276 | single = 0b00, | | |
| 8277 | double = 0b01, | | |
| 8278 | quad = 0b10, | | |
| 8279 | half = 0b11, | | |
| 8280 | }; | | |
| 8281 | }; | 10549 | }; |
| 8282 | | 10550 | |
| 8283 | pub const AddSubtractOp = enum(u1) { | 10551 | pub const AddSubtractOp = enum(u1) { |
| ... | @@ -8320,6 +10588,33 @@ pub const Instruction = packed union { | ... | @@ -8320,6 +10588,33 @@ pub const Instruction = packed union { |
| 8320 | }; | 10588 | }; |
| 8321 | } | 10589 | } |
| 8322 | | 10590 | |
| | 10591 | /// C7.2.1 ABS (zero) |
| | 10592 | pub fn abs(d: Register, n: Register) Instruction { |
| | 10593 | switch (d.format) { |
| | 10594 | else => unreachable, |
| | 10595 | .scalar => |elem_size| { |
| | 10596 | assert(elem_size == .double and elem_size == n.format.scalar); |
| | 10597 | return .{ .data_processing_vector = .{ .simd_scalar_two_register_miscellaneous = .{ |
| | 10598 | .abs = .{ |
| | 10599 | .Rd = d.alias.encode(.{ .V = true }), |
| | 10600 | .Rn = n.alias.encode(.{ .V = true }), |
| | 10601 | .size = .fromVectorSize(elem_size), |
| | 10602 | }, |
| | 10603 | } } }; |
| | 10604 | }, |
| | 10605 | .vector => |arrangement| { |
| | 10606 | assert(arrangement != .@"1d" and n.format.vector == arrangement); |
| | 10607 | return .{ .data_processing_vector = .{ .simd_two_register_miscellaneous = .{ |
| | 10608 | .abs = .{ |
| | 10609 | .Rd = d.alias.encode(.{ .V = true }), |
| | 10610 | .Rn = n.alias.encode(.{ .V = true }), |
| | 10611 | .size = arrangement.elemSize(), |
| | 10612 | .Q = arrangement.size(), |
| | 10613 | }, |
| | 10614 | } } }; |
| | 10615 | }, |
| | 10616 | } |
| | 10617 | } |
| 8323 | /// C6.2.1 ADC | 10618 | /// C6.2.1 ADC |
| 8324 | pub fn adc(d: Register, n: Register, m: Register) Instruction { | 10619 | pub fn adc(d: Register, n: Register, m: Register) Instruction { |
| 8325 | const sf = d.format.integer; | 10620 | const sf = d.format.integer; |
| ... | @@ -8867,6 +11162,45 @@ pub const Instruction = packed union { | ... | @@ -8867,6 +11162,45 @@ pub const Instruction = packed union { |
| 8867 | } }, | 11162 | } }, |
| 8868 | } | 11163 | } |
| 8869 | } | 11164 | } |
| | 11165 | /// C7.2.22 BIF |
| | 11166 | pub fn bif(d: Register, n: Register, m: Register) Instruction { |
| | 11167 | const arrangement = d.format.vector; |
| | 11168 | assert(arrangement.elemSize() == .byte and n.format.vector == arrangement and m.format.vector == arrangement); |
| | 11169 | return .{ .data_processing_vector = .{ .simd_three_same = .{ |
| | 11170 | .bif = .{ |
| | 11171 | .Rd = d.alias.encode(.{ .V = true }), |
| | 11172 | .Rn = n.alias.encode(.{ .V = true }), |
| | 11173 | .Rm = m.alias.encode(.{ .V = true }), |
| | 11174 | .Q = arrangement.size(), |
| | 11175 | }, |
| | 11176 | } } }; |
| | 11177 | } |
| | 11178 | /// C7.2.23 BIT |
| | 11179 | pub fn bit(d: Register, n: Register, m: Register) Instruction { |
| | 11180 | const arrangement = d.format.vector; |
| | 11181 | assert(arrangement.elemSize() == .byte and n.format.vector == arrangement and m.format.vector == arrangement); |
| | 11182 | return .{ .data_processing_vector = .{ .simd_three_same = .{ |
| | 11183 | .bit = .{ |
| | 11184 | .Rd = d.alias.encode(.{ .V = true }), |
| | 11185 | .Rn = n.alias.encode(.{ .V = true }), |
| | 11186 | .Rm = m.alias.encode(.{ .V = true }), |
| | 11187 | .Q = arrangement.size(), |
| | 11188 | }, |
| | 11189 | } } }; |
| | 11190 | } |
| | 11191 | /// C7.2.24 BSL |
| | 11192 | pub fn bsl(d: Register, n: Register, m: Register) Instruction { |
| | 11193 | const arrangement = d.format.vector; |
| | 11194 | assert(arrangement.elemSize() == .byte and n.format.vector == arrangement and m.format.vector == arrangement); |
| | 11195 | return .{ .data_processing_vector = .{ .simd_three_same = .{ |
| | 11196 | .bsl = .{ |
| | 11197 | .Rd = d.alias.encode(.{ .V = true }), |
| | 11198 | .Rn = n.alias.encode(.{ .V = true }), |
| | 11199 | .Rm = m.alias.encode(.{ .V = true }), |
| | 11200 | .Q = arrangement.size(), |
| | 11201 | }, |
| | 11202 | } } }; |
| | 11203 | } |
| 8870 | /// C6.2.34 BL | 11204 | /// C6.2.34 BL |
| 8871 | pub fn bl(label: i28) Instruction { | 11205 | pub fn bl(label: i28) Instruction { |
| 8872 | return .{ .branch_exception_generating_system = .{ .unconditional_branch_immediate = .{ | 11206 | return .{ .branch_exception_generating_system = .{ .unconditional_branch_immediate = .{ |
| ... | @@ -8999,6 +11333,151 @@ pub const Instruction = packed union { | ... | @@ -8999,6 +11333,151 @@ pub const Instruction = packed union { |
| 8999 | }, | 11333 | }, |
| 9000 | } } }; | 11334 | } } }; |
| 9001 | } | 11335 | } |
| | 11336 | /// C7.2.28 CMEQ (zero) |
| | 11337 | pub fn cmeq(d: Register, n: Register, form: union(enum) { zero }) Instruction { |
| | 11338 | switch (form) { |
| | 11339 | .zero => switch (d.format) { |
| | 11340 | else => unreachable, |
| | 11341 | .scalar => |elem_size| { |
| | 11342 | assert(elem_size == .double and elem_size == n.format.scalar); |
| | 11343 | return .{ .data_processing_vector = .{ .simd_scalar_two_register_miscellaneous = .{ |
| | 11344 | .cmeq = .{ |
| | 11345 | .Rd = d.alias.encode(.{ .V = true }), |
| | 11346 | .Rn = n.alias.encode(.{ .V = true }), |
| | 11347 | .size = .fromVectorSize(elem_size), |
| | 11348 | }, |
| | 11349 | } } }; |
| | 11350 | }, |
| | 11351 | .vector => |arrangement| { |
| | 11352 | assert(arrangement != .@"1d" and n.format.vector == arrangement); |
| | 11353 | return .{ .data_processing_vector = .{ .simd_two_register_miscellaneous = .{ |
| | 11354 | .cmeq = .{ |
| | 11355 | .Rd = d.alias.encode(.{ .V = true }), |
| | 11356 | .Rn = n.alias.encode(.{ .V = true }), |
| | 11357 | .size = arrangement.elemSize(), |
| | 11358 | .Q = arrangement.size(), |
| | 11359 | }, |
| | 11360 | } } }; |
| | 11361 | }, |
| | 11362 | }, |
| | 11363 | } |
| | 11364 | } |
| | 11365 | /// C7.2.30 CMGE (zero) |
| | 11366 | pub fn cmge(d: Register, n: Register, form: union(enum) { zero }) Instruction { |
| | 11367 | switch (form) { |
| | 11368 | .zero => switch (d.format) { |
| | 11369 | else => unreachable, |
| | 11370 | .scalar => |elem_size| { |
| | 11371 | assert(elem_size == .double and elem_size == n.format.scalar); |
| | 11372 | return .{ .data_processing_vector = .{ .simd_scalar_two_register_miscellaneous = .{ |
| | 11373 | .cmge = .{ |
| | 11374 | .Rd = d.alias.encode(.{ .V = true }), |
| | 11375 | .Rn = n.alias.encode(.{ .V = true }), |
| | 11376 | .size = .fromVectorSize(elem_size), |
| | 11377 | }, |
| | 11378 | } } }; |
| | 11379 | }, |
| | 11380 | .vector => |arrangement| { |
| | 11381 | assert(arrangement != .@"1d" and n.format.vector == arrangement); |
| | 11382 | return .{ .data_processing_vector = .{ .simd_two_register_miscellaneous = .{ |
| | 11383 | .cmge = .{ |
| | 11384 | .Rd = d.alias.encode(.{ .V = true }), |
| | 11385 | .Rn = n.alias.encode(.{ .V = true }), |
| | 11386 | .size = arrangement.elemSize(), |
| | 11387 | .Q = arrangement.size(), |
| | 11388 | }, |
| | 11389 | } } }; |
| | 11390 | }, |
| | 11391 | }, |
| | 11392 | } |
| | 11393 | } |
| | 11394 | /// C7.2.32 CMGT (zero) |
| | 11395 | pub fn cmgt(d: Register, n: Register, form: union(enum) { zero }) Instruction { |
| | 11396 | switch (form) { |
| | 11397 | .zero => switch (d.format) { |
| | 11398 | else => unreachable, |
| | 11399 | .scalar => |elem_size| { |
| | 11400 | assert(elem_size == .double and elem_size == n.format.scalar); |
| | 11401 | return .{ .data_processing_vector = .{ .simd_scalar_two_register_miscellaneous = .{ |
| | 11402 | .cmgt = .{ |
| | 11403 | .Rd = d.alias.encode(.{ .V = true }), |
| | 11404 | .Rn = n.alias.encode(.{ .V = true }), |
| | 11405 | .size = .fromVectorSize(elem_size), |
| | 11406 | }, |
| | 11407 | } } }; |
| | 11408 | }, |
| | 11409 | .vector => |arrangement| { |
| | 11410 | assert(arrangement != .@"1d" and n.format.vector == arrangement); |
| | 11411 | return .{ .data_processing_vector = .{ .simd_two_register_miscellaneous = .{ |
| | 11412 | .cmgt = .{ |
| | 11413 | .Rd = d.alias.encode(.{ .V = true }), |
| | 11414 | .Rn = n.alias.encode(.{ .V = true }), |
| | 11415 | .size = arrangement.elemSize(), |
| | 11416 | .Q = arrangement.size(), |
| | 11417 | }, |
| | 11418 | } } }; |
| | 11419 | }, |
| | 11420 | }, |
| | 11421 | } |
| | 11422 | } |
| | 11423 | /// C7.2.35 CMLE (zero) |
| | 11424 | pub fn cmle(d: Register, n: Register, form: union(enum) { zero }) Instruction { |
| | 11425 | switch (form) { |
| | 11426 | .zero => switch (d.format) { |
| | 11427 | else => unreachable, |
| | 11428 | .scalar => |elem_size| { |
| | 11429 | assert(elem_size == .double and elem_size == n.format.scalar); |
| | 11430 | return .{ .data_processing_vector = .{ .simd_scalar_two_register_miscellaneous = .{ |
| | 11431 | .cmle = .{ |
| | 11432 | .Rd = d.alias.encode(.{ .V = true }), |
| | 11433 | .Rn = n.alias.encode(.{ .V = true }), |
| | 11434 | .size = .fromVectorSize(elem_size), |
| | 11435 | }, |
| | 11436 | } } }; |
| | 11437 | }, |
| | 11438 | .vector => |arrangement| { |
| | 11439 | assert(arrangement != .@"1d" and n.format.vector == arrangement); |
| | 11440 | return .{ .data_processing_vector = .{ .simd_two_register_miscellaneous = .{ |
| | 11441 | .cmle = .{ |
| | 11442 | .Rd = d.alias.encode(.{ .V = true }), |
| | 11443 | .Rn = n.alias.encode(.{ .V = true }), |
| | 11444 | .size = arrangement.elemSize(), |
| | 11445 | .Q = arrangement.size(), |
| | 11446 | }, |
| | 11447 | } } }; |
| | 11448 | }, |
| | 11449 | }, |
| | 11450 | } |
| | 11451 | } |
| | 11452 | /// C7.2.36 CMLT (zero) |
| | 11453 | pub fn cmlt(d: Register, n: Register, form: union(enum) { zero }) Instruction { |
| | 11454 | switch (form) { |
| | 11455 | .zero => switch (d.format) { |
| | 11456 | else => unreachable, |
| | 11457 | .scalar => |elem_size| { |
| | 11458 | assert(elem_size == .double and elem_size == n.format.scalar); |
| | 11459 | return .{ .data_processing_vector = .{ .simd_scalar_two_register_miscellaneous = .{ |
| | 11460 | .cmlt = .{ |
| | 11461 | .Rd = d.alias.encode(.{ .V = true }), |
| | 11462 | .Rn = n.alias.encode(.{ .V = true }), |
| | 11463 | .size = .fromVectorSize(elem_size), |
| | 11464 | }, |
| | 11465 | } } }; |
| | 11466 | }, |
| | 11467 | .vector => |arrangement| { |
| | 11468 | assert(arrangement != .@"1d" and n.format.vector == arrangement); |
| | 11469 | return .{ .data_processing_vector = .{ .simd_two_register_miscellaneous = .{ |
| | 11470 | .cmlt = .{ |
| | 11471 | .Rd = d.alias.encode(.{ .V = true }), |
| | 11472 | .Rn = n.alias.encode(.{ .V = true }), |
| | 11473 | .size = arrangement.elemSize(), |
| | 11474 | .Q = arrangement.size(), |
| | 11475 | }, |
| | 11476 | } } }; |
| | 11477 | }, |
| | 11478 | }, |
| | 11479 | } |
| | 11480 | } |
| 9002 | /// C7.2.38 CNT | 11481 | /// C7.2.38 CNT |
| 9003 | pub fn cnt(d: Register, n: Register) Instruction { | 11482 | pub fn cnt(d: Register, n: Register) Instruction { |
| 9004 | const arrangement = d.format.vector; | 11483 | const arrangement = d.format.vector; |
| ... | @@ -9094,6 +11573,57 @@ pub const Instruction = packed union { | ... | @@ -9094,6 +11573,57 @@ pub const Instruction = packed union { |
| 9094 | }, | 11573 | }, |
| 9095 | } } }; | 11574 | } } }; |
| 9096 | } | 11575 | } |
| | 11576 | /// C7.2.39 DUP (element) |
| | 11577 | /// C7.2.40 DUP (general) |
| | 11578 | pub fn dup(d: Register, n: Register) Instruction { |
| | 11579 | switch (d.format) { |
| | 11580 | else => unreachable, |
| | 11581 | .scalar => |elem_size| { |
| | 11582 | assert(@intFromEnum(elem_size) <= @intFromEnum(Register.VectorSize.double) and elem_size == n.format.element.size); |
| | 11583 | return .{ .data_processing_vector = .{ .simd_scalar_copy = .{ |
| | 11584 | .dup = .{ |
| | 11585 | .Rd = d.alias.encode(.{ .V = true }), |
| | 11586 | .Rn = n.alias.encode(.{ .V = true }), |
| | 11587 | .imm5 = @shlExact(@as(u5, n.format.element.index) << 1 | @as(u5, 0b1), @intFromEnum(elem_size)), |
| | 11588 | }, |
| | 11589 | } } }; |
| | 11590 | }, |
| | 11591 | .vector => |arrangement| { |
| | 11592 | assert(arrangement != .@"1d"); |
| | 11593 | const elem_size = arrangement.elemSize(); |
| | 11594 | switch (n.format) { |
| | 11595 | else => unreachable, |
| | 11596 | .element => |element| { |
| | 11597 | assert(elem_size.toVectorSize() == element.size); |
| | 11598 | return .{ .data_processing_vector = .{ .simd_copy = .{ |
| | 11599 | .dup = .{ |
| | 11600 | .Rd = d.alias.encode(.{ .V = true }), |
| | 11601 | .Rn = n.alias.encode(.{ .V = true }), |
| | 11602 | .imm4 = .element, |
| | 11603 | .imm5 = @shlExact(@as(u5, element.index) << 1 | @as(u5, 0b1), @intFromEnum(elem_size)), |
| | 11604 | .Q = arrangement.size(), |
| | 11605 | }, |
| | 11606 | } } }; |
| | 11607 | }, |
| | 11608 | .integer => |sf| { |
| | 11609 | assert(sf == @as(Register.IntegerSize, switch (elem_size) { |
| | 11610 | .byte, .half, .single => .word, |
| | 11611 | .double => .doubleword, |
| | 11612 | })); |
| | 11613 | return .{ .data_processing_vector = .{ .simd_copy = .{ |
| | 11614 | .dup = .{ |
| | 11615 | .Rd = d.alias.encode(.{ .V = true }), |
| | 11616 | .Rn = n.alias.encode(.{}), |
| | 11617 | .imm4 = .general, |
| | 11618 | .imm5 = @shlExact(@as(u5, 0b1), @intFromEnum(elem_size)), |
| | 11619 | .Q = arrangement.size(), |
| | 11620 | }, |
| | 11621 | } } }; |
| | 11622 | }, |
| | 11623 | } |
| | 11624 | }, |
| | 11625 | } |
| | 11626 | } |
| 9097 | /// C6.2.118 EON (shifted register) | 11627 | /// C6.2.118 EON (shifted register) |
| 9098 | pub fn eon(d: Register, n: Register, form: union(enum) { | 11628 | pub fn eon(d: Register, n: Register, form: union(enum) { |
| 9099 | register: Register, | 11629 | register: Register, |
| ... | @@ -9180,72 +11710,343 @@ pub const Instruction = packed union { | ... | @@ -9180,72 +11710,343 @@ pub const Instruction = packed union { |
| 9180 | } }, | 11710 | } }, |
| 9181 | } | 11711 | } |
| 9182 | }, | 11712 | }, |
| 9183 | .vector => |arrangement| { | 11713 | .vector => |arrangement| { |
| 9184 | const m = form.register; | 11714 | const m = form.register; |
| 9185 | assert(arrangement.elemSize() == .byte and n.format.vector == arrangement and m.format.vector == arrangement); | 11715 | assert(arrangement.elemSize() == .byte and n.format.vector == arrangement and m.format.vector == arrangement); |
| 9186 | return .{ .data_processing_vector = .{ .simd_three_same = .{ | 11716 | return .{ .data_processing_vector = .{ .simd_three_same = .{ |
| 9187 | .eor = .{ | 11717 | .eor = .{ |
| 9188 | .Rd = d.alias.encode(.{ .V = true }), | 11718 | .Rd = d.alias.encode(.{ .V = true }), |
| 9189 | .Rn = n.alias.encode(.{ .V = true }), | 11719 | .Rn = n.alias.encode(.{ .V = true }), |
| 9190 | .Rm = m.alias.encode(.{ .V = true }), | 11720 | .Rm = m.alias.encode(.{ .V = true }), |
| 9191 | .Q = arrangement.size(), | 11721 | .Q = arrangement.size(), |
| | 11722 | }, |
| | 11723 | } } }; |
| | 11724 | }, |
| | 11725 | } |
| | 11726 | } |
| | 11727 | /// C6.2.124 EXTR |
| | 11728 | pub fn extr(d: Register, n: Register, m: Register, lsb: u6) Instruction { |
| | 11729 | const sf = d.format.integer; |
| | 11730 | assert(n.format.integer == sf and m.format.integer == sf); |
| | 11731 | return .{ .data_processing_immediate = .{ .extract = .{ |
| | 11732 | .extr = .{ |
| | 11733 | .Rd = d.alias.encode(.{}), |
| | 11734 | .Rn = n.alias.encode(.{}), |
| | 11735 | .imms = switch (sf) { |
| | 11736 | .word => @as(u5, @intCast(lsb)), |
| | 11737 | .doubleword => @as(u6, @intCast(lsb)), |
| | 11738 | }, |
| | 11739 | .Rm = m.alias.encode(.{}), |
| | 11740 | .N = sf, |
| | 11741 | .sf = sf, |
| | 11742 | }, |
| | 11743 | } } }; |
| | 11744 | } |
| | 11745 | /// C7.2.45 FABS (vector) |
| | 11746 | /// C7.2.46 FABS (scalar) |
| | 11747 | pub fn fabs(d: Register, n: Register) Instruction { |
| | 11748 | switch (d.format) { |
| | 11749 | else => unreachable, |
| | 11750 | .vector => |arrangement| { |
| | 11751 | assert(n.format.vector == arrangement); |
| | 11752 | switch (arrangement.elemSize()) { |
| | 11753 | else => unreachable, |
| | 11754 | .half => return .{ .data_processing_vector = .{ .simd_two_register_miscellaneous_fp16 = .{ |
| | 11755 | .fabs = .{ |
| | 11756 | .Rd = d.alias.encode(.{ .V = true }), |
| | 11757 | .Rn = n.alias.encode(.{ .V = true }), |
| | 11758 | .Q = arrangement.size(), |
| | 11759 | }, |
| | 11760 | } } }, |
| | 11761 | .single, .double => return .{ .data_processing_vector = .{ .simd_two_register_miscellaneous = .{ |
| | 11762 | .fabs = .{ |
| | 11763 | .Rd = d.alias.encode(.{ .V = true }), |
| | 11764 | .Rn = n.alias.encode(.{ .V = true }), |
| | 11765 | .sz = arrangement.elemSz(), |
| | 11766 | .Q = arrangement.size(), |
| | 11767 | }, |
| | 11768 | } } }, |
| | 11769 | } |
| | 11770 | }, |
| | 11771 | .scalar => |ftype| { |
| | 11772 | assert(n.format.scalar == ftype); |
| | 11773 | return .{ .data_processing_vector = .{ .float_data_processing_one_source = .{ |
| | 11774 | .fabs = .{ |
| | 11775 | .Rd = d.alias.encode(.{ .V = true }), |
| | 11776 | .Rn = n.alias.encode(.{ .V = true }), |
| | 11777 | .ftype = .fromVectorSize(ftype), |
| | 11778 | }, |
| | 11779 | } } }; |
| | 11780 | }, |
| | 11781 | } |
| | 11782 | } |
| | 11783 | /// C7.2.50 FADD (scalar) |
| | 11784 | pub fn fadd(d: Register, n: Register, m: Register) Instruction { |
| | 11785 | const ftype = d.format.scalar; |
| | 11786 | assert(n.format.scalar == ftype and m.format.scalar == ftype); |
| | 11787 | return .{ .data_processing_vector = .{ .float_data_processing_two_source = .{ |
| | 11788 | .fadd = .{ |
| | 11789 | .Rd = d.alias.encode(.{ .V = true }), |
| | 11790 | .Rn = n.alias.encode(.{ .V = true }), |
| | 11791 | .Rm = m.alias.encode(.{ .V = true }), |
| | 11792 | .ftype = .fromVectorSize(ftype), |
| | 11793 | }, |
| | 11794 | } } }; |
| | 11795 | } |
| | 11796 | /// C7.2.57 FCMEQ (zero) |
| | 11797 | pub fn fcmeq(d: Register, n: Register, form: union(enum) { zero }) Instruction { |
| | 11798 | switch (form) { |
| | 11799 | .zero => switch (d.format) { |
| | 11800 | else => unreachable, |
| | 11801 | .scalar => |ftype| switch (n.format) { |
| | 11802 | else => unreachable, |
| | 11803 | .scalar => |n_scalar| { |
| | 11804 | assert(n_scalar == ftype); |
| | 11805 | switch (ftype) { |
| | 11806 | else => unreachable, |
| | 11807 | .half => return .{ .data_processing_vector = .{ .simd_scalar_two_register_miscellaneous_fp16 = .{ |
| | 11808 | .fcmeq = .{ |
| | 11809 | .Rd = d.alias.encode(.{ .V = true }), |
| | 11810 | .Rn = n.alias.encode(.{ .V = true }), |
| | 11811 | }, |
| | 11812 | } } }, |
| | 11813 | .single, .double => return .{ .data_processing_vector = .{ .simd_scalar_two_register_miscellaneous = .{ |
| | 11814 | .fcmeq = .{ |
| | 11815 | .Rd = d.alias.encode(.{ .V = true }), |
| | 11816 | .Rn = n.alias.encode(.{ .V = true }), |
| | 11817 | .sz = .fromVectorSize(ftype), |
| | 11818 | }, |
| | 11819 | } } }, |
| | 11820 | } |
| | 11821 | }, |
| | 11822 | }, |
| | 11823 | .vector => |arrangement| { |
| | 11824 | assert(arrangement != .@"1d" and n.format.vector == arrangement); |
| | 11825 | switch (arrangement.elemSize()) { |
| | 11826 | else => unreachable, |
| | 11827 | .half => return .{ .data_processing_vector = .{ .simd_two_register_miscellaneous_fp16 = .{ |
| | 11828 | .fcmeq = .{ |
| | 11829 | .Rd = d.alias.encode(.{ .V = true }), |
| | 11830 | .Rn = n.alias.encode(.{ .V = true }), |
| | 11831 | .Q = arrangement.size(), |
| | 11832 | }, |
| | 11833 | } } }, |
| | 11834 | .single, .double => return .{ .data_processing_vector = .{ .simd_two_register_miscellaneous = .{ |
| | 11835 | .fcmeq = .{ |
| | 11836 | .Rd = d.alias.encode(.{ .V = true }), |
| | 11837 | .Rn = n.alias.encode(.{ .V = true }), |
| | 11838 | .sz = arrangement.elemSz(), |
| | 11839 | .Q = arrangement.size(), |
| | 11840 | }, |
| | 11841 | } } }, |
| | 11842 | } |
| | 11843 | }, |
| | 11844 | }, |
| | 11845 | } |
| | 11846 | } |
| | 11847 | /// C7.2.59 FCMGE (zero) |
| | 11848 | pub fn fcmge(d: Register, n: Register, form: union(enum) { zero }) Instruction { |
| | 11849 | switch (form) { |
| | 11850 | .zero => switch (d.format) { |
| | 11851 | else => unreachable, |
| | 11852 | .scalar => |ftype| switch (n.format) { |
| | 11853 | else => unreachable, |
| | 11854 | .scalar => |n_scalar| { |
| | 11855 | assert(n_scalar == ftype); |
| | 11856 | switch (ftype) { |
| | 11857 | else => unreachable, |
| | 11858 | .half => return .{ .data_processing_vector = .{ .simd_scalar_two_register_miscellaneous_fp16 = .{ |
| | 11859 | .fcmge = .{ |
| | 11860 | .Rd = d.alias.encode(.{ .V = true }), |
| | 11861 | .Rn = n.alias.encode(.{ .V = true }), |
| | 11862 | }, |
| | 11863 | } } }, |
| | 11864 | .single, .double => return .{ .data_processing_vector = .{ .simd_scalar_two_register_miscellaneous = .{ |
| | 11865 | .fcmge = .{ |
| | 11866 | .Rd = d.alias.encode(.{ .V = true }), |
| | 11867 | .Rn = n.alias.encode(.{ .V = true }), |
| | 11868 | .sz = .fromVectorSize(ftype), |
| | 11869 | }, |
| | 11870 | } } }, |
| | 11871 | } |
| 9192 | }, | 11872 | }, |
| 9193 | } } }; | 11873 | }, |
| | 11874 | .vector => |arrangement| { |
| | 11875 | assert(arrangement != .@"1d" and n.format.vector == arrangement); |
| | 11876 | switch (arrangement.elemSize()) { |
| | 11877 | else => unreachable, |
| | 11878 | .half => return .{ .data_processing_vector = .{ .simd_two_register_miscellaneous_fp16 = .{ |
| | 11879 | .fcmge = .{ |
| | 11880 | .Rd = d.alias.encode(.{ .V = true }), |
| | 11881 | .Rn = n.alias.encode(.{ .V = true }), |
| | 11882 | .Q = arrangement.size(), |
| | 11883 | }, |
| | 11884 | } } }, |
| | 11885 | .single, .double => return .{ .data_processing_vector = .{ .simd_two_register_miscellaneous = .{ |
| | 11886 | .fcmge = .{ |
| | 11887 | .Rd = d.alias.encode(.{ .V = true }), |
| | 11888 | .Rn = n.alias.encode(.{ .V = true }), |
| | 11889 | .sz = arrangement.elemSz(), |
| | 11890 | .Q = arrangement.size(), |
| | 11891 | }, |
| | 11892 | } } }, |
| | 11893 | } |
| | 11894 | }, |
| 9194 | }, | 11895 | }, |
| 9195 | } | 11896 | } |
| 9196 | } | 11897 | } |
| 9197 | /// C6.2.124 EXTR | 11898 | /// C7.2.61 FCMGT (zero) |
| 9198 | pub fn extr(d: Register, n: Register, m: Register, lsb: u6) Instruction { | 11899 | pub fn fcmgt(d: Register, n: Register, form: union(enum) { zero }) Instruction { |
| 9199 | const sf = d.format.integer; | 11900 | switch (form) { |
| 9200 | assert(n.format.integer == sf and m.format.integer == sf); | 11901 | .zero => switch (d.format) { |
| 9201 | return .{ .data_processing_immediate = .{ .extract = .{ | 11902 | else => unreachable, |
| 9202 | .extr = .{ | 11903 | .scalar => |ftype| switch (n.format) { |
| 9203 | .Rd = d.alias.encode(.{}), | 11904 | else => unreachable, |
| 9204 | .Rn = n.alias.encode(.{}), | 11905 | .scalar => |n_scalar| { |
| 9205 | .imms = switch (sf) { | 11906 | assert(n_scalar == ftype); |
| 9206 | .word => @as(u5, @intCast(lsb)), | 11907 | switch (ftype) { |
| 9207 | .doubleword => @as(u6, @intCast(lsb)), | 11908 | else => unreachable, |
| | 11909 | .half => return .{ .data_processing_vector = .{ .simd_scalar_two_register_miscellaneous_fp16 = .{ |
| | 11910 | .fcmgt = .{ |
| | 11911 | .Rd = d.alias.encode(.{ .V = true }), |
| | 11912 | .Rn = n.alias.encode(.{ .V = true }), |
| | 11913 | }, |
| | 11914 | } } }, |
| | 11915 | .single, .double => return .{ .data_processing_vector = .{ .simd_scalar_two_register_miscellaneous = .{ |
| | 11916 | .fcmgt = .{ |
| | 11917 | .Rd = d.alias.encode(.{ .V = true }), |
| | 11918 | .Rn = n.alias.encode(.{ .V = true }), |
| | 11919 | .sz = .fromVectorSize(ftype), |
| | 11920 | }, |
| | 11921 | } } }, |
| | 11922 | } |
| | 11923 | }, |
| | 11924 | }, |
| | 11925 | .vector => |arrangement| { |
| | 11926 | assert(arrangement != .@"1d" and n.format.vector == arrangement); |
| | 11927 | switch (arrangement.elemSize()) { |
| | 11928 | else => unreachable, |
| | 11929 | .half => return .{ .data_processing_vector = .{ .simd_two_register_miscellaneous_fp16 = .{ |
| | 11930 | .fcmgt = .{ |
| | 11931 | .Rd = d.alias.encode(.{ .V = true }), |
| | 11932 | .Rn = n.alias.encode(.{ .V = true }), |
| | 11933 | .Q = arrangement.size(), |
| | 11934 | }, |
| | 11935 | } } }, |
| | 11936 | .single, .double => return .{ .data_processing_vector = .{ .simd_two_register_miscellaneous = .{ |
| | 11937 | .fcmgt = .{ |
| | 11938 | .Rd = d.alias.encode(.{ .V = true }), |
| | 11939 | .Rn = n.alias.encode(.{ .V = true }), |
| | 11940 | .sz = arrangement.elemSz(), |
| | 11941 | .Q = arrangement.size(), |
| | 11942 | }, |
| | 11943 | } } }, |
| | 11944 | } |
| 9208 | }, | 11945 | }, |
| 9209 | .Rm = m.alias.encode(.{}), | | |
| 9210 | .N = sf, | | |
| 9211 | .sf = sf, | | |
| 9212 | }, | 11946 | }, |
| 9213 | } } }; | 11947 | } |
| 9214 | } | 11948 | } |
| 9215 | /// C7.2.46 FABS (scalar) | 11949 | /// C7.2.64 FCMLE (zero) |
| 9216 | pub fn fabs(d: Register, n: Register) Instruction { | 11950 | pub fn fcmle(d: Register, n: Register, form: union(enum) { zero }) Instruction { |
| 9217 | const ftype = d.format.scalar; | 11951 | switch (form) { |
| 9218 | assert(n.format.scalar == ftype); | 11952 | .zero => switch (d.format) { |
| 9219 | return .{ .data_processing_vector = .{ .float_data_processing_one_source = .{ | 11953 | else => unreachable, |
| 9220 | .fabs = .{ | 11954 | .scalar => |ftype| switch (n.format) { |
| 9221 | .Rd = d.alias.encode(.{ .V = true }), | | |
| 9222 | .Rn = n.alias.encode(.{ .V = true }), | | |
| 9223 | .ftype = switch (ftype) { | | |
| 9224 | else => unreachable, | 11955 | else => unreachable, |
| 9225 | .single => .single, | 11956 | .scalar => |n_scalar| { |
| 9226 | .double => .double, | 11957 | assert(n_scalar == ftype); |
| 9227 | .half => .half, | 11958 | switch (ftype) { |
| | 11959 | else => unreachable, |
| | 11960 | .half => return .{ .data_processing_vector = .{ .simd_scalar_two_register_miscellaneous_fp16 = .{ |
| | 11961 | .fcmle = .{ |
| | 11962 | .Rd = d.alias.encode(.{ .V = true }), |
| | 11963 | .Rn = n.alias.encode(.{ .V = true }), |
| | 11964 | }, |
| | 11965 | } } }, |
| | 11966 | .single, .double => return .{ .data_processing_vector = .{ .simd_scalar_two_register_miscellaneous = .{ |
| | 11967 | .fcmle = .{ |
| | 11968 | .Rd = d.alias.encode(.{ .V = true }), |
| | 11969 | .Rn = n.alias.encode(.{ .V = true }), |
| | 11970 | .sz = .fromVectorSize(ftype), |
| | 11971 | }, |
| | 11972 | } } }, |
| | 11973 | } |
| | 11974 | }, |
| | 11975 | }, |
| | 11976 | .vector => |arrangement| { |
| | 11977 | assert(arrangement != .@"1d" and n.format.vector == arrangement); |
| | 11978 | switch (arrangement.elemSize()) { |
| | 11979 | else => unreachable, |
| | 11980 | .half => return .{ .data_processing_vector = .{ .simd_two_register_miscellaneous_fp16 = .{ |
| | 11981 | .fcmle = .{ |
| | 11982 | .Rd = d.alias.encode(.{ .V = true }), |
| | 11983 | .Rn = n.alias.encode(.{ .V = true }), |
| | 11984 | .Q = arrangement.size(), |
| | 11985 | }, |
| | 11986 | } } }, |
| | 11987 | .single, .double => return .{ .data_processing_vector = .{ .simd_two_register_miscellaneous = .{ |
| | 11988 | .fcmle = .{ |
| | 11989 | .Rd = d.alias.encode(.{ .V = true }), |
| | 11990 | .Rn = n.alias.encode(.{ .V = true }), |
| | 11991 | .sz = arrangement.elemSz(), |
| | 11992 | .Q = arrangement.size(), |
| | 11993 | }, |
| | 11994 | } } }, |
| | 11995 | } |
| 9228 | }, | 11996 | }, |
| 9229 | }, | 11997 | }, |
| 9230 | } } }; | 11998 | } |
| 9231 | } | 11999 | } |
| 9232 | /// C7.2.50 FADD (scalar) | 12000 | /// C7.2.65 FCMLT (zero) |
| 9233 | pub fn fadd(d: Register, n: Register, m: Register) Instruction { | 12001 | pub fn fcmlt(d: Register, n: Register, form: union(enum) { zero }) Instruction { |
| 9234 | const ftype = d.format.scalar; | 12002 | switch (form) { |
| 9235 | assert(n.format.scalar == ftype and m.format.scalar == ftype); | 12003 | .zero => switch (d.format) { |
| 9236 | return .{ .data_processing_vector = .{ .float_data_processing_two_source = .{ | 12004 | else => unreachable, |
| 9237 | .fadd = .{ | 12005 | .scalar => |ftype| switch (n.format) { |
| 9238 | .Rd = d.alias.encode(.{ .V = true }), | | |
| 9239 | .Rn = n.alias.encode(.{ .V = true }), | | |
| 9240 | .Rm = m.alias.encode(.{ .V = true }), | | |
| 9241 | .ftype = switch (ftype) { | | |
| 9242 | else => unreachable, | 12006 | else => unreachable, |
| 9243 | .single => .single, | 12007 | .scalar => |n_scalar| { |
| 9244 | .double => .double, | 12008 | assert(n_scalar == ftype); |
| 9245 | .half => .half, | 12009 | switch (ftype) { |
| | 12010 | else => unreachable, |
| | 12011 | .half => return .{ .data_processing_vector = .{ .simd_scalar_two_register_miscellaneous_fp16 = .{ |
| | 12012 | .fcmlt = .{ |
| | 12013 | .Rd = d.alias.encode(.{ .V = true }), |
| | 12014 | .Rn = n.alias.encode(.{ .V = true }), |
| | 12015 | }, |
| | 12016 | } } }, |
| | 12017 | .single, .double => return .{ .data_processing_vector = .{ .simd_scalar_two_register_miscellaneous = .{ |
| | 12018 | .fcmlt = .{ |
| | 12019 | .Rd = d.alias.encode(.{ .V = true }), |
| | 12020 | .Rn = n.alias.encode(.{ .V = true }), |
| | 12021 | .sz = .fromVectorSize(ftype), |
| | 12022 | }, |
| | 12023 | } } }, |
| | 12024 | } |
| | 12025 | }, |
| | 12026 | }, |
| | 12027 | .vector => |arrangement| { |
| | 12028 | assert(arrangement != .@"1d" and n.format.vector == arrangement); |
| | 12029 | switch (arrangement.elemSize()) { |
| | 12030 | else => unreachable, |
| | 12031 | .half => return .{ .data_processing_vector = .{ .simd_two_register_miscellaneous_fp16 = .{ |
| | 12032 | .fcmlt = .{ |
| | 12033 | .Rd = d.alias.encode(.{ .V = true }), |
| | 12034 | .Rn = n.alias.encode(.{ .V = true }), |
| | 12035 | .Q = arrangement.size(), |
| | 12036 | }, |
| | 12037 | } } }, |
| | 12038 | .single, .double => return .{ .data_processing_vector = .{ .simd_two_register_miscellaneous = .{ |
| | 12039 | .fcmlt = .{ |
| | 12040 | .Rd = d.alias.encode(.{ .V = true }), |
| | 12041 | .Rn = n.alias.encode(.{ .V = true }), |
| | 12042 | .sz = arrangement.elemSz(), |
| | 12043 | .Q = arrangement.size(), |
| | 12044 | }, |
| | 12045 | } } }, |
| | 12046 | } |
| 9246 | }, | 12047 | }, |
| 9247 | }, | 12048 | }, |
| 9248 | } } }; | 12049 | } |
| 9249 | } | 12050 | } |
| 9250 | /// C7.2.66 FCMP | 12051 | /// C7.2.66 FCMP |
| 9251 | pub fn fcmp(n: Register, form: union(enum) { register: Register, zero }) Instruction { | 12052 | pub fn fcmp(n: Register, form: union(enum) { register: Register, zero }) Instruction { |
| ... | @@ -9258,12 +12059,7 @@ pub const Instruction = packed union { | ... | @@ -9258,12 +12059,7 @@ pub const Instruction = packed union { |
| 9258 | .opc0 = .register, | 12059 | .opc0 = .register, |
| 9259 | .Rn = n.alias.encode(.{ .V = true }), | 12060 | .Rn = n.alias.encode(.{ .V = true }), |
| 9260 | .Rm = m.alias.encode(.{ .V = true }), | 12061 | .Rm = m.alias.encode(.{ .V = true }), |
| 9261 | .ftype = switch (ftype) { | 12062 | .ftype = .fromVectorSize(ftype), |
| 9262 | else => unreachable, | | |
| 9263 | .single => .single, | | |
| 9264 | .double => .double, | | |
| 9265 | .half => .half, | | |
| 9266 | }, | | |
| 9267 | }, | 12063 | }, |
| 9268 | } } }; | 12064 | } } }; |
| 9269 | }, | 12065 | }, |
| ... | @@ -9272,12 +12068,7 @@ pub const Instruction = packed union { | ... | @@ -9272,12 +12068,7 @@ pub const Instruction = packed union { |
| 9272 | .opc0 = .register, | 12068 | .opc0 = .register, |
| 9273 | .Rn = n.alias.encode(.{ .V = true }), | 12069 | .Rn = n.alias.encode(.{ .V = true }), |
| 9274 | .Rm = @enumFromInt(0b00000), | 12070 | .Rm = @enumFromInt(0b00000), |
| 9275 | .ftype = switch (ftype) { | 12071 | .ftype = .fromVectorSize(ftype), |
| 9276 | else => unreachable, | | |
| 9277 | .single => .single, | | |
| 9278 | .double => .double, | | |
| 9279 | .half => .half, | | |
| 9280 | }, | | |
| 9281 | }, | 12072 | }, |
| 9282 | } } }, | 12073 | } } }, |
| 9283 | } | 12074 | } |
| ... | @@ -9293,12 +12084,7 @@ pub const Instruction = packed union { | ... | @@ -9293,12 +12084,7 @@ pub const Instruction = packed union { |
| 9293 | .opc0 = .zero, | 12084 | .opc0 = .zero, |
| 9294 | .Rn = n.alias.encode(.{ .V = true }), | 12085 | .Rn = n.alias.encode(.{ .V = true }), |
| 9295 | .Rm = m.alias.encode(.{ .V = true }), | 12086 | .Rm = m.alias.encode(.{ .V = true }), |
| 9296 | .ftype = switch (ftype) { | 12087 | .ftype = .fromVectorSize(ftype), |
| 9297 | else => unreachable, | | |
| 9298 | .single => .single, | | |
| 9299 | .double => .double, | | |
| 9300 | .half => .half, | | |
| 9301 | }, | | |
| 9302 | }, | 12088 | }, |
| 9303 | } } }; | 12089 | } } }; |
| 9304 | }, | 12090 | }, |
| ... | @@ -9307,16 +12093,25 @@ pub const Instruction = packed union { | ... | @@ -9307,16 +12093,25 @@ pub const Instruction = packed union { |
| 9307 | .opc0 = .zero, | 12093 | .opc0 = .zero, |
| 9308 | .Rn = n.alias.encode(.{ .V = true }), | 12094 | .Rn = n.alias.encode(.{ .V = true }), |
| 9309 | .Rm = @enumFromInt(0b00000), | 12095 | .Rm = @enumFromInt(0b00000), |
| 9310 | .ftype = switch (ftype) { | 12096 | .ftype = .fromVectorSize(ftype), |
| 9311 | else => unreachable, | | |
| 9312 | .single => .single, | | |
| 9313 | .double => .double, | | |
| 9314 | .half => .half, | | |
| 9315 | }, | | |
| 9316 | }, | 12097 | }, |
| 9317 | } } }, | 12098 | } } }, |
| 9318 | } | 12099 | } |
| 9319 | } | 12100 | } |
| | 12101 | /// C7.2.68 FCSEL |
| | 12102 | pub fn fcsel(d: Register, n: Register, m: Register, cond: ConditionCode) Instruction { |
| | 12103 | const ftype = d.format.scalar; |
| | 12104 | assert(n.format.scalar == ftype and m.format.scalar == ftype); |
| | 12105 | return .{ .data_processing_vector = .{ .float_conditional_select = .{ |
| | 12106 | .fcsel = .{ |
| | 12107 | .Rd = d.alias.encode(.{ .V = true }), |
| | 12108 | .Rn = n.alias.encode(.{ .V = true }), |
| | 12109 | .cond = cond, |
| | 12110 | .Rm = m.alias.encode(.{ .V = true }), |
| | 12111 | .ftype = .fromVectorSize(ftype), |
| | 12112 | }, |
| | 12113 | } } }; |
| | 12114 | } |
| 9320 | /// C7.2.69 FCVT | 12115 | /// C7.2.69 FCVT |
| 9321 | pub fn fcvt(d: Register, n: Register) Instruction { | 12116 | pub fn fcvt(d: Register, n: Register) Instruction { |
| 9322 | assert(d.format.scalar != n.format.scalar); | 12117 | assert(d.format.scalar != n.format.scalar); |
| ... | @@ -9330,174 +12125,589 @@ pub const Instruction = packed union { | ... | @@ -9330,174 +12125,589 @@ pub const Instruction = packed union { |
| 9330 | .double => .double, | 12125 | .double => .double, |
| 9331 | .half => .half, | 12126 | .half => .half, |
| 9332 | }, | 12127 | }, |
| 9333 | .ftype = switch (n.format.scalar) { | 12128 | .ftype = .fromVectorSize(n.format.scalar), |
| 9334 | else => unreachable, | | |
| 9335 | .single => .single, | | |
| 9336 | .double => .double, | | |
| 9337 | .half => .half, | | |
| 9338 | }, | | |
| 9339 | }, | 12129 | }, |
| 9340 | } } }; | 12130 | } } }; |
| 9341 | } | 12131 | } |
| | 12132 | /// C7.2.70 FCVTAS (vector) |
| 9342 | /// C7.2.71 FCVTAS (scalar) | 12133 | /// C7.2.71 FCVTAS (scalar) |
| 9343 | pub fn fcvtas(d: Register, n: Register) Instruction { | 12134 | pub fn fcvtas(d: Register, n: Register) Instruction { |
| 9344 | return .{ .data_processing_vector = .{ .convert_float_integer = .{ | 12135 | switch (d.format) { |
| 9345 | .fcvtas = .{ | 12136 | else => unreachable, |
| 9346 | .Rd = d.alias.encode(.{}), | 12137 | .integer => |sf| return .{ .data_processing_vector = .{ .convert_float_integer = .{ |
| 9347 | .Rn = n.alias.encode(.{ .V = true }), | 12138 | .fcvtas = .{ |
| 9348 | .ftype = switch (n.format.scalar) { | 12139 | .Rd = d.alias.encode(.{}), |
| 9349 | else => unreachable, | 12140 | .Rn = n.alias.encode(.{ .V = true }), |
| 9350 | .single => .single, | 12141 | .ftype = .fromVectorSize(n.format.scalar), |
| 9351 | .double => .double, | 12142 | .sf = sf, |
| 9352 | .half => .half, | 12143 | }, |
| | 12144 | } } }, |
| | 12145 | .scalar => |elem_size| switch (n.format) { |
| | 12146 | else => unreachable, |
| | 12147 | .scalar => |ftype| { |
| | 12148 | assert(ftype == elem_size); |
| | 12149 | switch (elem_size) { |
| | 12150 | else => unreachable, |
| | 12151 | .half => return .{ .data_processing_vector = .{ .simd_scalar_two_register_miscellaneous_fp16 = .{ |
| | 12152 | .fcvtas = .{ |
| | 12153 | .Rd = d.alias.encode(.{ .V = true }), |
| | 12154 | .Rn = n.alias.encode(.{ .V = true }), |
| | 12155 | }, |
| | 12156 | } } }, |
| | 12157 | .single, .double => return .{ .data_processing_vector = .{ .simd_scalar_two_register_miscellaneous = .{ |
| | 12158 | .fcvtas = .{ |
| | 12159 | .Rd = d.alias.encode(.{ .V = true }), |
| | 12160 | .Rn = n.alias.encode(.{ .V = true }), |
| | 12161 | .sz = .fromVectorSize(elem_size), |
| | 12162 | }, |
| | 12163 | } } }, |
| | 12164 | } |
| 9353 | }, | 12165 | }, |
| 9354 | .sf = d.format.integer, | | |
| 9355 | }, | 12166 | }, |
| 9356 | } } }; | 12167 | .vector => |arrangement| { |
| | 12168 | assert(arrangement != .@"1d" and n.format.vector == arrangement); |
| | 12169 | switch (arrangement.elemSize()) { |
| | 12170 | else => unreachable, |
| | 12171 | .half => return .{ .data_processing_vector = .{ .simd_two_register_miscellaneous_fp16 = .{ |
| | 12172 | .fcvtas = .{ |
| | 12173 | .Rd = d.alias.encode(.{ .V = true }), |
| | 12174 | .Rn = n.alias.encode(.{ .V = true }), |
| | 12175 | .Q = arrangement.size(), |
| | 12176 | }, |
| | 12177 | } } }, |
| | 12178 | .single, .double => return .{ .data_processing_vector = .{ .simd_two_register_miscellaneous = .{ |
| | 12179 | .fcvtas = .{ |
| | 12180 | .Rd = d.alias.encode(.{ .V = true }), |
| | 12181 | .Rn = n.alias.encode(.{ .V = true }), |
| | 12182 | .sz = arrangement.elemSz(), |
| | 12183 | .Q = arrangement.size(), |
| | 12184 | }, |
| | 12185 | } } }, |
| | 12186 | } |
| | 12187 | }, |
| | 12188 | } |
| 9357 | } | 12189 | } |
| | 12190 | /// C7.2.72 FCVTAU (vector) |
| 9358 | /// C7.2.73 FCVTAU (scalar) | 12191 | /// C7.2.73 FCVTAU (scalar) |
| 9359 | pub fn fcvtau(d: Register, n: Register) Instruction { | 12192 | pub fn fcvtau(d: Register, n: Register) Instruction { |
| 9360 | return .{ .data_processing_vector = .{ .convert_float_integer = .{ | 12193 | switch (d.format) { |
| 9361 | .fcvtau = .{ | 12194 | else => unreachable, |
| 9362 | .Rd = d.alias.encode(.{}), | 12195 | .integer => |sf| return .{ .data_processing_vector = .{ .convert_float_integer = .{ |
| 9363 | .Rn = n.alias.encode(.{ .V = true }), | 12196 | .fcvtau = .{ |
| 9364 | .ftype = switch (n.format.scalar) { | 12197 | .Rd = d.alias.encode(.{}), |
| 9365 | else => unreachable, | 12198 | .Rn = n.alias.encode(.{ .V = true }), |
| 9366 | .single => .single, | 12199 | .ftype = .fromVectorSize(n.format.scalar), |
| 9367 | .double => .double, | 12200 | .sf = sf, |
| 9368 | .half => .half, | 12201 | }, |
| | 12202 | } } }, |
| | 12203 | .scalar => |elem_size| switch (n.format) { |
| | 12204 | else => unreachable, |
| | 12205 | .scalar => |ftype| { |
| | 12206 | assert(ftype == elem_size); |
| | 12207 | switch (elem_size) { |
| | 12208 | else => unreachable, |
| | 12209 | .half => return .{ .data_processing_vector = .{ .simd_scalar_two_register_miscellaneous_fp16 = .{ |
| | 12210 | .fcvtau = .{ |
| | 12211 | .Rd = d.alias.encode(.{ .V = true }), |
| | 12212 | .Rn = n.alias.encode(.{ .V = true }), |
| | 12213 | }, |
| | 12214 | } } }, |
| | 12215 | .single, .double => return .{ .data_processing_vector = .{ .simd_scalar_two_register_miscellaneous = .{ |
| | 12216 | .fcvtau = .{ |
| | 12217 | .Rd = d.alias.encode(.{ .V = true }), |
| | 12218 | .Rn = n.alias.encode(.{ .V = true }), |
| | 12219 | .sz = .fromVectorSize(elem_size), |
| | 12220 | }, |
| | 12221 | } } }, |
| | 12222 | } |
| 9369 | }, | 12223 | }, |
| 9370 | .sf = d.format.integer, | | |
| 9371 | }, | 12224 | }, |
| 9372 | } } }; | 12225 | .vector => |arrangement| { |
| | 12226 | assert(arrangement != .@"1d" and n.format.vector == arrangement); |
| | 12227 | switch (arrangement.elemSize()) { |
| | 12228 | else => unreachable, |
| | 12229 | .half => return .{ .data_processing_vector = .{ .simd_two_register_miscellaneous_fp16 = .{ |
| | 12230 | .fcvtau = .{ |
| | 12231 | .Rd = d.alias.encode(.{ .V = true }), |
| | 12232 | .Rn = n.alias.encode(.{ .V = true }), |
| | 12233 | .Q = arrangement.size(), |
| | 12234 | }, |
| | 12235 | } } }, |
| | 12236 | .single, .double => return .{ .data_processing_vector = .{ .simd_two_register_miscellaneous = .{ |
| | 12237 | .fcvtau = .{ |
| | 12238 | .Rd = d.alias.encode(.{ .V = true }), |
| | 12239 | .Rn = n.alias.encode(.{ .V = true }), |
| | 12240 | .sz = arrangement.elemSz(), |
| | 12241 | .Q = arrangement.size(), |
| | 12242 | }, |
| | 12243 | } } }, |
| | 12244 | } |
| | 12245 | }, |
| | 12246 | } |
| 9373 | } | 12247 | } |
| | 12248 | /// C7.2.75 FCVTMS (vector) |
| 9374 | /// C7.2.76 FCVTMS (scalar) | 12249 | /// C7.2.76 FCVTMS (scalar) |
| 9375 | pub fn fcvtms(d: Register, n: Register) Instruction { | 12250 | pub fn fcvtms(d: Register, n: Register) Instruction { |
| 9376 | return .{ .data_processing_vector = .{ .convert_float_integer = .{ | 12251 | switch (d.format) { |
| 9377 | .fcvtms = .{ | 12252 | else => unreachable, |
| 9378 | .Rd = d.alias.encode(.{}), | 12253 | .integer => |sf| return .{ .data_processing_vector = .{ .convert_float_integer = .{ |
| 9379 | .Rn = n.alias.encode(.{ .V = true }), | 12254 | .fcvtms = .{ |
| 9380 | .ftype = switch (n.format.scalar) { | 12255 | .Rd = d.alias.encode(.{}), |
| 9381 | else => unreachable, | 12256 | .Rn = n.alias.encode(.{ .V = true }), |
| 9382 | .single => .single, | 12257 | .ftype = .fromVectorSize(n.format.scalar), |
| 9383 | .double => .double, | 12258 | .sf = sf, |
| 9384 | .half => .half, | 12259 | }, |
| | 12260 | } } }, |
| | 12261 | .scalar => |elem_size| switch (n.format) { |
| | 12262 | else => unreachable, |
| | 12263 | .scalar => |ftype| { |
| | 12264 | assert(ftype == elem_size); |
| | 12265 | switch (elem_size) { |
| | 12266 | else => unreachable, |
| | 12267 | .half => return .{ .data_processing_vector = .{ .simd_scalar_two_register_miscellaneous_fp16 = .{ |
| | 12268 | .fcvtms = .{ |
| | 12269 | .Rd = d.alias.encode(.{ .V = true }), |
| | 12270 | .Rn = n.alias.encode(.{ .V = true }), |
| | 12271 | }, |
| | 12272 | } } }, |
| | 12273 | .single, .double => return .{ .data_processing_vector = .{ .simd_scalar_two_register_miscellaneous = .{ |
| | 12274 | .fcvtms = .{ |
| | 12275 | .Rd = d.alias.encode(.{ .V = true }), |
| | 12276 | .Rn = n.alias.encode(.{ .V = true }), |
| | 12277 | .sz = .fromVectorSize(elem_size), |
| | 12278 | }, |
| | 12279 | } } }, |
| | 12280 | } |
| 9385 | }, | 12281 | }, |
| 9386 | .sf = d.format.integer, | | |
| 9387 | }, | 12282 | }, |
| 9388 | } } }; | 12283 | .vector => |arrangement| { |
| | 12284 | assert(arrangement != .@"1d" and n.format.vector == arrangement); |
| | 12285 | switch (arrangement.elemSize()) { |
| | 12286 | else => unreachable, |
| | 12287 | .half => return .{ .data_processing_vector = .{ .simd_two_register_miscellaneous_fp16 = .{ |
| | 12288 | .fcvtms = .{ |
| | 12289 | .Rd = d.alias.encode(.{ .V = true }), |
| | 12290 | .Rn = n.alias.encode(.{ .V = true }), |
| | 12291 | .Q = arrangement.size(), |
| | 12292 | }, |
| | 12293 | } } }, |
| | 12294 | .single, .double => return .{ .data_processing_vector = .{ .simd_two_register_miscellaneous = .{ |
| | 12295 | .fcvtms = .{ |
| | 12296 | .Rd = d.alias.encode(.{ .V = true }), |
| | 12297 | .Rn = n.alias.encode(.{ .V = true }), |
| | 12298 | .sz = arrangement.elemSz(), |
| | 12299 | .Q = arrangement.size(), |
| | 12300 | }, |
| | 12301 | } } }, |
| | 12302 | } |
| | 12303 | }, |
| | 12304 | } |
| 9389 | } | 12305 | } |
| | 12306 | /// C7.2.77 FCVTMU (vector) |
| 9390 | /// C7.2.78 FCVTMU (scalar) | 12307 | /// C7.2.78 FCVTMU (scalar) |
| 9391 | pub fn fcvtmu(d: Register, n: Register) Instruction { | 12308 | pub fn fcvtmu(d: Register, n: Register) Instruction { |
| 9392 | return .{ .data_processing_vector = .{ .convert_float_integer = .{ | 12309 | switch (d.format) { |
| 9393 | .fcvtmu = .{ | 12310 | else => unreachable, |
| 9394 | .Rd = d.alias.encode(.{}), | 12311 | .integer => |sf| return .{ .data_processing_vector = .{ .convert_float_integer = .{ |
| 9395 | .Rn = n.alias.encode(.{ .V = true }), | 12312 | .fcvtmu = .{ |
| 9396 | .ftype = switch (n.format.scalar) { | 12313 | .Rd = d.alias.encode(.{}), |
| 9397 | else => unreachable, | 12314 | .Rn = n.alias.encode(.{ .V = true }), |
| 9398 | .single => .single, | 12315 | .ftype = .fromVectorSize(n.format.scalar), |
| 9399 | .double => .double, | 12316 | .sf = sf, |
| 9400 | .half => .half, | 12317 | }, |
| | 12318 | } } }, |
| | 12319 | .scalar => |elem_size| switch (n.format) { |
| | 12320 | else => unreachable, |
| | 12321 | .scalar => |ftype| { |
| | 12322 | assert(ftype == elem_size); |
| | 12323 | switch (elem_size) { |
| | 12324 | else => unreachable, |
| | 12325 | .half => return .{ .data_processing_vector = .{ .simd_scalar_two_register_miscellaneous_fp16 = .{ |
| | 12326 | .fcvtmu = .{ |
| | 12327 | .Rd = d.alias.encode(.{ .V = true }), |
| | 12328 | .Rn = n.alias.encode(.{ .V = true }), |
| | 12329 | }, |
| | 12330 | } } }, |
| | 12331 | .single, .double => return .{ .data_processing_vector = .{ .simd_scalar_two_register_miscellaneous = .{ |
| | 12332 | .fcvtmu = .{ |
| | 12333 | .Rd = d.alias.encode(.{ .V = true }), |
| | 12334 | .Rn = n.alias.encode(.{ .V = true }), |
| | 12335 | .sz = .fromVectorSize(elem_size), |
| | 12336 | }, |
| | 12337 | } } }, |
| | 12338 | } |
| 9401 | }, | 12339 | }, |
| 9402 | .sf = d.format.integer, | | |
| 9403 | }, | 12340 | }, |
| 9404 | } } }; | 12341 | .vector => |arrangement| { |
| | 12342 | assert(arrangement != .@"1d" and n.format.vector == arrangement); |
| | 12343 | switch (arrangement.elemSize()) { |
| | 12344 | else => unreachable, |
| | 12345 | .half => return .{ .data_processing_vector = .{ .simd_two_register_miscellaneous_fp16 = .{ |
| | 12346 | .fcvtmu = .{ |
| | 12347 | .Rd = d.alias.encode(.{ .V = true }), |
| | 12348 | .Rn = n.alias.encode(.{ .V = true }), |
| | 12349 | .Q = arrangement.size(), |
| | 12350 | }, |
| | 12351 | } } }, |
| | 12352 | .single, .double => return .{ .data_processing_vector = .{ .simd_two_register_miscellaneous = .{ |
| | 12353 | .fcvtmu = .{ |
| | 12354 | .Rd = d.alias.encode(.{ .V = true }), |
| | 12355 | .Rn = n.alias.encode(.{ .V = true }), |
| | 12356 | .sz = arrangement.elemSz(), |
| | 12357 | .Q = arrangement.size(), |
| | 12358 | }, |
| | 12359 | } } }, |
| | 12360 | } |
| | 12361 | }, |
| | 12362 | } |
| 9405 | } | 12363 | } |
| | 12364 | /// C7.2.80 FCVTNS (vector) |
| 9406 | /// C7.2.81 FCVTNS (scalar) | 12365 | /// C7.2.81 FCVTNS (scalar) |
| 9407 | pub fn fcvtns(d: Register, n: Register) Instruction { | 12366 | pub fn fcvtns(d: Register, n: Register) Instruction { |
| 9408 | return .{ .data_processing_vector = .{ .convert_float_integer = .{ | 12367 | switch (d.format) { |
| 9409 | .fcvtns = .{ | 12368 | else => unreachable, |
| 9410 | .Rd = d.alias.encode(.{}), | 12369 | .integer => |sf| return .{ .data_processing_vector = .{ .convert_float_integer = .{ |
| 9411 | .Rn = n.alias.encode(.{ .V = true }), | 12370 | .fcvtns = .{ |
| 9412 | .ftype = switch (n.format.scalar) { | 12371 | .Rd = d.alias.encode(.{}), |
| 9413 | else => unreachable, | 12372 | .Rn = n.alias.encode(.{ .V = true }), |
| 9414 | .single => .single, | 12373 | .ftype = .fromVectorSize(n.format.scalar), |
| 9415 | .double => .double, | 12374 | .sf = sf, |
| 9416 | .half => .half, | 12375 | }, |
| | 12376 | } } }, |
| | 12377 | .scalar => |elem_size| switch (n.format) { |
| | 12378 | else => unreachable, |
| | 12379 | .scalar => |ftype| { |
| | 12380 | assert(ftype == elem_size); |
| | 12381 | switch (elem_size) { |
| | 12382 | else => unreachable, |
| | 12383 | .half => return .{ .data_processing_vector = .{ .simd_scalar_two_register_miscellaneous_fp16 = .{ |
| | 12384 | .fcvtns = .{ |
| | 12385 | .Rd = d.alias.encode(.{ .V = true }), |
| | 12386 | .Rn = n.alias.encode(.{ .V = true }), |
| | 12387 | }, |
| | 12388 | } } }, |
| | 12389 | .single, .double => return .{ .data_processing_vector = .{ .simd_scalar_two_register_miscellaneous = .{ |
| | 12390 | .fcvtns = .{ |
| | 12391 | .Rd = d.alias.encode(.{ .V = true }), |
| | 12392 | .Rn = n.alias.encode(.{ .V = true }), |
| | 12393 | .sz = .fromVectorSize(elem_size), |
| | 12394 | }, |
| | 12395 | } } }, |
| | 12396 | } |
| 9417 | }, | 12397 | }, |
| 9418 | .sf = d.format.integer, | | |
| 9419 | }, | 12398 | }, |
| 9420 | } } }; | 12399 | .vector => |arrangement| { |
| | 12400 | assert(arrangement != .@"1d" and n.format.vector == arrangement); |
| | 12401 | switch (arrangement.elemSize()) { |
| | 12402 | else => unreachable, |
| | 12403 | .half => return .{ .data_processing_vector = .{ .simd_two_register_miscellaneous_fp16 = .{ |
| | 12404 | .fcvtns = .{ |
| | 12405 | .Rd = d.alias.encode(.{ .V = true }), |
| | 12406 | .Rn = n.alias.encode(.{ .V = true }), |
| | 12407 | .Q = arrangement.size(), |
| | 12408 | }, |
| | 12409 | } } }, |
| | 12410 | .single, .double => return .{ .data_processing_vector = .{ .simd_two_register_miscellaneous = .{ |
| | 12411 | .fcvtns = .{ |
| | 12412 | .Rd = d.alias.encode(.{ .V = true }), |
| | 12413 | .Rn = n.alias.encode(.{ .V = true }), |
| | 12414 | .sz = arrangement.elemSz(), |
| | 12415 | .Q = arrangement.size(), |
| | 12416 | }, |
| | 12417 | } } }, |
| | 12418 | } |
| | 12419 | }, |
| | 12420 | } |
| 9421 | } | 12421 | } |
| | 12422 | /// C7.2.82 FCVTNU (vector) |
| 9422 | /// C7.2.83 FCVTNU (scalar) | 12423 | /// C7.2.83 FCVTNU (scalar) |
| 9423 | pub fn fcvtnu(d: Register, n: Register) Instruction { | 12424 | pub fn fcvtnu(d: Register, n: Register) Instruction { |
| 9424 | return .{ .data_processing_vector = .{ .convert_float_integer = .{ | 12425 | switch (d.format) { |
| 9425 | .fcvtnu = .{ | 12426 | else => unreachable, |
| 9426 | .Rd = d.alias.encode(.{}), | 12427 | .integer => |sf| return .{ .data_processing_vector = .{ .convert_float_integer = .{ |
| 9427 | .Rn = n.alias.encode(.{ .V = true }), | 12428 | .fcvtnu = .{ |
| 9428 | .ftype = switch (n.format.scalar) { | 12429 | .Rd = d.alias.encode(.{}), |
| 9429 | else => unreachable, | 12430 | .Rn = n.alias.encode(.{ .V = true }), |
| 9430 | .single => .single, | 12431 | .ftype = .fromVectorSize(n.format.scalar), |
| 9431 | .double => .double, | 12432 | .sf = sf, |
| 9432 | .half => .half, | 12433 | }, |
| | 12434 | } } }, |
| | 12435 | .scalar => |elem_size| switch (n.format) { |
| | 12436 | else => unreachable, |
| | 12437 | .scalar => |ftype| { |
| | 12438 | assert(ftype == elem_size); |
| | 12439 | switch (elem_size) { |
| | 12440 | else => unreachable, |
| | 12441 | .half => return .{ .data_processing_vector = .{ .simd_scalar_two_register_miscellaneous_fp16 = .{ |
| | 12442 | .fcvtnu = .{ |
| | 12443 | .Rd = d.alias.encode(.{ .V = true }), |
| | 12444 | .Rn = n.alias.encode(.{ .V = true }), |
| | 12445 | }, |
| | 12446 | } } }, |
| | 12447 | .single, .double => return .{ .data_processing_vector = .{ .simd_scalar_two_register_miscellaneous = .{ |
| | 12448 | .fcvtnu = .{ |
| | 12449 | .Rd = d.alias.encode(.{ .V = true }), |
| | 12450 | .Rn = n.alias.encode(.{ .V = true }), |
| | 12451 | .sz = .fromVectorSize(elem_size), |
| | 12452 | }, |
| | 12453 | } } }, |
| | 12454 | } |
| 9433 | }, | 12455 | }, |
| 9434 | .sf = d.format.integer, | | |
| 9435 | }, | 12456 | }, |
| 9436 | } } }; | 12457 | .vector => |arrangement| { |
| | 12458 | assert(arrangement != .@"1d" and n.format.vector == arrangement); |
| | 12459 | switch (arrangement.elemSize()) { |
| | 12460 | else => unreachable, |
| | 12461 | .half => return .{ .data_processing_vector = .{ .simd_two_register_miscellaneous_fp16 = .{ |
| | 12462 | .fcvtnu = .{ |
| | 12463 | .Rd = d.alias.encode(.{ .V = true }), |
| | 12464 | .Rn = n.alias.encode(.{ .V = true }), |
| | 12465 | .Q = arrangement.size(), |
| | 12466 | }, |
| | 12467 | } } }, |
| | 12468 | .single, .double => return .{ .data_processing_vector = .{ .simd_two_register_miscellaneous = .{ |
| | 12469 | .fcvtnu = .{ |
| | 12470 | .Rd = d.alias.encode(.{ .V = true }), |
| | 12471 | .Rn = n.alias.encode(.{ .V = true }), |
| | 12472 | .sz = arrangement.elemSz(), |
| | 12473 | .Q = arrangement.size(), |
| | 12474 | }, |
| | 12475 | } } }, |
| | 12476 | } |
| | 12477 | }, |
| | 12478 | } |
| 9437 | } | 12479 | } |
| | 12480 | /// C7.2.84 FCVTPS (vector) |
| 9438 | /// C7.2.85 FCVTPS (scalar) | 12481 | /// C7.2.85 FCVTPS (scalar) |
| 9439 | pub fn fcvtps(d: Register, n: Register) Instruction { | 12482 | pub fn fcvtps(d: Register, n: Register) Instruction { |
| 9440 | return .{ .data_processing_vector = .{ .convert_float_integer = .{ | 12483 | switch (d.format) { |
| 9441 | .fcvtps = .{ | 12484 | else => unreachable, |
| 9442 | .Rd = d.alias.encode(.{}), | 12485 | .integer => |sf| return .{ .data_processing_vector = .{ .convert_float_integer = .{ |
| 9443 | .Rn = n.alias.encode(.{ .V = true }), | 12486 | .fcvtps = .{ |
| 9444 | .ftype = switch (n.format.scalar) { | 12487 | .Rd = d.alias.encode(.{}), |
| 9445 | else => unreachable, | 12488 | .Rn = n.alias.encode(.{ .V = true }), |
| 9446 | .single => .single, | 12489 | .ftype = .fromVectorSize(n.format.scalar), |
| 9447 | .double => .double, | 12490 | .sf = sf, |
| 9448 | .half => .half, | 12491 | }, |
| | 12492 | } } }, |
| | 12493 | .scalar => |elem_size| switch (n.format) { |
| | 12494 | else => unreachable, |
| | 12495 | .scalar => |ftype| { |
| | 12496 | assert(ftype == elem_size); |
| | 12497 | switch (elem_size) { |
| | 12498 | else => unreachable, |
| | 12499 | .half => return .{ .data_processing_vector = .{ .simd_scalar_two_register_miscellaneous_fp16 = .{ |
| | 12500 | .fcvtps = .{ |
| | 12501 | .Rd = d.alias.encode(.{ .V = true }), |
| | 12502 | .Rn = n.alias.encode(.{ .V = true }), |
| | 12503 | }, |
| | 12504 | } } }, |
| | 12505 | .single, .double => return .{ .data_processing_vector = .{ .simd_scalar_two_register_miscellaneous = .{ |
| | 12506 | .fcvtps = .{ |
| | 12507 | .Rd = d.alias.encode(.{ .V = true }), |
| | 12508 | .Rn = n.alias.encode(.{ .V = true }), |
| | 12509 | .sz = .fromVectorSize(elem_size), |
| | 12510 | }, |
| | 12511 | } } }, |
| | 12512 | } |
| 9449 | }, | 12513 | }, |
| 9450 | .sf = d.format.integer, | | |
| 9451 | }, | 12514 | }, |
| 9452 | } } }; | 12515 | .vector => |arrangement| { |
| | 12516 | assert(arrangement != .@"1d" and n.format.vector == arrangement); |
| | 12517 | switch (arrangement.elemSize()) { |
| | 12518 | else => unreachable, |
| | 12519 | .half => return .{ .data_processing_vector = .{ .simd_two_register_miscellaneous_fp16 = .{ |
| | 12520 | .fcvtps = .{ |
| | 12521 | .Rd = d.alias.encode(.{ .V = true }), |
| | 12522 | .Rn = n.alias.encode(.{ .V = true }), |
| | 12523 | .Q = arrangement.size(), |
| | 12524 | }, |
| | 12525 | } } }, |
| | 12526 | .single, .double => return .{ .data_processing_vector = .{ .simd_two_register_miscellaneous = .{ |
| | 12527 | .fcvtps = .{ |
| | 12528 | .Rd = d.alias.encode(.{ .V = true }), |
| | 12529 | .Rn = n.alias.encode(.{ .V = true }), |
| | 12530 | .sz = arrangement.elemSz(), |
| | 12531 | .Q = arrangement.size(), |
| | 12532 | }, |
| | 12533 | } } }, |
| | 12534 | } |
| | 12535 | }, |
| | 12536 | } |
| 9453 | } | 12537 | } |
| | 12538 | /// C7.2.86 FCVTPU (vector) |
| 9454 | /// C7.2.87 FCVTPU (scalar) | 12539 | /// C7.2.87 FCVTPU (scalar) |
| 9455 | pub fn fcvtpu(d: Register, n: Register) Instruction { | 12540 | pub fn fcvtpu(d: Register, n: Register) Instruction { |
| 9456 | return .{ .data_processing_vector = .{ .convert_float_integer = .{ | 12541 | switch (d.format) { |
| 9457 | .fcvtpu = .{ | 12542 | else => unreachable, |
| 9458 | .Rd = d.alias.encode(.{}), | 12543 | .integer => |sf| return .{ .data_processing_vector = .{ .convert_float_integer = .{ |
| 9459 | .Rn = n.alias.encode(.{ .V = true }), | 12544 | .fcvtpu = .{ |
| 9460 | .ftype = switch (n.format.scalar) { | 12545 | .Rd = d.alias.encode(.{}), |
| 9461 | else => unreachable, | 12546 | .Rn = n.alias.encode(.{ .V = true }), |
| 9462 | .single => .single, | 12547 | .ftype = .fromVectorSize(n.format.scalar), |
| 9463 | .double => .double, | 12548 | .sf = sf, |
| 9464 | .half => .half, | 12549 | }, |
| | 12550 | } } }, |
| | 12551 | .scalar => |elem_size| switch (n.format) { |
| | 12552 | else => unreachable, |
| | 12553 | .scalar => |ftype| { |
| | 12554 | assert(ftype == elem_size); |
| | 12555 | switch (elem_size) { |
| | 12556 | else => unreachable, |
| | 12557 | .half => return .{ .data_processing_vector = .{ .simd_scalar_two_register_miscellaneous_fp16 = .{ |
| | 12558 | .fcvtpu = .{ |
| | 12559 | .Rd = d.alias.encode(.{ .V = true }), |
| | 12560 | .Rn = n.alias.encode(.{ .V = true }), |
| | 12561 | }, |
| | 12562 | } } }, |
| | 12563 | .single, .double => return .{ .data_processing_vector = .{ .simd_scalar_two_register_miscellaneous = .{ |
| | 12564 | .fcvtpu = .{ |
| | 12565 | .Rd = d.alias.encode(.{ .V = true }), |
| | 12566 | .Rn = n.alias.encode(.{ .V = true }), |
| | 12567 | .sz = .fromVectorSize(elem_size), |
| | 12568 | }, |
| | 12569 | } } }, |
| | 12570 | } |
| 9465 | }, | 12571 | }, |
| 9466 | .sf = d.format.integer, | | |
| 9467 | }, | 12572 | }, |
| 9468 | } } }; | 12573 | .vector => |arrangement| { |
| | 12574 | assert(arrangement != .@"1d" and n.format.vector == arrangement); |
| | 12575 | switch (arrangement.elemSize()) { |
| | 12576 | else => unreachable, |
| | 12577 | .half => return .{ .data_processing_vector = .{ .simd_two_register_miscellaneous_fp16 = .{ |
| | 12578 | .fcvtpu = .{ |
| | 12579 | .Rd = d.alias.encode(.{ .V = true }), |
| | 12580 | .Rn = n.alias.encode(.{ .V = true }), |
| | 12581 | .Q = arrangement.size(), |
| | 12582 | }, |
| | 12583 | } } }, |
| | 12584 | .single, .double => return .{ .data_processing_vector = .{ .simd_two_register_miscellaneous = .{ |
| | 12585 | .fcvtpu = .{ |
| | 12586 | .Rd = d.alias.encode(.{ .V = true }), |
| | 12587 | .Rn = n.alias.encode(.{ .V = true }), |
| | 12588 | .sz = arrangement.elemSz(), |
| | 12589 | .Q = arrangement.size(), |
| | 12590 | }, |
| | 12591 | } } }, |
| | 12592 | } |
| | 12593 | }, |
| | 12594 | } |
| 9469 | } | 12595 | } |
| | 12596 | /// C7.2.90 FCVTZS (vector, integer) |
| 9470 | /// C7.2.92 FCVTZS (scalar, integer) | 12597 | /// C7.2.92 FCVTZS (scalar, integer) |
| 9471 | pub fn fcvtzs(d: Register, n: Register) Instruction { | 12598 | pub fn fcvtzs(d: Register, n: Register) Instruction { |
| 9472 | return .{ .data_processing_vector = .{ .convert_float_integer = .{ | 12599 | switch (d.format) { |
| 9473 | .fcvtzs = .{ | 12600 | else => unreachable, |
| 9474 | .Rd = d.alias.encode(.{}), | 12601 | .integer => |sf| return .{ .data_processing_vector = .{ .convert_float_integer = .{ |
| 9475 | .Rn = n.alias.encode(.{ .V = true }), | 12602 | .fcvtzs = .{ |
| 9476 | .ftype = switch (n.format.scalar) { | 12603 | .Rd = d.alias.encode(.{}), |
| | 12604 | .Rn = n.alias.encode(.{ .V = true }), |
| | 12605 | .ftype = .fromVectorSize(n.format.scalar), |
| | 12606 | .sf = sf, |
| | 12607 | }, |
| | 12608 | } } }, |
| | 12609 | .scalar => |elem_size| switch (n.format) { |
| | 12610 | else => unreachable, |
| | 12611 | .scalar => |ftype| { |
| | 12612 | assert(ftype == elem_size); |
| | 12613 | switch (elem_size) { |
| | 12614 | else => unreachable, |
| | 12615 | .half => return .{ .data_processing_vector = .{ .simd_scalar_two_register_miscellaneous_fp16 = .{ |
| | 12616 | .fcvtzs = .{ |
| | 12617 | .Rd = d.alias.encode(.{ .V = true }), |
| | 12618 | .Rn = n.alias.encode(.{ .V = true }), |
| | 12619 | }, |
| | 12620 | } } }, |
| | 12621 | .single, .double => return .{ .data_processing_vector = .{ .simd_scalar_two_register_miscellaneous = .{ |
| | 12622 | .fcvtzs = .{ |
| | 12623 | .Rd = d.alias.encode(.{ .V = true }), |
| | 12624 | .Rn = n.alias.encode(.{ .V = true }), |
| | 12625 | .sz = .fromVectorSize(elem_size), |
| | 12626 | }, |
| | 12627 | } } }, |
| | 12628 | } |
| | 12629 | }, |
| | 12630 | }, |
| | 12631 | .vector => |arrangement| { |
| | 12632 | assert(arrangement != .@"1d" and n.format.vector == arrangement); |
| | 12633 | switch (arrangement.elemSize()) { |
| 9477 | else => unreachable, | 12634 | else => unreachable, |
| 9478 | .single => .single, | 12635 | .half => return .{ .data_processing_vector = .{ .simd_two_register_miscellaneous_fp16 = .{ |
| 9479 | .double => .double, | 12636 | .fcvtzs = .{ |
| 9480 | .half => .half, | 12637 | .Rd = d.alias.encode(.{ .V = true }), |
| | 12638 | .Rn = n.alias.encode(.{ .V = true }), |
| | 12639 | .Q = arrangement.size(), |
| | 12640 | }, |
| | 12641 | } } }, |
| | 12642 | .single, .double => return .{ .data_processing_vector = .{ .simd_two_register_miscellaneous = .{ |
| | 12643 | .fcvtzs = .{ |
| | 12644 | .Rd = d.alias.encode(.{ .V = true }), |
| | 12645 | .Rn = n.alias.encode(.{ .V = true }), |
| | 12646 | .sz = arrangement.elemSz(), |
| | 12647 | .Q = arrangement.size(), |
| | 12648 | }, |
| | 12649 | } } }, |
| | 12650 | } |
| | 12651 | }, |
| | 12652 | } |
| | 12653 | } |
| | 12654 | /// C7.2.94 FCVTZU (vector, integer) |
| | 12655 | /// C7.2.96 FCVTZU (scalar, integer) |
| | 12656 | pub fn fcvtzu(d: Register, n: Register) Instruction { |
| | 12657 | switch (d.format) { |
| | 12658 | else => unreachable, |
| | 12659 | .integer => |sf| return .{ .data_processing_vector = .{ .convert_float_integer = .{ |
| | 12660 | .fcvtzu = .{ |
| | 12661 | .Rd = d.alias.encode(.{}), |
| | 12662 | .Rn = n.alias.encode(.{ .V = true }), |
| | 12663 | .ftype = .fromVectorSize(n.format.scalar), |
| | 12664 | .sf = sf, |
| | 12665 | }, |
| | 12666 | } } }, |
| | 12667 | .scalar => |elem_size| switch (n.format) { |
| | 12668 | else => unreachable, |
| | 12669 | .scalar => |ftype| { |
| | 12670 | assert(ftype == elem_size); |
| | 12671 | switch (elem_size) { |
| | 12672 | else => unreachable, |
| | 12673 | .half => return .{ .data_processing_vector = .{ .simd_scalar_two_register_miscellaneous_fp16 = .{ |
| | 12674 | .fcvtzu = .{ |
| | 12675 | .Rd = d.alias.encode(.{ .V = true }), |
| | 12676 | .Rn = n.alias.encode(.{ .V = true }), |
| | 12677 | }, |
| | 12678 | } } }, |
| | 12679 | .single, .double => return .{ .data_processing_vector = .{ .simd_scalar_two_register_miscellaneous = .{ |
| | 12680 | .fcvtzu = .{ |
| | 12681 | .Rd = d.alias.encode(.{ .V = true }), |
| | 12682 | .Rn = n.alias.encode(.{ .V = true }), |
| | 12683 | .sz = .fromVectorSize(elem_size), |
| | 12684 | }, |
| | 12685 | } } }, |
| | 12686 | } |
| 9481 | }, | 12687 | }, |
| 9482 | .sf = d.format.integer, | | |
| 9483 | }, | 12688 | }, |
| 9484 | } } }; | 12689 | .vector => |arrangement| { |
| 9485 | } | 12690 | assert(arrangement != .@"1d" and n.format.vector == arrangement); |
| 9486 | /// C7.2.96 FCVTZU (scalar, integer) | 12691 | switch (arrangement.elemSize()) { |
| 9487 | pub fn fcvtzu(d: Register, n: Register) Instruction { | | |
| 9488 | return .{ .data_processing_vector = .{ .convert_float_integer = .{ | | |
| 9489 | .fcvtzu = .{ | | |
| 9490 | .Rd = d.alias.encode(.{}), | | |
| 9491 | .Rn = n.alias.encode(.{ .V = true }), | | |
| 9492 | .ftype = switch (n.format.scalar) { | | |
| 9493 | else => unreachable, | 12692 | else => unreachable, |
| 9494 | .single => .single, | 12693 | .half => return .{ .data_processing_vector = .{ .simd_two_register_miscellaneous_fp16 = .{ |
| 9495 | .double => .double, | 12694 | .fcvtzu = .{ |
| 9496 | .half => .half, | 12695 | .Rd = d.alias.encode(.{ .V = true }), |
| 9497 | }, | 12696 | .Rn = n.alias.encode(.{ .V = true }), |
| 9498 | .sf = d.format.integer, | 12697 | .Q = arrangement.size(), |
| | 12698 | }, |
| | 12699 | } } }, |
| | 12700 | .single, .double => return .{ .data_processing_vector = .{ .simd_two_register_miscellaneous = .{ |
| | 12701 | .fcvtzu = .{ |
| | 12702 | .Rd = d.alias.encode(.{ .V = true }), |
| | 12703 | .Rn = n.alias.encode(.{ .V = true }), |
| | 12704 | .sz = arrangement.elemSz(), |
| | 12705 | .Q = arrangement.size(), |
| | 12706 | }, |
| | 12707 | } } }, |
| | 12708 | } |
| 9499 | }, | 12709 | }, |
| 9500 | } } }; | 12710 | } |
| 9501 | } | 12711 | } |
| 9502 | /// C7.2.98 FDIV (scalar) | 12712 | /// C7.2.98 FDIV (scalar) |
| 9503 | pub fn fdiv(d: Register, n: Register, m: Register) Instruction { | 12713 | pub fn fdiv(d: Register, n: Register, m: Register) Instruction { |
| ... | @@ -9508,12 +12718,7 @@ pub const Instruction = packed union { | ... | @@ -9508,12 +12718,7 @@ pub const Instruction = packed union { |
| 9508 | .Rd = d.alias.encode(.{ .V = true }), | 12718 | .Rd = d.alias.encode(.{ .V = true }), |
| 9509 | .Rn = n.alias.encode(.{ .V = true }), | 12719 | .Rn = n.alias.encode(.{ .V = true }), |
| 9510 | .Rm = m.alias.encode(.{ .V = true }), | 12720 | .Rm = m.alias.encode(.{ .V = true }), |
| 9511 | .ftype = switch (ftype) { | 12721 | .ftype = .fromVectorSize(ftype), |
| 9512 | else => unreachable, | | |
| 9513 | .single => .single, | | |
| 9514 | .double => .double, | | |
| 9515 | .half => .half, | | |
| 9516 | }, | | |
| 9517 | }, | 12722 | }, |
| 9518 | } } }; | 12723 | } } }; |
| 9519 | } | 12724 | } |
| ... | @@ -9538,12 +12743,7 @@ pub const Instruction = packed union { | ... | @@ -9538,12 +12743,7 @@ pub const Instruction = packed union { |
| 9538 | .Rn = n.alias.encode(.{ .V = true }), | 12743 | .Rn = n.alias.encode(.{ .V = true }), |
| 9539 | .Rm = m.alias.encode(.{ .V = true }), | 12744 | .Rm = m.alias.encode(.{ .V = true }), |
| 9540 | .Ra = a.alias.encode(.{ .V = true }), | 12745 | .Ra = a.alias.encode(.{ .V = true }), |
| 9541 | .ftype = switch (ftype) { | 12746 | .ftype = .fromVectorSize(ftype), |
| 9542 | else => unreachable, | | |
| 9543 | .single => .single, | | |
| 9544 | .double => .double, | | |
| 9545 | .half => .half, | | |
| 9546 | }, | | |
| 9547 | }, | 12747 | }, |
| 9548 | } } }; | 12748 | } } }; |
| 9549 | } | 12749 | } |
| ... | @@ -9556,12 +12756,7 @@ pub const Instruction = packed union { | ... | @@ -9556,12 +12756,7 @@ pub const Instruction = packed union { |
| 9556 | .Rd = d.alias.encode(.{ .V = true }), | 12756 | .Rd = d.alias.encode(.{ .V = true }), |
| 9557 | .Rn = n.alias.encode(.{ .V = true }), | 12757 | .Rn = n.alias.encode(.{ .V = true }), |
| 9558 | .Rm = m.alias.encode(.{ .V = true }), | 12758 | .Rm = m.alias.encode(.{ .V = true }), |
| 9559 | .ftype = switch (ftype) { | 12759 | .ftype = .fromVectorSize(ftype), |
| 9560 | else => unreachable, | | |
| 9561 | .single => .single, | | |
| 9562 | .double => .double, | | |
| 9563 | .half => .half, | | |
| 9564 | }, | | |
| 9565 | }, | 12760 | }, |
| 9566 | } } }; | 12761 | } } }; |
| 9567 | } | 12762 | } |
| ... | @@ -9574,12 +12769,7 @@ pub const Instruction = packed union { | ... | @@ -9574,12 +12769,7 @@ pub const Instruction = packed union { |
| 9574 | .Rd = d.alias.encode(.{ .V = true }), | 12769 | .Rd = d.alias.encode(.{ .V = true }), |
| 9575 | .Rn = n.alias.encode(.{ .V = true }), | 12770 | .Rn = n.alias.encode(.{ .V = true }), |
| 9576 | .Rm = m.alias.encode(.{ .V = true }), | 12771 | .Rm = m.alias.encode(.{ .V = true }), |
| 9577 | .ftype = switch (ftype) { | 12772 | .ftype = .fromVectorSize(ftype), |
| 9578 | else => unreachable, | | |
| 9579 | .single => .single, | | |
| 9580 | .double => .double, | | |
| 9581 | .half => .half, | | |
| 9582 | }, | | |
| 9583 | }, | 12773 | }, |
| 9584 | } } }; | 12774 | } } }; |
| 9585 | } | 12775 | } |
| ... | @@ -9592,12 +12782,7 @@ pub const Instruction = packed union { | ... | @@ -9592,12 +12782,7 @@ pub const Instruction = packed union { |
| 9592 | .Rd = d.alias.encode(.{ .V = true }), | 12782 | .Rd = d.alias.encode(.{ .V = true }), |
| 9593 | .Rn = n.alias.encode(.{ .V = true }), | 12783 | .Rn = n.alias.encode(.{ .V = true }), |
| 9594 | .Rm = m.alias.encode(.{ .V = true }), | 12784 | .Rm = m.alias.encode(.{ .V = true }), |
| 9595 | .ftype = switch (ftype) { | 12785 | .ftype = .fromVectorSize(ftype), |
| 9596 | else => unreachable, | | |
| 9597 | .single => .single, | | |
| 9598 | .double => .double, | | |
| 9599 | .half => .half, | | |
| 9600 | }, | | |
| 9601 | }, | 12786 | }, |
| 9602 | } } }; | 12787 | } } }; |
| 9603 | } | 12788 | } |
| ... | @@ -9610,12 +12795,7 @@ pub const Instruction = packed union { | ... | @@ -9610,12 +12795,7 @@ pub const Instruction = packed union { |
| 9610 | .Rd = d.alias.encode(.{ .V = true }), | 12795 | .Rd = d.alias.encode(.{ .V = true }), |
| 9611 | .Rn = n.alias.encode(.{ .V = true }), | 12796 | .Rn = n.alias.encode(.{ .V = true }), |
| 9612 | .Rm = m.alias.encode(.{ .V = true }), | 12797 | .Rm = m.alias.encode(.{ .V = true }), |
| 9613 | .ftype = switch (ftype) { | 12798 | .ftype = .fromVectorSize(ftype), |
| 9614 | else => unreachable, | | |
| 9615 | .single => .single, | | |
| 9616 | .double => .double, | | |
| 9617 | .half => .half, | | |
| 9618 | }, | | |
| 9619 | }, | 12799 | }, |
| 9620 | } } }; | 12800 | } } }; |
| 9621 | } | 12801 | } |
| ... | @@ -9642,12 +12822,7 @@ pub const Instruction = packed union { | ... | @@ -9642,12 +12822,7 @@ pub const Instruction = packed union { |
| 9642 | .fmov = .{ | 12822 | .fmov = .{ |
| 9643 | .Rd = d.alias.encode(.{ .V = true }), | 12823 | .Rd = d.alias.encode(.{ .V = true }), |
| 9644 | .imm8 = imm, | 12824 | .imm8 = imm, |
| 9645 | .ftype = switch (ftype) { | 12825 | .ftype = .fromVectorSize(ftype), |
| 9646 | else => unreachable, | | |
| 9647 | .single => .single, | | |
| 9648 | .double => .double, | | |
| 9649 | .half => .half, | | |
| 9650 | }, | | |
| 9651 | }, | 12826 | }, |
| 9652 | } } }, | 12827 | } } }, |
| 9653 | .vector => |arrangement| { | 12828 | .vector => |arrangement| { |
| ... | @@ -9680,12 +12855,7 @@ pub const Instruction = packed union { | ... | @@ -9680,12 +12855,7 @@ pub const Instruction = packed union { |
| 9680 | .Rn = n.alias.encode(.{ .V = true }), | 12855 | .Rn = n.alias.encode(.{ .V = true }), |
| 9681 | .opcode = .float_to_integer, | 12856 | .opcode = .float_to_integer, |
| 9682 | .rmode = .@"0", | 12857 | .rmode = .@"0", |
| 9683 | .ftype = switch (ftype) { | 12858 | .ftype = .fromVectorSize(ftype), |
| 9684 | else => unreachable, | | |
| 9685 | .single => .single, | | |
| 9686 | .double => .double, | | |
| 9687 | .half => .half, | | |
| 9688 | }, | | |
| 9689 | .sf = sf, | 12859 | .sf = sf, |
| 9690 | }, | 12860 | }, |
| 9691 | } } }; | 12861 | } } }; |
| ... | @@ -9723,12 +12893,7 @@ pub const Instruction = packed union { | ... | @@ -9723,12 +12893,7 @@ pub const Instruction = packed union { |
| 9723 | .Rn = n.alias.encode(.{}), | 12893 | .Rn = n.alias.encode(.{}), |
| 9724 | .opcode = .integer_to_float, | 12894 | .opcode = .integer_to_float, |
| 9725 | .rmode = .@"0", | 12895 | .rmode = .@"0", |
| 9726 | .ftype = switch (ftype) { | 12896 | .ftype = .fromVectorSize(ftype), |
| 9727 | else => unreachable, | | |
| 9728 | .single => .single, | | |
| 9729 | .double => .double, | | |
| 9730 | .half => .half, | | |
| 9731 | }, | | |
| 9732 | .sf = sf, | 12897 | .sf = sf, |
| 9733 | }, | 12898 | }, |
| 9734 | } } }; | 12899 | } } }; |
| ... | @@ -9739,12 +12904,7 @@ pub const Instruction = packed union { | ... | @@ -9739,12 +12904,7 @@ pub const Instruction = packed union { |
| 9739 | .fmov = .{ | 12904 | .fmov = .{ |
| 9740 | .Rd = d.alias.encode(.{ .V = true }), | 12905 | .Rd = d.alias.encode(.{ .V = true }), |
| 9741 | .Rn = n.alias.encode(.{ .V = true }), | 12906 | .Rn = n.alias.encode(.{ .V = true }), |
| 9742 | .ftype = switch (ftype) { | 12907 | .ftype = .fromVectorSize(ftype), |
| 9743 | else => unreachable, | | |
| 9744 | .single => .single, | | |
| 9745 | .double => .double, | | |
| 9746 | .half => .half, | | |
| 9747 | }, | | |
| 9748 | }, | 12908 | }, |
| 9749 | } } }; | 12909 | } } }; |
| 9750 | }, | 12910 | }, |
| ... | @@ -9781,12 +12941,7 @@ pub const Instruction = packed union { | ... | @@ -9781,12 +12941,7 @@ pub const Instruction = packed union { |
| 9781 | .Rn = n.alias.encode(.{ .V = true }), | 12941 | .Rn = n.alias.encode(.{ .V = true }), |
| 9782 | .Rm = m.alias.encode(.{ .V = true }), | 12942 | .Rm = m.alias.encode(.{ .V = true }), |
| 9783 | .Ra = a.alias.encode(.{ .V = true }), | 12943 | .Ra = a.alias.encode(.{ .V = true }), |
| 9784 | .ftype = switch (ftype) { | 12944 | .ftype = .fromVectorSize(ftype), |
| 9785 | else => unreachable, | | |
| 9786 | .single => .single, | | |
| 9787 | .double => .double, | | |
| 9788 | .half => .half, | | |
| 9789 | }, | | |
| 9790 | }, | 12945 | }, |
| 9791 | } } }; | 12946 | } } }; |
| 9792 | } | 12947 | } |
| ... | @@ -9799,31 +12954,47 @@ pub const Instruction = packed union { | ... | @@ -9799,31 +12954,47 @@ pub const Instruction = packed union { |
| 9799 | .Rd = d.alias.encode(.{ .V = true }), | 12954 | .Rd = d.alias.encode(.{ .V = true }), |
| 9800 | .Rn = n.alias.encode(.{ .V = true }), | 12955 | .Rn = n.alias.encode(.{ .V = true }), |
| 9801 | .Rm = m.alias.encode(.{ .V = true }), | 12956 | .Rm = m.alias.encode(.{ .V = true }), |
| 9802 | .ftype = switch (ftype) { | 12957 | .ftype = .fromVectorSize(ftype), |
| 9803 | else => unreachable, | | |
| 9804 | .single => .single, | | |
| 9805 | .double => .double, | | |
| 9806 | .half => .half, | | |
| 9807 | }, | | |
| 9808 | }, | 12958 | }, |
| 9809 | } } }; | 12959 | } } }; |
| 9810 | } | 12960 | } |
| | 12961 | /// C7.2.139 FNEG (vector) |
| 9811 | /// C7.2.140 FNEG (scalar) | 12962 | /// C7.2.140 FNEG (scalar) |
| 9812 | pub fn fneg(d: Register, n: Register) Instruction { | 12963 | pub fn fneg(d: Register, n: Register) Instruction { |
| 9813 | const ftype = d.format.scalar; | 12964 | switch (d.format) { |
| 9814 | assert(n.format.scalar == ftype); | 12965 | else => unreachable, |
| 9815 | return .{ .data_processing_vector = .{ .float_data_processing_one_source = .{ | 12966 | .vector => |arrangement| { |
| 9816 | .fneg = .{ | 12967 | assert(n.format.vector == arrangement); |
| 9817 | .Rd = d.alias.encode(.{ .V = true }), | 12968 | switch (arrangement.elemSize()) { |
| 9818 | .Rn = n.alias.encode(.{ .V = true }), | | |
| 9819 | .ftype = switch (ftype) { | | |
| 9820 | else => unreachable, | 12969 | else => unreachable, |
| 9821 | .single => .single, | 12970 | .half => return .{ .data_processing_vector = .{ .simd_two_register_miscellaneous_fp16 = .{ |
| 9822 | .double => .double, | 12971 | .fneg = .{ |
| 9823 | .half => .half, | 12972 | .Rd = d.alias.encode(.{ .V = true }), |
| 9824 | }, | 12973 | .Rn = n.alias.encode(.{ .V = true }), |
| | 12974 | .Q = arrangement.size(), |
| | 12975 | }, |
| | 12976 | } } }, |
| | 12977 | .single, .double => return .{ .data_processing_vector = .{ .simd_two_register_miscellaneous = .{ |
| | 12978 | .fneg = .{ |
| | 12979 | .Rd = d.alias.encode(.{ .V = true }), |
| | 12980 | .Rn = n.alias.encode(.{ .V = true }), |
| | 12981 | .sz = arrangement.elemSz(), |
| | 12982 | .Q = arrangement.size(), |
| | 12983 | }, |
| | 12984 | } } }, |
| | 12985 | } |
| 9825 | }, | 12986 | }, |
| 9826 | } } }; | 12987 | .scalar => |ftype| { |
| | 12988 | assert(n.format.scalar == ftype); |
| | 12989 | return .{ .data_processing_vector = .{ .float_data_processing_one_source = .{ |
| | 12990 | .fneg = .{ |
| | 12991 | .Rd = d.alias.encode(.{ .V = true }), |
| | 12992 | .Rn = n.alias.encode(.{ .V = true }), |
| | 12993 | .ftype = .fromVectorSize(ftype), |
| | 12994 | }, |
| | 12995 | } } }; |
| | 12996 | }, |
| | 12997 | } |
| 9827 | } | 12998 | } |
| 9828 | /// C7.2.141 FNMADD | 12999 | /// C7.2.141 FNMADD |
| 9829 | pub fn fnmadd(d: Register, n: Register, m: Register, a: Register) Instruction { | 13000 | pub fn fnmadd(d: Register, n: Register, m: Register, a: Register) Instruction { |
| ... | @@ -9835,12 +13006,7 @@ pub const Instruction = packed union { | ... | @@ -9835,12 +13006,7 @@ pub const Instruction = packed union { |
| 9835 | .Rn = n.alias.encode(.{ .V = true }), | 13006 | .Rn = n.alias.encode(.{ .V = true }), |
| 9836 | .Rm = m.alias.encode(.{ .V = true }), | 13007 | .Rm = m.alias.encode(.{ .V = true }), |
| 9837 | .Ra = a.alias.encode(.{ .V = true }), | 13008 | .Ra = a.alias.encode(.{ .V = true }), |
| 9838 | .ftype = switch (ftype) { | 13009 | .ftype = .fromVectorSize(ftype), |
| 9839 | else => unreachable, | | |
| 9840 | .single => .single, | | |
| 9841 | .double => .double, | | |
| 9842 | .half => .half, | | |
| 9843 | }, | | |
| 9844 | }, | 13010 | }, |
| 9845 | } } }; | 13011 | } } }; |
| 9846 | } | 13012 | } |
| ... | @@ -9854,12 +13020,7 @@ pub const Instruction = packed union { | ... | @@ -9854,12 +13020,7 @@ pub const Instruction = packed union { |
| 9854 | .Rn = n.alias.encode(.{ .V = true }), | 13020 | .Rn = n.alias.encode(.{ .V = true }), |
| 9855 | .Rm = m.alias.encode(.{ .V = true }), | 13021 | .Rm = m.alias.encode(.{ .V = true }), |
| 9856 | .Ra = a.alias.encode(.{ .V = true }), | 13022 | .Ra = a.alias.encode(.{ .V = true }), |
| 9857 | .ftype = switch (ftype) { | 13023 | .ftype = .fromVectorSize(ftype), |
| 9858 | else => unreachable, | | |
| 9859 | .single => .single, | | |
| 9860 | .double => .double, | | |
| 9861 | .half => .half, | | |
| 9862 | }, | | |
| 9863 | }, | 13024 | }, |
| 9864 | } } }; | 13025 | } } }; |
| 9865 | } | 13026 | } |
| ... | @@ -9872,150 +13033,313 @@ pub const Instruction = packed union { | ... | @@ -9872,150 +13033,313 @@ pub const Instruction = packed union { |
| 9872 | .Rd = d.alias.encode(.{ .V = true }), | 13033 | .Rd = d.alias.encode(.{ .V = true }), |
| 9873 | .Rn = n.alias.encode(.{ .V = true }), | 13034 | .Rn = n.alias.encode(.{ .V = true }), |
| 9874 | .Rm = m.alias.encode(.{ .V = true }), | 13035 | .Rm = m.alias.encode(.{ .V = true }), |
| 9875 | .ftype = switch (ftype) { | 13036 | .ftype = .fromVectorSize(ftype), |
| 9876 | else => unreachable, | | |
| 9877 | .single => .single, | | |
| 9878 | .double => .double, | | |
| 9879 | .half => .half, | | |
| 9880 | }, | | |
| 9881 | }, | 13037 | }, |
| 9882 | } } }; | 13038 | } } }; |
| 9883 | } | 13039 | } |
| | 13040 | /// C7.2.155 FRINTA (vector) |
| 9884 | /// C7.2.156 FRINTA (scalar) | 13041 | /// C7.2.156 FRINTA (scalar) |
| 9885 | pub fn frinta(d: Register, n: Register) Instruction { | 13042 | pub fn frinta(d: Register, n: Register) Instruction { |
| 9886 | const ftype = d.format.scalar; | 13043 | switch (d.format) { |
| 9887 | assert(n.format.scalar == ftype); | 13044 | else => unreachable, |
| 9888 | return .{ .data_processing_vector = .{ .float_data_processing_one_source = .{ | 13045 | .vector => |arrangement| { |
| 9889 | .frinta = .{ | 13046 | assert(arrangement != .@"1d" and n.format.vector == arrangement); |
| 9890 | .Rd = d.alias.encode(.{ .V = true }), | 13047 | switch (arrangement.elemSize()) { |
| 9891 | .Rn = n.alias.encode(.{ .V = true }), | | |
| 9892 | .ftype = switch (ftype) { | | |
| 9893 | else => unreachable, | 13048 | else => unreachable, |
| 9894 | .single => .single, | 13049 | .half => return .{ .data_processing_vector = .{ .simd_two_register_miscellaneous_fp16 = .{ |
| 9895 | .double => .double, | 13050 | .frinta = .{ |
| 9896 | .half => .half, | 13051 | .Rd = d.alias.encode(.{ .V = true }), |
| 9897 | }, | 13052 | .Rn = n.alias.encode(.{ .V = true }), |
| | 13053 | .Q = arrangement.size(), |
| | 13054 | }, |
| | 13055 | } } }, |
| | 13056 | .single, .double => return .{ .data_processing_vector = .{ .simd_two_register_miscellaneous = .{ |
| | 13057 | .frinta = .{ |
| | 13058 | .Rd = d.alias.encode(.{ .V = true }), |
| | 13059 | .Rn = n.alias.encode(.{ .V = true }), |
| | 13060 | .sz = arrangement.elemSz(), |
| | 13061 | .Q = arrangement.size(), |
| | 13062 | }, |
| | 13063 | } } }, |
| | 13064 | } |
| 9898 | }, | 13065 | }, |
| 9899 | } } }; | 13066 | .scalar => |ftype| { |
| | 13067 | assert(n.format.scalar == ftype); |
| | 13068 | return .{ .data_processing_vector = .{ .float_data_processing_one_source = .{ |
| | 13069 | .frinta = .{ |
| | 13070 | .Rd = d.alias.encode(.{ .V = true }), |
| | 13071 | .Rn = n.alias.encode(.{ .V = true }), |
| | 13072 | .ftype = .fromVectorSize(ftype), |
| | 13073 | }, |
| | 13074 | } } }; |
| | 13075 | }, |
| | 13076 | } |
| 9900 | } | 13077 | } |
| | 13078 | /// C7.2.157 FRINTI (vector) |
| 9901 | /// C7.2.158 FRINTI (scalar) | 13079 | /// C7.2.158 FRINTI (scalar) |
| 9902 | pub fn frinti(d: Register, n: Register) Instruction { | 13080 | pub fn frinti(d: Register, n: Register) Instruction { |
| 9903 | const ftype = d.format.scalar; | 13081 | switch (d.format) { |
| 9904 | assert(n.format.scalar == ftype); | 13082 | else => unreachable, |
| 9905 | return .{ .data_processing_vector = .{ .float_data_processing_one_source = .{ | 13083 | .vector => |arrangement| { |
| 9906 | .frinti = .{ | 13084 | assert(arrangement != .@"1d" and n.format.vector == arrangement); |
| 9907 | .Rd = d.alias.encode(.{ .V = true }), | 13085 | switch (arrangement.elemSize()) { |
| 9908 | .Rn = n.alias.encode(.{ .V = true }), | | |
| 9909 | .ftype = switch (ftype) { | | |
| 9910 | else => unreachable, | 13086 | else => unreachable, |
| 9911 | .single => .single, | 13087 | .half => return .{ .data_processing_vector = .{ .simd_two_register_miscellaneous_fp16 = .{ |
| 9912 | .double => .double, | 13088 | .frinti = .{ |
| 9913 | .half => .half, | 13089 | .Rd = d.alias.encode(.{ .V = true }), |
| 9914 | }, | 13090 | .Rn = n.alias.encode(.{ .V = true }), |
| | 13091 | .Q = arrangement.size(), |
| | 13092 | }, |
| | 13093 | } } }, |
| | 13094 | .single, .double => return .{ .data_processing_vector = .{ .simd_two_register_miscellaneous = .{ |
| | 13095 | .frinti = .{ |
| | 13096 | .Rd = d.alias.encode(.{ .V = true }), |
| | 13097 | .Rn = n.alias.encode(.{ .V = true }), |
| | 13098 | .sz = arrangement.elemSz(), |
| | 13099 | .Q = arrangement.size(), |
| | 13100 | }, |
| | 13101 | } } }, |
| | 13102 | } |
| 9915 | }, | 13103 | }, |
| 9916 | } } }; | 13104 | .scalar => |ftype| { |
| | 13105 | assert(n.format.scalar == ftype); |
| | 13106 | return .{ .data_processing_vector = .{ .float_data_processing_one_source = .{ |
| | 13107 | .frinti = .{ |
| | 13108 | .Rd = d.alias.encode(.{ .V = true }), |
| | 13109 | .Rn = n.alias.encode(.{ .V = true }), |
| | 13110 | .ftype = .fromVectorSize(ftype), |
| | 13111 | }, |
| | 13112 | } } }; |
| | 13113 | }, |
| | 13114 | } |
| 9917 | } | 13115 | } |
| | 13116 | /// C7.2.159 FRINTM (vector) |
| 9918 | /// C7.2.160 FRINTM (scalar) | 13117 | /// C7.2.160 FRINTM (scalar) |
| 9919 | pub fn frintm(d: Register, n: Register) Instruction { | 13118 | pub fn frintm(d: Register, n: Register) Instruction { |
| 9920 | const ftype = d.format.scalar; | 13119 | switch (d.format) { |
| 9921 | assert(n.format.scalar == ftype); | 13120 | else => unreachable, |
| 9922 | return .{ .data_processing_vector = .{ .float_data_processing_one_source = .{ | 13121 | .vector => |arrangement| { |
| 9923 | .frintm = .{ | 13122 | assert(arrangement != .@"1d" and n.format.vector == arrangement); |
| 9924 | .Rd = d.alias.encode(.{ .V = true }), | 13123 | switch (arrangement.elemSize()) { |
| 9925 | .Rn = n.alias.encode(.{ .V = true }), | | |
| 9926 | .ftype = switch (ftype) { | | |
| 9927 | else => unreachable, | 13124 | else => unreachable, |
| 9928 | .single => .single, | 13125 | .half => return .{ .data_processing_vector = .{ .simd_two_register_miscellaneous_fp16 = .{ |
| 9929 | .double => .double, | 13126 | .frintm = .{ |
| 9930 | .half => .half, | 13127 | .Rd = d.alias.encode(.{ .V = true }), |
| 9931 | }, | 13128 | .Rn = n.alias.encode(.{ .V = true }), |
| | 13129 | .Q = arrangement.size(), |
| | 13130 | }, |
| | 13131 | } } }, |
| | 13132 | .single, .double => return .{ .data_processing_vector = .{ .simd_two_register_miscellaneous = .{ |
| | 13133 | .frintm = .{ |
| | 13134 | .Rd = d.alias.encode(.{ .V = true }), |
| | 13135 | .Rn = n.alias.encode(.{ .V = true }), |
| | 13136 | .sz = arrangement.elemSz(), |
| | 13137 | .Q = arrangement.size(), |
| | 13138 | }, |
| | 13139 | } } }, |
| | 13140 | } |
| 9932 | }, | 13141 | }, |
| 9933 | } } }; | 13142 | .scalar => |ftype| { |
| | 13143 | assert(n.format.scalar == ftype); |
| | 13144 | return .{ .data_processing_vector = .{ .float_data_processing_one_source = .{ |
| | 13145 | .frintm = .{ |
| | 13146 | .Rd = d.alias.encode(.{ .V = true }), |
| | 13147 | .Rn = n.alias.encode(.{ .V = true }), |
| | 13148 | .ftype = .fromVectorSize(ftype), |
| | 13149 | }, |
| | 13150 | } } }; |
| | 13151 | }, |
| | 13152 | } |
| 9934 | } | 13153 | } |
| | 13154 | /// C7.2.161 FRINTN (vector) |
| 9935 | /// C7.2.162 FRINTN (scalar) | 13155 | /// C7.2.162 FRINTN (scalar) |
| 9936 | pub fn frintn(d: Register, n: Register) Instruction { | 13156 | pub fn frintn(d: Register, n: Register) Instruction { |
| 9937 | const ftype = d.format.scalar; | 13157 | switch (d.format) { |
| 9938 | assert(n.format.scalar == ftype); | 13158 | else => unreachable, |
| 9939 | return .{ .data_processing_vector = .{ .float_data_processing_one_source = .{ | 13159 | .vector => |arrangement| { |
| 9940 | .frintn = .{ | 13160 | assert(arrangement != .@"1d" and n.format.vector == arrangement); |
| 9941 | .Rd = d.alias.encode(.{ .V = true }), | 13161 | switch (arrangement.elemSize()) { |
| 9942 | .Rn = n.alias.encode(.{ .V = true }), | | |
| 9943 | .ftype = switch (ftype) { | | |
| 9944 | else => unreachable, | 13162 | else => unreachable, |
| 9945 | .single => .single, | 13163 | .half => return .{ .data_processing_vector = .{ .simd_two_register_miscellaneous_fp16 = .{ |
| 9946 | .double => .double, | 13164 | .frintn = .{ |
| 9947 | .half => .half, | 13165 | .Rd = d.alias.encode(.{ .V = true }), |
| 9948 | }, | 13166 | .Rn = n.alias.encode(.{ .V = true }), |
| | 13167 | .Q = arrangement.size(), |
| | 13168 | }, |
| | 13169 | } } }, |
| | 13170 | .single, .double => return .{ .data_processing_vector = .{ .simd_two_register_miscellaneous = .{ |
| | 13171 | .frintn = .{ |
| | 13172 | .Rd = d.alias.encode(.{ .V = true }), |
| | 13173 | .Rn = n.alias.encode(.{ .V = true }), |
| | 13174 | .sz = arrangement.elemSz(), |
| | 13175 | .Q = arrangement.size(), |
| | 13176 | }, |
| | 13177 | } } }, |
| | 13178 | } |
| 9949 | }, | 13179 | }, |
| 9950 | } } }; | 13180 | .scalar => |ftype| { |
| | 13181 | assert(n.format.scalar == ftype); |
| | 13182 | return .{ .data_processing_vector = .{ .float_data_processing_one_source = .{ |
| | 13183 | .frintn = .{ |
| | 13184 | .Rd = d.alias.encode(.{ .V = true }), |
| | 13185 | .Rn = n.alias.encode(.{ .V = true }), |
| | 13186 | .ftype = .fromVectorSize(ftype), |
| | 13187 | }, |
| | 13188 | } } }; |
| | 13189 | }, |
| | 13190 | } |
| 9951 | } | 13191 | } |
| | 13192 | /// C7.2.163 FRINTP (vector) |
| 9952 | /// C7.2.164 FRINTP (scalar) | 13193 | /// C7.2.164 FRINTP (scalar) |
| 9953 | pub fn frintp(d: Register, n: Register) Instruction { | 13194 | pub fn frintp(d: Register, n: Register) Instruction { |
| 9954 | const ftype = d.format.scalar; | 13195 | switch (d.format) { |
| 9955 | assert(n.format.scalar == ftype); | 13196 | else => unreachable, |
| 9956 | return .{ .data_processing_vector = .{ .float_data_processing_one_source = .{ | 13197 | .vector => |arrangement| { |
| 9957 | .frintp = .{ | 13198 | assert(arrangement != .@"1d" and n.format.vector == arrangement); |
| 9958 | .Rd = d.alias.encode(.{ .V = true }), | 13199 | switch (arrangement.elemSize()) { |
| 9959 | .Rn = n.alias.encode(.{ .V = true }), | | |
| 9960 | .ftype = switch (ftype) { | | |
| 9961 | else => unreachable, | 13200 | else => unreachable, |
| 9962 | .single => .single, | 13201 | .half => return .{ .data_processing_vector = .{ .simd_two_register_miscellaneous_fp16 = .{ |
| 9963 | .double => .double, | 13202 | .frintp = .{ |
| 9964 | .half => .half, | 13203 | .Rd = d.alias.encode(.{ .V = true }), |
| 9965 | }, | 13204 | .Rn = n.alias.encode(.{ .V = true }), |
| | 13205 | .Q = arrangement.size(), |
| | 13206 | }, |
| | 13207 | } } }, |
| | 13208 | .single, .double => return .{ .data_processing_vector = .{ .simd_two_register_miscellaneous = .{ |
| | 13209 | .frintp = .{ |
| | 13210 | .Rd = d.alias.encode(.{ .V = true }), |
| | 13211 | .Rn = n.alias.encode(.{ .V = true }), |
| | 13212 | .sz = arrangement.elemSz(), |
| | 13213 | .Q = arrangement.size(), |
| | 13214 | }, |
| | 13215 | } } }, |
| | 13216 | } |
| 9966 | }, | 13217 | }, |
| 9967 | } } }; | 13218 | .scalar => |ftype| { |
| | 13219 | assert(n.format.scalar == ftype); |
| | 13220 | return .{ .data_processing_vector = .{ .float_data_processing_one_source = .{ |
| | 13221 | .frintp = .{ |
| | 13222 | .Rd = d.alias.encode(.{ .V = true }), |
| | 13223 | .Rn = n.alias.encode(.{ .V = true }), |
| | 13224 | .ftype = .fromVectorSize(ftype), |
| | 13225 | }, |
| | 13226 | } } }; |
| | 13227 | }, |
| | 13228 | } |
| 9968 | } | 13229 | } |
| | 13230 | /// C7.2.165 FRINTX (vector) |
| 9969 | /// C7.2.166 FRINTX (scalar) | 13231 | /// C7.2.166 FRINTX (scalar) |
| 9970 | pub fn frintx(d: Register, n: Register) Instruction { | 13232 | pub fn frintx(d: Register, n: Register) Instruction { |
| 9971 | const ftype = d.format.scalar; | 13233 | switch (d.format) { |
| 9972 | assert(n.format.scalar == ftype); | 13234 | else => unreachable, |
| 9973 | return .{ .data_processing_vector = .{ .float_data_processing_one_source = .{ | 13235 | .vector => |arrangement| { |
| 9974 | .frintx = .{ | 13236 | assert(arrangement != .@"1d" and n.format.vector == arrangement); |
| 9975 | .Rd = d.alias.encode(.{ .V = true }), | 13237 | switch (arrangement.elemSize()) { |
| 9976 | .Rn = n.alias.encode(.{ .V = true }), | | |
| 9977 | .ftype = switch (ftype) { | | |
| 9978 | else => unreachable, | 13238 | else => unreachable, |
| 9979 | .single => .single, | 13239 | .half => return .{ .data_processing_vector = .{ .simd_two_register_miscellaneous_fp16 = .{ |
| 9980 | .double => .double, | 13240 | .frintx = .{ |
| 9981 | .half => .half, | 13241 | .Rd = d.alias.encode(.{ .V = true }), |
| 9982 | }, | 13242 | .Rn = n.alias.encode(.{ .V = true }), |
| | 13243 | .Q = arrangement.size(), |
| | 13244 | }, |
| | 13245 | } } }, |
| | 13246 | .single, .double => return .{ .data_processing_vector = .{ .simd_two_register_miscellaneous = .{ |
| | 13247 | .frintx = .{ |
| | 13248 | .Rd = d.alias.encode(.{ .V = true }), |
| | 13249 | .Rn = n.alias.encode(.{ .V = true }), |
| | 13250 | .sz = arrangement.elemSz(), |
| | 13251 | .Q = arrangement.size(), |
| | 13252 | }, |
| | 13253 | } } }, |
| | 13254 | } |
| 9983 | }, | 13255 | }, |
| 9984 | } } }; | 13256 | .scalar => |ftype| { |
| | 13257 | assert(n.format.scalar == ftype); |
| | 13258 | return .{ .data_processing_vector = .{ .float_data_processing_one_source = .{ |
| | 13259 | .frintx = .{ |
| | 13260 | .Rd = d.alias.encode(.{ .V = true }), |
| | 13261 | .Rn = n.alias.encode(.{ .V = true }), |
| | 13262 | .ftype = .fromVectorSize(ftype), |
| | 13263 | }, |
| | 13264 | } } }; |
| | 13265 | }, |
| | 13266 | } |
| 9985 | } | 13267 | } |
| | 13268 | /// C7.2.167 FRINTZ (vector) |
| 9986 | /// C7.2.168 FRINTZ (scalar) | 13269 | /// C7.2.168 FRINTZ (scalar) |
| 9987 | pub fn frintz(d: Register, n: Register) Instruction { | 13270 | pub fn frintz(d: Register, n: Register) Instruction { |
| 9988 | const ftype = d.format.scalar; | 13271 | switch (d.format) { |
| 9989 | assert(n.format.scalar == ftype); | 13272 | else => unreachable, |
| 9990 | return .{ .data_processing_vector = .{ .float_data_processing_one_source = .{ | 13273 | .vector => |arrangement| { |
| 9991 | .frintz = .{ | 13274 | assert(arrangement != .@"1d" and n.format.vector == arrangement); |
| 9992 | .Rd = d.alias.encode(.{ .V = true }), | 13275 | switch (arrangement.elemSize()) { |
| 9993 | .Rn = n.alias.encode(.{ .V = true }), | | |
| 9994 | .ftype = switch (ftype) { | | |
| 9995 | else => unreachable, | 13276 | else => unreachable, |
| 9996 | .single => .single, | 13277 | .half => return .{ .data_processing_vector = .{ .simd_two_register_miscellaneous_fp16 = .{ |
| 9997 | .double => .double, | 13278 | .frintz = .{ |
| 9998 | .half => .half, | 13279 | .Rd = d.alias.encode(.{ .V = true }), |
| 9999 | }, | 13280 | .Rn = n.alias.encode(.{ .V = true }), |
| | 13281 | .Q = arrangement.size(), |
| | 13282 | }, |
| | 13283 | } } }, |
| | 13284 | .single, .double => return .{ .data_processing_vector = .{ .simd_two_register_miscellaneous = .{ |
| | 13285 | .frintz = .{ |
| | 13286 | .Rd = d.alias.encode(.{ .V = true }), |
| | 13287 | .Rn = n.alias.encode(.{ .V = true }), |
| | 13288 | .sz = arrangement.elemSz(), |
| | 13289 | .Q = arrangement.size(), |
| | 13290 | }, |
| | 13291 | } } }, |
| | 13292 | } |
| 10000 | }, | 13293 | }, |
| 10001 | } } }; | 13294 | .scalar => |ftype| { |
| | 13295 | assert(n.format.scalar == ftype); |
| | 13296 | return .{ .data_processing_vector = .{ .float_data_processing_one_source = .{ |
| | 13297 | .frintz = .{ |
| | 13298 | .Rd = d.alias.encode(.{ .V = true }), |
| | 13299 | .Rn = n.alias.encode(.{ .V = true }), |
| | 13300 | .ftype = .fromVectorSize(ftype), |
| | 13301 | }, |
| | 13302 | } } }; |
| | 13303 | }, |
| | 13304 | } |
| 10002 | } | 13305 | } |
| | 13306 | /// C7.2.171 FSQRT (vector) |
| 10003 | /// C7.2.172 FSQRT (scalar) | 13307 | /// C7.2.172 FSQRT (scalar) |
| 10004 | pub fn fsqrt(d: Register, n: Register) Instruction { | 13308 | pub fn fsqrt(d: Register, n: Register) Instruction { |
| 10005 | const ftype = d.format.scalar; | 13309 | switch (d.format) { |
| 10006 | assert(n.format.scalar == ftype); | 13310 | else => unreachable, |
| 10007 | return .{ .data_processing_vector = .{ .float_data_processing_one_source = .{ | 13311 | .vector => |arrangement| { |
| 10008 | .fsqrt = .{ | 13312 | assert(n.format.vector == arrangement); |
| 10009 | .Rd = d.alias.encode(.{ .V = true }), | 13313 | switch (arrangement.elemSize()) { |
| 10010 | .Rn = n.alias.encode(.{ .V = true }), | | |
| 10011 | .ftype = switch (ftype) { | | |
| 10012 | else => unreachable, | 13314 | else => unreachable, |
| 10013 | .single => .single, | 13315 | .half => return .{ .data_processing_vector = .{ .simd_two_register_miscellaneous_fp16 = .{ |
| 10014 | .double => .double, | 13316 | .fsqrt = .{ |
| 10015 | .half => .half, | 13317 | .Rd = d.alias.encode(.{ .V = true }), |
| 10016 | }, | 13318 | .Rn = n.alias.encode(.{ .V = true }), |
| | 13319 | .Q = arrangement.size(), |
| | 13320 | }, |
| | 13321 | } } }, |
| | 13322 | .single, .double => return .{ .data_processing_vector = .{ .simd_two_register_miscellaneous = .{ |
| | 13323 | .fsqrt = .{ |
| | 13324 | .Rd = d.alias.encode(.{ .V = true }), |
| | 13325 | .Rn = n.alias.encode(.{ .V = true }), |
| | 13326 | .sz = arrangement.elemSz(), |
| | 13327 | .Q = arrangement.size(), |
| | 13328 | }, |
| | 13329 | } } }, |
| | 13330 | } |
| 10017 | }, | 13331 | }, |
| 10018 | } } }; | 13332 | .scalar => |ftype| { |
| | 13333 | assert(n.format.scalar == ftype); |
| | 13334 | return .{ .data_processing_vector = .{ .float_data_processing_one_source = .{ |
| | 13335 | .fsqrt = .{ |
| | 13336 | .Rd = d.alias.encode(.{ .V = true }), |
| | 13337 | .Rn = n.alias.encode(.{ .V = true }), |
| | 13338 | .ftype = .fromVectorSize(ftype), |
| | 13339 | }, |
| | 13340 | } } }; |
| | 13341 | }, |
| | 13342 | } |
| 10019 | } | 13343 | } |
| 10020 | /// C7.2.174 FSUB (scalar) | 13344 | /// C7.2.174 FSUB (scalar) |
| 10021 | pub fn fsub(d: Register, n: Register, m: Register) Instruction { | 13345 | pub fn fsub(d: Register, n: Register, m: Register) Instruction { |
| ... | @@ -10026,12 +13350,7 @@ pub const Instruction = packed union { | ... | @@ -10026,12 +13350,7 @@ pub const Instruction = packed union { |
| 10026 | .Rd = d.alias.encode(.{ .V = true }), | 13350 | .Rd = d.alias.encode(.{ .V = true }), |
| 10027 | .Rn = n.alias.encode(.{ .V = true }), | 13351 | .Rn = n.alias.encode(.{ .V = true }), |
| 10028 | .Rm = m.alias.encode(.{ .V = true }), | 13352 | .Rm = m.alias.encode(.{ .V = true }), |
| 10029 | .ftype = switch (ftype) { | 13353 | .ftype = .fromVectorSize(ftype), |
| 10030 | else => unreachable, | | |
| 10031 | .single => .single, | | |
| 10032 | .double => .double, | | |
| 10033 | .half => .half, | | |
| 10034 | }, | | |
| 10035 | }, | 13354 | }, |
| 10036 | } } }; | 13355 | } } }; |
| 10037 | } | 13356 | } |
| ... | @@ -11021,12 +14340,52 @@ pub const Instruction = packed union { | ... | @@ -11021,12 +14340,52 @@ pub const Instruction = packed union { |
| 11021 | }, | 14340 | }, |
| 11022 | } } }; | 14341 | } } }; |
| 11023 | } | 14342 | } |
| | 14343 | /// C7.2.209 NEG (vector) |
| | 14344 | pub fn neg(d: Register, n: Register) Instruction { |
| | 14345 | switch (d.format) { |
| | 14346 | else => unreachable, |
| | 14347 | .scalar => |elem_size| { |
| | 14348 | assert(elem_size == .double and elem_size == n.format.scalar); |
| | 14349 | return .{ .data_processing_vector = .{ .simd_scalar_two_register_miscellaneous = .{ |
| | 14350 | .neg = .{ |
| | 14351 | .Rd = d.alias.encode(.{ .V = true }), |
| | 14352 | .Rn = n.alias.encode(.{ .V = true }), |
| | 14353 | .size = .fromVectorSize(elem_size), |
| | 14354 | }, |
| | 14355 | } } }; |
| | 14356 | }, |
| | 14357 | .vector => |arrangement| { |
| | 14358 | assert(arrangement != .@"1d" and n.format.vector == arrangement); |
| | 14359 | return .{ .data_processing_vector = .{ .simd_two_register_miscellaneous = .{ |
| | 14360 | .neg = .{ |
| | 14361 | .Rd = d.alias.encode(.{ .V = true }), |
| | 14362 | .Rn = n.alias.encode(.{ .V = true }), |
| | 14363 | .size = arrangement.elemSize(), |
| | 14364 | .Q = arrangement.size(), |
| | 14365 | }, |
| | 14366 | } } }; |
| | 14367 | }, |
| | 14368 | } |
| | 14369 | } |
| 11024 | /// C6.2.238 NOP | 14370 | /// C6.2.238 NOP |
| 11025 | pub fn nop() Instruction { | 14371 | pub fn nop() Instruction { |
| 11026 | return .{ .branch_exception_generating_system = .{ .hints = .{ | 14372 | return .{ .branch_exception_generating_system = .{ .hints = .{ |
| 11027 | .nop = .{}, | 14373 | .nop = .{}, |
| 11028 | } } }; | 14374 | } } }; |
| 11029 | } | 14375 | } |
| | 14376 | /// C7.2.210 NOT |
| | 14377 | pub fn not(d: Register, n: Register) Instruction { |
| | 14378 | const arrangement = d.format.vector; |
| | 14379 | assert(arrangement.elemSize() == .byte and n.format.vector == arrangement); |
| | 14380 | return .{ .data_processing_vector = .{ .simd_two_register_miscellaneous = .{ |
| | 14381 | .not = .{ |
| | 14382 | .Rd = d.alias.encode(.{ .V = true }), |
| | 14383 | .Rn = n.alias.encode(.{ .V = true }), |
| | 14384 | .size = arrangement.elemSize(), |
| | 14385 | .Q = arrangement.size(), |
| | 14386 | }, |
| | 14387 | } } }; |
| | 14388 | } |
| 11030 | /// C6.2.239 ORN (shifted register) | 14389 | /// C6.2.239 ORN (shifted register) |
| 11031 | /// C7.2.211 ORN (vector) | 14390 | /// C7.2.211 ORN (vector) |
| 11032 | pub fn orn(d: Register, n: Register, form: union(enum) { | 14391 | pub fn orn(d: Register, n: Register, form: union(enum) { |
| ... | @@ -11343,21 +14702,63 @@ pub const Instruction = packed union { | ... | @@ -11343,21 +14702,63 @@ pub const Instruction = packed union { |
| 11343 | }, | 14702 | }, |
| 11344 | } } }; | 14703 | } } }; |
| 11345 | } | 14704 | } |
| | 14705 | /// C7.2.234 SCVTF (vector, integer) |
| 11346 | /// C7.2.236 SCVTF (scalar, integer) | 14706 | /// C7.2.236 SCVTF (scalar, integer) |
| 11347 | pub fn scvtf(d: Register, n: Register) Instruction { | 14707 | pub fn scvtf(d: Register, n: Register) Instruction { |
| 11348 | return .{ .data_processing_vector = .{ .convert_float_integer = .{ | 14708 | switch (d.format) { |
| 11349 | .scvtf = .{ | 14709 | else => unreachable, |
| 11350 | .Rd = d.alias.encode(.{ .V = true }), | 14710 | .scalar => |ftype| switch (n.format) { |
| 11351 | .Rn = n.alias.encode(.{}), | 14711 | else => unreachable, |
| 11352 | .ftype = switch (d.format.scalar) { | 14712 | .scalar => |elem_size| { |
| 11353 | else => unreachable, | 14713 | assert(ftype == elem_size); |
| 11354 | .single => .single, | 14714 | switch (ftype) { |
| 11355 | .double => .double, | 14715 | else => unreachable, |
| 11356 | .half => .half, | 14716 | .half => return .{ .data_processing_vector = .{ .simd_scalar_two_register_miscellaneous_fp16 = .{ |
| | 14717 | .scvtf = .{ |
| | 14718 | .Rd = d.alias.encode(.{ .V = true }), |
| | 14719 | .Rn = n.alias.encode(.{ .V = true }), |
| | 14720 | }, |
| | 14721 | } } }, |
| | 14722 | .single, .double => return .{ .data_processing_vector = .{ .simd_scalar_two_register_miscellaneous = .{ |
| | 14723 | .scvtf = .{ |
| | 14724 | .Rd = d.alias.encode(.{ .V = true }), |
| | 14725 | .Rn = n.alias.encode(.{ .V = true }), |
| | 14726 | .sz = .fromVectorSize(ftype), |
| | 14727 | }, |
| | 14728 | } } }, |
| | 14729 | } |
| 11357 | }, | 14730 | }, |
| 11358 | .sf = n.format.integer, | 14731 | .integer => |sf| return .{ .data_processing_vector = .{ .convert_float_integer = .{ |
| | 14732 | .scvtf = .{ |
| | 14733 | .Rd = d.alias.encode(.{ .V = true }), |
| | 14734 | .Rn = n.alias.encode(.{}), |
| | 14735 | .ftype = .fromVectorSize(ftype), |
| | 14736 | .sf = sf, |
| | 14737 | }, |
| | 14738 | } } }, |
| 11359 | }, | 14739 | }, |
| 11360 | } } }; | 14740 | .vector => |arrangement| { |
| | 14741 | assert(arrangement != .@"1d" and n.format.vector == arrangement); |
| | 14742 | switch (arrangement.elemSize()) { |
| | 14743 | else => unreachable, |
| | 14744 | .half => return .{ .data_processing_vector = .{ .simd_two_register_miscellaneous_fp16 = .{ |
| | 14745 | .scvtf = .{ |
| | 14746 | .Rd = d.alias.encode(.{ .V = true }), |
| | 14747 | .Rn = n.alias.encode(.{ .V = true }), |
| | 14748 | .Q = arrangement.size(), |
| | 14749 | }, |
| | 14750 | } } }, |
| | 14751 | .single, .double => return .{ .data_processing_vector = .{ .simd_two_register_miscellaneous = .{ |
| | 14752 | .scvtf = .{ |
| | 14753 | .Rd = d.alias.encode(.{ .V = true }), |
| | 14754 | .Rn = n.alias.encode(.{ .V = true }), |
| | 14755 | .sz = arrangement.elemSz(), |
| | 14756 | .Q = arrangement.size(), |
| | 14757 | }, |
| | 14758 | } } }, |
| | 14759 | } |
| | 14760 | }, |
| | 14761 | } |
| 11361 | } | 14762 | } |
| 11362 | /// C6.2.270 SDIV | 14763 | /// C6.2.270 SDIV |
| 11363 | pub fn sdiv(d: Register, n: Register, m: Register) Instruction { | 14764 | pub fn sdiv(d: Register, n: Register, m: Register) Instruction { |
| ... | @@ -11448,6 +14849,60 @@ pub const Instruction = packed union { | ... | @@ -11448,6 +14849,60 @@ pub const Instruction = packed union { |
| 11448 | }, | 14849 | }, |
| 11449 | } } }; | 14850 | } } }; |
| 11450 | } | 14851 | } |
| | 14852 | /// C7.2.282 SQABS |
| | 14853 | pub fn sqabs(d: Register, n: Register) Instruction { |
| | 14854 | switch (d.format) { |
| | 14855 | else => unreachable, |
| | 14856 | .scalar => |elem_size| { |
| | 14857 | assert(elem_size == n.format.scalar); |
| | 14858 | return .{ .data_processing_vector = .{ .simd_scalar_two_register_miscellaneous = .{ |
| | 14859 | .sqabs = .{ |
| | 14860 | .Rd = d.alias.encode(.{ .V = true }), |
| | 14861 | .Rn = n.alias.encode(.{ .V = true }), |
| | 14862 | .size = .fromVectorSize(elem_size), |
| | 14863 | }, |
| | 14864 | } } }; |
| | 14865 | }, |
| | 14866 | .vector => |arrangement| { |
| | 14867 | assert(arrangement != .@"1d" and n.format.vector == arrangement); |
| | 14868 | return .{ .data_processing_vector = .{ .simd_two_register_miscellaneous = .{ |
| | 14869 | .sqabs = .{ |
| | 14870 | .Rd = d.alias.encode(.{ .V = true }), |
| | 14871 | .Rn = n.alias.encode(.{ .V = true }), |
| | 14872 | .size = arrangement.elemSize(), |
| | 14873 | .Q = arrangement.size(), |
| | 14874 | }, |
| | 14875 | } } }; |
| | 14876 | }, |
| | 14877 | } |
| | 14878 | } |
| | 14879 | /// C7.2.308 SQXTN |
| | 14880 | pub fn sqxtn(d: Register, n: Register) Instruction { |
| | 14881 | switch (d.format) { |
| | 14882 | else => unreachable, |
| | 14883 | .scalar => |elem_size| { |
| | 14884 | assert(elem_size == n.format.scalar); |
| | 14885 | return .{ .data_processing_vector = .{ .simd_scalar_two_register_miscellaneous = .{ |
| | 14886 | .sqxtn = .{ |
| | 14887 | .Rd = d.alias.encode(.{ .V = true }), |
| | 14888 | .Rn = n.alias.encode(.{ .V = true }), |
| | 14889 | .size = .fromVectorSize(elem_size), |
| | 14890 | }, |
| | 14891 | } } }; |
| | 14892 | }, |
| | 14893 | .vector => |arrangement| { |
| | 14894 | assert(arrangement != .@"1d" and n.format.vector == arrangement); |
| | 14895 | return .{ .data_processing_vector = .{ .simd_two_register_miscellaneous = .{ |
| | 14896 | .sqxtn = .{ |
| | 14897 | .Rd = d.alias.encode(.{ .V = true }), |
| | 14898 | .Rn = n.alias.encode(.{ .V = true }), |
| | 14899 | .size = arrangement.elemSize(), |
| | 14900 | .Q = arrangement.size(), |
| | 14901 | }, |
| | 14902 | } } }; |
| | 14903 | }, |
| | 14904 | } |
| | 14905 | } |
| 11451 | /// C6.2.321 STP | 14906 | /// C6.2.321 STP |
| 11452 | /// C7.2.330 STP (SIMD&FP) | 14907 | /// C7.2.330 STP (SIMD&FP) |
| 11453 | pub fn stp(t1: Register, t2: Register, form: union(enum) { | 14908 | pub fn stp(t1: Register, t2: Register, form: union(enum) { |
| ... | @@ -11942,6 +15397,33 @@ pub const Instruction = packed union { | ... | @@ -11942,6 +15397,33 @@ pub const Instruction = packed union { |
| 11942 | } }, | 15397 | } }, |
| 11943 | } | 15398 | } |
| 11944 | } | 15399 | } |
| | 15400 | /// C7.2.337 SUQADD |
| | 15401 | pub fn suqadd(d: Register, n: Register) Instruction { |
| | 15402 | switch (d.format) { |
| | 15403 | else => unreachable, |
| | 15404 | .scalar => |elem_size| { |
| | 15405 | assert(elem_size == n.format.scalar); |
| | 15406 | return .{ .data_processing_vector = .{ .simd_scalar_two_register_miscellaneous = .{ |
| | 15407 | .suqadd = .{ |
| | 15408 | .Rd = d.alias.encode(.{ .V = true }), |
| | 15409 | .Rn = n.alias.encode(.{ .V = true }), |
| | 15410 | .size = .fromVectorSize(elem_size), |
| | 15411 | }, |
| | 15412 | } } }; |
| | 15413 | }, |
| | 15414 | .vector => |arrangement| { |
| | 15415 | assert(arrangement != .@"1d" and n.format.vector == arrangement); |
| | 15416 | return .{ .data_processing_vector = .{ .simd_two_register_miscellaneous = .{ |
| | 15417 | .suqadd = .{ |
| | 15418 | .Rd = d.alias.encode(.{ .V = true }), |
| | 15419 | .Rn = n.alias.encode(.{ .V = true }), |
| | 15420 | .size = arrangement.elemSize(), |
| | 15421 | .Q = arrangement.size(), |
| | 15422 | }, |
| | 15423 | } } }; |
| | 15424 | }, |
| | 15425 | } |
| | 15426 | } |
| 11945 | /// C6.2.365 SVC | 15427 | /// C6.2.365 SVC |
| 11946 | pub fn svc(imm: u16) Instruction { | 15428 | pub fn svc(imm: u16) Instruction { |
| 11947 | return .{ .branch_exception_generating_system = .{ .exception_generating = .{ | 15429 | return .{ .branch_exception_generating_system = .{ .exception_generating = .{ |
| ... | @@ -12021,21 +15503,63 @@ pub const Instruction = packed union { | ... | @@ -12021,21 +15503,63 @@ pub const Instruction = packed union { |
| 12021 | }, | 15503 | }, |
| 12022 | } } }; | 15504 | } } }; |
| 12023 | } | 15505 | } |
| | 15506 | /// C7.2.353 UCVTF (vector, integer) |
| 12024 | /// C7.2.355 UCVTF (scalar, integer) | 15507 | /// C7.2.355 UCVTF (scalar, integer) |
| 12025 | pub fn ucvtf(d: Register, n: Register) Instruction { | 15508 | pub fn ucvtf(d: Register, n: Register) Instruction { |
| 12026 | return .{ .data_processing_vector = .{ .convert_float_integer = .{ | 15509 | switch (d.format) { |
| 12027 | .ucvtf = .{ | 15510 | else => unreachable, |
| 12028 | .Rd = d.alias.encode(.{ .V = true }), | 15511 | .scalar => |ftype| switch (n.format) { |
| 12029 | .Rn = n.alias.encode(.{}), | 15512 | else => unreachable, |
| 12030 | .ftype = switch (d.format.scalar) { | 15513 | .scalar => |elem_size| { |
| 12031 | else => unreachable, | 15514 | assert(ftype == elem_size); |
| 12032 | .single => .single, | 15515 | switch (ftype) { |
| 12033 | .double => .double, | 15516 | else => unreachable, |
| 12034 | .half => .half, | 15517 | .half => return .{ .data_processing_vector = .{ .simd_scalar_two_register_miscellaneous_fp16 = .{ |
| | 15518 | .ucvtf = .{ |
| | 15519 | .Rd = d.alias.encode(.{ .V = true }), |
| | 15520 | .Rn = n.alias.encode(.{ .V = true }), |
| | 15521 | }, |
| | 15522 | } } }, |
| | 15523 | .single, .double => return .{ .data_processing_vector = .{ .simd_scalar_two_register_miscellaneous = .{ |
| | 15524 | .ucvtf = .{ |
| | 15525 | .Rd = d.alias.encode(.{ .V = true }), |
| | 15526 | .Rn = n.alias.encode(.{ .V = true }), |
| | 15527 | .sz = .fromVectorSize(ftype), |
| | 15528 | }, |
| | 15529 | } } }, |
| | 15530 | } |
| 12035 | }, | 15531 | }, |
| 12036 | .sf = n.format.integer, | 15532 | .integer => |sf| return .{ .data_processing_vector = .{ .convert_float_integer = .{ |
| | 15533 | .ucvtf = .{ |
| | 15534 | .Rd = d.alias.encode(.{ .V = true }), |
| | 15535 | .Rn = n.alias.encode(.{}), |
| | 15536 | .ftype = .fromVectorSize(ftype), |
| | 15537 | .sf = sf, |
| | 15538 | }, |
| | 15539 | } } }, |
| 12037 | }, | 15540 | }, |
| 12038 | } } }; | 15541 | .vector => |arrangement| { |
| | 15542 | assert(arrangement != .@"1d" and n.format.vector == arrangement); |
| | 15543 | switch (arrangement.elemSize()) { |
| | 15544 | else => unreachable, |
| | 15545 | .half => return .{ .data_processing_vector = .{ .simd_two_register_miscellaneous_fp16 = .{ |
| | 15546 | .ucvtf = .{ |
| | 15547 | .Rd = d.alias.encode(.{ .V = true }), |
| | 15548 | .Rn = n.alias.encode(.{ .V = true }), |
| | 15549 | .Q = arrangement.size(), |
| | 15550 | }, |
| | 15551 | } } }, |
| | 15552 | .single, .double => return .{ .data_processing_vector = .{ .simd_two_register_miscellaneous = .{ |
| | 15553 | .ucvtf = .{ |
| | 15554 | .Rd = d.alias.encode(.{ .V = true }), |
| | 15555 | .Rn = n.alias.encode(.{ .V = true }), |
| | 15556 | .sz = arrangement.elemSz(), |
| | 15557 | .Q = arrangement.size(), |
| | 15558 | }, |
| | 15559 | } } }, |
| | 15560 | } |
| | 15561 | }, |
| | 15562 | } |
| 12039 | } | 15563 | } |
| 12040 | /// C6.2.387 UDF | 15564 | /// C6.2.387 UDF |
| 12041 | pub fn udf(imm: u16) Instruction { | 15565 | pub fn udf(imm: u16) Instruction { |
| ... | @@ -12149,7 +15673,7 @@ pub const Instruction = packed union { | ... | @@ -12149,7 +15673,7 @@ pub const Instruction = packed union { |
| 12149 | } | 15673 | } |
| 12150 | | 15674 | |
| 12151 | comptime { | 15675 | comptime { |
| 12152 | @setEvalBranchQuota(68_000); | 15676 | @setEvalBranchQuota(110_000); |
| 12153 | verify(@typeName(Instruction), Instruction); | 15677 | verify(@typeName(Instruction), Instruction); |
| 12154 | } | 15678 | } |
| 12155 | fn verify(name: []const u8, Type: type) void { | 15679 | fn verify(name: []const u8, Type: type) void { |