xref: /aosp_15_r20/external/skia/tests/sksl/intrinsics/Frexp.metal (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1#include <metal_stdlib>
2#include <simd/simd.h>
3#ifdef __clang__
4#pragma clang diagnostic ignored "-Wall"
5#endif
6using namespace metal;
7struct Uniforms {
8    half4 colorGreen;
9    half4 colorRed;
10};
11struct Inputs {
12};
13struct Outputs {
14    half4 sk_FragColor [[color(0)]];
15};
16bool checkIntrinsicAsFunctionArg_bf3i3(float3 f3, int3 e3) {
17    return all(f3 == float3(0.75)) && all(e3 == int3(3));
18}
19fragment Outputs fragmentMain(Inputs _in [[stage_in]], constant Uniforms& _uniforms [[buffer(0)]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
20    Outputs _out;
21    (void)_out;
22    int _skTemp0;
23    float _skTemp1;
24    int2 _skTemp2;
25    float2 _skTemp3;
26    int3 _skTemp4;
27    float3 _skTemp5;
28    int4 _skTemp6;
29    float4 _skTemp7;
30    int3 _skTemp8;
31    float3 _skTemp9;
32    float4 value = float4(_uniforms.colorGreen.yyyy * 6.0h);
33    int4 _0_exp;
34    float4 result;
35    bool4 ok;
36    result.x = ((_skTemp1 = frexp(value.x, _skTemp0)), (_0_exp.x = _skTemp0), _skTemp1);
37    ok.x = result.x == 0.75 && _0_exp.x == 3;
38    result.xy = ((_skTemp3 = frexp(value.xy, _skTemp2)), (_0_exp.xy = _skTemp2), _skTemp3);
39    ok.y = result.y == 0.75 && _0_exp.y == 3;
40    result.xyz = ((_skTemp5 = frexp(value.xyz, _skTemp4)), (_0_exp.xyz = _skTemp4), _skTemp5);
41    ok.z = result.z == 0.75 && _0_exp.z == 3;
42    result = ((_skTemp7 = frexp(value, _skTemp6)), (_0_exp = _skTemp6), _skTemp7);
43    ok.w = result.w == 0.75 && _0_exp.w == 3;
44    bool funcOk = checkIntrinsicAsFunctionArg_bf3i3(((_skTemp9 = frexp(value.wzy, _skTemp8)), (_0_exp.zxw = _skTemp8), _skTemp9).yxz, _0_exp.yxz);
45    _out.sk_FragColor = all(ok) && funcOk ? _uniforms.colorGreen : _uniforms.colorRed;
46    return _out;
47}
48